Growth: fix the two funnel leaks (cold-start + viral loop) + paste/error hardening#1
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
alexandermayes
added a commit
that referenced
this pull request
Jul 16, 2026
The biggest SEO lever from the funnel analysis: ~1,500 analyses/mo generated zero organic search value because analyze pages were noindex + fully client-rendered, while Google is already the #1 acquisition channel. - lib/report-meta.ts: cached (React cache) server fetch returning a discriminated result (ok/private/not_found/error); shares mapReportMeta with the API route so the mapping lives in one place. - page.tsx: real per-report <title>/description/OG from the actual report (was "Report ABC123"); index ONLY when the report loads publicly; canonical without query params folds ?fight=&source= variants; deleted reports return a real 404; private/errored stay noindex. - ReportSummary.tsx: server-rendered, crawlable summary (headline, zone, encounter list, roster) below the unchanged interactive app. Safeguards keep the ephemeral-content risk contained: private → noindex, deleted → 404, transient WCL errors → noindex + client retry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i
Growth changes from the PostHog funnel analysis (2.8% share rate, 47.6% visitor→submit): - ComparisonSummary: "Copy for Discord" now appends a deep link back to the report so shares drive inbound traffic and Discord unfurls the OG scorecard image. Adds discord_copied.has_link for measurement. - ReportUrlForm + lib/demo-report.ts: landing page gains a "See a live example" button targeting visitors who arrive without a log URL handy (the ~52% who bounce before submitting). Fires demo_report_clicked. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i
Lifts the 2.8% share rate found in the funnel analysis: - Header "Share" button goes from outline to filled (default) so it's discoverable, not a faint top-right icon. - Adds a "Found this useful? Share it with your guild" CTA at the bottom of every tab (raid/player/CLA), where users finish reading — sharing was previously only surfaced in the player scorecard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i
Targets the higher mobile invalid-URL rate (14% vs 11% desktop) and a blind spot found in the funnel analysis: - url-parser: extract a /reports/<code> from pasted text that includes surrounding words (mobile/Discord shares), and read fight/source from both #hash and ?query styles. Fully backward-compatible. - AnalyzeClient: fire report_load_failed when a report passes validation but won't load (usually a private log) — previously a silent drop-off. - Clearer error copy telling users to set a private log to Public/Unlisted. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i
alexandermayes
force-pushed
the
growth/viral-loop-and-demo
branch
from
July 16, 2026 22:36
453d62e to
9ef6545
Compare
|
Deployment failed with the following error: |
alexandermayes
added a commit
that referenced
this pull request
Jul 17, 2026
…#2) * SSR public report summaries + make them indexable The biggest SEO lever from the funnel analysis: ~1,500 analyses/mo generated zero organic search value because analyze pages were noindex + fully client-rendered, while Google is already the #1 acquisition channel. - lib/report-meta.ts: cached (React cache) server fetch returning a discriminated result (ok/private/not_found/error); shares mapReportMeta with the API route so the mapping lives in one place. - page.tsx: real per-report <title>/description/OG from the actual report (was "Report ABC123"); index ONLY when the report loads publicly; canonical without query params folds ?fight=&source= variants; deleted reports return a real 404; private/errored stay noindex. - ReportSummary.tsx: server-rendered, crawlable summary (headline, zone, encounter list, roster) below the unchanged interactive app. Safeguards keep the ephemeral-content risk contained: private → noindex, deleted → 404, transient WCL errors → noindex + client retry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i * Self-populating report sitemap + richer SSR summary - kv-cache: recordRecentReport/getRecentReports back a Redis sorted set of public report codes (scored by last render). No new dependency; no-ops when shared Redis is absent (local dev). - report-meta: record each public report when it server-renders. - sitemap: emit the most recent public reports (hourly revalidate) so Google actively crawls them, alongside the static homepage + guides. - ReportSummary: add an at-a-glance stat row (encounters, kills, raiders, combat time) to the crawlable summary. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Shippable growth changes from the PostHog funnel analysis. The product core is healthy (98.5% analysis / 96% engaged); the funnel leaks at two points, which these changes target:
Acquisition mix (30d): Direct 735 · Google 631 · Reddit ~73 · Bing 67 · ChatGPT 41. SEO is the engine; the viral + SEO items below compound with it.
Changes
1. Discord shares link back (viral loop)
ComparisonSummary.tsx— "Copy for Discord" now appendsFull breakdown → <live report URL>, deep-linking to the exact player/fight and letting Discord unfurl the OG scorecard. Addsdiscord_copied.has_link.2. "See a live example" on the landing page (cold-start)
lib/demo-report.ts(new) +ReportUrlForm.tsx— a "Don't have a log handy? See a live example →" button deep-links to a verified-public raid so first-time visitors without a log URL can experience the product. Firesdemo_report_clicked. Featured report is a single swappable constant.3. Promote + ungate sharing
AnalyzeClient.tsx— header Share button goes outline → filled; adds a "Share it with your guild" CTA at the bottom of every tab (was only surfaced in the player scorecard).4. Paste friction + private-report instrumentation
url-parser.ts— extracts a/reports/<code>from pasted text with surrounding words (mobile/Discord shares) and reads fight/source from both#hashand?querystyles (targets the 14% mobile invalid rate).AnalyzeClient.tsx— firesreport_load_failedon private/failed loads (previously silent) and clearer error copy for private logs.Measurement (PostHog insights)
Notes
npm run buildin CI/preview.demo_report_clicked,report_load_failed,discord_copied.has_link.🤖 Generated with Claude Code
https://claude.ai/code/session_01TG7Bgzws6wZi3hA1P8Gs2i