I built the FY2025 revenue bridge. Revenue was essentially flat, falling from **$11,243,300 to $11,238,378 (−$4,922, about −0.04%)**. Expansion roughly offset churn. The bridge ties to the customer data at both the per-customer level and the total, and the script checks both.

| Line | Amount | # Customers |
|---|---:|---:|
| **FY2024 revenue** | **11,243,300** | |
| New | +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** | |

**By segment:**
- **Enterprise is the problem.** Revenue fell by $749K. Almost all of the churn came from two customers: Birchway Foods ($503K) and Fenwick Legal ($686K).
- **Mid-Market grew by $335K.** It had no churn, and expansion was about three times contraction.
- **SMB grew by $409K.** All $463K of new business came from six new SMB customers, which more than covered $99K of SMB churn.

**Retention:** net revenue retention is 95.8% (95.4% without timing). Gross revenue retention without timing is 84.6%.

**How I classified each customer** (the CSV has no definitions, so please check that these match your conventions):
- **New / Churn:** zero revenue in FY24 / zero revenue in FY25.
- **Timing:** I read `timing_amount` as the part of a customer's FY25 change that is a one-off timing effect. I took it out before deciding whether a continuing customer expanded or contracted. For example, Cobalt Dental grew by $98.5K, which splits into $53.2K timing and $45.3K expansion. Lumen Retail's whole −$13.8K drop is timing, so it has no contraction. If timing should instead be counted inside expansion and contraction, the timing line goes away and those two lines change.
- Three customers were exactly flat: Redwood Pharmacy, Hawthorn Veterinary and Jetty Seafood.

**Files:**
- `revenue_bridge.py`: the script, which can be re-run.
- `output/fy2025_revenue_bridge.csv`: the bridge above.
- `output/fy2025_revenue_bridge_by_segment.csv`: the bridge split by segment.
- `output/fy2025_revenue_bridge_customers.csv`: each customer's category and amounts, for tracing any line back to its customers.

I can also make a waterfall chart of the bridge.