I've built the FY2025 revenue bridge and checked that every segment adds up exactly. Total revenue was essentially flat: $11.24M in FY24 against $11.24M in FY25, down $4.9K (−0.04%).

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

**Retention, excluding timing:**
- Net revenue retention: 95.4%
- Gross revenue retention: 84.6%
- Growth: −0.5%

**What drives it:**
- **Enterprise churn wiped out the gains.** Losing Birchway Foods ($503K) and Fenwick Legal ($686K) accounts for 92% of all churn. Without those two, revenue would have grown about 10%.
- **Expansion was healthy across the base.** 23 customers grew, adding $1.21M (10.8% of FY24 revenue).
- **All new business came from SMB.** Six new logos brought in $463K, and SMB revenue grew 43%. Enterprise and Mid-Market won no new customers.
- **Mid-Market was the steadiest segment.** It lost no customers and grew 8.3%.

**How I defined the categories:**
- **New:** no FY24 revenue.
- **Churn:** no FY25 revenue.
- **Expansion or Contraction:** the customer's change after removing timing.

**One assumption to confirm:** I read `timing_amount` as a one-off effect that is already included in FY25 revenue, so I show it as its own bridge line instead of counting it as growth or decline. It affects three customers:
- **Cobalt Dental:** $53K of its $99K increase is timing.
- **Lumen Retail:** its whole $14K drop is timing, so I count it as flat.
- **Saltmarsh Energy:** without the timing amount, its contraction is $52K rather than the $39K reported change.

If timing should count as growth or decline, those three customers move categories.

Re-running `build_bridge.py` rebuilds everything.

Files are in `output/`:
- `revenue_bridge_fy2025.xlsx`
- `revenue_bridge_fy2025.csv`