# December 2025 KPI Scorecard

Source: `data/kpis_fy2025.csv`. A KPI counts as "On target" when it is at or better than target, taking each KPI's direction (higher or lower is better) into account.

| KPI | Dec actual | Target | Var | Var % | Nov | MoM | Status |
|---|---|---|---|---|---|---|---|
| Revenue | $826,751 | $823,600 | +3,151 | +0.4% | $898,680 | -71,929 | On target |
| Gross margin % | 26.06% | 26.00% | +6 bps | +0.2% | 25.79% | +27 bps | On target |
| Days sales outstanding | 51.2 | 45.0 | +6.2 | +13.8% | 48.6 | +2.6 | **Miss** |
| On-time delivery % | 93.30% | 95.00% | -170 bps | -1.8% | 93.70% | -40 bps | **Miss** |
| Order fill rate % | 97.60% | 97.00% | +60 bps | +0.6% | 97.40% | +20 bps | On target |
| Active customers | 40 | 42 | -2 | -4.8% | 41 | -1 | **Miss** |
| Inventory turns | 5.33 | 6.50 | -1.17 | -18.0% | 6.67 | -1.34 | **Miss** |
| Opex % of revenue | 25.11% | 25.25% | -14 bps | -0.6% | 22.57% | +254 bps | On target |

**Result: 4 of 8 KPIs on target, 4 missed.**

**Misses**
- **Inventory turns** is the largest miss at 18% below target. It fell 1.34 turns in one month.
- **DSO** is 6.2 days over target and has risen from 48.6 in November. Receivables are collecting more slowly.
- **On-time delivery** is 170 bps under target and has slipped from 93.70% in November.
- **Active customers** is 2 below target, down from 41 in November.

**On target**
- **Revenue** and **gross margin** are slightly ahead of target.
- **Order fill rate** is ahead of target.
- **Opex %** is under its budget ratio. It rose 254 bps from November, though that month's target was lower (22.99% against 25.25% in December), so the budget ratio itself moves from month to month.

I haven't checked the figures against `pnl_fy2025.csv`, which the definitions reference, because it isn't in the directory. The script that produced the table is `scorecard.py` in the working directory.