From shopify-admin-skills
Calculates days-of-supply and sell-through rate per SKU and location using Shopify GraphQL queries for replenishment planning.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
Calculates two critical replenishment metrics for every stocked SKU:
Flags Shopify SKUs with positive inventory but no sales in configurable days via GraphQL queries on variants, orders, and inventory items. Identifies dead stock tying up capital.
Manages Wix Stores inventory via REST API: query all items, retrieve product stock, update quantities for products and variants. Enables ABC analysis patterns and slow-mover detection.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
Share bugs, ideas, or general feedback.
Calculates two critical replenishment metrics for every stocked SKU:
Read-only — no mutations.
shopify store auth --store <domain> --scopes read_products,read_orders,read_inventoryread_products, read_orders, read_inventory| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| days_back | integer | no | 30 | Sales window for velocity calculation |
| dos_alert_threshold | integer | no | 14 | Flag SKUs with fewer than this many days of supply |
| vendor_filter | string | no | — | Optional vendor to scope report |
| format | string | no | human | Output format: human or json |
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
OPERATION: productVariants — query
Inputs: first: 250, select sku, inventoryQuantity, inventoryItem { id }, pagination cursor
Expected output: All variants with on-hand quantities; paginate until hasNextPage: false
OPERATION: orders — query
Inputs: query: "created_at:>='<NOW - days_back days>'", first: 250, select lineItems { variant { id }, quantity }, pagination cursor
Expected output: Units sold per variant in the window
OPERATION: inventoryItems — query
Inputs: Batch by inventory item IDs for stocked variants
Expected output: Cost and tracked status per item
Calculate per SKU:
daily_velocity = units_sold / days_backdays_of_supply = on_hand / daily_velocity (∞ if velocity = 0)sell_through_rate = units_sold / (units_sold + on_hand) × 100# productVariants:query — validated against api_version 2025-01
query VariantsForVelocity($query: String, $after: String) {
productVariants(first: 250, after: $after, query: $query) {
edges {
node {
id
sku
inventoryQuantity
product {
id
title
vendor
}
inventoryItem {
id
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# orders:query — validated against api_version 2025-01
query SalesVelocityData($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
lineItems(first: 50) {
edges {
node {
quantity
variant {
id
sku
}
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# inventoryItems:query — validated against api_version 2025-01
query InventoryItemDetails($ids: [ID!]!) {
nodes(ids: $ids) {
... on InventoryItem {
id
sku
unitCost {
amount
currencyCode
}
tracked
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Stock Velocity 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):
══════════════════════════════════════════════
STOCK VELOCITY REPORT (<days_back>-day window)
SKUs analyzed: <n>
Critical (< <threshold> DoS): <n>
Healthy (≥ <threshold> DoS): <n>
Zero velocity (no sales): <n>
Critical SKUs:
"<product>" SKU: <sku> DoS: <n>d Velocity: <n>/day
Output: velocity_<date>.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "stock-velocity-report",
"store": "<domain>",
"period_days": 30,
"dos_alert_threshold": 14,
"skus_analyzed": 0,
"critical_count": 0,
"healthy_count": 0,
"zero_velocity_count": 0,
"output_file": "velocity_<date>.csv"
}
CSV file velocity_<YYYY-MM-DD>.csv with columns:
variant_id, sku, product_title, vendor, on_hand, units_sold, daily_velocity, days_of_supply, sell_through_pct, alert
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
| Zero velocity for all SKUs | No orders in window | Flag all stocked SKUs as "no sales"; check date window |
| Variant without inventory item | Bundle or virtual product | Skip inventory data, calculate velocity from orders only |
days_back: 30 works well for fast movers; use days_back: 90 for slower-moving or seasonal products.dead-stock-identifier workflow — if they've had no sales for 90+ days with stock on hand, consider markdown or discontinuation.