From shopify-admin-skills
Scans Shopify orders for chargebacks and disputes within a time window, tags affected customers for future order review. Reduces repeated fraud losses via configurable watchlist.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
Scans historical orders for any associated chargeback or dispute, then tags the customer record with `chargeback-history` (configurable). Future orders from these customers can be filtered or held for manual review by ops. Reduces repeated chargeback losses without blocking customers outright. Defaults to `dry_run: true`.
Identifies Shopify customers with abnormal return behavior—high return rates (≥40%), wardrobing (full returns soon after delivery), or serial returns—via GraphQL queries on orders, returns, customers for manual review.
Manages Shopify orders, customers, and fulfillments via GraphQL Admin API. Query orders, process fulfillments, handle customer records, create draft orders.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Scans historical orders for any associated chargeback or dispute, then tags the customer record with chargeback-history (configurable). Future orders from these customers can be filtered or held for manual review by ops. Reduces repeated chargeback losses without blocking customers outright. Defaults to dry_run: true.
shopify store auth --store <domain> --scopes read_orders,read_customers,write_customersread_orders, read_customers, write_customers| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| days_back | integer | no | 730 | Historical window to scan for disputes (2 years default) |
| watchlist_tag | string | no | chargeback-history | Tag applied to flagged customers |
| include_won_disputes | bool | no | false | If false, only tag customers whose disputes were lost or are open |
| dry_run | bool | no | true | Preview without applying tags |
| format | string | no | human | Output format: human or json |
⚠️
customerUpdatemodifies customer tags that are visible to staff and may drive segmentation rules. Tag a customer incorrectly and you may downgrade their experience or block their orders. Run withdry_run: truefirst and review the list before committing. Won disputes (where the merchant won) are excluded by default to avoid false positives.
OPERATION: orders — query
Inputs: query: "created_at:>='<NOW - days_back days>' chargeback_status:*" (any chargeback state), first: 250, select disputes { id, status, initiatedAs, finalizedOn }, customer { id, displayName, tags, defaultEmailAddress { emailAddress } }, totalPriceSet, pagination cursor
Expected output: All orders that have at least one dispute in the window
Group disputes by customer. For each customer:
WON and include_won_disputes: falsewatchlist_tagOPERATION: customerUpdate — mutation
Inputs: input: { id, tags: [<existing tags>, watchlist_tag] } for each queued customer
Expected output: Updated customer with new tag list; userErrors
If dry_run: true, do not call mutation — just report the queue.
# orders:query — validated against api_version 2025-01
query OrdersWithDisputes($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
createdAt
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
disputes {
id
status
initiatedAs
finalizedOn
}
customer {
id
displayName
defaultEmailAddress {
emailAddress
}
numberOfOrders
amountSpent {
amount
currencyCode
}
tags
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# customerUpdate:mutation — validated against api_version 2025-01
mutation TagChargebackCustomer($input: CustomerInput!) {
customerUpdate(input: $input) {
customer {
id
tags
}
userErrors {
field
message
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Chargeback Watchlist Tagger ║
║ 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):
══════════════════════════════════════════════
CHARGEBACK WATCHLIST (<days_back> days)
Orders with disputes: <n>
Unique customers: <n>
Disputes lost/open: <n>
Disputes won (excluded): <n>
Already tagged: <n>
─────────────────────────────
Customers to tag: <n>
Tags applied: <n> (or [DRY RUN] would apply)
Errors: <n>
Output: chargeback_watchlist_<date>.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "chargeback-watchlist-tagger",
"store": "<domain>",
"dry_run": true,
"orders_with_disputes": 0,
"unique_customers": 0,
"customers_to_tag": 0,
"tags_applied": 0,
"errors": 0,
"output_file": "chargeback_watchlist_<date>.csv"
}
CSV file chargeback_watchlist_<YYYY-MM-DD>.csv with columns:
customer_id, email, name, dispute_count, latest_dispute_status, latest_dispute_initiated_as, total_disputed_amount, currency, existing_tags, tag_to_apply, action
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
userErrors on customerUpdate | Customer not found / archived | Log error, skip, continue |
| Order without a customer | Guest checkout dispute | Cannot tag — record in CSV with action: skipped_guest |
Dispute with status null | Very recent dispute, not yet categorized | Treat as open / not won |
dry_run: true and audit the CSV — false positives damage customer trust.watchlist_tag with a Shopify Flow or order-routing rule that holds new orders from tagged customers for manual approval.include_won_disputes: false (default). If you won, the bank ruled in your favor — do not penalize the customer.