How to Actually Track 3PL Performance (Since Shopify Can't)
Shopify knows exactly when your 3PL handed packages to the carrier. It tracks delivery confirmations. It even monitors in-transit delays.
The data exists. You just can’t see it without building something custom.
Here’s what Shopify actually tracks, what’s still missing, and why “just check Shopify” doesn’t work for monitoring 3PL performance.
What Shopify Actually Tracks Now
As of September 2025, Shopify added a new CARRIER_PICKED_UP status to fulfillment events. Combined with existing tracking data, here’s what Shopify knows:
Fulfillment Events Shopify Tracks:
- LABEL_PURCHASED: Your 3PL bought a shipping label
- LABEL_PRINTED: Label was printed (not the same as shipped)
- CONFIRMED: 3PL marked the order fulfilled in their system
- CARRIER_PICKED_UP: Carrier scanned the package at pickup (the key timestamp)
- IN_TRANSIT: Package is moving through carrier network
- OUT_FOR_DELIVERY: Package is on delivery vehicle
- DELIVERED: Customer received the package
- ATTEMPTED_DELIVERY: Delivery was attempted but failed
- DELAYED: Carrier flagged a delay
See full list of FulfillmentEventStatus values
Timestamps Available:
createdAt: When the fulfillment record was created in ShopifyhappenedAt: When the event actually occurred (this is the one that matters)estimatedDeliveryAt: Carrier’s delivery estimate
The data is rich. CARRIER_PICKED_UP is the actual handoff moment. The difference between order creation and that pickup timestamp? That’s your 3PL’s fulfillment speed.
The Two Problems: Missing Data and No Way to Use It
Here’s where it breaks down. Shopify built the plumbing, but the pipes are often empty.
Problem 1: Most 3PLs Don’t Send Complete Data
Even though Shopify supports all these events, your 3PL might only send a few:
- Basic integrations: Many 3PLs only mark orders “fulfilled” when they print a label. No CARRIER_PICKED_UP event. No IN_TRANSIT updates. Just “fulfilled” and maybe a tracking number.
- Carrier data gaps: CARRIER_PICKED_UP depends on carriers reporting pickup scans. Regional carriers or international shipping often lack this data entirely.
- Legacy systems: Older WMS platforms weren’t built to send granular fulfillment events. They meet minimum requirements and stop there.
So those 11 event types? You might only see 2-3 per order. The rest just never get populated.
Problem 2: Even When Data Exists, You Can’t Use It
For the events that do get sent, Shopify stores them but doesn’t turn them into actionable metrics.
What you can’t do in Shopify:
- Calculate handoff time - Shopify won’t show you “order received → carrier pickup” as a number
- Track performance over time - No charts showing if your 3PL is getting faster or slower
- Compare locations - If you use multiple 3PLs, you can’t compare their speed
- Set up alerts - No notifications when handoff times exceed your SLA
- Detect mispicks - Carrier weight data exists but isn’t compared to expected weights
- Monitor inventory accuracy - Can’t track sync issues or discrepancies over time
You can see individual fulfillment events by digging into the Order page, clicking through to fulfillment details, and scrolling through the timeline. But that’s it. One order at a time. No aggregation. No trends. No alerts.
The Metrics That Matter (But Shopify Doesn’t Show)
Here’s what you actually need to monitor 3PL performance:
1. Handoff Time (Order Created → Carrier Pickup)
This is your 3PL’s core metric. How long from order placement to carrier scan?
The data exists:
- Order
createdAttimestamp - FulfillmentEvent with
CARRIER_PICKED_UPstatus and itshappenedAttimestamp
What Shopify doesn’t do:
- Calculate the delta between these timestamps
- Show you P50, P95 percentiles across orders
- Alert you when times exceed thresholds
- Break it down by product, location, or time of day
2. Label Generation Lag (Fulfilled → Carrier Pickup)
When your 3PL marks an order fulfilled vs. when the carrier actually scans it. This catches “label and wait” behavior where packages sit after being “shipped.”
The data exists:
- Fulfillment
createdAtorCONFIRMEDevent CARRIER_PICKED_UPevent
What Shopify doesn’t do:
- Flag excessive gaps (more than 4 hours suggests problems)
- Track this metric over time
- Compare across different 3PLs or locations
3. Delivery Promise Accuracy
Did the package arrive when the carrier said it would?
The data exists:
estimatedDeliveryAtfrom carrierDELIVEREDevent with actual delivery timestamp
What Shopify doesn’t do:
- Calculate on-time delivery percentage
- Track early vs late deliveries
- Factor this into 3PL performance scoring
4. In-Transit Issues
Delays, attempted deliveries, or exceptions during shipping.
The data exists:
DELAYEDeventsATTEMPTED_DELIVERYevents
What Shopify doesn’t do:
- Aggregate these by 3PL to see if one provider has more carrier issues
- Alert you when exception rates spike
- Track root causes (wrong address, damaged package, etc.)
Why This Matters: The Label Generation Problem
Here’s a real example of why you need more than Shopify’s UI:
Your 3PL reports 95% same-day fulfillment. Looks great in their dashboard. But when you dig into the actual timestamps:
- 2:00 PM: Order placed
- 3:30 PM: 3PL marks order “fulfilled” (generates label)
- 11:45 AM next day: Carrier pickup scan (CARRIER_PICKED_UP event)
Your 3PL counts this as “same day” because they created the label before midnight. But the package didn’t actually move for 21 hours.
Shopify has both timestamps. But you’d have to manually check each order to catch this pattern.
What You’d Need to Build (Or Buy)
To actually use Shopify’s fulfillment data for 3PL monitoring, you need:
1. Webhook Listeners
Subscribe to fulfillments/create and fulfillment_events/create webhooks to capture events as they happen.
2. Data Warehouse
Store events over time so you can calculate trends and percentiles.
3. Metric Calculations
Write code to:
- Calculate handoff time from order to carrier pickup
- Compute P50/P95 percentiles across time windows
- Compare performance across locations
- Detect anomalies and outliers
4. Alerting System
Notify you when:
- Handoff times exceed thresholds
- Performance degrades week-over-week
- Specific locations underperform
- Exception rates spike
5. Reporting UI
Dashboards to visualize:
- Performance trends over time
- Location comparisons
- Order-level drill-downs
- SLA compliance rates
This isn’t trivial. It’s weeks of development work, ongoing maintenance, and infrastructure costs.
The Workarounds (What Merchants Actually Do)
Without custom tooling, here’s how merchants try to monitor 3PL performance:
Manual Order Sampling
Pick 20-30 orders per week. Manually check timestamps. Calculate handoff time in a spreadsheet. This works for spot checks but misses systematic issues.
3PL-Provided Reports
Ask your 3PL for weekly performance reports. Hope they’re measuring the right things and being honest. Cross-reference against a few Shopify orders to verify.
Carrier Performance Only
Track delivery times from carrier data. This tells you about UPS/FedEx but says nothing about your 3PL’s handoff speed.
React to Customer Complaints
Wait for customers to complain about slow shipping. Investigate after the fact. Not ideal.
None of these are systematic. None catch problems before customers feel them.
What’s Actually Missing from Shopify
Even with all the fulfillment events, some data still doesn’t exist:
Not tracked by Shopify:
- Inventory cycle count accuracy - You can see inventory levels but not how often adjustments happen
- Mispick detection - Carrier weight data isn’t exposed or compared to expected weights
- Pick/pack/ship breakdowns - No timestamps for individual warehouse steps
- Cost per order - Fulfillment fees aren’t tracked in Shopify
- Return processing speed - Returns are tracked but processing time isn’t calculated
These would require your 3PL to send additional data or integrate more deeply.
The Bottom Line
Shopify has made huge progress with fulfillment tracking. The CARRIER_PICKED_UP event is exactly what’s needed to measure 3PL performance accurately.
But two problems remain:
- Most 3PLs don’t send complete event data through Shopify’s APIs
- Even when data exists, Shopify doesn’t calculate or surface the metrics you need
If you’re serious about monitoring 3PL performance, you need to either:
- Build custom tools to process Shopify’s webhook data and fill gaps with direct integrations
- Use an app that does this for you
The infrastructure exists. The data is often incomplete. And the metrics aren’t calculated anywhere in Shopify’s UI.
3PL Pulse integrates directly with major 3PLs like ShipBob and Amazon FBA to get complete data, not just what flows through Shopify. We calculate handoff time, track performance trends, and alert you when 3PLs miss SLAs. For 3PLs with deep integrations, we get data that Shopify never sees. For everyone else, we extract every bit of signal from Shopify’s events and fill in the gaps.
But first, at least now you know what data Shopify actually has and why you can’t just “check the admin.”