
Shopify Admin Dead Stock Identifier
- 7 installs
- 173 repo stars
- Updated June 26, 2026
- 40rty-ai/shopify-admin-skills
shopify-admin-dead-stock-identifier is a read-only Claude Code skill that cross-references Shopify inventory levels with order velocity to flag stocked SKUs that sold zero units in a lookback window.
About
This Claude Code skill flags SKUs that have positive inventory on hand but sold zero units within a configurable lookback window, cross-referencing product variants, order line items, and inventory cost. A merchandiser runs it to find capital tied up in dead stock and prioritize markdown or clearance decisions. It is read-only and outputs a CSV ranked by tied-up value.
- Cross-references inventory levels with order velocity to flag zero-selling stocked SKUs
- Estimates dead-stock capital value using inventory unit cost
- Read-only, producing a prioritized markdown/clearance report
Shopify Admin Dead Stock Identifier 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-dead-stock-identifier capabilities & compatibility
Free skill; requires an authenticated Shopify store session with read_inventory scope
- Capabilities
- dead stock detection · inventory analysis · markdown prioritization
- Use cases
- data analysis
- Runs
- Runs locally
- Pricing
- Free
What shopify-admin-dead-stock-identifier says it does
Identifies SKUs that have positive inventory on hand but have not sold any units in a configurable lookback window.
Dead stock ties up capital, warehouse space, and carrying costs. Read-only — no mutations.
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-dead-stock-identifierAdd 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
Identify Shopify SKUs with stock but no recent sales to drive markdown and clearance decisions.
Who is it for?
Merchandisers finding dead stock and prioritizing markdown or clearance by tied-up capital
Skip if: Distinguishing slow movers that still sell occasionally, which needs a velocity report
When should I use this skill?
You need to find Shopify SKUs sitting in stock with no recent sales
What you get
A ranked list of zero-selling stocked SKUs with estimated tied-up value.
- dead_stock_<date>.csv with per-SKU tied-up cost value
By the numbers
- 3 GraphQL operations (productVariants, orders, inventoryItems)
- days_back defaults to 90
Files
Purpose
Identifies SKUs that have positive inventory on hand but have not sold any units in a configurable lookback window. Dead stock ties up capital, warehouse space, and carrying costs. Read-only — no mutations. Provides the data foundation for a markdown or clearance decision.
Prerequisites
- Authenticated Shopify CLI session:
shopify store auth --store <domain> --scopes read_products,read_orders,read_inventory - API scopes:
read_products,read_orders,read_inventory
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| days_back | integer | no | 90 | Sales lookback window — SKUs with no sales in this period are flagged |
| min_quantity | integer | no | 1 | Minimum on-hand quantity to include (exclude truly zero-stock) |
| vendor_filter | string | no | — | Optional vendor to scope the audit |
| 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: productVariants — query Inputs: first: 250, query: <vendor_filter if set>, select sku, inventoryQuantity, inventoryItem { id }, pagination cursor Expected output: All variants with stock levels; paginate until hasNextPage: false
2. Filter to variants with inventoryQuantity >= min_quantity
3. OPERATION: orders — query Inputs: query: "created_at:>='<NOW - days_back days>'", first: 250, select lineItems { variant { id }, quantity }, pagination cursor Expected output: All line items sold in the window to build a "sold variant IDs" set
4. OPERATION: inventoryItems — query Inputs: Batch of inventoryItemIds for stocked variants Expected output: Inventory item cost data for dead stock value calculation
5. Cross-reference: variants in step 2 that are NOT in the sold set from step 3 → dead stock
GraphQL Operations
# productVariants:query — validated against api_version 2025-01
query VariantsWithStock($query: String, $after: String) {
productVariants(first: 250, after: $after, query: $query) {
edges {
node {
id
sku
inventoryQuantity
product {
id
title
vendor
status
}
inventoryItem {
id
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}# orders:query — validated against api_version 2025-01
query OrderLineItemsInPeriod($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
lineItems(first: 50) {
edges {
node {
quantity
variant {
id
}
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}# inventoryItems:query — validated against api_version 2025-01
query InventoryItemCosts($ids: [ID!]!) {
nodes(ids: $ids) {
... on InventoryItem {
id
unitCost {
amount
currencyCode
}
tracked
}
}
}Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Dead Stock Identifier ║
║ 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):
══════════════════════════════════════════════
DEAD STOCK REPORT (no sales in <days_back> days)
SKUs with stock: <n>
SKUs with zero sales: <n> (<pct>%)
Est. dead stock value: $<amount>
Top dead stock by value:
"<product>" SKU: <sku> Qty: <n> Value: $<n>
Output: dead_stock_<date>.csv
══════════════════════════════════════════════For format: json, emit:
{
"skill": "dead-stock-identifier",
"store": "<domain>",
"period_days": 90,
"stocked_skus": 0,
"dead_stock_skus": 0,
"dead_stock_pct": 0,
"estimated_value": 0,
"currency": "USD",
"output_file": "dead_stock_<date>.csv"
}Output Format
CSV file dead_stock_<YYYY-MM-DD>.csv with columns: variant_id, sku, product_title, vendor, quantity_on_hand, days_since_last_sale, unit_cost, total_cost_value
Error Handling
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
| No orders in window | New store or very slow period | All stocked SKUs will be flagged — expected |
| Variant without inventory item | Bundle or virtual product | Skip inventory cost, include in list |
Best Practices
- Use
days_back: 90for seasonal products;days_back: 180ordays_back: 365for evergreen catalog. - Sort by
total_cost_valuedescending to prioritize markdown decisions by capital impact. - Cross-reference with
stock-velocity-reportto distinguish truly dead stock from slow movers that still sell occasionally. - Use results as input for a discount campaign: apply a markdown tag using
product-tag-bulk-updateand then create a clearance collection.
Related skills
FAQ
How does it define dead stock?
SKUs with on-hand quantity at or above min_quantity that had zero sales in the days_back window, which defaults to 90 days.
Does it change any inventory?
No, it is read-only and executes no mutations.