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.
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
RANGE-005 ISSN (977)
Prefix 977 identifies serial publications (journals, magazines) — the EAN form of an ISSN, not a regular product GTIN.
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.
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:
| Format | Digits | Also known as | Typical use |
|---|---|---|---|
| GTIN-8 | 8 | EAN-8 | Small packages (chewing gum, cosmetics) |
| GTIN-12 | 12 | UPC-A | North American retail |
| GTIN-13 | 13 | EAN-13 | Retail worldwide |
| GTIN-14 | 14 | ITF-14, case code | Cartons 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".