I've built the FY2024 to FY2025 customer revenue bridge and a one-page commentary note. Revenue was flat: $11.2M in both years, a change of ($5K), or (0.04%). The script confirmed the bridge reconciles to the cent.

| Step | Amount |
| --- | --- |
| FY2024 | $11.2M |
| Timing | $53K |
| Loss (churned accounts) | ($1.3M) |
| Decline (contraction) | ($443K) |
| Upsell (expansion) | $1.2M |
| New (new logos) | $463K |
| FY2025 | $11.2M |

- **Churn:** 4 customers were lost, and two of them account for most of it. Fenwick Legal lost ($686K) and Birchway Foods lost ($503K).
- **Expansion:** 23 customers upsold. The largest were Harbor Freight Partners at $148K and Ember Analytics at $136K.
- **Contraction:** 11 customers declined. Driftwood Media was down ($113K) and Juniper Schools ($107K).
- **New logos:** 6 customers were added. Thistle Gardens was the largest at $116K.
- **Timing:** $53K comes from 3 customers whose billing shifted with a renewal date. It is shown as its own step, separate from Upsell and Decline.

The commentary note names the top movers but gives no causes. The data doesn't show why Fenwick or Birchway left. Account-owner notes or exit reasons would answer that, and the board will likely ask.

The bridge runs only on the segment-less totals. I haven't broken it out by segment, though the CSV has that column.

Files are in `/tmp/spb-revenue-bridge-fy25-v2-claude-bbzsv5b3/output/`:
- `bridge-note.md`
- `bridge.json`