From shopify-admin-skills
Queries Shopify GraphQL API to break down revenue by fulfillment location from orders and fulfillments. Useful for multi-warehouse P&L and location performance analysis.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
Attributes order revenue to the fulfillment location that shipped the order. Produces a revenue breakdown by warehouse or fulfillment center, useful for multi-location P&L, location staffing decisions, and understanding where demand is being fulfilled from. Read-only — no mutations.
Generates read-only Shopify sales reports breaking down revenue, units sold, and AOV by channel (Online Store, POS, Draft Orders, etc.) via GraphQL queries.
Queries Wix orders via REST API with filters for date ranges, payment/fulfillment status, value; supports revenue, trend, cohort analysis.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Attributes order revenue to the fulfillment location that shipped the order. Produces a revenue breakdown by warehouse or fulfillment center, useful for multi-location P&L, location staffing decisions, and understanding where demand is being fulfilled from. 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 | 30 | Lookback window |
| format | string | no | human | Output format: human or json |
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
OPERATION: locations — query
Inputs: first: 50, active only
Expected output: Location IDs and names for enrichment
OPERATION: orders — query
Inputs: query: "fulfillment_status:shipped created_at:>='<NOW - days_back days>'", first: 250, select fulfillments { assignedLocation }, totalPriceSet, pagination cursor
Expected output: Fulfilled orders with location attribution
OPERATION: fulfillmentOrders — query (for open orders attribution)
Inputs: Per location, status: CLOSED, first: 250
Expected output: Closed fulfillment orders for revenue attribution
Aggregate revenue by location; orders without location data attributed to "Unknown"
# locations:query — validated against api_version 2025-01
query LocationsList {
locations(first: 50, includeInactive: false) {
edges {
node {
id
name
}
}
}
}
# orders:query — validated against api_version 2025-01
query RevenueByLocation($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
createdAt
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
fulfillments {
assignedLocation {
location {
id
name
}
}
status
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# fulfillmentOrders:query — validated against api_version 2025-01
query ClosedFulfillmentOrders($locationId: ID!, $after: String) {
fulfillmentOrders(
assignedLocationId: $locationId
first: 250
after: $after
query: "status:closed"
) {
edges {
node {
id
order {
id
name
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Revenue by Location Report ║
║ 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):
══════════════════════════════════════════════
REVENUE BY LOCATION (<days_back> days)
Total revenue: $<amount>
Orders included: <n>
Location Orders Revenue Share
─────────────────────────────────────────────────
Warehouse A <n> $<n> <pct>%
Warehouse B <n> $<n> <pct>%
Output: revenue_by_location_<date>.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "revenue-by-location-report",
"store": "<domain>",
"period_days": 30,
"total_revenue": 0,
"currency": "USD",
"by_location": [],
"output_file": "revenue_by_location_<date>.csv"
}
CSV file revenue_by_location_<YYYY-MM-DD>.csv with columns:
location_id, location_name, order_count, total_revenue, currency, share_pct
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
| Order with no fulfillment location | Unfulfilled or POS order | Attribute to "Unassigned" |
| Single-location store | All revenue from one location | Report still valid, shows full total |