From shopify-admin-skills
Read-only: parses each order's landing site and referrer URL to break down orders, revenue, and AOV by traffic source — direct, organic, paid, social, email, or referral domain.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-admin-skills:shopify-admin-referral-source-attributionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Aggregates orders by their first-touch traffic source — extracted from each order's `landingPageUrl`, `referrerUrl`, and any UTM parameters embedded in the landing URL. Produces an attribution table showing orders, revenue, and AOV per source so merchants can see which channels are actually converting. Read-only — no mutations. Use when native Shopify analytics dashboards aren't granular enough...
Aggregates orders by their first-touch traffic source — extracted from each order's landingPageUrl, referrerUrl, and any UTM parameters embedded in the landing URL. Produces an attribution table showing orders, revenue, and AOV per source so merchants can see which channels are actually converting. Read-only — no mutations. Use when native Shopify analytics dashboards aren't granular enough or when you need to export raw attribution data for an external model.
shopify store auth --store <domain> --scopes read_ordersread_orders| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| store | string | yes | — | Store domain (e.g., mystore.myshopify.com) |
| format | string | no | human | Output format: human or json |
| days_back | integer | no | 30 | Lookback window in days |
| min_orders | integer | no | 1 | Minimum orders per source to include in the human-readable summary |
| group_by | string | no | category | Grouping level: category (direct/organic/paid/social/email/referral), domain (raw referrer host), or utm_source (UTM param value) |
| include_utm | bool | no | true | When true, parse utm_source, utm_medium, utm_campaign from landingPageUrl query string |
ℹ️ Read-only skill — no mutations are executed. Safe to run at any time.
OPERATION: orders — query
Inputs: query: "created_at:>='<NOW - days_back days>'", first: 250, select id, name, createdAt, landingPageUrl, referrerUrl, customerJourneySummary { firstVisit { landingPage referrerUrl source sourceType utmParameters { source medium campaign term content } } }, totalPriceSet, customer { numberOfOrders }, pagination cursor
Expected output: Orders with their landing/referrer/UTM data; paginate until hasNextPage: false
For each order, derive a normalized source:
customerJourneySummary.firstVisit.utmParameters.source is set → use it (strongest signal)landingPageUrl query string when include_utm: truereferrerUrl and map to a category:
directorganic-searchpaid-searchsocial-<host>emailreferral-<host>Aggregate by the chosen group_by dimension:
totalPriceSet.shopMoney.amountcustomer.numberOfOrders == 1 divided by total in source)# orders:query — validated against api_version 2025-01
query OrdersForAttribution($query: String!, $after: String) {
orders(first: 250, after: $after, query: $query) {
edges {
node {
id
name
createdAt
landingPageUrl
referrerUrl
totalPriceSet {
shopMoney { amount currencyCode }
}
customer {
id
numberOfOrders
}
customerJourneySummary {
firstVisit {
landingPage
referrerUrl
source
sourceType
utmParameters {
source
medium
campaign
term
content
}
}
momentsCount {
count
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Claude MUST emit the following output at each stage. This is mandatory.
On start, emit:
╔══════════════════════════════════════════════╗
║ SKILL: Referral Source Attribution ║
║ 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):
══════════════════════════════════════════════
ATTRIBUTION REPORT (<days_back> days, group: <group_by>)
Orders analyzed: <n>
Total revenue: $<amount>
Sources detected: <n>
Top sources by revenue
─────────────────────────────────────────
<source> Orders: <n> Revenue: $<n> AOV: $<n> New cust: <pct>%
<source> Orders: <n> Revenue: $<n> AOV: $<n> New cust: <pct>%
...
Output: attribution_<date>.csv
══════════════════════════════════════════════
For format: json, emit:
{
"skill": "referral-source-attribution",
"store": "<domain>",
"period_days": 30,
"group_by": "category",
"totals": {
"orders": 0,
"revenue": 0,
"currency": "USD"
},
"sources": [
{
"source": "<name>",
"orders": 0,
"revenue": 0,
"aov": 0,
"new_customer_pct": 0
}
],
"output_file": "attribution_<date>.csv"
}
CSV file attribution_<YYYY-MM-DD>.csv with columns:
order_id, order_name, created_at, source, source_category, referrer_url, landing_page_url, utm_source, utm_medium, utm_campaign, revenue, is_new_customer
| Error | Cause | Recovery |
|---|---|---|
THROTTLED | API rate limit exceeded | Wait 2 seconds, retry up to 3 times |
Null landingPageUrl and referrerUrl | POS, draft, or import order | Categorize as unattributed |
| Malformed UTM params | Unencoded characters in landing URL | Skip UTM parse, fall back to referrer host |
customerJourneySummary not available | Older order or app-created order | Fall back to top-level landingPageUrl/referrerUrl |
group_by: utm_source when running structured campaigns with consistent UTM tagging — this is the highest-fidelity attribution signal.group_by: category for board-level summaries; merchants want "how much came from social" before "how much came from instagram.com/p/abc".discount-roi-calculator — combining "which source drives the order" with "which discount the order used" reveals where paid acquisition actually pays off.days_back: 90) for low-volume stores so percentage breakdowns aren't dominated by a handful of orders.npx claudepluginhub 40rty-ai/shopify-admin-skills --plugin shopify-admin-skillsParses UTM parameters from Shopify order landing page URLs and builds a revenue, AOV, and conversion attribution report grouped by source, medium, or campaign.
Queries Wix orders via REST API for revenue calculation, trend analysis, and cohort analysis. Filters by date range, payment/fulfillment status, and value.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.