Analyze Delivery Performance
Beta/v1/core/analytics/delivery-performanceThis endpoint is idempotent. Learn more
Returns how reliably promised delivery dates were met.
Orders are counted in the period their promise came due, not the period they shipped — an order promised in March and shipped in May is March's miss. On time means the first shipment left on or before the promised date, because the promise is that the order starts moving by then; judging on the last shipment would fail an order the customer received on time in two boxes. On time in full adds that the whole ordered quantity was packed.
The denominator is orders that were due, not orders that shipped, so an order past its date and still unshipped counts against the rate rather than being held back until it moves. Excluding open orders would let a plant with a growing late backlog report perfect delivery.
Only orders carrying a ship-by commitment participate. An order with no commitment cannot be late, and counting it as on time would inflate the rate with orders nobody promised anything about — uncommitted_order_count says how many were excluded, so the gap is visible rather than silent.
Every rate is null rather than zero when nothing was due, and average lateness is measured over late orders only.
The same window is also returned sliced by customer, customer group, product line, and the rule each ship-by date came from — each ordered worst-first, and each derived from the same set of orders as the headline so a drilldown always adds up to it. by_product_line is the one exception to that: an order spanning two lines is counted under both, because a late order is late for every line on it.
Every filter is empty-means-all and they combine with AND. They narrow uncommitted_order_count too, so the excluded count always describes the same slice of the order book the rates do.
starts_atstring (date-time)The start date for the analysis period.
ends_atstring (date-time)The end date for the analysis period.
granularityoptional stringenumValues:dayweekmonthThe period to break the results down by. Defaults to week.
customer_idsoptional array of stringOnly measure orders bought by these customers. Their child accounts are included, matching how the sales analytics resolve a customer.
customer_group_idsoptional array of stringOnly measure orders whose customer sits in these groups.
product_line_idsoptional array of stringOnly measure orders containing at least one line in these product lines.
sales_rep_idsoptional array of stringOnly measure orders owned by these sales reps.
objectstringenumValues:analyze_delivery_performance_responseResource type identifier.
overalldelivery_performancenullableThe whole window as one figure.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
The same figures broken into periods, by the date each order was due.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_performanceResources in this page.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
Orders already past their promise and still unshipped, by how late they are.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_backlog_bucketResources in this page.
objectstringenumValues:delivery_backlog_bucketResource type identifier.
labelstringName of the band.
min_days_lateintegerLower bound of the band in days late.
max_days_lateintegerUpper bound in days late; 0 means unbounded.
order_countintegerOrders in the band.
unitsnumberQuantity still owed across them, which is what remains unpacked rather than what was ordered.
Every miss in the window banded by how far it missed by, shipped and unshipped alike.
The companion to average_days_late, which cannot tell "everything slips a day" from "most orders are fine and four are two months late". Those are opposite problems with opposite fixes, and one mean reports them identically.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_lateness_bucketResources in this page.
objectstringenumValues:delivery_lateness_bucketResource type identifier.
labelstringName of the band.
min_days_lateintegerLower bound of the band in days late.
max_days_lateintegerUpper bound in days late; 0 means unbounded.
order_countintegerOrders in the band, shipped and unshipped.
shipped_countintegerHow many of them have since shipped. The remainder are still owed, and are the same orders backlog counts.
unitsnumberQuantity still unpacked across the band's orders.
The same window by customer, worst first.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_breakdownResources in this page.
objectstringenumValues:delivery_breakdownResource type identifier.
keystringIdentifier of the slice — a customer, customer group, product line, or commitment source. Empty when the dimension is unset on the orders in it.
labelstringDisplay name for the slice.
performancedelivery_performancenullableThe delivery figures for it, on the same shape as the overall window.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
The same window by customer group, worst first.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_breakdownResources in this page.
objectstringenumValues:delivery_breakdownResource type identifier.
keystringIdentifier of the slice — a customer, customer group, product line, or commitment source. Empty when the dimension is unset on the orders in it.
labelstringDisplay name for the slice.
performancedelivery_performancenullableThe delivery figures for it, on the same shape as the overall window.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
The same window by product line, worst first. An order spanning two lines is counted under both — a late order is late for every line on it — so these counts sum to more than the overall total.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_breakdownResources in this page.
objectstringenumValues:delivery_breakdownResource type identifier.
keystringIdentifier of the slice — a customer, customer group, product line, or commitment source. Empty when the dimension is unset on the orders in it.
labelstringDisplay name for the slice.
performancedelivery_performancenullableThe delivery figures for it, on the same shape as the overall window.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
The same window by which rule produced each ship-by date: an explicitly promised date, the customer's lead time, their parent's, their group's, or the account default.
This is what says how much of the score rests on a default nobody deliberately set. A plant whose on-time rate is carried by account-sourced commitments is measuring itself against a number it invented.
objectstringenumValues:listResource type identifier.
page_infoobjectPagination metadata.
next_page_urlstringnullableRelative URL that fetches the next page of results.
previous_page_urlstringnullableRelative URL that fetches the previous page of results.
has_next_pagebooleanWhether more results exist after this page.
has_prev_pagebooleanWhether results exist before this page.
dataarray of delivery_breakdownResources in this page.
objectstringenumValues:delivery_breakdownResource type identifier.
keystringIdentifier of the slice — a customer, customer group, product line, or commitment source. Empty when the dimension is unset on the orders in it.
labelstringDisplay name for the slice.
performancedelivery_performancenullableThe delivery figures for it, on the same shape as the overall window.
objectstringenumValues:delivery_performanceResource type identifier.
period_startstring (date-time)nullableFirst day of the period; absent on the overall figure.
committed_order_countintegerOrders whose promised ship date fell in this period.
This is the denominator for both rates below — orders that were due, not orders that shipped. Measuring against shipments only would let unshipped late orders disappear from the score.
shipped_order_countintegerHow many of them have shipped at all.
on_time_order_countintegerHow many shipped on or before the promised date.
on_time_in_full_countintegerHow many shipped on time and complete.
late_order_countintegerHow many shipped late, plus those already past their date and still unshipped.
not_yet_shipped_countintegerHow many due in this period have not shipped at all.
These count against on-time: a promise not yet met is not a promise kept.
on_time_pctnumbernullableShare of due orders that shipped on time, as a percentage.
Null rather than zero when nothing was due, so a quiet week does not render as total failure.
on_time_in_full_pctnumbernullableShare of due orders that shipped on time and complete, as a percentage.
average_days_latenumbernullableAverage days late, over late orders only.
Averaging over every order would dilute a real problem into a number that looks fine.
average_lead_time_daysnumbernullableAverage days from issue to first shipment, over orders that have shipped.
average_committed_lead_time_daysnumbernullableAverage lead time these orders were promised.
The gap between this and average_lead_time_days is what a lead time is renegotiated on.
uncommitted_order_countintegerIssued orders in the window carrying no ship-by date, excluded from every rate above.
Reported so the exclusion is visible: a delivery score computed over half the order book, silently, is worse than one that says which half. A non-zero count here means orders placed before commitments were tracked still need a ship-by date.
Responses
Successful response for Analyze Delivery Performance