Install
$ agentstack add skill-40rty-ai-shopify-admin-skills-shopify-admin-exchange-vs-refund-ratio ✓ 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
About
Purpose
Analyzes return resolutions to calculate the split between exchanges (revenue retained), store credit (revenue deferred), and refunds (revenue lost). Tracks this as a revenue recovery metric over time. Read-only — no mutations.
Prerequisites
- Authenticated Shopify CLI session:
shopify store auth --store --scopes read_orders,read_returns - API scopes:
read_orders,read_returns
Parameters
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | store | string | yes | — | Store domain (e.g., mystore.myshopify.com) | | daysback | integer | no | 30 | Lookback window for return resolutions | | comparedays_back | integer | no | 0 | Optional prior period for comparison (0 = no comparison) | | format | string | no | human | Output format: human or json |
Safety
> ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
Workflow Steps
- OPERATION:
returns— query
Inputs: query: "created_at:>=''", first: 250, pagination cursor Expected output: Returns with refunds { totalRefundedSet }, exchangeLineItems, and resolution status
- Categorize each return resolution:
- Exchange: return has
exchangeLineItemswith quantity > 0 - Store credit: return has
refundswith gift card or store credit payment - Refund: return has cash/card refund with no exchange
- OPERATION:
orders— query (ifcompare_days_back > 0)
Inputs: Same logic for prior period to compute trend
GraphQL Operations
# returns:query — validated against api_version 2025-01
query ReturnResolutions($query: String!, $after: String) {
returns(first: 250, after: $after, query: $query) {
edges {
node {
id
status
createdAt
totalQuantity
order {
id
name
}
exchangeLineItems(first: 10) {
edges {
node {
id
quantity
lineItem {
variant {
id
title
}
}
}
}
}
refunds(first: 5) {
id
totalRefundedSet {
shopMoney {
amount
currencyCode
}
}
}
returnLineItems(first: 20) {
edges {
node {
refundableQuantity
returnReason
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
# orders:query — validated against api_version 2025-01
query OrdersInPeriod($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
totalPriceSet {
shopMoney {
amount
currencyCode
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Session Tracking
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Exchange vs Refund Ratio ║
║ Store: ║
║ Started: ║
╚══════════════════════════════════════════════╝
After each step, emit:
[N/TOTAL]
→ Params:
→ Result:
On completion, emit:
For format: human (default):
══════════════════════════════════════════════
EXCHANGE vs REFUND RATIO ( days)
Total returns resolved:
Resolution breakdown:
Exchange (revenue kept): (%)
Store credit (deferred): (%)
Refund (revenue lost): (%)
Revenue recovery rate: %
(exchanges + store credit as % of all returns)
Output: exchange_refund_ratio_.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "exchange-vs-refund-ratio",
"store": "",
"period_days": 30,
"total_returns": 0,
"exchanges": { "count": 0, "pct": 0 },
"store_credit": { "count": 0, "pct": 0 },
"refunds": { "count": 0, "pct": 0 },
"revenue_recovery_rate_pct": 0,
"output_file": "exchange_refund_ratio_.csv"
}
Output Format
CSV file exchange_refund_ratio_.csv with columns: return_id, order_name, resolution_type, exchange_sku, refund_amount, currency, created_at
Error Handling
| Error | Cause | Recovery | |-------|-------|----------| | THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times | | No resolved returns in window | No completed returns in period | Exit with summary: 0 returns | | Exchange line items empty but status indicates exchange | In-progress exchange | Count as pending, exclude from ratio |
Best Practices
- A revenue recovery rate above 30% (exchanges + store credit) is generally a strong signal for fashion/apparel; set your own benchmark based on category.
- Use
compare_days_backto track whether returns policy changes (e.g., "exchange only" periods) improved the recovery rate. - Pair with
return-reason-analysis— high "wrong size" return reasons paired with low exchange rates may indicate size guidance issues in product listings. - Run before and after launching an exchange incentive (e.g., bonus store credit for exchanging instead of refunding) to measure impact.
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.