FY2025 landed behind plan on revenue and well behind on operating income. December was close to budget on revenue and missed on operating income.

**Full year (budget vs actual)**

| Measure | Actual | Budget | Variance |
| --- | --- | --- | --- |
| Revenue | $11.2M | $11.6M | ($362K) |
| COGS | $8.3M | $8.5M | $167K |
| Gross profit | $2.9M | $3.1M | ($194K) |
| Gross margin | 25.9% | 26.8% | (0.9) pts |
| Operating expenses | $2.5M | $2.5M | ($649) |
| Operating income | $388K | $583K | ($195K) |

**December**
- Revenue was $827K against $824K, favourable by $3K.
- Operating income was $8K against $13K, a variance of ($5K), or (38.0%).
- Gross margin was 26.1% against 26.8%.

**Where it came from, line by line**
- **Revenue:** the miss sits in three months: March ($123K), July ($132K) and August ($105K). Every other month was within $7K of budget.
- **COGS:** favourable by $196K, but gross margin still fell short, so the saving did not keep pace with the lower revenue.
- **Overspends:** salaries and wages ($38K), freight out ($29K) and rent ($23K).
- **Underspends:** marketing $38K and technology $25K. Both peaked in December, and the data doesn't show whether it's underspend or deferral.

The commentary is drafted. It has five sections: headline, results table, month, drivers and data notes. Where the data doesn't show a cause, it asks the owner instead of guessing. Questions for the owners are:
- Sales: what drove March, July and August?
- Operations: how much of the COGS saving is volume?
- Marketing and technology: is the underspend deferral or a real saving?

The script's reconciliation checks passed. The input was `pnl_fy2025.csv`, 120 rows.

Files are in `/tmp/spb-budget-vs-actual-fy25-v1-claude-9aivfxp5/output/`:
- bva-note.md
- bva.json