I built the FY2025 revenue bridge. Revenue was flat: **$11.24M in FY2024 → $11.24M in FY2025, down $4.9K (-0.04%)**. That flat total hides large offsetting movements underneath.

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

**Key metrics:**
- **Gross revenue retention:** 84.6%
- **Net revenue retention (excluding timing):** 95.4%

**What drives it:**
- **Enterprise churn is the main problem.** Two lost customers account for $1.19M: Fenwick Legal ($686K) and Birchway Foods ($503K). That is 92% of all churn and pushes Enterprise down 12% (net retention 87%).
- **Mid-Market is healthy:** up 8.3%, with 108% net retention and no churn.
- **SMB grew 43%, but only because of new logos.** All six new customers ($463K) are SMB. Existing SMB customers shrank (net retention 94%), with two churned: Eastfield Library and Quill Publishing.
- **Timing barely moves the total (+$53K).** Excluding it matters for individual customers. For example, Cobalt Dental's +$98.5K is $53.2K timing plus $45.3K real expansion. Lumen Retail's whole -$13.8K is timing, so it doesn't count as contraction.

**How I classified each customer:**
- **New:** no FY24 revenue.
- **Churn:** no FY25 revenue.
- **Expansion or contraction:** for everyone else, the year-on-year change after removing `timing_amount`, classified by its sign.
- Every customer reconciles exactly from FY24 to FY25, and the script checks this with assertions.
- Four customers had no underlying change. Three were exactly flat (Redwood Pharmacy, Hawthorn Veterinary, Jetty Seafood), and Lumen Retail's whole change was timing.

**Files:**
- `build_bridge.py`: re-runnable script that builds the bridge.
- `output/revenue_bridge_fy2025.csv`: the bridge, split by segment.
- `output/bridge_customer_detail.csv`: each customer's movement by category, so every number can be traced.

I didn't make a waterfall chart. I can add one if you need it for a deck.