Server-owned lifecycle measurement
When enabled, our application records a small allowlisted set of completed lifecycle milestones: diagnostic start and completion, Checkout creation, and paid, refunded, or disputed order status. The dimensions are limited to a fixed route category, certification, approved offer, coarse campaign category, result, and test or live commerce mode.
To deduplicate and correlate those milestones without storing account, anonymous-principal, attempt, or Checkout identifiers, the server replaces application-owned UUIDs with keyed one-way pseudonyms before storage or Stripe correlation. Pseudonyms are separated by test/live mode and a bounded immutable key epoch. The epoch can change only after every retained event from the prior epoch has expired or been purged.
The analytics table cannot store arbitrary metadata and assigns each event an expiry exactly 90 days after occurrence. An application-owned retention scheduler starts immediately, uses the PostgreSQL clock, and continues pruning expired rows even when collection is disabled or its key is unavailable.
Data excluded from lifecycle events
Lifecycle events never include question text, answer selections, rationale, names, email addresses, raw IP addresses, full user agents, URLs or query strings, authentication or session tokens, Stripe secrets, payment details, Stripe object IDs, or arbitrary metadata.
This first-party service is independent of Google Analytics and Clarity. It is server-owned, does not add a browser tag or cookie, and fails closed when its dedicated pseudonymization key is unavailable.