At a glance
Share of DPD parcels that hit at least one exception event in transit (refused, damaged, customs-held, address-incorrect, recipient-refused, undelivered-after-3-attempts, lost). The “something went wrong” rate, distinct from late (parcel arrived late) and failed (parcel never reached the customer). DPD UK runs ~1% on premium DTC vs ~3 to 5% on Evri for the same lane; the gap is what merchants pay the premium for.
| What it counts | COUNT(parcels WHERE event_log CONTAINS any of [refused, damaged, address_correction, customs_held, lost, recipient_refused, undelivered_3rd_attempt]) / COUNT(parcels). A parcel counts once even with multiple exception events. |
| Exception event taxonomy | DPD pushes 30+ status codes; the card maps these to 7 exception buckets in config/vortex_mind/manifests/dpd.yaml -> exception_buckets. |
| Tracking event semantics | DPD posts a webhook on every scan with eventCode. The card consumes the full event log per parcel; an exception state can be cleared by a subsequent successful event (e.g. address-correction then delivered) but the parcel still counts because at least one exception fired. |
| Service-level scope | All DPD services pooled (Next Day, EU Classic, Saturday, etc.). EU outbound has structurally higher exception rates (customs); pull these out with UK to EU Cross-Border Exception Rate. |
| Returns / RTO | RTO parcels (returned to sender after 3 failed attempts or refused) count as exceptions; they do not additionally count on Late Shipments or OTD. |
| Predict-slot quirk | Out-of-slot is not an exception; the parcel arrived. Slot misses surface only on Predict Slot Accuracy. |
| Geographic scope | UK domestic + DPD UK outbound to EU and rest-of-world. EU origins served by sister carriers report through their own connectors. |
| Lost-parcel sub-rate | DPD’s lost-parcel sub-bucket runs ~0.05% on premium DTC, an order of magnitude below Evri’s ~0.4%. This is where the premium price visibly earns out. |
| Peak-period degradation | Q4 typically lifts UK domestic exception rate by 0.5 to 2 pp, EU outbound by 2 to 5 pp (customs surge). |
| Time window | 30D vsP (rolling 30 days vs prior 30 days) |
| Alert trigger | >3% (gauge: good <1%, warn 1 to 3%, critical >3%) |
| Roles | owner, operations |
Calculation
Calculated automatically from your DPD data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A UK premium-DTC fashion brand (AOV £160, ~12,000 parcels / month, 8% EU outbound) ships via DPD Next Day for UK and DPD EU Classic for Europe. Reading taken at 09:00 GMT on 12 Mar 26 for the trailing 30 days.| Exception bucket | Parcels affected | Share of total |
|---|---|---|
| Address correction needed | 64 | 0.53% |
| Damaged in transit | 18 | 0.15% |
| Recipient refused | 22 | 0.18% |
| Undelivered after 3 attempts (RTO) | 41 | 0.34% |
| Customs held (EU outbound only) | 38 | 0.32% (3.95% of EU sub-population) |
| Lost (no scan in 14 days) | 6 | 0.05% |
| Total exceptions (this card) | 189 | 1.58% |
>3% alert is not tripped. Five things to notice:
- The 1.58% headline is in the expected band for premium DTC on DPD UK. Network benchmark is ~1% in normal weeks, ~1.5 to 2% in moderate-disruption periods. This is healthy.
- EU customs at 3.95% of the EU sub-population is the actionable signal. It is buried in the 1.58% headline because EU is only 8% of volume. Pull EU out using UK to EU Cross-Border Exception Rate and it dominates the conversation, the IOSS or VAT paperwork is the likely root cause.
- The 6 lost parcels is the part of the metric where the premium price earns out. At 0.05% lost rate, an Evri-equivalent lane (~0.4% lost) would have lost ~50 parcels at AOV £160 = ~£8,000 in claim exposure. DPD’s premium of ~£2 per parcel x 12,000 = ~£24,000, less than the £8k saved on lost parcels alone, before counting CS time and refund-and-resend goodwill. The maths works once AOV is high enough.
- Address-correction at 0.53% is largely customer-typed addresses at checkout. DPD’s address-validation API at label-print time can knock this down to ~0.2%; not yet enabled for this account.
- Recipient-refused at 0.18% is unusually high. Industry baseline is ~0.05 to 0.10%. Likely a sub-population (returning customer cohort or bundle SKU) where customers ordered, regretted, and refused at the door instead of using the returns flow. Cross-reference with
shopify.refund_rateand the customer-cohort filter.
Sibling cards merchants should reference together
Exception rate is the network-quality signal. Pair it with these to triage which exception type is rising and what it costs the business.| Card | Why pair it with Exception Rate | What the combination tells you |
|---|---|---|
| On-Time Delivery Rate | Different miss type. OTD measures “arrived late”; this measures “something went wrong in transit”. | High OTD + high exceptions = network is delivering, but a slice is being damaged or misrouted; ops drill-in. |
| Late Shipments | Sequential. Many late parcels (carded, redelivered) eventually become exceptions if they miss 3 attempts. | Today’s late cohort feeds tomorrow’s exception cohort. |
| Failed Deliveries | Subset overlap. Failed = 3 attempts then RTO; that lands in the exception bucket here. | Both tracking same end-state; this card is broader. |
| Open Claims | Direct financial mapping. Every claim has an underlying exception. | Claim count rises ~2 weeks after exception rate rises (customer waits, then files). |
| UK to EU Cross-Border Exception Rate | Splits EU outbound from UK domestic. | EU customs lifts the headline; isolating it reveals if UK domestic is healthy. |
| Returned to Sender | Subset, RTO is one of the exception buckets here. | Diverging trends mean the type-mix is shifting (e.g. more recipient-refused, fewer customs-held). |
Cross-connector: shopify.refund_rate | Downstream. Damaged or lost parcels become refunds. | 1 pp exception-rate rise -> ~0.3 to 0.5 pp refund-rate rise at 7 to 14 days lag. |
Cross-connector: jira.open_tickets | CS workload. Each exception roughly = 1 to 1.5 CS tickets. | Use to predict CS staffing for the upcoming week. |
Reconciling against the vendor’s own dashboard
Where to look in DPD’s own dashboard: MyDPD Business portal -> Reports -> Service Performance -> Exceptions Report, with toggles for date, exception type, and depot. The closest like-for-like view is All Exception Types, Last 30 Days, Aggregate. For per-parcel audit use Track -> Filter “Exceptions” -> Last 30 days and export as CSV. Why our number may legitimately differ from MyDPD’s portal:| Reason | Direction | Why |
|---|---|---|
| Time zone | Boundary days off | MyDPD defaults to Europe/London (BST or GMT). The card uses UTC. Boundary-day count can shift slightly. |
| Tracking-feed lag | Ours lower for last 4 to 6 hours | DPD pushes status webhooks within 5 to 30 seconds, but POD scans from rural rounds upload at end of shift. T-1 days fully reconcile. |
| Peak-period throttling | Ours lower during BFCM | Webhook queue can throttle during peak; events post 2 to 6 hours late into the index. T-2 days fully reconcile. |
| Predict-slot vs delivered timestamp | Either | MyDPD’s “Exceptions” report does not include slot misses (correctly). The card here also excludes slot misses. Some merchants confuse the two; align by checking the slot card separately. |
| Exception-bucket mapping | Either | DPD has 30+ raw event codes; the card buckets them into 7 categories. MyDPD has its own 12-category breakdown. The aggregate counts will match; the per-bucket cuts will not. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
shopify.unfulfilled_orders | Upstream. Address-incorrect exceptions correlate with bad checkout-address data. | If unfulfilled is fine but exceptions rising, look at customer-typed addresses (often a checkout-form regression). |
shopify.refund_rate | Downstream. Damaged or lost drives refunds. | 1 pp exception rise -> 0.3 to 0.5 pp refund rise at 7 to 14 days lag. |
Cross-3PL: shipbob.sb_otd_rate | Peer 3PL outcome. | Different parcel populations entirely. Do not arithmetically reconcile. |