# December 2025 KPI Scorecard

Source: `data/kpis_fy2025.csv`. Status compares each actual with its target, taking the KPI's direction (higher or lower is better) into account.

| KPI | Dec actual | Target | Var | Var % | Status | Nov actual | Dec vs Nov |
|---|---|---|---|---|---|---|---|
| Revenue (USD) | 826,751 | 823,600 | +3,151 | +0.4% | On target | 898,680 | ↓ |
| Gross margin | 26.06% | 26.00% | +0.06 pts | +0.2% | On target | 25.79% | ↑ |
| DSO (days, lower is better) | 51.2 | 45.0 | +6.2 | +13.8% | **Miss** | 48.6 | ↑ (worse) |
| On-time delivery | 93.30% | 95.00% | −1.70 pts | −1.8% | **Miss** | 93.70% | ↓ |
| Order fill rate | 97.60% | 97.00% | +0.60 pts | +0.6% | On target | 97.40% | ↑ |
| Active customers | 40 | 42 | −2 | −4.8% | **Miss** | 41 | ↓ |
| Inventory turns | 5.33 | 6.50 | −1.17 | −18.0% | **Miss** | 6.67 | ↓ |
| Opex % of revenue (lower is better) | 25.11% | 25.25% | −0.14 pts | −0.6% | On target | 22.57% | ↑ (worse) |

**Result:** 4 of 8 KPIs are on target and 4 are missed.

**Points to note**
- **Inventory turns** is the largest miss at −18% against target. It fell from 6.67 in November to 5.33.
- **DSO** has worsened every month shown (November 48.6, December 51.2). It is now 6.2 days over target.
- **Customer and delivery KPIs** are both below target. Active customers are down to 40 (target 42), and on-time delivery is 1.7 pts short.
- **Opex % of revenue** meets its budget ratio, but it rose 2.5 pts from November. Revenue also fell about 8% month on month, which is consistent with fixed costs being spread over a smaller base. I haven't checked this against the P&L, which wasn't provided.

I saved the script that produced the table as `scorecard.py` in the working directory.