I built the FY2025 revenue bridge. Revenue was essentially flat, $11.24M in FY2024 to $11.24M in FY2025 (down 0.04%). The bridge adds up exactly, both overall and for each customer.

| Line | Enterprise | Mid-Market | SMB | **Total** | % of FY24 |
|---|---:|---:|---:|---:|---:|
| FY2024 revenue | 6,258,216 | 4,036,244 | 948,840 | **11,243,300** | |
| New | – | – | 462,893 | **462,893** | +4.1% |
| Expansion | 607,747 | 500,692 | 102,212 | **1,210,651** | +10.8% |
| Contraction | (220,558) | (165,706) | (57,058) | **(443,322)** | −3.9% |
| Churn | (1,188,984) | – | (99,240) | **(1,288,224)** | −11.5% |
| Timing | 53,231 | (151) | – | **53,080** | +0.5% |
| FY2025 revenue | 5,509,652 | 4,371,079 | 1,357,647 | **11,238,378** | |

**What stands out**
- **Enterprise churn drives the year.** Two customers, Birchway Foods and Fenwick Legal, account for $1.19M of lost revenue. That cancels out all the growth elsewhere: Enterprise fell 12%, while Mid-Market grew 8% and SMB grew 43%.
- **All new revenue came from SMB:** 6 new customers worth $463K.
- **Retention:** gross revenue retention is 84.6%. Net revenue retention is 95.8% including timing, or 95.4% without it.
- **Customer counts:** 23 expanded, 11 contracted, 4 churned, 6 new, 3 flat, and 1 changed only because of timing.

**How I classified movements** (check these match your definitions)
- I read `timing_amount` as revenue shifted between periods rather than a real change. It gets its own line, and I measure expansion or contraction on the change after removing timing. For example:
  - Cobalt Dental's +$98.5K splits into +$45.3K expansion and +$53.2K timing.
  - Lumen Retail's whole −$13.8K is timing, so it counts as neither expansion nor contraction.
  - Saltmarsh Energy has +$13.7K of timing, so its underlying contraction (−$52.3K) is larger than its reported drop (−$38.6K).
- New means no FY2024 revenue; churn means no FY2025 revenue. The script stops with an error if a new or churned customer ever has a timing amount.

**Files**
- `build_bridge.py`: rebuilds everything from the CSV.
- `output/fy2025_revenue_bridge.md` and `.csv`: the bridge by segment, plus metrics and customer counts.
- `output/fy2025_bridge_by_customer.csv`: each customer's category and movement amounts, for checking back to the source.

I haven't made a waterfall chart; I can add one if you want it.