What β auth.controller.js's user_signed_up analytics event sets invited/invitationId/invitedBy off the resolved invite object, not off whether the invite was actually claimed/attributed (eligibility.claimed, added in #3981).
Why it matters β this predates #3981 (an open-signup + presented-but-never-claimed token already produced a phantom invited:true with no real conversion), but #3981 widens the same gap: on invitations.userFacing:true open signup, a lost claim() race now downgrades to an unattributed plain signup (correct β no referral fires), yet the analytics event still reports invited:true for it. The referral funnel metric this event is meant to make measurable ends up mixing real conversions with phantom ones, indistinguishably.
Scope β decide whether invited should mean "a valid token was presented" (current, unchanged) or "the invite was actually attributed" (eligibility.claimed), or split into two fields. Non-blocking (medium severity, narrow race-only edge case) β filed as a fast-follow rather than expanding #3981's scope.
Refs: #3981 (introduced eligibility.claimed), #3945 (added the analytics fields originally).
Created via headless PR review (fallback critical-review, #3982).
What β
auth.controller.js'suser_signed_upanalytics event setsinvited/invitationId/invitedByoff the resolvedinviteobject, not off whether the invite was actually claimed/attributed (eligibility.claimed, added in #3981).Why it matters β this predates #3981 (an open-signup + presented-but-never-claimed token already produced a phantom
invited:truewith no real conversion), but #3981 widens the same gap: oninvitations.userFacing:trueopen signup, a lostclaim()race now downgrades to an unattributed plain signup (correct β no referral fires), yet the analytics event still reportsinvited:truefor it. The referral funnel metric this event is meant to make measurable ends up mixing real conversions with phantom ones, indistinguishably.Scope β decide whether
invitedshould mean "a valid token was presented" (current, unchanged) or "the invite was actually attributed" (eligibility.claimed), or split into two fields. Non-blocking (medium severity, narrow race-only edge case) β filed as a fast-follow rather than expanding #3981's scope.Refs: #3981 (introduced
eligibility.claimed), #3945 (added the analytics fields originally).Created via headless PR review (fallback critical-review, #3982).