agentsclimarketplace

Woo product lifecycle manager

Skill navarroido/Woocommerce-skill/skills/merchandising/woo-product-lifecycle-manager

Move products between draft, pending, private, and publish statuses in bulk based on age or sales thresholds with dry-run preview.From its SKILL.md

Install
npx -y skills add navarroido/Woocommerce-skill --skill woo-product-lifecycle-manager

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

6.0 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

woo-product-lifecycle-manager

Purpose

Automate WooCommerce product lifecycle transitions: archive slow-moving products to draft, publish pending products that meet criteria, or move discontinued items to private status. Filters by product age, days since last sale, or zero-sale count. Includes dry-run preview before any status changes.

Prerequisites

  • WooCommerce store with REST API enabled
  • Consumer Key with Read/Write scope
  • Minimum WooCommerce version: 3.5.0

Parameters

ParameterTypeRequiredDefaultDescription
store_urlstringyes—Base URL of the WooCommerce store
consumer_keystringyes—WooCommerce REST API consumer key (ck_...)
consumer_secretstringyes—WooCommerce REST API consumer secret (cs_...)
dry_runboolnotruePreview changes without executing
formatstringnohumanOutput format: human or json
source_statusstringyes—Current product status: publish, draft, pending, private
target_statusstringyes—New status to apply
filter_no_sales_daysintno—Only include products with no sales in last N days
filter_min_age_daysintno—Only include products created at least N days ago
category_idintno—Limit to this category

Authentication

WooCommerce uses OAuth 1.0a for HTTP and Basic Auth over HTTPS.

For HTTPS stores (recommended):

Authorization: Basic base64(consumer_key:consumer_secret)

For HTTP stores (development only): Use OAuth 1.0a — include oauth_consumer_key, oauth_nonce, oauth_signature, oauth_signature_method=HMAC-SHA1, oauth_timestamp, oauth_version=1.0

Never log or output consumer_key or consumer_secret values.

See docs/AUTHENTICATION.md for full setup instructions.

Safety

Step 3 changes product visibility. Drafting or privatizing published products removes them from the storefront immediately. Always run with dry_run: true first (the default). Verify the product list carefully.

Workflow Steps

Step 1 — Fetch products in source_status

GET /wp-json/wc/v3/products
  ?status=<source_status>&per_page=100&page=1
  [&category=<category_id>]

Filter client-side by date_created for filter_min_age_days.

Step 2 — Check sales for each product (if filter_no_sales_days set)

GET /wp-json/wc/v3/orders
  ?status=completed&after=<now - filter_no_sales_days days>&per_page=100&page=1

Build set of product IDs with recent sales. Exclude these from the transition list.

Step 3 — Preview or execute

If dry_run: true: output transition preview table and stop.

If dry_run: false and confirmed:

PUT /wp-json/wc/v3/products/{id}
  Body: { "status": "<target_status>" }

API Endpoints Used

GET  /wp-json/wc/v3/products         — products in source status
GET  /wp-json/wc/v3/orders           — sales check for filter_no_sales_days
PUT  /wp-json/wc/v3/products/{id}    — update product status

Pagination Strategy

WooCommerce REST API uses page/per_page pagination (not cursor-based).

Standard pattern:

page = 1
while True:
  response = GET /endpoint?per_page=100&page=page
  process(response)
  if len(response) < 100: break
  page += 1

Maximum per_page is 100 for most endpoints. The X-WP-Total and X-WP-TotalPages response headers report totals. Always read X-WP-TotalPages on the first request to estimate job size.

Session Tracking

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

STARTUP:

╔══════════════════════════════════════════╗
║  SKILL: woo-product-lifecycle-manager    ║
║  STORE: <store_url>                      ║
║  TIME:  <ISO-8601 UTC>                   ║
║  MODE:  <DRY RUN | LIVE>                 ║
╚══════════════════════════════════════════╝

PER-OPERATION (emit after each API call batch):

[N/TOTAL] <METHOD> <endpoint> → <result_count> records | params: <key>=<val>

COMPLETION (human format):

╔══════════════════════════════════════════╗
║  COMPLETE: woo-product-lifecycle-manager ║
║  RECORDS PROCESSED: <n>                  ║
║  OUTPUT: stdout                          ║
╚══════════════════════════════════════════╝

COMPLETION (json format):

{
  "skill": "woo-product-lifecycle-manager",
  "store": "<store_url>",
  "completed_at": "<ISO-8601>",
  "records_processed": <n>,
  "output_file": null,
  "dry_run": <bool>
}

Output Format

Human format: table listing product ID, name, current status, new status, and filter criteria matched.

Error Handling

ErrorCauseResolution
401 UnauthorizedInvalid credentialsVerify consumer_key and consumer_secret
403 ForbiddenKey lacks Read/Write scopeRegenerate with Read/Write scope
429 Too Many RequestsRate limitWait 2 seconds and retry

Best Practices

  • Always run with dry_run: true first (the default). Unpublishing products is immediately visible to customers.
  • Use filter_no_sales_days: 180 to archive products that genuinely haven't sold recently.
  • Set filter_min_age_days: 30 to avoid archiving newly-listed products that need time to gain traction.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.