Shipping notifications are the single most-opened email category in e-commerce. Customers actively look for them. And yet they land in spam surprisingly often — more often than order confirmations, because the from-address frequently changes (carrier, 3PL, fulfilment vendor), the subject line contains tracking numbers that look template-generated, and the sending IPs are shared across thousands of small shops.
The result is a support call that follows a predictable script: "I ordered three days ago and haven't heard anything. Where is my package?" The order went out. The carrier picked it up. The tracking email fired. The customer never saw it.
Why shipping mail is filtered more than confirmations
- Third-party sending identity. Many shops send confirmations from their own domain but let Shopify Shipping, ShipStation, or a 3PL send the tracking email from a different sender. Filters see this as an unrelated burst from a new party referencing the customer's recent purchase — high phishing prior.
- Tracking URLs look suspicious.
carrier-delivery.click?t=xZ8k2is a textbook phishing pattern. Legitimate carriers use these URLs too, but filters cannot tell the difference. - Volume spikes. When you ship 500 orders on a Monday, the provider sees 500 nearly-identical emails from the same IP within minutes. Rate-based heuristics trigger.
If your tracking email lands in spam on Day 1 and the customer only checks order status on Day 3 when they call support, you have manufactured a negative experience out of a perfectly successful fulfilment. Placement is a customer-experience metric, not just a marketing concern.
Measuring actual placement for shipping mail
The test has to use the actual carrier handoff. Many shops test the confirmation email but never test the tracking email, because it is triggered asynchronously by the carrier system. Two ways to instrument it:
- Seed orders. Place real test orders with seed addresses at Gmail, Outlook, Yahoo, iCloud. Let them ship. Check where tracking mail lands.
- Forward carrier webhooks. Most carriers support shipping webhooks. Add a seed BCC at the tracking-email trigger step in your ESP so each tracking mail is mirrored to seed boxes without placing a full order.
Example webhook trigger
# Shopify "orders/fulfilled" webhook hits your backend:
POST /webhooks/shopify/fulfilled
{
"order_id": 1234,
"tracking_number": "1Z999AA10123456784",
"tracking_url": "https://www.ups.com/track?t=..."
}
# Your handler sends the customer email AND a seed copy:
for seed in seeds.list(group='shipping-tracking'):
email.send(
to=seed.address,
subject=f"Your order is on the way (tracking {tracking_number})",
body=tracking_template(order_id, tracking_url)
)DNS fixes specific to shipping mail
If you let a 3PL or Shopify Shipping send on your behalf, authenticate them explicitly. Most shops never do this, which is the single biggest preventable reason tracking mail lands in spam.
- Add the carrier to SPF.
v=spf1 include:shops.shopify.com include:mail.yourshop.com ~all. Check the 10-lookup limit after adding. - Publish the carrier's DKIM selector.
shopify1._domainkey.yourshop.com CNAME shopify1.dkim.shops.shopify.com. ShipStation, EasyPost, ShipBob all have equivalents. - Confirm DMARC alignment. If the carrier sends from
noreply@shop.yourdomain.comand DKIM is signed by the carrier, you needadkim=r(relaxed) in DMARC or set up a dedicated signer.
Run a placement test on the current tracking email. Screenshot results. Ship DNS fixes. Re-test in 24-48 hours. Compare. The provider reputation lag means DNS changes may take a few days to fully reflect.
Template hygiene
Tracking emails tend to be designed by the carrier, not by you. Override the template where possible:
- Subject line. "Your order #1234 shipped — arriving Thu" reads human. "Tracking: 1Z999AA10123456784 — your shipment is in transit" reads robotic.
- Preview text. Customise it; default carrier text is often generic enough to trigger filters.
- Text version. Include the tracking link in plain text too, not just embedded in a button image.
- From name. "Acme Shop Shipping" beats "notifications-prod-2" every time.
Close the loop with support
Tag support tickets with a "tracking not received" label. Cross-reference with weekly placement tests. If a placement drop on Gmail correlates with a ticket spike 48 hours later, you have a live signal to act on. Most e-commerce teams never wire this up because the data sits in three systems.