shopify-admin-collection-membership-audit

SkillCommerce & finance

Read-only: lists orphan products (in zero collections) and over-collected products for catalog hygiene.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the shopify-admin-collection-membership-audit skill

What this skill tells your AI

The instructions your AI receives, as published by 40rty-ai/shopify-admin-skills in skills/merchandising/shopify-admin-collection-membership-audit/SKILL.md and read by ahel’s review.

Purpose

Identifies products that are not in any collection ("orphans" — invisible in store navigation) and products that appear in an unusually high number of collections ("over-collected" — potential merchandising noise). Read-only — no mutations.

Prerequisites

  • Authenticated Shopify CLI session: shopify store auth --store <domain> --scopes read_products
  • API scopes: read_products

Parameters

ParameterTypeRequiredDefaultDescription
storestringyesStore domain (e.g., mystore.myshopify.com)
max_collectionsintegerno10Flag products in more than this many collections
status_filterstringnoactiveProduct status to scan: active, draft, or all
formatstringnohumanOutput format: human or json

Safety

ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.

Workflow Steps

  1. OPERATION: products — query Inputs: query: "status:<status_filter>", first: 250, select collections { edges { node { id } } }, pagination cursor Expected output: Products with their collection memberships; paginate until hasNextPage: false

  2. For each product: count collections → flag if 0 (orphan) or > max_collections (over-collected)

  3. OPERATION: collections — query (for collection names) Inputs: first: 250, select id, title, productsCount Expected output: Collection metadata for enriching the report

GraphQL Operations

# products:query — validated against api_version 2025-01
query ProductCollectionMembership($query: String!, $after: String) {
  products(first: 250, after: $after, query: $query) {
    edges {
      node {
        id
        title
        handle
        status
        collections(first: 30) {
          edges {
            node {
              id
              title
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
# collections:query — validated against api_version 2025-01
query CollectionOverview($after: String) {
  collections(first: 250, after: $after) {
    edges {
      node {
        id
        title
        handle
        productsCount {
          count
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

Session Tracking

Claude MUST emit the following output at each stage. This is mandatory.

On start, emit:

╔══════════════════════════════════════════════╗
║  SKILL: Collection Membership Audit          ║
║  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):

══════════════════════════════════════════════
COLLECTION MEMBERSHIP AUDIT
  Products scanned:      <n>
  Orphan products (0 collections):     <n>
  Over-collected (> <max_collections>): <n>

  Orphan products (sample):
    "<title>" — <status>
  Output: collection_audit_<date>.csv
══════════════════════════════════════════════

For format: json, emit:

{
  "skill": "collection-membership-audit",
  "store": "<domain>",
  "products_scanned": 0,
  "orphan_count": 0,
  "over_collected_count": 0,
  "output_file": "collection_audit_<date>.csv"
}

Output Format

CSV file collection_audit_<YYYY-MM-DD>.csv with columns: product_id, title, handle, status, collection_count, collections, issue

Error Handling

ErrorCauseRecovery
THROTTLEDAPI rate limit exceededWait 2 seconds, retry up to 3 times
No orphans foundAll products are in collectionsExit with ✅ no orphans found

Best Practices

  • Orphan active products are invisible in store navigation — customers can only find them via direct URL or search. Prioritize fixing these.
  • Automated collections (rule-based) may automatically pull products based on tags or conditions — an orphan in manual collections may still appear in automated ones. Check both.
  • Use max_collections: 5 for stores with a tightly curated navigation; use higher thresholds for marketplace-style stores where cross-listing is intentional.
  • Run after seasonal catalog refreshes to ensure all new products are assigned to the right collections.

Signals

GitHub stars
187
Forks
18
Last commit
Aug 2026

ahel review

  • S4info
    community integration — published by 40rty-ai, not shopify

Automated review, not a security audit. Ruleset v1.

Advanced
Catalog kind
skill
Gateway key
shopify-admin-collection-membership-audit
Source
github.com/40rty-ai/shopify-admin-skills