open-design/packages/contracts
lefarcen 85228a2b05
fix(analytics): capture About-you survey across rapid-finish flow (#2713)
PR #2590 wired About-you dropdown selections to fire one
`onboarding/ui_click` per pick (organization_size / use_case /
hear_about_us) with the chosen value attached. Live PostHog data on
nightly.11 showed a real session where every survey value was missing:
the user filled all four dropdowns and clicked Finish setup inside a
~3-second window, the route navigated away before posthog-js could
flush the per-dropdown rows, and the resulting `onboarding_complete_result`
only said `has_about_you: True` without surfacing what the user picked.
Two specific gaps surfaced.

`role` was never tracked at all. `OnboardingDropdown` for role had no
`emitOnboardingClick` call; `OnboardingClickProps` had no `role` field;
`TrackingOnboardingClickElement` had no `'role'` element. Even on a
slow-path session the dashboard could not see what role the user
identified as.

The other three fields (organization_size / use_case / discovery_source)
fired the right click events but were one round-trip away from a route
change. With per-dropdown rows as the only carrier, a Finish-setup
within a ~3-second batch lost them all to navigation-side flush failure.

Fix is two complementary delivery paths plus a closure-staleness repair:

- Contract: `TrackingOnboardingRole` (open-string, like the other
  About-you survey types so adding a future role doesn't force a
  contract bump); `role` element on `TrackingOnboardingClickElement`;
  `role?` and `use_cases?` fields on `OnboardingClickProps`. New
  `about_you_submit` click element + survey-snapshot fields
  (`role`/`organization_size`/`use_cases`/`discovery_source`) on
  `OnboardingCompleteResultProps`.

- EntryShell: emit `role/select_option` on the role dropdown so the
  per-pick funnel is symmetric with the other three. Introduce
  `profileRef` (live mirror via `useEffect`) so closures that fire
  faster than React commits (rapid multi-pick on `use_case`, the
  Finish-setup click after the last onChange) read the latest
  selection instead of stale render-time state. On Finish setup,
  emit a single `about_you_submit/continue` click with the full
  survey snapshot BEFORE `continue` + `onboarding_complete_result`,
  so the highest-value row is queued first. Mirror the same survey
  fields onto `onboarding_complete_result`, giving the dashboard two
  independent carriers for the same data — losing either path still
  leaves the funnel a complete picture.

`use_case` multi-select also had a stale-closure bug separate from
the navigation issue: the delta computation read `profile.useCase`
which was closure-captured one tick behind the latest pick. Reading
`profileRef.current.useCase` makes the delta correct even when two
picks land in the same commit. Live data from the fix session shows
`use_case` rows firing one-per-pick in real time.

Validation against the live PostHog stream on namespace
`onboarding-survey` (dev build, fresh install via wipe + restart):

  09:51:13  role/select_option            role=pm
  09:51:15  organization_size/select_option organization_size=solo
  09:51:16  use_case/select_option         use_case=product
  09:51:18  hear_about_us/select_option    discovery_source=github
  09:51:20  about_you_submit/continue      role=pm + organization_size=solo
                                           + use_cases=['product']
                                           + discovery_source=github
  09:51:20  continue/continue
  09:51:20  onboarding_complete_result     has_about_you=True
                                           role=pm + organization_size=solo
                                           + use_cases=['product']
                                           + discovery_source=github

An earlier pre-fix session on the same window (same user, no reload)
shows the original bug: 4 use_case rows, no role, no
`about_you_submit`, no survey fields on complete despite
`has_about_you: True`.

Targets release/v0.8.0.

  pnpm --filter @open-design/contracts build  green
  pnpm --filter @open-design/contracts test    111/111
  pnpm --filter @open-design/web typecheck     clean
  pnpm --filter @open-design/web test          1843/1843
2026-05-22 17:57:42 +08:00
..
src fix(analytics): capture About-you survey across rapid-finish flow (#2713) 2026-05-22 17:57:42 +08:00
tests feat(analytics): full design-system event family + DS run variant (#2706) 2026-05-22 17:18:57 +08:00
esbuild.config.mjs feat(web): "Resume conversation in new chat" UI — #462 Commit B (companion to #1718) (#2264) 2026-05-20 13:28:27 +08:00
package.json release: Open Design 0.8.0 2026-05-20 21:22:17 +08:00
tsconfig.json Add shared contracts and migrate project code to TypeScript (#118) 2026-04-30 13:01:15 +08:00
tsconfig.tests.json chore: enforce test directory conventions (#496) 2026-05-05 15:34:22 +08:00