# December 2025 KPI Scorecard

Source: `data/kpis_fy2025.csv`, period 2025-12. Four of the eight KPIs met target and four missed.

| KPI | Actual | Target | Variance vs target | Nov actual | MoM change | Status |
|---|---|---|---|---|---|---|
| Revenue | $826,750.62 | $823,600.00 | +$3,150.62 (+0.4%) | $898,679.67 | −8.0% | ✅ Met |
| Gross margin % | 26.06% | 26.00% | +0.06 pp | 25.79% | +0.27 pp | ✅ Met |
| Order fill rate | 97.60% | 97.00% | +0.60 pp | 97.40% | +0.20 pp | ✅ Met |
| Opex % of revenue (lower is better) | 25.11% | 25.25% | −0.14 pp (favorable) | 22.57% | +2.54 pp (worse) | ✅ Met |
| DSO (lower is better) | 51.2 days | 45.0 days | +6.2 days (worse) | 48.6 | +2.6 days (worse) | ❌ Missed |
| On-time delivery % | 93.30% | 95.00% | −1.70 pp | 93.70% | −0.40 pp | ❌ Missed |
| Active customers | 40 | 42 | −2 | 41 | −1 | ❌ Missed |
| Inventory turns | 5.33 | 6.50 | −1.17 (−18%) | 6.67 | −1.34 | ❌ Missed |

## Takeaways
- **Inventory turns** is the largest miss, at 18% below target. It fell from 6.67 to 5.33 in one month.
- **DSO** is the second concern. It is 6.2 days over target and has moved the wrong way from 48.6 to 51.2. Collections are slowing.
- **On-time delivery** is below target and slipped again. Fill rate still beat target.
- **Active customers** fell by one for the second month in a row, to 40 against a target of 42.
- **Revenue** beat its budget by a small margin. Opex % was favorable against target, but it rose 2.54 pp from November. The target also moved up from 22.99% to 25.25%, so I wouldn't read the MoM jump as a cost problem without checking the budget phasing.

I read "met" as at or better than target, taking the `direction` column into account. I did not cross-check against `pnl_fy2025.csv`, which isn't in the data folder.

I can also produce this as a CSV or a chart, or add a full-year trend view, if you want.