
Shopify Admin Cancel And Restock
- 7 installs
- 173 repo stars
- Updated June 26, 2026
- 40rty-ai/shopify-admin-skills
shopify-admin-cancel-and-restock is a Claude Code skill that cancels an unfulfilled Shopify order with optional inventory restock, refund, and customer notification in one validated workflow.
About
shopify-admin-cancel-and-restock cancels an unfulfilled or partially-unfulfilled Shopify order with configurable restock, refund, and customer-notification options in one validated workflow. A support or ops agent runs it for fraud handling, out-of-stock cancellations, or customer-requested cancellations before dispatch. It checks the order is cancellable, then executes an irreversible orderCancel mutation.
- Cancels an unfulfilled Shopify order with restock, refund, and notification options
- Validates order state and aborts if not cancellable
- Executes an irreversible orderCancel mutation; supports dry-run
Shopify Admin Cancel And Restock 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-cancel-and-restock capabilities & compatibility
Free; requires an authenticated Shopify session with read_orders and write_orders scopes.
- Capabilities
- cancel and restock · address correction · bulk fulfillment creation
- Pricing
- Free
What shopify-admin-cancel-and-restock says it does
Cancel an unfulfilled order, optionally restock inventory, and optionally notify the customer — all in a single validated workflow.
npx skills add https://github.com/40rty-ai/shopify-admin-skills --skill shopify-admin-cancel-and-restockAdd 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
Cancel an unfulfilled Shopify order with optional restock, refund, and customer notification.
Who is it for?
Support and ops handling fraud, out-of-stock, or customer-requested cancellations before dispatch.
Skip if: Cancelling orders that are already fully fulfilled, which it cannot do.
When should I use this skill?
You need to cancel an order and optionally restock and refund it before it ships.
What you get
The order is cancelled with a timestamp, and inventory and payment are optionally restored and refunded.
- Cancelled order with optional restock and refund
By the numbers
- Cancel reasons: CUSTOMER, DECLINED, FRAUD, INVENTORY, STAFF, OTHER
- Two-step workflow: order query then orderCancel mutation
Files
Purpose
Cancels an unfulfilled or partially-unfulfilled order with configurable restock, refund, and customer notification options — without navigating the Shopify admin. Useful for fraud exception handling, out-of-stock cancellations, or customer-requested cancellations before dispatch. Cannot cancel orders that are already fully fulfilled.
Prerequisites
- Authenticated Shopify CLI session:
shopify auth login --store <domain> - API scopes:
read_orders,write_orders
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| format | string | no | human | Output format: human or json |
| dry_run | bool | no | false | Preview operations without executing mutations |
| order_id | string | yes | — | GID of the order (e.g., gid://shopify/Order/12345) |
| reason | string | no | OTHER | Cancel reason: CUSTOMER, DECLINED, FRAUD, INVENTORY, STAFF, OTHER |
| restock | bool | no | true | Restock inventory for cancelled line items |
| refund | bool | no | true | Issue refund for any captured payments |
| notify_customer | bool | no | true | Send cancellation email to customer |
| staff_note | string | no | — | Internal note recorded on the cancellation |
Safety
⚠️ Steps 2 executesorderCancelwhich is irreversible. A cancelled order cannot be reopened. Ifrefund: true, any captured payment is automatically refunded. Ifrestock: true, inventory quantities are immediately restored. Run withdry_run: trueto verify the order state and confirm it is cancellable before committing.
Workflow Steps
1. OPERATION: order — query Inputs: id: <order_id> Expected output: Order name, displayFulfillmentStatus, displayFinancialStatus, cancelledAt (must be null), fulfillmentOrders.status (must be OPEN or ON_HOLD — abort if any fulfillment order is IN_PROGRESS or CLOSED)
2. OPERATION: orderCancel — mutation Inputs: orderId, reason, restock, refund, notifyCustomer, staffNote Expected output: orderCancelUserErrors — empty on success; order is now cancelled with cancelledAt timestamp
GraphQL Operations
# order:query — validated against api_version 2025-01
query OrderForCancel($id: ID!) {
order(id: $id) {
id
name
displayFulfillmentStatus
displayFinancialStatus
cancelledAt
totalPriceSet {
shopMoney { amount currencyCode }
}
lineItems(first: 50) {
edges {
node {
id
title
quantity
variant {
id
sku
inventoryQuantity
}
}
}
}
fulfillmentOrders(first: 5) {
edges {
node {
id
status
}
}
}
customer {
id
defaultEmailAddress {
emailAddress
}
firstName
lastName
}
}
}# orderCancel:mutation — validated against api_version 2025-01
mutation OrderCancel(
$orderId: ID!
$reason: OrderCancelReason!
$restock: Boolean!
$refund: Boolean!
$notifyCustomer: Boolean!
$staffNote: String
) {
orderCancel(
orderId: $orderId
reason: $reason
restock: $restock
refund: $refund
notifyCustomer: $notifyCustomer
staffNote: $staffNote
) {
orderCancelUserErrors {
field
message
}
userErrors {
field
message
}
}
}Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: cancel-and-restock ║
║ 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
Order: <name>
Cancellation reason: <reason>
Restocked: <true|false>
Refund issued: <true|false>
Customer notified: <true|false>
Errors: 0
Output: none
══════════════════════════════════════════════For format: json, emit:
{
"skill": "cancel-and-restock",
"store": "<domain>",
"started_at": "<ISO8601>",
"completed_at": "<ISO8601>",
"dry_run": false,
"steps": [
{ "step": 1, "operation": "OrderForCancel", "type": "query", "params_summary": "order <id>", "result_summary": "<status>", "skipped": false },
{ "step": 2, "operation": "OrderCancel", "type": "mutation", "params_summary": "reason: <reason>, restock: <bool>, refund: <bool>, notifyCustomer: <bool>", "result_summary": "cancelled at <timestamp>", "skipped": false }
],
"outcome": {
"order_name": "<name>",
"reason": "<reason>",
"restocked": true,
"refund_issued": true,
"customer_notified": true,
"errors": 0,
"output_file": null
}
}Output Format
No CSV output. The session summary reports the cancellation result inline. If restock: true, list the variant SKUs and quantities restored.
Error Handling
| Error | Cause | Recovery |
|---|---|---|
cancelledAt is not null | Order is already cancelled | No action needed |
Fulfillment order status: IN_PROGRESS | Order is being picked/packed | Contact warehouse to stop — cannot cancel programmatically once IN_PROGRESS |
orderCancelUserErrors | Order has already been fully fulfilled | Use refund-and-reorder skill instead |
| Order not found | Invalid order GID | Use order-lookup-and-summary skill to find the correct ID |
Best Practices
1. Always run dry_run: true first — check displayFulfillmentStatus and fulfillment order statuses before committing to a cancel. 2. Set reason: FRAUD for high-risk orders — this reason is logged in Shopify's fraud analytics. 3. If the order has already been captured (status PAID), set refund: true — an uncredited cancellation will cause customer disputes. 4. For large cancellation batches (e.g., out-of-stock event), loop through order IDs using format: json to capture each result for audit logging. 5. If the warehouse has already started picking, do not cancel via API — contact them directly and cancel only after they confirm no physical work has started.
Related skills
FAQ
Can I cancel a fully fulfilled order?
No. It aborts if any fulfillment order is IN_PROGRESS or CLOSED; it only cancels unfulfilled or partially-unfulfilled orders.
Is the cancellation reversible?
No. orderCancel is irreversible and a cancelled order cannot be reopened, so run dry_run first.