NewThe tragent CLI is on npm: npx @tragent/cli scan your-store.com

Issue reference

Your products carry no GTIN or MPN

Issue code
SCHEMA_PRODUCT_IDENTIFIER_MISSING
Stage
Read the details
Protocol
—
Severity
Low

What it means

tragent reports this at the “Read the details” stage. The question there is “Can it understand what the product is?” Name, description, images and variants have to be readable as data, not just rendered as a page.

What it does to an agent

Agents get through, but your store reads less clearly to them than it could. It is worth fixing once the higher-severity issues are gone.

A GTIN is the number under the barcode, and it is how an agent knows two stores sell the same thing. Without it, an agent comparing prices for a shopper cannot match your listing to the same product elsewhere, so you drop out of comparisons even when you are cheapest.

Use the GTIN when the product has one; use the manufacturer part number (mpn) for items without a barcode. Your own SKU is still useful, but it is not a global identifier.

How to fix it

Add gtin (the barcode number) or mpn, so an agent comparing stores can tell you sell the same item.

Identifiers
"sku": "TR2-BLK-10",
"gtin13": "0123456789012",
"mpn": "NW-TR2-10-BLK"

On your platform

Shopify

Fill in the Barcode field on each variant; the structured_data filter reads it. Import tools often leave it empty even when the supplier's file has it.

WooCommerce

Recent WooCommerce versions have a GTIN, UPC, EAN or ISBN field under Inventory. Fill it in, then make sure it reaches the markup.

PHP
// In your child theme's functions.php, or a small plugin.
add_filter( 'woocommerce_structured_data_product', function ( $markup, $product ) {
    if ( method_exists( $product, 'get_global_unique_id' ) && $product->get_global_unique_id() ) {
        $markup['gtin'] = $product->get_global_unique_id();
    }
    return $markup;
}, 10, 2 );

Headless or custom

Emit gtin (or gtin8, gtin12, gtin13, gtin14 by length) on the Product, or on each variant's Offer where variants have their own barcodes.

In practice

Get identifiers from the source: the manufacturer's data sheet or the supplier's feed, not a barcode generator. A made-up GTIN is worse than none, because it matches a different product, and marketplaces check them against the GS1 registry. For your own products, register a company prefix with GS1 and assign GTINs from it; for handmade or one-off items with no barcode, use an mpn.

Identifiers belong to the variant, not the parent. A shoe in six sizes has six GTINs, so put each one on the variant's Offer or the variant Product inside a ProductGroup. An agent comparing a size 10 across stores matches the size 10 barcode; a single GTIN on the parent matches only one size and misleads on the other five.

Once identifiers are in place, keep them in place through catalogue changes. Re-importing products, switching themes or moving platforms are the moments they get lost, because the barcode lives in a field the import mapping does not cover. Add the barcode field to your import template and check a few products after each import, the same way you would check prices.

Check the fix

  1. Check the JSON-LD on a product page for gtin or mpn.
  2. Run the scan; the identifier finding should be gone or list fewer products.

Run the check that reported SCHEMA_PRODUCT_IDENTIFIER_MISSING again after the change. The scan needs no account; an issue found during an AI shopping test needs that test run again.

Terminal
npx @tragent/cli scan https://your-store.com

Common mistakes

  • Putting the SKU in the gtin field.
  • Barcodes with the leading zero stripped by a spreadsheet.