UTM campaign performance
Attributed performance of UTM-tagged traffic — sessions, sales, orders and customers by campaign tag, referring channel and traffic type, under Shopify's last-non-direct-click attribution. Only visits carrying a utm_campaign tag are counted. Requires the read_reports scope; empty on stores that have not granted it or that do not tag their links.
14 fields — 7 dimensions, 7 metrics. Date clauses (SINCE, UNTIL, DURING) use day.
The live, authoritative list is always GET /v1/datasets — this page is regenerated from the same catalog, but the endpoint reflects exactly what is deployed.
Query it
FROM utm_campaign_performance
SHOW sessions
GROUP BY utm_campaign
SINCE -30d
See Querying with SoloQL for the language.
This dataset is queryable through SoloQL; it has no record-retrieval endpoint.
Fields
| Field | Type | Role | Description |
|---|---|---|---|
utm_campaign | string | dimension | The utm_campaign tag on the attributed visit, exactly as it appears in the link — an ad-set id, a slug, free text. Never blank here: only tagged visits are stored. |
referring_channel | string | dimension | The channel beneath the campaign tag — facebook, instagram, bayengage, unattributed… ⚠️ Can be blank upstream. |
traffic_type | string | dimension | How the visit was classified: organic, paid, direct, unknown or none. ⚠️ 'unknown' and 'none' are DIFFERENT upstream values, both real. |
sessions | number | metric | Tagged sessions in this bucket. The one column Shopify does NOT attribution-suffix in the joined statement. |
total_sales | money | metric | Sales attributed to this campaign under last-non-direct-click attribution. |
orders | number | metric | Orders attributed to this campaign. |
new_customers | number | metric | First-time customers attributed to this campaign. Additive — a customer is new exactly once. |
returning_customers | number | metric | Returning customers attributed to this campaign. ⚠️ A DISTINCT count, so it is FETCHED LIVE from Shopify for the selected window and never summed from stored days — someone who came back through two campaigns is one returning customer. The total is therefore smaller than the rows added up, and the column blanks (never guesses) when the live call cannot deliver. |
conversion_rate | percent | metric | Attributed orders divided by tagged sessions — Shopify's own formula from the captured report. Blank where the campaign drove no sessions. |
average_order_value | money | metric | Attributed sales divided by attributed orders. A ratio of sums, exact at any grouping. |
day | date | dimension | The attribution day — Shopify's shop-timezone calendar label, stamped as UTC midnight. ⚠️ Recent days RESTATE as late conversions attribute. |
store | string | dimension | The shop the record belongs to. Filter with WHERE store IN ('Shop name') or GROUP BY store. |
store_id | string | dimension | The shop's raw identifier — what an export or the API reports. Same shops as Store, shown as ids. |
store_domain | string | dimension | The shop's myshopify.com domain. Filter with WHERE store_domain = 'shop.myshopify.com'. |