Skip to main content

GUIDE № 12 · STRUCTURED DATA

How to Add GTINs to Shopify Products (and Why ChatGPT Often Skips Stores Without Them)

9 min read · Guide 12 of 17

One of the most common reasons ChatGPT doesn't recommend a Shopify store isn't bad SEO — it's a blank barcode field most merchants have never filled in.

In most categories, a missing GTIN is one of the most common reasons a Shopify product gets disapproved or down-ranked in the feeds that power ChatGPT Shopping. Edge cases (handmade, vintage, custom builds) get exemptions, but every other branded product effectively needs one. If your variants have blank barcode fields, you're sitting in the disapproved bucket on most days. This guide walks through what a GTIN is, where Shopify stores it, how to audit your coverage, and how to bulk-fix the whole catalog in an afternoon.

What GTINs are (and where Shopify stores them)

GTIN stands for Global Trade Item Number. It's the universal identifier that product catalogs, retailers, and shopping engines use to confirm that "this product" on your store is the same "this product" as on every other store that sells it. GTIN is an umbrella term — the flavors you've actually seen before are:

  • UPC-A — 12 digits, the standard in the United States and Canada
  • EAN-13 — 13 digits, the European equivalent
  • JAN — 13 digits, the Japanese equivalent (a subset of EAN)
  • ISBN — 13 digits, for books
  • ITF-14 — 14 digits, used on shipping cartons

Shopify stores all of these in a single field on the product variant called Barcode. Don't let the label fool you — that's where your GTIN goes. It doesn't matter whether your identifier is a UPC, an EAN, or a JAN; they all live in the same slot.

To see the field in the admin, open any product, scroll to Variants, click a variant, and look for the Barcode (ISBN, UPC, GTIN, etc.) field under the Inventory section. A correctly populated variant looks like this:

Product:  NutriPure Whey Isolate Protein Powder Vanilla 2lb
Variant:  Default
Barcode:  850012345678

That's a 12-digit UPC. Every variant of every product needs its own — a 2lb tub and a 5lb tub are two different GTINs, not one.

Why a blank barcode blocks ChatGPT Shopping cards

As of mid-2026, ChatGPT Shopping pulls product cards from multiple sources — Microsoft Merchant Center via Bing, direct Shopify and Etsy integrations, and OpenAI's own merchant feeds. Google's AI Overviews and Gemini shopping surfaces draw from Google Merchant Center. In categories where GTIN is expected (most branded manufactured products), Google flags missing GTIN as Limited performance and excludes affected items from many surfaces. Microsoft's required-field set is laxer — GTIN isn't in their universal required list — but the same items still rank below GTIN-tagged competitors when an assistant has to pick between offers.

The technical reason is disambiguation. When a shopper asks an AI for "vanilla whey protein 2lb under $40," the assistant needs to compare offers across dozens of retailers and know which ones are actually the same product. The GTIN is the join key. Without it, the AI has no reliable way to confirm your NutriPure Whey Isolate 2lb is the same SKU another retailer is listing at a different price — so it excludes you from the comparison entirely.

This is why a store with great titles, clean JSON-LD, and competitive pricing can still show zero impressions in AI shopping: the variants never cleared the Merchant Center ingest step. For a fuller picture of how off-site feeds gate AI recommendations, see off-site signals for AI recommendations.

GTINs also interact with your on-site structured data. If your JSON-LD includes a gtin property on the Product schema, assistants that crawl your store directly — rather than going through a Merchant Center feed — get the identifier there too. Shopify doesn't emit gtin in the default Product schema, which is one of the reasons we recommend extending it. See the JSON-LD structured data guide for the exact snippet.

How to check your GTIN coverage

Before you add GTINs, measure the gap. Shopify exposes every variant's barcode through the storefront JSON endpoint, which makes coverage a one-liner:

curl -s https://yourstore.com/products.json?limit=250 \
  | jq '[.products[].variants[] | {title, barcode}] | group_by(.barcode == null or .barcode == "") | map({blank: .[0].barcode == null or .[0].barcode == "", count: length})'

That prints two buckets: how many variants have a barcode and how many don't. On most stores we audit, the blank bucket is the larger one.

Note: Shopify's /products.json endpoint paginates at 250 products per page (not variants). If your catalog has more than 250 products, repeat the call with ?page=2, ?page=3, etc. and combine the results — the single-call snippet above only sees the first page and silently misses everything beyond it.

If you'd rather stay in the admin:

  1. Go to Products in your Shopify admin
  2. Click Export and choose All products as CSV
  3. Open the CSV and find the column named Variant Barcode
  4. Sort or filter by blank values in that column
  5. Count the empty rows — that's your coverage gap

The Variant Barcode column is the literal header Shopify uses in its product CSV. Any tooling you use for bulk edits needs to match that header exactly, or the import will silently skip the field.

How to add GTINs at scale

There are two paths, depending on how many variants you have.

Manual, one variant at a time. Fine for stores with fewer than ~50 variants. Open the product, open the variant, paste the GTIN into the Barcode field, save. If you have the physical product in hand, the GTIN is printed under the barcode on the packaging — scan it with any free barcode app on your phone and type the digits in.

Bulk via CSV import. The only sane option above ~50 variants.

  1. Go to Products and click Export
  2. Choose All products, format CSV for Excel, Numbers, or other spreadsheet programs
  3. Open the CSV. You'll see columns including Handle, Title, Option1 Name, Option1 Value, Variant SKU, and Variant Barcode
  4. Fill in the Variant Barcode column for every row that represents a variant. Rows that are just the parent product (no Option1 Value) don't need a barcode
  5. Save the file as CSV (UTF-8 if you see any special characters in product titles)
  6. Back in Shopify, go to Products > Import, check Overwrite existing products that have the same handle, and upload

Shopify matches by Handle plus Option1 Value / Option2 Value, so as long as those columns are unchanged, it will update the barcode in place without creating duplicate products. Do a dry run on 5 products first — export, edit those rows, re-import, confirm the barcodes show up in the admin — before you run it on the full catalog.

If you source products from a supplier, ask them for a GTIN list matching your SKUs. Most distributors have one; they just don't send it unless asked. If you manufacture your own products, you'll need to buy a GS1 prefix (the official registry) and assign GTINs from your own block. A GS1 prefix for up to 10 GTINs runs about $30/year; a 100-GTIN block is around $250/year (GS1 US, 2026 — pricing varies by country and is reviewed annually). This is the only path that will pass Merchant Center's stricter validation long-term — third-party "GTIN generators" produce numbers that Google and Microsoft will eventually reject.

While you're in the CSV, it's worth checking the Variant SKU column and the Title column too — the title format and the identifiers reinforce each other for AI matching. See the product title format guide for the exact format Merchant Center expects.

Edge cases: handmade, pre-owned, custom builds

Not every product has or can have a GTIN. Merchant Center knows this and publishes a specific path for each case.

Handmade and one-of-a-kind. A maker producing a Homestead & Co. Oak Cutting Board by hand in their workshop has no distributor, no GS1 prefix, and no real reason to assign a GTIN to each unique board. Merchant Center allows a brand-registered exemption: in the Merchant Center dashboard, open Products > Feeds > [your feed] > Settings, scroll to Automatic item updates, and check Identifier exists: no against your handmade category. The exemption is tied to your brand name, so the Vendor field on every Shopify product must be populated consistently — "Homestead & Co." on every row, not a mix of "Homestead" and "Homestead and Co."

Pre-owned and vintage inventory. A used 1960s armchair doesn't have a GTIN because GTINs didn't exist when it was made. Mark the feed item with condition: used (set this in the Google & YouTube channel app's product feed settings, or via a google: condition metafield — Shopify variants have no native condition field) and leave the barcode blank. Merchant Center accepts blank GTINs on pre-owned items without an explicit exemption.

Custom-manufactured with no assigned GTIN. Built-to-order furniture, bespoke jewelry, configure-to-order tech. These qualify for the same brand-registered exemption as handmade. The trade-off is real: exempt products are still eligible for Merchant Center and ChatGPT Shopping, but they rank below products that do have GTINs on the same query. The assistant prefers offers it can disambiguate with high confidence. For metafield-driven custom attributes (finish, fabric, dimensions) that need to surface in the feed, see the metafields for AI guide.

Bundles and multipacks. A 3-pack of your protein powder needs its own GTIN, distinct from the single-tub GTIN. Don't reuse the single-unit barcode on the bundle variant. If you haven't assigned one, leave it blank and apply the bundle exemption in Merchant Center — reusing a single-unit GTIN will get the bundle disapproved for a mismatch.

Verify the fix worked

Once the barcodes are saved in Shopify:

  1. Re-run the products.json curl from earlier. The blank bucket should be zero (or equal to your intentionally-exempt items)
  2. Check Google Merchant Center under Products > All products — filter by Disapproved and look for the reason Missing GTIN. That bucket should drain within 24–48 hours of the feed sync
  3. Repeat in Microsoft Merchant Center (Bing Shopping) under Catalog > Issues. Same filter, same expected result
  4. A week after both feeds are clean, try the target queries in ChatGPT with Shopping enabled. You won't always show up — other ranking factors still apply — but the cards are now eligible to render you, which they weren't before

GTINs are plumbing, not content. They don't win you ranking on their own, but without them you can't enter the race. An afternoon of CSV edits clears the entire AI shopping surface for your catalog. Run a free audit on your store →