From shopify-admin-skills
Identifies Shopify customers lapsed for N days (min orders count), exports re-engagement list in human/JSON, tags them via GraphQL mutations. For win-back campaigns.
npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsThis skill uses the workspace's default tool permissions.
Segments lapsed customers — those who placed at least one order but have not purchased again within a configurable window — and tags them for re-engagement. This skill handles the Shopify-native data layer; sending re-engagement emails requires an external tool.
Identifies high-LTV Shopify customers by min order count and lifetime spend, tags qualifying ones, and exports loyalty-ready contact list.
Manages Shopify customers via GraphQL Admin API mutations/queries for create/update/delete/tags/metafields, Customer Account API, Multipass SSO, segmentation, B2B accounts.
Manages Shopify orders, customers, and fulfillments via GraphQL Admin API. Query orders, process fulfillments, handle customer records, create draft orders.
Share bugs, ideas, or general feedback.
Segments lapsed customers — those who placed at least one order but have not purchased again within a configurable window — and tags them for re-engagement. This skill handles the Shopify-native data layer; sending re-engagement emails requires an external tool.
shopify auth login --store <domain>read_customers, write_customers| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain |
| format | string | no | human | human or json |
| dry_run | bool | no | false | Preview without tagging |
| inactive_days | integer | no | 90 | Days since last order to qualify as lapsed |
| min_orders | integer | no | 1 | Minimum lifetime order count to include |
| tag | string | no | win-back | Tag applied to lapsed customers |
| max_customers | integer | no | 500 | Maximum customers to process per run |
OPERATION: customers — query
Inputs: filter last_order_date:<(NOW - inactive_days days), orders_count:>=(min_orders), first: 250, pagination
Expected output: List of customer objects with id, defaultEmailAddress { emailAddress }, firstName, lastName, ordersCount, lastOrder.processedAt; paginate until hasNextPage: false
OPERATION: tagsAdd — mutation
Inputs: Customer id, tag string from tag parameter
Expected output: Confirmation per customer; collect userErrors
# customers:query — validated against api_version 2025-04
query LapsedCustomers($first: Int!, $after: String, $query: String) {
customers(first: $first, after: $after, query: $query) {
edges {
node {
id
defaultEmailAddress {
emailAddress
}
firstName
lastName
ordersCount
lastOrder {
processedAt
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# tagsAdd:mutation — validated against api_version 2025-01
mutation TagsAdd($id: ID!, $tags: [String!]!) {
tagsAdd(id: $id, tags: $tags) {
node {
id
}
userErrors {
field
message
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Customer Win-Back ║
║ Store: <store domain> ║
║ Started: <YYYY-MM-DD HH:MM UTC> ║
╚══════════════════════════════════════════════╝
After each step, emit:
[N/TOTAL] <QUERY|MUTATION> <OperationName>
→ Params: <brief summary>
→ Result: <count or outcome>
If dry_run: true, prefix mutation steps with [DRY RUN] and do not execute.
On completion, for format: human:
══════════════════════════════════════════════
OUTCOME SUMMARY
Lapsed customers found: <n>
Customers tagged: <n>
Errors: <n>
Output: winback_<date>.csv
══════════════════════════════════════════════
For format: json, emit the standard JSON schema with outcome keys: lapsed_found, customers_tagged, errors, output_file.
CSV winback_<YYYY-MM-DD>.csv with columns:
customer_id, email, first_name, last_name, orders_count, last_order_date, tag_applied
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | Rate limit | Wait 2s, retry up to 3 times |
userErrors on tagsAdd | Customer not found or invalid ID | Log, skip, continue |
win-back-2026-04) so you can track which cohort was targeted each month and avoid re-tagging customers who already received a win-back campaign.min_orders: 2 to focus on customers who had a genuine purchase relationship, not one-time buyers who may never have intended to return.dry_run: true first to validate the lapsed customer count before tagging — the count informs the scale of your re-engagement campaign.