This recipe produces a startup financial operations dashboard that integrates with the accounting system (QuickBooks or Xero), displays actual vs planned P&L, calculates real-time cash runway projections, tracks burn rate trends, and computes unit economics (LTV, CAC, CAC payback). The output is a deployed internal tool giving founders and finance leads a single source of truth for financial health, replacing manual spreadsheet updates. [src6]
Which path?
├── User is non-technical AND budget = free
│ └── PATH A: No-Code Free — Google Sheets + QBO/Xero export + manual update
├── User is non-technical AND budget > $0
│ └── PATH B: No-Code Paid — Retool + Supabase + Apideck ($49/mo)
├── User is semi-technical or developer AND budget = free
│ └── PATH C: Code + Free — Metabase + PostgreSQL + cron sync script
└── User is developer AND budget > $0
└── PATH D: Code + Paid — Retool + PostgreSQL + n8n + direct API
| Path | Tools | Cost | Speed | Output Quality |
|---|---|---|---|---|
| A: No-Code Free | Google Sheets + CSV exports | $0 | 2-3 hours | Basic — manual weekly updates |
| B: No-Code Paid | Retool + Supabase + Apideck | $49/mo | 4-6 hours | Good — auto-sync, interactive |
| C: Code + Free | Metabase + PostgreSQL + cron | $0 | 6-8 hours | Good — full SQL control |
| D: Code + Paid | Retool + PostgreSQL + n8n | $25-50/mo | 5-7 hours | Excellent — real-time, custom |
Duration: 30-60 minutes · Tool: SQL client
Create the 6-table schema: chart_of_accounts, actuals_monthly, budget_monthly, cash_balance, revenue_metrics, and unit_economics with appropriate indexes.
Verify: All 6 tables created successfully. If failed: Check PostgreSQL connection and permissions.
Duration: 1-2 hours · Tool: n8n, custom script, or Apideck
Connect to QuickBooks or Xero API using OAuth2. Extract monthly P&L report data and upsert to actuals_monthly. Sync cash balance daily from bank account totals.
Verify: SELECT month, SUM(amount) FROM actuals_monthly GROUP BY month; returns monthly totals matching accounting system. If failed: Check OAuth2 token refresh flow. QuickBooks tokens expire every 60 minutes; Xero tokens every 30 minutes.
Duration: 1-2 hours · Tool: SQL
Write 5 core analytics queries: P&L actual vs budget with variance, monthly burn rate with 3-month moving average, runway calculation from cash balance and average net burn, unit economics (LTV/CAC/payback), and revenue trend with MRR growth rate.
Verify: P&L query returns categories with non-zero actuals. Runway calculation returns positive months. If failed: Check chart_of_accounts mapping — type/sub_type must match accounting system categories.
Duration: 1-2 hours · Tool: Retool or Metabase
Build 6-section layout: KPI row (Cash Balance, Runway, Net Burn, MRR, LTV:CAC), P&L actual vs budget chart, runway projection area chart with zero-cash date line, monthly burn rate trend, MRR waterfall, unit economics trend lines, and expense breakdown table.
Verify: All 6 sections render. Cash balance matches accounting system. If failed: Check query bindings and data source connections.
Duration: 30-60 minutes · Tool: n8n or Pipedream + Slack/Email
Set up weekly alerts for: runway below 6 months, category spend exceeding 120% of budget, LTV:CAC ratio below 1.0, and MRR month-over-month decline.
Verify: Test alert fires in Slack/email with sample data. If failed: Check webhook URL and workflow execution.
Duration: 30 minutes · Tool: Dashboard platform settings
Share with CEO, CFO/finance lead, and board observer. Set viewer permissions for department heads, editor for finance team only. Configure monthly email report for investors and enable PDF export for board meetings.
Verify: CEO can view dashboard. Finance lead can edit budget figures.
{
"output_type": "financial_operations_dashboard",
"format": "deployed web application",
"components": [
{"name": "pl_actual_vs_budget", "type": "chart", "description": "P&L categories with actual, budget, and variance columns", "required": true},
{"name": "runway_projection", "type": "chart", "description": "Cash balance projection with zero-cash date indicator", "required": true},
{"name": "burn_rate_trend", "type": "chart", "description": "Monthly net burn with 3-month moving average", "required": true},
{"name": "mrr_waterfall", "type": "chart", "description": "New, expansion, and churned MRR stacked by month", "required": true},
{"name": "unit_economics", "type": "chart", "description": "LTV, CAC, and payback period trend lines", "required": true},
{"name": "kpi_cards", "type": "metrics", "description": "Cash balance, runway months, net burn, MRR, LTV:CAC", "required": true}
],
"refresh_interval": "daily (accounting sync) + real-time (cash balance)",
"data_source": "PostgreSQL synced from accounting system"
}
| Quality Metric | Minimum Acceptable | Good | Excellent |
|---|---|---|---|
| Data freshness | < 48 hours lag | < 24 hours | Same-day sync |
| P&L accuracy | Within 5% of accounting | Within 1% | Exact match (automated) |
| Runway accuracy | Within 2 months of actual | Within 1 month | Within 2 weeks |
| Unit economics coverage | LTV and CAC only | + payback + margin | Full cohort analysis |
| Budget completeness | Revenue + top 3 expenses | All P&L categories | + headcount plan + cash flow |
If below minimum: Check accounting API sync logs. P&L discrepancies usually mean unmapped accounts or timing differences between accrual and cash basis.
| Error | Likely Cause | Recovery Action |
|---|---|---|
| QuickBooks API 401 | OAuth2 access token expired | Refresh token via POST to token endpoint; if refresh fails, re-authorize |
| Xero API 429 (rate limit) | More than 60 requests/minute | Implement rate limiter with 1-second delay between calls |
| P&L totals don't match accounting | Unmapped accounts or accrual vs cash basis mismatch | Audit chart_of_accounts mapping, verify reporting basis matches |
| Runway shows "infinite" for unprofitable company | Net burn calculation includes non-cash items or timing offset | Use cash-basis burn or exclude depreciation/amortization from burn calc |
| Unit economics show extreme values | Small customer count amplifies outliers | Apply minimum sample size (50+ customers) before calculating LTV/CAC |
| Cash balance negative or zero | Sync picked up pending transactions or wrong account | Filter to posted transactions only, verify bank account ID mapping |
| Component | Free Tier | Paid Tier | At Scale (Series A+) |
|---|---|---|---|
| Dashboard (Retool) | $0 (5 users) | $10/user/mo | $50/mo (5 users) |
| Database (Supabase) | $0 (500MB) | $25/mo | $25/mo |
| ETL (n8n) | $0 (self-hosted) | $20/mo | $50/mo |
| Accounting API (Apideck) | N/A | $49/mo | $49/mo |
| Total | $0 | $104/mo | $174/mo |
Accrual accounting includes non-cash items (depreciation, prepaid amortization) and timing differences (invoiced but uncollected revenue). Runway calculated from accrual P&L overstates remaining months by 10-30%. [src3]
Runway = actual bank balance / average net cash outflow over last 3 months. For SaaS with annual prepayments, adjust for deferred revenue timing.
With 10 customers, one whale customer or one unusual acquisition can distort LTV:CAC from 0.5 to 5.0. Presenting this as reliable leads to bad investment decisions. [src5]
Show LTV:CAC with sample size and confidence range. Below 50 customers, label metrics as "directional estimate" and flag for manual review.
Use when a startup has at least 3 months of bookkeeping data and needs automated financial visibility beyond manual spreadsheets. Critical for companies with less than 12 months of runway or preparing for board meetings and fundraising. This recipe builds the dashboard — for financial planning or modeling, use a playbook card instead.