Every bootstrapped founder has the same problem: you need to know your numbers, but you're not ready to pay $50-200/month for Baremetrics, ChartMogul, or ProfitWell. You're pre-revenue or early MRR, and every dollar counts.
Here's the truth — you don't need those tools yet. You need a dashboard that answers six questions:
- What's my current MRR?
- Is it growing or shrinking?
- Where is the growth (or churn) coming from?
- How long do customers stay?
- What's my cash runway?
- What should I worry about this week?
You can build this dashboard for free using Google Sheets and a bit of automation. Let me show you exactly how.
The Metrics That Matter (and the Ones That Don't)
Before building anything, clarify what to track. SaaS metrics can spiral into an endless rabbit hole. Here's what matters at the bootstrapped stage:
Track These
| Metric | What It Tells You | Why It Matters |
|---|---|---|
| MRR (Monthly Recurring Revenue) | Revenue baseline | Your north star |
| Net New MRR | Growth rate after churn | Are you actually growing? |
| Churn MRR | Revenue lost to cancellations | Your leak |
| Expansion MRR | Revenue from upgrades/add-ons | Your silent growth engine |
| Logo Churn Rate | % of customers who left | Customer satisfaction signal |
| ARPA (Avg Revenue Per Account) | Pricing health | Are upgrades working? |
| LTV (Lifetime Value) | Total revenue per customer | Acquisition budget ceiling |
| CAC (Customer Acquisition Cost) | Cost to acquire a customer | Efficiency of growth |
| Cash Runway | Months until you run out of money | Survival metric |
Step 1: Set Up Your Data Source
Your data source is your billing system. If you're using Stripe (and you probably are), you can export everything you need.
Stripe Export Setup
- Log into your Stripe Dashboard
- Go to Reports → Exports
- Create a recurring export for Subscriptions (active and canceled) and Invoices (paid and refunded)
- Schedule it as a weekly CSV export to your email
Alternatively, use the Stripe API with Google Apps Script for real-time data:
function fetchStripeSubscriptions() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Raw Data');
var apiKey = 'sk_live_YOUR_SECRET_KEY'; // Use PropertiesService in production
var url = 'https://api.stripe.com/v1/subscriptions?limit=100&status=all';
var options = {
method: 'get',
headers: { 'Authorization': 'Bearer ' + apiKey },
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
sheet.clear();
var headers = ['Subscription ID', 'Customer ID', 'Plan', 'Status',
'Amount (cents)', 'Created Date', 'Canceled Date'];
sheet.appendRow(headers);
data.data.forEach(function(sub) {
sheet.appendRow([
sub.id, sub.customer,
sub.items.data[0].price.nickname || sub.items.data[0].price.id,
sub.status, sub.items.data[0].price.unit_amount,
new Date(sub.created * 1000),
sub.canceled_at ? new Date(sub.canceled_at * 1000) : ''
]);
});
}
Set this to run weekly via Triggers → Add Trigger → Week timer → Monday → 6:00 AM.
Step 2: Build the MRR Calculation Sheet
Create a second sheet tab called MRR Calculations. This is where raw data becomes meaningful numbers.
Column Structure
| Column A: Month | Column B: Customer | Column C: Plan | Column D: Monthly Amount | Column E: Status | Column F: MRR Contribution |
|---|---|---|---|---|---|
| 2025-01 | user@email.com | Pro | $49 | Active | $49 |
| 2025-01 | user2@email.com | Team | $199 | Active | $199 |
| 2025-02 | user@email.com | Pro | $49 | Active | $49 |
| 2025-02 | user3@email.com | Starter | $19 | Churned | -$19 |
MRR Contribution formula (Column F, row 2):
=IF(E2="Churned", -D2, IF(E2="New", D2, IF(E2="Upgraded", D2-previous_amount, D2)))
Monthly MRR Summary
Create a third sheet tab called MRR Summary:
| Month | New MRR | Expansion MRR | Churn MRR | Net New MRR | Total MRR |
|---|---|---|---|---|---|
| 2025-01 | $500 | $0 | -$50 | $450 | $500 |
| 2025-02 | $300 | $100 | -$150 | $250 | $750 |
| 2025-03 | $400 | $50 | -$100 | $350 | $1,100 |
Key formulas:
- Net New MRR = New MRR + Expansion MRR - Churn MRR
- Total MRR = Previous Total MRR + Net New MRR
- MRR Growth Rate = Net New MRR / Previous Total MRR
Step 3: Calculate LTV and CAC
LTV Calculation
LTV = (ARPA × Gross Margin) / Churn Rate
In Google Sheets, with ARPA in B2 (e.g., $45), gross margin in B3 (use 0.80 for bootstrapped SaaS), and monthly churn rate in B4 (e.g., 0.05 for 5%):
=(B2 * B3) / B4
This gives LTV = $720.
CAC Calculation
CAC = (Sales + Marketing Spend) / New Customers Acquired
For bootstrapped founders, your "spend" is primarily software costs, content production, and contractor costs related to acquisition.
| Month | Acquisition Spend | New Customers | CAC |
|---|---|---|---|
| 2025-01 | $200 | 10 | $20 |
| 2025-02 | $350 | 15 | $23 |
| 2025-03 | $300 | 20 | $15 |
LTV:CAC Ratio
The benchmark is 3:1. Below 3:1, you're spending too much to acquire. Above 5:1, you're under-investing. For bootstrapped founders, 2:1 is acceptable early on, especially with content-led growth (near-zero CAC). Focus on MRR growth first — optimize this ratio later.
Step 4: Calculate Cash Runway
Cash runway is the single most important number for a bootstrapped founder — it tells you how many months you have before you run out of money.
Cash Runway = Current Cash Balance / Monthly Burn Rate
Where Monthly Burn Rate = (Total Expenses) - (Total Revenue). If pre-revenue, Burn Rate = Total Expenses.
Google Sheets Setup
Create a sheet called Cash Tracking:
| Month | Cash In | Cash Out | Net Burn | Cash Balance | Runway (months) |
|---|---|---|---|---|---|
| 2025-01 | $500 | $2,000 | -$1,500 | $10,000 | 6.7 |
| 2025-02 | $750 | $2,100 | -$1,350 | $8,650 | 6.4 |
| 2025-03 | $1,100 | $2,000 | -$900 | $7,750 | 8.6 |
Runway formula (row 2):
=F2 / ABS(E2)
Use ABS() to handle negative burn correctly. If your runway drops below 6 months, reduce expenses or increase revenue. Below 3 months is emergency territory.
Step 5: Build the Dashboard View
Create a final sheet tab called Dashboard — the one you look at every Monday morning.
Top Section: Headline Numbers
Current MRR: $1,100 MRR Growth Rate: 46%
Net New MRR: $350 Churn Rate: 4.5%
ARPA: $55 LTV: $978
CAC: $15 LTV:CAC: 65:1
Cash Balance: $7,750 Runway: 8.6 months
Middle Section: MRR Waterfall Chart
Create a waterfall chart: Starting MRR → + New MRR → + Expansion MRR → - Churn MRR → = Ending MRR. This shows where your growth is coming from (or where it's leaking).
Bottom Section: Trend Lines
Three line charts: Total MRR over time, Net New MRR over time (acceleration/deceleration), and Churn MRR over time (is churn worsening?).
To set up: Select your MRR Summary data → Insert → Chart → choose Waterfall or Line chart → customize colors (green for positive, red for churn).
Step 6: Set Up Weekly Alerts
You shouldn't have to open the dashboard to know if something needs attention. Set up automated alerts with Google Apps Script:
function sendWeeklyMRRReport() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MRR Summary');
var lastRow = sheet.getLastRow();
var latestMonth = sheet.getRange(lastRow, 1).getValue();
var totalMRR = sheet.getRange(lastRow, 6).getValue();
var churnMRR = sheet.getRange(lastRow, 4).getValue();
var netNewMRR = sheet.getRange(lastRow, 5).getValue();
var prevMRR = sheet.getRange(lastRow - 1, 6).getValue();
var growthRate = ((totalMRR - prevMRR) / prevMRR * 100).toFixed(1);
var body = 'Weekly MRR Report\n\nTotal MRR: $' + totalMRR +
'\nChurn MRR: $' + churnMRR + '\nNet New MRR: $' + netNewMRR +
'\nGrowth Rate: ' + growthRate + '%\n\n';
if (churnMRR > totalMRR * 0.1) body += '⚠️ Churn exceeded 10% of MRR.\n';
if (netNewMRR < 0) body += '⚠️ Net New MRR is negative.\n';
MailApp.sendEmail({
to: 'founder@yourdomain.com',
subject: 'Weekly MRR Report — ' + latestMonth,
body: body
});
}
Set this to run every Monday at 8 AM via a time-driven trigger.
Step 7: Benchmark Your Numbers
Once your dashboard is running, compare your metrics against industry benchmarks compiled from public SaaS metrics (Baremetrics Open, ChartMogul SaaS Report, KeyBanc SaaS Survey):
| Metric | Early Stage (<$10K MRR) | Growth Stage ($10K-$100K MRR) | Red Flag |
|---|---|---|---|
| Monthly MRR Growth Rate | 10-25% | 5-15% | <3% sustained |
| Monthly Churn Rate (Logo) | 5-10% | 2-5% | >10% |
| Monthly Churn Rate (MRR) | 3-8% | 1-4% | >8% |
| ARPA | $20-100 | $50-500 | Declining over time |
| LTV:CAC | >2:1 | >3:1 | <1:1 |
| Net Revenue Retention | >90% | >100% | <80% |
| Cash Runway | >6 months | >12 months | <3 months |
If your MRR growth is above 15% and churn is below 5%, you have a healthy early-stage SaaS. If churn exceeds 10%, stop everything and fix it — at 10% monthly churn, you lose 72% of customers over 12 months. If your LTV:CAC is below 1:1, you're spending more to acquire than customers are worth — cut acquisition spend and focus on organic growth.
Maintenance and Review Rhythm
Weekly (15 min): Check dashboard, review email summary, note anomalies.
Monthly (1 hour): Reconcile Stripe data, update LTV/CAC, cash balance, runway, compare against benchmarks.
Quarterly (2 hours): Email 10 churned customers. Review pricing and CAC. Update 12-month projection.
Final Thoughts
Building your own MRR dashboard isn't just about saving money. It's about understanding your numbers at a level that paid tools won't give you. When you build the formulas yourself, you understand what drives each metric.
Your free dashboard works until $10K MRR. Beyond that, consider ChartMogul ($50/mo) or Baremetrics ($129/mo). Switch when data entry takes 30+ min/week or when you need cohort analysis.
Set aside 2-3 hours this weekend. Build the dashboard. Start tracking. The clarity from seeing your actual numbers will change how you make decisions.
Written by Insight Lab
Top comments (0)