Analytics QA · Project Circe

Quiz Funnel Event Tracking — Spec + BigQuery Verification

Final implemented event pack for the stxtai.com pre-signup quiz funnel, verified end-to-end against BigQuery production data over the last 7 days.

Generated 2026-05-25 · Author: Ilia Cherepanov · Source: D2C-4607 + D2C-4695 + GTM-1842 + D2C-4689

1. Source of truth

The final implemented spec was consolidated from four Linear tickets and one canonical comment thread:

Funnel is currently live on stxtai.com (Lander B, match_me variant) and stxtai.com/v2 (Lander A, creator_funnel_v2 variant). TJ paid traffic ramp-up is scheduled under GTM-1893.

2. Expected event pack — what should fire

Single SPA across home → quiz → teaser → signup. Reuse-first pattern: extend existing events where possible, net-new only when no equivalent exists. All event names are camelCase; Segment auto-converts to snake_case for BigQuery tables.

#Event (camelCase)BQ tableTriggerRequired properties
1page (auto pageView)d2c_prod.pagesLander / mountspage_name='landerHome', affid, clickid, sourceclickid, ef_transaction_id, anonymous_id
2quizStartCtaClickedquiz_start_cta_clicked"Start matching" CTA tap on homecta_location, cta_label, quiz_variant, Everflow params
3quizStepViewedquiz_step_viewedEach quiz step rendersquiz_step (int), step_name, quiz_variant, Everflow params
4quizStepAnsweredquiz_step_answered"Next" tap on each stepquiz_step, step_name, answer_value, time_on_step_ms, is_multi_select, quiz_variant, Everflow params
5teaserResultsViewedteaser_results_viewedTeaser screen rendersquiz_variant (legacy — being collapsed into /signup per spec v2)
6signupStartedsignup_startedSign-up CTA at quiz endfunnel_source='quizLander' | 'quizLanderV2', quiz_answers_* (looks, body, personality, kinks, roleplay…), quiz_variant
7signupFormSubmittedsignup_form_submittedForm submit / Google OAuth tap on /signupmethod (email|google), source
8signupCompletedsignup_completedAccount createdstandard signup props
9identifyidentifiesPost-signupquiz_variant + q_* traits (q_personality, q_kinks, q_body_type, q_hair_color, q_age, q_nationality, q_relationship, q_roleplay, q_creator, q_pet_name)
Killed events — these must NOT fire on the new lander; they were either replaced or are derivable from existing data: landerHomeViewed quizStarted quizCompleted quizAbandoned
Abandonment is derived from anonymous_id + step gaps in dbt view quiz_abandonment_by_step_by_variant.

Session stitching: Segment anonymous_id is the only session key across the full funnel (no custom sessionId). Everflow params (affid, clickid, sourceclickid, ef_transaction_id) are captured once at lander arrival and replayed from localStorage for all downstream events.

3. BigQuery verification — last 7 days, production

3.1 Volume & presence

EventRows (7d)Unique users (7d)Status
pages (lander pageviews)3,4032,141OK
quiz_start_cta_clicked4126OK (low volume, pre-ramp)
quiz_step_viewed57357OK
quiz_step_answered54754OK (~95% answer rate)
teaser_results_viewed8154Still firing (v2 spec removes it)
signup_started6852OK
signup_form_submitted8566OK
signup_completed7065OK
identifies639595OK (full app, not only quiz)
results_cta_clicked00Killed — confirmed
quiz_started, quiz_completed, quiz_abandoned, lander_home_viewed00Killed — confirmed

3.2 Property completeness (% non-null over last 7d)

Propertyquiz_step_viewedquiz_step_answeredquiz_start_cta_clickedsignup_started
anonymous_id100%100%100%100%
quiz_variant100%100%100%100%
quiz_step100%100%n/an/a
step_name100%100%n/an/a
cta_label / cta_locationn/an/a100%n/a
affid28% (162/573)29% (156/547)15% (6/41)32% (22/68)
ef_transaction_id31% (180/573)31% (172/547)20% (8/41)35% (24/68)

Note: affid / ef_transaction_id low fill is expected — only Everflow-tagged traffic carries them. Most current traffic is organic.

3.3 Variant split — actual step sequence in production

match_me variant (Lander B)
8 steps
q_nationality → q_age → q_body_type → screen_appearance → q_personality → q_kinks → q_relationship → screen_about
creator_funnel_v2 variant (Lander A)
4 steps
q_creator → q_v2_body → q_personality → q_roleplay

4. Issues found

1. Step-CTA mismatch — 31 of 57 (54%) quiz step viewers never fired quiz_start_cta_clicked. Likely deep-link entry into /quiz bypassing the home CTA, or a race condition where the step mounts before the CTA event flushes. Action: Mac UAT check — navigate home → start → verify start CTA fires exactly once before any step event.
2. affid < ef_transaction_id — 18 quiz_step_viewed rows + 2 signup_started rows carry ef_transaction_id without affid. Either the Everflow link is missing the aff param, or our extractor drops it. Action: Flag to @ruslan / @ivan ahead of TJ ramp-up.
3. quiz_start_cta_clicked has lower Everflow coverage (15% affid) than downstream events (~28-31%). Suggests the click happens before localStorage replay has hydrated. Action: verify Everflow params are read synchronously on first paint.
4. Step count drift vs spec — original spec said 5 steps (2-6); production ships 8 (match_me) and 4 (creator_funnel_v2). Two match_me rows are intro/outro screens (screen_appearance, screen_about) that still fire quiz_step_viewed — fine, but the analytics-docs and step_name enum should reflect reality.
5. teaser_results_viewed still firing (81 rows / 54 users). Per GTM-1842 v2 spec, the teaser screen was collapsed into /signup. Either the screen wasn't removed, or the event call survived the merge. Action: Ruslan check.
6. Identifies — only 11% carry quiz_variant (67/617). Correct for non-quiz users (legacy signups, app re-identifies), but means int_segment_identify_quiz_traits_latest only has 67 quiz users with traits in 7d. Cohort slicing by q_* only works on that slice.
7. quiz_funnel_by_variant dbt view shows ~52,677 users at step 1 with __quiz_variant_unknown__ — most stxtai.com traffic isn't tagged with a quiz_variant at the page-view layer. Per D2C-4687 variant should resolve at runtime on the home route — verify it's populating on pages.page_name='landerHome'. Right now the dbt funnel can't slice the entry layer by variant cleanly.

5. What's working

6. Recommended next checks (post-TJ ramp)

  1. Force-test deep-link flow (stxtai.com/quiz direct) to determine whether quiz_start_cta_clicked should backfill or stays null by design.
  2. Verify Everflow aff param survives the OAuth round-trip when ef_transaction_id does (the 18/2 mismatch).
  3. Decide whether teaser_results_viewed should be silenced or kept for backfill comparison.
  4. Confirm quiz_variant is populated on the first pages payload from / (D2C-4687 acceptance criterion).
  5. Once TJ traffic ramps via GTM-1893, re-run this verification — expect affid / ef_transaction_id fill rate to jump to ~80-90% on quiz events.