Bulk Barcode Validator & Label Printer
Validate a whole CSV of barcodes at once — every check digit tested, every bad row flagged with its correction — then print Code 128 labels for the good ones.
Checking barcodes one at a time is fine for one barcode. It is the wrong tool for a supplier spreadsheet with four hundred rows, a marketplace import that keeps rejecting codes, or a case-label run you want to sanity-check before it reaches the warehouse. This page is the batch form of this site’s single-code validator and Code 128 generator: paste a CSV — or open a .csv file, which your browser reads locally and never uploads — and every barcode in it is run through the GS1 check-digit test at once. You get a summary count, a results table listing every single row, and, for each row that fails, the check digit the formula expected and the corrected code.
Paste a CSV with a header row — the barcode column is detected from a header containing barcode, gtin, upc, ean or code, and sku / name columns are used on the labels — or open a .csv file, which is read locally in your browser and never uploaded. Every row is checked, then the passing rows become printable Code 128 labels. ISBN-10 is out of scope in bulk (it uses a different scheme) — check it on the single-code validator linked below.
Printable labels — valid rows
Each label encodes that row’s barcode value as Code 128. Print, then test-scan the first label with the scanner or phone app your team actually uses before printing or applying the rest. Printing shows only this label sheet.
A correct check digit proves mathematical consistency only — it does not prove the code was assigned to any product or company, and it is not a registration check. Verystep is not affiliated with, endorsed by or certified by GS1. Barcodes for products sold commercially must use numbers licensed through your local GS1 member organisation; the Code 128 labels printed here are for internal use only. Algorithms last verified: November 2026.
Quick answers
How do I validate barcodes in bulk from a CSV?
Paste the CSV (or open the .csv file — it is read locally, never uploaded) and the page finds the barcode column from its header (barcode, gtin, upc, ean or code), then runs the GS1 modulo-10 check digit test on every row. The summary counts rows checked, valid, invalid and unreadable-format, the results table lists every row, and each failing row shows the expected check digit and the corrected code.
The check is per row and by length: 8 digits is read as GTIN-8 / EAN-8, 12 as UPC-A, 13 as EAN-13, 14 as GTIN-14 and 18 as SSCC-18. On the pre-filled sample — five rows — the result is 4 valid and 1 invalid: SKU-003, 4006381333932, whose last digit should be 1, not 2.
What does it mean when a row fails the bulk check?
It means the digits in that row disagree with each other: the last digit is not the one the GS1 formula produces from the digits before it. The table shows the expected check digit and the fully corrected code — but the mistyped digit may not be the last one, so confirm the whole number against the product or supplier paperwork before changing anything official.
A failure is the useful outcome a check digit exists for: it catches a copied-wrong UPC, a transposed pair, or a bad supplier export before a marketplace, a retailer or a warehouse system does. What it cannot do is tell you which digit is the wrong one — only that they cannot all be right together.
Can I print barcode labels for the rows that pass?
Yes. Every valid row becomes a Code 128 label — product name if your CSV has one, the barcode itself encoding the barcode value, and the SKU and barcode as human-readable text — in a grid of two, three or four labels per row that prints on its own sheet. Rows that fail are excluded unless you tick the option to include them, and then each is stamped CHECK DIGIT FAILS.
Code 128 is the internal-labelling symbology: these labels are for warehouses, shelves, bins and assets inside your own operation. They are not retail checkout barcodes — a product sold in shops carries its GS1-licensed GTIN as UPC-A or EAN-13. Always test-scan the first printed label with your real scanner before printing the run.
How to use
- Paste your CSV into the box, or use the file picker to open a .csv file — it is read locally in your browser and never uploaded. Keep the header row: the barcode column is detected from a header containing barcode, gtin, upc, ean or code, and sku / name columns are picked up for the labels.
- Read the summary first (rows checked, valid, invalid, unreadable format), then walk the results table: every row is listed, failing rows are highlighted with the expected check digit and the corrected code.
- Fix failing rows against their source — the product, the GS1 record or the supplier file — rather than blindly adopting the corrected code, because the wrong digit may not be the last one.
- Choose two, three or four labels per row. Failing rows stay off the label sheet unless you tick the include option, which stamps each of them CHECK DIGIT FAILS.
- Click Print labels, then test-scan the first printed label with the actual scanner or phone app your team uses before printing or applying the rest of the run.
About this tool
The columns are found for you. The barcode column is the header containing barcode, gtin, upc, ean or code; if the file also carries sku and name (or product) columns, those ride along into the results table and onto the printed labels. The validation itself is the same GS1 modulo-10 recipe as the single-code page, for the same family of lengths — GTIN-8 / EAN-8 (8), GTIN-12 / UPC-A (12), GTIN-13 / EAN-13 (13), GTIN-14 (14) and SSCC-18 (18). Rows that are not one of those lengths, or contain characters a barcode number cannot have, are reported as unreadable format rather than silently passed or failed. ISBN-10 is deliberately out of scope here: it uses the older modulo-11 scheme with its X check character, and it stays on the single-code validator where that scheme is handled properly.
Part two turns the passing rows into labels. For every valid row the page draws a real Code 128 barcode encoding the barcode value itself — correct start code, code-set switches for long digit runs, modulo-103 checksum and stop pattern — laid out in a printable grid with the product name (when your file has one) and the SKU and barcode printed as human-readable text. Choose two, three or four labels per row and print: the print stylesheet shows only the label sheet, nothing else on the page. Rows whose check digit fails are left off the sheet by default; you can include them, but each such label is stamped CHECK DIGIT FAILS so it can never be mistaken for a good one. Test-scan the first label with the scanner or phone app your team actually uses before printing a run.
The boundary that applies to the single-code tools applies here in bulk: a check-digit pass proves mathematical consistency only. Anyone can calculate a correct check digit for an invented number, so a pass says nothing about whether GS1 assigned the number, who it belongs to, or whether it matches the product in the box. Commercial retail barcodes must use GS1-licensed numbers, and the Code 128 labels from this page are for internal use only.
Everything runs in your browser. Pasted text and opened files stay in page memory: nothing is uploaded, sent to a server, stored in your browser, or written into the page’s URL. Close or refresh the page and the data is gone.
How it works
GS1 modulo-10 (GTIN-8/12/13/14, UPC-A, EAN-8/13, SSCC-18): for each row, number the data digits from the right, starting next to where the check digit sits. Multiply digits in odd positions of that count (1st, 3rd, 5th…) by 3 and the rest by 1. Add all the products. Expected check digit = (10 − (sum mod 10)) mod 10. A row is valid when its last digit equals that result, invalid when it does not, and unreadable format when the cleaned value is not all digits or its length is not 8, 12, 13, 14 or 18.
Code 128 checksum (ISO/IEC 15417): the label barcode encodes the barcode value as codeword values 0–102 in code sets A, B or C (in C, each pair of digits is one value 0–99), preceded by a start code (103, 104 or 105). Checksum value = (start value + Σ symbol value × position) mod 103, positions counting from 1 for the first symbol after the start code, followed by the stop pattern (106). Each codeword is drawn as three bars and three spaces totalling 11 modules (the stop pattern takes 13), flanked by quiet zones of at least 10 modules.
Worked examples
The pre-filled sample: 5 rows, 4 valid, 1 invalid: sku,name,barcode with SKU-001 Blue Widget 036000291452 (valid UPC-A — the eleven data digits weight to 58, check digit 2), SKU-002 Red Widget 4006381333931 (valid EAN-13 — sum 89, check digit 1), SKU-003 Green Widget 4006381333932 (INVALID — the same sum of 89 means the expected check digit is 1, not 2; the corrected code is 4006381333931), SKU-004 Small Widget 96385074 (valid EAN-8 — sum 86, check digit 4) and SKU-005 Carton Code 12345678901231 (valid GTIN-14 — sum 109, check digit 1). Summary on load: 5 rows checked, 4 valid, 1 invalid, 0 unreadable.
Labels from the sample: With the sample unchanged, the label sheet holds four labels — SKU-001, SKU-002, SKU-004 and SKU-005 — each showing the product name, a Code 128 barcode encoding that row’s barcode value, and the SKU and barcode in text. SKU-003 is not on the sheet. Tick “Also print rows whose check digit fails” and a fifth label appears for SKU-003, stamped CHECK DIGIT FAILS.
The Code 128 checksum on a label, by hand: The SKU-001 label encodes 036000291452. All digits, an even count, so it rides in Code C: start 105, then the pairs 03 (3), 60 (60), 00 (0), 29 (29), 14 (14), 52 (52). Checksum = (105 + 3×1 + 60×2 + 0×3 + 29×4 + 14×5 + 52×6) mod 103 = 726 mod 103 = 5 — the checksum value a scanner recomputes on every read of that label.
A row that is neither valid nor invalid: A row whose barcode cell reads 12345 or contains letters is counted as unreadable format, not as a check-digit failure: no supported GS1 format has that length or those characters, so there is no expected check digit to show. ISBN-10 codes land here too in bulk — check them one at a time on the single-code validator.
Formats covered in bulk, at a glance
| Format | Full length | Scheme | In this bulk tool |
|---|---|---|---|
| GTIN-8 / EAN-8 | 8 | GS1 modulo-10 | Validated; labelled |
| GTIN-12 / UPC-A | 12 | GS1 modulo-10 | Validated; labelled |
| GTIN-13 / EAN-13 / ISBN-13 | 13 | GS1 modulo-10 | Validated; labelled |
| GTIN-14 (case / carton codes) | 14 | GS1 modulo-10 | Validated; labelled |
| SSCC-18 (pallets / shipments) | 18 | GS1 modulo-10 | Validated; labelled |
| ISBN-10 | 10 (may end in X) | Modulo-11 | Not covered — use the single-code Barcode Check Digit Validator |
Any other length, or a value containing characters other than digits (spaces and hyphens are stripped first), is reported as unreadable format. UPC-E is likewise out of scope: its check digit is calculated on the expanded UPC-A form, so it cannot be checked honestly from the eight printed digits alone.
Frequently asked questions
What CSV layout does this tool expect?
A header row plus one row per barcode, comma-separated, with standard RFC 4180 quoting for any field that contains a comma. The barcode column is the one whose header contains barcode, gtin, upc, ean or code; columns whose headers contain sku and name (or product) are optional and are used in the results table and on the labels. Rows are counted from the data rows — the header itself is never validated as a barcode.
Does a valid result in bulk mean my barcodes are genuine or licensed?
No — the same limit as the single-code check, multiplied by every row. A valid check digit means only that a row’s digits are mathematically consistent. It says nothing about GS1 assignment, ownership, or whether the code matches the product. Marketplaces and retailers verify codes against GS1’s databases; this tool verifies arithmetic, which is the right test for catching typos, transposed digits and bad supplier data before import.
Why is ISBN-10 not accepted here?
ISBN-10 is the one common code in this family that does not use GS1 modulo-10: it uses a modulo-11 scheme whose check character can be the letter X. Folding it into a bulk pass keyed on length would mislabel its rows. ISBN-13 is covered (it is an EAN-13), and ISBN-10 stays on the Barcode Check Digit Validator on this site, which handles the modulo-11 scheme and the X properly.
What happens to my CSV data?
It stays in the page. Pasting and file reading both happen entirely in your browser — the file picker hands the file to the page on your device, not to us — and nothing is sent to a server, stored in your browser, or written into the page’s URL, so a copied link can never carry your prices, SKUs or supplier codes. Refresh the page and the data is gone. If you want to convince yourself, open your browser’s network panel and validate a file: the check makes no requests.
Why print Code 128 labels instead of UPC or EAN labels?
Because these labels are for internal use — warehouse shelves, bins, cartons, asset tags — where Code 128 is the standard symbology and where the value being encoded is your reference, not a retail checkout code. The barcode on a product sold in shops must be its GS1-licensed GTIN printed as UPC-A or EAN-13; encoding that GTIN in Code 128 would not change its licensing, and checkout scanners look for the GTIN symbologies.
A label printed but my scanner will not read it — what do I check?
In order: test-scan the first label of every run before printing more (print quality problems multiply); keep the quiet zones — the blank margins the barcode is drawn with — clear of text, borders and label edges; print at a size where the narrowest bar survives your printer (a low-resolution printer at a small label size is the usual culprit); and if the label carries a CHECK DIGIT FAILS stamp, the data itself failed — fix the row first, because no print setting repairs a wrong check digit.
First time embedding? Read the step-by-step guide →
More free tools
Code 128 Barcode Generator
Turn any text or SKU into a scannable Code 128 barcode — drawn in your browser, downloadable as PNG or SVG.
Barcode Check Digit Validator
Validate the check digit on a UPC, EAN, GTIN, ISBN or SSCC code — or calculate the right one — with the GS1 working shown.
SKU Reconciliation
Compare two spreadsheets by SKU — rows only in one file, quantity and price differences, in one downloadable table.
A+ Brief Studio
Turn a product photo and your selling points into an Amazon A+ / Shopify product-page creative brief — module copy structure, hero-image storyboard and a comparison outline, generated in your browser.
AQL Calculator
Look up the AQL sampling plan for your lot: code letter, sample size and accept / reject numbers per ANSI/ASQ Z1.4 and ISO 2859-1.
Merchandise Processing Fee Calculator
Estimate the US Merchandise Processing Fee (MPF) on an import entry — FY2027 CBP rates: 0.3464% of value, minimum $34.58, maximum $670.86.