K-12
Supplier On-Time Delivery
Did the supplier deliver to your dock by the date they originally committed — at which receipt grain, against which promise, and after how much of the line arrived?
There is a reference build of this metric: the Supplier Scorecard dashboard in the showcase runs this definition over frozen, simulated data — not a live client system.
Definitions and source tables below are current to the date above — verify against current SAP, Oracle, Microsoft, Infor, and Databricks documentation before you build.
What supplier on-time delivery measures
Supplier on-time delivery is the share of eligible purchase schedules that physically reach the buying company's dock by a declared commitment date. The event is your receipt, not the supplier's ASN and not the date they say the truck left. That boundary keeps the metric tied to an event the buying company can verify.
There is no useful OTD number without a promise basis. A buyer-requested date measures whether the requirement was met; a supplier-confirmed date measures whether the supplier kept its commitment; a current confirmed date often measures whether the promise was moved before the receipt. Those are three different questions. The practice default keeps the original supplier-confirmed receipt date as the accountability clock and reports requested-date service beside it.
Partial receipts make the receipt event a second definition choice. First-receipt OTD lets one unit stop the clock. Complete-receipt OTD waits until cumulative accepted quantity reaches ordered less canceled quantity. Store both milestone dates on the fulfillment fact and choose one in the metric contract; do not let a dashboard silently switch between them.
Also answers to Supplier OTD · Vendor OTD · Purchase Order On-Time Delivery
The decision switches
Four switches. Promise basis and receipt event usually move the number more than any supplier improvement programme does.
| Switch | Settings | Practice default |
|---|---|---|
| Promise basis | Original supplier-confirmed promise · Current confirmed promise · Buyer-requested receipt date | Original supplier-confirmed receipt date, with requested-date service and promise-change rate published beside it. |
| Receipt event | First physical receipt · Cumulative receipt reaches the committed quantity | Cumulative dock receipt to ordered less canceled quantity; report first-receipt OTD only as a separate diagnostic. |
| Weighting | PO schedule line · Quantity weighted | Schedule-line OTD as the headline, with the received-quantity denominator shown beside it. |
| Tolerance window | On or before promise · Declared early/late window · Late-day grace only | Use the commercial receiving window where one exists; otherwise publish zero late-day tolerance and show early receipts separately. |
Promise basis
- dependsOriginal supplier-confirmed promise — the accountability default — snapshot it when first confirmed because most ERPs keep only the latest value
- raises the scoreCurrent confirmed promise — a late line can become on time after the promise is moved
- lowers the scoreBuyer-requested receipt date — measures the buying requirement, including gaps the supplier never accepted
Practice default Original supplier-confirmed receipt date, with requested-date service and promise-change rate published beside it.
Receipt event
- raises the scoreFirst physical receipt — a token partial delivery stops the clock even when most of the line is still missing
- lowers the scoreCumulative receipt reaches the committed quantity — the line passes only when enough accepted quantity has arrived
Practice default Cumulative dock receipt to ordered less canceled quantity; report first-receipt OTD only as a separate diagnostic.
Weighting
- dependsPO schedule line — each committed delivery schedule gets one vote and remains drillable
- dependsQuantity weighted — large schedules dominate and mix shifts can move the portfolio rate
Practice default Schedule-line OTD as the headline, with the received-quantity denominator shown beside it.
Tolerance window
- dependsOn or before promise — early receipts pass even when they create storage or cash consequences
- lowers the scoreDeclared early/late window — receipts outside either side fail; the window should come from the agreement
- raises the scoreLate-day grace only — a one- or two-day operational grace raises the score and must be printed on the tile
Practice default Use the commercial receiving window where one exists; otherwise publish zero late-day tolerance and show early receipts separately.
Formula & grain
Supplier OTD = PO schedules received within the declared window ÷ eligible PO schedules due
- Numerator
- Eligible schedules whose chosen dock-receipt milestone falls inside the declared window around the chosen promise
- Denominator
- Eligible PO schedules due in the period, after declared cancellations and exclusions
- Grain
- Purchase-order shipment schedule, rolled to supplier and period
- Note
- Aggregate receipt events to the schedule first. A receipt split is evidence for one schedule, not several denominator rows.
Common pitfalls
- Scoring against the current promise — If a late line is rescheduled before it arrives, current-promise OTD turns the miss into a pass. Snapshot the original confirmation and publish promise-change rate beside OTD.
- Using ASN or ship confirmation as the actual — Those events describe what the supplier reported, not what reached your dock. Use the receiving ledger and state whether the milestone is receive, inspect, accept, or deliver-to-inventory.
- Letting a partial receipt stop the clock — One early unit can make a thousand-unit line look on time. If first receipt matters operationally, publish it separately from the complete or accepted-quantity milestone.
- Averaging supplier percentages — A portfolio OTD is passing schedules divided by eligible schedules, not the mean of supplier rates. Show the denominator because a 100% supplier on two lines is not stronger evidence than 91% on two thousand.
- Scoring history against today's tolerance — The tolerance fields that decide what counts as in-full — SAP's EKPO overdelivery and underdelivery percentages, D365's per-module item settings — are overwritten in place, so the extract holds only the tolerance in force today. Scoring last year's receipts against it silently rewrites the rules they were received under. If the tolerance window matters to the score, snapshot the tolerances into a type-2 dimension as part of the landing.
Source tables — SAP
EKKO/EKPO identify the PO line and supplier; EKET is the schedule-line grain and holds the delivery commitment. Aggregate goods-receipt events from EKBE or MSEG back to that schedule before testing the receipt date. Snapshot the first confirmed date outside the current-state schedule if that is the chosen basis.
Source tables — JD Edwards
Source tables — Dynamics 365
PurchLine carries requested and confirmed receipt dates; the posted product-receipt journal records physical arrival. The cataloged journal is header-grain, so a production build still needs the raw receipt-line transaction underneath it to preserve PO-line grain. Pin DataAreaId on every join and NULL-wrap sentinel dates.
Source tables — Infor M3
Source tables — Oracle EBS
PO_LINE_LOCATIONS_ALL is the shipment-schedule grain and carries need-by and promised dates. RCV_TRANSACTIONS is the insert-only event ledger: filter the receiving action deliberately and net corrections and returns through the parent chain before determining when cumulative accepted quantity reached the commitment.
Source tables — Oracle Fusion
The Fusion schedule exposes NEED_BY_DATE, PROMISED_DATE, and LAST_ACCEPT_DATE explicitly. Receiving remains an event ledger rather than a balance: a receipt can write receive, inspect, deliver, correct, and return rows, so summing every transaction type double-counts it. Scope the procurement BU and receiving organization separately.
Store the components, not the ratio
Every switch above is a different way of reading the same underlying facts, so the components — quantities, dates, values, flags — are what belongs in the gold layer, never the finished percentage. Bronze keeps the source tables as extracted, silver resolves the encodings once, and gold carries a component-level fact that each variant of Supplier On-Time Delivery reads as a SELECT — the pattern worked through in full in the OTIF entry's landing pattern.