File: 2026.10.23 - Kestrel Medical - 02 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.1 for Business Requirements v1.1. Date: 23-Oct-26. Author: Kewpie, KPI Creator Stage 2. Replaces v1.0.

What changed from v1.0

↑ 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)Path from 17.03% (Sep-26) to 14% (Dec-27)-0.20 pts a month0.000 pts a month (flat)Green today; off pace (Amber from Oct-26 if flat)
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 path (v1.1, Gary's proposal, for Sharon to confirm): 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 is 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.

#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.Resolved by a target change in v1.1 (path back towards about 14% by Dec-27). Sharon to confirm at next contact
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

File: 2026.10.23 - Kestrel Medical - 01 Business Requirements.md

Kestrel Medical: Business Requirements

Test case, Sample data. Kestrel Medical is a test case. Sharon was played by the case's stakeholder agent. Data named here is mapped to the Sample data in 03 - Working Files/data/, which must be checked against real data before go-live.

1. Document control

FieldDetail
Version1.1
Date23-Oct-26
StatusApproved at the Stage 2 gate, 23-Oct-26
AuthorGary, KPI Creator Stage 1
StakeholderSharon, sales leader (exact title to confirm)
Sign-offSharon confirmed the playback on 23-Oct-26, with three corrections (all made). Adam (acting subject matter expert, test mode) approved v1.0 at the Stage 1 gate, 23-Oct-26, and v1.1 at the Stage 2 gate, 23-Oct-26. Sharon has not yet seen the v1.1 changes; the ones marked "for Sharon to confirm" go to her at the next contact
↑ Back to top

2. Problem Statement

Kestrel has lost three of its last five big tenders, each over five million dollars, and believes price is the reason but can't yet prove or disprove it. With gross margin at about 41 per cent against global's 43 per cent target for 2027, and thirty monthly reports that give different answers, the business needs one set of evidence before it asks global for more discount room.

The problem as stated

Sharon, in her words: lost three of the last five big tenders, each over five million dollars, "never happened to me in 22 years". Reps say Kestrel is being undercut 10 to 15 per cent. She wants a win-loss view and pricing against the competition, so she can take evidence to global and argue for more discount room. And she wants out of Excel: thirty monthly reports, and half of them say different things.

The problem as Gary understands it

Gary's note: the question I'd put to Sharon is "What decision changes if this number moves?" Here, the answer is the discount case to global. If the debriefs say Kestrel lost on product fit or bundling, more discount won't win the next tender and will cost the margin target. That's my reading, not Sharon's words, and Sharon has not confirmed it.

↑ Back to top

3. Objectives

IDObjectiveSub-objective
O1Lift gross margin to 43 per cent in 2027 (about 41 per cent now)Know where margin is leaking, especially on big deals (O1.1)
O2Grow revenue 4 per cent in 2027 (flat last year)Know which reps and product groups are growing and which are going backwards (O2.1)
O3Stop losing the big tenders (over five million dollars)Know which tenders we lose, who wins them, on what price, and the real reasons from the debriefs (O3.1)
O4One agreed set of numbers instead of thirty monthly reports that disagree, automated and consistent

Each objective helps solve the Problem Statement: margin and growth are global's tests (O1, O2), the tender losses are the trigger (O3), and one agreed set of numbers makes the evidence credible (O4).

↑ Back to top

4. Audience and decisions

WhoDecisionsHow oftenWhere
Sales leader (Sharon)Pricing on big deals within her authority; where reps focus; headcount asks to global; how Kestrel responds to tendersMonthly (her expectation, "don't hold me to it")A pack for global (main use); on screen in meetings with the reps. Not phone
Global groupWhether to give more discount room; headcountUnknownPack, format unknown
RepsWhere to focusIn meetings with the sales leaderScreen
OthersUnknown: Sharon to check with the teamUnknownUnknown
↑ Back to top

5. Business Requirements with Data Mapping

All measures, data mappings and filters below were drafted by Gary and confirmed or corrected by Kewpie at Stage 2 (Calculation Pack v1.0). Targets and thresholds marked "Gary's proposal" were not said by Sharon. Four KPIs are Phase 2 KPIs: see "Phase for each KPI" below.

Top 5

MeasureTypeObjectiveWhat do we want to know?Why?Action if outside thresholdAction ownerTarget (SMART)Thresholds
Gross margin per cent (K1) (Phase 2)LaggingO1What gross margin we earn on sales, against global's 43 per centGlobal's headline target; any discount case has to square with itSales leader tightens pricing on big deals within her authority; anything beyond goes to global with the discount evidenceSales leader43% for the 2027 financial year (January to December). Global's target. Observed FactGary's proposal: Green 43% or more year to date; Amber 42% to under 43%; Red under 42%. Applied from Phase 2 only
Average discount off list price on big deals (K2)LeadingO1, O1.1How much discount we give off list on big deals, and where it's growingShows margin leaking before year end; the evidence for or against more discount roomSales leader reviews big-deal pricing within her authority and pulls back discounts that aren't winning businessSales leaderBack down from 17.0 per cent towards the 2023 level of about 14 per cent on tender contract orders by Dec-27. Gary's proposal, for Sharon to confirm. Working Hypothesis. Read with Big tender win rate (K4) as the counter-metricGreen at or below a straight-line path from 17.0 per cent (Sep-26) to 14 per cent (Dec-27); Amber up to 1 point above the path; Red more than 1 point above. Gary's proposal
Revenue growth on the year (K3)LaggingO2Whether revenue grows 4 per cent in 2027 after a flat yearGlobal's growth target; drives rep focus and headcount asksSales leader moves rep focus to growing product groups and customers; makes a headcount ask to global if the gap is capacitySales leader4% growth in 2027. Global's target. Observed Fact. Measured against 2026 full-year actuals on ship date until finance confirms the base. Note: 2026 is tracking -6.8 per cent, so 4 per cent on 2026 still leaves 2027 about 3 per cent below 2025Gary's proposal: Green 4% or more; Amber 0% to under 4%; Red below 0%
Big tender win rate (K4)LaggingO3How many tenders over five million dollars we winThree of the last five lost; decides how Kestrel responds to the next tendersBid manager reviews the debriefs and scoring of lost bids; sales leader decides how the response changesBid manager (response decided by the sales leader)To be set by the bid manager as a count out of the last 5 big tenders. Gary's starting proposal for Deb: at least 3 of the last 5 by Dec-27, which means winning the next 2 big tenders. Working Hypothesis. Open question, needed before Stage 4 is approved. Starting point: won 2 of the last 5 (Observed Fact)Follow the count Deb sets
Monthly reports that match the agreed set of numbers (K5) (Phase 2)LeadingO4Whether the monthly reports agree with one agreed set of numbersThree days a month reconciling; every other measure depends on agreed numbersFinance report owner fixes or retires any report that doesn't matchFinance report ownerOpen question, needed before the Phase 2 switch-on: Sharon wants one agreed set of numbers with Tom checking the reports against it, and has not agreed a target. Set by the finance report owner with the sales leader, once the agreed definitions existOpen, with the target

SME sign-off (all rows): Sharon (stakeholder) confirmed the playback with corrections, 23-Oct-26. Adam (acting subject matter expert, test mode) approved at the Stage 1 gate, 23-Oct-26, and approved the v1.1 changes at the Stage 2 gate, 23-Oct-26.

Measures for the Top 5 (confirmed or corrected by Kewpie)

MeasureHow measuredData source and fieldsFilters and conditions
Gross margin per cent (K1) (Phase 2)(Net sales minus cost of sales) divided by net sales. (SUM(net_value_aud) - SUM(cost_of_sales)) / SUM(net_value_aud)SAP sales orders: sales_order_lines.net_value_aud, sales_order_lines.actual_ship_date. Cost of sales: no field in the Sample data. Phase 2: cost of sales per shipped order line from SAP product costing and billing documents, joined on order and line number, sourced by the data engineer with the finance report ownerShipped lines only; financial year January to December; must reconcile to finance's 41 per cent before use. Phase 2 KPI: until the cost of sales feed reconciles, the tile is a placeholder showing 'Phase 2: waiting for data. Waiting for cost of sales from finance'. Finance's stated 41 per cent may appear only as a text note on the placeholder, 'Finance's stated figure, not calculated', Working Hypothesis, with no status colour, never in the headline slot and never on the stand-in
Average discount off list price on big deals (K2)1 minus net value over list value, value-weighted. 1 - SUM(net_value_aud) / SUM(list_price * qty)SAP sales orders: sales_order_lines.list_price, .qty, .net_value_aud, .discount_pct (cross-check), .order_id, .contract_id, .material_group, .order_typeBig deal = order total at or above a size Sharon sets (open); placeholder: tender contract orders (order_type tender_contract). The earlier placeholder, orders linked to a contract, picked up service contracts and is replaced (Kewpie's correction C4). Exclude lines with no list price. Period by order date
Revenue growth on the year (K3)Net sales year to date over the same period last year, minus 1. SUM(net_value_aud, YTD 2027) / SUM(net_value_aud, same period 2026) - 1SAP sales orders: sales_order_lines.net_value_aud, .actual_ship_date, .order_typeYear to date vs year to date; ship date until finance confirms its revenue rule; Kewpie to check order types for credits and returns
Big tender win rate (K4)Tenders won out of the last 5 decided tenders with a contract value of $5m or more (rolling five-tender window), shown as a count (for example '2 of 5'), with the calendar-year count alongsideBid manager's tender spreadsheet: tender_register.outcome, .estimated_value, .contract_length, .close_date, .tender_reference. Chosen over the CRM, which Sharon doesn't trust for win-loss$5m or more (values stored as text like "$2.21m"; values marked "pa" are annual amounts, multiplied by the contract length in years, Kewpie's correction C7); dates as dd/mm/yyyy text; exclude undecided; show the count (for example 2 of 5) next to the rate, as numbers are small
Monthly reports that match the agreed set of numbers (K5) (Phase 2)Phase 2 KPI. Reports that carry a sales number and whose net sales for the month check against the governed sales table (within a tolerance finance sets), divided by all reports that carry a sales number. Run automatically each month by the data engineer's check, reviewed by the finance report owner. Reports that carry no sales number are listed but not counted. First pass: placeholder tile, with the stand-in Reports on the draft agreed setPhase 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: monthly_reports_index.workbook, .owner, .sales_definition, .customer_grouping, .last_refreshedAgreed definition and match tolerance set by finance (open); reports marked "n/a" reviewed one by one to see whether they carry a sales number

Sub-KPIs (Must Have, explain a Top 5 measure)

Sub-KPIUnderObjectiveWhat it explainsHow measuredDataOwner
Gross margin by product group (K1.1) (Phase 2)Gross margin per cent (K1)O1.1Where the margin leaksGross margin split by product groupsales_order_lines.material_group, .net_value_aud, cost of sales (Phase 2: same feed as Gross margin per cent (K1))Sales leader
Revenue growth by product group (K3.1)Revenue growth on the year (K3)O2.1Which product groups grow or go backwardsRevenue growth by material_groupsales_order_lines.material_group, .net_value_audSales leader
Revenue growth by rep (K3.2)Revenue growth on the year (K3)O2.1Which reps grow or go backwardsAs Revenue growth on the year (K3). Rep credited from the order line (rep_id). How reps should be credited for account ownership is an open question for Sharon (Kewpie's correction C11)sales_order_lines.rep_id, .net_value_audSales leader
Our price against the winning price on lost tenders (K4.1) (Phase 2)Big tender win rate (K4)O3.1"On what price" we lost: proves or disproves the price storyPhase 2 KPI. our_submitted_price / winning_price - 1, lost tenders, values as total contract value (annual amounts multiplied by the contract length). Gary's proposed thresholds, applied from Phase 2 only: Green within 2%; Amber 2% to 5% above; Red more than 5% above. Show the count of tenders with a known winning price beside the result. First pass: placeholder tile, with the stand-in Price score gap on lost tenderstender_register.our_submitted_price, .winning_price, .outcome, .contract_length. Phase 2: winning price back-filled from the debrief letters and made a required number fieldBid manager
Why we lost, from the debriefs (K4.2)Big tender win rate (K4)O3.1Price, product fit, service or something elseFor each lost tender, the scoring area with the biggest gap to the preferred supplier, compared in weighted points out of 100 across the three scoring layouts (Kewpie's correction C9); losses counted by areatender_register.scoring_table, .debrief_notes, .debrief_receivedBid manager
Who is winning the tenders we lose (K4.3)Big tender win rate (K4)O3.1One competitor's product, or bundled distributor bidsCount and value of lost tenders by winning suppliertender_register.winning_supplier, .estimated_valueBid manager

Phase for each KPI

This first pass builds every Top 5 KPI and sub-KPI that the data supports today. Four can't be built yet because the data doesn't exist or isn't complete. They stay Must Have, keep their name, target and owner, and show as placeholder tiles until Phase 2, when Kewpie works with a data engineer to source the data. Every other KPI is marked 'First pass: built': 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), Why we lost, from the debriefs (K4.2) and Who is winning the tenders we lose (K4.3).

KPIPhase marking
Gross margin per cent (K1)First pass: placeholder tile plus the stand-in Net price realisation. Phase 2: 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. System: SAP (product costing and billing documents). Owner: finance report owner (Tom Nguyen), with the sales leader as the customer of the number. Data engineer: 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. Switch-on test: the calculated figure reconciles to finance's reported 41 per cent, within a tolerance finance sets
Gross margin by product group (K1.1)First pass: placeholder tile plus the stand-in Net price realisation by product group. Phase 2: the same cost of sales feed as Gross margin per cent (K1), mapped to the product group codes (material_group). System: SAP. Owner: finance report owner (Tom Nguyen); sales leader uses it. Switch-on test: switches on with Gross margin per cent (K1), and the groups add up to the total
Monthly reports that match the agreed set of numbers (K5)First pass: placeholder tile plus the stand-in Reports on the draft agreed set. Phase 2: 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. System: the 30 Excel workbooks on the shared drive, and the governed table in the new data store. Owner: finance report owner (Tom Nguyen) sets the agreed definitions and owns the report list. Data engineer: 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. Switch-on test: finance has agreed the definitions and the tolerance, and one full month's check has run
Our price against the winning price on lost tenders (K4.1)First pass: placeholder tile plus the stand-in Price score gap on lost tenders. Phase 2: 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). System: the bid manager's tender register, or the CRM if tenders move there. Owner: bid manager (Deb Harlow). Data engineer: 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. Switch-on test: winning price recorded on all three big losses and on enough lost tenders for the count to be shown beside the result

Stand-ins for the first pass (not KPIs)

A stand-in is a small, separate panel beside a placeholder tile. It carries its own plain name and the labels 'Stand-in, not the KPI' and 'Sample data' (until real data is loaded). It never takes the KPI's name, target, thresholds, pace needed, status colour or finance's stated 41 per cent. It has no target and no status colour of its own. It is removed, or moved to a context note, when its KPI switches on in Phase 2.

Adam chose, at the Stage 2 gate on 23-Oct-26, to show the Net price realisation stand-in beside the Gross margin per cent (K1) placeholder, with its labels, rather than the placeholder alone.

Stand-in forStand-in
Gross margin per cent (K1)Name: Net price realisation. What it shows: how much of list price Kestrel keeps after discounting, on shipped lines: net value over list value. Baseline 87.36 per cent, January to September 2026, against 87.67 per cent in the same months of 2025 (Sample data). Evidence label: Observed Fact for the calculation; Working Hypothesis that it moves with gross margin, because there's no cost data to test the link. On the panel: 'Price side only. This is not gross margin and can't be compared with the 43 per cent target.' Never shows the KPI's name, target or status colour
Gross margin by product group (K1.1)Name: Net price realisation by product group, with each group's share of net sales. What it shows: which product groups carry the deepest discounts (equipment groups keep about 83 to 84 per cent of list; Sample data). Evidence label: Observed Fact for the calculation; Working Hypothesis that group margin follows group realisation. On the panel: 'Service and Parts show 100 per cent because they aren't discounted. That says nothing about their margin.' Groups not ranked as best or worst. Never shows the KPI's name, target or status colour
Monthly reports that match the agreed set of numbers (K5)Name: Reports on the draft agreed set, with the number of different combinations in use. What it shows: how many reports say they use the draft rule (ship date, customers grouped by parent where known): 3 of 30, with 17 different combinations in use (index at 30-Sep-26, Sample data). Evidence label: Working Hypothesis (the agreed set is open and the index is self-reported). On the panel: 'Against a draft set. Shows what reports say they use, not whether their numbers agree.' Never shows the KPI's name, target or status colour
Our price against the winning price on lost tenders (K4.1)Name: Price score gap on lost tenders. What it shows: for each lost tender with a buyer's scoring table, the preferred supplier's price score minus ours, in weighted points out of 30 (positive means we were behind on price). Behind on price in 11 of 20 scored losses; big losses: Southern Metropolitan Health Network +0.60, Western Plains Health District +1.20, Highlands Ambulance -0.90 (Sample data). Evidence label: Strong Inference (scores parsed from debrief text; only 3 tenders to cross-check against real prices). On the panel: 'Price score, not price. The buyer's view of price, not our price against the winner's.' Never shows the KPI's name, target or status colour

Placeholder tiles

A placeholder tile uses the KPI's exact name from these Business Requirements, its owner's role, and the text 'Phase 2: waiting for data', with one line on what's missing (for example 'Waiting for cost of sales from finance'). The headline slot shows no number, no status colour, no sparkline, no gap and no pace needed. The target may be shown as text ('Target: 43 per cent for 2027') so the reader knows what's coming. A placeholder tile sits in the same place the real tile will take, so the layout doesn't change at switch-on.

How validation treats Phase 2 KPIs

For Jennifer's validation checklist in this first pass:

  1. A Phase 2 KPI counts as 'on the dashboard, calculated as documented' when its placeholder tile and stand-in are shown exactly as these Business Requirements document them, and is recorded as 'Phase 2 placeholder, as documented', not a fail
  2. For Lift gross margin (O1), progress shows Average discount off list price on big deals (K2) with actual, target, gap and pace, and the margin target as text with 'Phase 2: waiting for data'. For One agreed set of numbers (O4), progress shows 'Phase 2: waiting for data'. Neither is a fail
  3. Each Phase 2 owner can see 'Phase 2: waiting for data' at a glance, which counts as their status

It is a fail if a placeholder shows a number, a status colour, a sparkline or a pace needed, or if a stand-in takes the KPI's name, target, status colour or the stated 41 per cent. Kewpie's Stage 2 check, 'documented calculation that runs on the data', is met for these four by a documented calculation plus a named Phase 2 data source. Gary's proposal, approved by Adam; the process file itself is unchanged, which is Adam's call.

↑ Back to top

6. Backlog (Nice to Have)

ItemReason parked
CRM opportunity win rateSharon doesn't trust the CRM for win-loss: only some reps use it properly
Reps' reported competitor price cuts (10 to 15 per cent)Anecdote, not evidence. Replaced by our price against the winning price on lost tenders (K4.1)
Service and field measures (work orders, contracts, parts)The field service system was named, but no objective or action was raised for it. The debrief analysis shows service and support was the biggest scoring gap on all three big losses: ask Sharon whether to add a service measure under Big tender win rate (K4) in the next release
↑ Back to top

7. Data inventory (as named in the interview)

SourceHoldsMapped Sample dataGrainHistoryRefreshQuality notes
SAP ERPSales orders, customerssales_order_lines, sales_order_change_log, customersOrder lineUnknownUnknownMonthly reports come from ERP extracts. Cost of sales field not yet named. Phase 2: data engineer to source cost per order line from SAP product costing with the finance report owner
Tender spreadsheet (bid manager)Bids, outcomes, debriefstender_registerTenderUnknownManualDebrief letters held by Deb Harlow. Values and dates stored as text. Winning price recorded on 5 of 25 lost tenders. Phase 2: back-fill from debrief letters and make it a required number field
CRMOpportunitiescrm_opportunitiesOpportunityUnknownUnknownNot trusted for win-loss. Not used in the Top 5
Monthly Excel reportsThirty reportsmonthly_reports_indexReportMonthlyMonthlyHalf disagree. Owned by Tom Nguyen (finance). Cause unknown
Field service systemTechnician workwork_orders, asset_register, site_customer_map, service_contractsWork order, assetUnknownUnknownNo measure in this release

Sharon said she isn't the one to ask about the data itself. Tom Nguyen (finance) and Deb Harlow (bid manager) hold the detail.

↑ Back to top

8. Constraints and chart preferences

↑ Back to top

9. Assumptions

AssumptionEvidence label
The financial year is January to December, set by global; 2027 is both calendar and financial yearObserved Fact
Kestrel won 2 of its last 5 big tendersObserved Fact
Revenue counts on ship date in the draft measures, until finance confirms its ruleWorking Hypothesis
The tender file and debrief letters are a better source of loss reasons than the CRM or rep reportsStrong Inference
The Sample data reflects the shape of the real systemsWorking Hypothesis
The four stand-ins point the same way as the KPIs they sit beside, but can't be used to judge them against targetWorking Hypothesis
↑ Back to top

10. Open questions

QuestionFor
What count out of the last 5 big tenders is a realistic target for Big tender win rate (K4)? Gary's starting proposal: at least 3 of the last 5 by Dec-27. Needed before Stage 4 is approvedBid manager (Deb Harlow)
Can you back-fill winning prices from the debrief letters, starting with Western Plains, and should they move into the CRM or stay in the tender file?Bid manager (Deb Harlow)
Is the 4 per cent revenue growth for 2027 measured against 2026 actuals?Sales leader, with finance
Where does cost of sales come from for gross margin, how does finance get to 41 per cent, and what tolerance counts as reconciled? Needed to start Phase 2Finance report owner (Tom Nguyen)
Why do the thirty monthly reports disagree (how sales is counted, how customers are grouped, or both), and which is right? What is the agreed sales definition and customer grouping, which reports carry a sales number, and what tolerance counts as a match?Finance report owner (Tom Nguyen)
Who is the data engineer for Phase 2, and when can they start?Adam
Outside tenders, what order size counts as a big deal?Sales leader (Sharon)
Is the tighter discount target right for Average discount off list price on big deals (K2): back from 17.0 per cent towards about 14 per cent by Dec-27?Sales leader (Sharon)
How should reps be credited for Revenue growth by rep (K3.2): the rep on the order line, or account ownership?Sales leader (Sharon)
The debriefs point to service and support. Do you want a service measure under Big tender win rate (K4) in the next release?Sales leader (Sharon)
When does evidence next go to global, and in what pack format?Sales leader (Sharon)
What privacy or customer confidentiality rules apply, for example showing competitor prices or customer names in a pack for global?Sales leader (Sharon)
Who else will open the dashboard, and how often?Sales leader (Sharon)
What target should the monthly reports match against, and how will Tom check them in practice? Target for Monthly reports that match the agreed set of numbers (K5): needed before the Phase 2 switch-onFinance report owner, with the sales leader
How far back does each system go, and how often does each refresh?Finance report owner and bid manager
↑ Back to top

11. Change log

VersionDateChangeReasonApproved by
1.023-Oct-26First version. Playback corrections made: (1) Before "discount and tender decisions are being made blind", After "believes price is the reason but can't yet prove or disprove it"; (2) Before "my proposed target is better than half in 2027", After "target left for the bid manager"; (3) Before "Target all of them", After "one agreed set of numbers, with Tom checking the reports against it; target open"Stage 1 interview and playbackAdam, 23-Oct-26
1.023-Oct-26Stage 1 approved. Gary's proposed thresholds, big-deal discount target, owners and due dates accepted. Targets for Big tender win rate (K4) and Monthly reports that match the agreed set of numbers (K5) logged as open questions, needed before Kewpie finishes Stage 2Sharon asked that both targets be set later by the bid manager and the finance report ownerAdam, 23-Oct-26
1.123-Oct-26Four KPIs marked Phase 2 with placeholder tiles and labelled stand-ins: 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). Placeholder display rule and validation rule added. Net price realisation stand-in shown beside the margin placeholder with its labels (Adam's choice). Data source notes and open questions updatedData for these four can't be sourced in the first pass (Kewpie's Stage 2 findings); Adam asked for placeholders, 23-Oct-26Adam, 23-Oct-26
1.123-Oct-26Stage 2 challenge responses applied: Big tender win rate (K4) measured as a count out of the last 5 big tenders, with Gary's starting target proposal for Deb; Average discount off list price on big deals (K2) target and thresholds changed to a path back towards about 14 per cent (for Sharon to confirm); Revenue growth on the year (K3) target measured against 2026 full-year actuals; service measure question added to the backlog; Revenue growth by rep (K3.2) credited from the order line. Kewpie's corrections C4 (tender contract orders as the big-deal placeholder), C7 (annual tender values multiplied by contract length), C9 (weighted points out of 100) and C11 (rep on the order line) accepted. The deadline for the Big tender win rate (K4) target moves from "before Kewpie finishes Stage 2" to "before Stage 4 is approved", as recommended at the Stage 2 gateKewpie's challenge notes in Calculation Pack v1.0 and Gary's responseAdam, 23-Oct-26
1.123-Oct-26Stage 2 approvedStage 2 gateAdam, 23-Oct-26
↑ Back to top

File: 2026.10.23 - Kestrel Medical - 01 Project Plan.md

Kestrel Medical: Project Plan

Test case, Sample data. Built from Business Requirements v1.1 (approved at the Stage 2 gate, 23-Oct-26). Dates and effort are Gary's proposals. The first pass covers phases 1 to 5; Phase 2, Source missing data, follows it.

1. Goal and scope

↑ Back to top

2. Phases and sprints

PhaseDates (proposed)DeliverablesOwner (role)
1. Discover23-Oct-26 to 30-Oct-26Business Requirements v1.0, open questions answered by the bid manager and financeGary; sales leader
2. Build KPIs2-Nov-26 to 27-Nov-26 (2 sprints)Calculation Pack: measures confirmed on the data, baselines, pace needed, challenge notesKewpie; finance report owner
3. Visualise30-Nov-26 to 11-Dec-26 (1 sprint)Story, Standard dashboard (pack-first layout), Experimental optionsViktor
4. Harden14-Dec-26 to 22-Jan-27 (1 sprint, plus the holiday break)Standards and validation, stakeholder review, fixesJennifer
5. Embed25-Jan-27 to 5-Feb-27Handover, owner walk-through, monthly review rhythm agreedAdam; sales leader
Phase 2: Source missing data8-Feb-27 to 19-Mar-27 (3 sprints)Cost of sales feed reconciled; governed sales table and monthly report check; winning prices back-filled and required; four placeholder tiles switched to real KPIs and revalidatedKewpie with a data engineer; finance report owner; bid manager

The data adds a sprint to Build KPIs: cost of sales isn't named yet, the reports disagree, and the tender file stores values as text. Four KPIs can't be sourced in the first pass and move to Phase 2. The finance report owner and bid manager can start their parts (naming the cost source, agreeing definitions, back-filling winning prices) during the first pass, so Phase 2 starts ready.

Phase 2 tasks

TaskOwner (role)Person-daysDepends on
(a) Name the cost of sales source and the reconciliation toleranceFinance report owner1Data engineer named
(b) Extract cost per shipped order line from SAP and join to sales, with returns, rebates, freight and warranty handledData engineer, with Kewpie6(a)
(c) Reconcile to finance's 41 per cent and switch on Gross margin per cent and Gross margin by product groupKewpie, with finance report owner3(b)
(d) Agree the sales date rule, customer grouping and match toleranceFinance report owner, with sales leader1None
(e) Build the governed sales table and customer parent mappingData engineer5(d)
(f) Automated monthly check of each report against the governed table, with history; switch on Monthly reports that match the agreed set of numbersData engineer, with Kewpie3(e); target set
(g) Back-fill winning prices from debrief letters, big losses firstBid manager2None
(h) Make winning price and our price required number fields, total contract value rule, completeness check; switch on Our price against the winning price on lost tendersData engineer, with bid manager and Kewpie2(g)
(i) Rerun validation on the four switched-on tiles; remove or move the stand-insJennifer2(c), (f), (h)
(j) Phase 2 walk-through with the sales leaderAdam1(i)
↑ Back to top

3. MoSCoW

PriorityItems
MustGross margin per cent (placeholder in the first pass, Phase 2); Average discount off list price on big deals; Revenue growth on the year; Big tender win rate; Monthly reports that match the agreed set of numbers (placeholder in the first pass, Phase 2)
ShouldGross margin by product group (placeholder in the first pass, Phase 2); Revenue growth by product group; Revenue growth by rep; Our price against the winning price on lost tenders (placeholder in the first pass, Phase 2); Why we lost, from the debriefs; Who is winning the tenders we lose
CouldExperimental dashboard options
Won't (this time)CRM win rate; reps' reported competitor price cuts; service and field measures
↑ Back to top

4. Effort estimate

PhasePerson-daysAssumptions
Discover3Bid manager and finance answer the open questions within a week
Build KPIs10Includes agreeing the sales definition with finance and parsing the tender file
Visualise5One Standard version, up to two Experimental
Harden4One round of stakeholder fixes
Embed2One walk-through session
Phase 2: Source missing data26A data engineer is named and starts 8-Feb-27; finance names the cost source and agrees definitions before then; the bid manager back-fills during the first pass
Total50 (first pass 24, Phase 2 26)
↑ Back to top

5. RAID log

IDTypeDescriptionImpactOwner (role)ActionStatus
R1RiskCost of sales isn't named, so gross margin per cent can't be calculatedHFinance report ownerPlaceholder tile and stand-in in the first pass; name the SAP source before Phase 2 starts; reconcile to 41 per cent in Phase 2Open, mitigated for the first pass
R2RiskThe evidence may show losses weren't mainly price, which changes the discount case to globalHSales leaderAgree up front that the dashboard shows the evidence either wayOpen
R3RiskOnly a handful of big tenders a year, so the win rate swings on one resultMBid managerShow counts next to rates; use a rolling windowOpen
R4RiskPhase 2 data doesn't reconcile: the cost feed doesn't reach finance's 41 per cent, report numbers don't check against the governed table, or back-filled winning prices are too fewHFinance report owner (margin, reports); bid manager (winning prices)Agree each tolerance before the data engineer starts; a tile switches on only when it passes its reconciliation; if it fails, the placeholder stays, the gap is written up, and Adam decides whether to accept, extend Phase 2 or go back to the sales leaderOpen
R5RiskA stand-in is read as the real KPI, for example price realisation read as margin in the pack for globalMSales leaderStand-in labels fixed by the Business Requirements; Jennifer's validation fails any stand-in that takes a KPI's name, target or status colour; Adam explains it at the walk-throughOpen
I1IssueThirty monthly reports disagree; cause unknownHFinance report ownerAgree one sales definition and customer groupingOpen
I2IssueCRM not trusted for win-lossMSales leaderUse the tender file insteadClosed (designed out)
A1AssumptionRevenue counts on ship date until finance confirmsMFinance report ownerConfirm the ruleOpen
A2AssumptionSample data reflects the real systems' shapeMKewpieCheck against real extracts before go-liveOpen
D1DependencyBid manager supplies the win-rate target and debrief lettersHBid managerAnswer before Build KPIs endsOpen
D2DependencyGlobal's pack format and the next date evidence goes to globalMSales leaderConfirm before VisualiseOpen
D3DependencyPrivacy and customer confidentiality rules for competitor prices and customer namesMSales leaderConfirm before VisualiseOpen
D4DependencyA data engineer is named and booked for Phase 2HAdamName before Stage 4 is approvedOpen
↑ Back to top

6. Milestones and approval gates

MilestoneGateProposed date
Business Requirements v1.0 approvedStage 1 gate (Adam)30-Oct-26
Calculation Pack approvedStage 2 gate (Adam)27-Nov-26
Standard dashboard chosenStage 3 gate (Adam)11-Dec-26
Finished first draft validatedStage 4 gate (Adam)22-Jan-27
Stakeholder brief coverage checkOvy, before Stage 523-Jan-27
Walk-through, sign-off and go-live date setStage 5 (Sharon and Adam)5-Feb-27
Phase 2 data sources named (cost of sales, agreed definitions, back-fill under way)Ovy check5-Feb-27
Phase 2 KPIs switched on and revalidatedPhase 2 gate (Adam)19-Mar-27
Phase 2 walk-throughSales leader and Adam26-Mar-27
↑ Back to top

7. Review rhythm after go-live

↑ Back to top

File: 2026.10.23 - Kestrel Medical - 02 Kewpie Substitutes for Missing KPIs.md

Kestrel Medical: Substitutes for KPIs That Can't Be Built Yet

Sample data. Every number is calculated from the Sample data in 03 - Working Files/data/ by 03 - Working Files/kewpie_substitutes.py (results in substitutes_results.json). Data runs to 2026-09-30. Nothing here is real Kestrel data. Nothing in the Calculation Pack, calc_kpis.py, spec.json or the Business Requirements has been changed. No KPI is added, dropped or reprioritised: each real KPI stays in the Top 5 and gets a placeholder tile marked for Phase 2. The substitute sits beside the placeholder as a clearly labelled stand-in, never in place of the real KPI's name or target.

Author: Kewpie, KPI Creator Stage 2. Date: 23-Oct-26.

Summary

KPIWhy it can't be built nowSubstitute for the first passSubstitute baselinePhase 2 need
Gross margin per cent (K1)No cost of sales field in any of the 11 files (C1). Finance's 41% is a stated figure onlyNet price realisation (net value as a share of list value, shipped lines)87.36% (Jan to Sep 2026), against 87.67% in the same months of 2025Cost of sales per order line from the SAP product costing, owned by the Finance lead
Gross margin by product group (K1.1)Same missing cost of salesNet price realisation by product group, with each group's share of net salesBeds 84.33%, Defibrillators 84.17%, Defibrillator consumables 95.00%, ED stretchers 84.45%, Loading systems 82.91%, Stair chairs 83.10%, Manual stretchers 83.12%, Powered stretchers 82.95%, Parts and Service 100% (Jan to Sep 2026)Same cost feed, mapped to the product group codes
Monthly reports that match the agreed set of numbers (K5)No agreed set exists yet; the index records what owners say they use, not whether numbers agree (C3)Reports on the draft agreed set (ship date and parent where known), shown with the count of different combinations in use3 of 30 reports (10%); 17 different combinations in useAgreed definitions from Finance, then an automated number check against one governed sales table, run by the data engineer
Our price against the winning price on lost tenders (K4.1)Winning price recorded on only 5 of 25 lost tenders (C8)Price score gap on lost tenders (weighted points behind the preferred supplier, from the buyer's debrief scoring tables)11 of 20 lost tenders with a scoring table were behind on price; average gap -0.03 points of 30 (median +0.45); 3 big losses: +0.60, +1.20, -0.90Winning price captured at debrief, made a required field in the tender register or CRM, owned by the Bid manager

Everything else in the Top 5 and the sub-KPIs can be built now (section 3), so no placeholder is proposed for them.

↑ Back to top

1. What I propose

↑ Back to top

2. The four KPIs, one by one

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)

↑ Back to top

3. Checked and buildable now (no placeholder proposed)

KPIPosition
Average discount off list price on big deals (K2)Built on a placeholder big-deal rule (tender contract lines). 17.03% baseline. Sharon's size rule is still open, but the KPI runs
Revenue growth on the year (K3), by product group (K3.1) and by rep (K3.2)Built, Observed Fact. Reps aren't tied to accounts, noted in C11
Big tender win rate (K4)Built: 2 of 5 (40%), small numbers. Target still open (C2). Not a Phase 2 data gap
Why we lost (K4.2) and Who is winning the tenders we lose (K4.3)Built. K4.2 uses parsed text (Strong Inference). Winner is named on all 25 lost tenders
↑ Back to top

4. What Phase 2 needs

KPIData to sourceLikely systemOwner (role)What the data engineer does
Gross margin per cent (K1) and by product group (K1.1)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; the sales order lines already come from SAP)Finance lead (Tom Nguyen in the test case), with the Sales leader as the customer of the numberLocate the cost source with finance; extract cost per order line and join on order and line number; handle returns, rebates, freight and warranty lines; reconcile the total to finance's reported 41% before use; load to the same store as sales; add a daily refresh and a reconciliation check
Monthly reports that match the agreed set of numbers (K5)One governed sales table (agreed sales date rule and customer grouping), plus each report's monthly net salesThe 30 Excel workbooks and the shared drive, with the governed table in the new data storeFinance lead sets the agreed definitions; Sales Operations owns the report listBuild the governed sales table to Finance's rules; add the customer parent mapping; for each report pull one month's net sales and compare to the governed table with a tolerance; record the result monthly so there is history and a run rate; replace the self-reported index
Our price against the winning price on lost tenders (K4.1)Winning price (and our price) per lost tender from the debrief letters or buyer notice, as numbers with a clear unit (total contract value, not annual)Tender register (bid manager's file), or the CRM if tenders move thereBid manager (Deb Harlow in the test case)Back-fill the 20 missing winning prices from debrief letters, starting with the big losses; add required numeric fields and a total-contract-value rule to the register or CRM form; clean customer name variants; add a completeness check to the data pipeline
↑ Back to top

5. Assumptions and open points

↑ Back to top

File: 2026.10.23 - Kestrel Medical - 02 Gary Phase 2 Changes.md

Kestrel Medical: Gary's Phase 2 Changes

Test case, Sample data. Proposals only, for Adam's yes. Nothing in the Business Requirements v1.0, the Project Plan or spec.json has been changed, and Sharon hasn't been contacted.

Adam asked for placeholders for the KPIs that can't be built in this first pass, marked for Phase 2, where Kewpie works with a data engineer to source the data. Four KPIs are affected: Gross margin per cent (K1), Gross margin by product group (K1.1), Monthly reports that match the agreed set of numbers (K5) and Our price against the winning price on lost tenders (K4.1). None is dropped or reprioritised: each keeps its name, target and owner, and gets a placeholder tile now and the real calculation in Phase 2. Each placeholder sits beside a small stand-in that Kewpie calculated. A stand-in is labelled "Stand-in, not the KPI" and never takes the KPI's name, target, status colour or finance's stated 41 per cent. This file merges four of my earlier 11 rows (rows 1, 4, 5 and 9 in "02 Gary Response to Challenge Notes"), so Adam reads one consistent set. My other seven earlier rows (2, 3, 6, 7, 8, 10, 11) stand as written.

1. Business Requirements: Before and After (proposed v1.1)

"(none)" in Before means a new item. Quotes in Before are from Business Requirements v1.0, word for word.

#ItemBeforeAfter
1Document control, Version and Status"1.0" / "Approved at the Stage 1 gate, 23-Oct-26""1.1" / "Draft v1.1 for Adam's yes: Phase 2 placeholders and Stage 2 challenge responses. v1.0 approved at the Stage 1 gate, 23-Oct-26"
2Section 5, new subsection "Phase for each KPI", introduction(none)"This first pass builds every Top 5 KPI and sub-KPI that the data supports today. Four can't be built yet because the data doesn't exist or isn't complete. They stay Must Have, keep their name, target and owner, and show as placeholder tiles until Phase 2, when Kewpie works with a data engineer to source the data. Every other KPI is marked 'First pass: built': 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), Why we lost, from the debriefs (K4.2) and Who is winning the tenders we lose (K4.3)"
3Phase for Gross margin per cent (K1)(none)"First pass: placeholder tile plus the stand-in Net price realisation. Phase 2: 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. System: SAP (product costing and billing documents). Owner: finance report owner (Tom Nguyen), with the sales leader as the customer of the number. Data engineer: 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. Switch-on test: the calculated figure reconciles to finance's reported 41 per cent, within a tolerance finance sets"
4Phase for Gross margin by product group (K1.1)(none)"First pass: placeholder tile plus the stand-in Net price realisation by product group. Phase 2: the same cost of sales feed as Gross margin per cent (K1), mapped to the product group codes (material_group). System: SAP. Owner: finance report owner (Tom Nguyen); sales leader uses it. Switch-on test: switches on with Gross margin per cent (K1), and the groups add up to the total"
5Phase for Monthly reports that match the agreed set of numbers (K5)(none)"First pass: placeholder tile plus the stand-in Reports on the draft agreed set. Phase 2: 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. System: the 30 Excel workbooks on the shared drive, and the governed table in the new data store. Owner: finance report owner (Tom Nguyen) sets the agreed definitions and owns the report list. Data engineer: 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. Switch-on test: finance has agreed the definitions and the tolerance, and one full month's check has run"
6Phase for Our price against the winning price on lost tenders (K4.1)(none)"First pass: placeholder tile plus the stand-in Price score gap on lost tenders. Phase 2: 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). System: the bid manager's tender register, or the CRM if tenders move there. Owner: bid manager (Deb Harlow). Data engineer: 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. Switch-on test: winning price recorded on all three big losses and on enough lost tenders for the count to be shown beside the result"
7Section 5, new subsection "Stand-ins for the first pass (not KPIs)", rule(none)"A stand-in is a small, separate panel beside a placeholder tile. It carries its own plain name and the labels 'Stand-in, not the KPI' and 'Sample data' (until real data is loaded). It never takes the KPI's name, target, thresholds, pace needed, status colour or finance's stated 41 per cent. It has no target and no status colour of its own. It is removed, or moved to a context note, when its KPI switches on in Phase 2"
8Stand-in for Gross margin per cent (K1)(none)"Name: Net price realisation. What it shows: how much of list price Kestrel keeps after discounting, on shipped lines: net value over list value. Baseline 87.36 per cent, January to September 2026, against 87.67 per cent in the same months of 2025 (Sample data). Evidence label: Observed Fact for the calculation; Working Hypothesis that it moves with gross margin, because there's no cost data to test the link. On the panel: 'Price side only. This is not gross margin and can't be compared with the 43 per cent target.' Never shows the KPI's name, target or status colour"
9Stand-in for Gross margin by product group (K1.1)(none)"Name: Net price realisation by product group, with each group's share of net sales. What it shows: which product groups carry the deepest discounts (equipment groups keep about 83 to 84 per cent of list; Sample data). Evidence label: Observed Fact for the calculation; Working Hypothesis that group margin follows group realisation. On the panel: 'Service and Parts show 100 per cent because they aren't discounted. That says nothing about their margin.' Groups not ranked as best or worst. Never shows the KPI's name, target or status colour"
10Stand-in for Monthly reports that match the agreed set of numbers (K5)(none)"Name: Reports on the draft agreed set, with the number of different combinations in use. What it shows: how many reports say they use the draft rule (ship date, customers grouped by parent where known): 3 of 30, with 17 different combinations in use (index at 30-Sep-26, Sample data). Evidence label: Working Hypothesis (the agreed set is open and the index is self-reported). On the panel: 'Against a draft set. Shows what reports say they use, not whether their numbers agree.' Never shows the KPI's name, target or status colour"
11Stand-in for Our price against the winning price on lost tenders (K4.1) (replaces my earlier row 9)My earlier row 9 proposed the price score gap as a second source inside this sub-KPI. Its Before quoted a "filters and conditions" text that isn't in v1.0"Name: Price score gap on lost tenders. What it shows: for each lost tender with a buyer's scoring table, the preferred supplier's price score minus ours, in weighted points out of 30 (positive means we were behind on price). Behind on price in 11 of 20 scored losses; big losses: Southern Metropolitan Health Network +0.60, Western Plains Health District +1.20, Highlands Ambulance -0.90 (Sample data). Evidence label: Strong Inference (scores parsed from debrief text; only 3 tenders to cross-check against real prices). On the panel: 'Price score, not price. The buyer's view of price, not our price against the winner's.' Never shows the KPI's name, target or status colour"
12Section 5, new subsection "Placeholder tiles", display rule(none)"A placeholder tile uses the KPI's exact name from these Business Requirements, its owner's role, and the text 'Phase 2: waiting for data', with one line on what's missing (for example 'Waiting for cost of sales from finance'). The headline slot shows no number, no status colour, no sparkline, no gap and no pace needed. The target may be shown as text ('Target: 43 per cent for 2027') so the reader knows what's coming. A placeholder tile sits in the same place the real tile will take, so the layout doesn't change at switch-on"
13Gross margin per cent (K1), filters and conditions (replaces my earlier row 1)"Shipped lines only; financial year January to December; must reconcile to finance's 41 per cent before use""Shipped lines only; financial year January to December; must reconcile to finance's 41 per cent before use. Phase 2 KPI: until the cost of sales feed reconciles, the tile is a placeholder showing 'Phase 2: waiting for data. Waiting for cost of sales from finance'. Finance's stated 41 per cent may appear only as a text note on the placeholder, 'Finance's stated figure, not calculated', Working Hypothesis, with no status colour, never in the headline slot and never on the stand-in"
14Gross margin per cent (K1), data source and fields"SAP sales orders: sales_order_lines.net_value_aud, sales_order_lines.actual_ship_date. Cost of sales: no field in the Sample data; finance to name the SAP source""SAP sales orders: sales_order_lines.net_value_aud, sales_order_lines.actual_ship_date. Cost of sales: no field in the Sample data. Phase 2: cost of sales per shipped order line from SAP product costing and billing documents, joined on order and line number, sourced by the data engineer with the finance report owner"
15Gross margin by product group (K1.1), data"sales_order_lines.material_group, .net_value_aud, cost of sales (open)""sales_order_lines.material_group, .net_value_aud, cost of sales (Phase 2: same feed as Gross margin per cent (K1))"
16Monthly reports that match the agreed set of numbers (K5), how measured (replaces my earlier row 4)"Reports using the agreed sales definition and customer grouping, over all reports""Phase 2 KPI. Reports that carry a sales number and whose net sales for the month check against the governed sales table (within a tolerance finance sets), divided by all reports that carry a sales number. Run automatically each month by the data engineer's check, reviewed by the finance report owner. Reports that carry no sales number are listed but not counted. First pass: placeholder tile, with the stand-in Reports on the draft agreed set"
17Monthly reports that match the agreed set of numbers (K5), data source and fields (replaces my earlier row 5)"Monthly reports index: monthly_reports_index.workbook, .owner, .sales_definition, .customer_grouping, .last_refreshed""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: monthly_reports_index.workbook, .owner, .sales_definition, .customer_grouping, .last_refreshed"
18Monthly reports that match the agreed set of numbers (K5), filters and conditions"Agreed definition set by finance (open); reports marked "n/a" reviewed one by one""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"
19Monthly reports that match the agreed set of numbers (K5), target (Top 5)"Open question, needed before Kewpie finishes Stage 2 (Adam, 23-Oct-26): Sharon wants one agreed set of numbers with Tom checking the reports against it, and has not agreed a target""Open question, needed before the Phase 2 switch-on: Sharon wants one agreed set of numbers with Tom checking the reports against it, and has not agreed a target. Set by the finance report owner with the sales leader, once the agreed definitions exist"
20Our price against the winning price on lost tenders (K4.1), how measured (merges my earlier row 9)"our_submitted_price / winning_price - 1, lost tenders. Gary's proposed thresholds: Green within 2%; Amber 2% to 5% above; Red more than 5% above""Phase 2 KPI. our_submitted_price / winning_price - 1, lost tenders, values as total contract value (annual amounts multiplied by the contract length). Gary's proposed thresholds, applied from Phase 2 only: Green within 2%; Amber 2% to 5% above; Red more than 5% above. Show the count of tenders with a known winning price beside the result. First pass: placeholder tile, with the stand-in Price score gap on lost tenders"
21Our price against the winning price on lost tenders (K4.1), data"tender_register.our_submitted_price, .winning_price, .outcome""tender_register.our_submitted_price, .winning_price, .outcome, .contract_length. Phase 2: winning price back-filled from the debrief letters and made a required number field"
22Section 5, new subsection "How validation treats Phase 2 KPIs"(none)"For Jennifer's validation checklist in this first pass: (1) a Phase 2 KPI counts as 'on the dashboard, calculated as documented' when its placeholder tile and stand-in are shown exactly as these Business Requirements document them, and is recorded as 'Phase 2 placeholder, as documented', not a fail; (2) for Lift gross margin (O1), progress shows Average discount off list price on big deals (K2) with actual, target, gap and pace, and the margin target as text with 'Phase 2: waiting for data'; for One agreed set of numbers (O4), progress shows 'Phase 2: waiting for data'; neither is a fail; (3) each Phase 2 owner can see 'Phase 2: waiting for data' at a glance, which counts as their status. It is a fail if a placeholder shows a number, a status colour, a sparkline or a pace needed, or if a stand-in takes the KPI's name, target, status colour or the stated 41 per cent. Kewpie's Stage 2 check, 'documented calculation that runs on the data', is met for these four by a documented calculation plus a named Phase 2 data source. Gary's proposal; the process file itself is unchanged, which is Adam's call"
23Section 7, Data inventory, SAP ERP, quality notes"Monthly reports come from ERP extracts. Cost of sales field not yet named""Monthly reports come from ERP extracts. Cost of sales field not yet named. Phase 2: data engineer to source cost per order line from SAP product costing with the finance report owner"
24Section 7, Data inventory, Tender spreadsheet, quality notes"Debrief letters held by Deb Harlow. Values and dates stored as text""Debrief letters held by Deb Harlow. Values and dates stored as text. Winning price recorded on 5 of 25 lost tenders. Phase 2: back-fill from debrief letters and make it a required number field"
25Section 9, Assumptions, new row(none)"The four stand-ins point the same way as the KPIs they sit beside, but can't be used to judge them against target. Working Hypothesis"
26Section 10, Open questions, cost of sales"Where does cost of sales come from for gross margin, and how does finance get to 41 per cent? \Finance report owner (Tom Nguyen)""Where does cost of sales come from for gross margin, how does finance get to 41 per cent, and what tolerance counts as reconciled? Needed to start Phase 2 \Finance report owner (Tom Nguyen)"
27Section 10, Open questions, new(none)"Who is the data engineer for Phase 2, and when can they start? \Adam"
28Section 10, Open questions, new(none)"Can you back-fill winning prices from the debrief letters, starting with Western Plains, and should they move into the CRM or stay in the tender file? \Bid manager (Deb Harlow)"
29Section 11, Change log, new row(none)"1.1 \[date of Adam's yes] \Four KPIs marked Phase 2 with placeholder tiles and labelled stand-ins: 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). Placeholder display rule and validation rule added. Stage 2 challenge responses applied \Data for these four can't be sourced in the first pass (Kewpie's Stage 2 findings); Adam asked for placeholders, 23-Oct-26 \Adam"

How my earlier 11 rows fit:

Earlier rowWhat happens
1, Gross margin per cent (K1) tile ruleReplaced by rows 12 and 13 here. Change: the stated 41 per cent moves out of the headline into a text note, so it can't be read as calculated
4, Monthly reports (K5) how measuredReplaced by row 16. Same measure, now marked Phase 2 and run by the data engineer's check
5, Monthly reports (K5) data sourceReplaced by row 17. The index becomes the first-pass stand-in only
9, Our price against the winning price (K4.1) interim sourceReplaced by rows 11, 20 and 21. The price score gap becomes a separate stand-in, not a second source inside the KPI
2, 3, 6, 7, 8, 10, 11Stand as written. One correction when I apply them: their Before text paraphrases v1.0 rather than quoting it word for word. I'll quote v1.0 exactly in the final v1.1
↑ Back to top

2. Project Plan: Before and After

#ItemBeforeAfter
1Header note"Built from Business Requirements v1.0 (23-Oct-26). Dates and effort are Gary's proposals.""Built from Business Requirements v1.1 (draft). Dates and effort are Gary's proposals. The first pass covers phases 1 to 5; Phase 2, Source missing data, follows it"
2Goal and scope, In scope"the Top 5 measures and their six sub-KPIs in Business Requirements v1.0""the Top 5 measures and their six sub-KPIs in Business Requirements v1.1. First pass: built where the data supports it, placeholder tiles with labelled stand-ins for Gross margin per cent, Gross margin by product group, Monthly reports that match the agreed set of numbers, and Our price against the winning price on lost tenders. Phase 2: source the missing data and switch those four on"
3Phases and sprints, new row after "5. Embed"(none)"Phase 2: Source missing data \8-Feb-27 to 19-Mar-27 (3 sprints) \Cost of sales feed reconciled; governed sales table and monthly report check; winning prices back-filled and required; four placeholder tiles switched to real KPIs and revalidated \Kewpie with a data engineer; finance report owner; bid manager"
4Phases and sprints, note"The data adds a sprint to Build KPIs: cost of sales isn't named yet, the reports disagree, and the tender file stores values as text.""The data adds a sprint to Build KPIs: cost of sales isn't named yet, the reports disagree, and the tender file stores values as text. Four KPIs can't be sourced in the first pass and move to Phase 2. The finance report owner and bid manager can start their parts (naming the cost source, agreeing definitions, back-filling winning prices) during the first pass, so Phase 2 starts ready"
5New section "Phase 2 tasks"(none)Table: Task \Owner (role) \Person-days \Depends on. (a) Name the cost of sales source and the reconciliation tolerance \Finance report owner \1 \Data engineer named. (b) Extract cost per shipped order line from SAP and join to sales, with returns, rebates, freight and warranty handled \Data engineer, with Kewpie \6 \(a). (c) Reconcile to finance's 41 per cent and switch on Gross margin per cent and Gross margin by product group \Kewpie, with finance report owner \3 \(b). (d) Agree the sales date rule, customer grouping and match tolerance \Finance report owner, with sales leader \1 \none. (e) Build the governed sales table and customer parent mapping \Data engineer \5 \(d). (f) Automated monthly check of each report against the governed table, with history; switch on Monthly reports that match the agreed set of numbers \Data engineer, with Kewpie \3 \(e); target set. (g) Back-fill winning prices from debrief letters, big losses first \Bid manager \2 \none. (h) Make winning price and our price required number fields, total contract value rule, completeness check; switch on Our price against the winning price on lost tenders \Data engineer, with bid manager and Kewpie \2 \(g). (i) Rerun validation on the four switched-on tiles; remove or move the stand-ins \Jennifer \2 \(c), (f), (h). (j) Phase 2 walk-through with the sales leader \Adam \1 \(i)
6MoSCoW, Must"Gross margin per cent; Average discount off list price on big deals; Revenue growth on the year; Big tender win rate; Monthly reports that match the agreed set of numbers""Gross margin per cent (placeholder in the first pass, Phase 2); Average discount off list price on big deals; Revenue growth on the year; Big tender win rate; Monthly reports that match the agreed set of numbers (placeholder in the first pass, Phase 2)"
7MoSCoW, Should"Gross margin by product group; Revenue growth by product group; Revenue growth by rep; Our price against the winning price on lost tenders; Why we lost, from the debriefs; Who is winning the tenders we lose""Gross margin by product group (placeholder in the first pass, Phase 2); Revenue growth by product group; Revenue growth by rep; Our price against the winning price on lost tenders (placeholder in the first pass, Phase 2); Why we lost, from the debriefs; Who is winning the tenders we lose"
8Effort estimate, new row and total"Total \24""Phase 2: Source missing data \26 \A data engineer is named and starts 8-Feb-27; finance names the cost source and agrees definitions before then; the bid manager back-fills during the first pass. Total \50 (first pass 24, Phase 2 26)"
9RAID log, R1"Cost of sales isn't named, so gross margin per cent can't be calculated \H \Finance report owner \Name the SAP field and reconcile to 41 per cent \Open""Cost of sales isn't named, so gross margin per cent can't be calculated \H \Finance report owner \Placeholder tile and stand-in in the first pass; name the SAP source before Phase 2 starts; reconcile to 41 per cent in Phase 2 \Open, mitigated for the first pass"
10RAID log, new risk R4(none)"R4 \Risk \Phase 2 data doesn't reconcile: the cost feed doesn't reach finance's 41 per cent, report numbers don't check against the governed table, or back-filled winning prices are too few \H \Finance report owner (margin, reports); bid manager (winning prices) \Agree each tolerance before the data engineer starts; a tile switches on only when it passes its reconciliation; if it fails, the placeholder stays, the gap is written up, and Adam decides whether to accept, extend Phase 2 or go back to the sales leader \Open"
11RAID log, new risk R5(none)"R5 \Risk \A stand-in is read as the real KPI, for example price realisation read as margin in the pack for global \M \Sales leader \Stand-in labels fixed by the Business Requirements; Jennifer's validation fails any stand-in that takes a KPI's name, target or status colour; Adam explains it at the walk-through \Open"
12RAID log, new dependency D4(none)"D4 \Dependency \A data engineer is named and booked for Phase 2 \H \Adam \Name before Stage 4 is approved \Open"
13Milestones and approval gates, new rows after "Walk-through, sign-off and go-live date set"(none)"Phase 2 data sources named (cost of sales, agreed definitions, back-fill under way) \Ovy check \5-Feb-27" and "Phase 2 KPIs switched on and revalidated \Phase 2 gate (Adam) \19-Mar-27" and "Phase 2 walk-through \Sales leader and Adam \26-Mar-27"
14Review rhythm after go-live, Quarterly"Quarterly: finance report owner checks the monthly reports against the agreed set of numbers""Monthly, from Phase 2: the data engineer's automated check runs each report against the governed sales table; the finance report owner reviews the failures. Until then, quarterly: the finance report owner checks the monthly reports against the agreed set of numbers"
↑ Back to top

3. Decisions for Adam

  1. Yes to the Business Requirements rows (1 to 29) and Project Plan rows (1 to 14) above, so I can write v1.1 and update spec.json?
  2. Kewpie's option: show the margin stand-in (Net price realisation) or the placeholder only. I lean to showing it with the labels in row 8, because it's the part of margin the sales team can move. If the pack for global is the main use, the risk in R5 is real, so it's your call.
↑ Back to top

File: 2026.10.23 - Kestrel Medical - 02 Gary Response to Challenge Notes.md

Kestrel Medical: Gary's Response to Kewpie's Challenge Notes

Test case, Sample data. Gary's recommendations for Adam's SME sign-off on the 11 challenge notes in Calculation Pack v1.0. Nothing has been changed yet, and Sharon hasn't been contacted. Every Before and After below is a proposal, applied to Business Requirements v1.1 and spec.json only once Adam says yes.

Recommendation on approving Stage 2

Approve Stage 2 with conditions. Gross margin per cent (K1) and Gross margin by product group (K1.1) are documented but can't be run. The targets for Big tender win rate (K4) and Monthly reports that match the agreed set of numbers (K5) are still open. None of these stops Viktor building the story and the tiles. They do stop Jennifer's validation ("calculated as documented") and go-live. So:

↑ Back to top

One line per note

NoteRecommendationGary's reason
Missing cost of sales (C1), Gross margin per cent (K1) and Gross margin by product group (K1.1)Open question, plus a Business Requirements change to the display rule (row 1 below)Margin is global's headline. We can't invent a cost source. Tom Nguyen names it
Win-rate target (C2), Big tender win rate (K4)Business Requirements change: measure it as a count over the last 5 big tenders, not a yearly percentage (rows 2 and 3). The number stays with Deb HarlowAt about 2 big tenders a year, a yearly rate can only read 0, 50 or 100 per cent, which is noise. Sharon asked that Deb set the target, so I give Deb the form and a starting proposal, not a decision
Can the reports measure work as specified (C3), Monthly reports that match the agreed set of numbers (K5)Business Requirements change: no, not as specified. Change it to Tom's check of each report's numbers against the agreed set (rows 4 and 5). Target stays openThe index records what each report says it uses, not whether its numbers agree. Sharon's own words were "one agreed set of numbers, with Tom checking the reports against it". The After matches that
Big-deal filter (C4), Average discount off list price on big deals (K2)Accept Kewpie's correction (tender contract orders as the placeholder). Sharon's size rule stays an open questionThe contract_id placeholder picked up service contracts. My draft was wrong
Discount target (C5), Average discount off list price on big deals (K2)Business Requirements change to the target and thresholds (rows 6 and 7), for Sharon to confirm at the next contactHolding 17 per cent is green by definition and does nothing for a 2-point margin rise. The tender discount jumped 3 points in 2024. Pulling back towards the 2023 level is the action Sharon described ("tighten pricing on big deals")
Base for 4 per cent growth (C6), Revenue growth on the year (K3)Business Requirements change to the rationale (row 8). The base stays an open question for Sharon and TomSharon said "don't take my word on the base". Until Tom confirms, I measure against 2026 actuals and show what that means in dollars: still about 3 per cent below 2025
Annual amounts in tender values (C7), Big tender win rate (K4) and Our price against the winning price on lost tenders (K4.1)Accept Kewpie's correctionValues marked "pa" are annual amounts. Multiplying by the contract length is right
Missing winning prices (C8), Our price against the winning price on lost tenders (K4.1)Open question for Deb Harlow (winning prices from the debrief letters, Western Plains first), plus a Business Requirements change for the interim second source (row 9)Winning prices are recorded for only 5 of 25 lost tenders. The price score from the buyer's scoring is a fair stand-in, if it's labelled
Scoring layouts (C9), Why we lost, from the debriefs (K4.2)Accept Kewpie's correctionComparing weighted points out of 100 is the only fair way to compare three different layouts
Evidence on "lost on price" (C10)No change to the KPI list or the Problem Statement. One Business Requirements change to the backlog reason (row 10), and a new open question for SharonSee the C10 note below
Rep credit (C11), Revenue growth by rep (K3.2)Accept. Remove my parent-grouping filter (row 11). Ask Sharon how reps should be creditedSharon asked "which reps are growing". The rep on the order line answers that. Account ownership is a different question
↑ Back to top

C10: the data doesn't support "lost on price"

↑ Back to top

Before and After (proposed Business Requirements v1.1)

#ItemBeforeAfter
1Gross margin per cent (K1), filters and conditions"Shipped lines only; financial year January to December; must reconcile to finance's 41 per cent before use""Shipped lines only; financial year January to December; must reconcile to finance's 41 per cent before use. Until finance supplies cost of sales, the tile shows 'Waiting for cost of sales from finance' and the stated 41 per cent as a Working Hypothesis, with no status colour"
2Big tender win rate (K4), how measured"Tenders won divided by tenders decided (won plus lost), over five million dollars, rolling""Tenders won out of the last 5 decided tenders with a contract value of $5m or more (rolling five-tender window), shown as a count (for example '2 of 5'), with the calendar-year count alongside"
3Big tender win rate (K4), target"To be set by the bid manager (Q-1)""To be set by the bid manager as a count out of the last 5 big tenders (Q-1). Gary's starting proposal for Deb: at least 3 of the last 5 by Dec-27, which means winning the next 2 big tenders. Working Hypothesis. Thresholds follow the count Deb sets"
4Monthly reports that match the agreed set of numbers (K5), how measured"Reports that use the agreed sales definition and customer grouping, divided by all monthly reports""Reports that carry a sales number and whose net sales for the month check against the agreed set of numbers (within a tolerance finance sets), divided by all reports that carry a sales number. Checked by the finance report owner each month. Reports that carry no sales number are listed but not counted"
5Monthly reports that match the agreed set of numbers (K5), data source and fields"monthly_reports_index.workbook, .owner, .sales_definition, .customer_grouping, .last_refreshed""The finance report owner's monthly check log (to be set up: report, month, report net sales, agreed net sales, pass or fail). Until it exists, monthly_reports_index.sales_definition and .customer_grouping are used as a labelled proxy (currently 3 of 30 on one candidate set)"
6Average discount off list price on big deals (K2), target"At or below the 2026 big-deal average (Kewpie to set the baseline). Working Hypothesis""Back down from 17.0 per cent towards the 2023 level of about 14 per cent on tender contract orders by Dec-27. Gary's proposal, for Sharon to confirm. Working Hypothesis. Read with Big tender win rate (K4) as the counter-metric"
7Average discount off list price on big deals (K2), thresholds"Green at or below the 2026 average; Amber up to 1 percentage point above; Red more than 1 percentage point above""Green at or below a straight-line path from 17.0 per cent (Sep-26) to 14 per cent (Dec-27); Amber up to 1 point above the path; Red more than 1 point above. Gary's proposal"
8Revenue growth on the year (K3), target rationale"Global's target for 2027. Base (2026 actuals?) to confirm (Q-2)""Global's target for 2027, measured against 2026 full-year actuals on ship date until finance confirms the base (Q-2). Note: 2026 is tracking -6.8 per cent, so 4 per cent on 2026 still leaves 2027 about 3 per cent below 2025"
9Our price against the winning price on lost tenders (K4.1), filters and conditions"Lost tenders with a known winning price; text values like $2.12m converted to dollars; same tender size filter as K4, with all sizes shown for context""Lost tenders with a known winning price; values converted to contract totals. Where the winning price is missing, show the price score gap from the buyer's scoring, labelled 'price score, not price'. Same tender size filter as Big tender win rate (K4), with all sizes shown for context"
10Backlog: Service and field measures, reason"Systems named, but no objective or action raised in the interview""Systems named, but no objective or action raised in the interview. The debrief analysis shows service and support was the biggest scoring gap on all three big losses: ask Sharon whether to add a service measure under Big tender win rate (K4) in the next release"
11Revenue growth by rep (K3.2), filters and conditions"As K3. Customer grouping by parent where known (customers.parent_id), to match the agreed definition""As Revenue growth on the year (K3). Rep credited from the order line (rep_id). How reps should be credited for account ownership is an open question for Sharon"
↑ Back to top

New or updated open questions

  1. For the bid manager (Deb Harlow): What count out of the last 5 big tenders is a realistic target? Can you add winning prices from the debrief letters, starting with Western Plains?
  2. For finance (Tom Nguyen): Where does cost of sales come from? What is the agreed sales definition and customer grouping? Which reports carry a sales number? What tolerance counts as a match?
  3. For Sharon: Is the tighter discount target right (back towards about 14 per cent)? Is the 4 per cent on 2026 actuals? How should reps be credited? Do you want a service measure, given what the debriefs show?
↑ Back to top

File: dataset_description.md

Dataset description (Sample data)

Sample data for Kestrel Medical, copied unchanged from the test bank. Data to 2026-09-30. Not real company data.

FileRowsUsed for
sales_order_lines.csv120,391K2, K3, K3.1, K3.2 (one line per order; order dates Jan-2018 to Sep-2026)
tender_register.csv64K4, K4.1, K4.2, K4.3 (values and dates stored as text)
monthly_reports_index.csv30K5 (note: 'n/a' is a real value, not missing)
customers.csv, sales_order_change_log.csvnot used for the Top 5context
crm_opportunities.csvbacklognot trusted for win-loss
work_orders, asset_register, site_customer_map, service_contracts, parts_inventory_dailybacklogno objective in this release

No file has a cost of sales field. Re-run: python calc_kpis.py then python build_pack.py (needs pandas).