skills/fulfillment-shipping/shipment-tracking/SKILL.md
Give customers live package tracking by aggregating carrier status updates via webhooks and sending proactive delivery notifications
npx skillsauth add finsilabs/awesome-ecommerce-skills shipment-trackingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Shipment tracking lets customers follow their package from warehouse to doorstep, and proactively notifies them at key milestones (shipped, out for delivery, delivered). Most platforms send tracking emails automatically when a label is created — but a branded tracking page and proactive exception alerts (lost packages, failed delivery) require a dedicated tracking app or service.
| Platform | Recommended Tool | Why | |----------|-----------------|-----| | Shopify | AfterShip or Route | AfterShip provides a branded tracking page, proactive email/SMS notifications, and exception alerts across all carriers | | WooCommerce | AfterShip for WooCommerce or Shipment Tracking by WooCommerce | AfterShip integrates with all major carriers; the official WooCommerce extension handles basic carrier tracking | | BigCommerce | AfterShip (BigCommerce App Marketplace) or ShipStation tracking | AfterShip has a native BigCommerce integration; ShipStation also provides tracking if you use it for label creation | | Custom / Headless | EasyPost Tracker API or Shippo tracking webhooks | EasyPost and Shippo normalize tracking events across all carriers into a single webhook feed |
Shopify's built-in tracking (no extra app needed for basics):
yourstore.com/orders/[order-id]AfterShip (recommended for branded tracking + proactive notifications):
yourstore.aftership.com or you can embed it on your own domainFor Shopify Plus: Use Klaviyo to trigger shipping notification emails based on AfterShip tracking events via Klaviyo's AfterShip integration — this gives you full control over the email design and content.
Using WooCommerce Shipment Tracking (official extension):
Using AfterShip for WooCommerce:
ShipStation tracking (if using ShipStation for fulfillment):
BigCommerce's built-in tracking:
Delivery exceptions (lost packages, failed delivery attempts) need fast resolution to protect customer satisfaction.
AfterShip:
Shopify Flow (Plus):
Trigger: AfterShip tracking event received
Condition: Status is "Exception" or "Failed Attempt"
Action: Create customer service task in Gorgias or Zendesk
Action: Send internal Slack notification to #shipping-exceptions
When AfterShip or your tracking tool flags an exception:
A branded tracking page keeps customers on your site (vs. carrier sites), allows product recommendations, and reduces "where is my order" contacts.
AfterShip generates this automatically at yourstore.aftership.com. To put it on your own domain:
tracking.yourstore.com)tracking.yourstore.com to AfterShip's serverstracking.yourstore.com/[tracking-number] instead of the carrier URLEmbed tracking in your existing order status page:
For headless implementations, use EasyPost or Shippo to receive carrier webhooks and normalize tracking events:
// Register a tracking number with EasyPost to receive webhook updates
async function registerEasyPostTracker(params: {
trackingNumber: string;
carrier: string; // 'UPS', 'FedEx', 'USPS', 'DHL'
orderId: string;
}): Promise<void> {
const response = await fetch('https://api.easypost.com/v2/trackers', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.EASYPOST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
tracker: {
tracking_code: params.trackingNumber,
carrier: params.carrier,
},
}),
});
const tracker = await response.json();
// Store tracker.id to correlate future webhook events with this order
await db.shipments.update({ tracking_number: params.trackingNumber }, {
easypost_tracker_id: tracker.id,
});
}
// Receive EasyPost webhook and update order status
// POST /webhooks/easypost
async function handleEasyPostWebhook(rawBody: Buffer, signature: string): Promise<void> {
// Verify webhook signature
const expectedSig = crypto
.createHmac('sha256', process.env.EASYPOST_WEBHOOK_SECRET!)
.update(rawBody)
.digest('hex');
if (expectedSig !== signature) throw new Error('Invalid webhook signature');
const event = JSON.parse(rawBody.toString());
if (event.description !== 'tracker.updated') return;
const tracker = event.result;
const shipment = await db.shipments.findByEasyPostTrackerId(tracker.id);
if (!shipment) return;
// Normalize EasyPost status to your internal status
const statusMap: Record<string, string> = {
pre_transit: 'label_created',
in_transit: 'in_transit',
out_for_delivery: 'out_for_delivery',
delivered: 'delivered',
failure: 'exception',
return_to_sender: 'returned',
};
const normalizedStatus = statusMap[tracker.status] ?? 'in_transit';
await db.shipments.update(shipment.id, { status: normalizedStatus });
// Update order to delivered when package arrives
if (normalizedStatus === 'delivered') {
await db.orders.update(shipment.order_id, { status: 'delivered', delivered_at: new Date() });
}
// Send notification email at key milestones
if (['in_transit', 'out_for_delivery', 'delivered', 'exception'].includes(normalizedStatus)) {
await sendTrackingNotificationEmail(shipment.order_id, normalizedStatus, tracker.tracking_code);
}
}
| Problem | Solution | |---------|----------| | Customer doesn't receive shipping confirmation | Check that Shopify/WooCommerce shipping notification emails are enabled and that the customer's email address was captured at checkout | | Tracking page shows "no information available" for days | This is normal for USPS for 24–48 hours after label creation; set customer expectations in the shipping confirmation email | | Exception events not triggering alerts | Verify your AfterShip notification settings include exception types; test by using a test tracking number that simulates an exception event | | International tracking stops updating mid-journey | International handoffs between carriers often cause gaps; log the carrier's native tracking URL and fall back to it when events stop for 48+ hours |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion