# Cfo Skill

> CFO Skill

- Skill: `nacholafuente/cfo-skill` (Agent Skill, multi-file: 23 files)
- Install (CLI): `npx skillmds@latest add nacholafuente/cfo-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/nacholafuente/cfo-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: NachoLafuente (https://skillmd.com/u/nacholafuente)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/nacholafuente/cfo-skill

---


# 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/`](templates/). Realistic example data lives in [`examples/`](examples/) so you can try the pipeline before plugging in real data.

```bash
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.

```bash
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`:

```bash
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](references/stripe.md) |
| **Attio** | `customers.csv` | CRM-driven customer state, plan, lifecycle | [references/attio.md](references/attio.md) |
| **Qonto** | `balances.csv`, `cash_movements.csv`, `invoices.csv` | Bank truth, cash position, transactions, AR | [references/qonto.md](references/qonto.md) |
| **Moss** | appends to `cash_movements.csv` | Categorized card spend, vendors, departments | [references/moss.md](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:

1. **Summary**: headline metrics with heuristic flags (runway, concentration, DSO, burn multiple)
2. **Cash Flow**: monthly inflows / outflows / net for the trailing 3 months
3. **Customers**: full customer table from your input data
4. **Concentration**: top 1 / 5 / 10% of MRR + top-10 customer table
5. **AR Aging**: unpaid invoices bucketed (current, 1-30, 31-60, 61-90, 90+) + per-invoice detail
6. **Spend**: by category, by vendor, by department
7. **Recurring Vendors**: heuristic detection (3+ similar transactions)
8. **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](references/metrics-benchmarks.md). Bootstrapped case studies in [references/case-studies.md](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

1. **Restate the question in numerical terms.** ("What's our runway?" → "I need cash balance and trailing 3-month net burn.")
2. **Identify which provider(s) to query** from the table above, or which CSV(s) to read.
3. **Run** `run.py` with appropriate flags, or read the CSVs directly via `cfo.load_all()` + `cfo.summarize()`.
4. **Show raw numbers first, then computed metric, then framework.**
5. **Repeat the disclaimer** when the user is making a real decision.
6. **Flag data quality issues** explicitly (stale data, missing fields, miscategorized expenses).

---

## Attribution

Frameworks, benchmarks, and case studies adapted from [EveryInc/charlie-cfo-skill](https://github.com/EveryInc/charlie-cfo-skill) (MIT, © 2026 Every).

Data layer (Stripe + Attio + Qonto + Moss pullers + CSV templates + Excel writer) by 5050Growth.

