At a glance
The 90-day shape of on-time-delivery, plotted as a daily line. Same numerator and denominator as the On-Time Delivery Rate gauge, but rendered as a trend so a structural slide is visible against a one-week blip.
| What it counts | Daily rolling on-time-delivery percentage: COUNT(shipments delivered on or before estimated_delivery_date in day D) / COUNT(shipments with actual_delivery_date in day D). Each day is one point on the line. |
| API endpoint | GET /shipment (Shipments API v2), bucketed by actual_delivery_date day. The card builds 90 daily aggregates from the same shipment payload as the rate card. |
| DC scope | Aggregated across every DC, same as the rate card. Per-DC trend is not in this card; pivot to SLA Compliance by Warehouse for a DC-level slice. |
| Shipping-method scope | All methods pooled. Standard, Expedited, Overnight, 2-Day, Ground are weighted by their daily volume. A spike in Expedited volume on one day can move the trend if Expedited has a different on-time profile. |
| Inventory-split semantics | One delivery per shipment, same as the rate card. A multi-DC split order contributes one point per shipment to its delivery day. |
| Perfect-order definition | This card is on-time-only, not perfect-order. See Operational Health Score for the composite. |
| SLA definition | Per-shipment estimated_delivery_date from the carrier transit-time table, not a flat merchant-set “5-day SLA”. 1-day to 5-day promise depends on DC-to-customer zone. |
| Peak-period seasonality | The 90-day window almost always crosses peak boundaries. A line read in January will include 23 to 31 December (peak tail) and a week of January (recovery). Read the slope, not just the headline. Q4 typically sees a 5 to 15 point dip from Q3 baseline, recovering across mid to late January. |
| API rate limits | 200 requests / minute / token, same as the rate card. Trend rebuild for 90 days takes about 25 minutes for a 100k-shipment merchant; the card uses incremental webhook updates after first sync. |
| Time window | 90D (rolling 90-day daily series) |
| Alert trigger | <90%, the on_time_delivery_rate sentiment trips when any single day in the recent window drops below 90 percent. |
| Roles | owner, operations |
Calculation
Calculated automatically from your ShipBob data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
The same US DTC skincare brand from the OTD Rate card, reading the 90-day trend on 12 Mar 26 (window 12 Dec 25 to 11 Mar 26). The line crosses peak season, recovery, and steady state.| Window | Daily on-time average | Daily shipment volume | Note |
|---|---|---|---|
| 12 Dec 25 to 24 Dec 25 | 78.4% | 1,840 / day | Pre-Christmas crunch, carrier networks saturated, DC overtime. |
| 25 Dec 25 to 31 Dec 25 | 84.1% | 740 / day | Post-Christmas low volume, but Boxing Week sale and gift-card-redemption orders. |
| 1 Jan 26 to 14 Jan 26 | 89.6% | 980 / day | Recovery period, capacity returns to normal, residual inventory mis-positioning. |
| 15 Jan 26 to 28 Feb 26 | 93.7% | 620 / day | Steady state, three DCs balanced, no weather events. |
| 1 Mar 26 to 11 Mar 26 | 92.8% | 580 / day | Steady state continues, matches the OTD Rate gauge headline of 92.8%. |
- The Q4 trough is structural and predictable. A 78.4% daily average across mid-December is 14 percentage points below steady-state. Most DTC brands using ShipBob, FBA, or any 3PL will see a dip of similar magnitude. Do not read the December dip as a process problem; read it as the seasonal cost of operating in Q4.
- The recovery curve takes 4 to 6 weeks, not days. From the 25 Dec low, the brand needed until mid-January to break 90 percent again. The lag is real: returned-from-customer items need to flow back through DCs, mis-positioned inventory gets rebalanced, post-holiday-staff layoffs reduce capacity, and the customer mix shifts from gifters (often shipping to a different state than the buyer) to direct buyers.
- The 25 Dec to 31 Dec mini-recovery is misleading. Volume crashes that week, so even a small absolute count of late shipments looks worse-or-better at a percentage level. Watch volume alongside the percentage.
- Steady-state shape is the benchmark. Mid-January through end-of-February is the merchant’s “true” rate (93.7%). Use this number, not the trailing 30D, when setting SLA promises and customer-facing copy.
- The early-March dip from 93.7 to 92.8 is noise, not signal. A 0.9-point shift on 580 daily shipments is well within day-to-day variation. Wait for a 2 to 3 percentage-point deviation across 5+ days before acting.
Sibling cards merchants should reference together
On-time-delivery trend is the long-shape view. Pair it with these to read the slope correctly:| Card | Why pair it with On-Time Delivery Trend | What the combination tells you |
|---|---|---|
| On-Time Delivery Rate | The 30D point estimate behind the trend. | The trend tells you the slope; the gauge tells you the current level. A flat trend with a low gauge means structural under-performance, not a slipping problem. |
| SLA Compliance by Warehouse | Trend per DC, breakdown of the aggregate. | If the aggregate trend dips but two DCs are flat, the third DC is dragging. Per-DC slope identifies the real source. |
| Average Shipping Time | Trend of warehouse-floor performance. | Rising shipping time precedes dropping on-time rate by 1 to 3 days. Use shipping time as the leading indicator. |
| Carrier Performance | Carrier-mix shifts can move the trend without any DC change. | If UPS Ground rates degrade nationally, the trend dips while DC operations are clean. |
| Pending Fulfilment Backlog | Backlog drives next-day-out shipping time. | A persistent backlog spike will show up in this trend 4 to 7 days later. |
Cross-connector: shopify.unfulfilled_orders | Upstream order pressure. | Sustained Shopify backlog correlates with ShipBob on-time-rate dropping 3 to 5 days later. |
Cross-connector: shopify.refund_rate | Downstream impact. | A sustained on-time-rate dip in this trend predicts a refund-rate climb 7 to 14 days later. |
| Cross-connector: customer NPS / returns rate | Downstream sentiment. | Brand NPS surveys often correlate with the slope of this trend at a 2-to-3-week lag. |
Reconciling against the vendor’s own dashboard
Where to look in ShipBob Merchant Portal: ShipBob Merchant Portal → Analytics → Performance → On-Time Delivery → Trend tab. The portal renders the same daily series with togglable DC and method filters. Use All DCs, All Methods, Last 90 Days to compare like-for-like. Why our number may legitimately differ from ShipBob’s portal:| Reason | Direction | Why |
|---|---|---|
| Timezone (UTC default) | Boundary days off | ShipBob portal and the card both default to UTC; merchants who switched portal to local time will see day-edge shifts at the start and end of the window. |
| DC-level vs aggregated reporting | Either | Portal’s trend tab defaults to aggregated; the card aggregates by default. If the merchant has a DC chip selected in the portal, numbers diverge. |
| SLA definition variance (carrier vs ShipBob vs merchant) | Either | Same as the rate card, ShipBob’s estimated_delivery_date is the truth source; carrier scans and merchant-set checkout SLAs may differ. |
| Peak-period batch-processing delays | Ours lower for “today” | Q4 webhook lag of 4 to 12 hours; T-2 fully reconciles. The most-recent point on the trend may be conservative. |
| Daily aggregation granularity | Smoothed | The card shows daily; the portal optionally shows hourly. Hourly is noisier but better for incident-response work. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.unfulfilled_orders | Upstream pressure leads on-time rate by 2 to 6 hours (sync) plus 3 to 5 days (operational lag). | Webhook delivery failures, B2B / pre-order flow that bypasses ShipBob, batch-processing pauses. |
| Amazon FBA on-time delivery | Peer 3PL, independent population. | Amazon-only orders; most multichannel merchants run both with no expected agreement between the two. |
| Customer NPS / Klaviyo post-purchase survey | Downstream sentiment, lag 7 to 21 days. | Survey response bias; customers who had a great delivery experience are more likely to respond. |
Known limitations / merchant FAQs
ShipBob vs FBA, can I compare the trend lines? Not as a like-for-like, since the underlying order populations are different. FBA’s on-time number is for Amazon-marketplace orders; ShipBob’s is for direct-to-consumer orders on Shopify, BC, Adobe, marketplace direct-merchant flows. Watch each trend separately and use them to decide channel-level inventory allocation, not to declare one 3PL “better”. How does ShipBob choose which DC ships my order, and does it affect the trend? ShipBob’s order-routing engine picks the closest DC with all line-item stock. If the inventory split across DCs is unbalanced, more orders ship from a far DC, transit time stretches, and the trend slopes down. The signal is “are we hitting >80% closest-DC ship rate?” (see Warehouse Proximity); the trend is the consequence of that allocation. Why does the trend dip when the carrier tracking shows everything delivered on time? SLA definition variance. The carrier’s “on-time” tracks against its own zone-based transit-time table, which can be looser than ShipBob’s per-shipmentestimated_delivery_date. If the merchant set tighter promises in checkout copy, ShipBob will mark a shipment late even when UPS reports it on-time at the carrier level. Three definitions exist (carrier, ShipBob, merchant); the trend uses ShipBob’s.
Perfect-order vs on-time-shipping vs on-time-delivery, which is in this trend?
On-time-delivery only, the customer-facing leg. On-time-shipping is the warehouse-floor leg (parcel left the DC by cutoff). Perfect-order combines four legs: right product + on-time + no damage + no return-due-to-error. This trend is one of the four.
How do I plan for Q4 / BFCM peak using this trend?
Read last year’s curve. The 78 to 84 percent Q4 trough is structural; do not target your normal 92 to 95 percent level during peak. Three pre-season actions: pre-position inventory in 3 DCs by mid-October, negotiate carrier rate-and-capacity holds, set customer expectations in checkout copy (“delivered by 23 December if ordered by 18 December”). Track the trend through January to see how fast you recover.
Multi-DC inventory split, how do I optimise it from this trend?
The aggregate trend is too coarse for split decisions. Pivot to SLA Compliance by Warehouse to find the lagging DC, then to Warehouse Proximity to see whether the lag is a “shipping from too-far-a-DC” problem (rebalance inventory) or a “shipping speed at the right DC” problem (more staffing). The trend confirms whether your fix worked, but does not prescribe it.
How do returns appear in this trend?
They do not. The trend scores outbound shipments; returns flow through a separate Returns module (Return Rate). A late delivery that triggers a return still counts as one late point on this trend and one return on the returns card.
Why does ShipBob show the parcel as shipped but Shopify still says “unfulfilled”?
Webhook sync lag. ShipBob fires shipment.created to Shopify; the receiving Shopify app processes it within seconds normally, but during Q4 and BFCM the app queue can lag 4 to 12 hours. If the gap is over 24 hours, check Shopify Admin → Apps → ShipBob → Connection health; webhook retries may be silently failing. Shopify unfulfilled_orders appears artificially high during this lag.
The trend looks fine but customers are complaining about late deliveries, why?
Three usual reasons. (1) Customer perception of “late” is tighter than ShipBob’s estimated_delivery_date; checkout copy may be over-promising. (2) The trend is volume-weighted; a small number of high-value or high-visibility late shipments hurt brand reputation while the percentage stays high. Pair with Delayed Orders for the absolute count. (3) Customers complain about the slowest 5 percent, not the average; consider the p95 delivery time, not just the headline.