Go-to-Market & Growth

Growth Metrics and Analytics

Set up the analytics infrastructure to understand where growth is happening and where it stalls.

If You Cannot Measure It, You Cannot Improve It

Every decision about where to invest — which features to build, which channels to prioritize, which user segments to focus on — should be informed by data. Vanity metrics look good in screenshots. Actionable metrics tell you what to do.

The Analytics Stack

CategoryToolWhat It Measures
Website analyticsPlausible / PostHogTraffic, sources, pages
Product analyticsPostHog / MixpanelFeature usage, funnels
Revenue analyticsBaremetrics / ChartMogulMRR, churn, LTV
Error monitoringSentryExceptions, crashes
UptimeUptimeRobotAvailability

PostHog is the recommended choice for developer-built SaaS: it is open-source, covers both website and product analytics, and has generous free tier.

The Pirate Metrics (AARRR)

The AARRR framework maps the customer journey and identifies where the biggest drop-offs are:

Acquisition — How do users find you? Organic search, social, referral, paid.

Activation — Do they have a good first experience? Do they complete the core action?

Retention — Do they come back? What's the D1, D7, D30 retention rate?

Revenue — Do they pay? What's the free-to-paid conversion rate?

Referral — Do they tell others? NPS score, referral rate.

Track each stage and find the biggest drop-off. That is where to focus.

typescript
const funnelMetrics = {
  signups: { count: 1000, conversionFromPrevious: '100%' },
  activation: { count: 450, conversionFromPrevious: '45%' }, // <-- Biggest drop-off
  retention7d: { count: 290, conversionFromPrevious: '64%' },
  paid: { count: 87, conversionFromPrevious: '30%' },
  referral: { count: 22, conversionFromPrevious: '25%' },
};
// Fix: activation rate is only 45% — 55% of signups never complete the core action
// This should be the #1 focus before investing in acquisition

Cohort Analysis

Group users by signup month and track their behavior over time. This reveals whether the product is improving:

CohortMonth 1 RetentionMonth 3 RetentionMonth 6 Retention
Jan 202572%55%41%
Mar 202575%58%
May 202580%

Improving retention across cohorts means product improvements are working. Declining retention is a warning signal.

Vanity vs Actionable Metrics

Vanity MetricActionable Alternative
Total signupsActive users (DAU/MAU)
Page viewsPages per session + bounce rate
Twitter followersReferral traffic from Twitter
App downloadsD30 retention rate

Vanity metrics only go up. Actionable metrics go up and down — they reflect real health.

Weekly Dashboard

typescript
interface WeeklyMetrics {
  newSignups: number;
  activationRate: number;          // % of signups completing core action
  mrrGrowth: number;               // $ change in MRR
  churnedCustomers: number;
  npsScore: number;
  supportTickets: number;
  openBugs: number;
}
// Review this every Monday — track trends, not just absolute numbers

Key Takeaways

  • The AARRR framework maps your funnel — find the biggest drop-off stage and fix it before investing in earlier stages
  • Cohort analysis reveals whether product improvements are actually improving retention over time
  • Vanity metrics (total signups) look good; actionable metrics (activation rate, retention) reveal reality
  • Set up analytics before launch — you cannot retroactively recover data about early users
  • Weekly metrics review keeps the team aligned on what the data is telling you to do

Example

typescript
// PostHog analytics setup for Next.js
import PostHog from 'posthog-js';

// Initialize in app layout
PostHog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
  api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://app.posthog.com',
  capture_pageview: false, // Manual pageview tracking
});

// Track key events
export const analytics = {
  // Acquisition
  pageView: (page: string) => PostHog.capture('$pageview', { page }),

  // Activation
  coreActionCompleted: (action: string, properties?: Record<string, unknown>) =>
    PostHog.capture('core_action_completed', { action, ...properties }),

  // Revenue
  planSelected: (plan: string, amount: number) =>
    PostHog.capture('plan_selected', { plan, amount }),

  upgraded: (fromPlan: string, toPlan: string) =>
    PostHog.capture('plan_upgraded', { from: fromPlan, to: toPlan }),

  // Retention
  featureUsed: (feature: string) =>
    PostHog.capture('feature_used', { feature }),
};
Try it yourself — TYPESCRIPT