> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vortexiq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# EasyPost audit profile, Vortex IQ

> What the Vortex IQ EasyPost health audit checks: EasyPost: Multi-Carrier OTD, Rate-Shop Integrity & Cross-Channel Fulfilment SLA

**[Nerve Centre KPIs](/nerve-centre/kpi-cards/easypost) · [Audit Profile](/nerve-centre/kpi-cards/easypost/audit) · [Sentiment Settings](/nerve-centre/kpi-cards/easypost/sentiment)**

EasyPost is a multi-carrier abstraction layer - one unified API over 100+ carriers (USPS, FedEx, UPS, DHL, Canada Post and more). The audit value is not a single carrier's promise but the rate-shop choices and the per- underlying-carrier OTD that EasyPost surfaces. Findings either cost a customer (tracking-event gap, exception, lost or damaged parcel) or expose rate-shop drift (a carrier that EasyPost keeps picking but that underperforms its cost prediction). Cross-references commerce siblings via order\_ref / tracking\_code, sibling carrier manifests (royal\_mail, fedex, dpd) via tracking\_number for rate-shop validation, and klaviyo profiles via customer\_email for proactive CS outreach.

## What this audit checks

### Authentication & access

* GET /v2/users returns 200 with the api\_key as HTTP Basic username (no 401 - key not revoked)
* Production key (EZAK prefix) in use where expected, not a test key (EZTK) leaking into live rate shops
* GET /v2/carrier\_accounts shows >0 accounts with credentials\_complete=true (rate shop has carriers to choose from)
* Per-key rate-limit headroom healthy - no sustained 429s against the 600/min default quota

### On-time delivery & transit

* Overall OTD \< 95% across delivered shipments rolling 30D
* Per-underlying-carrier OTD \< 90% on any carrier (renegotiation / deprioritise signal)
* Avg transit days drifting up >1 day vs prior period on any carrier/zone lane
* Tracker reaching status=delivered later than expected\_delivery on >5% of shipments

### Exceptions & failed deliveries

* Tracker exception rate > 3% rolling 30D (status in failure / error / return\_to\_sender)
* return\_to\_sender rate > 2% on any underlying carrier
* Carrier failover events (rate-shop rejection by primary carrier) spiking >5 in 24h - usually credential expiry
* available\_for\_pickup shipments not collected within carrier hold window (silent failed delivery)

### Damaged / lost parcels

* Refund (POST /v2/refunds) rate as proxy for lost/undeliverable > 1% rolling 30D
* Shipments stuck in\_transit with no terminal event > 10 days (presumed-lost signal)
* Damaged-parcel claim rate (return\_to\_sender + refund cluster) > 0.5% on any carrier
* Refund status=rejected rate > 20% (claims not being honoured by underlying carrier)

### Tracking data completeness

* Shipments with tracking\_code=null after label creation > 0 (untrackable parcel)
* Trackers with tracking-event gap >24h while status not in (delivered, return\_to\_sender, failure)
* tracking\_event.source (underlying carrier) missing on >2% of events (attribution gap)
* Webhook tracker updates lagging GET /v2/trackers poll by >6h (stale dashboard signal)

### Cross-channel fulfilment SLA (the kill-shot area)

* Cross-channel: ecom order (bigcommerce / shopify / adobe\_commerce) has no matching EasyPost shipment after 48h via order\_ref -> dispatch leak
* Cross-channel: shipment actual\_delivery > expected\_delivery joined to sibling.order.total -> revenue at risk per channel
* Cross-channel: cost-per-parcel by zone >10% above direct-carrier sibling (royal\_mail / fedex / dpd) -> rate-shop drift
* Cross-channel: return\_to\_sender shipments joined to customer\_email -> klaviyo proactive CS outreach candidates

## Severity thresholds

| Signal                         | Warn | Critical |
| ------------------------------ | ---- | -------- |
| `on_time_delivery_rate`        | 95   | 90       |
| `exception_rate`               | 2    | 3        |
| `avg_transit_days`             | 5    | 7        |
| `damaged_rate`                 | 0.5  | 1        |
| `tracking_gap_pct`             | 5    | 10       |
| `carrier_failover_24h`         | 3    | 5        |
| `rate_shop_latency_p95_ms`     | 1500 | 2000     |
| `return_to_sender_pct`         | 1    | 2        |
| `refund_rejected_pct`          | 10   | 20       |
| `credentials_incomplete_count` | 0    | 1        |
| `auth_token_failures_24h`      | 1    | 5        |

## Data sources

* `GET https://api.easypost.com/v2/users` - Auth probe + account validation (api\_key as Basic username)
* `GET https://api.easypost.com/v2/shipments` - Shipment list - carrier, service, rate\_amount, status, zone
* `POST https://api.easypost.com/v2/shipments` - Rate-shop call (rate latency p95, carrier failover, label generation)
* `GET https://api.easypost.com/v2/trackers` - Tracking events - OTD, exceptions, event-gap, source carrier
* `GET https://api.easypost.com/v2/carrier_accounts` - Linked carriers + credentials\_complete flag
* `POST https://api.easypost.com/v2/refunds` - Refund/lost-parcel proxy signal
