From shopify-admin-skills
Finds stale Shopify draft orders older than N days via GraphQL query and optionally deletes them to reduce admin clutter and fix inflated metrics.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
Queries open draft orders older than a configurable age and optionally deletes them. Draft orders accumulate from abandoned B2B quotes, incomplete manual orders, or old integrations and clutter the admin. Stale drafts also inflate pending revenue metrics.
Manages Shopify orders, customers, and fulfillments via GraphQL Admin API. Query orders, process fulfillments, handle customer records, create draft orders.
Generates daily fulfillment triage digest of Shopify open orders segmented by age buckets and flagging holds or exceptions via GraphQL queries. Replaces manual admin review for ops teams.
Guides Shopify order management via GraphQL: lifecycle, FulfillmentOrder, returns/refunds, draft orders, editing, transactions, metafields, risk analysis.
Share bugs, ideas, or general feedback.
Queries open draft orders older than a configurable age and optionally deletes them. Draft orders accumulate from abandoned B2B quotes, incomplete manual orders, or old integrations and clutter the admin. Stale drafts also inflate pending revenue metrics.
shopify store auth --store <domain> --scopes read_orders,write_ordersread_orders, write_orders| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| older_than_days | integer | no | 30 | Delete drafts older than this many days |
| dry_run | bool | no | true | Preview drafts to delete without executing mutation |
| format | string | no | human | Output format: human or json |
⚠️
draftOrderDeletepermanently deletes draft orders. Deleted drafts cannot be recovered. Run withdry_run: trueto review the list before committing. Check that no stale drafts represent active B2B quotes awaiting customer approval before deleting.
OPERATION: draftOrders — query
Inputs: query: "status:open created_at:<='<NOW - older_than_days days>'", first: 250, pagination cursor
Expected output: Stale open draft orders; paginate until hasNextPage: false
OPERATION: draftOrderDelete — mutation
Inputs: id: <draft_order_id>
Expected output: deletedId, userErrors
# draftOrders:query — validated against api_version 2025-01
query StaleDraftOrders($query: String!, $after: String) {
draftOrders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
status
createdAt
updatedAt
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
customer {
id
displayName
defaultEmailAddress {
emailAddress
}
}
tags
note
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# draftOrderDelete:mutation — validated against api_version 2025-01
mutation DraftOrderDelete($input: DraftOrderDeleteInput!) {
draftOrderDelete(input: $input) {
deletedId
userErrors {
field
message
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Draft Order Cleanup ║
║ 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
Stale drafts found: <n>
Drafts deleted: <n>
Total value cleared: $<amount>
Errors: <n>
Output: draft_cleanup_<date>.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "draft-order-cleanup",
"store": "<domain>",
"started_at": "<ISO8601>",
"older_than_days": 30,
"dry_run": true,
"outcome": {
"drafts_found": 0,
"drafts_deleted": 0,
"value_cleared": 0,
"currency": "USD",
"errors": 0,
"output_file": "draft_cleanup_<date>.csv"
}
}
CSV file draft_cleanup_<YYYY-MM-DD>.csv with columns:
draft_id, draft_name, customer_name, customer_email, created_at, total_value, currency, action
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
userErrors on delete | Draft already completed or cancelled | Log as skipped, continue |
| No stale drafts | All drafts are recent or none exist | Exit with 0 results |
older_than_days: 60 or higher for B2B stores where quotes may have longer sales cycles.b2b-quote or similar before running the delete step.