At a glance
Count of shipments dispatched in the last 7 days where the actual delivery date exceeded the carrier-promised delivery date, pooled across every carrier ShippyPro connected on your account. ShippyPro is a multi-carrier orchestration layer (100+ carriers across the EU), so a “late shipment” here is judged against the specific carrier and service chosen for that label, not a flat house SLA.
| What it counts | COUNT(shipments WHERE actual_delivery_date > expected_delivery_date AND ship_date >= now-7d). Each shipment is judged against its own carrier-promised delivery window, not a flat SLA. |
| Delivery success criterion | ShippyPro tracks the carrier’s POD (proof-of-delivery) status: delivered flag plus delivered_at timestamp from the carrier’s tracking API. Shipments still in_transit, out_for_delivery or exception are excluded from numerator and denominator until terminal status arrives. |
| On-time threshold | Carrier-promised expected_delivery_date is the cutoff, no grace period. ShippyPro stores the promised date at label creation from the carrier’s rate response; updates from in-transit re-estimates do not move the goalposts. |
| Returns / RTO | Returns shipments (separate Easy Return flow) and Return-to-Sender events are excluded from this count; they appear in Returned to Sender. Failed delivery attempts that eventually deliver count as late if they exceed the original promise. |
| Service level scope | All services pooled (Standard, Express, Same-Day, Economy across DHL Express, GLS, BRT, SDA, Poste Italiane, UPS, FedEx, Colissimo, etc.). Each label is judged against its own service-tier promise. Filter by carrier in OTD by Route. |
| Multi-country complexity | ShippyPro is heavily Italy/EU-focused; a “7-day late count” for a UK→IT shipment using BRT means something operationally different from a DE→DE shipment using DHL. The card pools them. Use service-mix breakdowns when comparing windows. |
| Currency | Not applicable, this is a count. Cost-impact lives in Avg Shipping Cost and Claim Value. |
| API endpoint | GET /shipments (ShippyPro v2 REST API), filtered by created_at and joined with the carrier’s tracking webhook for delivered_at. Ships rate-limit at 60 calls/minute/token. |
| Time window | 7D (rolling 7-day window) |
| Alert trigger | >5% of total shipments in the same 7D window. The trigger fires when late count divided by total shipped exceeds 5 percent. |
| Roles | owner, operations |
Calculation
Calculated automatically from your ShippyPro data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
An Italian DTC fashion brand using ShippyPro to orchestrate four carriers (BRT for IT domestic, DHL Express for EU cross-border, Poste Italiane for low-value, GLS for FR/DE/ES). Reading taken at 09:00 CET on 12 Mar 26 for the trailing 7 days (5 Mar 26 to 11 Mar 26).| Carrier | Shipments dispatched | Delivered late vs promise | Late share |
|---|---|---|---|
| BRT (IT domestic) | 1,840 | 64 | 3.5% |
| DHL Express (EU) | 920 | 28 | 3.0% |
| Poste Italiane (IT low-value) | 510 | 78 | 15.3% |
| GLS (FR/DE/ES) | 730 | 41 | 5.6% |
| All carriers (this card) | 4,000 | 211 | 5.3% |
>5% of total alert. Five things to notice:
- The carrier-mix masks where the problem actually is. Poste Italiane alone is at 15.3% late, but it is only 13 percent of volume so it drags the aggregate by less than a point. BRT at 3.5% on 46 percent of volume holds the headline down. The aggregate count of 211 does not tell you that Poste is the single intervention point. Always pair with OTD by Route and the carrier breakdown.
- The 5.3% trip is the moment to act, not after. ShippyPro’s strength is rate-shopping across carriers; the operator’s job when this card trips is to shift the next 7 days’ Poste Italiane volume to BRT or GLS in the rate-shop rules. The aggregate number signalling the trip is the trigger to pull the lever.
- EU cross-border is structurally noisier than domestic. DHL Express at 3.0% on EU traffic is healthy; if it climbs to 8 percent during a French national strike or German customs delay, that is a signal about transit conditions, not warehouse output. Read Avg Transit (days) alongside.
- Promised-date staleness during peak. ShippyPro stores the promised delivery date at label creation. If carriers declare embargoes or service downgrades mid-week (common before Italian public holidays), shipments late against the original promise may have re-estimated to “on-time” in the carrier’s own portal. The card stays strict against the original promise. Reconcile manually for the affected days.
- Not all 211 lates are ShippyPro’s fault. Address errors, customer-not-home redeliveries, customs holds for non-EU shipments to UK/CH, and warehouse pick-pack delays before label print all roll into this number. ShippyPro can only orchestrate the carrier pickup; everything pre- and post-handoff is upstream/downstream. The card flags the symptom; root-cause work happens in the carrier-mix card and warehouse cards.
Sibling cards merchants should reference together
Late Shipments is a count, not a rate; the rate is implicit in the alert. Pair with these to convert “211 lates” into action:| Card | Why pair it with Late Shipments | What the combination tells you |
|---|---|---|
| On-Time Delivery Rate | The rate counterpart, gauges the share of shipments that hit promise. | Late count climbing while OTD rate stable = volume up, structural mix unchanged. Late count climbing and OTD rate falling = network-wide degradation. |
| OTD by Route | Splits the late count across carriers and lanes. | Identifies which carrier and which destination country are dragging. ShippyPro’s value-add is rate-shopping, this is the card that justifies a re-route. |
| Shipments by Service | Volume mix per carrier service. | If a low-volume cheap service (e.g. Poste Italiane economy) is producing disproportionate lates, the rate-shop rule needs tightening. |
| Avg Transit (days) | Companion timing metric. | Late count up + avg transit days up = transit times have stretched. Late count up + avg transit days flat = promise dates were too aggressive at label print. |
| Failed Deliveries | A failed delivery attempt that eventually delivers still counts as late. | If late count and failed-delivery count rise together, the issue is recipient-availability or address-quality, not network speed. |
Cross-connector: shopify.unfulfilled_orders | Upstream cause. Slow Shopify-to-warehouse acknowledgement adds to ship-out delay, which compresses transit time and raises late count. | Climbing Shopify backlog typically precedes a 1 to 3 day spike in this card. |
Cross-connector: shopify.refund_rate | Downstream impact. Late deliveries drive refund and chargeback requests. | A 5+ percentage point share-of-late rise typically precedes a 0.5 to 1.5 point refund-rate climb at 7 to 14 days lag. |
Cross-connector: bigcommerce.unfulfilled_orders | Same upstream relationship as Shopify, for multi-channel merchants. | Watch both feed-streams when reading this card on a multi-store account. |
Reconciling against the vendor’s own dashboard
Where to look in ShippyPro’s own dashboard: ShippyPro Dashboard → Analytics → Tracking Performance → Late Deliveries (Italian/EU operators may see “Spedizioni in Ritardo”). The closest like-for-like view is Last 7 Days, All Carriers, All Services. ShippyPro also exposes a per-shipment audit at Track & Trace → Filter “Late”; each row shows promised-vs-actual delivery date with the carrier identifier. Why our number may legitimately differ from ShippyPro’s portal:| Reason | Direction | Why |
|---|---|---|
| Timezone | Boundary days off | ShippyPro portal defaults to the workspace timezone (most often Europe/Rome). The card defaults to UTC. Boundary-day shifts of up to 2 hours are normal. |
| Carrier-tracking sync lag | Ours lower for “today” | Some carriers (Poste Italiane, BRT for non-priority lanes) push tracking events on a 4 to 12 hour batch. Today’s late-count understates; T-2 days fully reconcile. |
| Promise-date staleness | Ours stricter | The card holds carriers to the promise stored at label print. The portal sometimes re-renders against the carrier’s currently-quoted ETA (re-estimated after holiday embargo declared). Differences widen during Italian/French/Spanish public-holiday weeks. |
| Returns and RTO exclusion | Ours lower | The card excludes Easy Return shipments and Return-to-Sender events. ShippyPro’s portal “Late” filter sometimes includes them depending on filter state. |
| Webhook delivery failures | Either | If the carrier webhook drops a delivered event, ShippyPro retries up to 24 hours. The card reads ShippyPro’s last-known status; portal shows the same. Persistent gap = check the carrier integration health page. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.unfulfilled_orders | Upstream input. Shopify hands orders to the warehouse; ShippyPro reads label-print-onwards. | Manual fulfilment outside ShippyPro, B2B / pre-order flows that bypass label automation. |
bigcommerce.unfulfilled_orders | Same as Shopify, for multi-channel merchants. | Same caveat. |
| Carrier-direct connectors (e.g. DHL Express, BRT) | Peer measurement of the same shipments from the carrier side. | Carriers track to their own SLA tables (zone-based transit days), not to the per-shipment promise ShippyPro stored at rate-shop. Differences are expected, not errors. |
Known limitations / merchant FAQs
ShippyPro vs sending direct to a carrier API, why does this card matter more? ShippyPro’s whole reason for existing is rate-shopping across 100+ carriers. The choice of carrier per shipment is dynamic, picked at label time by your rate-shop rules. A late-shipment count without carrier breakdown is half the story; the next click should be OTD by Route to see which carrier’s rule needs adjusting. Direct-carrier integrations do not produce this rate-shop signal because the carrier is fixed. Why is my Italian domestic late count higher than my EU cross-border count? Counter-intuitive but common. Italian last-mile is uneven: Poste Italiane and SDA economy services run looser SLAs than DHL Express EU cross-border. Many Italian DTC merchants over-route to cheap domestic services for low-value parcels and absorb the late-count tax. Worth pairing with Avg Shipping Cost to see the cost-vs-late-count trade-off. Carrier shows on-time but ShippyPro says late, which is correct? ShippyPro is correct against your rate-shop promise. The carrier scans against its own internal SLA (e.g. BRT “Bartolini” 1 to 4 working days zone-based); ShippyPro stored a per-shipment promised date at label print that may have been tighter (e.g. carrier rate response said “estimated 12 Mar”). The card uses the stored promise as truth. How does the carrier-mix change my late count? Materially. Switching 30 percent of low-value Italian volume from Poste Italiane to BRT typically drops late count 40 to 60 percent on that slice (Poste lates run 12 to 18 percent, BRT 3 to 5 percent), at the cost of 10 to 20 percent higher per-parcel charge. The decision is a margin call, not a quality call. Read this card next to Avg Shipping Cost. EU public holidays, how do I plan? Three actions. (1) Pre-publish carrier embargo dates in your rate-shop rules 2 weeks ahead (ShippyPro accepts cutoff overrides). (2) Raise the alert threshold from>5% to >8% for Italian Ferragosto week (mid-August), French strike windows, and the 23 to 31 December stretch; the dip is structural. (3) Switch any “DHL Express” rules to “DHL Express priority” during peak; the priority service prices ~30 percent higher but holds SLA when standard does not.
What about UK shipments post-Brexit?
ShippyPro handles UK as a non-EU destination with customs paperwork. Late count for IT→UK lanes is structurally higher (15 to 25 percent typical vs 3 to 5 percent for IT→DE) because customs adds 2 to 5 working days that the carrier rate response often does not predict accurately. If your UK volume is material, segment it: alert separately on UK and read Shipments by Destination to see the share.
Returns and RTO, where do they live?
Easy Return shipments and Return-to-Sender events are not in this count. They live in Returned to Sender and the open-claims flow. A failed-delivery attempt that eventually delivers does count as late if it exceeds the original promise.
Why does the alert percentage trip but the headline count seems small?
Volume sensitivity. On a 200-shipment-per-week long-tail account, >5% of total trips at 11 lates. Operationally trivial in absolute terms; statistically meaningful as a leading indicator. Adjust the alert threshold per workspace if your volume is consistently below 1k/week.