FY2025 revenue and operating income both came in below budget. The note is at `output/bva-note.md`, with the figures in `output/bva.json`. The script reconciled the variances.

**Headline (year to date)**
- **Revenue:** $11,238K against a $11,600K budget, unfavourable by ($362K), or (3.1%).
- **Operating income:** $388K against $583K, unfavourable by ($195K), or (33.5%).
- **Gross margin:** 25.9% against 26.8%, a variance of (0.9) pts.
- **Operating expenses:** $2,527K against $2,526K, unfavourable by ($1K).

**Favourable lines**
- **Cost of goods sold:** favourable by $196K, or 2.4%, and the main cushion against the revenue miss.
- **Marketing:** favourable by $38K, or 28.5%.
- **Technology:** favourable by $25K, or 15.0%.

**Unfavourable lines**
- **Salaries and wages:** unfavourable by ($38K), or (2.5%).
- **Freight out:** unfavourable by ($29K), or (8.3%).
- **Rent and occupancy:** unfavourable by ($23K), or (5.6%).

**What drove the result**
- **Revenue miss:** it sits in three months. March was ($123K), July ($132K) and August ($105K). The other months were close to budget.
- **December:** revenue was $827K against $824K, favourable by $3K. Operating income was $8K against $13K, unfavourable by ($5K).
- **Cost lines:** operating expenses were flat to budget overall because the Marketing and Technology savings offset Salaries and wages and Rent and occupancy. The gross margin shortfall comes from Freight out running over budget.

The data shows where the variances sit but not why. I did not assign causes. The Drivers section instead lists what to ask each line owner, such as whether the March, July and August misses were budget phasing or lost sales. You'll want those answers before the committee meeting.

The note also records the input file, 120 rows and its sha256 prefix. Each amount is rounded on its own, so the Gross profit and Operating income rows don't add exactly in the table.