What this audit checks
Authentication & access
- OAuth2 client_id + client_secret still issue access_tokens against api-eu.dhl.com/auth/token (no 401)
- DHL Developer Portal API key still active and not revoked at app level
- Geschaeftskunden account number (EKP, 10-digit) maps to an active DHL Parcel rate-card
- Participation number resolves to a valid service tier within the EKP (no ‘unknown participation’)
- Sandbox vs production base URL correctly set - merchant not pointed at api-test.dhl.com in production
On-time delivery & transit
- Domestic (Inland / V01PAK) on-time delivery rate < 95% rolling 30D
- EU (V53WPAK) on-time delivery rate < 92% rolling 30D
- Average domestic transit days > 2 (DHL Parcel Inland baseline)
- Packstation locker first-attempt delivery materially below home-delivery success
Exceptions & failed deliveries
- Shipment exception rate (status = Exception) > 3% rolling 30D
- AttemptedDelivery / Refused events converting to ReturnedToSender > 2%
- Out-for-delivery shipments not Delivered same day > 5%
- Dispatch SLA breach: actual_delivery > expected_delivery on open shipments
Damaged / lost parcels
- Lost shipment rate (status = Lost) > 0.3% rolling 90D
- Damaged-parcel claim rate > 0.5%
- ReturnedToSender not attributable to a Retouren-Etikett (unexplained returns) > 1%
Tracking data completeness
- Domestic tracking-event gap > 24h with shipment still InTransit
- EU / Welt tracking-event gap > 3d (customs-blackout signal) with shipment AwaitingCustoms
- Shipments with shipment_no but zero tracking events after 48h (tracking-feed gap)
- EU cross-border CN23 customs declaration missing where customs_declaration_required = true
Cross-channel fulfilment SLA (the kill-shot area)
- Cross-channel: ecom order with no DHL shipment after 48h -> fulfilment leak per channel
- Cross-channel: Retouren-Etikett generation failure rate > 2% -> blocks German Widerruf compliance, revenue + legal risk
- Cross-channel: EU cross-border parcels stuck AwaitingCustoms > 3 days joined to sibling orders -> refund-propensity * order.total
- Cross-channel: DHL Parcel cost per zone > 10% above DPD / PostNord / Hermes sibling -> carrier renegotiation candidate
- Cross-channel: late-delivery refund-propensity * sibling.order.total by zone (Inland / EU / Welt)
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
on_time_delivery_rate | 95 | 92 |
exception_rate | 2 | 3 |
avg_transit_days | 2 | 3 |
damaged_rate | 0.3 | 0.5 |
tracking_gap_pct | 3 | 5 |
lost_rate_pct | 0.2 | 0.3 |
retouren_etikett_failure_pct | 1 | 2 |
eu_customs_hold_pct | 5 | 10 |
auth_token_failures_24h | 1 | 5 |
Data sources
POST https://api-eu.dhl.com/auth/token- OAuth2 token issuancePOST https://api-eu.dhl.com/parcel/de/shipping/v2/orders- Shipment / label creation (write-side)GET https://api-eu.dhl.com/parcel/de/tracking/v0/shipments- Tracking events (read-side, OTD + gap detection)POST https://api-eu.dhl.com/parcel/de/shipping/v2/returns- Retouren-Etikett (pre-paid return label) generation