Blog / Advertising · ChatGPT Ads

ChatGPT Ads are one click away in Shopify. Launching them was never the hard part.

OpenAI shipped a free Shopify app that syncs your catalog and builds campaigns from it. It works. But ChatGPT Ads has no dry run, no atomic writes, and no conversions in its performance endpoint, and each of those quietly breaks a habit you brought from Google.

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.

What you're shownWhat the ad is doing
T+0s
You click publish
Campaign created
T+1s
API returns success
Ad group created
T+2s
Dashboard says live
Ad created
~T+20m
Dashboard still says live
Policy review rejects the ad
Day 4
Still says live
Never served. Budget untouched.
They stop agreeing here, and nothing in the apply path ever tells you.
What Lumin Ads adds

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.

Two lanes, one clock. The left is everything the apply path can tell you; the right is what the ad is actually doing. They agree for about twenty minutes.

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

mutate_operations
Campaign + ad group + ad
Wholly succeeds, or wholly fails

Nothing to clean up. There is no halfway.

ChatGPT Ads · three calls

1Campaigncreated
2Ad groupcreated
3Adfailed

A campaign and an ad group that exist, no ad, and a budget attached. Nothing serving, nothing obviously broken.

What Lumin Ads does

2Ad grouparchived
1Campaignarchived

Compensated in reverse, children before parents, and the result names anything the rollback could not undo, rather than swallowing it.

One transaction against three HTTP calls. The failure lands between the calls, which is a place Google's API does not have.

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

conversions

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.

The mistake is not exotic. It is reading to the bottom of a list and stopping, because on Google that list is where conversions live.

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.

We'll tell you how many of your ads passed review.

Read-only access to the ad account, real findings written down, and you keep them whether or not you hire us.

Rather talk? (269) 532-6248

No obligation. Read-only access. Privacy

Request a marketing audit →