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
| Category | Tool | What It Measures |
|---|---|---|
| Website analytics | Plausible / PostHog | Traffic, sources, pages |
| Product analytics | PostHog / Mixpanel | Feature usage, funnels |
| Revenue analytics | Baremetrics / ChartMogul | MRR, churn, LTV |
| Error monitoring | Sentry | Exceptions, crashes |
| Uptime | UptimeRobot | Availability |
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.
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 acquisitionCohort Analysis
Group users by signup month and track their behavior over time. This reveals whether the product is improving:
| Cohort | Month 1 Retention | Month 3 Retention | Month 6 Retention |
|---|---|---|---|
| Jan 2025 | 72% | 55% | 41% |
| Mar 2025 | 75% | 58% | — |
| May 2025 | 80% | — | — |
Improving retention across cohorts means product improvements are working. Declining retention is a warning signal.
Vanity vs Actionable Metrics
| Vanity Metric | Actionable Alternative |
|---|---|
| Total signups | Active users (DAU/MAU) |
| Page views | Pages per session + bounce rate |
| Twitter followers | Referral traffic from Twitter |
| App downloads | D30 retention rate |
Vanity metrics only go up. Actionable metrics go up and down — they reflect real health.
Weekly Dashboard
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 numbersKey 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
// 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 }),
};