A SaaS conversion review of every user that signed up for Rating Captain Local in March–April 2026, stitched together from production database, Pipedrive, GA4 (RATING LOCAL SEO), Sentry (rc-local), and Microsoft Clarity. Signup volume is healthy — but only 28% engage in-app, only 15% return the next day, and 98% of trials never become customers.
Each row is a step from the user's perspective. The bar shows what fraction of signups got there. The drop between consecutive bars is where the user gave up or got blocked.
| Step transition | Pass-through | Lost |
|---|---|---|
| Register page → Account created | 52% | −539 |
| Account → Q1 answered (owner/agency) | 43% | −334 |
| Onboarding finished → Google connected | 105%* | +gain |
| Location pulled → Tracking a keyword | 74% | −84 |
| Tracking keyword → Did any in-app action | 68% | −77 |
| Did action → Returned after D0 | 53% | −79 |
| Returned → Started Stripe sub | 14% | −76 |
| Started sub → Still paying today | 75% | −3 |
*Some users connect Google but don't tick the final onboarding box; the funnel is non-monotonic, indicating broken state tracking.
Kill-zone 1 Q1 → 57% of signups never even answer the first onboarding question ("owner or agency?"). 334 of 588 users have account_type = NULL. They open the app, see the first card, and leave.
Kill-zone 2 Tracking a keyword → Did anything → Came back collapses from 244 → 167 → 88. Even users that get auto-seeded with keywords don't engage; only 36% of "activated" users ever return.
Kill-zone 3 88 returned users yielded only 12 paid — a 14% return-to-paid rate. The product is failing to monetize the people who actually do come back, which is far more diagnostic than the top-of-funnel leak.
Locale gap Polish users finish onboarding at 35.1% (80/228) vs English 56.0% (188/336) — a 21-pt gap that should not exist on the home market.
From user_usages — the only reliable in-product activity log — across all 588 cohort users, ever:
| In-app action | Users (of 588) | Share | Read |
|---|---|---|---|
| Ran a Quick Scan / competition map | 73 | 12.4% | "Spy on competitors" pulls people in. |
| Replied to a review | 69 | 11.7% | The single most-used feature for new users. |
| Created post content (AI Posts) | 44 | 7.5% | The flagship "magic" feature is barely used. |
| Refreshed keyword data | 40 | 6.8% | Only 40 users actually engage with keyword tracking. |
| Reached the "aha moment" (tracking a keyword) | 244 | 41.5% | Includes 2 coworkers with access via parent working group. Keywords are auto-seeded on Google connect — most users never come back to use them. |
Of 2,160 keywords ever created by this cohort, 51% (1,101) are already disabled. Either users abandon their tracking before it matures, or trials end and silently disable everything — both stories are bad.
| Issue | Users | Where |
|---|---|---|
| Page not found: ./Pages/undefined.vue | 25 | Vue route resolution returns undefined → blank page. |
| TypeError: …reading 'scrollToItem' | 18 | SelectLocation.vue — the "pick your GBP" dropdown. |
| TypeError: …reading '0' | 9 | App bundle, generic. |
| TypeError: nodeType, k is null | 7 | App bundle. |
| Attempt to read property "id" on null | — | /onboarding/callback — the Google OAuth return. |
| count() error · null array | — | /api/guided-tour/status — guided tour state endpoint. |
| QueryException: actionable_insights.location_id missing | — | /mcp/local — DB schema drift. |
Sentry retention here is short — these are last 48h only and already touch 60+ unique users.
| Signal | Count |
|---|---|
| JS error: Cannot read properties of undefined (reading '0') | 69 |
| Cloudflare Turnstile error 300030 (captcha fail) | 32 |
| can't access property 0, u[h] is undefined | 24 |
| Cannot read properties of null (reading '$el') | 5 |
| Page | Dead clicks | Rage clicks |
|---|---|---|
/dashboard/keywords | 4,414 | 153 |
/dashboard/reviews | 1,396 | 12 |
/dashboard/keywords/quick-scan | 1,274 | 17 |
/settings | 895 | 43 |
The most-rage-clicked screen is the same screen most users exit on (6,433 sessions). Users get stuck on the keyword dashboard and start hammering things that don't respond.
| Stage | → next |
|---|---|
| 1 · Rejestracja RC Local → 2 · WENET | 71.1% |
| 2 · WENET → 3 · Leady Looker | 71.3% |
| 3 · Leady Looker → 4 · Import FB | 74.3% |
| 4 · Import FB → 5 · Contact | 72.3% |
| 5 · Contact → 6 · SQL | 89.7% |
| 6 · SQL → 7 · Ostatnie formalności | 93.6% |
| 7 · Ostatnie formalności → 8 · Umowa | 92.4% |
| 8 · Umowa → 9 · Klient | 93.9% |
| Pipeline win rate (deals that enter) | 21.3% |
| Pipeline lost rate | 78.7% |
Once a human gets a deal past stage 5 (Contact → SQL), conversion is excellent — every subsequent stage clears 89%+. The leak is entirely top-of-funnel and at the human handoff.
origin: API) titled "Szansa sprzedaży {email}", value 0 PLN.pipedrive_id stored back on the user — a sync gap.Industry benchmarks for a freemium / free-trial PLG SaaS in this space (local SEO, GBP tooling, ~Birdeye / GMB Crush adjacent):
| Metric | RC Local Mar–Apr | SaaS benchmark | Verdict |
|---|---|---|---|
| Visitor → Signup (registration page) | 52% | 35–55% | OK — top of funnel works |
| Signup → Real activation (any in-app action) | 28.4% | 40–55% | Below benchmark |
| Day-1 return rate | 15.0% | 35–45% | 3× below benchmark |
| Week-1 retention (D2–D7) | 7.7% | 25–35% | Catastrophic |
| Trial → Paid (ever) | 2.0% | 5–10% (PLG) · 15–25% (sales-led) | 2.5–5× below |
| Trial → Currently paying | 1.5% | 4–8% | 3–5× below |
| Guided tour completion | 0.3% | 40–60% | Tour is broken or invisible |
The product has a classic "leaky funnel + dead activation" shape: marketing brings traffic → signup converts decently → product fails to deliver any value before the user leaves. That's not a pricing problem or a sales problem. It's an onboarding + activation problem, made measurably worse by JS errors on the exact pages the new users land on.
244 users have a tracked keyword but only 167 ever did anything in-app and only 88 came back. Keywords are auto-seeded on Google connect — that's bait, not value. Replace the static keyword list with a 60-second guided "see your first ranking" path: pre-fill 3 keywords from GBP category + city, scan area 1×1km, language auto-detected, one "Start tracking" button, and render a position map immediately.
Clarity recorded 32 Cloudflare Turnstile 300030 errors on the registration screen and Sentry shows "Attempt to read property 'id' on null" at /onboarding/callback — the Google OAuth return. Both silently kill new users.
/onboarding/callback in a defensive null-guard and route the user back to a "Reconnect Google" screen with a one-click retry instead of a 500.2 of 588 users finished it (0.3%). The plan's spotlight overlay + sidebar panel exist on paper — verify /api/guided-tour/status isn't returning 500s (Sentry RC-LOCAL-18A confirms it is), then make the tour start automatically on first dashboard load instead of waiting for ?guided_tour=true in the URL.
PL: 35.1% finish onboarding (80/228) · EN: 56.0% (188/336). Same product, 21-point gap on your largest single language. Likely culprits: translation gaps in the goals step, copy that doesn't match the audience, or a payment / Turnstile issue specific to PL traffic. Run a 2-day session-recording review (Clarity, filter lang=pl) and a translation QA on the entire onboarding flow including error states.
Today every signup creates an identical 0-PLN deal that nobody touches. Send Pipedrive a signal field per deal: did the user activate? how many keywords? trial day? — so SDRs can sort by "highest-intent unqualified" instead of by date. The 89.7% Contact→SQL rate proves: when sales actually contacts an activated user, the deal moves.
onboarding_goals, keywords_count, locations_count, last_login_at as Pipedrive person/deal custom fields nightly.4,414 dead clicks + 153 rage clicks on the single most important screen. This is not a styling issue — users are clicking things that look interactive but aren't. Run a Clarity recording session filter (visitedUrls contains "/dashboard/keywords", deadClickPresent=true, userType=NewUser) and ship a fix sprint covering: tooltips that look like buttons, disabled CTAs that don't say why they're disabled, and the keyword row's expand affordance.
Only ~70 users (12%) ever saw /dashboard/trial-summary — and the people who do see it are on the wrong side of the value gap. Move the summary into the app on day 3 as a "you're halfway through your trial" interstitial showing tracked keywords, posts, and what they'll lose. Add the "Get 7 more days" CTA from the existing Stage 4 plan.
MailerLite groups today are TRIAL_PL / TRIAL_EN + day-based. Switch to event triggers: "signed up but didn't connect Google in 24h", "connected Google but didn't add a keyword in 48h", "added keyword but didn't return in 72h". Each gets a 1-step CTA email with a magic-link straight back to the next required action.
/onboarding/callback, fix /api/guided-tour/status. These three errors are losing more users than any product decision.google_profiles.users, onboarding_accounts, locations, keywords, health_checks, planned_posts, user_usages, subscriptions396020608 "RATING LOCAL SEO" — page paths, events, host filter local.ratingcaptain.com for in-app traffic onlyratingcaptain project rc-local — last 48h issue list (longer retention not configured)