SaaS Metrics
The SaaS metrics system provides an internal founder dashboard for tracking business health. This is not customer-facing — it is used by the founding team to monitor growth, retention, and financial sustainability.
Metrics Tracked
MRR/ARR with Waterfall
Monthly Recurring Revenue broken down by movement:
| Component | Definition |
|---|---|
| New MRR | Revenue from tenants who subscribed this month |
| Expansion MRR | Revenue increase from existing tenants (plan upgrades, overage growth) |
| Contraction MRR | Revenue decrease from existing tenants (plan downgrades) |
| Churn MRR | Revenue lost from tenants who cancelled |
| Reactivation MRR | Revenue from previously churned tenants who resubscribed |
ARR is calculated as MRR * 12.
Retention
| Metric | Formula |
|---|---|
| Net Revenue Retention (NRR) | (Starting MRR + Expansion - Contraction - Churn) / Starting MRR |
| Gross Revenue Retention (GRR) | (Starting MRR - Contraction - Churn) / Starting MRR |
| Logo Churn | Tenants lost / Total tenants at start of period |
| Revenue Churn | Churn MRR / Starting MRR |
Unit Economics
| Metric | Formula |
|---|---|
| ARPU | Total MRR / Active tenants |
| LTV | ARPU / Revenue churn rate |
| CAC | Total acquisition cost / New tenants acquired |
| LTV:CAC | LTV / CAC (target: >3x) |
| Gross Margin | (Revenue - COGS) / Revenue |
COGS includes: Cloudflare Workers/KV/Queues, ClickHouse, Azure hosting, Stripe fees.
Financial Health
| Metric | Definition |
|---|---|
| Burn Rate | Monthly net cash outflow |
| Runway | Cash position / Burn rate (in months) |
| Cash Position | Current bank balance |
Architecture
Stripe Webhooks
→ StripeWebhookController (.NET Management API)
→ SQL (invoice, subscription_event, mrr_snapshot tables)
→ Azure Function (monthly snapshot, timer-triggered)
→ Admin API endpoints
→ Dashboard UI (Portal, admin-only routes)
Data Flow
- Stripe Webhooks —
invoice.paid,invoice.payment_failed,customer.subscription.created,customer.subscription.updated,customer.subscription.deletedevents are received by the .NET Management API. - StripeWebhookController — Processes webhook events, updates invoice records and subscription state in SQL.
- Monthly Snapshot Function — Azure Function runs on the 1st of each month. Computes MRR waterfall, retention metrics, and unit economics. Writes a point-in-time snapshot to the
mrr_snapshotstable. - Admin API — Exposes endpoints for the dashboard to query current and historical metrics.
- Dashboard UI — Portal pages (admin-only) render charts and tables for MRR waterfall, retention trends, and financial health gauges.
SQL Tables
| Table | Purpose |
|---|---|
invoices | All Stripe invoices with status, amounts, line items |
subscription_events | Chronological log of subscription changes (created, upgraded, downgraded, cancelled, reactivated) |
mrr_snapshots | Monthly point-in-time snapshots of all computed metrics |