Data AnalyticsDomain analytics and business cases

Supplier delivery performance with promised-date changes

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 20 September 2026 · 3 min read
Technically reviewed by Ishaan Sharma
In this article (5 sections)

On-time delivery depends on which promise you compare with the actual receipt. If a supplier moves a promised date after missing it, a dashboard using only the latest date can make the same delivery appear on time. Preserve promise history and report the reference date explicitly.

Original-promise adherence and adherence to an accepted revised plan can both be useful. They answer different questions and should not silently replace one another.

Inspect the promise history

The synthetic purchase orders and promise history describe four orders originally due in January 2026. Evaluate them at the end of January 31.

OrderOriginal dueLatest promise by cutoffFull receiptOriginal on time?Latest on time?
PO1January 10January 12January 12NoYes
PO2January 10January 10January 9YesYes
PO3January 15January 18January 16NoYes
PO4January 20January 25Still openNoNo

PO1's promise changed on January 11, after its original due date. PO3's revision was recorded earlier, on January 12, with a buyer-accepted reason label. Those distinctions deserve visibility even though both improve the latest-promise score.

Keep the due-order population fixed

sql
WITH ranked_promises AS (
 SELECT po_id,promised_date,recorded_at,
 ROW_NUMBER() OVER(PARTITION BY po_id ORDER BY recorded_at DESC) AS rn
 FROM promise_history WHERE recorded_at<'2026-02-01'
)
SELECT p.po_id,p.original_due,h.promised_date,p.received_at,
 CASE WHEN p.received_at IS NOT NULL AND p.received_at<'2026-02-01'
           AND p.received_at<=p.original_due THEN 1 ELSE 0 END AS original_on_time,
 CASE WHEN p.received_at IS NOT NULL AND p.received_at<'2026-02-01'
           AND p.received_at<=h.promised_date THEN 1 ELSE 0 END AS latest_on_time
FROM purchase_orders p JOIN ranked_promises h ON h.po_id=p.po_id AND h.rn=1
WHERE p.original_due>='2026-01-01' AND p.original_due<'2026-02-01'
ORDER BY p.po_id;

The original-promise result is one of four orders, or 25%. The latest-promise result is three of four, or 75%. The denominator remains the same four originally due orders.

python
from build_and_verify import database

db = database()
result = []
for po,supplier,units,original,received in db.execute('SELECT * FROM purchase_orders ORDER BY po_id'):
    latest = db.execute("SELECT promised_date FROM promise_history WHERE po_id=? AND recorded_at<'2026-02-01' ORDER BY recorded_at DESC LIMIT 1",(po,)).fetchone()[0]
    observed = received is not None and received<'2026-02-01'
    result.append((po,int(observed and received<=original),int(observed and received<=latest)))
db.close()
assert result == [('PO1',0,1),('PO2',1,1),('PO3',0,1),('PO4',0,0)]
assert sum(r[1] for r in result)/len(result)==.25
assert sum(r[2] for r in result)/len(result)==.75
print(result)

If the report included only received orders, PO4 would disappear. Latest-promise performance would then appear to be 100%, concealing the open overdue order. A received-order cohort can be a legitimate separate report, but it should not be mislabeled as performance for all orders due.

Define receipt and tolerance rules

In this fixture, a recorded receipt means the whole order was received. Real orders can arrive in parts. An order-level on-time-in-full measure needs quantities and the date full required quantity was reached; a line-level or quantity-weighted measure answers another question.

Also decide whether early delivery is acceptable, whether a grace period applies, and whether the promise refers to dispatch or arrival. SAP's on-time delivery documentation illustrates that systems may use a designated statistics-relevant date. Match the configured business rule before comparing a warehouse calculation with an ERP score.

Preserve reasons without inventing responsibility

A buyer-requested reschedule may be operationally different from an unapproved supplier delay. Keep the change reason, recording time and acceptance evidence where available. A reason label alone does not establish the full causal story or contractual responsibility.

For historical reporting, use only promise revisions known by the historical cutoff. A later edit must not leak into a supposedly as-of score. Version the report if corrected source data restate a past result.

Exercise: add a promise revision recorded in February for PO4. Confirm that January's latest-promise calculation remains unchanged. Then add partial receipts and define the first date the full order becomes complete.

NeuraPath's Data Analytics with Generative AI course connects SQL history tables with operational measures. A reliable supplier report preserves the promise, the due population and the evidence behind any revision.

Continue learning

This article is part of the Domain analytics and business cases sequence. Use the neighbouring tasks when you need the prerequisite or the next application.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.

This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.

Explore Data Analytics with Generative AI
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.