The FY2025 revenue bridge reconciles to the dollar. Revenue is essentially flat, down $4.9K (-0.04%).

| Step | Amount | Customers |
|---|---:|---:|
| **FY2024 revenue** | **$11,243,300** | 42 |
| New customers | +462,893 | 6 |
| Expansion | +1,210,651 | 23 |
| Contraction | −443,322 | 11 |
| Churn | −1,288,224 | 4 |
| Timing | +53,080 | 3 |
| **FY2025 revenue** | **$11,238,378** | 44 |

- **Churn offsets growth:** Churn of $1.29M cancels most of the $1.21M expansion. Three of the four churned customers are Enterprise: Birchway Foods and Fenwick Legal, plus Eastfield Library and Quill Publishing in SMB. Enterprise churn is $1.19M, which is 92% of the total.
- **Net by segment:** Enterprise is the weakest segment. It has $608K of expansion against $1.19M of churn and $221K of contraction.
- **New logos:** All six new customers are SMB, so they add little against the Enterprise losses.
- **Flat customers:** Three customers (Redwood Pharmacy, Hawthorn Veterinary, Jetty Seafood) had no change. They are counted in the opening and closing customer counts but not in any bridge step.

**Assumption on timing:** I read `timing_amount` as part of FY2025 revenue that isn't underlying change, for example phasing or one-offs. I pulled it out of expansion and contraction into its own bar. The three affected customers are Cobalt Dental (+53,231), Lumen Retail (−13,813) and Saltmarsh Energy (+13,662). For example, Cobalt's underlying movement is +$45K, not +$98K. If the column means something else, expansion and contraction would shift by a net $53K. The new, churn and total figures would stay the same.

I saved the bridge script as `bridge.py` and the table as `fy2025_revenue_bridge.csv`, both in the working directory. I haven't made a waterfall chart. I can add one if you want.