# December 2025 KPI scorecard

Source: `data/kpis_fy2025.csv`, period 2025-12. 4 of 8 KPIs are on target.

| KPI | Actual | Target | Variance | Status |
|---|---|---|---|---|
| Revenue | $826,751 | $823,600 | +$3,151 (+0.4%) | ✅ On target |
| Gross margin % | 26.06% | 26.00% | +0.06 pts | ✅ On target |
| Days sales outstanding | 51.2 days | 45.0 days | +6.2 days (13.8% worse) | ❌ Miss |
| On-time delivery % | 93.30% | 95.00% | −1.70 pts | ❌ Miss |
| Order fill rate % | 97.60% | 97.00% | +0.60 pts | ✅ On target |
| Active customers | 40 | 42 | −2 (−4.8%) | ❌ Miss |
| Inventory turns | 5.33 | 6.50 | −1.17 (−18.0%) | ❌ Miss |
| Opex % of revenue | 25.11% | 25.25% | −0.14 pts (lower is better) | ✅ On target |

**Where December missed**
- **Inventory turns** is the largest miss at 18% below target.
- **Days sales outstanding** is 6.2 days over target, which ties up cash.
- **On-time delivery** is 1.7 points short, even though order fill rate beat target.
- **Active customers** is 2 below target.

**Where December held**
- Revenue and gross margin were slightly ahead of target.
- Opex came in under target as a share of revenue.

I scored status as actual versus target, using each KPI's `direction` column. The CSV has no tolerance bands, so any shortfall counts as a miss. I didn't compare against prior months or check the figures against `pnl_fy2025.csv`, which isn't in the data folder. I can add a month-over-month trend or a full-year view if you want one.