GTIN / UPC / EAN Validator

Paste one barcode or a whole spreadsheet column. Check digits, formats, GS1 ranges and real-world data damage — validated instantly against 26 documented rules.

🔒 Your data never leaves your browser.

or drag & drop onto the box — files are read locally, never uploaded.

Every check this tool runs (26 rules)

Ad-hoc validators check the length and maybe the checksum. This list is the whole contract: every rule has a stable ID, a severity, a plain-English explanation and — where it exists — the official source. If a rule isn't listed here, this tool doesn't check it.

Input cleaning & spreadsheet damage

INPUT-001 Empty input

Nothing remains after trimming whitespace and formatting characters.

Fix: Enter a GTIN: 8, 12, 13 or 14 digits.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-002 Scientific notation corruption (Excel)

Input looks like "8.71E+12". Excel converts long numbers to scientific notation and permanently discards the middle digits — the original GTIN cannot be recovered from this value.

Fix: Go back to the source file. In Excel, format the column as Text (or prefix values with an apostrophe) before the numbers are converted, then re-export.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-003 Formatting characters removed

Spaces, dashes, thousands separators or invisible characters (zero-width spaces, BOM, non-breaking spaces) were stripped before validation. Common when copying from spreadsheets, PDFs or web pages.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-004 Full-width digits converted

Full-width digits (123, common in CJK input methods and documents) were converted to standard ASCII digits.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-005 Non-numeric characters

After cleaning, the input still contains characters that are not digits. A GTIN consists of digits only.

Fix: Remove letters and symbols. If your data has an internal SKU mixed in, extract the numeric barcode column.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-006 11 digits — leading zero likely stripped

UPC-A codes starting with 0 lose their leading zero when Excel treats them as numbers. An 11-digit value is not a valid GTIN, but it is very often a UPC-A missing its first 0.

Fix: Prepend a 0 and re-validate. To prevent this, format the barcode column as Text in Excel.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

INPUT-007 Invalid length

A GTIN must be exactly 8 (GTIN-8/EAN-8), 12 (GTIN-12/UPC-A), 13 (GTIN-13/EAN-13) or 14 (GTIN-14/case code) digits.

Fix: Check for truncation or concatenated values. 7-digit values may be a GTIN-8 that lost a leading zero.

Official reference ↗

INPUT-008 Trailing ".0" removed (spreadsheet number conversion)

Input like "4006381333931.0" indicates the value passed through a tool that treated it as a floating-point number (Excel, pandas). The ".0" was stripped and validation continued — but check the rest of the column for worse corruption (scientific notation, lost zeros).

Fix: Format the column as Text at the source to stop numeric conversion.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

Check digit

CHECK-001 Check digit mismatch

The last digit must equal the GS1 Mod-10 checksum (weights 3,1,3,1… from the right) of the preceding digits. A mismatch means a typo, an OCR error, or a fabricated code.

Fix: Compare against the number printed under the barcode on the physical product. Do not simply replace the check digit unless you are sure the other digits are correct.

Official reference ↗

Formats & equivalence

FORMAT-001 GTIN-12 ⇄ GTIN-13 equivalence

A UPC-A (GTIN-12) with a leading zero prepended is the same product code as its GTIN-13 form — the check digit does not change. Marketplaces may display either form.

Official reference ↗

FORMAT-002 13 digits starting 00000 — likely a mis-stored GTIN-8

GTIN-8 is an independent number range, NOT a zero-padded GTIN-13. A 13-digit value starting with 00000 usually means a GTIN-8 was stored in a 13-digit field; treating it as an EAN-13 misattributes its prefix.

Fix: If the source barcode is 8 digits, validate it as GTIN-8 (use the last 8 digits).

Official reference ↗

FORMAT-003 GTIN-14 indicator digit

The first digit of a GTIN-14 is the indicator: 1–8 = packaging level (e.g. case of the base item), 9 = variable-measure trade item, 0 = the value is equivalent to the contained GTIN-13.

Official reference ↗

FORMAT-004 GTIN-8 is its own number range

GTIN-8 (EAN-8) codes are allocated directly by GS1 for small packages. A GTIN-8 is not a truncated or zero-padded EAN-13, and its first digits are a GS1-8 prefix, not a company prefix.

Official reference ↗

GS1 number ranges

RANGE-001 GS1 prefix attribution

The first three digits (in GTIN-13 form) identify the GS1 member organization that issued the number. This is NOT the country of manufacture — a product made anywhere can carry a prefix from any GS1 member organization.

Official reference ↗

RANGE-002 Restricted-circulation number (in-store code)

Prefixes 020–029, 040–049 and 200–299 are reserved for restricted circulation: in-store codes, variable-measure items, internal numbering. These are valid barcodes but cannot be listed on public marketplaces (Amazon, Google Shopping…) as product GTINs.

Fix: Obtain a real GTIN from GS1 (or the brand owner) before listing this product publicly.

Official reference ↗

RANGE-003 Coupon number range

Prefixes 050–059, 981–984 and 990–999 identify coupons, not products. A coupon code in a product feed will be rejected by marketplaces.

Official reference ↗

RANGE-004 ISBN (Bookland 978/979)

Prefixes 978 and 979 are book identifiers (ISBN-13 in EAN form); 979-0 specifically is ISMN for printed music. Valid as a barcode, but book listings usually require the ISBN in the dedicated ISBN field.

Official reference ↗

RANGE-005 ISSN (977)

Prefix 977 identifies serial publications (journals, magazines) — the EAN form of an ISSN, not a regular product GTIN.

Official reference ↗

RANGE-006 Prefix not in our table

The prefix is not in this tool's GS1 prefix table. GS1 assigns new prefixes over time, so this alone does not make the code invalid — but verify the source of the number.

Official reference ↗

Plausibility & placeholder codes

PLAUS-001 All zeros

An all-zero value passes the checksum arithmetic but is not a real GTIN — it is the classic placeholder for "no barcode".

Fix: Obtain the real GTIN for this product; marketplaces reject all-zero codes.

Source: Yaktool plausibility rule — these values pass the GS1 checksum but are placeholders that marketplaces reject in practice. Sourced from documentation samples and observed feed data, not from a GS1 specification.

PLAUS-002 All identical digits

Every digit is the same (e.g. 4444444444444). Even when the checksum happens to pass, such values are placeholders, not issued GTINs.

Fix: Obtain the real GTIN for this product.

Source: Yaktool plausibility rule — these values pass the GS1 checksum but are placeholders that marketplaces reject in practice. Sourced from documentation samples and observed feed data, not from a GS1 specification.

PLAUS-003 Known placeholder / sample code

This exact value is a well-known demo code from documentation and tutorials (e.g. 1234567890128). It passes the checksum but does not identify a real product, and marketplaces blacklist these.

Fix: Replace with the GTIN actually assigned to your product.

Source: Yaktool plausibility rule — these values pass the GS1 checksum but are placeholders that marketplaces reject in practice. Sourced from documentation samples and observed feed data, not from a GS1 specification.

Batch mode

BATCH-001 Duplicate in batch

The same GTIN appears more than once in the batch (compared after zero-padding to 14 digits, so a UPC and its GTIN-13 form count as the same code). Duplicate GTINs across different products break marketplace listings.

Fix: Each distinct product/packaging level needs its own GTIN.

Source: Yaktool data-hygiene rule — derived from real-world spreadsheet and copy-paste corruption patterns, not from a GS1 specification. Every case is covered by a regression test in our test suite.

What is a GTIN?

A GTIN (Global Trade Item Number) is the number under a product's barcode — the identifier marketplaces like Amazon and Google Shopping use to recognize a product. GS1, the standards body, issues them in four lengths:

FormatDigitsAlso known asTypical use
GTIN-88EAN-8Small packages (chewing gum, cosmetics)
GTIN-1212UPC-ANorth American retail
GTIN-1313EAN-13Retail worldwide
GTIN-1414ITF-14, case codeCartons and cases in logistics

UPC vs EAN — what's the difference?

A UPC-A is simply a GTIN-13 whose first digit is zero, written without that zero. Prepending a 0 to a UPC gives the same product's EAN-13 form — even the check digit stays the same. GTIN-8 is the exception: it is its own number range, not a shortened EAN-13.

How the check digit works

The last digit of every GTIN is a Mod-10 checksum: multiply the other digits alternately by 3 and 1 starting from the right, sum them, and the check digit is whatever brings the total to a multiple of ten. One mistyped digit breaks it — which is exactly what it's for.

Why Excel corrupts barcodes

Excel treats a pasted barcode as a number. Long values get displayed — and saved — as scientific notation (8.71E+12), permanently destroying the middle digits. UPCs starting with 0 silently lose that zero and come out 11 digits long. This tool detects both; the durable fix is formatting the barcode column as Text before pasting.

Which codes can't be listed publicly?

Some checksum-valid numbers are still unusable in product feeds: prefixes 020–029, 040–049 and 200–299 are in-store codes, 050–059 and 990–999 identify coupons, and well-known sample codes like 1234567890128 are blacklisted by marketplaces. The validator flags all of these — that's the difference between "passes the checksum" and "safe to list".