Save 30 to 50% Width: Code 128 vs Code 39 for Ticketing Teams

Choose Code 128 for any new barcode system. It packs data more tightly, supports the full ASCII character set, and carries a mandatory checksum that Code 39 leaves optional. The only real exception is a legacy contract or specification, such as a DoD LOGMARS requirement, that names Code 39 outright. Caymil has printed barcoded tickets for parking, valet, and hospitality operators long enough to see which symbologies hold up under real scanning conditions.
TL;DR:
- Code 128 is more space-efficient, especially for numeric data, and encodes the full ASCII character set, making it preferable for most new barcode systems.
- The symbology features a mandatory checksum (Mod103), reducing error rates, unlike Code 39, which has an optional checksum prone to being disabled or ignored.
- Legacy contracts or government specifications, such as DoD LOGMARS, still require Code 39, so switching may trigger compliance issues if not carefully managed.
- For environments with existing Code 39 scanners or systems, staying with Code 39 is advisable until a planned migration, since compatibility problems can cause read failures.
- Printing and scanning quality, including maintaining correct X-dimension and contrast, significantly impacts barcode reliability, regardless of symbology choice.
Table of Contents
- Code 39 vs Code 128 at a Glance
- Technical Differences: Code Sets, Density, and Reliability
- When to Use Each: Decision Criteria and a Decision Flow
- Printing and Scanning Best Practices for Reliable Reads
- Compatibility, Legacy Systems, and Compliance Traps
- Caymil’s Perspective on Barcodes for Tickets and Valet Systems
- How Caymil Can Help: Barcode Ticket Printing and Custom Options
- Sources
- FAQ
Code 39 vs Code 128 at a Glance
The two symbologies solve the same basic problem, encoding data as scannable black and white bars, but they do it with different tradeoffs in size, character range, and error checking.
- Character set: Code 39 handles 43 characters (uppercase letters, digits, and a handful of symbols); Code 128 covers the full 128-character ASCII range across three code sets.
- Density: Code 128 is narrower for the same data, especially with numeric strings, because Code C encodes two digits per symbol character instead of one.
- Checksum: Code 128 requires a Mod103 check character built into the symbology; Code 39’s Mod43 checksum is optional, which means two systems can disagree on whether it’s even present.
- Typical uses: Code 39 shows up in older manufacturing and government systems; Code 128 dominates shipping, retail, and GS1-128 supply chain labels.
If you’re staring at an existing barcode and trying to identify it, look for asterisks bracketing the data. Code 39 symbols traditionally use * as a start and stop character, so a printed value that reads *A1234* is almost certainly Code 39. Code 128 has no such marker and can include lowercase letters and punctuation, something Code 39’s base set can’t do at all.
Technical Differences: Code Sets, Density, and Reliability
Code 128 isn’t one fixed alphabet. It runs on three interchangeable code sets. Set A covers uppercase letters, digits, and control characters. Set B covers uppercase and lowercase letters plus punctuation. Set C is the one that matters most for ticketing and inventory work: it encodes pairs of digits as a single symbol character, so a 10-digit serial number takes roughly half the space it would in Set A or in Code 39. A scanner can switch between sets mid-barcode using shift characters, which is how a single Code 128 symbol can mix a numeric SKU with an alphabetic prefix without ballooning in length.
Code 39, by contrast, sticks to one flat character table defined in ISO/IEC 16388: uppercase letters, digits 0 through 9, and a small set of symbols like the hyphen and period. Need lowercase letters or full ASCII? You’re stuck with Code 39 Extended, which represents each non-standard character as a pair of base characters. That doubling effect means an extended Code 39 symbol encoding mixed-case text can run noticeably longer than the equivalent Code 128 symbol, which is exactly the kind of penalty you don’t want on a two-inch valet ticket.
Rule of thumb: for numeric-only data, Code 128 (using Code C) typically prints 30 to 50 percent narrower than the same digits in Code 39. For mixed alphanumeric strings, the gap narrows but Code 128 still tends to come out shorter, since it never carries Code 39’s built-in inter-character gaps the same way.
- Code 128 A/B/C: full ASCII, digit-pair compression in Set C, no inherent gap penalty.
- Code 39 standard: 43-character set, wide bars relative to data encoded, one gap per character.
- Code 39 Extended: full ASCII via character pairing, longest symbols of the three options.
The checksum difference matters just as much as size. Code 128 bakes a Mod103 check character into every symbol, so a damaged or misread barcode almost always fails validation rather than returning wrong data silently. Code 39’s Mod43 checksum is optional in the specification, and plenty of printers and scanners never turn it on. That inconsistency is a common source of rejected or mismatched reads when one system in a chain assumes a check digit that another never encoded.
When to Use Each: Decision Criteria and a Decision Flow
Four questions settle most symbology decisions before you ever touch a printer.
- Do you need GS1 Application Identifiers, carrier compliance, or structured supply chain data? Choose Code 128. GS1-128 requires Code 128 as its underlying symbology precisely because Code 39 can’t carry the encoded metadata a GTIN or SSCC needs.
- Is there a legacy contract, government spec, or existing fleet of Code 39 scanners you can’t replace right now? Stay with Code 39 until the migration is planned, not forced.
- Are your labels almost entirely numeric, like sequential ticket numbers or license plate data? Code 128 wins on space alone.
- Neither of the above applies? Default to Code 128. It’s the safer long-term bet for readability, vendor support, and future-proofing.
Pro Tip: Never reach for Code 39 Extended as a workaround for full-ASCII needs. If you need lowercase letters, punctuation, or a mix of cases, Code 128 will produce a shorter, more reliable symbol every time.
Space is the other practical filter. A parking ticket or wristband gives you maybe an inch and a half of usable width. Numeric-only Code 128 data comfortably fits a 10 or 12-digit serial in that space with margin left for a logo or venue name; the same data in Code 39 often crowds the label or forces a smaller magnification that hurts scan rates. If your scanning hardware is old enough that it was configured years ago strictly for Code 39, that’s worth flagging before you commit, since a hardware refresh may be cheaper than the ongoing cost of misreads.
Printing and Scanning Best Practices for Reliable Reads
Getting the symbology right doesn’t help if the physical print quality undermines it. A few specs make the difference between a scanner that reads on the first pass and one that needs three tries.
- X-dimension and magnification: keep the narrow bar width (X-dimension) at 100% or higher of the symbology’s minimum spec whenever label space allows; shrinking below that spec is the single fastest way to introduce misreads.
- Quiet zones: leave blank margin equal to at least 10 times the X-dimension on both sides of the barcode. A quiet zone that’s too tight is invisible to the eye but obvious to a scanner that can’t find the symbol’s edges.
- Print resolution: 203 DPI works for most ticket stock, but tickets with dense Code 128 data or small formats benefit from 300 DPI thermal printers for cleaner bar edges.
- Contrast: black ink on white or light stock reads far more reliably than colored combinations; save color for logos and borders, not the barcode itself.
- Scanner configuration: confirm whether your scanner is set to auto-detect Code 39’s optional Mod43 checksum, since a mismatch between encoder and decoder settings on that one setting causes more field failures than almost anything else.
Pro Tip: *Before a full rollout, print a sample batch of 50 to 100 tickets and scan every one at the hardware you’ll actually use in the field, not just a desktop tester.
Choosing barcode ticket rolls that match your printer’s DPI and thermal sensitivity is part of this equation too, since stock quality affects contrast just as much as printer settings do.
Compatibility, Legacy Systems, and Compliance Traps
Some environments don’t leave you a choice. The Department of Defense’s LOGMARS program and certain AIAG references in automotive supply chains still specify Code 39, and swapping symbologies on a contractual label without sign-off can trigger compliance headaches that have nothing to do with technical merit.
Retail and logistics run the opposite direction. GS1-128 labeling, used for GTINs, batch numbers, and shipping container codes, is built entirely on Code 128 because Application Identifiers need the structured, compact encoding Code 39 simply wasn’t designed to carry.
- Audit every downstream system, printer driver, and scanner profile before switching symbologies on an active label.
- Notify partners and carriers who scan your labels, since a mismatched decoder configuration on their end can silently reject valid Code 128 symbols.
- Run a parallel test batch printing both formats before retiring the old one entirely.
Caymil’s Perspective on Barcodes for Tickets and Valet Systems
Caymil has manufactured ticketing products since 1937, and barcoded valet and parking tickets are one of the categories where symbology choice shows up fastest in the field. For sequential numeric serials, which cover most valet claim checks and parking tickets, Code 128 with Code C compression produces a compact, reliable symbol that fits comfortably on a two-part or machine-issued ticket without crowding the layout. Code 39 still has a place when a client’s existing scanner fleet or a legacy parking system, including several older Amano or TIBA installs, was configured around it years ago. Caymil supports both formats and can run test prints before a full production order so operators can confirm scan rates against their actual hardware, whether that’s a stationary reader at a garage entrance or a handheld unit used by valet attendants.
— Richard
How Caymil Can Help: Barcode Ticket Printing and Custom Options
Once you’ve settled on Code 128 or confirmed Code 39 is still your requirement, the next step is getting tickets printed to spec, not guessed at. Caymil produces custom barcoded valet parking tickets with sequential numbering, your choice of symbology, and layout options built around the printer and scanner hardware you already run, including compatibility with Amano, TIBA, SKIDATA, and Flowbird systems.

Roll formats, two-part and three-part carbonless sets, and machine-issued formats for dispensers like the Intermec 2100 are all available with nationwide shipping and fast turnaround for operators who can’t afford a printing bottleneck mid-season. If your labeling needs stretch beyond a 1D barcode, a 2D code like a Data Matrix might fit better for dense data on a small format, and that’s worth a conversation too. Browse Caymil’s forms for parking to see stock and custom options, or request a sample print run to confirm scan performance before committing to a full order.
Sources
- Code 128 — Wikipedia
- ISO/IEC 16388 — Code 39 symbology specification
- Gs1-128
- Code 128 vs Code 39 — Barcode Press
- Code 128 technical reference — TEC-IT
FAQ
Is Code 128 Better Than Code 39?
For most new systems, yes. Code 128 packs data more tightly, supports the full ASCII character set, and includes a mandatory checksum that Code 39 leaves optional, which reduces misread rates in day-to-day scanning.
Is Code 39 Still Used Today?
Yes, mainly in legacy systems bound by older specifications, including certain Department of Defense LOGMARS and automotive supply chain contracts. New deployments without a legacy constraint almost always default to Code 128.
How Can You Tell If a Barcode Is Code 128 or Code 39?
Look for asterisks bracketing the printed data; Code 39 conventionally uses * as start and stop characters, while Code 128 has no such marker and can include lowercase letters. A barcode scanner set to auto-identify symbology will also flag the type directly.
Is Code 128 Still Used Today?
Yes, extensively. It’s the required symbology behind GS1-128 labeling for shipping, retail, and logistics, and it’s the standard choice for barcoded tickets, including the valet and parking tickets Caymil prints for operators nationwide.