I built the FY2025 revenue bridge. Revenue was essentially flat: down $4.9k (−0.04%) from $11.24M in FY2024 to $11.24M in FY2025. The bridge totals back to actual FY2025 revenue in every segment, and the script checks this each time it runs.

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

Four customers had the same revenue in both years.

**Gross revenue retention is 84.6% and net revenue retention is 95.4%,** both excluding timing.

**What drives the result:**
- **Enterprise churn is the story.** Losing Birchway Foods ($503k) and Fenwick Legal ($686k) cost $1.19M. That wiped out all of Enterprise's net expansion, so Enterprise fell 12%.
- **Mid-Market had no churn** and grew 8.3%.
- **SMB grew 43%.** Most of that came from six new customers ($463k). Two SMB customers churned: Eastfield Library and Quill Publishing.

**How I treated timing:** The CSV's `timing_amount` column holds one-off amounts that moved revenue between periods. I took it out first, then sorted what was left into expansion or contraction.
- **Cobalt Dental:** grew $98.5k, of which $53.2k is timing. That leaves $45.3k of real expansion.
- **Lumen Retail:** the whole $13.8k decline is timing, so it counts as flat.
- **Saltmarsh Energy:** check this one. Its revenue fell $38.6k, but its timing amount is *positive* $13.7k. That makes the underlying contraction $52.3k. If the sign in the data is wrong, the timing line and Mid-Market contraction will each be off by about $27k.

Files are in the working directory:
- `revenue_bridge.py`: the script that builds the bridge.
- `fy2025_revenue_bridge.csv`: the bridge table by segment.