Metrics & Money Framework
Pre-work for Session 8 | Prepared: 2026-02-18
Summary (3 sentences for Danny)
We are pre-revenue with zero production data, so the metrics system needs to be dead simple: one North Star metric (properties under active management), a weekly dashboard Danny checks in 5 minutes, and a monthly review that the engineering team runs from Stripe + Supabase data — no analytics platform until we hit 50 paying customers. The unit economics look strong on paper (GBP 0.43-0.99 cost per property, GBP 3-5 revenue per unit, 67-86% gross margin) but every assumption needs validation from the first 10 customers, so the framework includes a concrete validation plan with specific data points to collect and when. Stripe handles billing with per-unit pricing and 14-day free trials, ChartMogul (free tier) gives us MRR/churn dashboards from day one, and we track LLM costs per customer using Langfuse or a simple Supabase logging table — total tooling cost: GBP 0-80/month.
The Metrics That Matter
For a pre-revenue SaaS, what should we actually track? The answer is not everything — it is the smallest set of numbers that changes decisions. If a metric does not cause you to do something different, stop tracking it.
North Star Metric
Properties under active management (PAM) — defined as properties where at least one tenant has sent a message through Envo in the last 30 days.
Why this and not MRR?
MRR is a lagging indicator — it tells you what happened. PAM is a leading indicator — it tells you whether the product is delivering value. A landlord who pays but whose tenants never use the system will churn. A landlord whose tenants are actively messaging will stay. PAM correlates with retention, expansion (landlords add more properties when it works), and referrals (they tell other landlords).
At our stage, growing PAM from 0 to 100 is the only thing that matters. Revenue follows.
Target trajectory:
- Month 1-3: 0 to 50 PAM (first 5-8 customers)
- Month 4-6: 50 to 200 PAM (product-market fit signal)
- Month 7-12: 200 to 500 PAM (scaling signal)
Weekly Dashboard
What does Danny look at every Monday morning? What do Bilal and Deen look at?
Danny’s Monday Dashboard (5 minutes, no login required — delivered via email or Slack)
| Metric | Target | Source | Why It Matters |
|---|---|---|---|
| New sign-ups this week | 3-5/week by month 3 | Supabase Auth | Is the top of funnel working? |
| Active trials | Track trend | Supabase (trial_started_at) | How many people are evaluating us right now? |
| Trial-to-paid conversions this week | >15% of expiring trials | Stripe | Are trials turning into revenue? |
| Hot leads in pipeline | 3-5 at any time | Notion lead tracker | Is there enough to close this month? |
| Properties added this week (new + existing customers) | Increasing week-on-week | Supabase | Are customers expanding? |
| Customer health flags | Zero red flags | Supabase (no login >5 days, zero issues >14 days) | Who is about to churn? |
Engineering Dashboard (5 minutes, from Supabase + provider dashboards)
| Metric | Target | Source | Why It Matters |
|---|---|---|---|
| Total AI conversations this week | Track trend | Supabase conversation logs | Is usage growing? Are we approaching cost thresholds? |
| AI resolution rate (conversations that did not need landlord intervention) | >60% | Supabase (issue status) | Is the AI good enough? This is our core product quality metric |
| LLM spend this week (GBP) | < 50% of revenue | Anthropic/OpenAI dashboards | Are costs tracking to plan? |
| System uptime | 99.5%+ | UptimeRobot | Did anything break? |
| Support tickets opened | <1 per customer/month | Crisp or email inbox | Is the product confusing? |
| Error rate (Sentry) | <0.1% of requests | Sentry | Stability check |
Monthly Review Metrics
The team sits down for 30 minutes on the first Monday of each month.
| Metric | Formula | Benchmark (Early Stage B2B SaaS) | Our Target |
|---|---|---|---|
| MRR | Sum of all active subscription values | N/A pre-revenue; 10-20% MoM growth once live | 15% MoM growth after month 3 |
| MRR Growth Rate | (MRR this month - MRR last month) / MRR last month | 10-20% MoM for early stage | 15% MoM |
| Logo Churn Rate | Customers lost / customers at start of month | <5% monthly for early B2B SaaS; 3.5% is average | <5% monthly |
| Revenue Churn Rate | MRR lost from churned + contracted / MRR at start | <3% monthly (best-in-class B2B SaaS) | <5% monthly |
| Net Revenue Retention | (MRR at start + expansion - contraction - churn) / MRR at start | >100% is the gold standard | >100% by month 6 |
| CAC Payback Period | CAC / (ARPU x Gross Margin %) | <12 months; early stage median is 4.8 months | <6 months |
| Gross Margin | (Revenue - COGS) / Revenue | 70-85% for B2B SaaS | >70% |
| Trial-to-Paid Conversion | Paid conversions / trial starts in same cohort | 10-25% for B2B SaaS free trials | >15% |
| Properties per Customer | Total properties / total customers | N/A | Increasing trend (expansion signal) |
| Tenant Adoption Rate | Tenants who messaged / total tenants in system | N/A (our unique metric) | >30% within 30 days of go-live |
Revenue Metrics
| Metric | Definition | How to Calculate | Tool |
|---|---|---|---|
| MRR | Monthly Recurring Revenue — the predictable revenue normalised to a monthly amount | Sum of all active subscriptions’ monthly value. Annual plans divided by 12 | Stripe Dashboard or ChartMogul |
| ARR | Annual Recurring Revenue | MRR x 12 | ChartMogul |
| ARPU | Average Revenue Per User (per customer) | MRR / number of paying customers | Stripe + spreadsheet |
| ARPA | Average Revenue Per Account | Same as ARPU for us (1 account = 1 org) | Stripe |
| Revenue per property | Revenue generated per property under management | MRR / total properties across all paying customers | Supabase + Stripe |
| MRR Growth Rate | Month-on-month percentage increase in MRR | (Current MRR - Previous MRR) / Previous MRR | ChartMogul |
| New MRR | MRR from brand new customers this month | Sum of first-month subscriptions | ChartMogul |
| Expansion MRR | MRR increase from existing customers (added properties, upgraded tier) | Sum of MRR increases from existing accounts | ChartMogul |
| Contraction MRR | MRR decrease from existing customers (removed properties, downgraded) | Sum of MRR decreases from existing accounts | ChartMogul |
| Churned MRR | MRR lost from customers who cancelled | Sum of MRR from cancelled subscriptions | ChartMogul |
| Net New MRR | Total MRR change this month | New MRR + Expansion MRR - Contraction MRR - Churned MRR | ChartMogul |
Customer Metrics
| Metric | Definition | Target | How to Measure |
|---|---|---|---|
| Total paying customers | Organisations with an active, non-trial subscription | Growing month-on-month | Stripe active subscriptions |
| Total properties under management | All properties across all paying orgs | This is our scale metric — target 500 by month 12 | Supabase properties table, filtered to paying orgs |
| Trial-to-paid conversion rate | Percentage of trial sign-ups that convert to a paid plan within 30 days | >15% (industry benchmark 10-25%) | Stripe: count conversions / count trial starts per cohort |
| Activation rate | Percentage of sign-ups who complete the aha moment (first real tenant conversation) | >60% within 7 days of sign-up | Supabase: first non-test message timestamp exists within 7 days of account creation |
| Time to activation | Days from sign-up to first real tenant conversation | <3 days (Solo Landlord), <7 days (Portfolio) | Supabase: timestamp diff between account creation and first tenant message |
| Logo churn rate | Percentage of customers who cancel per month | <5% monthly | Stripe cancelled subscriptions / active at start of month |
| Revenue churn rate | Percentage of MRR lost to cancellations and downgrades | <5% monthly | ChartMogul |
| Net Revenue Retention (NRR) | Whether existing customers generate more or less revenue over time | >100% (means expansion outweighs churn) | ChartMogul |
| Properties per customer | Average number of properties per paying org | Track trend — increasing means expansion | Supabase |
| NPS / CSAT | Customer satisfaction | NPS >40, CSAT >4.0/5.0 | Manual survey (Typeform or Google Form) at day 30 and quarterly |
| Customer concentration | Revenue from top customer / total MRR | <25% (risk flag if one customer is too large) | Stripe |
Product Metrics
| Metric | Definition | Why It Matters |
|---|---|---|
| AI conversations handled | Total conversations where the AI responded to a tenant without human intervention | Core product value metric — proves the automation thesis |
| AI resolution rate | Percentage of conversations resolved without landlord intervention (issue created, information provided, or troubleshooting completed by AI alone) | The single best measure of product quality. If this is low, landlords are still doing the work manually |
| Tenant adoption rate | Percentage of imported tenants who have sent at least one message | If tenants do not use it, landlords see no value. Track per-property and per-customer |
| Average response time | Time from tenant message to AI first response | Should be <30 seconds. If degraded, indicates system performance issues |
| Conversations per property per month | Average number of AI conversations per active property | Drives cost calculations. Our model assumes ~2/property/month. Validate this urgently |
| Channel distribution | Percentage of conversations by channel (web chat, WhatsApp, voice, email) | Determines cost mix (voice is 5-10x more expensive). Informs channel investment decisions |
| Issue creation rate | Percentage of conversations that result in a new issue being created | Not all conversations are issues (some are information queries). Track the split |
| Document AI queries | Number of times the AI retrieves information from uploaded property documents | Measures whether the RAG pipeline is being used. Low numbers mean either documents are not uploaded or the AI is not retrieving well |
| Onboarding completion rate | Percentage of sign-ups that complete all activation milestones | Per the onboarding matrix: >85% should reach fully-live status |
| Feature adoption breadth | Number of features used per customer in first 30 days (issue management, vendor assignment, compliance tracking, document upload, reporting) | Customers using 3+ features in the first month are significantly less likely to churn |
| Vendor assignment rate | Percentage of issues that get a vendor assigned | Measures whether landlords are using the full workflow or just using Envo as a notification system |
Cost Metrics
| Metric | Definition | Target |
|---|---|---|
| Cost per property per month | Total infrastructure costs / total active properties | <GBP 1.00 (from capacity analysis: GBP 0.43-0.99 at scale) |
| Cost per conversation | (LLM cost + messaging cost) / total conversations | <GBP 0.20 (from estimates: GBP 0.06-0.18 LLM + GBP 0.06-0.18 WhatsApp) |
| LLM cost per customer per month | Total Anthropic + OpenAI spend / paying customers | Track and ensure it stays <30% of ARPU |
| Twilio cost per customer per month | Total Twilio spend (WhatsApp + SMS) / paying customers | Track and ensure it stays <20% of ARPU |
| Voice cost per customer per month | Total VAPI spend / customers using voice | This is the wildcard — voice is 5-10x more expensive per interaction |
| Total COGS per customer | All variable costs attributable to serving one customer (LLM + Twilio + VAPI + SendGrid + allocated Supabase/Vercel) | <30% of ARPU to maintain 70%+ gross margin |
| Gross margin | (Revenue - COGS) / Revenue | >70% (SaaS industry norm for B2B vertical software is 70-85%) |
| Infrastructure cost (fixed) | Supabase + Vercel + SendGrid base fees | <GBP 150/month until 500+ properties |
| Infrastructure cost per property | Fixed infra costs / total properties | Decreasing as we scale (economies of scale on fixed costs) |
| Support cost per customer | Danny + Bilal/Deen time on support x hourly rate / customers | <GBP 10/customer/month (otherwise hire a support person) |
| Burn rate | Total monthly spend (infra + tools + any contractor costs, excluding salaries) | Track monthly; target <GBP 500/month pre-revenue |
Unit Economics
The Model
| Variable | Estimate | Source | Confidence |
|---|---|---|---|
| ARPU (per customer) | GBP 150-250/month (assumes 30-50 units at GBP 3-5/unit) | Pricing analysis — GBP 3/unit Basic, GBP 5/unit Professional | Medium — untested with real customers |
| Revenue per property | GBP 3-5/month | Pricing analysis | Medium |
| COGS per property | GBP 0.43-0.99/month (all-in, Envo pays everything) | Capacity analysis | Medium — based on 2 conversations/property/month |
| COGS per property (BYOAK Premium) | GBP 0.25-0.55/month | Capacity analysis | Medium |
| Gross margin per property | 67-86% at GBP 3/unit; 80-90% at GBP 5/unit | Calculated: (price - cost) / price | Medium |
| Gross margin per customer | GBP 100-215/month | ARPU x gross margin % | Medium |
| CAC | GBP 200-500 (estimated: Danny’s time + demos + content) | Estimate: 5-10 hours of Danny’s time per closed customer | Low — no data yet |
| LTV | GBP 1,800-5,100 (at 12-18 month average lifetime) | ARPU x gross margin x average customer lifetime in months | Low — no retention data |
| LTV/CAC ratio | 3.6-25.5x | LTV / CAC | Low — both inputs are estimates |
| CAC payback period | 1-3 months | CAC / (ARPU x gross margin %) | Low — optimistic because early adopters convert easily |
| Monthly burn rate (infra only) | GBP 100-200 pre-customers | Current Supabase + Vercel + domain costs | High |
| Break-even customer count | 1-2 customers (infra only, excluding salaries) | Burn rate / gross margin per customer | High |
Key Assumptions in the Model
- 2 conversations per property per month — This is the biggest cost assumption and the least validated. HMOs with 6+ tenants could be 3-5x this.
- 30-50 units per customer — Based on ICP (15-50 property HMO operators, averaging 2-3 units per property). Could be lower if we attract smaller landlords.
- 12-18 month customer lifetime — Industry average for SMB B2B SaaS is 12-24 months. We have zero data.
- GBP 200-500 CAC — Assumes founder-led sales (Danny’s time). No paid acquisition. This is low by SaaS standards but realistic for a warm-network-first GTM.
- 70%+ gross margin — Requires costs per property to stay under GBP 1.00. If voice adoption is high or conversation volume per HMO exceeds estimates, margin compresses.
Validation Plan
What data do we need from the first 10 customers to validate or invalidate the model?
| Assumption | What We Assumed | How to Measure | When We Will Know | Action if Wrong |
|---|---|---|---|---|
| Conversations per property per month | ~2 | Count distinct conversations per property per month from Supabase logs | After 30 days of live usage per customer | If >4: raise per-unit price or introduce conversation caps. If <1: investigate tenant adoption |
| Channel mix (WhatsApp vs voice vs web chat) | 70% WhatsApp, 10% voice, 20% web chat | Count conversations by channel from Supabase | After 60 days of usage | If voice >25%: cost model breaks, must either cap voice minutes or increase price |
| Tenant adoption rate | >30% of tenants use system within 30 days | Count unique tenant senders / total tenants per org | 30 days after each customer go-live | If <15%: onboarding problem — tenants are not being told about Envo. Fix welcome message and landlord communication |
| Average units per customer | 30-50 | Average property count across paying customers from Supabase | After 10 paying customers | If <15: ARPU is lower than modelled, need more customers to reach same MRR. Consider lowering minimum commitment |
| CAC (Danny’s time to close) | 5-10 hours | Danny tracks hours per closed customer in Notion | After 10 closes | If >15 hours: sales process is too heavy. Invest in self-serve. If <5 hours: scale outreach |
| Trial-to-paid conversion | >15% | Stripe: conversions / trial starts | After 20 trial sign-ups | If <10%: aha moment is not landing. Review onboarding flow, sandbox demo, and Danny’s follow-up timing |
| Churn (monthly) | <5% | Stripe cancellations / active at month start | After 6 months (need enough data) | If >8%: product-market fit problem. Conduct exit interviews. Check if AI quality is the issue |
| LLM cost per conversation | GBP 0.06-0.18 | Anthropic/OpenAI billing / conversation count | After 30 days | If >GBP 0.25: optimise prompts, reduce token usage, consider cheaper model for simple queries |
| Expansion revenue | Existing customers add properties | Track unit count changes per org in Supabase over time | After 90 days | If zero expansion: product is not sticky enough or landlords have fixed portfolios. Adjust growth model |
| Gross margin | >70% | (Revenue - all variable costs) / Revenue | After 3 months of billing | If <60%: pricing is too low or costs are higher than modelled. Review per-customer cost breakdown |
Billing Setup
Stripe Configuration
Based on ADR-004 (Billing Integration Strategy), Stripe is the assumed provider. Here is how to configure it for per-unit billing with tiers.
| Tier | Stripe Product | Price Model | Trial | Notes |
|---|---|---|---|---|
| Starter | Product: “Envo Starter” | Per-unit recurring price: GBP 3/unit/month. Use recurring[usage_type=licensed] with quantity set to number of units. Minimum 10 units enforced via checkout logic | 14-day free trial, no card required at sign-up. Card collected at day 12 via email prompt | Quantity updated when landlord adds/removes properties via dashboard. Use Stripe subscription_items.update to change quantity |
| Professional | Product: “Envo Professional” | Per-unit recurring price: GBP 5/unit/month. Same licensed model with quantity. Minimum 20 units | 14-day free trial, no card required. Premium features active during trial | Higher conversation cap (8/unit/month vs 4). Voice channel included |
| Enterprise | Product: “Envo Enterprise” | Custom pricing: GBP 2-3/unit/month negotiated. Manual Stripe subscription creation with custom amount | Pilot programme (30 days, bespoke) | BYOAK means lower Envo costs. Manual invoicing may be needed for large accounts. Minimum GBP 500/month |
| Add-ons | Separate Stripe Products | One-time or recurring: Extra conversation packs (GBP 15/50 conversations), extra voice minutes (GBP 10/30 minutes), extra team seats (GBP 10/seat/month) | N/A | Attached as additional subscription items |
Stripe setup steps (practical):
- Create a Stripe account (if not already done). Activate in the UK with GBP as default currency
- Create Products for each tier (Starter, Professional, Enterprise)
- Create Prices on each Product: per-unit, monthly recurring, GBP denominated
- Set up a Customer Portal (Stripe hosted) so landlords can update payment methods, view invoices, and cancel
- Implement Stripe Checkout for sign-up conversion (trial end → card collection)
- Set up webhooks to sync subscription status back to Supabase (
organisations.planandexternal_billing_id) - Enable Smart Retries for failed payments (Stripe’s built-in dunning — recovers up to 25% of failed charges)
- Configure Stripe Tax for automatic UK VAT calculation
Integration pattern (from ADR-004):
Stripe Webhook --> Supabase Edge Function --> billing_events table
--> Update subscriptions table
--> Update organisations.plan
Billing Flows
| Event | What Happens | Stripe Mechanism |
|---|---|---|
| Sign-up (trial start) | Customer creates account. Stripe Customer created with external_billing_id stored in Supabase. Subscription created with trial_period_days: 14. No card required | stripe.customers.create + stripe.subscriptions.create with trial |
| Trial day 12 | Automated email: “Your trial ends in 2 days. Add a payment method to continue.” Link to Stripe Customer Portal | Stripe Billing automatic trial-ending emails (configurable in Dashboard) |
| Trial end (card on file) | Subscription transitions to active. First invoice generated and charged. organisations.plan updated via webhook | Automatic Stripe trial-to-active transition. Webhook: customer.subscription.updated |
| Trial end (no card) | Subscription moves to past_due or canceled (configurable). Dashboard becomes read-only. Data preserved 30 days | Stripe subscription_schedule or manual cancellation logic. Webhook: customer.subscription.deleted |
| Upgrade (Starter to Professional) | Subscription updated to Professional price. Prorated amount charged for remainder of billing period | stripe.subscriptions.update with proration_behavior: 'create_prorations' |
| Downgrade (Professional to Starter) | Subscription updated at end of current billing period. Features restricted immediately or at period end (decision needed) | stripe.subscriptions.update with proration_behavior: 'none', effective at current_period_end |
| Property count change (add units) | Quantity on subscription item increased. Prorated charge for added units | stripe.subscriptionItems.update with new quantity. Proration automatic |
| Property count change (remove units) | Quantity decreased. Credit applied to next invoice | stripe.subscriptionItems.update with reduced quantity |
| Failed payment | Stripe Smart Retries kick in (up to 4 retry attempts over ~3 weeks). Customer emailed automatically. After final failure: subscription moves to past_due, then canceled after grace period | Stripe Smart Retries + configurable dunning emails. Webhook: invoice.payment_failed |
| Successful retry | Subscription restored to active. No customer action needed | Automatic. Webhook: invoice.paid |
| Voluntary cancellation | Customer cancels via Customer Portal or contacts Danny. Subscription set to cancel at end of billing period. Access continues until period end | stripe.subscriptions.update with cancel_at_period_end: true. Webhook: customer.subscription.updated |
| Reactivation | Previously cancelled customer resubscribes. New subscription created (or existing one uncancelled if within grace period) | stripe.subscriptions.update to remove cancel_at_period_end, or new subscription creation |
| Annual billing | 20% discount applied. Single annual charge. Subscription with interval: 'year' | Separate annual Price on same Product. Or use Stripe Coupons for the discount |
Invoice and Tax
UK VAT requirements for SaaS:
- VAT registration threshold: GBP 90,000 taxable turnover. Below this, VAT registration is optional but not required
- VAT rate on SaaS: 20% standard rate for UK customers
- When to register: When you anticipate reaching GBP 90K in the next 30 days, or when you have exceeded it in the previous 12 months. At our projected pricing, this is roughly 150-250 paying customers
- Recommendation: Do NOT register for VAT at launch. You are pre-revenue. Register when you approach the threshold. This keeps pricing simple (no VAT to add or absorb)
- When you do register: Use Stripe Tax for automatic VAT calculation and collection. Stripe handles the rate determination and adds VAT to invoices automatically
What needs to be on invoices (once VAT-registered):
- Your business name and address
- Your VAT registration number
- Invoice date and unique invoice number
- Customer’s name and address
- Description of the service (“Envo property management platform — [X] units, [Tier] plan”)
- Quantity and unit price
- Total amount excluding VAT
- VAT rate and VAT amount
- Total amount including VAT
Pre-VAT registration: Stripe invoices will include all the above except VAT fields. Still include your business details and a clear description of the service.
B2B reverse charge: If you sell to VAT-registered businesses (letting agencies), the reverse charge mechanism may apply. Stripe Tax handles this automatically when the customer provides their VAT number.
Record keeping: HMRC requires you to keep records for at least 6 years. Stripe retains all invoice and payment data indefinitely. Additionally, the UK will require mandatory B2B e-invoicing from April 2029 — Stripe is expected to support this.
Financial Tooling
| Need | Tool | Cost | Why |
|---|---|---|---|
| Payment processing + subscriptions | Stripe Billing | 1.5% + 20p per transaction (UK cards) + GBP 0 monthly | Industry standard. Handles subscriptions, trials, dunning, invoices, tax. Per-unit pricing supported natively. No monthly fee — just transaction costs |
| SaaS metrics dashboard (MRR, churn, LTV) | ChartMogul (free tier) | GBP 0 (free up to GBP 96K ARR / ~$120K) | One-click Stripe integration. Automatic MRR, ARR, churn, LTV, cohort analysis. Free tier includes unlimited users and core reports. Upgrade to paid only when ARR exceeds threshold |
| LLM cost tracking | Langfuse (open source, self-hosted) OR simple Supabase logging table | GBP 0 (self-hosted) or GBP 0-25/month (Langfuse cloud) | Tag each LLM call with org_id and conversation_id. Aggregate daily cost per customer. Essential for validating unit economics. Alternative: log token counts and costs to a llm_usage table in Supabase and query with SQL |
| Uptime monitoring | UptimeRobot (free tier) | GBP 0 | 50 monitors free, 5-minute checks. Status page included. Alerts via email/Slack/webhook. Upgrade to paid (GBP 6/month) for 1-minute checks if needed |
| Error tracking | Sentry (free tier) | GBP 0 | 5K errors/month free. Catches bugs before customers report them. Critical for product quality metrics |
| API cost dashboards | Anthropic Console + OpenAI Usage + Twilio Console | GBP 0 | Each provider has its own usage dashboard. Check weekly. No additional tooling needed until costs are complex enough to warrant aggregation |
| Spreadsheet for manual tracking | Google Sheets | GBP 0 | For anything that does not yet justify a tool: CAC tracking, Danny’s time per customer, manual cohort analysis, board reporting. One shared sheet, updated monthly |
| Lead tracking | Notion (free tier) | GBP 0 | As defined in the lead tiers playbook. Not a CRM — a structured database. Upgrade to paid when >200 leads |
| Customer feedback / NPS | Typeform or Google Forms | GBP 0 | Send at day 30 and quarterly. 3-5 questions max. Do not overthink this — a simple “How likely are you to recommend Envo?” with a free-text “Why?” is enough |
| Accounting | Xero (Starter) or FreeAgent | GBP 15-25/month | Not needed until revenue starts. When it does: connect Stripe to Xero for automatic invoice reconciliation. Essential for VAT returns when you register |
| Forecasting | Google Sheets | GBP 0 | A simple model: current MRR x growth rate = forecast. No tool needed. Baremetrics has forecasting but costs GBP 80+/month — premature |
Total tooling cost at launch: GBP 0-25/month (Langfuse cloud is the only possible non-zero cost, and even that can be self-hosted for free).
When to upgrade:
| Trigger | Action | Estimated Cost |
|---|---|---|
| ARR exceeds GBP 96K (~80 customers at GBP 100/month) | ChartMogul paid tier | GBP 80-100/month |
| >50 customers and cost attribution becomes complex | Dedicated cost tracking (Portkey or LiteLLM proxy) | GBP 0-50/month |
| Revenue starts and VAT registration approaches | Xero or FreeAgent for accounting | GBP 15-25/month |
| >100 customers | Baremetrics (adds dunning, forecasting, cancellation insights) | GBP 80-200/month |
Reporting Cadence
| Report | Frequency | Audience | Contains |
|---|---|---|---|
| Danny’s Dashboard | Weekly (Monday morning, automated email) | Danny | New sign-ups, active trials, conversions, pipeline count, customer health flags, properties added |
| Engineering Dashboard | Weekly (Monday morning, Supabase query or script) | Bilal, Deen | AI conversations, resolution rate, LLM spend, uptime, errors, support tickets |
| Monthly Business Review | Monthly (first Monday) | Danny + Bilal + Deen | Full metrics: MRR, growth, churn, CAC, unit economics, cost per property, product metrics, NPS. 30-minute meeting |
| Customer Health Check | Monthly (alongside business review) | Danny | Per-customer: properties, usage, last login, issues handled, support tickets, expansion/contraction signals |
| Cost Audit | Monthly (Bilal or Deen runs, 15 minutes) | Bilal, Deen | Provider-by-provider spend: Anthropic, OpenAI, Twilio, VAPI, Supabase, Vercel, SendGrid. Per-customer attribution where possible |
| Quarterly Board/Investor Update (when relevant) | Quarterly | External stakeholders | ARR, growth rate, customer count, churn, LTV/CAC, gross margin, product highlights, next quarter goals |
| Validation Report | After 10 customers (one-time, then quarterly) | Whole team | Comparison of assumed vs actual: conversations/property, channel mix, tenant adoption, CAC, churn. The “were we right?” report |
How to Build the Dashboards (Practically)
For a 3-person team, do not build dashboards. Query data and send it somewhere people already look.
Danny’s weekly email: Write a Supabase Edge Function or a simple cron job (n8n workflow) that runs every Monday at 8am, queries key metrics from Supabase + Stripe API, and sends a formatted email to Danny. Total build time: 2-4 hours.
Engineering weekly check: A SQL script saved in the repo that Bilal or Deen runs against Supabase. Returns a table of key metrics. Takes 5 minutes to run and read. Build time: 1-2 hours.
Monthly review: Google Sheets template with manual data entry from ChartMogul, Stripe, Supabase, and provider dashboards. Pre-built formulas calculate derived metrics (gross margin, CAC payback, NRR). Build time: 2 hours initially, 30 minutes to update monthly.
Do not build a custom analytics dashboard. It is a trap. Use existing tools (ChartMogul, Stripe Dashboard, provider consoles) and a spreadsheet. Build a custom dashboard only when you have 100+ customers and the manual process takes >1 hour per week.
Open Questions for Session
-
Per-property or per-unit billing in Stripe? The pricing analysis recommends per-unit (per room in HMOs). This affects how we set up Stripe Products and Prices. If per-property, the quantity on the subscription = number of properties. If per-unit, quantity = total rooms/units. This must be decided before Stripe setup. Danny — what did prospects respond to?
-
When do we start charging? The first 3-5 customers are arguably pilots, not paying customers. Do we offer “founding customer” pricing (e.g., 50% off for 12 months in exchange for feedback and testimonials)? Or do we charge full price from day one to validate willingness to pay? There is a strong argument for charging from day one — free pilots do not validate demand.
-
Conversation caps — do we enforce them or just track them? The pricing matrix includes 4 conversations/unit/month on Starter, 8 on Professional. Do we actually cut off AI responses when the cap is hit, or do we track usage and use overages as an upgrade trigger? Hard caps create bad experiences. Soft caps with alerts are gentler. Decision needed.
-
Who owns the metrics? Proposed: Danny owns customer and revenue metrics (he is closest to the money). Bilal and Deen own product and cost metrics (they are closest to the system). All review together monthly. Does this split work?
-
LLM cost tracking — build or buy? Option A: Log token usage to a Supabase table on every LLM call (add
org_id,tokens_in,tokens_out,cost,modelcolumns). Zero cost, fully custom, but we have to build the aggregation queries. Option B: Use Langfuse (purpose-built LLM observability). More features but another tool to manage. Recommendation: Option A for launch (15 minutes to build), migrate to Langfuse when we need deeper analysis. -
How do we handle the HMO cost problem? A 6-bed HMO generates roughly 6x the conversations of a single-let but might pay the same under per-property pricing. The validation plan will tell us the actual numbers, but we need a contingency plan now. Options: per-unit pricing (recommended), conversation caps, or an HMO surcharge. What feels right to Danny from a sales perspective?
-
Do we need Xero from day one? If we are pre-revenue and below the VAT threshold, a spreadsheet tracking income and expenses might suffice for the first 6 months. Xero adds ongoing cost and complexity. Counter-argument: connecting Stripe to Xero from day one means clean books from the start with no retrospective data entry. Worth the GBP 15-25/month?
-
What is our burn rate tolerance? The infrastructure costs are low (GBP 100-200/month), but total burn including tools, domain, and any contractor work needs a number. How long is our runway, and does that affect how aggressively we price or how many free trials we offer?
-
Annual billing from launch? 20% discount for annual payment improves cash flow and reduces churn (customers are committed for 12 months). But we have no retention data — what if the product is not good enough and we have to issue refunds? Recommendation: monthly-only at launch, introduce annual option after 6 months of retention data.
-
When is the first “were we right?” review? Proposed: after 10 paying customers have been live for 30+ days. This gives us enough data to validate the unit economics model. Target date should be agreed in the session.
Appendix: Metric Definitions Quick Reference
For anyone unsure about what a metric means:
| Term | Plain English |
|---|---|
| MRR | How much money comes in every month from subscriptions |
| ARR | MRR times 12 — the annualised version |
| ARPU | Average revenue per customer per month |
| Churn | The percentage of customers (or revenue) you lose each month |
| NRR | Whether your existing customers are paying you more or less over time. Above 100% = growing from existing customers |
| CAC | How much it costs to acquire one new paying customer |
| LTV | How much total revenue one customer generates over their entire lifetime |
| LTV/CAC | How many times over a customer pays back their acquisition cost. 3:1 is the benchmark |
| Payback Period | How many months until a customer has paid back their acquisition cost |
| Gross Margin | Revenue minus the direct costs of serving customers, as a percentage. The money left over to pay salaries and grow |
| COGS | Cost of Goods Sold — for SaaS, this is infrastructure costs (LLM, hosting, messaging) |
| PAM | Properties under Active Management — our North Star metric |
Research Sources
- Lighter Capital — 2025 B2B SaaS Startup Benchmarks
- Averi — The Only SaaS Metrics That Actually Matter in 2026
- 42DM — B2B SaaS Benchmarks: What to Track in 2026
- Abacum — B2B SaaS Metrics All Startups Should Track
- Stripe — Best Practices for SaaS Billing
- Stripe — Set Up Usage-Based Pricing
- Stripe — How Subscriptions Work
- OpenMeter — Implementing Usage-Based Pricing with Stripe
- Glen Coyne — Usage-Based Billing with Stripe: Technical Setup Guide
- UserJot — SaaS Unit Economics: LTV, CAC Guide
- Wall Street Prep — LTV/CAC Ratio Calculator
- Proven SaaS — CAC Payback Benchmarks 2026
- Tomasz Tunguz — The False Confidence of the LTV/CAC Ratio for Early Stage
- Kodekx — B2B SaaS Metrics 2025: Churn, CAC, LTV & MRR Benchmarks
- Vitally — B2B SaaS Churn Rate Benchmarks 2025
- Qubit Capital — PropTech SaaS Benchmarks: Churn Rate
- Baremetrics — Baremetrics vs ChartMogul vs ProfitWell
- ChartMogul — Pricing
- Langfuse — Model Usage and Cost Tracking
- Portkey — Track Costs Using Metadata
- LiteLLM — Spend Tracking
- Kinde — AI Token Pricing Optimisation
- SwiftVATPro — VAT on Digital Services UK Guide
- Anrok — UK VAT Guide for Digital Businesses
- Sprintlaw — VAT on Software and SaaS in the UK
- Kinde — Dunning Strategies for SaaS
Prepared for Session 8: Metrics & Money. All benchmarks are from 2025-2026 industry data. All cost estimates reference the Capacity Analysis and Pricing Analysis prepared for earlier sessions. No production usage data is available yet — the validation plan is designed to fix that with the first 10 customers.