The December 2025 KPI scorecard is done, and it ties to the P&L. Revenue, gross margin percent and opex percent of revenue all match the P&L (the script checks margin and opex to four decimal places).

**Headline:** 4 of 8 KPIs were on target in December 2025, and 2 have been off target for three months or more.

| KPI | Actual | Target | Variance | Status | Months off |
| :-- | --: | --: | --: | :-- | --: |
| Revenue | $827K | $824K | $3K | on target | 0 |
| Gross margin percent | 26.1% | 26.0% | 0.1 | on target | 0 |
| Days sales outstanding | 51.2 | 45.0 | (6.2) | off target | 3 |
| On-time delivery percent | 93.3% | 95.0% | (1.7) | off target | 3 |
| Order fill rate percent | 97.6% | 97.0% | 0.6 | on target | 0 |
| Active customers | 40 | 42 | (2) | off target | 2 |
| Inventory turns | 5.33 | 6.50 | (1.17) | off target | 1 |
| Opex percent of revenue | 25.1% | 25.3% | 0.1 | on target | 0 |

A positive variance is good and a negative one is bad. Percent variances are in percentage points.

**Exceptions (off target three months or more):**
- **Days sales outstanding:** 51.2 days against a target of 45.0. The note asks the collections owner which customers' overdue balances are driving this.
- **On-time delivery:** 93.3% against a target of 95.0%. The note asks the operations owner where the late orders come from.

Active customers (2 months off) and inventory turns (1 month off) are also below target. They aren't exceptions yet, so the note doesn't treat them as trends.

**Opex variance:** The opex row shows 25.1% against 25.3% with a variance of 0.1, which looks like it should be 0.2. It isn't a mistake. The unrounded figures are 25.11% against 25.25%, a gap of 0.14 points, and each number is rounded separately.

Files are in `output/`:
- `scorecard-note.md`
- `scorecard.json`