
Shopify Admin Delivery Time Analysis
- 7 installs
- 173 repo stars
- Updated June 26, 2026
- 40rty-ai/shopify-admin-skills
shopify-admin-delivery-time-analysis is a read-only Claude Code skill that calculates average fulfillment-to-delivery transit time by carrier from Shopify fulfillment and order data.
About
This Claude Code skill analyzes fulfilled Shopify orders to compute average transit time from fulfillment creation to delivery, grouped by carrier. A fulfillment-ops user runs it to see which carriers are consistently slow or fail to confirm delivery. It is read-only and exports a per-order CSV of transit days.
- Calculates average transit time from fulfillment to delivery, broken down by carrier
- Surfaces consistently slow carriers and missing delivery confirmations
- Read-only, exporting a per-order delivery-time CSV
Shopify Admin Delivery Time Analysis by the numbers
- 7 all-time installs (skills.sh)
- Ranked #1,583 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 1, 2026 (Skillselion catalog sync)
shopify-admin-delivery-time-analysis capabilities & compatibility
Free skill; requires an authenticated Shopify store session with read_orders
- Capabilities
- delivery time analysis · carrier benchmarking · fulfillment analytics
- Use cases
- data analysis
- Runs
- Runs locally
- Pricing
- Free
What shopify-admin-delivery-time-analysis says it does
Analyzes fulfilled orders to calculate average transit time (fulfillment created → delivered) broken down by carrier.
Surfaces which carriers are consistently slow or missing delivery confirmations. Read-only — no mutations.
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-delivery-time-analysisAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7 |
|---|---|
| repo stars | ★ 173 |
| Last updated | June 26, 2026 |
| Repository | 40rty-ai/shopify-admin-skills ↗ |
What it does
Measure average Shopify delivery transit time by carrier to compare shipping performance.
Who is it for?
Fulfillment teams comparing carrier transit times and delivery-confirmation reliability
Skip if: Real-time WISMO tracking or per-package status lookups
When should I use this skill?
You want average delivery times broken down by shipping carrier
What you get
A per-carrier table of average, min, and max transit days plus a CSV.
- delivery_analysis_<date>.csv with per-order transit days
By the numbers
- days_back defaults to 30
- min_orders per carrier defaults to 5
- 2 GraphQL operations (orders, fulfillmentOrders)
Files
Purpose
Analyzes fulfilled orders to calculate average transit time (fulfillment created → delivered) broken down by carrier. Surfaces which carriers are consistently slow or missing delivery confirmations. Read-only — no mutations.
Prerequisites
- Authenticated Shopify CLI session:
shopify store auth --store <domain> --scopes read_orders - API scopes:
read_orders
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| days_back | integer | no | 30 | Lookback window for fulfilled orders |
| min_orders | integer | no | 5 | Minimum orders per carrier to include in averages |
| location_id | string | no | — | Filter by fulfillment location (optional) |
| format | string | no | human | Output format: human or json |
Safety
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
Workflow Steps
1. OPERATION: orders — query Inputs: query: "fulfillment_status:shipped created_at:>='<NOW - days_back days>'", first: 250, pagination cursor Expected output: Orders with fulfillments { createdAt, updatedAt, deliveredAt, trackingInfo { company } }; paginate until hasNextPage: false
2. Calculate transit times per carrier: deliveredAt - createdAt (skip orders where deliveredAt is null)
3. OPERATION: fulfillmentOrders — query (optional, for location breakdown) Inputs: assignedLocationId: <location_id>, status: CLOSED, first: 250 Expected output: Fulfilled orders per location for location-level segmentation
GraphQL Operations
# orders:query — validated against api_version 2025-01
query FulfilledOrders($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
createdAt
fulfillments {
id
createdAt
updatedAt
deliveredAt
status
trackingInfo {
company
number
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}# fulfillmentOrders:query — validated against api_version 2025-01
query FulfillmentOrdersByLocation($locationId: ID!, $after: String) {
fulfillmentOrders(
assignedLocationId: $locationId
first: 250
after: $after
query: "status:closed"
) {
edges {
node {
id
assignedLocation {
location {
id
name
}
}
order {
id
name
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Delivery Time Analysis ║
║ 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):
══════════════════════════════════════════════
DELIVERY TIME ANALYSIS (<days_back> days)
Orders analyzed: <n>
With delivery data: <n>
Carrier Orders Avg Days Min Max
─────────────────────────────────────────────
UPS <n> <d> <d> <d>
USPS <n> <d> <d> <d>
FedEx <n> <d> <d> <d>
(carriers below min_orders threshold excluded)
Output: delivery_analysis_<date>.csv
══════════════════════════════════════════════For format: json, emit:
{
"skill": "delivery-time-analysis",
"store": "<domain>",
"period_days": 30,
"carriers": [
{ "name": "UPS", "orders": 0, "avg_days": 0, "min_days": 0, "max_days": 0 }
],
"output_file": "delivery_analysis_<date>.csv"
}Output Format
CSV file delivery_analysis_<YYYY-MM-DD>.csv with columns: order_name, fulfillment_id, carrier, fulfilled_at, delivered_at, transit_days
Error Handling
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
deliveredAt is null | Carrier hasn't confirmed delivery | Exclude from averages, count as "in transit" |
| No fulfilled orders in window | Period too short or no orders | Exit with summary: 0 orders |
Best Practices
- Set
min_orders: 10for statistically meaningful averages — carriers with fewer orders will skew results. deliveredAtis populated only when the carrier confirms delivery via tracking events; some carriers do not report this, so null values are expected.- Run monthly to track carrier performance over time and inform carrier contract negotiations.
- Cross-reference with the
wismo-bulk-status-reportskill to correlate slow delivery carriers with WISMO ticket volume.
Related skills
FAQ
Why are some orders excluded from averages?
Orders where deliveredAt is null are excluded, because that field is only populated when the carrier confirms delivery via tracking.
How many orders per carrier are needed?
min_orders defaults to 5, and the skill recommends 10 for statistically meaningful averages.