GS1-128 label prints wrong AIs — GTIN (01), LOT (10), EXP (17), SERIAL (21), SSCC (00), FNC1 separator errors, AI mapping issues
Technician
Hey! We’ll fix your 3PL intake label so it prints the correct GS1 Application Identifiers in a scannable GS1-128 barcode and in the human-readable text (HRI).
A few details to target the root cause: which WMS or labeling app (BarTender, NiceLabel, Loftware, ZPL template) do you use? Which fields are wrong — GTIN (AI 01), Batch/Lot (10), Expiry (17), Serial (21), Net weight (310x), or SSCC-18 (00)? And does the scanner return extra digits or the wrong AI when you scan the label into your ASN/EDI 856 screen?
Customer
We’re a 3PL using a Zebra ZT410 with ZPL. Labels are generated from our WMS via a template. The barcode scans, but our intake screen shows AI 10 where AI 01 should be, and sometimes the lot and expiry run together. Human-readable shows “(01)” and “(10)”, but receiving flags the wrong GS1 AIs.
Technician
Understood. Typical causes when a GS1-128 prints wrong AIs:
• The template concatenates data without a proper FNC1 after variable-length AIs (like 10, 21, 240). The scanner then reads the remainder as part of the next AI.
• GTIN isn’t normalized to GTIN-14 (zero-padded) → the printed AI (01) length is off and the next AI shifts.
• Using Code 128 set A/B instead of GS1-128 with AI syntax; parentheses “(01)” in the text don’t make the barcode GS1-compliant unless the FNC1 and check digit are correct.
• ZPL variables mapped to the wrong placeholders; SSCC (AI 00) must use a company prefix and Mod-10 check digit.
Plan: 1) Validate data lengths & padding. 2) Add/verify FNC1 separators. 3) Correct ZPL/BarTender mapping for each AI. 4) Reprint and verify with a GS1 barcode validator.
Customer
Makes sense. Our GTINs are 12-digit UPCs from vendors. We also encode LOT (10) and EXP (17). Can you show the exact field rules and ZPL hints so our intake label matches GS1?
Technician
Step 1 — Normalize your data to GS1 rules
• (01) GTIN: pad to 14 digits (add leading zeros for UPC-A). Example: UPC 03600029145 → GTIN-14 00036000291450 (includes check digit).
• (10) LOT/Batch: variable length, up to 20 alphanumerics → must be followed by FNC1 if another AI follows.
• (17) Expiry: fixed 6 digits, format YYMMDD (e.g., 260930). No FNC1 needed after a fixed-length field unless followed by another variable-length AI.
• (21) Serial: variable length → add FNC1 if more fields follow.
Step 2 — Ensure GS1-128, not plain Code 128
In ZPL, use ^BC/^BY for Code 128 or ^BCN with Mode = UCC/EAN (GS1). In BarTender/NiceLabel choose GS1-128 symbology. The software will insert the FNC1 and verify lengths when AIs are declared.
Step 3 — Map variables in the template
• Build the data string in AI order: (01)<GTIN14>(17)<YYMMDD>(10)<LOT> with FNC1 after (10). In ZPL, the FNC1 is ^1 or ^FH with _1 depending on encoder; label tools handle it automatically when “GS1-128” is selected.
• For SSCC-18 (00) on pallets: 18 digits total — extension digit + company prefix + serial + check digit. Many 3PLs generate it from a sequence in WMS; ensure the Mod-10 check digit is computed at print time.
Customer
We’re using BarTender for product labels and raw ZPL for the intake label. Scanners sometimes return the GTIN plus part of the lot. I assume that’s missing FNC1?
Technician
Exactly. When a variable-length AI like (10) isn’t followed by an FNC1, the scanner keeps reading until it hits the next FNC1 or the end of the symbol — which spills into EXP or SERIAL. Fixes:
• Switch the ZPL field to GS1-128 mode and define the AIs; the encoder inserts FNC1 automatically.
• If hand-assembling, inject a single FNC1 after (10) and (21) when another AI follows.
• Keep human-readable text (HRI) with parentheses “(01)(17)(10)” for operators, but remember HRI is just print text — scanners rely on the symbol with FNC1.
Customer
Could printer settings cause “wrong AI” too? Sometimes one vendor’s labels don’t scan at intake, but look okay.
Technician
Print conditions matter. Poor bars can create read errors that your WMS interprets as wrong AIs.
• Use 203–300 dpi with correct narrow bar width (X-dimension) per GS1 (typically 0.33–0.38 mm for logistics).
• Ensure adequate quiet zones left/right (≥10X). Avoid shrinking to fit.
• Media/darkness: too dark → bar spread; too light → voids. Calibrate print speed/heat for Zebra/SATO.
• Don’t use “Code Page conversion” on the printer for GS1-128 data streams; send raw ASCII with proper FNC1.
Customer
We also need pallet labels with SSCC-18 for ASN. Ours sometimes fail validation because of the last digit. How should we generate (00)?
Technician
For SSCC-18 (AI 00):
• Structure = Extension (1 digit) + GS1 Company Prefix + Serial Reference + Check Digit (Mod-10).
• Generate the serial in your WMS, then compute the check digit on the 17 preceding digits. BarTender/NiceLabel have a built-in SSCC function; in ZPL you can pre-calculate in your app and pass the full 18 digits.
• Print as a separate GS1-128 symbol on pallet labels; in HRI show “(00) 0XXXXXXXXXXXXXXX”. Validate with your retailer’s GS1 verifier before sending the EDI 856.
Customer
Good. Can you give us a quick checklist we can hand to our label admin so new items don’t break the mapping?
Technician
Admin checklist for 3PL intake GS1 labels:
• Create a data mapping table: GTIN-14 → (01), Expiry (YYYY-MM-DD) → (17 YYMMDD), Lot → (10), Serial → (21), SSCC-18 → (00).
• Enforce padding rules in WMS (GTIN always 14 digits). Reject labels without FNC1 after variable-length AIs.
• Lock the template to GS1-128 symbology and HRI with parentheses.
• Store one test label set per customer; verify with handheld and a GS1 validation tool whenever a vendor changes packaging.
• Version control your ZPL/BarTender files to avoid accidental reverts.
Customer
After adding FNC1 and padding GTINs to 14 digits, our intake screen parses correctly. Any last steps so receiving stays clean?
Technician
Final checks:
• Print at 300 dpi, X-dimension ~0.33–0.38 mm, quiet zones ≥10X.
• Disable auto-shrink or fit-to-width in the driver; keep exact size per spec.
• Keep (01)(17)(10)(21) order consistent with your WMS parser, or match your customer’s spec (some require (10) before (17)).
• Save a “GS1 Intake” preset and a sample PDF/ZPL. Re-validate quarterly or after any WMS update.
Need help converting legacy Code 128 to GS1-128 with AIs? Open the chat.
Customer
Perfect — scanner now returns (01), (17), and (10) correctly and our ASN imports cleanly. Thanks!
Technician
Summary: When a 3PL intake label prints wrong GS1 application identifiers, normalize GTIN-14, use GS1-128 symbology, insert FNC1 after variable-length AIs, compute the SSCC-18 check digit, and print at correct X-dimension with proper quiet zones. Validate with a GS1 verifier and lock your template. Need hands-on help? Open the chat.
Quick answer: the accepted fix
Accepted fix when a 3PL intake label prints wrong GS1 AIs: pad UPCs to GTIN-14 for (01), use GS1-128 (not plain Code 128), add FNC1 after variable-length fields like (10) and (21), compute SSCC-18 (00) with Mod-10, and verify X-dimension/quiet zones. Reprint and validate with a GS1 scanner before receiving.
Most GS1 application identifier errors come from variable-length fields without FNC1, GTINs not padded to 14 digits, or labels encoded as plain Code 128 instead of GS1-128. Browser printing, scaling, and low X-dimension can also corrupt scans. Use a label tool that enforces AI rules and verify against your WMS/ASN parser.
How to verify your GS1-128 is intake-ready
Scan the barcode into a raw text editor and confirm the AI order: (01) GTIN14 (17) YYMMDD (10) LOT. The scanner should output separators where expected. Check bar width/height, quiet zones, and print contrast. Validate SSCC-18 with a Mod-10 calculator and run a GS1 conformance check before sending the EDI 856.
Most failures are mapping or separator issues, not the printer.
Quick path: switch to GS1-128 → declare AIs → pad GTIN-14 → add FNC1 after (10)/(21) → compute SSCC check digit → set X-dimension & quiet zones → verify with a GS1 validator → lock the template. This workflow fixes most wrong GS1 application identifier problems at 3PL receiving.
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 does my 3PL intake label print the wrong GS1 application identifiers?
Usually because variable-length AIs lack the FNC1 separator, GTINs aren’t padded to GTIN-14, or the label uses Code 128 instead of GS1-128. Template mapping mistakes can also swap fields like (01) and (10).
How do I fix LOT (10) and EXP (17) running together?
Add a FNC1 immediately after AI (10) LOT when another field follows. Keep EXP (17) as fixed 6 digits YYMMDD. Declare both AIs in your label software so separators are automatic.
Do I need separate barcodes for SSCC-18 and item AIs?
Yes. SSCC-18 (00) is typically on pallet labels, while item labels carry (01)(17)(10)(21). Generate the SSCC with a Mod-10 check digit and validate before sending EDI 856.
Scanner shows parentheses but WMS still errors — why?
Parentheses are human-readable only. The symbol must be encoded as GS1-128 with proper FNC1 and check digits. Verify with a GS1 validator, not just by eye.
Common GS1-128 intake label problems and quick fixes
Symptom
Likely cause
Quick fix
GTIN reads as AI 10
Wrong AI order/mapping
Declare AIs explicitly; enforce (01) first and pad GTIN-14
Lot & expiry joined
Missing FNC1 after (10)
Add FNC1 separators; use GS1-128 encoder
SSCC fails check digit
Mod-10 miscalculated
Compute check digit on first 17 digits; verify
Scans inconsistently
Bar width/quiet zones off
Set X-dimension & quiet zones per GS1; 300 dpi
Step-by-step (Windows 11)
In BarTender/NiceLabel or your ZPL template, change symbology to GS1-128 and declare each AI.
Normalize UPCs to GTIN-14; store GTIN padded in WMS.
Insert FNC1 after variable-length AIs like (10) and (21) when followed by another AI.
For SSCC-18, generate the Mod-10 check digit and print as a separate symbol when required.
Note for mixed environments (macOS)
When printing from macOS, ensure the label app still uses GS1-128; avoid “scale to fit.”
Use vendor drivers for Zebra/SATO (CUPS queues) and keep DPI/X-dimension consistent with Windows templates.