Code 39 turns 52 this year, and it still outlasts barcodes half its age. It's not on your grocery receipts — but it's on the parts bin at your local auto shop, the ID badge around your neck, and the label on military cargo. If a client, a standard, or a legacy scanner has ever told you "we need Code 39," here is everything that means and how to generate it in bulk without typing each one by hand.
Tabla de Contenidos
The Code 39 TL;DR
Code 39 (also called Code 3 of 9) is a 1974 barcode standard that encodes uppercase letters, numbers, and a handful of symbols. It is self-checking, so a check digit is optional, but it takes roughly twice the physical space of Code 128 for the same data. It remains the standard for U.S. defense logistics (LOGMARS), automotive parts (AIAG), aerospace, healthcare tagging, and ID badges — anywhere scanner compatibility matters more than label size.
1. What Is a Code 39 Barcode?
Where the Name Comes From
Code 39 was developed in 1974 by Dr. David Allais and Ray Stevens at Intermec. The original design used two wide bars and one wide space per character, which produced 40 possible combinations — minus one reserved as the start/stop marker left 39 usable characters, hence "Code 39" (also written Code 3 of 9). Four punctuation characters were added later, bringing the modern set to 43 characters.
Structurally, every Code 39 character is built from 9 elements — 5 bars and 4 spaces — of which exactly 3 are "wide" and 6 are "narrow." That 3-out-of-9 ratio is the actual origin of the "39" in the name, and it's also what makes the symbology self-checking: because only a small, fixed number of wide/narrow patterns are valid characters, a single misprinted or misread bar almost never accidentally produces a different valid character. It just fails to scan.
That self-checking property is the whole reason Code 39 doesn't require a check digit the way EAN-13 or UPC-A do. The character set covers uppercase A–Z, digits 0–9, a space, and seven symbols: - . $ / + % and space. An asterisk (*) marks the start and end of the code and can't appear as data. Lowercase letters aren't supported in standard Code 39 — for that, you need Extended (Full ASCII) Code 39, which pairs up standard characters to represent the extra symbols, and requires a scanner that's specifically configured to decode it.
2. Who Actually Uses Code 39 Today?
Code 39 never made it to retail checkout — that's UPC and EAN-13 territory, and always will be. But in every industry where the barcode never has to leave the building, Code 39's simplicity and near-universal scanner support have kept it in daily use for five decades:
Defense & Government Logistics (LOGMARS)
LOGMARS (Logistics Applications of Automated Marking and Reading Symbols) is the U.S. Department of Defense standard built directly on Code 39, used for tracking military supplies and equipment.
Automotive Parts Tracking
The Automotive Industry Action Group (AIAG) standardized Code 39 for parts container labels in the U.S. auto industry, where it's still used to confirm every shipment received at a plant.
Aerospace & Healthcare
Aircraft parts tracking and hospital/medical equipment tagging both lean on Code 39 for the same reason defense does: decades of proven scanner compatibility in environments where a mis-scan is not an option.
Name Badges & Fixed Asset Tags
Conference badges, employee IDs, and internal equipment asset tags rarely need Code 128's data density — Code 39's bigger, more forgiving bars are actually an advantage when you're scanning at odd angles with basic hardware.
If any of that sounds like your warehouse rather than your retail shelf, it's worth checking our warehouse bin labeling guide too — many facilities run Code 39 for legacy asset tags alongside Code-128 for active SKUs. Two applications worth a closer look on their own: encoding Vehicle Identification Numbers as Code 39 for automotive parts, and the full Code 93 vs. Code 128 comparison if Code 39's low density is a dealbreaker for your label size.
3. Code 39 vs. Code 128: Which Should You Use?
This is the question we get most from sellers and 3PLs setting up a new labeling process. Both encode letters and numbers — the difference is density, and it usually decides the answer for you.
| Característica | Code 39 | Code-128 (Logística) |
|---|---|---|
| Densidad de Datos | Low — ~2x wider than Code 128 | High — compact, ideal for small labels |
| Check Digit | Optional (self-checking) | Built into the symbology |
| Character Set | A-Z, 0-9, 7 symbols (uppercase only) | Full ASCII, upper and lowercase |
| Mejor Utilizado Para | Defense, automotive, badges, legacy scanners | Amazon FBA, modern warehouse SKUs |
The short version: if you're free to choose and just need the densest, most flexible label for a modern warehouse or Amazon FBA shipment, use Code 128. If a standard, a customer, or a piece of legacy equipment specifically calls for Code 39, use Code 39 — fighting the requirement usually costs more than the extra label space does.
4. The Optional Mod 43 Check Digit, Explained
Because Code 39 is self-checking, most implementations skip the check digit entirely. But some standards — LOGMARS among them — require it for an extra layer of verification. It's called a Modulo 43 (Mod 43) check digit, and unlike EAN-13's check digit, you can calculate it by hand in under a minute.
Worked Example: Encoding "CODE39"
- Every Code 39 character has a fixed numeric value (0–9 = 0–9, A–Z = 10–35, then the 7 symbols = 36–42).
- For "CODE39": C=12, O=24, D=13, E=14, 3=3, 9=9.
- Sum the values: 12 + 24 + 13 + 14 + 3 + 9 = 75.
- Divide by 43 and keep the remainder: 75 ÷ 43 = 1 remainder 32.
- Convert 32 back to a character using the same table: value 32 = W.
Result: the Mod 43 check character for "CODE39" is W.
You'll almost never need to do this by hand in production — any decent generator calculates and appends it automatically when you turn the option on. It's useful to understand mainly for troubleshooting: if a barcode fails LOGMARS validation, a wrong check digit is one of the first things to rule out.
5. Why Won't My Code 39 Barcode Scan? (5 Common Fixes)
Code 39 is forgiving compared to most symbologies, but these five issues cause the vast majority of real-world scan failures we hear about:
- Missing start/stop asterisks. If the encoded string doesn't include the leading and trailing "*", most software won't generate a valid Code 39 symbol at all — this is usually a data-entry problem, not a printing one.
- A trailing space in your source data. A stray space at the end of a spreadsheet cell is a valid Code 39 character, so it silently gets encoded — producing a barcode that's technically correct but doesn't match the value you expected.
- Printed too small. Code 39 needs a wide-to-narrow bar ratio of roughly 2:1 to 3:1 to stay reliably readable. Shrink the label too far and that ratio collapses, and adjacent bars start blurring together.
- Not enough quiet zone. Scanners need blank white margin on both sides of the barcode — as a rule of thumb, at least 10x the width of the narrowest bar — or they can't reliably find where the code starts and ends.
- Extended Code 39 on an unconfigured scanner. If you're using lowercase letters or extra symbols (Extended/Full ASCII Code 39), the scanner has to be explicitly set to decode it — otherwise it reads the raw character pairs instead of the intended text.
6. How to Generate Code 39 Barcodes in Bulk
If you're labeling more than a handful of items, typing each Code 39 value into a font-based generator one at a time doesn't scale. Here's the fast path:
Export Your List
Pull your asset tags, part numbers, or ID list into a single-column Excel or CSV file — no special formatting needed.
Open the Workspace and Select Code 39
Drop the file into our bulk barcode workspace — it opens pre-set to Code 39 — and every row becomes a label automatically.
Export a Print-Ready PDF Roll
Download a continuous, correctly-sized PDF roll for your Zebra, Rollo, or Dymo printer — quiet zones and bar ratios are handled for you, which solves most of the scanning issues in the section above before they happen.
Everything runs client-side in your browser — your part numbers and asset lists never touch our servers. If you'd rather see the full workflow first, the Excel-to-barcode guide walks through column setup and common formatting mistakes.
5. Preguntas Frecuentes
Does a Code 39 barcode need a check digit?
What is the difference between Code 39 and Code 93?
Why won't my Code 39 barcode scan?
Can Code 39 encode lowercase letters?
Is Code 39 obsolete, or is it still used today?
How much bigger is a Code 39 barcode than Code 128 for the same data?
Need Code 39 Labels in Bulk?
Upload your list, get correctly-sized, print-ready Code 39 labels in seconds. Free to start, no software install.