I've built the FY2025 bridge and written the commentary note. The script ran without errors and checked that the bridge adds up to the cent. Revenue was essentially flat: $11.2M in FY2025 against $11.2M in FY2024, a change of ($5K), or (0.04%).

| Step | Amount |
| --- | --- |
| FY2024 | $11.2M |
| Timing | $53K |
| Loss | ($1.3M) |
| Decline | ($443K) |
| Upsell | $1.2M |
| New | $463K |
| FY2025 | $11.2M |

**What drove it:**
- **Lost customers:** 4 customers left, taking ($1.3M). Fenwick Legal accounted for ($686K) and Birchway Foods for ($503K).
- **Existing customers spending more:** 23 customers added $1.2M. Harbor Freight Partners added the most, $148K.
- **New customers:** 6 new customers added $463K. Thistle Gardens added the most, $116K.
- **Existing customers spending less:** 11 customers spent less, taking ($443K). Driftwood Media fell the most, by ($113K).
- **Timing:** 3 customers had revenue moved by renewal-date shifts, adding $53K net. This is kept out of the other rows.

Gains from existing and new customers almost exactly offset the two large losses. The data doesn't show why customers left or shrank; churn and contract records would answer that.

All figures are copied from the script's rounded output, and the note doesn't add them up again.

Files are in `output/`:
- `bridge.json`
- `bridge-note.md`