Serialized parts label does not retain check digit — GS1/Mod10 fix
Joe B.
Reviewed for technical accuracy
Specialities: Thermal label printers, BarTender & NiceLabel, ZPL/EPL/TSPL, GS1-128, Code 128/39, SAP/WMS integrations
GS1 check digit not retained — Mod10/Luhn, Code 39 Mod43, template field mapping, printer-side serialization
Quick answer: the accepted fix
Accepted fix when serialized parts labels don’t retain the check digit: compute the digit (GS1 Mod10/Luhn or Code 39 Mod43) on the final encoded field, bind the barcode to that computed value, ensure correct FNC1/AI formatting, and keep printer-side serialization only on the (21) serial. This prevents stale or missing digits.
Why check digits disappear — GS1 AI formatting, Luhn math, printer templates
The check digit can drop when the driver encodes the base GTIN instead of the computed value, when FNC1 is placed incorrectly between AIs, or when ZPL templates reuse ^FD data from a previous job. Make sure the Mod10 (Luhn) or Mod43 calculation runs for each print, and that the barcode and human-readable fields share the same data source.
How to verify check digit retention
Print three labels in a row. Scan with a verifier or handheld set to GS1-128. Confirm (01) contains 14 digits (including the Mod10 digit) and (21) serial changes each label. For legacy Code 39 Mod43, compare the printed checksum to the encoded symbol. If mismatched, review template mapping and enable “include check digit in symbol.”
Check digit retention — quick troubleshooting tips
Most failures trace to field mapping or GS1 formatting, not the scanner.
Quick path: compute check digit on output → bind barcode to computed field → verify FNC1 after variable AIs → avoid ^SN on GTIN → turn off caching/combined jobs in middleware. Works across Zebra, TSC, Honeywell, SATO with BarTender or NiceLabel.
Disclaimer: This information is AI-generated and intended for general guidance only. For advice specific to your environment, please consult a verified expert on Whizz-Tech before making decisions.
Getting Started Is Easy
Ask for help, 24/7
Members enjoy round-the-clock access to 12,000+ verified Experts, including tech support, mechanics, vets, and more.
Expert will respond in minutes
We match you with an Expert who specializes in your situation. Talk, text, or chat — whichever you prefer.
Save time & money
No scheduling hassles or expensive consults. Membership can save you significant time and money each month.
FAQ
Why doesn’t my serialized label keep the GS1 check digit?
The barcode object often uses the base GTIN field while the check digit is computed elsewhere. Map the barcode to the computed output, not the raw field, and ensure FNC1 is placed correctly.
Do I compute Mod10 for (21) serials?
No. GS1 Mod10 applies to identifiers like (01) GTIN. The (21) serial is variable length and usually has no check digit; just ensure it’s not truncating and is FNC1-separated when followed by another AI.
How do I handle Code 39 Mod43 and Code 128?
Enable “include check digit in symbol” for Code 39 Mod43. For Code 128, compute and append the checksum in the same data source used by the barcode, not only in the text line.
Printer template vs software — which should serialize?
Keep software-side Mod10 and AI formatting. Use printer-side ^SN only for the (21) serial. Avoid mixing sources to prevent stale digits and caching issues.
| Symptom | Likely cause | Quick fix |
|---|---|---|
| Scanner says “invalid check digit” | Barcode encodes base GTIN without digit | Bind to computed Mod10 field; enable GS1 AI formatting |
| First label OK, next labels fail | Cached ZPL / stale ^FD |
Send fresh variables (^FN), disable job combining, reset header |
| Human-readable shows digit, symbol doesn’t | Text uses formula, barcode uses raw field | Map both text and barcode to the same computed source |
| Legacy Code 39 fails verification | Mod43 only in text | Enable “include check digit in symbol” |
Step-by-step (BarTender/NiceLabel + ZPL)
- Compute Mod10 (Luhn) on the GTIN field and bind the barcode to the computed output.
- Use proper GS1 AIs with FNC1 where required; ensure (01) is 14 digits including the check digit.
- Serialize only the (21) serial (software or
^SN), not the GTIN. Keep both text and barcode tied to the same variables. - Prevent caching: send fresh ZPL variables with
^FN, avoid template reuse that retains old^FDcontent, and verify three consecutive labels with a scanner.
Notes for mixed environments (drivers & printers)
- Use Zebra/Honeywell/TSC drivers that support GS1-128 formatting; don’t print as plain Code 128.
- If sending raw ZPL from macOS or Linux, build the string server-side with the computed check digit before transmit.
Sources
- GS1 — GS1-128 Application Identifiers & check digit rules
- BarTender — Using check digits and GS1 AIs
- Zebra — ZPL Programming Guide (^SN, ^FN, ^BC, FNC1)
Filed under: Printers
Related articles
- Printer says “Offline” and won’t print — what should I check first?
- My printer “forgot” my Wi-Fi — the saved network is gone
- Printer Wi-Fi settings reset by itself — why did it forget my network?
- My printer keeps popping up “Set up Wi-Fi” again — why won’t it stay connected?
- Why does my printer need Wi-Fi setup again? It was working yesterday.
- My printer Wi-Fi setup keeps failing — what am I doing wrong?
- Printer Wi-Fi setup is confusing — why won’t it connect to my network?
- Printer Wi-Fi setup is too complicated — what do I check first without messing it up?