I built the FY2025 revenue bridge. Revenue was essentially flat, going from **$11,243,300 to $11,238,378** (−$4,922, −0.04%). Growth from expansion and new customers was cancelled out by churn and contraction. The bridge foots for each segment and in total; the script checks this with assertions.

| Bridge step | Amount | % of FY24 | # customers |
|---|---:|---:|---:|
| **FY2024 revenue** | **11,243,300** | | |
| New | +462,893 | +4.1% | 6 |
| Expansion | +1,210,651 | +10.8% | 23 |
| Contraction | −443,322 | −3.9% | 11 |
| Churn | −1,288,224 | −11.5% | 4 |
| Timing | +53,080 | +0.5% | 3 |
| **FY2025 revenue** | **11,238,378** | −0.0% | |

Four customers had no change. Excluding timing, net revenue retention was **95.4%** and gross revenue retention was **84.6%**.

**By segment:**

| | Enterprise | Mid-Market | SMB |
|---|---:|---:|---:|
| FY2024 | 6,258,216 | 4,036,244 | 948,840 |
| New | 0 | 0 | +462,893 |
| Expansion | +607,747 | +500,692 | +102,212 |
| Contraction | −220,558 | −165,706 | −57,058 |
| Churn | −1,188,984 | 0 | −99,240 |
| Timing | +53,231 | −151 | 0 |
| FY2025 | 5,509,652 | 4,371,079 | 1,357,647 |

**Key points:**
- **Enterprise churn is the main story.** Two accounts, Birchway Foods ($503K) and Fenwick Legal ($686K), account for 92% of all churn. Enterprise revenue fell 12%.
- Mid-Market grew 8% with no churn. SMB grew 43%, and all new logos are in SMB.

**How I handled timing:** I treated `timing_amount` as the part of each customer's year-over-year change that comes from revenue shifting between periods. The underlying change is the total change minus timing, and I classify only that underlying amount. For example:
- Cobalt Dental's +$98.5K change is split into $53.2K timing and $45.3K expansion.
- Lumen Retail's whole −$13.8K is timing, so I count it as flat rather than contraction.
- Saltmarsh Energy has +$13.7K of timing, which means its underlying contraction is −$52.3K, larger than the −$38.6K headline change.

If `timing_amount` means something else in your data (for example, the opposite sign), tell me and I'll re-cut it.

**Files:**
- `revenue_bridge.py`: re-runnable script
- `revenue_bridge_fy2025.csv`: bridge by segment and total
- `revenue_bridge_detail.csv`: each customer with their underlying change and category

I can also turn this into a waterfall chart if you'd like.