Rationalize Product Tours + Some Tweaks from Analytics#49
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
Files:
app/subscribe/page.tsx,app/components/PaymentModal.tsx,app/components/StripeSubscriptionForm.tsxTour 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.useEffectfrom/browseand/overview-report?button using a new.tour-help-buttonCSS classyour_result— the column doesn't exist until after analysisprompts,input,send— self-evident chat UIresults,help,theme— self-explanatory buttonsFiles:
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.cssBrowse 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:
browse_page_viewedbrowse_filters_expandedbrowse_search_changedquery_length)study_openedstudy_id)run_all_cta_clickedFiles:
app/browse/page.tsx,lib/analytics.ts,app/globals.cssFile upload improvements
.gzdecompression supportUsers were uploading gzip-compressed DNA files (a common download format from several providers) and hitting a format validation error. The app now accepts
.gzfiles and decompresses them in the browser using the nativeDecompressionStreamAPI before parsing.validateFileFormatnow accepts.gzuploadGenotypedetects.gzby extension and decompresses viaDecompressionStream('gzip')before passing content to the parseracceptattribute updated to include.gz.gzAnalytics tracking fix
trackSampleDataStartedwas firing before the early-exit check for existing saved results inlanding-client.tsx. Users who already had results and clicked the sample data button would firestartedwithout a correspondingloaded, 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.tsxTest coverage
All 26 parser format checks pass after the
.gzchange:.gzaccepted,.pdf/.vcf/extensionless rejected