← Back to blog
6 min readBy Feedyio

GTIN, EAN and identifier_exists: getting product identifiers right in your Google feed

Product identifiers are the part of the Google feed spec that trips up the most merchants. You add a barcode to one product and forget it on another, you guess at a value for a handmade item, or you set identifier_exists to no just to clear a warning - and a week later half your catalog has limited visibility. This guide walks through what counts as an identifier, when a GTIN is actually required, how to handle products that genuinely don't have one, and the single mistake that quietly gets products demoted.

What counts as a unique product identifier

Google uses three attributes to recognize the exact product you're selling:

  • GTIN (gtin) - the global trade item number, i.e. the barcode the manufacturer assigned.
  • MPN (mpn) - the manufacturer part number, used when a product has no GTIN.
  • Brand (brand) - the brand under which the product is sold.

The point of these fields is to match your listing to the same product everyone else is selling, so Google can group offers, show the right product page, and surface your item for the right searches. The richer and more accurate your identifiers, the better your product is understood - and the fewer "limited performance due to missing identifiers" warnings you'll see.

GTIN vs. EAN, UPC, ISBN - the same family

"GTIN" is the umbrella term, and the barcode formats you already know are just regional members of it. There is no separate ean or upc field in the Google spec - you put any of them in the single gtin attribute:

  • EAN - the 13-digit European barcode (sometimes 8 digits, EAN-8).
  • UPC - the 12-digit North American barcode (also called UPC-A).
  • JAN - the Japanese 13-digit barcode.
  • ISBN - the identifier for books.
  • ITF-14 - the 14-digit code used on outer cases and multipacks.

So a valid GTIN is 8, 12, 13, or 14 digits long. Whatever the barcode on the box is, it goes in gtin as-is.

✅ Send EAN, UPC and ISBN all in the same field

<g:gtin>5012345678900</g:gtin>   <!-- 13-digit EAN -->
<g:gtin>885909950807</g:gtin>    <!-- 12-digit UPC -->
<g:gtin>9780262033848</g:gtin>   <!-- 13-digit ISBN -->

Submit only the digits. Don't include spaces, hyphens, or the human-readable text printed under the barcode.

❌ Wrong

<g:gtin>5-012345-678900 (EAN)</g:gtin>

✅ Fixed

<g:gtin>5012345678900</g:gtin>

When GTIN is required vs. recommended

This is the part most people get backwards. A GTIN is strongly recommended, not universally mandatory - but there's an important condition attached. If a product has an assigned GTIN and you leave it out of the feed, the product can suffer limited visibility and may be disapproved. In other words: if the manufacturer gave the product a barcode, you're expected to send it.

The practical rule:

  • The product has a barcode (almost anything branded and mass-produced) → send the GTIN. Omitting it is the mistake.
  • The product genuinely has no barcode (handmade, private-label, certain parts) → send brand + MPN where you can, and use identifier_exists to declare the gap honestly.

The brand + MPN combination is the fallback when there's no GTIN. It still lets Google identify the product, just less precisely than a barcode would.

One GTIN per variant: getting color and size right

Each product and each variant has its own GTIN. A blue shirt in size M and the same shirt in size L are two different trade items with two different barcodes - so they need two different gtin values in the feed.

The common error is assigning the parent product's barcode (or one variant's barcode) to every variant.

❌ Wrong - same GTIN on every size

<item><g:id>SHIRT-BLUE-M</g:id><g:gtin>5012345678900</g:gtin></item>
<item><g:id>SHIRT-BLUE-L</g:id><g:gtin>5012345678900</g:gtin></item>

✅ Fixed - each variant carries its own GTIN

<item><g:id>SHIRT-BLUE-M</g:id><g:gtin>5012345678900</g:gtin></item>
<item><g:id>SHIRT-BLUE-L</g:id><g:gtin>5012345678913</g:gtin></item>

On Shopify this maps cleanly: the barcode field lives on the variant, not the product, so as long as each variant's barcode is filled in, each row in your feed gets the right GTIN.

Products that genuinely have no GTIN

Some products were never assigned a barcode. The categories Google calls out:

  • Custom or handmade goods.
  • Store / private-label brands you produce yourself.
  • OEM and replacement parts.
  • Vintage and antique items.
  • Books published before 1970 (no ISBN).

For these, do two things. First, send brand and mpn if you have them - for a private-label product, your own brand and your own part number are valid identifiers. Second, set identifier_exists to declare that no manufacturer GTIN exists.

The attribute accepts yes/true or no/false (English values only, regardless of your feed language). Set it to no only when the product truly has no assigned GTIN, MPN, and brand.

✅ Handmade item - brand + MPN, no manufacturer GTIN

<item>
  <g:id>CERAMIC-MUG-01</g:id>
  <g:brand>Your Studio Name</g:brand>
  <g:mpn>MUG-2026-RED</g:mpn>
  <g:identifier_exists>no</g:identifier_exists>
</item>

The mistake to avoid: falsely claiming no identifier exists

The most damaging shortcut is setting identifier_exists to no on a product that actually does have a barcode, just to silence a missing-GTIN warning. Google cross-checks identifiers, and if it finds evidence that a GTIN exists for a product you've declared has none, the product gets a warning anyway - so you've gained nothing and added a data-quality flag.

Two corollaries that save you trouble:

  • Don't guess a GTIN. A made-up or check-digit-invalid barcode is worse than no barcode. If you don't have the real value, leave gtin blank rather than inventing one.
  • Don't put internal values in gtin. Your SKU, your warehouse code, or an internal article number is not a GTIN. Those belong in id or mpn, never in the barcode field.

❌ Wrong - internal SKU stuffed into gtin

<g:gtin>SKU-00042</g:gtin>

✅ Fixed - leave gtin blank, use mpn and declare honestly

<g:mpn>SKU-00042</g:mpn>
<g:identifier_exists>no</g:identifier_exists>

One nuance for resale: if you sell a used or vintage item that does have a manufacturer GTIN, still submit that GTIN and set condition to used. The barcode doesn't change just because the item is second-hand.

How Feedyio maps your Shopify barcodes to the feed

On Shopify the barcode lives on each variant, and that's exactly where a GTIN should come from. Feedyio reads the variant barcode and places it in the gtin attribute for every row, so each color and size carries its own identifier without any manual editing. When a variant has no barcode, Feedyio can fall back to your brand and a part number and set identifier_exists correctly, instead of leaving a gap that turns into a warning. The result is a clean Google Merchant Center feed with the identifier fields filled in the way Google expects - and if you're also fixing disapprovals, our guide to the most common Merchant Center errors and the one on category mapping cover the next things to get right.

Want your barcodes mapped to GTIN automatically across every variant? Try Feedyio free on the Shopify App Store.