用途
该技能聚合近期订单的履约记录,将其与每笔订单的配送线路(shipping line)关联,对承运商进行横向对比,比较维度包括:(a) 平均运输天数,(b) 准时率(在客户可见预计送达时间前或当天送达),(c) 每单运费。它会揭示在特定区域、路线或重量段下哪个承运商更适合作为默认选择。该技能为只读操作,不执行任何变更。
前置条件
- 已认证的 Shopify CLI 会话:
shopify store auth --store <domain> --scopes read_orders - API 权限范围:
read_orders
参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| store | string | 是 | — | 店铺域名(例如 mystore.myshopify.com) |
| days_back | integer | 否 | 60 | 已履约订单的回溯窗口 |
| min_orders | integer | 否 | 10 | 纳入对比的每个承运商最低订单数 |
| segment_by | string | 否 | — | 可选分段维度:country、weight 或 none |
| format | string | 否 | human | 输出格式:human 或 json |
安全性
该技能为只读,不执行任何变更,可随时安全运行。成本数据使用的是客户支付的配送线路价格,而非你与承运商协商的费率;若需了解真实成本差异,需自行叠加承运商发票数据。
工作流程
-
orders — 查询
- 输入:
query: "fulfillment_status:shipped created_at:>='<NOW - days_back days>'",first: 250,选取fulfillments { trackingInfo, createdAt, deliveredAt, inTransitAt }、shippingLine { carrierIdentifier, originalPriceSet, title }、totalWeight、shippingAddress、分页游标 - 预期输出:带配送线路与履约时间信息的已履约订单;持续分页直到
hasNextPage: false
- 输入:
-
fulfillments — 查询(针对缺少内联数据的订单,按履约 ID 逐个查询)
- 输入:
id: <fulfillmentGid> - 预期输出:详细事件、
deliveredAt、estimatedDeliveryAt
- 输入:
-
按承运商分组(优先使用
shippingLine.carrierIdentifier,否则解析trackingInfo.company)。对每个承运商计算:平均运输天数、P90 运输天数、准时率(deliveredAt <= estimatedDeliveryAt)、平均运费、订单数。 -
若设置了
segment_by,则在每个分段内重复分组(例如按shippingAddress.countryCode)。 -
过滤掉低于
min_orders的承运商,并按平均运输天数升序排序。
GraphQL 操作
# orders:query — validated against api_version 2025-01
query OrdersForCarrierComparison($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
createdAt
totalWeight
shippingAddress {
countryCode
provinceCode
zip
}
shippingLine {
carrierIdentifier
title
code
originalPriceSet {
shopMoney {
amount
currencyCode
}
}
}
fulfillments {
id
createdAt
inTransitAt
deliveredAt
estimatedDeliveryAt
status
trackingInfo {
company
number
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# fulfillments:query — validated against api_version 2025-01
query FulfillmentDetail($id: ID!) {
fulfillment(id: $id) {
id
status
createdAt
inTransitAt
deliveredAt
estimatedDeliveryAt
trackingInfo {
company
number
url
}
events(first: 50) {
edges {
node {
status
happenedAt
message
}
}
}
}
}
会话跟踪
Claude 必须在每个阶段输出以下内容,这是强制要求。
开始时输出:
╔══════════════════════════════════════════════╗
║ SKILL: Carrier Performance Comparison ║
║ Store: <store domain> ║
║ Started: <YYYY-MM-DD HH:MM UTC> ║
╚══════════════════════════════════════════════╝
每步之后输出:
[N/TOTAL] <QUERY|MUTATION> <OperationName>
→ Params: <brief summary of key inputs>
→ Result: <count or outcome>
完成时输出:
对于 format: human(默认):
══════════════════════════════════════════════
CARRIER PERFORMANCE (<days_back> days)
Orders analyzed: <n>
With delivery data: <n>
Carrier Orders Avg Days P90 On-Time% Avg Cost
──────────────────────────────────────────────────────────
<carrier> <n> <d> <d> <pct>% $<n>
<carrier> <n> <d> <d> <pct>% $<n>
Output: carrier_performance_<date>.csv
══════════════════════════════════════════════
对于 format: json,输出:
{
"skill": "carrier-performance-comparison",
"store": "<domain>",
"period_days": 60,
"orders_analyzed": 0,
"carriers": [
{
"name": "UPS",
"orders": 0,
"avg_transit_days": 0,
"p90_transit_days": 0,
"on_time_pct": 0,
"avg_cost": 0,
"currency": "USD"
}
],
"output_file": "carrier_performance_<date>.csv"
}
输出格式
CSV 文件 carrier_performance_<YYYY-MM-DD>.csv,包含列:
carrier, segment, orders, avg_transit_days, p90_transit_days, on_time_pct, avg_cost, total_cost, currency
错误处理
| 错误 | 原因 | 恢复方式 |
|---|---|---|
| THROTTLED | 超出 API 速率限制 | 等待 2 秒,最多重试 3 次 |
| deliveredAt 为 null | 承运商未确认送达 | 从运输时间平均值中排除,计为“运输中” |
| estimatedDeliveryAt 为 null | 承运商未提供预计送达时间 | 从准时率中排除,不惩罚该承运商 |
| carrierIdentifier 与 trackingInfo.company 均为 null | 无跟踪信息的手动履约 | 归入 (unknown) 桶,单独呈现数量 |
最佳实践
- 仅在
min_orders >= 10时对比承运商;样本更小则噪声较大。 - 国际对比时使用
segment_by: country——在国内表现强的承运商跨境可能较弱。 - 可将此技能与 delivery-time-analysis 搭配使用以获得仅时间维度的视图;本技能额外增加了成本与准时维度。
- 运输时间优秀但成本较高的承运商,若客户看重速度(高客单价店铺)仍可能胜出——可将此报告与面向客户的 NPS 或评价数据叠加分析。
- 在合同审查窗口期按季度运行,用数据而非直觉来支持承运商谈判。