I built the FY2025 revenue bridge. Revenue is essentially flat year on year: **$11.24M in FY24 and $11.24M in FY25, down $4.9K (–0.04%)**. The bridge adds up exactly to FY25 for every segment and for the total; the script checks this and stops if it doesn't.

| Line | Enterprise | Mid-Market | SMB | **Total** |
|---|---:|---:|---:|---:|
| FY2024 revenue | 6,258,216 | 4,036,244 | 948,840 | **11,243,300** |
| + New | – | – | 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** |

**Key points**
- **Churn is the main drag.** Enterprise churn of $1.19M comes from just two customers: Birchway Foods ($503K) and Fenwick Legal ($686K). That is why Enterprise falls 12% while Mid-Market grows 8% and SMB grows 43%.
- **All new revenue is SMB.** Six new logos brought in $463K. No new Enterprise or Mid-Market customers were won.
- **Net revenue retention is 95.4% and gross revenue retention is 84.6%,** both excluding timing.
- **Customer counts:** 23 grew, 11 shrank, 4 churned, 6 are new and 4 are flat.

**How I treated timing:** I read `timing_amount` as the part of each customer's change that comes from revenue moving between periods, not a real change in the business. I show it on its own line, and expansion or contraction is the change left over after removing it. For example:
- Lumen Retail's whole –$13.8K drop is timing, so I count them as flat, not contracted.
- Cobalt Dental's +$98.5K is $53.2K timing and $45.3K real expansion.
- Saltmarsh Energy's –$38.6K drop includes +$13.7K of timing, so its real contraction is –$52.3K.

If timing means something else in your data, the expansion and contraction figures for those three customers would change.

I didn't use the management-reporting skill because it says it doesn't cover variance bridges, so I wrote a short script instead.

**Files** (rerun with `python3 revenue_bridge.py`):
- `revenue_bridge.py`: does the classification and the check that everything adds up
- `output/revenue_bridge.csv`: the bridge by segment
- `output/revenue_bridge_by_customer.csv`: each customer's contribution to every line, plus how they were classified

I can also make a waterfall chart from this if you'd like one.