File: stage-2-08-kpi-calculation-pack.md
Kestrel Medical: KPI Calculation Pack
Sample data. Every number below is calculated from the Sample data in03 - Working Files/data/by03 - Working Files/calc_kpis.py(results inkpi_results.json) and03 - Working Files/kewpie_substitutes.py(stand-ins, results insubstitutes_results.json). Data runs to 2026-09-30. Nothing here is real Kestrel data: check it against real data before go-live.
Version: Calculation Pack v1.2 for Business Requirements v1.3. Date: 24-Oct-26. Author: Kewpie, KPI Creator Stage 2. Replaces v1.1.
What changed from v1.1
- Average discount off list price on big deals (K2): no target in the first pass (Business Requirements v1.3; Sharon left it open at the Stage 5 walk-through, Adam approved). Before: a straight-line path from 17.03% to 14% by Dec-27, pace needed -0.20 points a month, Green today and Amber from Oct-26. After: pace needed 'Not rated until the target is set in Phase 2', no status. Kept: the 17.03% baseline, the trend (run rate) and the year history (14.05% in 2023, 17.03% from 2024). The path is kept in the calculation notes as Gary's Phase 2 proposal only.
- No other KPI changed.
What changed from v1.0 (carried from v1.1)
- Four KPIs are Phase 2 placeholders, as Adam decided: Gross margin per cent (K1), Gross margin by product group (K1.1), Monthly reports that match the agreed set of numbers (K5), Our price against the winning price on lost tenders (K4.1). Each shows 'Phase 2: waiting for data', with a labelled stand-in beside it. The calculation is still documented, and a named Phase 2 data source is recorded (section 4).
- Average discount off list price on big deals (K2): v1.1 set a path from 17.03% to 14% (superseded in v1.2: no target in the first pass, see above). Baseline unchanged at 17.03%.
- Big tender win rate (K4): now a count over the last 5 big tenders: 2 of 5 (the same five tenders as before). The target is open (Deb sets it). Against Gary's starting proposal of 3 of the last 5, the next 2 big tenders must both be won.
- Revenue growth on the year (K3): numbers unchanged (-6.8%, pace +0.72, run rate +0.27). The 4% is now measured on 2026 full-year actuals: about $203.5m in 2027 (estimate), still 3.1% below 2025.
- Challenge notes are marked resolved or still open as Business Requirements v1.1 records them (section 5).
1. Summary: the Top 5
| Measure | Baseline | Target | Pace needed | Run rate | Status |
|---|---|---|---|---|---|
| Gross margin per cent (K1) | Phase 2 placeholder: waiting for cost of sales | 43% for 2027 (text only) | Not shown | Not shown | Phase 2 placeholder, no colour |
| Average discount off list price on big deals (K2) | 17.03% (Jan to Sep 2026) | None in the first pass (set in Phase 2) | Not rated until the target is set in Phase 2 | 0.000 pts a month (flat) | Not rated (no target) |
| Revenue growth on the year (K3) | -6.8% (Jan to Sep 2026 on 2025) | +4% in 2027 on 2026 actuals | +0.72 pts a month | +0.27 pts a month | Red (below 0%), off pace |
| Big tender win rate (K4) | 2 of the last 5 big tenders | Open (Deb sets it); starting proposal 3 of the last 5 by Dec-27 | Next 2 big tenders both won (if 3 of 5) | Not meaningful | Not rated (target open) |
| Monthly reports that match the agreed set of numbers (K5) | Phase 2 placeholder: waiting for finance's agreed definitions | Open until switch-on | Not shown | Not shown | Phase 2 placeholder, no colour |
Status uses Gary's thresholds. Pace needed is (target - current) / months remaining, with months remaining counted from Sep-26 to Dec-27 (15). A Phase 2 placeholder shows no number, status colour, sparkline or pace needed.
Stand-ins beside the placeholders (not KPIs)
Each stand-in is labelled 'Stand-in, not the KPI' and 'Sample data'. It has no target and no status colour, and never uses the KPI's name or finance's stated 41%.
| Placeholder for | Stand-in | Baseline (Sample data) |
|---|---|---|
| Gross margin per cent (K1) | Net price realisation | 87.36% (Jan to Sep 2026), against 87.67% in 2025 |
| Gross margin by product group (K1.1) | Net price realisation by product group | Equipment groups 82.9% to 84.5%; Defibrillator consumables 95.0%; Parts and Service 100.0% |
| Monthly reports that match the agreed set of numbers (K5) | Reports on the draft agreed set | 3 of 30 reports; 17 combinations in use |
| Our price against the winning price on lost tenders (K4.1) | Price score gap on lost tenders | Behind on price in 11 of 20 scored losses; average -0.03 points of 30 |
2. The calculations
Gross margin per cent (K1)
- Result of the check on Gary's draft: Confirmed (Phase 2 KPI: placeholder tile on the dashboard)
- Plain English: Net sales less cost of sales, over net sales.
- Calculation:
(SUM(net_value_aud) - SUM(cost_of_sales)) / SUM(net_value_aud) - Sources and why:
sales_order_lines.net_value_aud(the sales system of record). Cost of sales: no field found. Phase 2: cost of sales per shipped order line from SAP product costing and billing documents, joined on order and line number. - Grain: Order line (each order has one line)
- Filters: Shipped lines, January to December. Must reconcile to finance's 41% before use. Placeholder tile until then; the stated 41% may appear only as a text note on the placeholder, never in the headline slot and never on the stand-in.
- Baseline: Phase 2 placeholder: waiting for cost of sales from finance. No baseline can be calculated from the Sample data: no cost of sales field exists in any of the 11 files. Finance's stated figure of about 41% is a text note on the placeholder only, not calculated. Period: Phase 2 (the stated figure is the current year, from the sales leader). Evidence: Working Hypothesis (a stated figure, not reproducible)
- Pace needed: Not applicable until Phase 2: the placeholder shows no pace needed
- Run rate: Not available: no history without cost of sales
- Reading it: Phase 2: waiting for data. Cannot say whether on pace until cost of sales is supplied
- Counter-metric: Net sales value year to date (Revenue growth on the year, K3), read alongside: a margin lift bought by dropping low-margin sales shows as falling net sales. Net sales Jan to Sep 2026 are $149.36m, -6.8% on the same months of 2025
- Notes: Phase 2 KPI. Formula confirmed as the right shape. Data mapping NOT confirmed: no cost field (checked every column in all 11 files; challenge note C1). Phase 2 needs cost of sales per shipped order line from SAP product costing, joined on order and line number, reconciled to finance's 41% before switch-on. First pass: placeholder tile plus the stand-in Net price realisation (Adam's choice), which never carries this KPI's name, target or status colour.
- Stand-in (first pass only, not the KPI): 87.36% of list price kept on shipped lines (net sales $149.36m), against 87.67% in the same months of 2025. By full year: 2021 89.72%, 2022 89.28%, 2023 89.28%, 2024 87.61%, 2025 87.22%. Excluding warranty replacement lines: 87.26% against 87.58%. Price side only: this is not gross margin. Period: January to September 2026 against the same months of 2025, ship date (Sample data). Evidence: Observed Fact for the calculation; Working Hypothesis that it moves with gross margin (no cost data to test the link). Calculation:
SUM(net_value_aud) / SUM(list_price * qty), shipped lines, ship date
Average discount off list price on big deals (K2)
- Result of the check on Gary's draft: Corrected
- Plain English: One minus net value over list value, across big-deal lines, weighted by value.
- Calculation:
1 - SUM(net_value_aud) / SUM(list_price * qty), order_type = tender_contract - Sources and why:
sales_order_lines.list_price,.qty,.net_value_aud,.order_type,.order_date.discount_pctused as a cross-check only. - Grain: Order line
- Filters: Order type tender_contract (placeholder until Sharon sets a size rule); period by order date; no lines excluded for missing list price (none).
- Baseline: 17.03% value-weighted discount off list on tender contract order lines (5,485 lines). Placeholder big-deal definition. Period: January to September 2026, order date. Evidence: Observed Fact (calculation); Working Hypothesis for which orders count as big deals
- Pace needed: Not rated until the target is set in Phase 2
- Run rate: 0.000 points a month over the last 3 months (flat)
- Reading it: Not rated: no target and no status colour in the first pass. The tile shows the 17.03% baseline and its trend. Year history: 14.05% in 2023, 17.03% in 2024, 17.03% in 2025
- Counter-metric: Tender contract net sales and the Big tender win rate (K4): pulling back discount can simply lose the deals. Tender contract net sales Jan to Sep: $86.7m in 2026 against $95.1m in 2025
- Notes: Corrected (C4, accepted in v1.1): the draft placeholder 'orders linked to a contract_id' picks up service contract lines, not tenders. No order reaches $5m, so an order-total rule gives nothing. v1.3: Sharon left the target open at the Stage 5 walk-through (23-Oct-26), so the first pass has no target, no thresholds, no status and no pace needed; the target is set in Phase 2 (Q-13). Gary's Phase 2 proposal, for information only: a straight path from 17.03% (Sep-26) to 14.0% (Dec-27), -0.20 points a month (Dec-26 16.42%, Jun-27 15.21%, Dec-27 14.00%); Green at or below the path, Amber up to 1 point above, Red more than 1 point above (C5). Discount recalculated from list_price, qty and net_value_aud agrees with discount_pct (99.9% of lines within 0.002 points). The 2026 reference is Jan to Sep until the year closes.
Target: none in the first pass (v1.3). Status and pace needed are not shown. Gary's Phase 2 proposal (information only, not the target): straight line from 17.03% (Sep-26) to 14.0% (Dec-27), -0.20 points a month: Sep-26 17.03%, Dec-26 16.42%, Mar-27 15.82%, Jun-27 15.21%, Sep-27 14.61%, Dec-27 14.00%. Green at or below the path, Amber up to 1 point above, Red more than 1 point above. If the discount stays flat it would be Amber from Oct-26 and Red from Feb-27.
Average discount on tender contract lines by year (order date): 2021: 14.04%, 2022: 14.04%, 2023: 14.05%, 2024: 17.03%, 2025: 17.03%, Jan to Sep 2026: 17.03%.
If 'big deal' meant something else (Jan to Sep 2026): tender contract and distributor lines 16.78%; the biggest 1% of lines by value ($87,101 or more) 4.14%. The baseline depends heavily on the definition, so Sharon's size rule (open question) matters.
Revenue growth on the year (K3)
- Result of the check on Gary's draft: Confirmed
- Plain English: Net sales shipped this year to date over net sales shipped in the same months last year, minus one.
- Calculation:
SUM(net_value_aud, ship month 1..m, 2026) / SUM(net_value_aud, ship month 1..m, 2025) - 1 - Sources and why:
sales_order_lines.net_value_audand.actual_ship_date(the draft rule, until finance confirms its revenue rule);.order_typechecked. - Grain: Order line
- Filters: Shipped lines only; year to date against year to date.
- Baseline: -6.8% ($149.36m against $160.26m). Full year 2025 on 2024 was +0.4%, which matches 'flat last year'. Period: January to September 2026 against January to September 2025, ship date. Evidence: Observed Fact
- Pace needed: +0.72 points a month: from -6.8% to +4.0% over 15 months (Sep-26 to Dec-27). In v1.1 the 4% is measured on 2026 full-year actuals: about $203.5m in 2027 ($16.96m a month) against $16.6m a month so far in 2026
- Run rate: +0.27 points a month over the last 3 months (year-to-date growth moved from -7.6% in Jun to -6.8% in Sep)
- Reading it: Off pace: the run rate is about 2.7 times too slow. Even on the 2026 base, 2027 would be about 3.1% below 2025
- Counter-metric: Value-weighted average discount across all lines (Average discount, K2 context): growth bought with price shows here. All lines Jan to Sep 2026: 12.52%, against 12.84% for the full year 2025
- Notes: Confirmed on ship date. Numbers are unchanged from v1.0. Checked order types: there are no credit or return types; warranty replacement lines carry full list value at 0% discount ($1.8m in 2025) and removing them changes the baseline to -6.9%, so it is immaterial. On order date the baseline is -9.9%. 1,517 lines (1.26%, all 2026) have no ship date yet and are not counted. The 2027 measure cannot exist before 2027, so the 2026 year-to-date figure is the baseline. v1.1 sets the base for the 4% as 2026 full-year actuals (estimate $195.68m until the year closes); the base is still an open question for Sharon and finance (C6).
Year-to-date growth by month in 2026 (ship date): Jan -12.5%, Feb -9.1%, Mar -8.7%, Apr -7.8%, May -8.2%, Jun -7.6%, Jul -7.8%, Aug -7.3%, Sep -6.8%.
What 4% means on the v1.1 base (2026 full-year actuals; estimate, Working Hypothesis): full-year 2026 is estimated at $195.68m (Jan to Sep actual plus Q4 2025 moved by the year-to-date rate). 4% on that is $203.5m for 2027, which is -3.1% against full-year 2025 ($209.95m).
Big tender win rate (K4)
- Result of the check on Gary's draft: Corrected
- Plain English: Tenders won out of the last 5 decided tenders with a contract value of $5m or more (rolling five-tender window), with the calendar-year count alongside.
- Calculation:
COUNT(outcome = won) over the last 5 tenders with outcome IN (won, lost) and contract value >= 5,000,000, ordered by close_date - Sources and why:
tender_register.outcome,.estimated_value,.contract_length,.close_date,.tender_reference. The bid manager's file, because the sales leader does not trust the CRM for win-loss. - Grain: Tender
- Filters: Contract value $5m or more (annual amounts times years); exclude undecided, partial and cancelled; show the count next to the rate.
- Baseline: 2 of the last 5 big tenders (40%). Calendar year alongside: 2024 1 of 2, 2025 0 of 2, 2026 to Sep 1 of 1. Won Coastal Ambulance Service ($14.0m) and Capital Region Health ($5.6m); lost Southern Metro Health Network ($6.5m), Western Plains LHD ($7.2m) and Highlands Ambulance ($11.8m). Period: The last five tenders of $5m or more in the register, closing March 2024 to February 2026. Evidence: Observed Fact (small numbers)
- Pace needed: Target open (Q-1): Deb Harlow sets it. Against Gary's starting proposal of at least 3 of the last 5 by Dec-27, the next 2 big tenders must both be won: after one win the window still reads 2 of 5, after two it reads 3 of 5. At about 2 big tenders a year, about 2.5 are expected by Dec-27
- Run rate: Not meaningful: only 5 events, so no run rate over 3 periods
- Reading it: Not rated until Deb sets the target. If 3 of 5 is accepted it is reachable only if both of the next two big tenders are won, with little room for a loss
- Counter-metric: Number and value of big tenders bid, and the discount on tender contract orders (Average discount, K2): a count can be lifted by bidding only on easy tenders or cutting price. Big tenders bid: 2 (2024), 2 (2025), 1 (2026 to Sep)
- Notes: Corrected (C7, accepted in v1.1): 24 of 64 estimated values are stored as annual amounts ('$2.4m pa'), which must be multiplied by the contract length to compare with $5m. The same five tenders qualify either way. No partial or cancelled tender is $5m or more. v1.1 measures it as a count over the last 5 big tenders, not a yearly percentage (C2). At $4m or more the count is 5 of 10; across all sizes 28 of 53, so the result depends on the size line. Customer names vary in the register (Southern Metro and Southern Metropolitan; Western Plains LHD and Western Plains Health District).
| Tender | Customer (as in the register) | Closed | Value | Outcome | Winner |
|---|---|---|---|---|---|
| TND-2024-03 | Coastal Ambulance Service | 22/03/2024 | $14.0m | won | Kestrel Medical |
| TND-2024-07 | Southern Metro Health Network | 12/07/2024 | $6.5m | lost | Vantage Medical |
| TND-2025-02 | Western Plains LHD | 30/04/2025 | $7.2m | lost | Allied Clinical Supply |
| TND-2025-06 | Highlands Ambulance | 19/09/2025 | $11.8m | lost | Norland Rescue Systems |
| TND-2026-01 | Capital Region Health | 27/02/2026 | $5.6m | won | Kestrel Medical |
What the count needs (Working Hypothesis, Gary's starting proposal of at least 3 of the last 5 by Dec-27): the next 2 big tenders both won. After the next win the window reads 2 of 5 (the March 2024 win drops out), and after the next two it reads 3 of 5. About 2.5 big tenders are expected by Dec-27 at the recent pace of 2 a year.
Size line sensitivity (won of decided): $5m 2 of 5, $4m 5 of 10, $3m 8 of 13, $2m 13 of 20, $1m 19 of 35, $0m 28 of 53
Monthly reports that match the agreed set of numbers (K5)
- Result of the check on Gary's draft: Confirmed (Phase 2 KPI: placeholder tile on the dashboard)
- Plain English: Phase 2: reports that carry a sales number and whose monthly net sales check against the governed sales table, over all reports that carry a sales number.
- Calculation:
COUNT(reports whose month net sales agree with the governed sales table within tolerance) / COUNT(reports that carry a sales number) - Sources and why: Phase 2: the monthly check results (report, month, report net sales, governed net sales, pass or fail), built by the data engineer from the 30 workbooks and the governed sales table. First pass stand-in only:
monthly_reports_index.workbook,.sales_definition,.customer_grouping,.last_refreshed. - Grain: Report, month
- Filters: Agreed definition and match tolerance set by finance (open); reports marked n/a reviewed one by one to see whether they carry a sales number. Placeholder tile until one full month's check has run.
- Baseline: Phase 2 placeholder: waiting for the agreed definitions from finance and the first monthly number check. No baseline can be calculated yet: the index records what owners say they use, not whether their numbers agree. Period: Phase 2. Evidence: Working Hypothesis (the agreed set is open)
- Pace needed: Not applicable until Phase 2: the placeholder shows no pace needed. Target open (C3), set by the finance report owner with the sales leader once the agreed definitions exist
- Run rate: Not available: the index holds one snapshot, no history
- Reading it: Phase 2: waiting for data
- Counter-metric: Reports refreshed in the last 30 days, and the total number of reports that carry a sales number: the rate could be lifted by retiring reports or relabelling the index. 22 of 30 were refreshed in the 30 days to 30-Sep-26; 8 were last refreshed in March 2026 or earlier
- Notes: Phase 2 KPI. v1.1 changes the measure from the self-reported index to Tom's check of each report's monthly net sales against a governed sales table (C3 resolved by the change; target still open). First pass: placeholder tile plus the stand-in Reports on the draft agreed set. Index facts (Sample data): sales definitions ship date 14, invoice date 5, order date 5, n/a 6; customer grouping n/a 9, parent where known 6, ship-to 6, manual mapping tab 5, sold-to 4. 12 reports have n/a in at least one column; 17 different combinations are in use.
- Stand-in (first pass only, not the KPI): 3 of 30 reports (10%) say they use the draft rule (ship date, customers grouped by parent where known); 17 different combinations of sales definition and customer grouping are in use. Shows what reports say they use, not whether their numbers agree. Period: Report index at 30-Sep-26 (Sample data). Evidence: Working Hypothesis (the agreed set is open and the index is self-reported). Calculation:
COUNT(sales_definition = ship date AND customer_grouping = parent where known) / COUNT(reports), plus COUNT(DISTINCT sales_definition, customer_grouping)
Stand-in detail (Sample data): reports matching each candidate set (with parent where known): invoice date + parent where known 1, ship date + parent where known 3, order date + parent where known 1. Most common combinations: ship date with ship-to: 5; ship date with n/a: 4; n/a with n/a: 3. Reports on the draft set: 08 Work orders by tech, 12 Tender pipeline, 25 Rep targets. Reports last refreshed more than 30 days before the cutoff: 02 Sales by product group, 05 Open quotes, 09 Overdue PMs, 10 Service revenue, 13 Ambulance accounts, 23 Installed base (service), 25 Rep targets, 29 Quarterly review pack.
Sub-KPIs
Gross margin by product group (K1.1)
- Result of the check on Gary's draft: Confirmed (Phase 2 KPI: placeholder tile on the dashboard)
- Plain English: Gross margin per cent, split by product group.
- Calculation:
K1 grouped by material_group - Sources and why: As Gross margin per cent (K1), plus
sales_order_lines.material_group - Grain: Order line by product group
- Filters: As K1. Placeholder tile until the cost feed switches on; the groups must add up to the total.
- Baseline: Phase 2 placeholder: waiting for cost of sales from finance. No baseline can be calculated: no cost of sales field. Period: Phase 2. Evidence: Working Hypothesis
- Pace needed: Not applicable until Phase 2: the placeholder shows no pace needed
- Run rate: Not available
- Reading it: Phase 2: waiting for data. Switches on with Gross margin per cent (K1)
- Counter-metric: As Gross margin per cent (K1)
- Notes: Phase 2 KPI. Formula confirmed; data mapping blocked by the same missing cost of sales field (C1). First pass: placeholder tile plus the stand-in Net price realisation by product group.
- Stand-in (first pass only, not the KPI): Loading systems 82.91% (+0.06 pts on 2025, 8.4% of net sales); Powered stretchers 82.95% (+0.01 pts on 2025, 9.1% of net sales); Stair chairs 83.10% (-0.08 pts on 2025, 2.8% of net sales); Manual stretchers 83.12% (-0.15 pts on 2025, 3.8% of net sales); Defibrillators 84.17% (+0.12 pts on 2025, 19.6% of net sales); Beds 84.33% (-0.34 pts on 2025, 21.8% of net sales); ED stretchers 84.45% (+0.30 pts on 2025, 7.1% of net sales); Defibrillator consumables 95.00% (-0.00 pts on 2025, 8.7% of net sales); Parts 100.00% (+0.00 pts on 2025, 4.4% of net sales); Service 100.00% (+0.00 pts on 2025, 14.2% of net sales). Service and Parts show 100% because they are not discounted: that says nothing about their margin. Groups are not ranked best or worst. Period: January to September 2026 against the same months of 2025, ship date (Sample data). Evidence: Observed Fact for the calculation; Working Hypothesis that group margin follows group realisation. Calculation:
Net price realisation grouped by material_group, with each group's share of net sales
Stand-in detail: Net price realisation by product group, Jan to Sep 2026 (Sample data, not gross margin):
| Product group | Realisation 2026 | Realisation 2025 | Change (pts) | Share of net sales 2026 |
|---|---|---|---|---|
| Loading systems | 82.91% | 82.85% | +0.06 | 8.4% |
| Powered stretchers | 82.95% | 82.94% | +0.01 | 9.1% |
| Stair chairs | 83.10% | 83.19% | -0.08 | 2.8% |
| Manual stretchers | 83.12% | 83.27% | -0.15 | 3.8% |
| Defibrillators | 84.17% | 84.05% | +0.12 | 19.6% |
| Beds | 84.33% | 84.68% | -0.34 | 21.8% |
| ED stretchers | 84.45% | 84.15% | +0.30 | 7.1% |
| Defibrillator consumables | 95.00% | 95.00% | -0.00 | 8.7% |
| Parts | 100.00% | 100.00% | +0.00 | 4.4% |
| Service | 100.00% | 100.00% | +0.00 | 14.2% |
Revenue growth by product group (K3.1)
- Result of the check on Gary's draft: Confirmed
- Plain English: Revenue growth, split by product group.
- Calculation:
K3 grouped by material_group - Sources and why:
sales_order_lines.material_group,.net_value_aud,.actual_ship_date - Grain: Order line by product group
- Filters: As K3
- Baseline: Service -20.8%; Defibrillators -9.2%; ED stretchers -7.4%; Stair chairs -7.1%; Powered stretchers -6.3%; Loading systems -5.0%; Parts -4.3%; Manual stretchers -2.3%; Defibrillator consumables -0.1%; Beds +2.6%. Period: January to September 2026 against 2025, ship date. Evidence: Observed Fact
- Pace needed: Service +1.65; Defibrillators +0.88; ED stretchers +0.76; Stair chairs +0.74; Powered stretchers +0.69; Loading systems +0.60; Parts +0.56; Manual stretchers +0.42; Defibrillator consumables +0.28; Beds +0.09 points a month to reach +4.0% in 15 months
- Run rate: Service +0.31; Defibrillators +0.04; ED stretchers +0.65; Stair chairs +0.89; Powered stretchers +2.54; Loading systems +0.31; Parts -0.64; Manual stretchers +0.86; Defibrillator consumables +0.45; Beds -0.89 points a month
- Reading it: Only Beds is growing (above 0%). Service is lumpy: 64% of its 2025 ship-date sales fall in January and July, so its year-to-date swings are mostly billing timing
- Counter-metric: Rolls up to Revenue growth on the year (K3); watch the Average discount counter-metric
- Notes: Confirmed. Group names are tidied from the material_group codes.
| Product group | Growth Jan to Sep 2026 | Run rate (pts a month) | Pace needed (pts a month) |
|---|---|---|---|
| Service | -20.8% | +0.31 | +1.65 |
| Defibrillators | -9.2% | +0.04 | +0.88 |
| ED stretchers | -7.4% | +0.65 | +0.76 |
| Stair chairs | -7.1% | +0.89 | +0.74 |
| Powered stretchers | -6.3% | +2.54 | +0.69 |
| Loading systems | -5.0% | +0.31 | +0.60 |
| Parts | -4.3% | -0.64 | +0.56 |
| Manual stretchers | -2.3% | +0.86 | +0.42 |
| Defibrillator consumables | -0.1% | +0.45 | +0.28 |
| Beds | +2.6% | -0.89 | +0.09 |
Revenue growth by rep (K3.2)
- Result of the check on Gary's draft: Confirmed
- Plain English: Revenue growth, split by rep.
- Calculation:
K3 grouped by rep_id - Sources and why:
sales_order_lines.rep_id,.net_value_aud,.actual_ship_date - Grain: Order line by rep
- Filters: As K3 (parent grouping makes no difference to a split by rep)
- Baseline: R10 -17.5%; R07 -10.6%; R05 -9.8%; R01 -9.2%; R14 -8.7%; R09 -8.0%; R02 -6.8%; R06 -6.1%; R08 -5.5%; R04 -4.8%; R13 -4.5%; R11 -1.5%; R12 +0.1%; R03 +35.4%. Period: January to September 2026 against 2025, ship date. Evidence: Observed Fact
- Pace needed: R10 +1.44; R07 +0.97; R05 +0.92; R01 +0.88; R14 +0.85; R09 +0.80; R02 +0.72; R06 +0.68; R08 +0.63; R04 +0.58; R13 +0.56; R11 +0.36; R12 +0.26; R03 -2.09 points a month to reach +4.0% in 15 months
- Run rate: R10 +0.36; R07 -0.89; R05 +0.58; R01 +2.05; R14 +0.07; R09 +3.85; R02 -1.11; R06 -0.83; R08 +0.29; R04 -4.76; R13 +0.08; R11 +1.28; R12 -3.17; R03 +21.20 points a month
- Reading it: Only R03 (small base) and R12 (flat) are at or above 0%
- Counter-metric: Rolls up to Revenue growth on the year (K3)
- Notes: Confirmed on rep_id. Gary's parent-grouping filter does not change a split by rep, because the rep sits on the order line. Reps are not tied to accounts in the data (median 4 different reps per sold-to customer). R03's +35% is on a small base ($1.5m in 2025).
| Rep | Growth Jan to Sep 2026 | Run rate (pts a month) | Pace needed (pts a month) |
|---|---|---|---|
| R10 | -17.5% | +0.36 | +1.44 |
| R07 | -10.6% | -0.89 | +0.97 |
| R05 | -9.8% | +0.58 | +0.92 |
| R01 | -9.2% | +2.05 | +0.88 |
| R14 | -8.7% | +0.07 | +0.85 |
| R09 | -8.0% | +3.85 | +0.80 |
| R02 | -6.8% | -1.11 | +0.72 |
| R06 | -6.1% | -0.83 | +0.68 |
| R08 | -5.5% | +0.29 | +0.63 |
| R04 | -4.8% | -4.76 | +0.58 |
| R13 | -4.5% | +0.08 | +0.56 |
| R11 | -1.5% | +1.28 | +0.36 |
| R12 | +0.1% | -3.17 | +0.26 |
| R03 | +35.4% | +21.20 | -2.09 |
Our price against the winning price on lost tenders (K4.1)
- Result of the check on Gary's draft: Corrected (Phase 2 KPI: placeholder tile on the dashboard)
- Plain English: Our submitted price over the winning price, minus one, for lost tenders.
- Calculation:
our_submitted_price / winning_price - 1, outcome = lost - Sources and why:
tender_register.our_submitted_price,.winning_price,.outcome - Grain: Tender
- Filters: Lost tenders with a known winning price; annual amounts converted to contract totals. Placeholder tile until winning prices are back-filled; show the count with a known winning price beside the result.
- Baseline: Phase 2 placeholder: waiting for winning prices from the debrief letters. Winning price is recorded on only 5 of 25 lost tenders (2 of the 3 big losses), too few to show as a baseline. Period: Phase 2. Evidence: Working Hypothesis (winning price missing on 80% of lost tenders)
- Pace needed: Not applicable until Phase 2: the placeholder shows no pace needed (evidence measure, no target)
- Run rate: Not applicable
- Reading it: Phase 2: waiting for data
- Counter-metric: Price score gap from the debrief scoring table, as a second source (see Why we lost, K4.2): on the 3 big losses our price score was behind by 0.6 and 1.2 points of 30 and ahead by 0.9
- Notes: Phase 2 KPI. Corrected (C7, accepted in v1.1): values stored as annual amounts are converted to contract totals. Winning price is missing on 20 of 25 lost tenders (C8). What the register holds today (not shown on the tile): Southern Metro Health Network +2.1%, Highlands Ambulance -1.5%, Western Plains LHD not recorded; average +0.9% across the 5. First pass: placeholder tile plus the stand-in Price score gap on lost tenders.
- Stand-in (first pass only, not the KPI): Behind on price in 11 of 20 lost tenders with a scoring table; average gap -0.03 points of 30, median +0.45. Big losses: Southern Metro Health Network +0.60, Western Plains LHD +1.20, Highlands Ambulance -0.90. Positive means the preferred supplier scored higher on price. Price score, not price. Period: Lost tenders, whole register (Sample data). Evidence: Strong Inference (scores parsed from debrief text; only 3 tenders to cross-check against real prices). Calculation:
Weighted price points (out of 30) the preferred supplier scored above Kestrel, lost tenders with a scoring table; positive = behind on price
What the register holds today (documented, not shown on the dashboard):
| Lost tender | Our price against the winning price |
|---|---|
| TND-2021-22 | +1.9% |
| TND-2024-07 (big) | +2.1% |
| TND-2025-25 | +1.0% |
| TND-2025-06 (big) | -1.5% |
| TND-2026-22 | +1.0% |
Stand-in detail: Price score gap on lost tenders (Sample data): weighted points out of 30 that the preferred supplier scored above Kestrel on price (positive means we were behind). | Big loss | Price score gap (points of 30) | Gap across the other five areas (points of 70) |
| --- | --- | --- |
|---|---|---|
| Southern Metro Health Network (TND-2024-07) | +0.60 | +5.25 |
| Western Plains LHD (TND-2025-02) | +1.20 | +2.85 |
| Highlands Ambulance (TND-2025-06) | -0.90 | +8.40 |
Across 20 scored losses: behind on price in 11, level or ahead in 9, behind by 1 point or more in 5; average gap on the other five areas +1.32 points.
Why we lost, from the debriefs (K4.2)
- Result of the check on Gary's draft: Corrected
- Plain English: For each lost tender, the scoring area with the biggest gap to the preferred supplier, counted by area.
- Calculation:
argmax over areas of weighted points (preferred - ours), outcome = lost - Sources and why:
tender_register.scoring_table,.debrief_notes,.debrief_received - Grain: Tender
- Filters: Lost tenders with a scoring table; text parsed into six areas.
- Baseline: Biggest gap to the preferred supplier, of 20 lost tenders with a scoring table: Service and support 7, Clinical fit 5, Price 3, Sustainability 3, Supply reliability 2. All 3 big losses: Service and support. Price was the biggest gap in only 3 of 20. Period: Lost tenders, whole register. Evidence: Strong Inference (scores from the buyer's debrief, parsed from text)
- Pace needed: No target (evidence measure)
- Run rate: Not applicable
- Reading it: Debrief received on all 25 lost tenders: Green on Gary's coverage threshold
- Counter-metric: Debrief coverage: debrief received on 25 of 25 lost tenders; scoring table present on 20 of 25
- Notes: Corrected: the scoring text comes in three layouts and scales, so gaps are compared in weighted points out of 100 (weights 30, 25, 15, 10, 10, 10), not raw scores (C9). Five lost tenders have no scoring table and are excluded and counted.
| Big loss | Price | Clinical fit | Service and support | Supply reliability | Training | Sustainability |
|---|---|---|---|---|---|---|
| Southern Metro Health Network (TND-2024-07) | +0.60 | +0.50 | +2.85 | +1.00 | +0.30 | +0.60 |
| Western Plains LHD (TND-2025-02) | +1.20 | -0.50 | +1.95 | +0.60 | +0.40 | +0.40 |
| Highlands Ambulance (TND-2025-06) | -0.90 | -0.25 | +4.35 | +3.50 | +0.20 | +0.60 |
Gaps are weighted points out of 100 that the preferred supplier scored above us (negative means we scored higher).
Who is winning the tenders we lose (K4.3)
- Result of the check on Gary's draft: Confirmed
- Plain English: Count and value of lost tenders by winning supplier.
- Calculation:
COUNT, SUM(contract value) grouped by winning_supplier, outcome = lost - Sources and why:
tender_register.winning_supplier,.estimated_value,.contract_length - Grain: Tender
- Filters: Lost tenders.
- Baseline: Lost tenders by winner: Allied Clinical Supply 7 ($15.2m); Meridian Biomedical 6 ($7.5m); Helix Healthcare 5 ($13.2m); Vantage Medical 4 ($10.6m); Norland Rescue Systems 3 ($13.9m). Big losses: Vantage Medical, Allied Clinical Supply (a distributor bundling brands), Norland Rescue Systems. Period: Lost tenders, whole register. Evidence: Observed Fact
- Pace needed: No target (evidence measure)
- Run rate: Not applicable
- Reading it: Not applicable
- Counter-metric: Rolls up to Big tender win rate (K4)
- Notes: Confirmed. Supplier names are consistent in the register (5 names, none missing on lost tenders). Values are contract totals (annual amounts multiplied by term). The big losses went to three different winners, so no single competitor explains them.
3. KPI tree
Gross margin per cent (K1)
Gross margin by product group (K1.1)
Average discount off list price on big deals (K2)
Revenue growth on the year (K3)
Revenue growth by product group (K3.1)
Revenue growth by rep (K3.2)
Big tender win rate (K4)
Our price against the winning price on lost tenders (K4.1)
Why we lost, from the debriefs (K4.2)
Who is winning the tenders we lose (K4.3)
Monthly reports that match the agreed set of numbers (K5)
↑ Back to top4. What Phase 2 needs
Each Phase 2 KPI stays Must Have with its name, target and owner. Kewpie works with a data engineer to source the data. All four are placeholders until the switch-on test passes.
| KPI | Data to source | System | Owner | What the data engineer does | Switch-on test |
|---|---|---|---|---|---|
| Gross margin per cent (K1) | Kewpie with a data engineer sources cost of sales per shipped order line (standard or actual), with the same order and line numbers as the sales data | SAP (product costing and billing documents) | Finance report owner (Tom Nguyen), with the sales leader as the customer of the number | Locates the cost source with finance; extracts cost per order line and joins on order and line number; handles returns, rebates, freight and warranty lines; loads it with the sales data; adds a daily refresh and a reconciliation check | The calculated figure reconciles to finance's reported 41 per cent, within a tolerance finance sets |
| Monthly reports that match the agreed set of numbers (K5) | Kewpie with a data engineer builds one governed sales table to finance's agreed sales date rule and customer grouping, then pulls each report's monthly net sales and checks it against that table | The 30 Excel workbooks on the shared drive, and the governed table in the new data store | Finance report owner (Tom Nguyen) sets the agreed definitions and owns the report list | Builds the governed table and customer parent mapping; runs the monthly number check with a tolerance; records each result so there is history and a run rate; replaces the self-reported index | Finance has agreed the definitions and the tolerance, and one full month's check has run |
| Gross margin by product group (K1.1) | The same cost of sales feed as Gross margin per cent (K1), mapped to the product group codes (material_group) | SAP | Finance report owner (Tom Nguyen); sales leader uses it | As Gross margin per cent (K1) | Switches on with Gross margin per cent (K1), and the groups add up to the total |
| Our price against the winning price on lost tenders (K4.1) | Kewpie with a data engineer sources the winning price and our price for each lost tender, as numbers in total contract value (not annual amounts) | The bid manager's tender register, or the CRM if tenders move there | Bid manager (Deb Harlow) | With the bid manager, back-fills the 20 missing winning prices from the debrief letters, big losses first (Western Plains first); makes winning price and our price required number fields with a total-contract-value rule; cleans customer name variants; adds a completeness check | Winning price recorded on all three big losses and on enough lost tenders for the count to be shown beside the result |
5. Challenge notes
No KPI has been added, dropped or reprioritised. Corrections to Gary's draft measures are marked. 'Status in v1.1' follows the Business Requirements change log, with C5 updated for v1.3.
| # | KPI | Issue | Evidence | Suggested fix | Status in v1.1 |
|---|---|---|---|---|---|
| C1 | Gross margin per cent (K1) and Gross margin by product group (K1.1) | No cost of sales field, so gross margin cannot be calculated. | Checked every column in all 11 Sample data files: no cost, COGS, margin or standard cost field. Only the monthly report index mentions a margin report ('04 Margin by customer.xlsx'), with no data behind it. | Finance (Tom Nguyen) to name the SAP cost of sales source and supply it by order line; then reconcile to the stated 41%. Until then, report the stated 41% as a Working Hypothesis only. | Open for Phase 2. v1.1 marks the two margin KPIs Phase 2 placeholders; finance must name the cost of sales source (switch-on needs it to reconcile to the stated 41%) |
| C2 | Big tender win rate (K4) | Target is open (needed before Stage 2 finishes). Raised for Adam; Kewpie cannot set it. | Baseline 2 of 5 (40%). About 2 big tenders a year (2024: 2, 2025: 2, 2026 to Sep: 1), so a one-year percentage can only be 0%, 50% or 100%. On a rolling five-tender window, from the current mix: 60% needs the next 2 big tenders won, 80% needs 3, 100% needs 4. The result also moves with the size line: 5 of 10 at $4m or more. | Ask the bid manager (Deb Harlow) for a rolling five-tender target, or a count rule such as 'win at least 1 of the next 2'. Decision for Adam at this gate. | Resolved in v1.1 by the measure change: a count over the last 5 big tenders. Target still open for the bid manager, needed before Stage 4 is approved |
| C3 | Monthly reports that match the agreed set of numbers (K5) | Target is open, and the measure is a proxy. | No agreed set exists yet. On one candidate (ship date and parent where known) 3 of 30 reports match. The index records what owners say they use, not whether the numbers agree. 12 reports show n/a in at least one column, 17 different combinations are in use, and 8 reports were last refreshed in March 2026 or earlier. | Finance (Tom) to set the agreed sales definition and customer grouping and say how the n/a reports are treated (not a sales report, or to be fixed). Then set a target such as 'every report that carries a sales number uses the agreed set by Dec-27'. Adding a real number check (each report's net sales for one month against the agreed set) would turn the proxy into a test. Decision for Adam. | Resolved in v1.1 by the measure change: Tom's number check against a governed sales table, a Phase 2 placeholder. Target still open until switch-on |
| C4 | Average discount off list price on big deals (K2) | Correction to Gary's draft filter: the big-deal placeholder picks up the wrong orders, and an order-total rule finds none. | 3,153 lines carry a contract_id; all start with 'SC' (service contracts), all are Service product group and standard order type. None are tenders. The largest order total is $2,278,217, so no order reaches $5m (each order is one line). | Before: 'Big deal = order total at or above a size Sharon sets (open); placeholder: orders linked to a contract.' After: 'Big deal = order type tender_contract, as a placeholder until Sharon sets a size.' Applied in the pack and spec. Sharon's size rule is still open. | Resolved: accepted in v1.1 (tender contract orders as the big-deal placeholder). Sharon's size rule still open |
| C5 | Average discount off list price on big deals (K2) | Target does not connect to the margin target, and the baseline depends on the definition. | Tender contract discount was 14.1% in 2023, 17.0% in 2024 and 17.0% in 2025, then 17.0% in 2026 to Sep. 'At or below the 2026 average' therefore means holding the post-2024 level (pace needed zero), while Gross margin per cent (K1) must rise about 2 points. The same measure on the top 1% of lines by value reads 4.1%. | For Gary and Adam to consider: whether the reference year should be 2023 (14.1%) rather than 2026, and which big-deal definition applies. No change made here. | Superseded in v1.3: Sharon left the target open, so no target in the first pass. Gary's path towards about 14% is a Phase 2 proposal only (Q-13) |
| C6 | Revenue growth on the year (K3) | Baseline is a decline, and the base for 4% is open (Q-2). | Year to date -6.8% (order date basis -9.9%). 4% on a 2026 base gives about $203.5m for 2027, still -3.1% against 2025. Pace needed +0.72 points a month against a run rate of +0.27. SMART 'A' check: the pace needed is about 2.7 times the run rate, with no plan to close it. | Confirm with the sales leader and finance whether the 4% is on 2026 actuals or on 2025. No change made here. Ship date stays as the draft rule until finance confirms. | Resolved in v1.1 for now: measured against 2026 full-year actuals. The base is still open for Sharon and finance |
| C7 | Big tender win rate (K4) and Our price against the winning price on lost tenders (K4.1) | Correction to Gary's draft filter: annual amounts in estimated_value. | 24 of 64 values read like '$2.4m pa' with a contract length of 2 to 5 years. Treated as $2.4m they understate the contract value (for example $4.8m over 2 years). The same five tenders qualify at $5m, but the draft would misread lower size lines and future tenders. | Before: 'estimated_value at or above $5m (text like $2.21m converted to dollars)'. After: 'Contract value at or above $5m: text like $2.21m is the total; text like $2.4m pa is multiplied by the contract length in years.' Applied in the pack and spec. | Resolved: accepted in v1.1 |
| C8 | Our price against the winning price on lost tenders (K4.1) | Evidence gap: winning price is missing on most lost tenders. | 5 of 25 lost tenders have a winning price (20%); 2 of the 3 big losses. Over 5% missing, so the baseline is a Working Hypothesis. What there is: Southern Metro +2.1%, Highlands -1.5%; Western Plains not recorded. The scoring tables point the same way: price was a small gap on the big losses and service the largest (see Why we lost, K4.2). | Ask Deb Harlow for winning prices from the debrief letters, starting with Western Plains LHD. Use the price score from the scoring table as a second source until then. | Open for Phase 2. v1.1 marks the KPI a Phase 2 placeholder; winning prices to be back-filled from the debrief letters (bid manager) |
| C9 | Why we lost, from the debriefs (K4.2) | Correction to Gary's draft formula: scoring text is in three layouts and scales. | Layouts: points out of area weight ('25.5/30'), scores out of 100 ('PRICE=88/PREF=90'), and a percentage table. Raw 'biggest gap' would compare unlike scales. Five lost tenders have no scoring table. | Before: 'argmax(preferred_score - our_score) per tender from scoring_table'. After: 'argmax over areas of the gap in weighted points out of 100 (weights 30, 25, 15, 10, 10, 10).' Applied in the pack and spec. | Resolved: accepted in v1.1 |
| C10 | Sales leader's belief about the big losses | Not a change to any measure: the calculations do not support 'we lost on price' for the three big losses. | Southern Metro: our price +2.1% above the winner, price score 0.6 points behind, service 2.9 behind. Western Plains: price 1.2 behind, service 2.0 behind, winner a distributor. Highlands: our price 1.5% below the winner, price score 0.9 ahead, service 4.4 and supply reliability 3.5 behind. Strong Inference, from three tenders. | For Gary and the sales leader to weigh. No KPI is changed. | For information, no change |
| C11 | Revenue growth by rep (K3.2) | Gary's parent-grouping filter does not affect a split by rep. | The rep sits on the order line; the data shows a median of 4 different reps per customer, so reps are not tied to accounts. | No change made. For Gary: confirm how reps are credited if the aim is account ownership. | Resolved: accepted in v1.1 (rep credited from the order line). How reps should be credited for account ownership is a question for Sharon |
6. Data quality log
| Source | Check | Result |
|---|---|---|
| sales_order_lines | Lines with no ship date | 1,517 (1.26%), all 2026 orders not yet shipped: excluded from ship-date measures |
| sales_order_lines | Missing or zero list price | 0 |
| sales_order_lines | Duplicate order lines | 0 |
| sales_order_lines | Negative discounts (price above list) | 2 lines, kept |
| sales_order_lines | contract_id populated | 3,153 lines, all service contracts (C4) |
| sales_order_lines | Cost of sales | No field (C1) |
| tender_register | Values stored as annual amounts | 24 of 64 (C7) |
| tender_register | Lost tenders with no winning price | 20 of 25 (C8) |
| tender_register | Lost tenders with no scoring table | 5 of 25 (C9) |
| tender_register | Customer name variants | Southern Metro Health Network; Southern Metropolitan Health Network; Western Plains Health District; Western Plains LHD |
| monthly_reports_index | n/a in sales definition or customer grouping | 12 of 30 |
| monthly_reports_index | Only a snapshot, no history | No run rate possible |
7. Open questions that stay with Gary and the stakeholders
- Big-deal size rule (sales leader). Set the discount target in Phase 2 once Tom and Deb have checked the numbers (sales leader; Q-13). Base for the 4% (sales leader and finance). Win-rate count target, needed before Stage 4 is approved (bid manager). Cost of sales source and reconciliation tolerance, needed to start Phase 2 (finance). Agreed definitions, tolerance and target for the reports check, needed before the Phase 2 switch-on (finance, with the sales leader). Who is the data engineer, and when can they start (Adam).