mcpField
S
shipment-tracking

shipment-tracking

github.com/finsilabs其他60180 次安装6 天前更新
代码仓库

关于 shipment-tracking

面向电商运营者与开发者的运输跟踪技能,介绍各平台的包裹状态通知、异常处理和品牌化跟踪页面。也涵盖使用 EasyPost 或 Shippo 通过 Webhook 汇总承运商事件。

主要功能

  1. 01配置运输节点通知
  2. 02创建品牌化跟踪页面
  3. 03监控配送异常并提醒团队
  4. 04通过 Webhook 汇总跟踪事件

适用场景

  1. 01让客户查看订单包裹进度
  2. 02在配送失败时通知客服团队
  3. 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.json
evals/customer-notifications-tracking-urls-and/
criteria.json
task.md
evals/event-normalization-idempotent-storage-a/
criteria.json
task.md
evals/webhook-receiver-with-hmac-verification-/
criteria.json
task.md

详细介绍

配送追踪

概述

配送追踪可让客户从仓库到家门口全程跟踪包裹,并在关键节点(已发货、派送中、已送达)主动通知客户。大多数平台会在创建运单标签时自动发送追踪邮件,但品牌化追踪页面和主动异常提醒(包裹丢失、派送失败)则需要专用的追踪应用或服务。

何时使用此技能

  • 当客户需要在订单详情页实时追踪包裹时
  • 当你要构建由配送里程碑事件触发的购后通知(邮件/短信)时
  • 当你需要检测配送异常(包裹丢失、派送尝试失败)并触发客户服务提醒时
  • 当你需要将多个承运商(UPS、FedEx、USPS、DHL)的追踪数据汇总到一个界面时
  • 当你需要集成 EasyPost 或 Shippo 等承运商聚合服务,以统一处理追踪 Webhook 时

核心说明

步骤 1:确定你的平台并选择合适的追踪工具
平台推荐工具原因
ShopifyAfterShip 或 RouteAfterShip 可为所有承运商提供品牌化追踪页面、主动邮件/短信通知和异常提醒
WooCommerceAfterShip for WooCommerce 或 Shipment Tracking by WooCommerceAfterShip 可与所有主要承运商集成;WooCommerce 官方扩展可处理基本的承运商追踪
BigCommerceAfterShip(BigCommerce App Marketplace)或 ShipStation trackingAfterShip 提供原生 BigCommerce 集成;如果你使用 ShipStation 创建运单标签,它也能提供追踪功能
自定义 / 无头架构EasyPost Tracker API 或 Shippo tracking webhooksEasyPost 和 Shippo 可将所有承运商的追踪事件规范化,并汇总到单一 Webhook 源中
步骤 2:设置承运商追踪通知
Shopify

Shopify 内置追踪功能(基本功能无需额外应用):

  1. 当你为订单发货并添加追踪号码时,Shopify 会自动向客户发送一封主题为“你的订单正在运送途中”的邮件,其中包含追踪链接
  2. 追踪链接会跳转到承运商的网站(例如 UPS 对应 ups.com)——可以使用,但不带品牌标识
  3. 客户可以在 yourstore.com/orders/[order-id] 查看订单状态

AfterShip(推荐用于品牌化追踪和主动通知):

  1. 从 Shopify App Store 安装 AfterShip(提供免费套餐)
  2. AfterShip 会自动检测 Shopify 中的新发货记录,并开始追踪包裹
  3. 在 AfterShip → Notifications 中,配置各里程碑的邮件和短信通知:
    • “运输途中”——包裹离开你的仓库时
    • “派送中”——配送当天
    • “已送达”——确认送达
    • “异常”——派送尝试失败或包裹延误
  4. 在 AfterShip → Tracking Page 中使用你的徽标、颜色和产品推荐自定义追踪页面
  5. AfterShip 的品牌化追踪页面托管在 yourstore.aftership.com,你也可以将其嵌入自己的域名

**适用于 Shopify Plus:**通过 Klaviyo 的 AfterShip 集成,使用 Klaviyo 根据 AfterShip 追踪事件触发配送通知邮件——这样你就能完全掌控邮件设计和内容。

WooCommerce

使用 WooCommerce Shipment Tracking(官方扩展):

  1. 从 WooCommerce.com 安装(或使用 WordPress.org 上的免费社区版本)
  2. 处理订单时,在 WooCommerce → Orders → [Order] → Add Tracking Number 中输入追踪号码和承运商
  3. WooCommerce 会向客户发送包含追踪链接的订单更新邮件
  4. 客户可在 My Account → Orders 中查看追踪链接

使用 AfterShip for WooCommerce:

  1. 从 WordPress.org 安装 AfterShip 插件
  2. AfterShip 会同步 WooCommerce 订单,并在添加追踪号码后开始追踪
  3. 在 AfterShip 仪表板 → Notifications 中配置通知邮件
  4. 品牌化追踪页面的工作方式与 Shopify 版本相同

ShipStation 追踪(如果使用 ShipStation 处理订单):

  • 创建包含追踪链接的面单后,ShipStation 会自动向客户发送邮件
  • 前往 ShipStation → Account Settings → Notifications,配置哪些承运商事件会触发邮件
BigCommerce
  1. 从 BigCommerce App Marketplace 安装 AfterShip Returns Center 或 AfterShip
  2. AfterShip 会自动与 BigCommerce 订单同步
  3. 在 AfterShip 仪表板中配置通知和品牌化追踪页面(同上)

BigCommerce 内置追踪:

  • 将订单标记为带有追踪号码的“Shipped”后,BigCommerce 会自动发送包含追踪链接的发货确认邮件
  • 前往 Store Setup → Email Templates → Shipped Email 自定义邮件内容
步骤 3:处理追踪异常

配送异常(包裹丢失、投递失败)需要快速处理,以维护客户满意度。

设置异常提醒

AfterShip:

  1. 前往 AfterShip → Notifications → Exceptions
  2. 启用向团队发送邮件提醒,适用于以下异常类型:
    • “Exception”——承运商报告的问题
    • “Failed Attempt”——投递失败,需要重新安排
    • “Returned to Sender”——包裹正在退回
  3. 除了向客户发送通知,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 或你的追踪工具标记异常时:

  1. 查看承运商的原生追踪门户,获取最新状态
  2. 对于丢失的包裹:向承运商提交索赔(UPS、FedEx、USPS 均提供在线索赔门户)
  3. 对于投递失败:联系客户更新配送地址或安排自提
  4. 对于退回的包裹:与客户协商重新发货或退款
步骤 4:为商店添加品牌化追踪页面

品牌化追踪页面能让客户留在你的网站上(而非承运商网站),支持商品推荐,并减少“我的订单在哪里”之类的咨询。

AfterShip 会自动在 yourstore.aftership.com 生成此页面。若要使用自己的域名:

  1. 在 AfterShip → Tracking Page → Custom Domain 中输入子域名(例如 tracking.yourstore.com)
  2. 添加一条 CNAME DNS 记录,将 tracking.yourstore.com 指向 AfterShip 的服务器
  3. 更新发货确认邮件,将链接改为 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

评论

支持 Markdown