Install
$ agentstack add skill-40rty-ai-shopify-admin-skills-shopify-admin-order-hold-and-release ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
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- 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 | | orderids | array | no | — | Array of order GIDs to target (e.g., ["gid://shopify/Order/123"]) | | queryfilter | 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 | | reasonnotes | string | no | — | Free-text note visible to fulfillment staff | | holduntil | 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
- 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)
- OPERATION:
fulfillmentOrderHold— mutation (ifaction: hold)
Inputs: id: , fulfillmentHold: { reason, reasonNotes, holdUntilDate } per fulfillment order Expected output: Updated fulfillmentOrder.status: ON_HOLD, userErrors
OR
- OPERATION:
fulfillmentOrderReleaseHold— mutation (ifaction: release)
Inputs: id: 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: ║
║ Started: ║
╚══════════════════════════════════════════════╝
After each step, emit:
[N/TOTAL]
→ Params:
→ Result:
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:
Fulfillment orders held/released:
Skipped (already in target state):
Errors: 0
Output: none
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "order-hold-and-release",
"store": "",
"started_at": "",
"completed_at": "",
"dry_run": false,
"steps": [
{ "step": 1, "operation": "OrdersForHold", "type": "query", "params_summary": "", "result_summary": " fulfillment orders found", "skipped": false },
{ "step": 2, "operation": "FulfillmentOrderHold|FulfillmentOrderReleaseHold", "type": "mutation", "params_summary": " fulfillment orders, action: ", "result_summary": " updated", "skipped": false }
],
"outcome": {
"action": "",
"orders_targeted": "",
"fulfillment_orders_affected": "",
"skipped": "",
"errors": 0,
"output_file": null
}
}
Output Format
No CSV. Inline summary table: | Order | Fulfillment Order ID | Previous Status | New Status | |-------|---------------------|-----------------|------------| | #1001 | gid://...FulfillmentOrder/456 | OPEN | ON_HOLD |
Error Handling
| Error | Cause | Recovery | |-------|-------|----------| | fulfillmentOrder.status is already ON_HOLD | Order already held | Skipped automatically — logged in output | | fulfillmentOrder.status is not OPEN or ON_HOLD | Order is already fulfilled, cancelled, or in progress | Cannot hold/release; skip and report | | INVENTORY_OUT_OF_STOCK reason without note | Some stores require a note for this reason | Add reason_notes parameter | | userErrors from mutation | Insufficient scopes or invalid fulfillment order state | Verify write_merchant_managed_fulfillment_orders scope |
Best Practices
- Use
query_filter: "tag:fraud-review"to hold all orders tagged by your fraud detection process in one command. - Set
hold_untilto automatically release holds after a review window — prevents holds being forgotten on customer orders. - Always run
dry_run: truefirst when usingquery_filter— confirm the order count before holding dozens of orders at once. - Combine with
fulfillment-status-digestto identify held orders and then batch-release them after resolving exceptions. - The
AWAITING_PAYMENTreason is visible to fulfillment staff and provides context for why an order is paused.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: 40RTY-ai
- Source: 40RTY-ai/shopify-admin-skills
- License: MIT
- Homepage: http://skills.40rty.ai
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.