关于 shipment-tracking
面向电商运营者与开发者的运输跟踪技能,介绍各平台的包裹状态通知、异常处理和品牌化跟踪页面。也涵盖使用 EasyPost 或 Shippo 通过 Webhook 汇总承运商事件。
主要功能
- 01配置运输节点通知
- 02创建品牌化跟踪页面
- 03监控配送异常并提醒团队
- 04通过 Webhook 汇总跟踪事件
适用场景
- 01让客户查看订单包裹进度
- 02在配送失败时通知客服团队
- 03跨 UPS、FedEx、USPS 和 DHL 汇总状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill shipment-tracking安装后在 Claude Code 中输入/shipment-tracking确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
tile.jsonevals/customer-notifications-tracking-urls-and/criteria.jsontask.mdevals/event-normalization-idempotent-storage-a/criteria.jsontask.mdevals/webhook-receiver-with-hmac-verification-/criteria.jsontask.md详细介绍
配送追踪
概述
配送追踪可让客户从仓库到家门口全程跟踪包裹,并在关键节点(已发货、派送中、已送达)主动通知客户。大多数平台会在创建运单标签时自动发送追踪邮件,但品牌化追踪页面和主动异常提醒(包裹丢失、派送失败)则需要专用的追踪应用或服务。
何时使用此技能
- 当客户需要在订单详情页实时追踪包裹时
- 当你要构建由配送里程碑事件触发的购后通知(邮件/短信)时
- 当你需要检测配送异常(包裹丢失、派送尝试失败)并触发客户服务提醒时
- 当你需要将多个承运商(UPS、FedEx、USPS、DHL)的追踪数据汇总到一个界面时
- 当你需要集成 EasyPost 或 Shippo 等承运商聚合服务,以统一处理追踪 Webhook 时
核心说明
步骤 1:确定你的平台并选择合适的追踪工具
| 平台 | 推荐工具 | 原因 |
|---|---|---|
| Shopify | AfterShip 或 Route | AfterShip 可为所有承运商提供品牌化追踪页面、主动邮件/短信通知和异常提醒 |
| WooCommerce | AfterShip for WooCommerce 或 Shipment Tracking by WooCommerce | AfterShip 可与所有主要承运商集成;WooCommerce 官方扩展可处理基本的承运商追踪 |
| BigCommerce | AfterShip(BigCommerce App Marketplace)或 ShipStation tracking | AfterShip 提供原生 BigCommerce 集成;如果你使用 ShipStation 创建运单标签,它也能提供追踪功能 |
| 自定义 / 无头架构 | EasyPost Tracker API 或 Shippo tracking webhooks | EasyPost 和 Shippo 可将所有承运商的追踪事件规范化,并汇总到单一 Webhook 源中 |
步骤 2:设置承运商追踪通知
Shopify
Shopify 内置追踪功能(基本功能无需额外应用):
- 当你为订单发货并添加追踪号码时,Shopify 会自动向客户发送一封主题为“你的订单正在运送途中”的邮件,其中包含追踪链接
- 追踪链接会跳转到承运商的网站(例如 UPS 对应 ups.com)——可以使用,但不带品牌标识
- 客户可以在
yourstore.com/orders/[order-id]查看订单状态
AfterShip(推荐用于品牌化追踪和主动通知):
- 从 Shopify App Store 安装 AfterShip(提供免费套餐)
- AfterShip 会自动检测 Shopify 中的新发货记录,并开始追踪包裹
- 在 AfterShip → Notifications 中,配置各里程碑的邮件和短信通知:
- “运输途中”——包裹离开你的仓库时
- “派送中”——配送当天
- “已送达”——确认送达
- “异常”——派送尝试失败或包裹延误
- 在 AfterShip → Tracking Page 中使用你的徽标、颜色和产品推荐自定义追踪页面
- AfterShip 的品牌化追踪页面托管在
yourstore.aftership.com,你也可以将其嵌入自己的域名
**适用于 Shopify Plus:**通过 Klaviyo 的 AfterShip 集成,使用 Klaviyo 根据 AfterShip 追踪事件触发配送通知邮件——这样你就能完全掌控邮件设计和内容。
WooCommerce
使用 WooCommerce Shipment Tracking(官方扩展):
- 从 WooCommerce.com 安装(或使用 WordPress.org 上的免费社区版本)
- 处理订单时,在 WooCommerce → Orders → [Order] → Add Tracking Number 中输入追踪号码和承运商
- WooCommerce 会向客户发送包含追踪链接的订单更新邮件
- 客户可在 My Account → Orders 中查看追踪链接
使用 AfterShip for WooCommerce:
- 从 WordPress.org 安装 AfterShip 插件
- AfterShip 会同步 WooCommerce 订单,并在添加追踪号码后开始追踪
- 在 AfterShip 仪表板 → Notifications 中配置通知邮件
- 品牌化追踪页面的工作方式与 Shopify 版本相同
ShipStation 追踪(如果使用 ShipStation 处理订单):
- 创建包含追踪链接的面单后,ShipStation 会自动向客户发送邮件
- 前往 ShipStation → Account Settings → Notifications,配置哪些承运商事件会触发邮件
BigCommerce
- 从 BigCommerce App Marketplace 安装 AfterShip Returns Center 或 AfterShip
- AfterShip 会自动与 BigCommerce 订单同步
- 在 AfterShip 仪表板中配置通知和品牌化追踪页面(同上)
BigCommerce 内置追踪:
- 将订单标记为带有追踪号码的“Shipped”后,BigCommerce 会自动发送包含追踪链接的发货确认邮件
- 前往 Store Setup → Email Templates → Shipped Email 自定义邮件内容
步骤 3:处理追踪异常
配送异常(包裹丢失、投递失败)需要快速处理,以维护客户满意度。
设置异常提醒
AfterShip:
- 前往 AfterShip → Notifications → Exceptions
- 启用向团队发送邮件提醒,适用于以下异常类型:
- “Exception”——承运商报告的问题
- “Failed Attempt”——投递失败,需要重新安排
- “Returned to Sender”——包裹正在退回
- 除了向客户发送通知,AfterShip 还可以向运营团队发送 Slack 或邮件提醒
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
响应异常
当 AfterShip 或你的追踪工具标记异常时:
- 查看承运商的原生追踪门户,获取最新状态
- 对于丢失的包裹:向承运商提交索赔(UPS、FedEx、USPS 均提供在线索赔门户)
- 对于投递失败:联系客户更新配送地址或安排自提
- 对于退回的包裹:与客户协商重新发货或退款
步骤 4:为商店添加品牌化追踪页面
品牌化追踪页面能让客户留在你的网站上(而非承运商网站),支持商品推荐,并减少“我的订单在哪里”之类的咨询。
AfterShip 会自动在 yourstore.aftership.com 生成此页面。若要使用自己的域名:
- 在 AfterShip → Tracking Page → Custom Domain 中输入子域名(例如
tracking.yourstore.com) - 添加一条 CNAME DNS 记录,将
tracking.yourstore.com指向 AfterShip 的服务器 - 更新发货确认邮件,将链接改为
tracking.yourstore.com/[tracking-number],而非承运商 URL
将追踪功能嵌入现有订单状态页面:
- 对于 Shopify:AfterShip 提供主题应用扩展,可将追踪小组件直接嵌入 Shopify 订单状态页面
- 对于 WooCommerce:AfterShip 插件会自动在 WooCommerce 的“My Account → Orders”页面添加追踪版块
步骤 5:自定义 / Headless——基于 webhook 的追踪
对于 Headless 实现,使用 EasyPost 或 Shippo 接收承运商 webhook 并规范化追踪事件:
// 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);
}
}
最佳实践
- 优先使用 Webhook,而非轮询 — 承运商的 Webhook 可近乎实时地推送更新;每隔几小时轮询一次会错过“正在派送”和“已送达”等当天发生的事件
- 主动通知异常情况 — 在客户发现延迟或配送失败之前,先发送邮件通知,将糟糕的情况转化为提升品牌形象的契机
- 从一开始就显示预计送达日期 — AfterShip 和大多数承运商会在首次扫描运单标签时提供预计送达日期(EDD);请立即在物流跟踪页面和订单确认邮件中显示
- 发现异常时通知运营团队,而不只是客户 — 为每个异常事件创建内部 Slack/邮件提醒,以便团队主动解决问题
- 对通知邮件去重 — 承运商有时会发送重复事件;请确保物流跟踪应用或自定义 Webhook 处理程序按每件货物的事件类型进行去重
常见问题
| 问题 | 解决方案 |
|---|---|
| 客户未收到发货确认 | 检查 Shopify/WooCommerce 的发货通知邮件是否已启用,以及客户的邮箱地址是否在结账时记录 |
| 物流跟踪页面连续数天显示“暂无信息” | USPS 在运单标签创建后的 24–48 小时内出现这种情况很正常;请在发货确认邮件中向客户说明预期 |
| 异常事件未触发提醒 | 确认 AfterShip 通知设置包含异常类型;使用可模拟异常事件的测试物流单号进行测试 |
| 国际物流跟踪在运输途中停止更新 | 承运商之间的国际交接经常导致信息中断;记录承运商原生的物流跟踪 URL,并在事件停止更新 48 小时以上时改用该 URL |
相关技能
- @order-fulfillment-workflow
- @returns-management
- @international-shipping
- @order-management-system
- @same-day-delivery