SSMETRICS
Everything you need to know about SSMetrics analytics tracking, metrics, and verification.
/ssmetrics and generate a new tracking ID/ssmetrics/your-tracking-id to see live metricsSSMetrics works in three layers:
Loaded on your app. Tracks page views and events, detects Session 2 returns automatically.
Receives events from t.js. Validates data, extracts metadata (TTV), stores in PostgreSQL.
Queries the events table with SQL functions. Calculates activation, retention, funnel metrics.
Count of distinct IP addresses or session IDs that visited your app.
Why: Are people finding you? Growth signal #1.
Tracking: Automatic on page load
Total number of page loads across all visitors.
Why: Are people exploring or bouncing immediately?
Tracking: Automatic on page load
% of visitors who viewed only one page. Calculated as: (single-page sessions / total sessions) × 100.
Why: Is your landing page compelling enough to explore?
Tracking: Automatic (one page = bounce)
Which referrer (Google, Twitter, direct) sent the most traffic.
Why: Which channels work? Double down on what drives visitors.
Tracking: Automatic from document.referrer
Which pages/routes get the most views.
Why: What content resonates? Focus on high-traction pages.
Tracking: Automatic (you pass pathname)
% of all visitors who clicked signup. Formula: (signups / visitors) × 100.
Why: Conversion metric. Low? Fix landing page or CTA.
Tracking: You call track('signup_click') and track('signup_success')
% of page views where visitor clicked your call-to-action button.
Why: Are visitors engaging with your CTA? Low = fix copy or placement.
Tracking: You call track('pro_click') or custom events
% of signups who become paying customers. Formula: (payments / signups) × 100.
Why: Revenue conversion. Highest-value metric.
Tracking: You call track('payment_success')
Seconds from page load to when user reaches their aha moment. Example: user creates first board.
Why: Lower TTV = faster product adoption = stickier product.
Tracking: You call track('app_activated', JSON.stringify({ttv_seconds: 45}))
% of visitors who reach your app's aha moment. Formula: (activated / visitors) × 100.
Why: Most important conversion metric. If low, product UX is confusing.
Tracking: You call track('app_activated') when user completes aha moment
Split of activators by speed: Fast = reached aha moment in under 2 min, Friction = took 2+ min.
Why: Identify slow onboarding paths. High friction = users struggling.
Tracking: Calculated from TTV (automatic once you track app_activated)
% of visitors who return within 48 hours. Formula: (returns within 48h / eligible visitors) × 100. Only counts visitors whose first visit was >48h ago.
Why: Clearest signal your app solves a real problem. >20% = genuine utility.
Tracking: Automatic via t.js (no code needed)
Pages where users exit without activating, ranked by drop-off count. Shows average time spent on each dead-end page with smart signals: ⚡ Quick bounce (<10s = page confuses them), 🔄 Getting stuck (>60s = page too complex).
Why: Identifies conversion killers. The pages killing your activation rate. Fix UX, copy, or complexity on these pages.
Tracking: Automatic via t.js (fires on tab close/navigate without activation)
Session 2 Momentum is tracked entirely by t.js — no code needed from you.
ss_first_seen in localStoragesession_2_return event oncehours_to_return (how many hours elapsed)Why 5 min to 48h? — 5 minutes prevents bounces (quick tab closes), 48 hours is enough to prove genuine interest.
Why > 20% is "high utility": If more than 1-in-5 visitors come back on their own (no email, no reminder), your app solves a real problem people want to use repeatedly.
Dead Ends shows which pages are killing your conversion. These are pages where users exit without completing your app's aha moment (without activating).
track('app_activated')friction_bounce event with: last_page, pages_visited, time_on_last_page, session_durationExample: Your pricing page shows 24 drop-offs, 12s avg time. Quick bounce signal = copy doesn't resonate. Raise value or lower price. If it was 120s avg, users are reading but not convinced = strengthen benefits or testimonials.
Minimum threshold: Pages need 2+ drop-offs to appear (prevents noise from single bounces).
✓DO: Define your aha moment clearly — The more specific you are ('user creates first board'), the better TTV tracking will be.
✓DO: Add TrackPage to every route — Missing even one route causes bounce rate errors. Check every /path in your app.
✓DO: Track real business actions — Only add events for features that actually exist. Empty signup forms break your funnel.
✗DON'T: Create your own track() function — The magic prompt's window.track is the ONLY way events reach the backend.
✗DON'T: Add TrackPage inside conditionals — Put it outside if/else so it fires exactly once per page load.
✗DON'T: Wait for localStorage in your tracking — t.js handles all localStorage logic. Just call window.track().
Questions? Visit /ssmetrics to get started.
powered by sandrobuilds.com