Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
40rty-ai avatar

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)
At a glance

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
From the docs

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.
SKILL.md
Dead stock ties up capital, warehouse space, and carrying costs. Read-only — no mutations.
SKILL.md
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-dead-stock-identifier

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs7
repo stars173
Last updatedJune 26, 2026
Repository40rty-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

SKILL.mdMarkdownGitHub ↗

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

ParameterTypeRequiredDefaultDescription
storestringyesStore domain (e.g., mystore.myshopify.com)
days_backintegerno90Sales lookback window — SKUs with no sales in this period are flagged
min_quantityintegerno1Minimum on-hand quantity to include (exclude truly zero-stock)
vendor_filterstringnoOptional vendor to scope the audit
formatstringnohumanOutput 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

ErrorCauseRecovery
THROTTLEDAPI rate limit exceededWait 2 seconds, retry up to 3 times
No orders in windowNew store or very slow periodAll stocked SKUs will be flagged — expected
Variant without inventory itemBundle or virtual productSkip inventory cost, include in list

Best Practices

  • Use days_back: 90 for seasonal products; days_back: 180 or days_back: 365 for evergreen catalog.
  • Sort by total_cost_value descending to prioritize markdown decisions by capital impact.
  • Cross-reference with stock-velocity-report to 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-update and 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.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.