Merchlint
Available now
Next, in this order
  • DeutschDE
  • EspañolES
  • FrançaisFR
  • ItalianoIT
  • PortuguêsPT
  • NederlandsNL
  • SvenskaSV
  • TürkçeTR

A language shows up here once its pages are actually written. Nothing on this site is machine-translated.

Install free
← All checks

Two products share the same GTIN

A GTIN names one item worldwide. When two products share one, a shopping service either rejects the offer or merges both into a single listing.

Group
Product identifiers
Confidence
F — fact from the database
Version
Free
Updated
Code
G3b

The symptom

A product you never touched disappears from a shopping service, or two different items in your shop end up sharing a single listing with the wrong photo. In the admin everything looks right: both products exist, both have an identifier, and WooCommerce raised no objection when they were saved — because they were not saved through the product screen.

Video, 1:11 — WooCommerce GTIN: why products drop out of Google Shopping

What it costs

An identifier exists to name exactly one trade item anywhere in the world. When two of your products carry the same one:

  • The offer is rejected. Merchant Center treats a duplicate identifier as a data error and drops one or both offers.
  • Two products become one listing. A comparison engine merges them, so a customer clicking your cheaper item lands on the other one’s page.
  • Stock and returns go to the wrong row. Anything that matches orders back to products by identifier picks whichever it finds first.

If a shopping feed is what brought you here, this is one of several requirements that drop products without saying so. Why products drop out of your shopping feed walks the rest the same way, with the query for each.

How to check it yourself

From WP-CLI, without any plugin:

wp db query "SELECT TRIM(meta_value) AS gtin, COUNT(*) AS n \
  FROM wp_postmeta pm JOIN wp_posts p ON p.ID = pm.post_id \
  WHERE pm.meta_key = '_global_unique_id' AND TRIM(pm.meta_value) <> '' \
  AND p.post_type IN ('product','product_variation') \
  AND p.post_status IN ('publish','draft','private') \
  GROUP BY TRIM(meta_value) HAVING n > 1"

Replace wp_ with your table prefix. Empty values are excluded on purpose — twenty products with no identifier are not twenty duplicates of each other.

How to fix it

  1. Find out which product the number actually belongs to — the packaging decides, not the order history.
  2. Clear the field on the other one and enter its own number. Leave it empty rather than guess.
  3. If both are variations of the same product, check whether one is a leftover from a deleted attribute value; those are usually better removed than renumbered.
  4. Fix the import that produced it. A duplicate identifier almost always comes from a spreadsheet column copied down a row too far, and it comes back with the next import.

When it is a false positive

  • Translations of one product. With WPML or Polylang, one item lives in several posts that legitimately share an identifier. Merchlint counts a translation group as one product; if your multilingual setup is different, hide the finding.
  • Multipacks priced per unit. Some shops list the same item in several pack sizes. Strictly each pack size needs its own GTIN, but until you have them, this is a known state rather than a mistake.
  • A draft replacement you are preparing for an existing product before retiring the original.

How Merchlint finds it

Merchlint reads _global_unique_id from published products and from their variations, groups by the exact trimmed value, ignores empty ones, and reports each product that shares its number with another product, with a variation of a different product, or with its own variation. The set is computed once for the entire shop, not per batch — a duplicate whose twin sits in another part of the catalogue is still a duplicate. Variations sitting in the trash never count.

One case stays out: two variations of one product sharing a number while the product itself carries none. A finding belongs to a product, and there is nothing to attach it to there.

Why a product and its own variation so often carry the same number. Importers build a variable product by cloning its first variation, or by copying the parent’s fields onto it, and the number travels with the rest. WooCommerce would refuse that pair when you save the product yourself — since 9.2 the field has to be unique across products and variations — but an import writes it straight to the database, so nothing flags it. It matters when your feed exports the parent alongside its variations: then two items go out with one number. Clearing the number on the parent is the safe fix, because a variable product is judged by its variations.

Translations are resolved before grouping: two language versions of one product count as one, so a bilingual shop does not receive two findings for every translated pair.

Unlike the missing-identifier check, this one has no catalogue-wide threshold. A missing identifier can be a deliberate choice; a duplicate never is — someone had to enter the same number twice.

Confidence: F — fact from the database. No interpretation, no threshold.

This check runs in the free version, on every product, with no cap.

Run this check on your store

Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com