Skip to main content
Nerve Centre KPIs · Audit Profile · Sentiment Settings DPDLocal is the merchant’s UK last-mile carrier. Findings here either cost the merchant a customer (late delivery, missed Predict slot, failed pickup) or burn cash (claim ageing, premium-service spend not earning its OTD lift). Cross-references commerce siblings (Shopify / BigCommerce / Adobe Commerce) via order_ref to compute revenue-at-risk; cross-references the 3PL sibling (ShipBob) via fulfillment_id to split warehouse vs carrier accountability; cross-references the Jira sibling to surface open claims with no CS ticket coverage.

What this audit checks

Authentication & access

  • Basic Auth on /user/ still issues a GeoSession JWT (no 401)
  • GeoSession JWT cache hit-rate > 95% (re-auth churn signal)
  • Geoclient identifier valid (no ‘invalid client’ responses)
  • Sandbox vs production base URL flagged correctly

On-time delivery & SLA (the customer-promise area)

  • Carrier OTD < 95% rolling 30D (DPDLocal contracted SLA breach)
  • OTD trending down >5pp WoW (early degradation signal)
  • First-attempt delivery rate < 85% (address-quality / recipient signal)
  • Predict slot accuracy < 92% (the brand-promise window)
  • Sunday delivery success < 90% on services that support it
  • Median transit time > contracted service transit_days for 3+ days

Exceptions, claims & failed pickups

  • Exception rate > 3% rolling 30D
  • Exception spike > 2sigma vs trailing 30D baseline (sudden break)
  • Open claims unresolved > 7 days (CS coverage gap)
  • Open claims unresolved > 14 days (abandoned cash + churn risk)
  • Failed pickup rate > 3% (carrier-side relationship decay)
  • Refused-parcel rate > 1% (customer-side / address-quality signal)
  • Returned-to-sender rate > 1% rolling 30D

UK route & postcode intelligence

  • Any UK postcode-area OTD < 90% (regional weakness)
  • Highlands / NI / IoM transit time > 5 days (out-of-zone signal)
  • Single-route concentration > 80% volume (carrier dependency risk)
  • Route OTD degraded >5pp WoW for 3+ days (sustained issue)

Cost & service-mix economics

  • Avg cost / shipment up >10% vs prior period
  • Premium-service uplift (Predict / Sunday / EU) > 40% over standard
  • High-cost shipment outliers > 2x avg (investigate routing / surcharges)
  • Service-mix shift WoW: standard-share dropping >10pp (margin pressure)
  • Claim value as % of DPDLocal revenue > 2% rolling 90D

Cross-channel: revenue at risk (the kill-shot area)

  • Cross-channel: late shipments joined to commerce_sibling orders -> revenue at risk per channel
  • Cross-channel: 3PL-vs-carrier delay attribution (ShipBob warehouse_dispatch vs DPDLocal in-transit) -> who owns the late delivery
  • Cross-channel: open claims with no Jira tracker_item -> CS coverage gap (silent unhappy customers)
  • Cross-channel: late-delivery refund-propensity x sibling.order.total -> $ exposed to chargeback / churn this week
  • Cross-channel: claims aged >14d that ALSO have a Jira ticket aged >14d -> abandoned-finding loop (both sides waiting)

Severity thresholds

SignalWarnCritical
on_time_delivery_rate9590
predict_slot_accuracy9592
first_attempt_delivery9085
sunday_success_rate9290
exception_rate23
open_claims_age_days714
claim_resolution_days_median1014
failed_pickup_rate_pct23
refused_parcel_rate_pct0.51
shipping_cost_per_order_change_pct510
premium_service_uplift_pct3040
claim_value_pct_of_revenue12
region_otd_pct9290
auth_token_failures_24h15

Data sources

  • GET https://api.dpdlocal.co.uk/user/ - Auth probe + GeoSession JWT issuance
  • GET https://api.dpdlocal.co.uk/shipping/shipment - Shipment list + status (OTD, transit time)
  • GET https://api.dpdlocal.co.uk/shipping/tracking/{consignment_id} - Tracking events for late / exception detection
  • GET https://api.dpdlocal.co.uk/shipping/collection - Collection bookings + failed-pickup detection
  • GET https://api.dpdlocal.co.uk/shipping/claim - Open / settled claim list + age / value
  • GET https://api.dpdlocal.co.uk/shipping/service - Service catalogue (transit_days, supports_sunday, supports_predict)