FY2025 revenue was **$11,238,378**, down $4,922 from FY2024's $11,243,300. That's flat (-0.04%). The bridge ties out to the dollar.

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

**What it shows**
- **Churn cancels out the growth.** Two Enterprise losses, Birchway Foods and Fenwick Legal, account for $1.19M of the $1.29M churn. Without them, FY2025 would have grown about 10%.
- **Expansion is spread widely.** 23 customers grew, adding $1.21M, and every segment contributed.
- **All new business came from SMB.** Six new logos brought in $463K. Enterprise and Mid-Market added no new customers.
- **Retention, excluding timing:** gross retention is 84.6% and net retention is 95.4%.
- **Each segment moved differently:** Enterprise fell 12%, Mid-Market grew 8%, and SMB grew 43%.

**How I built it**
- I took each customer's change and removed `timing_amount` first, treating it as revenue shifted between periods rather than a real change. I classified the remainder as:
  - **New:** no FY24 revenue
  - **Churn:** no FY25 revenue
  - **Expansion or contraction:** whichever way the remaining change goes
- **Lumen Retail:** its whole -$13,813 drop is timing, so I classified it as flat, not contraction.
- **Saltmarsh Energy needs checking.** Its revenue fell $38,641, but it carries a *positive* $13,662 timing amount, so the underlying contraction comes out at -$52,303. The sign may be wrong in the source data. If it should be -$13,662, the contraction drops to -$24,979, Mid-Market timing changes to -$27,475, and the total stays the same.

**Files**
- `build_bridge.py`: rebuilds everything and checks that each segment bridge ties out.
- `output/fy2025_revenue_bridge.csv`: the table above.
- `output/customer_bridge_detail.csv`: each customer's change, timing amount, underlying change and category.

I can turn this into a waterfall chart if that would help.