From shopify-admin-skills
Audits Shopify catalogs for orphan products (in zero collections) and over-collected products (exceeding configurable threshold) to improve merchandising hygiene.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
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.
Audits Wix store product listings for missing descriptions, images, prices, SKUs, short descriptions; computes catalog health score using REST API curl queries and jq. Useful for quality and SEO improvements.
Scans active Shopify products, collections, and pages via GraphQL for missing or short SEO titles and meta descriptions. Outputs prioritized list of gaps sorted by traffic potential. Read-only.
Creates and manages Shopify products via GraphQL Admin API or CSV imports. Bulk import/update variants, inventory, images, assign to collections.
Share bugs, ideas, or general feedback.
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.
shopify store auth --store <domain> --scopes read_productsread_products| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| max_collections | integer | no | 10 | Flag products in more than this many collections |
| status_filter | string | no | active | Product status to scan: active, draft, or all |
| format | string | no | human | Output format: human or json |
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
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
For each product: count collections → flag if 0 (orphan) or > max_collections (over-collected)
OPERATION: collections — query (for collection names)
Inputs: first: 250, select id, title, productsCount
Expected output: Collection metadata for enriching the report
# 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
}
}
}
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"
}
CSV file collection_audit_<YYYY-MM-DD>.csv with columns:
product_id, title, handle, status, collection_count, collections, issue
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
| No orphans found | All products are in collections | Exit with ✅ no orphans found |
max_collections: 5 for stores with a tightly curated navigation; use higher thresholds for marketplace-style stores where cross-listing is intentional.