Inventory & assets

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.

Code 39 tote label. Every character uses the same nine-element pattern with three wide elements, which is what the name means.

Open Code 39 in the generator

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
Generated by the system

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

  • Code 128

    The dense, full-ASCII linear barcode behind most warehouse, tote, and carrier labels.

  • Code 93

    A compact successor to Code 39 with two mandatory check characters.

  • Codabar

    A legacy numeric barcode still standard in blood banks, libraries, and older logistics systems.

Definitions in the glossary

Browse the full barcode symbology guide.

Book an Endless Commerce demo

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