Skip to main content
DoneThat

AI Adoption GuideProcurementReview

Spend analytics and savings tracking

ML classifies actuals against contract prices to compute realized savings, price drift, and off-contract leakage by category, using tools like Suplari or Sievo.

Procurement processRequestApproveSourceEvaluateSelectOrderReceiveReview

By Don, DoneThat’s AI coach · updated

Realized savings is posted unit price versus the live contract

The number that belongs on a CPO pack is the unit price that posted on a PO or invoice, compared with the contracted unit price that was live for that item, legal entity, and date.

An award memo is a claim. A forecast from a sourcing event is a claim. A likelihood that a request will go off-catalog is a claim. None of those belong in the savings numerator. Finance will ask what actually posted.

You only book realized savings on volume that hit the ledger on the agreement: like-for-like item, same unit of measure, and a baseline you can point to (the prior contracted price, or the last like-for-like PO before the event). If the invoice is on-contract but above the contracted unit price, that is price drift, not a smaller win. If a usable agreement existed and the PO did not use it, that is off-contract leakage. Keep those as separate lines.

Prefer the invoice unit price when both PO and invoice exist. The PO is intent. The invoice is what AP paid. If you only have PO actuals, label the report PO-based so nobody treats it as cash.

Match the posted line to the agreement that was in force that day

Matching is the whole job. Classification groups the result. It does not create it.

For each posted PO or invoice line, resolve:

  • Item. Manufacturer part, catalog SKU, or a mapped equivalent the category owner has accepted. A free-text description is not a match.

  • Price that was live. Effective start and end on the agreement, including amendments. Do not join to "the current file."

  • Legal entity and company code. A global MSA price is not the price for a plant that buys through a named local reseller of record.

  • Supplier or contracted channel. Match affiliates and the punchout or catalog the agreement names. A brand on an MSA is not coverage if the invoice is a distributor missing from the exhibit.

  • Unit of measure. Case versus each is the usual silent error. Convert before you subtract.

  • What the unit price includes. If the contract is ex-works and the invoice is delivered-duty-paid, you are not looking at the same number. Flag the Incoterm mismatch, or hold the line. Do not fold freight into savings to hide the mismatch.

Run an unmatched queue. Unmatched is unknown: not savings, not leakage. A fuzzy SKU match (same family, different spec) goes to the category owner. Do not auto-book it.

Spend category auto-classification can suggest a taxonomy code so the cube rolls up. A recode still does not change what was paid. Keep a recode log (from-code, to-code, spend moved, who accepted it) in a data-quality appendix. Do not let it touch the numerator.

Spend analytics platforms such as Sievo, SpendHQ (including the former Suplari product), Coupa, and SAP Ariba sit in this class: they ingest actuals, classify them, and join contract prices. This page does not rank those products. Use the cube that already holds your AP, PO, and contract files.

Split realized savings, price drift, and off-contract leakage

One blended "net savings" total is how a good quarter hides a contract that nobody is invoicing.

Realized savings. Volume that posted against a live agreement, at or below the contracted unit price, versus a documented like-for-like baseline. If the volume never posted, you did not realize the deal. If the spec changed (a thicker board, a shorter SLA), stop. That is a different buy. Send it to category opportunity identification or to a new event. Do not call a spec change a price win. Credits and returns reverse the original volume. Do not leave the first invoice in the numerator after AP has credited it.

Price drift. The PO or invoice is on the contracted supplier and the contracted item, and the unit price is higher than the agreement. Typical causes: a stale punchout price list, an unapproved surcharge, a volume break that was never earned. Drift is an AP and supplier-compliance problem. It is not "negative savings" to net against a sourcing win so the tile stays green.

Off-contract leakage. A usable agreement existed for that category, entity, and date, and the posted supplier or channel was not on it. Price the leakage against the contracted unit you could have paid, not against a should-cost model. After-the-fact review of posted maverick belongs with maverick spend detection. Do not import predicted flags from off-contract spend prediction into this line. A flag at intake is a redirect or an exception. It is not posted spend.

Should-cost and market price benchmarking tell you whether the contracted price itself is any good. That is a sourcing question for the next event. It does not rewrite last quarter's realized-price report.

Illustrative example: corrugated that looks like a win until you open the invoice

The following is an illustrative scenario, not a measured result.

A packaging lead closes a mill agreement for a standard RSC carton. The award deck compares the new contracted unit price with last year's like-for-like PO price. Plants are told to punch out the mill. In the first quarter corrugated spend is up in the taxonomy, the category tile is green, and someone wants to book the award as fully realized.

Open the invoices.

Most plants punched out the mill. Those lines match the live price. That volume can sit on the realized-savings line against the documented baseline. That is the only volume that earned the award.

One plant kept the local converter it has always used. The invoice is on a free-text PO. The carton is the same spec. That volume is off-contract leakage, priced against the mill's contracted unit, not a "partial realization" of the event.

A taxonomy recode moved "boxes, misc" out of facilities supplies and into corrugated. The corrugated cube grew. If you treat the newly visible spend as volume the event captured, you have booked a recode as a sourcing win. The money was always there. The code changed.

Intake had been flagging carton requests as likely off-catalog. A reporting analyst wants those flags in the leakage total as avoided maverick. The requests that redirected to the punchout and posted on the mill are already in realized volume. The requests that never became a PO never hit the ledger. Booking the flags double-counts or counts fiction.

Freight, damage in transit, and inventory days show up in a TCO slide the mill used in the bid. Useful when you decide whether to switch mills next year. They do not belong on the unit-price savings line next to the invoice.

Keep recodes, predictions, and TCO out of the numerator

Predicted flags stay on the intake dashboard. Leakage is a posted PO or invoice. Add intake scores to posted leakage and you count work that never happened, or you count a redirect twice: once as avoided leakage, once as realized volume.

Recodes are a count of lines and spend moved, never savings. Auto-classification, or a human recode, can move a line from a junk bucket into a managed category. Visibility improved. The contracted unit price did not change, and neither did what you paid.

TCO stays in category strategy and in the should-cost work before the next RFQ. Landed cost, quality yield, and switching cost do not belong on the unit-price line. Blend them in and nobody can tell whether a supplier invoiced the agreement or whether a model assumed a freight rate.

Also keep out of the numerator: rebates until they credit, volume-tier prices you have not earned, unmatched lines, and currency noise you have not mapped to the contract currency.

What finance will accept is boring. Three lines by category. A written match key (item, entity, date, UoM). Invoice preferred over PO. A recode appendix. No predicted flags. No single savings rate. Close the cube after AP posts, on a cadence you can repeat, not in a one-off slide the week the award was signed.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first