Skip to content

Day-0 Pro activation writes no server-side outcome row, so the failing cohort is invisible in Convex #5621

Description

@koala73

Title: Day-0 Pro activation writes no server-side outcome row, so the failing cohort is invisible in Convex

Body:

Split out of #5600 (blind spot 3 of 4). The other three closing artifacts shipped in the #5600 PR:
failure-vs-skip telemetry, browser-error Sentry capture, and the bounded entitlement marker.

The gap

persistActivationOutcomeWithRetry returns early on the day-0 path:

// src/components/ProActivationInterstitial.ts
if (!options.onlyIfUnactivated || !options.expectedActivationKey || !options.activationClaimNonce) {
  return;
}

onlyIfUnactivated: false (the day-0, post-checkout path) leaves expectedActivationKey and
activationClaimNonce undefined, so claimProActivationPresentation,
confirmProActivationPresentation, and recordProActivationOutcome are all skipped. The
proActivationPresentations table and report-activation-lift.mjs therefore cover only the
retro/backfill cohort — the one that was working.

Why it mattered

During the #5600 investigation, the day-0 cohort could only be reconstructed by joining Umami
sessions against Convex notificationChannels/alertRules rows and inferring absence. A
server-side outcome row would have made "5/5 day-0 sessions failed every write attempt" a single
query instead of a multi-source forensic exercise.

Why it was deferred

The retro path's ledger is guarded by a claim/nonce lease (claimProActivationPresentation
confirmProActivationPresentationrecordProActivationOutcome) that exists to make the
markerless backfill fire exactly once per subscription. The day-0 path has no equivalent identity
to key on, so this is a design task, not a wiring task — it needs a decision about what the day-0
presentation key is and how it interacts with the existing already_presented / already_claimed
re-claim guards (see #5584/#5590 for the failure mode when that ordering is wrong).

Acceptance

  • A day-0 activation session produces a proActivationPresentations row with its step outcomes.
  • The row cannot block a legitimate later retro re-claim for the same subscription.
  • report-activation-lift.mjs can separate the day-0 and retro cohorts.
  • Regression coverage in e2e/pro-activation.spec.ts (the markerless flow harness already exists).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions