CFO Skill
⚠️ DISCLAIMER
This skill displays data. It is NOT financial, legal, tax, accounting, or investment advice.
Numbers may be stale, miscategorized, or reflect bugs in upstream systems. Frameworks below (LTV:CAC, runway, burn multiple, Rule of 40) are heuristics, not guarantees. Decisions about hiring, fundraising, distributions, taxes, or solvency must be made by you in consultation with a qualified CFO, accountant, lawyer, or tax advisor. The author and contributors accept no liability for decisions made based on this skill's output.
Two ways to use it
Mode 1: CSV templates (works with any stack)
Drop four CSVs into a folder, run one command, get an Excel workbook. Works with any CRM/bank/billing stack, Attio, HubSpot, Salesforce, Pipedrive, Mercury, Brex, Stripe, Chargebee, Ramp, Pleo, whatever.
Templates live in templates/. Realistic example data lives in examples/ so you can try the pipeline before plugging in real data.
python skills/cfo-skill/run.py --source csv --csv-dir ./my-data --output cfo.xlsx
CSV schemas (column headers in templates/):
| File |
Columns |
customers.csv |
customer_id, customer_name, status, signed_up_at, churned_at, mrr, plan |
cash_movements.csv |
date, account, direction, amount, currency, counterparty, category, department, note |
invoices.csv |
invoice_id, customer, issued_at, due_at, amount, currency, status |
balances.csv |
account, currency, balance, as_of |
status values: active, churned, lead (only active counts toward MRR). direction values: in, out. Invoice status values: paid, unpaid, draft.
Mode 2: Live API pull (Attio + Qonto + Stripe + Moss)
Set credentials in your environment, run the puller, get the same Excel workbook from live data.
python skills/cfo-skill/run.py --source api --providers all --output cfo.xlsx
Or pick specific providers, they run in the order you list, and later writers win on customers.csv / invoices.csv:
python skills/cfo-skill/run.py --source api --providers qonto,stripe,moss # Stripe-billed SaaS
python skills/cfo-skill/run.py --source api --providers qonto,attio,moss # CRM-driven (no Stripe)
python skills/cfo-skill/run.py --source api --providers qonto,attio,stripe,moss # both, Stripe wins on MRR
Provider-by-provider:
| Provider |
Writes |
Best at |
Reference |
| Stripe |
customers.csv (with real MRR), invoices.csv |
Authoritative SaaS revenue. Use this if you bill via Stripe. |
references/stripe.md |
| Attio |
customers.csv |
CRM-driven customer state, plan, lifecycle |
references/attio.md |
| Qonto |
balances.csv, cash_movements.csv, invoices.csv |
Bank truth, cash position, transactions, AR |
references/qonto.md |
| Moss |
appends to cash_movements.csv |
Categorized card spend, vendors, departments |
references/moss.md |
Each puller writes its slice to a temp folder; the same compute layer then generates the Excel workbook. You don't have to use all four. A Stripe + Mercury founder can run --providers stripe and use CSV templates for the bank side. A HubSpot + Brex founder skips API mode entirely and uses CSV for everything.
Required environment variables
Only set the ones for providers you actually use.
| Provider |
Variables |
| Stripe |
STRIPE_SECRET_KEY (use a restricted key with read on customers, subscriptions, invoices, payouts) |
| Attio |
ATTIO_API_KEY. Optional: ATTIO_MRR_ATTR, ATTIO_STATUS_ATTR, ATTIO_ACTIVE_VAL, ATTIO_CHURNED_ATTR, ATTIO_PLAN_ATTR, ATTIO_NAME_ATTR |
| Qonto |
QONTO_API_KEY + QONTO_SECRET_KEY (the "secret key" is your Qonto org slug) |
| Moss |
MOSS_KEY_ID + MOSS_SECRET_KEY (OAuth client credentials, scope read) |
Skill is read-only, never request write scopes. Never log or echo a secret.
What the workbook contains
Eight sheets:
- Summary: headline metrics with heuristic flags (runway, concentration, DSO, burn multiple)
- Cash Flow: monthly inflows / outflows / net for the trailing 3 months
- Customers: full customer table from your input data
- Concentration: top 1 / 5 / 10% of MRR + top-10 customer table
- AR Aging: unpaid invoices bucketed (current, 1-30, 31-60, 61-90, 90+) + per-invoice detail
- Spend: by category, by vendor, by department
- Recurring Vendors: heuristic detection (3+ similar transactions)
- Disclaimer: full disclaimer in-workbook
Computed metrics
| Metric |
Formula |
Heuristic flags |
| Cash balance |
sum of bank account balances |
- |
| Runway |
cash ÷ trailing 3-month avg net burn |
<12 mo red, 12-24 mo yellow |
| Burn multiple |
net burn ÷ MRR |
>2× red |
| MRR / ARR |
sum of active customer MRR × 12 |
- |
| Customer concentration |
top-N MRR ÷ total MRR |
>25% top-1 red |
| AR aging |
unpaid invoices bucketed by days past due |
60+ days red |
| DSO |
(AR ÷ 90d issued sales) × 90 days |
<30 green, >60 red |
| Spend by category |
sum of outflows grouped by category |
- |
| Top vendors |
sum of outflows grouped by counterparty |
- |
| Recurring vendors |
counterparty appearing 3+ times in trailing window |
- |
| Departmental burn |
sum of outflows grouped by department |
- |
Frameworks used (LTV:CAC, Rule of 40, Magic Number, etc.) live in references/metrics-benchmarks.md. Bootstrapped case studies in references/case-studies.md.
What this skill does NOT do
- ❌ Make recommendations on hiring, raises, distributions, or fundraising
- ❌ Give tax, legal, or accounting advice
- ❌ Project cash flow into the future as a "forecast" you can rely on
- ❌ Determine whether your company is solvent
- ❌ Write to any of the connected systems (read-only by design)
For any of these: "I can show you the numbers. The decision is for you and a qualified advisor."
How Claude should answer a CFO question
- Restate the question in numerical terms. ("What's our runway?" → "I need cash balance and trailing 3-month net burn.")
- Identify which provider(s) to query from the table above, or which CSV(s) to read.
- Run
run.py with appropriate flags, or read the CSVs directly via cfo.load_all() + cfo.summarize().
- Show raw numbers first, then computed metric, then framework.
- Repeat the disclaimer when the user is making a real decision.
- Flag data quality issues explicitly (stale data, missing fields, miscategorized expenses).
Attribution
Frameworks, benchmarks, and case studies adapted from EveryInc/charlie-cfo-skill (MIT, © 2026 Every).
Data layer (Stripe + Attio + Qonto + Moss pullers + CSV templates + Excel writer) by 5050Growth.
1---2name: cfo-skill3description: CFO Skill4---56# CFO Skill78> ## ⚠️ DISCLAIMER9>10> **This skill displays data. It is NOT financial, legal, tax, accounting, or investment advice.**11>12> Numbers may be stale, miscategorized, or reflect bugs in upstream systems. Frameworks below (LTV:CAC, runway, burn multiple, Rule of 40) are heuristics, not guarantees. Decisions about hiring, fundraising, distributions, taxes, or solvency must be made by you in consultation with a qualified CFO, accountant, lawyer, or tax advisor. The author and contributors accept no liability for decisions made based on this skill's output.1314---1516## Two ways to use it1718### Mode 1: CSV templates (works with any stack)1920Drop four CSVs into a folder, run one command, get an Excel workbook. Works with **any** CRM/bank/billing stack, Attio, HubSpot, Salesforce, Pipedrive, Mercury, Brex, Stripe, Chargebee, Ramp, Pleo, whatever.2122Templates live in [`templates/`](templates/). Realistic example data lives in [`examples/`](examples/) so you can try the pipeline before plugging in real data.2324```bash25python skills/cfo-skill/run.py --source csv --csv-dir ./my-data --output cfo.xlsx26```2728CSV schemas (column headers in `templates/`):2930| File | Columns |31|------|---------|32| `customers.csv` | `customer_id, customer_name, status, signed_up_at, churned_at, mrr, plan` |33| `cash_movements.csv` | `date, account, direction, amount, currency, counterparty, category, department, note` |34| `invoices.csv` | `invoice_id, customer, issued_at, due_at, amount, currency, status` |35| `balances.csv` | `account, currency, balance, as_of` |3637`status` values: `active`, `churned`, `lead` (only `active` counts toward MRR). `direction` values: `in`, `out`. Invoice `status` values: `paid`, `unpaid`, `draft`.3839### Mode 2: Live API pull (Attio + Qonto + Stripe + Moss)4041Set credentials in your environment, run the puller, get the same Excel workbook from live data.4243```bash44python skills/cfo-skill/run.py --source api --providers all --output cfo.xlsx45```4647Or pick specific providers, they run in the order you list, and **later writers win** on `customers.csv` / `invoices.csv`:4849```bash50python skills/cfo-skill/run.py --source api --providers qonto,stripe,moss # Stripe-billed SaaS51python skills/cfo-skill/run.py --source api --providers qonto,attio,moss # CRM-driven (no Stripe)52python skills/cfo-skill/run.py --source api --providers qonto,attio,stripe,moss # both, Stripe wins on MRR53```5455Provider-by-provider:5657| Provider | Writes | Best at | Reference |58|----------|--------|---------|-----------|59| **Stripe** | `customers.csv` (with real MRR), `invoices.csv` | Authoritative SaaS revenue. **Use this if you bill via Stripe.** | [references/stripe.md](references/stripe.md) |60| **Attio** | `customers.csv` | CRM-driven customer state, plan, lifecycle | [references/attio.md](references/attio.md) |61| **Qonto** | `balances.csv`, `cash_movements.csv`, `invoices.csv` | Bank truth, cash position, transactions, AR | [references/qonto.md](references/qonto.md) |62| **Moss** | appends to `cash_movements.csv` | Categorized card spend, vendors, departments | [references/moss.md](references/moss.md) |6364Each puller writes its slice to a temp folder; the same compute layer then generates the Excel workbook. **You don't have to use all four.** A Stripe + Mercury founder can run `--providers stripe` and use CSV templates for the bank side. A HubSpot + Brex founder skips API mode entirely and uses CSV for everything.6566---6768## Required environment variables6970Only set the ones for providers you actually use.7172| Provider | Variables |73|----------|-----------|74| Stripe | `STRIPE_SECRET_KEY` (use a restricted key with read on customers, subscriptions, invoices, payouts) |75| Attio | `ATTIO_API_KEY`. Optional: `ATTIO_MRR_ATTR`, `ATTIO_STATUS_ATTR`, `ATTIO_ACTIVE_VAL`, `ATTIO_CHURNED_ATTR`, `ATTIO_PLAN_ATTR`, `ATTIO_NAME_ATTR` |76| Qonto | `QONTO_API_KEY` + `QONTO_SECRET_KEY` (the "secret key" is your Qonto org slug) |77| Moss | `MOSS_KEY_ID` + `MOSS_SECRET_KEY` (OAuth client credentials, scope `read`) |7879Skill is read-only, never request `write` scopes. Never log or echo a secret.8081---8283## What the workbook contains8485Eight sheets:86871. **Summary**: headline metrics with heuristic flags (runway, concentration, DSO, burn multiple)882. **Cash Flow**: monthly inflows / outflows / net for the trailing 3 months893. **Customers**: full customer table from your input data904. **Concentration**: top 1 / 5 / 10% of MRR + top-10 customer table915. **AR Aging**: unpaid invoices bucketed (current, 1-30, 31-60, 61-90, 90+) + per-invoice detail926. **Spend**: by category, by vendor, by department937. **Recurring Vendors**: heuristic detection (3+ similar transactions)948. **Disclaimer**: full disclaimer in-workbook9596---9798## Computed metrics99100| Metric | Formula | Heuristic flags |101|--------|---------|-----------------|102| Cash balance | sum of bank account balances | - |103| Runway | cash ÷ trailing 3-month avg net burn | <12 mo red, 12-24 mo yellow |104| Burn multiple | net burn ÷ MRR | >2× red |105| MRR / ARR | sum of active customer MRR × 12 | - |106| Customer concentration | top-N MRR ÷ total MRR | >25% top-1 red |107| AR aging | unpaid invoices bucketed by days past due | 60+ days red |108| DSO | (AR ÷ 90d issued sales) × 90 days | <30 green, >60 red |109| Spend by category | sum of outflows grouped by `category` | - |110| Top vendors | sum of outflows grouped by `counterparty` | - |111| Recurring vendors | counterparty appearing 3+ times in trailing window | - |112| Departmental burn | sum of outflows grouped by `department` | - |113114Frameworks used (LTV:CAC, Rule of 40, Magic Number, etc.) live in [references/metrics-benchmarks.md](references/metrics-benchmarks.md). Bootstrapped case studies in [references/case-studies.md](references/case-studies.md).115116---117118## What this skill does NOT do119120- ❌ Make recommendations on hiring, raises, distributions, or fundraising121- ❌ Give tax, legal, or accounting advice122- ❌ Project cash flow into the future as a "forecast" you can rely on123- ❌ Determine whether your company is solvent124- ❌ Write to any of the connected systems (read-only by design)125126For any of these: "I can show you the numbers. The decision is for you and a qualified advisor."127128---129130## How Claude should answer a CFO question1311321. **Restate the question in numerical terms.** ("What's our runway?" → "I need cash balance and trailing 3-month net burn.")1332. **Identify which provider(s) to query** from the table above, or which CSV(s) to read.1343. **Run** `run.py` with appropriate flags, or read the CSVs directly via `cfo.load_all()` + `cfo.summarize()`.1354. **Show raw numbers first, then computed metric, then framework.**1365. **Repeat the disclaimer** when the user is making a real decision.1376. **Flag data quality issues** explicitly (stale data, missing fields, miscategorized expenses).138139---140141## Attribution142143Frameworks, benchmarks, and case studies adapted from [EveryInc/charlie-cfo-skill](https://github.com/EveryInc/charlie-cfo-skill) (MIT, © 2026 Every).144145Data layer (Stripe + Attio + Qonto + Moss pullers + CSV templates + Excel writer) by 5050Growth.