Developer Changelog / Analytics API

Shop Campaigns performance data
can now be pulled from ShopifyQL

shop_campaign_insights schema added. Query ad spend, sales, order count, ROAS, AOV, and average customer acquisition cost using the existing shopifyqlQuery field and read_reports scope as-is. No new scopes, no extra implementation.

On this page
  1. What actually changed (in 30 seconds)
  2. How it works: the path the data takes
  3. Available metrics and dimensions
  4. What's new / what stays the same
  5. Requirements
  6. How to get started (3 steps)
  7. Two features announced together
  8. 5 points developers should know
  9. 3 practical use cases
  10. A one-line summary for proposals

1What actually changed

A new shop_campaign_insights schemahas been added to ShopifyQL.
Analytics and reporting apps can queryShop Campaigns performance data for merchants who have granted access, using the existing shopifyqlQuery field plus the read_reports scope, exactly as they do today.

Before

ShopifyQL could already query other schemas, but no shop_campaign_insights existed for pulling Shop Campaigns performance data.

Now

Just point the same shopifyqlQuery at the new schema name.If your app already calls ShopifyQL, no new scopes and no integration work are required— stated explicitly.

2How it works: the path the data takes

Analytics / reporting app Merchant-approved query shopifyqlQuery (existing field) read_reports No new scope needed shop_campaign_insights By campaign By segment Time granularity: hourly to yearly ShopifyQL schema Metrics returned ad spend sales / orders ROAS average order value (AOV) average customer acquisition cost Based on the shop's time zone
The key point is that no new entry points were added. The query endpoint is the same as before: shopifyqlQuery, and the required permission is unchanged: read_reports. The only thing that changed is the list of schema names you can query.

3Metrics and dimensions available

Metrics

Ad spend
Amount spent on the campaign
Sales
Sales attributed to the campaign
Orders
Number of orders generated
ROAS
ROAS
Return on ad spend (ROAS)
AOV
Average order value
average order value
¥
Average customer acquisition cost
average customer acquisition cost

Dimensions

DimensionDescription
Campaign name Break metrics down at the campaign level
Customer segment Break metrics down at the segment level
Time Hourly through yearly hourly / ... / yearly.the merchant's shop time zoneis used
Data retention, latency (the lag before data is complete), rate limits, supported plans, and regional availability arenot covered in this article. Check the schema reference for details.

4What's new / what stays the same

ItemWhat changed
Schema Added shop_campaign_insights is now available in ShopifyQL
Query fields No change Use the existing shopifyqlQuery as-is
Required scopes No change read_reports.No new scopes needed
Integration work If you already query ShopifyQL,no additional integration work is requiredis stated explicitly
Who runs the query Analytics / reporting appson behalf of authorized merchantsquery
Time zone Returned based on the merchant's shop time zone

5Requirements

read_reports Scopes

The same scopes as your existing ShopifyQL queries. No additional scopes are needed.

Merchant authorization

Queries run on behalf of "authorized merchants". Only data from authorized stores is covered.

An implementation that can call ShopifyQL

If you already use shopifyqlQuery , you can reuse that code path.

Whether this works outside apps (the reports screen in the admin, or direct use from a public storefront) isnot stated. The post describes queries made from analytics / reporting apps.

6How to adopt it (3 steps)

1

Check your scopes

read_reports Confirm you have it. If you already query ShopifyQL, it's usually unchanged.

2
QUERY

Swap in the new schema name

With the same shopifyqlQuery shop_campaign_insights and query it.

3

Choose your metrics and granularity

Specify a campaign name, segment, and time granularity (hourly to yearly) to build the report.

In the post's words, "No new scopes or integration work required if you already query ShopifyQL." = For apps already using ShopifyQL, this amounts to little more than "adding one more query."

7Two features announced at the same time

Analytics Web Components

Shop Campaigns metrics can beembedded directly into your own app's UIwith this web component.no data storage requiredis stated explicitly. It's a route to putting metrics on screen without building your own fetching, storage, and rendering.

Analytics Annotations API

An API that cancreate annotationson a merchant's analytics charts. The examples in the post are "campaign started" and "budget changed" — a way to pin "why it moved" onto the points where the numbers change.

These two are "Also new"listed side by side. Requirements, scopes, and availability for each arenot documented in the post.

85 points engineers should know

SCHEMA

1. Only the schema is new — the entry point is the same

The endpoint and authorization are unchanged.shopifyqlQuery — if your app already has a wrapper for it, adding an argument to pass the schema name through is about all it takes. The kind of change that keeps the diff review small.

2. read_reports stays as is = no re-authorization flow

Adding a scope normally means re-consent across every existing install. Here it's stated explicitly that this isn't needed, soyou can ship without asking merchants to re-approve— practically speaking, that's the biggest win.

3. Granularity goes all the way down to the hour

hourly through yearly. You can see spend efficiency by time of day, but a fine granularity over a wide range makes responses heavy.Design the granularity and range limits on the app sideto be safe.

4. Time zones follow the shop

The time axis returned uses the merchant's shop time zone. If your own dashboard is built on a fixed UTC or JST, the date boundaries will drift from your other data sources. If you plan to reconcile them, decide on a conversion policy first.

5. Two options: pull it yourself, or embed it

To surface the same metrics, two routes shipped at once:fetch with ShopifyQL and render it yourself, andembed with Analytics Web Components (no data storage). If you need to transform, reconcile, or export, go with ShopifyQL; if you just want it on screen, the component takes less code. Decide which one is enough before building out both.

93 use cases you can put to work

campaign × ROAS
USE CASE 1

Adding a "Shop Campaigns tab" to an existing reporting app

Problem
Your in-house or client-facing analytics app can already report revenue and orders, but Shop Campaigns ad spend and ROAS were out of reach, leaving the report running on one lung.
What to do
To your existing shopifyqlQuery call, add a shop_campaign_insights query, and surface ad spend, revenue, order count, and ROAS in a table by campaign name × time period.
Impact
You can show not just "what sold" but "how much you paid to sell it" on a single screen. Your report deliverables get more persuasive.
Technical notes
No new scopes are required, so you can ship it without forcing already-installed merchants throughre-authorization. Note that the date axis is based on the shop's time zone.
CAC
USE CASE 2

Reviewing "whether acquisition cost pencils out" by customer segment

Problem
You only see campaign-wide numbers, so there's no way to discuss which segments have acquisition costs that don't pay off.
What to do
For each segment, line up average customer acquisition cost/average order value/ROAS side by side, and pick out the segments where acquisition cost is heavy relative to AOV.
Impact
You can recommend "which segments to lean into" with numbers from a single source instead of gut feel. It works as a standing agenda item for monthly reviews.
Technical notes
Slicing on both segment and time blows up the row count, so a practical design is to get a rough read monthly first, then drill down to finer granularity.
budget changed
USE CASE 3

Leaving annotations for "why the graph moved"

Problem
When you look back at a spike or drop in the numbers, you can't tell whether it was a campaign launch or a budget change, so you end up digging through Slack and meeting notes every time.
What to do
Use the Analytics Annotations API to automatically create annotations on analytics charts when a campaign starts or a budget changes (the article's own examples are literally "campaign started" and "budget changed").
Impact
Merchants understand cause and effect the moment they look at the chart. Prep work for retrospective meetings goes down.
Technical notes
This post doesn't document the API's detailed spec. Before implementing, check the API reference for the creation unit, permissions, and idempotency (avoiding duplicate annotations for the same event).

10One-line summary you can use in a pitch

"Shop Campaigns ad spend, revenue, order count, ROAS, AOV, and customer acquisition cost are now available from theShopifyQL shop_campaign_insights schemacan now be queried.
Existing shopifyqlQuery and read_reports stay as they are — no new scopes and no extra integrations needed to add campaign performance to your reports.
Analytics Web Components if you just want it on screen, and the Annotations API if you want to record what changed — both options are landing at the same time."