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
| Signal | Warn | Critical |
|---|---|---|
on_time_delivery_rate | 95 | 90 |
predict_slot_accuracy | 95 | 92 |
first_attempt_delivery | 90 | 85 |
sunday_success_rate | 92 | 90 |
exception_rate | 2 | 3 |
open_claims_age_days | 7 | 14 |
claim_resolution_days_median | 10 | 14 |
failed_pickup_rate_pct | 2 | 3 |
refused_parcel_rate_pct | 0.5 | 1 |
shipping_cost_per_order_change_pct | 5 | 10 |
premium_service_uplift_pct | 30 | 40 |
claim_value_pct_of_revenue | 1 | 2 |
region_otd_pct | 92 | 90 |
auth_token_failures_24h | 1 | 5 |
Data sources
GET https://api.dpdlocal.co.uk/user/- Auth probe + GeoSession JWT issuanceGET 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 detectionGET https://api.dpdlocal.co.uk/shipping/collection- Collection bookings + failed-pickup detectionGET https://api.dpdlocal.co.uk/shipping/claim- Open / settled claim list + age / valueGET https://api.dpdlocal.co.uk/shipping/service- Service catalogue (transit_days, supports_sunday, supports_predict)