Skip to content

Rationalize Product Tours + Some Tweaks from Analytics#49

Merged
vishakh merged 5 commits into
mainfrom
feature/rationalize_tour
Jun 24, 2026
Merged

Rationalize Product Tours + Some Tweaks from Analytics#49
vishakh merged 5 commits into
mainfrom
feature/rationalize_tour

Conversation

@vishakh

@vishakh vishakh commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Growth and UX improvements

Four areas of change driven by GA4 funnel analysis: subscription copy consistency, tour friction reduction, Browse discoverability, and file upload improvements.


Subscription copy consistency

The premium bundle was described differently across three surfaces — the subscribe page, the payment modal, and the Stripe checkout form. Aligned all three to the same language:

  • Subscribe page headline: "Unlock research and premium reports" (was "Subscribe to Monadic DNA Explorer Premium")
  • Payment modal subtitle: "Research in DNA Chat + all premium reports"
  • Stripe form features: "Research in DNA Chat" and "All premium reports (Healthspan, Top Traits, Overview)"
  • Free tier item on subscribe page: "Ask questions in DNA Chat" (was "Send in DNA Chat", which was too similar to the premium "Research in DNA Chat")

Files: app/subscribe/page.tsx, app/components/PaymentModal.tsx, app/components/StripeSubscriptionForm.tsx


Tour rationalization

Tours were auto-opening on first visit to Explore and Overview Report, resulting in a high dismissal rate. Tours are now manual-only, triggered by a ? icon button on each page.

  • Removed auto-open useEffect from /browse and /overview-report
  • Replaced all text-link tour triggers ("Take the tour", "Show me how to use this", "Explain these buttons") with a consistent circular ? button using a new .tour-help-button CSS class
  • Trimmed redundant steps from three tours:
    • Explore (5 → 4 steps): removed your_result — the column doesn't exist until after analysis
    • DNA Chat (6 → 4 steps): removed prompts, input, send — self-evident chat UI
    • Menu Bar (9 → 6 steps): removed results, help, theme — self-explanatory buttons
    • Overview Report: unchanged

Files: app/components/tours/tourContent.ts, app/browse/page.tsx, app/overview-report/page.tsx, app/dna-chat/page.tsx, app/components/MenuBar.tsx, app/globals.css


Browse page discoverability

The search input was hidden inside the collapsed filter panel, meaning most users saw no obvious way to search. Added search chips visible when the panel is collapsed, and added missing analytics coverage.

Search chips

Five topic chips (sleep, cholesterol, caffeine, Alzheimer's, diabetes) appear in the filter panel header when collapsed. Clicking a chip sets the search query and expands the panel.

Analytics

Added five new GA4 events with no existing coverage:

Event When
browse_page_viewed Page mount
browse_filters_expanded User clicks expand when panel is collapsed
browse_search_changed Debounced search input change or chip click (includes query_length)
study_opened User clicks a study title link (includes study_id)
run_all_cta_clicked User clicks Run All, before any confirmation dialog

Files: app/browse/page.tsx, lib/analytics.ts, app/globals.css


File upload improvements

.gz decompression support

Users were uploading gzip-compressed DNA files (a common download format from several providers) and hitting a format validation error. The app now accepts .gz files and decompresses them in the browser using the native DecompressionStream API before parsing.

  • validateFileFormat now accepts .gz
  • uploadGenotype detects .gz by extension and decompresses via DecompressionStream('gzip') before passing content to the parser
  • File input accept attribute updated to include .gz
  • Format hint and error messages updated to mention .gz
  • No new dependencies

Analytics tracking fix

trackSampleDataStarted was firing before the early-exit check for existing saved results in landing-client.tsx. Users who already had results and clicked the sample data button would fire started without a corresponding loaded, inflating the apparent drop-off rate. The event now fires only when a load is actually initiated.

Files: app/components/UserDataUpload.tsx, lib/genotype-parser.ts, app/landing-client.tsx


Test coverage

All 26 parser format checks pass after the .gz change:

  • 23andMe (whitespace-delimited, no-call handling)
  • AncestryDNA (tab-delimited, allele merge, chromosome 26)
  • Monadic/MyHeritage (CSV, quoted fields)
  • FTDNA famfinder (comment-prefixed column header)
  • LivingDNA (split allele columns)
  • Space-delimited header correctly rejected by Monadic parser
  • .gz accepted, .pdf/.vcf/extensionless rejected

@vishakh vishakh self-assigned this Jun 24, 2026
@vishakh vishakh added the enhancement New feature or request label Jun 24, 2026
@vishakh vishakh changed the title Feature/rationalize tour Rationalize Product Tours + Some Tweaks from Analytics Jun 24, 2026
@vishakh vishakh merged commit 1b49d2d into main Jun 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant