FY2025 came in unfavourable against budget at both revenue and operating income. The variance script reconciled, and all figures below are its output.

**Result**
- Revenue was $11.2M against a budget of $11.6M, unfavourable by ($362K), or (3.1%).
- Operating income was $388K against $583K, unfavourable by ($195K), or (33.5%).
- Gross margin was 25.9% against 26.8%, a variance of (0.9) pts.
- Operating expenses were on budget in total, with a variance of ($649).

**What drove it**
- **Revenue miss:** It concentrated in three months. March missed by ($123K), July by ($132K) and August by ($105K). Every other month was close to budget. The data doesn't show why those months missed. Sales by customer or product for those months would answer it.
- **COGS and freight:** COGS was favourable by $196K, or 2.4%, but this reflects lower revenue. Freight out was unfavourable by ($29K), or (8.3%), so it didn't fall with sales.
- **Unfavourable cost lines:** Salaries and wages were unfavourable by ($38K), or (2.5%). Rent and occupancy was unfavourable by ($23K), or (5.6%).
- **Favourable cost lines:** Marketing was favourable by $38K, or 28.5%. Technology was favourable by $25K, or 15.0%. Together these roughly offset the unfavourable lines in operating expenses.
- **Professional fees:** They peaked at ($31K) unfavourable in March and ended the year at ($1K), or (1.4%).

December alone was close to budget. Revenue was favourable by $3K, and operating income was unfavourable by ($5K), or (38.0%).

The audit committee will likely ask what caused the March, July and August revenue misses. They may also ask why salaries, rent and freight overran with no offsetting revenue. The data doesn't answer either question.

The note is in `output/bva-note.md` and the script's figures are in `output/bva.json`. The input was `pnl_fy2025.csv`, 120 rows, sha256 `eaa52ac89e97`.