# ChatGPT ads for a Shopify store, end to end URL: https://adsonomy.com/guides/chatgpt-ads-for-shopify-stores Published: 20 September 2026 Last updated: 20 September 2026 Plain-text version of the page above. Adsonomy is an independent product and is not affiliated with OpenAI or Shopify. ## Summary The deep Shopify version of running ads in ChatGPT: how a store is connected now that Shopify has closed the "Develop apps" route, how the catalogue is read variant by variant over the GraphQL Admin API, how the product feed is built and pushed, how the pixel and the server-side order relay are set up, what the first campaign consists of, and which Shopify steps are still manual. The shorter overview covering Shopify, WooCommerce and BigCommerce together is at https://adsonomy.com/guides/openai-ads-for-shopify-woocommerce-bigcommerce. ## Key facts - Shopify closed the "Develop apps" route in the Shopify admin on 1 January 2026. A store is connected by installing an app; a store that already has an admin-created app can still paste that token. - Adsonomy asks for three read-only Shopify scopes: read_products, read_inventory and read_orders. read_all_orders is not requested, so order history reaches back 60 days. - Adsonomy reads the Shopify catalogue over the GraphQL Admin API, pinned to version 2026-07, which is what allows products with more than 100 variants to be represented at all. - The deprecated REST product endpoints return at most 100 variants per product; Shopify has allowed up to 2,048 variants on one product since 15 October 2025. - One row per variant: title plus variant name, product URL with the variant id, barcode as GTIN, SKU as MPN, compare-at price as the regular price when discounted, availability from the inventory item and inventory policy. - Catalogue syncs run every six hours; the product feed gets a full push daily and a price and availability delta every 30 minutes when something changed. - The feed is the Agentic Commerce product file format, delivered over SFTP or from a hosted URL pasted into Ads Manager once. - Orders are polled every 30 minutes and relayed as order_created events with the Shopify order id as the event ID. There are no webhooks in Adsonomy yet. - The Shopify Web Pixel extension is not built: the theme snippet and the Custom Pixel are pasted by hand. - Feeds, conversion pixels and Conversions API keys are capabilities OpenAI enables per ad account. - Custom audiences are not available for campaigns targeting the EEA or Switzerland. ## Full text This is the Shopify-only version of the work: how a store is connected now that Shopify has closed the old token route, what the catalogue looks like once it has been read variant by variant, how orders are counted, and what the first campaign actually consists of. The shorter overview that covers Shopify next to WooCommerce and BigCommerce is [the three-platform guide](https://adsonomy.com/guides/openai-ads-for-shopify-woocommerce-bigcommerce), and this page does not repeat it. **Key takeaways** - Connect the store by installing an app. Shopify closed the "Develop apps" route in the Shopify admin on 1 January 2026, so a new store cannot hand over a token it made itself. - Every variant becomes its own product row, because a variant is what carries the price and the stock and what a shopper buys. - Reading the catalogue through the GraphQL Admin API is what allows a product with more than 100 variants to be represented at all. - Report each order twice on purpose, once from the browser pixel and once from the server relay, both carrying the Shopify order id as the event ID so it is counted once. - Two Shopify steps are manual today: pasting the theme snippet and adding the Custom Pixel. A Web Pixel extension and webhooks are not built. **Key facts** - Shopify closed the "Develop apps" route in the Shopify admin on 1 January 2026. A store that already has an admin-created app can still paste that token. - Adsonomy asks for three read-only scopes: read_products, read_inventory and read_orders. Without read_all_orders, which Shopify approves on request, order history reaches back 60 days. - Adsonomy reads Shopify over the GraphQL Admin API, pinned to version 2026-07. The deprecated REST product endpoints return at most 100 variants per product, and Shopify has allowed up to 2,048 since 15 October 2025. - Catalogue syncs run every six hours. The product feed gets a full push daily and a price and availability delta every 30 minutes when something changed. - The feed is the Agentic Commerce product file format, delivered over SFTP or from a hosted URL pasted into Ads Manager once. - Orders are polled every 30 minutes and relayed as order_created events. There are no webhooks in Adsonomy yet, on Shopify or anywhere else. - Feeds, conversion pixels and Conversions API keys are capabilities OpenAI enables per ad account. They are not on by default. ### A Shopify store is connected by installing an app, not by pasting a token Shopify closed the "Develop apps" route in the Shopify admin on 1 January 2026. A merchant can no longer create a custom app there and hand its Admin API access token to a tool, so a store is connected by installing an app instead. In Adsonomy that is the Connect Shopify action on the Sources page: you give the store address, Shopify asks you to approve the scopes, and you come back to a connected source with its first sync already queued. A store that already had an admin-created app from before that date can still paste that token, and the field stays for exactly that case. Status, 20 September 2026. The Shopify app is still being registered with Shopify, so the Connect Shopify action is not switched on for every account yet. Until it is, a Shopify store connects the way any other platform does, with a product feed URL in Google Shopping or Channable format, and everything below about the catalogue, the feed and the pixel behaves the same once the source exists. Three read-only scopes are requested and nothing more. `read_products` for the catalogue, `read_inventory` for the cost per item that every margin rule needs, and `read_orders` for the sales that are reported back as conversions. `read_all_orders` is deliberately not among them: it reaches past the 60 day order window Shopify applies by default, but it has to be approved by Shopify first, and declaring an unapproved scope makes an app version fail to build. Nothing in the list can write to your store. The install is checked before the authorisation code is spent: the signature over the query string, the state value, its age, and that the shop answering is the shop the install started for. Reinstalling updates the source you already have rather than building a second catalogue beside the first. Setting up the OpenAI side is separate work and is covered in [how to get access to ChatGPT ads and register](https://adsonomy.com/guides/how-to-get-access-to-chatgpt-ads-and-register). ### Every variant becomes a product row, read over the GraphQL Admin API Adsonomy reads a Shopify catalogue through the GraphQL Admin API, pinned to version 2026-07, and writes one row per variant. That choice is what allows a product with more than 100 variants to be represented at all: the REST product endpoints have been deprecated since the 2024-04 version and return at most 100 variants per product, while a merchant has been able to put up to 2,048 variants on a single product since 15 October 2025. A product with no options still yields exactly one row. What a variant becomes is worth knowing before you open your feed and wonder where a field went. The title is the product title with the variant name appended, unless the variant is the unnamed default. The link is the product's online store URL with the variant id attached, so a click lands on the size and colour the ad was about, and a product not yet published to the online store falls back to its handle because a click has to land somewhere. The barcode becomes the GTIN and the SKU becomes the MPN. When a variant is discounted the compare-at price is the regular price and the current price is carried separately as the sale price, so a promotion reads as a promotion rather than as a permanent cut. Availability comes from the inventory item and the inventory policy together, which means a variant that is not tracked, or that is set to keep selling when it runs out, counts as available. Two Shopify behaviours are handled quietly and are the reason a sync can be trusted. An unsupported API version is not an error on Shopify: it serves the oldest supported version instead and says nothing, so the version in the response is compared with the version that was asked for and any drift is logged. And a throttled call answers with HTTP 200 and a throttling code inside the body rather than a 429, so a rate limit is never read as an empty catalogue. A sync that comes back with nothing never wipes what is already stored. ### The product feed is built from those variants, not exported from Shopify OpenAI expects the Agentic Commerce product file format, which no Shopify export produces. Adsonomy creates the feed on your ad account, provisions the SFTP access, maps your variant rows into that schema and pushes the file: the complete catalogue once a day, then a delta for price and availability every 30 minutes whenever a catalogue sync found changes. You never handle SFTP yourself. Two details decide whether an ad stops when the product should. A product missing from a processed upload is kept for up to 14 days before it expires, so removing a line by leaving it out is slow and unreliable; the whole catalogue goes up every time and anything that should stop serving is sent explicitly as out of stock. And because a variant is its own row, one sold-out size goes out of stock on its own instead of taking the entire product out of the feed. Titles including the variant name should stay within 150 characters, and rows the schema rejects are shown per upload rather than dropped in silence. Ads Manager can also fetch the file from a hosted URL instead of SFTP. The API only reports whether a hosted URL is configured, not what it is, so Adsonomy publishes the file at a private address protected by a username and password and you paste those into Ads Manager once. Feeds, conversion pixels and Conversions API keys are capabilities OpenAI enables per ad account, so confirm they are switched on before you fix a launch date. How this file differs from the Google Merchant Center one you may already maintain is in [OpenAI product feeds versus Google Merchant Center](https://adsonomy.com/guides/openai-product-feed-vs-google-merchant-center). ### Conversions need a pixel in the browser and the orders from your server Both layers report the same purchase and the platform deduplicates them by event ID. For Shopify, Adsonomy generates two snippets: one for `layout/theme.liquid`, pasted inside the head above the content_for_header line, which covers storefront pages, and one Custom Pixel added under Settings and then Customer events, which fires order_created at checkout with the Shopify order id as the event ID. The server relay sends the same order with the same id, so the order counts once. Pasting those two snippets is manual today. Installing the pixel as a Shopify Web Pixel extension is planned and not built, so budget a few minutes in the theme editor and in Customer events. The Custom Pixel needs its customer privacy setting on Marketing to run at all, which is the most common reason a correctly pasted pixel reports nothing. If your storefront enforces a content security policy, the OpenAI script domain has to be allowed there as well. On the server side, Adsonomy polls your Shopify orders every 30 minutes and relays them as order_created events. It polls because there are no webhooks in the app yet, on Shopify or on any other platform, so an order arrives within the next half hour rather than within seconds. Personal data such as the customer email is normalised and hashed with SHA-256 before it leaves your systems, events must carry a timestamp from the last 7 days, and one request to the Conversions API carries up to 1,000 events. Conversions need at least a day to appear in reporting, so the first campaign is judged on yesterday's orders and never on this morning's. The mechanics of both layers are set out in [the conversion tracking guide](https://adsonomy.com/guides/openai-ads-conversion-tracking-pixel-and-conversions-api). ### The first campaign is one product set, one hint list and one product ad For a store the first campaign is a product feed campaign: a campaign that carries the budget, the locations and the conversion events, one ad group that points at a product set and holds the context hints, and one product ad template that takes its image, destination URL and price from the feed item. Everything is created paused on the platform, so nothing serves until you activate it deliberately. Keep the first one narrow. A product set that is a slice you understand, one category or one margin tier, beats the whole catalogue, because the report then tells you something you can act on. Context hints are free-text descriptions of the intent you want to appear next to rather than keywords, and an ad group accepts up to 2,000 of them. The budget is a daily amount or a lifetime amount, never both on the same campaign. Choose the conversions objective once order_created events are actually arriving and clicks before that, because an optimisation goal with no data behind it is a slower way to spend. A template that prints the product price shows whatever the feed currently says, so a promotion needs no new creative. Writing the hint list is covered in [context hints in ChatGPT ads](https://adsonomy.com/guides/contextual-targeting-and-context-hints-in-chatgpt-ads), and the step order in [launch your first ChatGPT ads campaign](https://adsonomy.com/guides/launch-your-first-chatgpt-ads-campaign). After launch, Nomy is the AI manager that reads the same data every morning and proposes what to change, within the guardrails and policy you set. A proposal for a new campaign always waits for a person, whatever the policy says. What may and may not be applied automatically is set out in [the guardrails guide](https://adsonomy.com/guides/autopilot-guardrails-and-accountability). ### Cost per item is what turns a Shopify catalogue into margin rules The ad platform knows what an order was worth and nothing about what it cost you. Shopify does know, because the cost per item sits on the inventory item, and that is why `read_inventory` is in the scope list. With it, every variant carries a unit cost, a margin and a margin tier, and rules can be written about profit rather than revenue. Without it, costs are skipped and margin rules have nothing to read. Costs you set by hand in Adsonomy are never overwritten by a sync, and a sync that sends no cost for an item leaves the stored cost alone, so a missing scope or a dropped field cannot wipe what you entered. If your unit costs live in Shopify, keep them there and let the sync carry them. If they live in a spreadsheet, set them in Adsonomy once and the shop will not argue with them. ### Four things are still manual on Shopify today It is better to plan around them than to discover them. The pixel and the Custom Pixel are snippets you paste, because the Shopify Web Pixel extension is not built. Orders and the catalogue are polled rather than pushed, because there are no webhooks anywhere in the app. There is no embedded Adsonomy app inside the Shopify admin, so you work in Adsonomy and in Ads Manager rather than in one screen. And if you deliver the feed by hosted URL, that URL and its credentials are pasted into Ads Manager once by hand, because the API does not accept them. One platform limit is worth stating plainly because it surprises people who come from Meta. Custom audiences are not available for campaigns targeting the EEA or Switzerland. On this platform the targeting is done by context hints and the product feed, so a European store is not held back by it. The three-platform guide covers [what applies to every shop platform](https://adsonomy.com/guides/openai-ads-for-shopify-woocommerce-bigcommerce), including that point in more detail. ## Frequently asked questions Q: Can I still connect a Shopify store with an Admin API access token? A: Only if that store already has an app a staff member created before Shopify closed the Develop apps route in the Shopify admin on 1 January 2026. No new token of that kind can be made. A store without one installs the Adsonomy app instead and approves read_products, read_inventory and read_orders, which takes about a minute and needs no developer. Q: What happens to a Shopify product with 300 variants? A: All 300 variants are read and each one becomes its own product row. Adsonomy reads the catalogue through the Shopify GraphQL Admin API and pages through the variants of a product, so nothing is cut off at 100 the way the deprecated REST product endpoints are. Shopify has allowed up to 2,048 variants on a single product since 15 October 2025. Q: How quickly does a Shopify price change reach the ad? A: At the next sync, not at the moment it is saved. Adsonomy syncs a Shopify catalogue every six hours and sends a price and availability delta to the product feed every 30 minutes when a sync found changes. A product ad template that prints the feed price then shows the new price without a new creative. There are no Shopify webhooks in Adsonomy yet, so nothing is pushed the instant it changes in the shop. Q: Does Adsonomy install the OpenAI pixel on my Shopify theme for me? A: No, that step is manual today. Adsonomy generates two Shopify snippets, one for layout/theme.liquid and one Custom Pixel for Settings then Customer events, and you paste them. Installing the pixel as a Shopify Web Pixel extension is planned and not built, so plan a few minutes in the theme editor. Q: Which Shopify scopes does Adsonomy ask for, and why? A: Three, all read-only: read_products for the catalogue, read_inventory for the cost per item that every margin rule needs, and read_orders for the sales reported back as conversions. read_all_orders is not requested, so order history reaches back 60 days, which is what the conversions relay needs. Nothing in that list can write to the store.