with one click
shopify-admin-churn-risk-scorer
// Read-only: scores customers by churn probability based on purchase recency, frequency decay, and expected repurchase intervals.
// Read-only: scores customers by churn probability based on purchase recency, frequency decay, and expected repurchase intervals.
Master skill collection for Shopify store operators. Provides access to all merchandising, marketing, support, and operations capabilities.
Read-only: identifies products with high single-purchase rates that could benefit from cross-sell pairing based on category and price affinity.
Read-only: calculates the true ROI of each discount code and automatic discount by comparing incremental revenue against discount cost.
Read-only: mines order history to find product pairs and triplets frequently purchased together, generating cross-sell and bundle recommendations.
Read-only: extracts gift messages, gift recipients, and gift flags from order custom attributes and notes for fulfillment teams to print on packing slips.
Read-only: identifies orders 7ā14 days post-fulfillment that are eligible for a post-purchase survey campaign, excluding refunded or cancelled orders.
| name | shopify-admin-churn-risk-scorer |
| role | customer-ops |
| description | Read-only: scores customers by churn probability based on purchase recency, frequency decay, and expected repurchase intervals. |
| toolkit | shopify-admin, shopify-admin-execution |
| api_version | 2025-01 |
| graphql_operations | ["customers:query","orders:query"] |
| status | stable |
| compatibility | Claude Code, Cursor, Codex, Gemini CLI |
Predicts which customers are at risk of churning by analyzing their purchase patterns against their historical buying frequency. Calculates an expected next-purchase date for each repeat customer, then scores churn risk based on how overdue they are. Read-only ā no mutations.
shopify store auth --store <domain> --scopes read_orders,read_customersread_orders, read_customers| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | ā | Store domain |
| days_back | integer | no | 365 | Historical window for purchase pattern analysis |
| min_orders | integer | no | 2 | Minimum orders to calculate purchase interval (need 2+ for frequency) |
| risk_threshold | float | no | 1.5 | Multiplier of avg purchase interval before flagging as at-risk |
| format | string | no | human | Output format: human or json |
ā¹ļø Read-only skill ā no mutations are executed. Safe to run at any time.
For each customer with min_orders or more purchases:
OPERATION: orders ā query
Inputs: query: "created_at:>='<NOW - days_back days>'", first: 250, select createdAt, totalPriceSet, customer { id, email, firstName, lastName }, pagination cursor
Expected output: All orders with customer association
Group orders by customer, calculate per customer:
OPERATION: customers ā query (enrichment)
Inputs: Customer IDs for at-risk and likely-churned segments
Expected output: Contact details, tags, total spend
Calculate churn risk score and classify into segments
Estimate revenue at risk = sum of (annual_spend Ć churn_probability) for at-risk customers
# orders:query ā validated against api_version 2025-01
query OrdersForChurnAnalysis($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
createdAt
totalPriceSet { shopMoney { amount currencyCode } }
customer {
id
email
firstName
lastName
numberOfOrders
}
}
}
pageInfo { hasNextPage endCursor }
}
}
# customers:query ā validated against api_version 2025-01
query AtRiskCustomers($ids: [ID!]!) {
nodes(ids: $ids) {
... on Customer {
id
email
firstName
lastName
totalSpentV2 { amount currencyCode }
numberOfOrders
tags
createdAt
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā SKILL: Churn Risk Scorer ā
ā 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>
On completion, emit:
For format: human (default):
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
CHURN RISK REPORT (<days_back> days analyzed)
Repeat customers scored: <n>
āāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Active (score 0-20): <n> (<pct>%)
Cooling (score 20-50): <n> (<pct>%)
At Risk (score 50-80): <n> (<pct>%) ā ļø
Likely Churned (80-100): <n> (<pct>%) š“
Revenue at risk: $<amount>/year
Top at-risk by value:
<name> (<email>) Score: <n> Last order: <date> Lifetime: $<n>
Output: churn_risk_<date>.csv
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
CSV file churn_risk_<YYYY-MM-DD>.csv with columns:
customer_id, email, first_name, last_name, order_count, total_spent, avg_purchase_interval_days, days_since_last_order, overdue_ratio, churn_risk_score, risk_segment, expected_annual_value
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
| Single-purchase customers | Can't calculate interval | Exclude from scoring (need 2+ orders) |
| Guest orders | No customer linkage | Skip ā cannot build customer profile |
customer-win-back skill to take action on At-Risk and Likely Churned segments.rfm-customer-segmentation for a more holistic view of customer health.risk_threshold based on your product type: consumables (1.3), fashion (1.5), furniture (2.0).