File: stage-2-08-kpi-calculation-pack.md

Kestrel Medical: KPI Calculation Pack

Sample data. Every number below is calculated from the Sample data in 03 - Working Files/data/ by 03 - Working Files/calc_kpis.py (results in kpi_results.json) and 03 - Working Files/kewpie_substitutes.py (stand-ins, results in substitutes_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

↑ Back to top

What changed from v1.0 (carried from v1.1)

↑ Back to top

1. Summary: the Top 5

MeasureBaselineTargetPace neededRun rateStatus
Gross margin per cent (K1)Phase 2 placeholder: waiting for cost of sales43% for 2027 (text only)Not shownNot shownPhase 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 20.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 monthRed (below 0%), off pace
Big tender win rate (K4)2 of the last 5 big tendersOpen (Deb sets it); starting proposal 3 of the last 5 by Dec-27Next 2 big tenders both won (if 3 of 5)Not meaningfulNot rated (target open)
Monthly reports that match the agreed set of numbers (K5)Phase 2 placeholder: waiting for finance's agreed definitionsOpen until switch-onNot shownNot shownPhase 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 forStand-inBaseline (Sample data)
Gross margin per cent (K1)Net price realisation87.36% (Jan to Sep 2026), against 87.67% in 2025
Gross margin by product group (K1.1)Net price realisation by product groupEquipment 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 set3 of 30 reports; 17 combinations in use
Our price against the winning price on lost tenders (K4.1)Price score gap on lost tendersBehind on price in 11 of 20 scored losses; average -0.03 points of 30
↑ Back to top

2. The calculations

Gross margin per cent (K1)

Average discount off list price on big deals (K2)

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)

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)

TenderCustomer (as in the register)ClosedValueOutcomeWinner
TND-2024-03Coastal Ambulance Service22/03/2024$14.0mwonKestrel Medical
TND-2024-07Southern Metro Health Network12/07/2024$6.5mlostVantage Medical
TND-2025-02Western Plains LHD30/04/2025$7.2mlostAllied Clinical Supply
TND-2025-06Highlands Ambulance19/09/2025$11.8mlostNorland Rescue Systems
TND-2026-01Capital Region Health27/02/2026$5.6mwonKestrel 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)

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)

Stand-in detail: Net price realisation by product group, Jan to Sep 2026 (Sample data, not gross margin):

Product groupRealisation 2026Realisation 2025Change (pts)Share of net sales 2026
Loading systems82.91%82.85%+0.068.4%
Powered stretchers82.95%82.94%+0.019.1%
Stair chairs83.10%83.19%-0.082.8%
Manual stretchers83.12%83.27%-0.153.8%
Defibrillators84.17%84.05%+0.1219.6%
Beds84.33%84.68%-0.3421.8%
ED stretchers84.45%84.15%+0.307.1%
Defibrillator consumables95.00%95.00%-0.008.7%
Parts100.00%100.00%+0.004.4%
Service100.00%100.00%+0.0014.2%

Revenue growth by product group (K3.1)

Product groupGrowth Jan to Sep 2026Run 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)

RepGrowth Jan to Sep 2026Run 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)

What the register holds today (documented, not shown on the dashboard):

Lost tenderOur 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)

Big lossPriceClinical fitService and supportSupply reliabilityTrainingSustainability
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)

↑ Back to top

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 top

4. 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.

KPIData to sourceSystemOwnerWhat the data engineer doesSwitch-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 dataSAP (product costing and billing documents)Finance report owner (Tom Nguyen), with the sales leader as the customer of the numberLocates 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 checkThe 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 tableThe 30 Excel workbooks on the shared drive, and the governed table in the new data storeFinance report owner (Tom Nguyen) sets the agreed definitions and owns the report listBuilds 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 indexFinance 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)SAPFinance report owner (Tom Nguyen); sales leader uses itAs 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 thereBid 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 checkWinning price recorded on all three big losses and on enough lost tenders for the count to be shown beside the result
↑ Back to top

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.

#KPIIssueEvidenceSuggested fixStatus in v1.1
C1Gross 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%)
C2Big 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
C3Monthly 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
C4Average 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
C5Average 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)
C6Revenue 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
C7Big 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
C8Our 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)
C9Why 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
C10Sales leader's belief about the big lossesNot 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
C11Revenue 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
↑ Back to top

6. Data quality log

SourceCheckResult
sales_order_linesLines with no ship date1,517 (1.26%), all 2026 orders not yet shipped: excluded from ship-date measures
sales_order_linesMissing or zero list price0
sales_order_linesDuplicate order lines0
sales_order_linesNegative discounts (price above list)2 lines, kept
sales_order_linescontract_id populated3,153 lines, all service contracts (C4)
sales_order_linesCost of salesNo field (C1)
tender_registerValues stored as annual amounts24 of 64 (C7)
tender_registerLost tenders with no winning price20 of 25 (C8)
tender_registerLost tenders with no scoring table5 of 25 (C9)
tender_registerCustomer name variantsSouthern Metro Health Network; Southern Metropolitan Health Network; Western Plains Health District; Western Plains LHD
monthly_reports_indexn/a in sales definition or customer grouping12 of 30
monthly_reports_indexOnly a snapshot, no historyNo run rate possible
↑ Back to top

7. Open questions that stay with Gary and the stakeholders

↑ Back to top