Skip to content
Operations
Skill

/shopify-admin-order-hold-and-release

Place or release fulfillment holds on open orders in batch — with a stated reason and optional expiry date.

From plugin
shopify-admin-skills
175116 skills
Install
$ npx -y skills add 40rty-ai/shopify-admin-skills --skill shopify-admin-order-hold-and-release --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/shopify-admin-order-hold-and-release

Context preview

The summary Claude sees to decide when to auto-load this skill.

Place or release fulfillment holds on open orders in batch — with a stated reason and optional expiry date.

SKILL.md

shopify-admin-order-hold-and-release.SKILL.md
name: shopify-admin-order-hold-and-release
role: fulfillment-ops
description: "Place or release fulfillment holds on open orders in batch — with a stated reason and optional expiry date."
toolkit: shopify-admin, shopify-admin-execution
api_version: "2025-01"
graphql_operations:
  - orders:query
  - fulfillmentOrderHold:mutation
  - fulfillmentOrderReleaseHold:mutation
status: stable
compatibility: Claude Code, Cursor, Codex, Gemini CLI

Purpose

Places or releases holds on fulfillment orders programmatically without navigating the Shopify admin. Useful for fraud review queues, inventory shortages, or payment verification workflows. Works on orders with fulfillment orders in `OPEN` status.

Prerequisites

  • `shopify auth login --store <domain>`
  • API scopes: `read_orders`, `write_merchant_managed_fulfillment_orders`

Parameters

Universal (store, format, dry_run) + skill-specific:

| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | action | string | yes | — | `hold` or `release` | | order_ids | array | no* | — | Array of order GIDs to target (e.g., `["gid://shopify/Order/123"]`) | | query_filter | string | no* | — | Shopify order search query to select orders (e.g., `"tag:fraud-review"`) | | reason | string | no | `OTHER` | Hold reason: `AWAITING_PAYMENT`, `HIGH_RISK_OF_FRAUD`, `INCORRECT_ADDRESS`, `INVENTORY_OUT_OF_STOCK`, `OTHER` | | reason_notes | string | no | — | Free-text note visible to fulfillment staff | | hold_until | string | no | — | ISO 8601 date when hold auto-expires (optional) |

*One of `order_ids` or `query_filter` is required.

Safety

> ⚠️ Step 2 places or releases holds on live fulfillment orders. Holding an order prevents it from being fulfilled and may delay delivery. Releasing a hold allows fulfillment to proceed immediately. Run with `dry_run: true` to preview which orders will be affected before committing.

Workflow Steps

1. **OPERATION:** `orders` — query **Inputs:** `order_ids` list or `query_filter` string; fetch each order's `fulfillmentOrders` to get the fulfillment order IDs and current `status` **Expected output:** List of fulfillment order GIDs with their current `status`; skip any already in the target state (already held / not held)

2. **OPERATION:** `fulfillmentOrderHold` — mutation (if `action: hold`) **Inputs:** `id: <fulfillmentOrderId>`, `fulfillmentHold: { reason, reasonNotes, holdUntilDate }` per fulfillment order **Expected output:** Updated `fulfillmentOrder.status: ON_HOLD`, `userErrors`

**OR**

2. **OPERATION:** `fulfillmentOrderReleaseHold` — mutation (if `action: release`) **Inputs:** `id: <fulfillmentOrderId>` per held fulfillment order **Expected output:** Updated `fulfillmentOrder.status: OPEN`, `userErrors`

GraphQL Operations

# orders:query — validated against api_version 2025-01
query OrdersForHold($first: Int!, $after: String, $query: String) {
  orders(first: $first, after: $after, query: $query) {
    edges {
      node {
        id
        name
        displayFulfillmentStatus
        fulfillmentOrders(first: 5) {
          edges {
            node {
              id
              status
              requestStatus
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
# fulfillmentOrderHold:mutation — validated against api_version 2025-01
mutation FulfillmentOrderHold($id: ID!, $fulfillmentHold: FulfillmentOrderHoldInput!) {
  fulfillmentOrderHold(id: $id, fulfillmentHold: $fulfillmentHold) {
    fulfillmentOrder {
      id
      status
    }
    remainingFulfillmentOrder {
      id
      status
    }
    userErrors {
      field
      message
    }
  }
}
# fulfillmentOrderReleaseHold:mutation — validated against api_version 2025-01
mutation FulfillmentOrderReleaseHold($id: ID!) {
  fulfillmentOrderReleaseHold(id: $id) {
    fulfillmentOrder {
      id
      status
    }
    userErrors {
      field
      message
    }
  }
}

Session Tracking

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

**On start**, emit:

╔══════════════════════════════════════════════╗
║  SKILL: order-hold-and-release               ║
║  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
  Orders targeted:                   <n>
  Fulfillment orders held/released:  <n>
  Skipped (already in target state): <n>
  Errors:                            0
  Output:                            none
══════════════════════════════════════════════

For `format: json`, emit:

{
  "skill": "order-hold-and-release",
  "store": "<domain>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": false,
  "steps": [
    { "step": 1, "operation": "OrdersForHold", "type": "query", "params_summary": "<filter or ids>", "result_summary": "<n> fulfillment orders found", "skipped": false },
    { "step": 2, "operation": "FulfillmentOrderHold|FulfillmentOrderReleaseHold", "type": "mutation", "params_summary": "<n> fulfillment orders, action: <hold|release>", "result_summary": "<n> updated", "skipped": false }
  ],
  "outcome": {
    "action": "<hold|release>",
    "orders_targeted": "<n>",
    "fulfillment_orders_affected": "<n>",
    "skipped": "<n>",
    "errors": 0,
    "output_file": null
  }
}

Output Format

No CSV. Inline summary table: | Order | Fulfillment Order ID | Previous Status | New Status | |-------|---------------------

Read more
Ships withshopify-admin-skills

Community-maintained AI agent skills for operating Shopify stores — workflows, optimization, reports and more

Get the whole plugin