## FY2025 revenue bridge

| Step | Amount |
|---|---:|
| **FY2024 revenue** | **11,243,300** |
| New customers (6) | +462,893 |
| Churned customers (4) | −1,288,224 |
| Expansion | +1,210,651 |
| Contraction | −443,322 |
| Timing | +53,080 |
| **FY2025 revenue** | **11,238,378** |

The bridge ties to the file totals with no difference. Revenue is down 4,922, or 0.04%.

- **Churn:** Birchway Foods, Fenwick Legal, Eastfield Library and Quill Publishing. Together they account for 1.29M of lost revenue.
- **Enterprise:** this segment fell 12%, from 6.26M to 5.51M. Birchway and Fenwick are Enterprise accounts, and they are most of the churn.
- **Mid-Market and SMB:** Mid-Market grew 8% and SMB grew 43%. SMB growth comes mostly from the six new logos.
- **Retention:** net revenue retention is 95.8% and gross revenue retention is 84.6%. Both use the timing amounts as I treated them below.

**Assumption on timing:** I read `timing_amount` as the part of a continuing customer's year-over-year change that comes from timing rather than underlying demand. I pulled it out of expansion and contraction and showed it as its own bar. Three customers have a non-zero amount: Cobalt Dental (+53,231), Lumen Retail (−13,813) and Saltmarsh Energy (+13,662). If the column means something else, such as one-off revenue to exclude entirely, the expansion and contraction figures will move. Tell me if so and I'll rerun it.

The script is `bridge.py` in the working directory. I haven't made a chart or a spreadsheet. I can add either if you want one.