A B2B medical-equipment procurement platform, quoting hospitals by hand and losing money before the invoice existed. The Leak Ledger, run on pricing: a pocket-price waterfall, a corridor per category, and quote-to-order conversion up 27%.
The platform sells medical equipment — diagnostic imaging, patient monitoring, surgical instruments, consumables, refurbished devices — to small and mid-size hospitals that buy on quotation. A hospital asks; a category team sources and costs it from vendors; a pricing team sets a quote; sales negotiates; finance invoices. Four hands, four judgements, and no line in any system that said this is the price we meant to charge. The founders' question came from the board: are we losing deals on price, or winning them at any price? The honest answer was: both, and nobody could tell which was which.
Three systems again. The quotation workflow — every request stamped as it moved Quotation Requested → Assigned to Pricing → Assigned to Category → Quotation Generated, or died as Cannot Procure — with a turnaround clock on each hand-off. The CRM, where sales logged the negotiation and, when a quote was lost, a Not Accepted Reason — free text, including "price". And the accounting ledger, where vendor bills carried cost and invoices carried the selling price, so margin could be computed per line for the first time.
-- margin per invoice line: what we paid the vendor against what the hospital paid us (real shape) SELECT i.date AS bill_date, i.payment_terms_label, li.sku, li.product_category, li.quantity * v.bcy_rate AS cost_price, -- vendor bill, base currency li.quantity * li.rate AS selling_price FROM zoho.invoices i JOIN zoho.invoices_line_items li ON li.invoice_id = i.invoice_id LEFT JOIN zoho.bills_line_items v ON v.sku = li.sku AND v.bill_date <= i.date; # then, in pandas — the number nobody had seen per line before df["margin"] = (df.selling_price - df.cost_price) / df.selling_price df = df.replace([np.inf, -np.inf], np.nan) # a ₹0 selling price is a data bug, not a 100% discount
The waterfall at the top of this page is the TRACE. It follows one average deal from the price list to the money that actually landed, and names every step where value fell away: the category discount (published, deliberate), the negotiated discount (sales, unrecorded, the largest leak), freight and installation absorbed to "get the deal done", and the cost of extended payment terms — 60 and 90 days granted as a closing gesture, which is a discount wearing a calendar. The framework is McKinsey's pocket-price waterfall; the finding was local: only the first step had an owner.
Cohorting every quote by pocket price and outcome produced the chart above, and the two findings that changed the conversation. First, the pocket-price band was 3.1× wide for identical products: some hospitals paid under half of list, some nearly all of it, and deal size explained almost none of it — long relationships and whichever rep picked up the phone explained most. Second, and this is the one that matters, discounting deeper did not lift the win rate. Past a point, quotes were lost anyway, for reasons the CRM had been recording all along: delivery time, a missing demo, a competitor's brand. The discount was buying nothing.
| LEAK | SHARE OF POCKET GAP | EFFORT TO SEAL | VERDICT |
|---|---|---|---|
| Negotiated discounts with no approval trail | ≈ 45% | Low — a corridor and an approval rule | Seal first. The largest leak had no owner; giving it one recovered most of it. |
| Category cost moved, list price didn't | ≈ 20% | Low — recompute list from vendor bills monthly | Seal with the corridor. Some products were being quoted below current cost. |
| Freight and installation absorbed | ≈ 15% | Medium — price them, then discount them visibly | Seal second. Make the gift a line item so it is a decision. |
| Quotes lost above the corridor | — (lost revenue) | Low — a ceiling flag | The mirror leak: over-pricing on categories where the market was tight. |
| Slow quotes | — (lost revenue) | Medium — turnaround targets per hand-off | Quotes that took more than two days lost far more often, at any price. |
# the corridor, fitted per category from won and lost quotes (simplified) bands = quotes.assign(band=pd.cut(quotes.pocket_pct, bins=range(40, 105, 5))) curve = bands.groupby(["category", "band"]).agg(win_rate=("won", "mean"), n=("won", "size"), margin=("pocket_margin", "median")) def corridor(cat): c = curve.loc[cat] floor = c[c.margin >= MIN_MARGIN[cat]].index.min().left # protects margin target = c[c.n >= 12].win_rate.idxmax().left # where it actually wins ceil = c[c.win_rate >= 0.25].index.max().right # beyond this, quotes die return floor, target, ceil # the rule in the quote tool: below floor → approval; above ceiling → review; outside either → logged, always
The watch was three numbers on one page, refreshed from the same daily job that ran the collections tracker in case 01: conversion, the pocket price index, and — the one that kept the corridor honest — the share of quotes going out outside it. When that share crept up, it was never the corridor that was wrong; it was a new rep, or a vendor cost that had moved. The monthly read said which.
The cheapest money to recover is the money you were about to give away. Collections chase what is owed; pricing decides what is owed, and it was being decided by whoever was on the phone. Trace the price from list to bank, cohort the deals, and the leak names itself — then the seal is three numbers per category with a rule on each, and the win rate goes up, because the discounts were never what was winning.
Quoting by hand, and not sure whether you lose on price or win at any price? The Leak Audit starts with eighteen months of quotes and invoices and comes back with the waterfall, the band, and the three numbers per category. Two weeks, fixed fee.
Start with a TRACE → Case 01 → The method →