From shopify-admin-skills
Compares delivery times and shipping costs across carriers used in Shopify fulfillments, segmented by country or weight class. Informs carrier mix and contract decisions.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-admin-skills:shopify-admin-carrier-performance-comparisonThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Aggregates fulfillments across recent orders, joins them to the shipping line on each order, and compares carriers head-to-head on (a) average transit days, (b) on-time rate (delivered before/at the customer-facing estimate), and (c) shipping cost per order. Surfaces which carrier is the right default per zone, route, or weight class. Read-only — no mutations.
Aggregates fulfillments across recent orders, joins them to the shipping line on each order, and compares carriers head-to-head on (a) average transit days, (b) on-time rate (delivered before/at the customer-facing estimate), and (c) shipping cost per order. Surfaces which carrier is the right default per zone, route, or weight class. Read-only — no mutations.
shopify store auth --store <domain> --scopes read_ordersread_orders| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| days_back | integer | no | 60 | Lookback window for fulfilled orders |
| min_orders | integer | no | 10 | Minimum orders per carrier to include in comparison |
| segment_by | string | no | — | Optional segmentation: country, weight, or none |
| format | string | no | human | Output format: human or json |
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time. Cost data uses the shipping line price the customer paid, not your negotiated carrier rate; if you want true cost variance you must overlay carrier invoices yourself.
OPERATION: orders — query
Inputs: query: "fulfillment_status:shipped created_at:>='<NOW - days_back days>'", first: 250, select fulfillments { trackingInfo, createdAt, deliveredAt, inTransitAt }, shippingLine { carrierIdentifier, originalPriceSet, title }, totalWeight, shippingAddress, pagination cursor
Expected output: Fulfilled orders with shipping line and fulfillment timing; paginate until hasNextPage: false
OPERATION: fulfillments — query (per fulfillment ID for any order missing inline data)
Inputs: id: <fulfillmentGid>
Expected output: Detailed events, deliveredAt, estimatedDeliveryAt
Group by carrier (use shippingLine.carrierIdentifier if present, else parse trackingInfo.company). For each carrier compute: avg transit days, p90 transit days, on-time rate (deliveredAt <= estimatedDeliveryAt), avg shipping price, order count.
If segment_by is set, repeat the group within each segment (e.g., per shippingAddress.countryCode).
Filter out carriers below min_orders and sort by avg transit days ascending.
# 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 MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Carrier Performance Comparison ║
║ Store: <store domain> ║
║ Started: <YYYY-MM-DD HH:MM UTC> ║
╚══════════════════════════════════════════════╝
After each step, emit:
[N/TOTAL] <QUERY|MUTATION> <OperationName>
→ Params: <brief summary of key inputs>
→ Result: <count or outcome>
On completion, emit:
For format: human (default):
══════════════════════════════════════════════
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
══════════════════════════════════════════════
For format: json, emit:
{
"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 file carrier_performance_<YYYY-MM-DD>.csv with columns:
carrier, segment, orders, avg_transit_days, p90_transit_days, on_time_pct, avg_cost, total_cost, currency
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
deliveredAt is null | Carrier did not confirm delivery | Exclude from transit-time average, count as "in transit" |
estimatedDeliveryAt is null | Carrier did not provide an ETA | Exclude from on-time rate, do not penalize carrier |
carrierIdentifier and trackingInfo.company both null | Manual fulfillment without tracking | Bucket as (unknown), surface count separately |
min_orders >= 10; smaller samples are noise.segment_by: country for international comparisons — a carrier strong domestically may be weak across borders.delivery-time-analysis for the time-only view; this skill adds cost and on-time dimensions.npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsCalculates average transit time from fulfillment creation to delivery by carrier using Shopify order and fulfillment data. Read-only analysis for identifying slow or unreliable carriers.
Activate for: logistics, carrier, freight, shipping, route, delivery, on-time delivery, OTD carrier, logistics performance, carrier review, freight cost, cost per kg, lane analysis, route optimisation, logistics brief, carrier scorecard, logistics KPI, shipping performance, freight audit, expedited freight, premium freight, mode of transport, logistics network, carbon emissions, Scope 3 logistics. NOT for: supply network facility placement (use network-design), vendor assessment (use vendor-assessment), spend category analysis (use spend-analysis).
Manages Wix e-commerce shipping rules via REST APIs: query rates, retrieve details, create rates with costs, regions, logistics, and conditions like free shipping over subtotal. For store shipping configuration.