Marketing performance
Attributed marketing performance — sessions, sales, orders, customers and engagement by marketing platform and activity, under Shopify's last-non-direct-click attribution. Requires the read_reports scope; empty on stores that have not granted it.
20 fields — 6 dimensions, 14 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 marketing_performance
SHOW sessions
GROUP BY marketing_platform
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 |
|---|---|---|---|
marketing_platform | string | dimension | The channel the activity ran on — Google & YouTube, Messaging, Online Store… ⚠️ Can be blank: Shopify attributes some rows to no platform. |
marketing_activity_title | string | dimension | The campaign or activity name. ⚠️ Can be blank even when the platform is present. |
sessions | number | metric | Sessions credited to the activity. The one column Shopify does NOT attribution-suffix in the joined statement. |
total_sales | money | metric | Sales attributed to the activity under last-non-direct-click attribution. Additive across days — proven to the cent. |
orders | number | metric | Orders attributed to the activity. |
new_customers | number | metric | First-time customers attributed to the activity. Date-anchored — proven additive across days. |
returning_customers | number | metric | Returning customers attributed to the activity. ⚠️ A DISTINCT count, so it is FETCHED LIVE from Shopify for the selected window and never summed from stored days — someone who came back on three days is one returning customer. The total is therefore smaller than the daily figures added up, and the column blanks (never guesses) when the live call cannot deliver: multiple stores, an unbounded range, or a grouping Shopify will not answer. |
ad_spend | money | metric | Ad spend as the channel itself reported it. ⚠️ A '(reported)' figure, not Shopify-measured money; zero on unpaid campaigns (email, messaging). |
impressions | number | metric | Impressions as the channel reported them. |
clicks | number | metric | Clicks as the channel reported them. |
conversion_rate | percent | metric | Attributed orders divided by attributed sessions — Shopify's own formula from the channel report. Blank where the activity drove no sessions. |
roas | number | metric | Return on ad spend — attributed sales divided by reported ad spend. Blank on unpaid activity (spend 0). ⚠️ Denominator is channel-reported money. |
cost_per_acquisition | money | metric | Reported ad spend divided by attributed orders — Shopify's CPA. Blank where spend is 0 or no orders attributed. |
customer_acquisition_cost | money | metric | Reported ad spend divided by attributed NEW customers — Shopify's CAC. Blank where spend is 0. |
click_through_rate | percent | metric | Reported clicks divided by reported impressions — Shopify's CTR over the channel's own engagement figures. |
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'. |