Code 39 barcode
The oldest alphanumeric barcode still in daily use, self-checking and printable from any font.
Also known as: Code 3 of 9, USS Code 39, LOGMARS, HIBC
What is Code 39?
Code 39 is a low-density alphanumeric barcode with 43 characters, asterisk start and stop marks, and no mandatory check digit. It is self-checking, which is why it has lasted since 1974 in defense logistics, healthcare labeling, automotive, and older warehouse systems. Its weakness is width: a Code 39 string is roughly twice as wide as the same data in Code 128.
Encodes: Digits 0 to 9, upper-case A to Z, space, and the symbols - . $ / + %. Full ASCII is possible with shift-pair encoding.
How Code 39 is structured
Code 39 is a fixed-pattern symbology: each character is drawn as five bars with the four spaces between them, and exactly three of those nine elements are wide. There is no code-set switching and no compression, which makes it easy to print and slow to read.
| Part | Length | What it means |
|---|---|---|
| Start | 1 character | The asterisk. The encoder adds it; barcode fonts require you to type it. |
| Data | Variable | Upper-case letters, digits, and seven symbols. Lower case is not available without Full ASCII shift pairs. |
| Optional check | 1 character | Mod 43 across the data. Only useful if the scanner is also configured to expect and strip it. |
| Stop | 1 character | The asterisk again. |
Specifications
- Character set
- 43 characters: 0 to 9, A to Z, space, - . $ / + %
- Length
- Variable; width grows fast, so keep it short
- Check digit
- Optional mod 43; not part of the base standard and off by default on most scanners
- Self-checking
- Yes; a single print defect cannot turn one character into another
- Start and stop
- Asterisk on both ends, added by the encoder and not shown as data
- Wide-to-narrow ratio
- 2.0 : 1 to 3.0 : 1; 2.5 : 1 or higher reads best
- Quiet zones
- 10X on the left and right
- Standards
- ISO/IEC 16388; MIL-STD-1189 (LOGMARS); HIBC for healthcare
Dimensions are GS1 General Specifications targets. Confirm against the retailer’s current routing guide before a print run.
Where it is used
- Asset tags and equipment labels
- US Department of Defense shipping and item labels (LOGMARS)
- Healthcare labeling under the HIBC standard
- Automotive supplier labels and older AIAG formats
- Legacy WMS location and tote labels, and badges
Printed by whatever system owns the tag
Code 39 survives because it is forgiving of poor printing and can be produced from a font in a spreadsheet, which is exactly how many asset registers still make it. For anything a WMS scans, the WMS prints it. New deployments should default to Code 128 unless a receiving standard such as LOGMARS or HIBC mandates Code 39.
Mistakes that cost money
Fonts without the asterisks
A Code 39 font renders exactly what you type. Leave out the start and stop asterisks and nothing scans.
Lowercase in the data
Base Code 39 has no lowercase. Encoders either upper-case silently or fail, and the scanned value will not match your record.
Long strings
Fourteen characters of Code 39 can exceed 100 mm. Use Code 128 for anything beyond a short identifier.
Ratio too tight
Below a 2.25 : 1 wide-to-narrow ratio the symbol misreads in poor light or on curved surfaces.
Assuming a check digit exists
Mod 43 is optional. If you add it, every scanner in the flow must be set to verify and strip it, or the digit ends up in your data.
How Endless handles Code 39
Endless reads Code 39 from legacy asset and location labels during onboarding and maps them to the same location and unit records the rest of the operation uses, so a warehouse can migrate label formats over time without a cutover day.
Frequently asked questions
Code 39 or Code 128 for a new warehouse?
Code 128. It is denser, has a mandatory check character, and every current scanner reads it. Choose Code 39 only when a receiving standard requires it, such as defense LOGMARS labels or HIBC healthcare labeling.
Do I type the asterisks into the data?
Not when using a real encoder, which adds start and stop automatically. Only barcode fonts need them typed, and that is one reason fonts cause so many unscannable labels.
Why does Code 39 not need a check digit?
It is self-checking: each character’s pattern is distinct enough that a single printing defect produces an invalid character rather than a different valid one. That protects against misreads, not against typing the wrong value.
Related symbologies
Definitions in the glossary
- Warehouse Management System (WMS)→
The system that runs day-to-day warehouse operations — receiving, slotting, picking, shipping.
Browse the full barcode symbology guide.

See it on your channels.
Spend your time on the business, not the busywork. Book a demo and watch Endless run your operations across every channel you sell on.
Get a Demo