On 3 September 2026 OpenAI published its own app to the Shopify App Store. Free, and it does the obvious things well: syncs your catalog into ChatGPT Ads Manager, builds campaigns from it in a few clicks, wires conversion tracking through your Shopify pixels, and keeps reporting inside the Shopify admin. International markets followed on 23 September. The catalog format is the same feed you send to Google Shopping, so there is nothing to rebuild.
If you sell on Shopify in the US, click it. This post is about day four, when the campaign is live and the numbers look wrong, because ChatGPT Ads has three structural properties the Google playbook does not account for. Every one fails quietly.
1. “Applied” does not mean “running”
Google Ads gives you validate_only: send a change, the API says whether it would be
accepted, then you commit. Policy review happens up front.
ChatGPT Ads has no dry run. The ad applies immediately, and policy review lands afterwards, asynchronously.
This is the most expensive failure mode on the platform. Your change succeeded. The API returned success. The dashboard says live. And the ad is not serving, because review rejected it twenty minutes later and nothing told you. The budget sits there looking healthy because nothing is spending it.
Review is polled after every apply and written back as a separate axis from status. A rejection flips the change to REVIEW_REJECTED and notifies whoever proposed it, and it is the first thing the agents check on the next run.
What Lumin Ads does. We treat review as a separate axis from status, because it is one:
the change applied, the ad just may not be serving. After every apply we poll the verdict with
backoff and write it back. A rejection flips the change to REVIEW_REJECTED and notifies
whoever proposed it, and it is the first thing our agents check on the next run. No point
optimising an ad that was never eligible to serve.
We also validate before proposing. ChatGPT publishes an OpenAPI schema, so required fields, enums, limits and reference integrity are checkable before anything is queued. A schema failure here is definitive, so it goes back for revision rather than being sent.
2. A failed change can leave you with half a campaign
Google sends one mutate_operations call that wholly succeeds or wholly fails. One transaction.
ChatGPT Ads is per-resource REST. A campaign with an ad group and an ad is three separate HTTP calls, and any one can fail. Lose the last and you have a campaign and an ad group that exist, no ad, and a budget attached. Nothing serving, nothing obviously broken, and the error names only the call that failed. Iterate a few times and you accumulate orphaned scaffolding.
Google Ads · one call
Nothing to clean up. There is no halfway.
ChatGPT Ads · three calls
A campaign and an ad group that exist, no ad, and a budget attached. Nothing serving, nothing obviously broken.
What Lumin Ads does
Compensated in reverse, children before parents, and the result names anything the rollback could not undo, rather than swallowing it.
What Lumin Ads does. Every change runs with compensation. If a plan fails partway we archive everything created during that run in reverse order, children before parents, and report exactly what was undone and what was left behind. A rollback that itself fails is reported rather than swallowed, naming the resources still live. You are never told “done” when the truth is “partly”.
It is also why our propose tools bundle: proposing a campaign takes the first ad group and ad with it, so one approval produces something that can serve. Three separate approvals is three chances to strand a half-built structure.
3. Your conversion numbers are not in the conversions
This one costs real money and is easy to miss.
The ChatGPT Ads insights endpoint returns impressions, clicks, spend, CTR, CPC and CPM. That is the whole list. No conversions.
GET /insights returns
- impressions
- clicks
- spend
- ctr
- cpc
- cpm
end of list
What is not in it
A separate endpoint, POST /conversions/insights, keyed by entity id. Read insights and stop, and every decision you make is based on clicks.
You will cut the ad group with the worst CTR, and it will turn out to have been the one that was selling.
Conversions come from a separate endpoint, keyed by entity id. Read insights and stop, which is the natural thing to do, and every decision is based on clicks. You will cut the ad group with the worst CTR and it will turn out to have been the one that was selling. Never infer conversions from clicks here: a conversational placement produces a different click than a search ad does.
What Lumin Ads does. Our query layer merges both endpoints before anything downstream sees a number, so reports, dashboards and agents read the same figures. We normalise the money too: budgets and bids arrive in micros, insights spend as a plain float in account currency, and letting those units meet in a spreadsheet is how you end up off by a factor of a million.
The Google playbook does not port
These are real capability gaps, not things arriving next quarter.
ChatGPT Ads has no keywords. No match types, negative keywords, search terms report, Quality Score or impression share. None of the ten extension types. No Performance Max, Demand Gen, Video or Shopping campaigns. No experiments, recommendations or change history. No smart bidding. No device, schedule or demographic bid adjustments. No proximity or city targeting.
In place of keywords there are context hints, the signal that tells ChatGPT which conversations your ad belongs in. They are not keywords renamed, and they are replaced wholesale rather than merged, so you read the current set and pass the complete intended set every time.
Roughly 30 of the ~50 things we propose on Google have a counterpart here. We say so in the tool descriptions and the agents’ system prompt, so the model does not improvise a keyword strategy on a platform with no keywords. What ChatGPT has that Google does not: context hints, product-feed campaign mode, and the post-hoc review above.
One queue, both platforms
If you advertise anywhere else, the honest problem with the Shopify app is none of the above. It is ChatGPT-only, so you now have a second place to look.
Lumin Ads runs ChatGPT Ads and Google Ads through one approvals queue, one reports page and one agent framework. Platform is a property of the account, so a client on both has two accounts sharing a domain: budgets, guardrails and agent freezes stay per-platform, while everything a human touches stays in one place.
Three ChatGPT-native agents cover the transferable intents:
- Waste cutter. Ad groups spending with no conversions get a bid cut, tighter context hints, or a pause.
- Budget pacing. Spend against daily and lifetime caps, computed without impression share, because impression share does not exist here.
- Creative review. Rejected ads that are not serving get compliant replacements, and stale creative gets flagged.
Our six Google agents are built on keywords, search terms, Quality Score and device bids, so the scheduler skips them for ChatGPT accounts rather than firing runs where every tool call fails.
The part that does not change: an agent proposes, a named person approves, and software enforces the spend caps. Caps are hard limits an approver cannot override, whether the change goes to Google or to OpenAI.
What we don’t do
We do not have a Shopify app, and the distinction matters.
Your feed gets into ChatGPT Ads through OpenAI’s app or Shopify Catalog. That part is theirs, it is free, and it is better than anything we would build to duplicate it. What we manage is the campaigns built against that feed: structure, budgets, context hints, review verdicts, conversion reporting, and the approval gate in front of all of it.
So the honest recommendation is: install OpenAI’s app, sync your catalog, then decide separately whether you want someone watching the three failure modes above.
If you want us to look first
We will audit an existing ad account before you commit to anything. Read-only access, real findings, and you keep them whether or not you hire us. If you have already launched from the Shopify app, the first thing we will tell you is how many of your ads passed review.
It is usually not all of them.
