
Shopify Admin Product Lifecycle Manager
- 7 installs
- 173 repo stars
- Updated June 26, 2026
- 40rty-ai/shopify-admin-skills
shopify-admin-product-lifecycle-manager is a Claude Code skill that bulk-transitions Shopify products through DRAFT, ACTIVE, and ARCHIVED status using the Shopify Admin GraphQL API.
About
This skill queries Shopify products matching a tag, vendor, collection, or status filter and bulk-transitions them to a target status of ACTIVE, DRAFT, or ARCHIVED. Merchants use it for seasonal launches, end-of-season sunsetting, and pre-launch staging without editing products one by one in the admin. It runs against the Shopify Admin GraphQL API and defaults to a dry run so the product list can be reviewed first. It writes a CSV of every changed product.
- Bulk-transitions Shopify products through DRAFT, ACTIVE, and ARCHIVED status by tag, vendor, collection, or status filte
- Runs against the Shopify Admin GraphQL API (2025-01) via products query and productUpdate mutation
- Defaults to dry_run:true so you can preview the product list before committing status changes
Shopify Admin Product Lifecycle Manager by the numbers
- 7 all-time installs (skills.sh)
- Ranked #1,587 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 1, 2026 (Skillselion catalog sync)
shopify-admin-product-lifecycle-manager capabilities & compatibility
Free; requires an authenticated Shopify store session with read_products and write_products scopes
- Capabilities
- bulk product update · product archive · catalog management
- Works with
- github
- Use cases
- database
- Pricing
- Free
What shopify-admin-product-lifecycle-manager says it does
Bulk transition products through DRAFT → ACTIVE → ARCHIVED status for seasonal launches and sunsetting.
ARCHIVED products are hidden from all sales channels and cannot be purchased.
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-product-lifecycle-managerAdd 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
Bulk-transition a filtered set of Shopify products between DRAFT, ACTIVE, and ARCHIVED status for a seasonal launch or sunset.
Who is it for?
Seasonal launches, end-of-season sunsetting, and pre-launch staging of many products at once
When should I use this skill?
You need to activate, draft, or archive a batch of Shopify products by tag, vendor, or collection
What you get
Every product matching the filter is transitioned to the target status and logged to a CSV.
- lifecycle_update CSV with product_id, title, previous_status, new_status, vendor, tags
By the numbers
- 3 workflow steps
- 2 GraphQL operations (products query, productUpdate mutation)
Files
Purpose
Queries products matching a tag, vendor, collection, or status filter and bulk-transitions them to a target status (DRAFT, ACTIVE, or ARCHIVED). Used for seasonal launches (DRAFT → ACTIVE), end-of-season sunsetting (ACTIVE → ARCHIVED), and pre-launch staging (creating as DRAFT, activating on a date).
Prerequisites
- Authenticated Shopify CLI session:
shopify store auth --store <domain> --scopes read_products,write_products - API scopes:
read_products,write_products
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| filter | string | yes | — | Product filter query (e.g., tag:summer-2026, vendor:Nike, status:draft) |
| target_status | string | yes | — | Target status: ACTIVE, DRAFT, or ARCHIVED |
| dry_run | bool | no | true | Preview products without executing mutations |
| format | string | no | human | Output format: human or json |
Safety
⚠️ ARCHIVED products are hidden from all sales channels and cannot be purchased. ACTIVE products are immediately visible to customers. Run with dry_run: true to review the product list before committing — especially for ARCHIVED transitions which are hard to reverse in bulk.Workflow Steps
1. OPERATION: products — query Inputs: query: <filter>, first: 250, pagination cursor Expected output: Products with id, title, status, tags; paginate until hasNextPage: false
2. Filter to products NOT already in target_status — skip those already correct
3. OPERATION: productUpdate — mutation Inputs: id: <product_id>, status: <target_status> Expected output: product { id, title, status }, userErrors
GraphQL Operations
# products:query — validated against api_version 2025-01
query ProductsByFilter($query: String!, $after: String) {
products(first: 250, after: $after, query: $query) {
edges {
node {
id
title
status
vendor
tags
publishedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}# productUpdate:mutation — validated against api_version 2025-01
mutation ProductUpdateStatus($input: ProductInput!) {
productUpdate(input: $input) {
product {
id
title
status
}
userErrors {
field
message
}
}
}Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Product Lifecycle Manager ║
║ 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>If dry_run: true, prefix every mutation step with [DRY RUN] and do not execute it.
On completion, emit:
For format: human (default):
══════════════════════════════════════════════
OUTCOME SUMMARY
Products matched: <n>
Already at target: <n> (skipped)
Status updated: <n>
Errors: <n>
Output: lifecycle_update_<date>.csv
══════════════════════════════════════════════For format: json, emit:
{
"skill": "product-lifecycle-manager",
"store": "<domain>",
"started_at": "<ISO8601>",
"completed_at": "<ISO8601>",
"dry_run": true,
"filter": "<query>",
"target_status": "ACTIVE",
"outcome": {
"matched": 0,
"skipped_already_correct": 0,
"updated": 0,
"errors": 0,
"output_file": "lifecycle_update_<date>.csv"
}
}Output Format
CSV file lifecycle_update_<YYYY-MM-DD>.csv with columns: product_id, title, previous_status, new_status, vendor, tags
Error Handling
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
userErrors on productUpdate | Product locked or invalid state | Log error, skip product, continue |
| No products match filter | Filter too narrow | Exit with 0 matches, suggest broadening filter |
Best Practices
- Use tags to mark seasonal batches before running (e.g., tag products with
launch:2026-05before activating them) so the filter is precise. - ARCHIVED status removes products from all channels including the storefront, POS, and buy buttons — confirm this is the intent before running at scale.
- For large catalogs (500+ products), rate limiting will slow execution — the skill retries automatically but large batches may take several minutes.
- Pair with
product-data-completeness-scorebefore activating DRAFT products to ensure they have all required fields.
Related skills
FAQ
Is the status change reversible?
ARCHIVED products are hidden from all sales channels and hard to reverse in bulk, so the skill defaults to dry_run:true to let you review the list before committing.
How does it select which products to change?
It queries products matching a filter such as tag:summer-2026, vendor:Nike, or status:draft and skips any already at the target status.