ISO 6346
The international standard for identifying and marking freight containers. ISO 6346 sets the 11-character number format, the check-digit algorithm, the size & type codes, and the legal markings every container carries on its sides and doors. Current revision: ISO 6346:2022.
What ISO 6346 actually covers
There are two ISO standards every freight container operator runs into. They get confused constantly. They cover different things:
- ISO 1496 — physical specification. Dimensions, racking strength, stacking loads, test methods. This is what container manufacturers build to.
- ISO 6346 — identification and marking. The 11-character ID, the check digit, the size & type code, the operational and safety stencils. This is what’s painted on the doors and side panels.
Both apply to every standard ISO container. If you’re inspecting equipment, ISO 1496 is the one that tells you whether the box is structurally sound; ISO 6346 is the one that tells you what to write down. This guide is about the second.
Anatomy of a container number
Every ISO container carries an 11-character identifier, painted in block stencil on both door panels and on at least one side. Here’s a real OWLU® container broken apart:
The first three letters are the owner’s BIC-registered identifier — see the
BIC Codes guide. The fourth letter is the equipment
category: U for freight containers (which is almost everything),
J for detachable equipment, Z for trailers and chassis. The six-digit
serial is whatever the owner has assigned, sequential per fleet. The final digit is computed.
The check digit
ISO 6346 specifies a modulo-11 algorithm that produces a single check digit from the first 10 characters. The point isn’t security — it’s catching transcription errors when someone reads a container number off a worn door panel or types it into a manifest. The math is straightforward but the letter values are not.
The algorithm
- Convert each of the first 10 characters to its numeric value. Digits are themselves; letters use a special table (next section).
-
Multiply each value by
2 to the power of its position— that’s weights 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 from left to right. - Sum the ten products.
- Take the sum modulo 11. The result is the check digit.
-
Edge case: if the remainder is 10, it’s printed as
0. ISO 6346 recommends not allocating those serials, since single-character errors can mutate one valid number into another without detection.
Letter values — the table that bites people
Letters start at A = 10 and skip every multiple of 11 (so 11, 22, 33 are unused).
The skips fall before L and before V. This is the part
most amateur implementations get wrong:
| A | B | C | D | E | F | G | H | I | J |
|---|---|---|---|---|---|---|---|---|---|
| 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| K | L | M | N | O | P | Q | R | S | T |
|---|---|---|---|---|---|---|---|---|---|
| 21 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| U | V | W | X | Y | Z |
|---|---|---|---|---|---|
| 32 | 34 | 35 | 36 | 37 | 38 |
The skips exist for a real reason. The algorithm divides by 11 at the end, so any two
characters with values congruent mod 11 would contribute identically — meaning a
single-character substitution between them would slip past the check digit. Skipping the
multiples guarantees every letter is unique mod 11. Implementations that compute
letter_value = ord(c) - ord('A') + 10 without skipping silently produce wrong check
digits for any container with L, V, W,
X, Y, or Z in it. This is the classic bug.
Worked example
The same OWLU® container from the anatomy section above —
OWLU209148 — run through the algorithm:
| Pos | Char | Value | × | Weight | = | Product |
|---|---|---|---|---|---|---|
| 0 | O | 26 | × | 1 | = | 26 |
| 1 | W | 35 | × | 2 | = | 70 |
| 2 | L | 23 | × | 4 | = | 92 |
| 3 | U | 32 | × | 8 | = | 256 |
| 4 | 2 | 2 | × | 16 | = | 32 |
| 5 | 0 | 0 | × | 32 | = | 0 |
| 6 | 9 | 9 | × | 64 | = | 576 |
| 7 | 1 | 1 | × | 128 | = | 128 |
| 8 | 4 | 4 | × | 256 | = | 1024 |
| 9 | 8 | 8 | × | 512 | = | 4096 |
| Sum | 6300 | |||||
| 6300 mod 11 | 8 | |||||
Check digit = 8. The full number OWLU2091488 validates — and note
the letter values at work: O, W, and L are 26, 35, and 23, with L landing past the first skipped
multiple of 11. Try it yourself in the
check-digit calculator.
Worn or dirty stencils cause specific predictable swaps: O ↔ 0,
I ↔ 1, S ↔ 5, B ↔
8, Z ↔ 2. ISO 6346 does not ban ambiguous
letters (I, O, and Q are all valid), so the check digit
is what catches the error.
Size & type codes
Below the container number you’ll see another four-character code — usually painted smaller. That’s the size and type code, also defined in ISO 6346. It tells you, in four characters, what kind of container you’re looking at.
Structure:
| Position | What it encodes |
|---|---|
| 1 | Length |
| 2 | Width × Height (combined) |
| 3 | Primary container type |
| 4 | Subtype / detail |
Decode one as you scroll
The most common code in the OWLU® fleet, taken apart one position
at a time — 45G1:
4 Length code — 40ʹ
5 Width × height — 8ʹ wide × 9ʹ6ʺ — the 5 is what marks a high cube
G Primary type — general purpose, no ventilation
1 Subtype — GP detail variant, by far the most common
= 40ʹ high cube, general purpose
Length codes (position 1)
| 2 | 20ʹ |
| 4 | 40ʹ |
| L | 45ʹ |
| M | 48ʹ |
| N | 49ʹ |
Width × Height codes (position 2)
| 0 | 8ʹ wide × 8ʹ high |
| 2 | 8ʹ × 8ʹ6ʺ (standard) |
| 5 | 8ʹ × 9ʹ6ʺ (high cube) |
| 6 | 8ʹ × >9ʹ6ʺ |
Primary type codes (position 3)
| G | General purpose, no ventilation |
| V | General purpose with ventilation |
| B | Dry bulk |
| S | Named cargo (livestock, autos, fish) |
| R | Reefer (integrated refrigeration) |
| H | Reefer or heated, removable equipment |
| U | Open top |
| T | Tank |
| P | Platform or flat rack |
Common full codes you’ll see at a depot
| Code | What it is |
|---|---|
| 22G1 | 20ʹ standard GP |
| 25G1 | 20ʹ high cube GP |
| 42G1 | 40ʹ standard GP |
| 45G1 | 40ʹ high cube GP |
| L5G1 | 45ʹ high cube GP |
| 22R1 | 20ʹ reefer |
| 42R1 | 40ʹ reefer |
| 45R1 | 40ʹ high cube reefer |
| 22U1 | 20ʹ open top |
| 42U1 | 40ʹ open top |
| 22P1 | 20ʹ flat rack, fixed ends |
| 22P3 | 20ʹ flat rack, collapsible |
| 22T0–T6 | 20ʹ tank, varying pressure ratings |
| 22B0 | 20ʹ dry bulk |
For the full historical lookup, BIC publishes the size & type code reference ↗ reflecting ISO 6346:2022.
The other markings on a container
ISO 6346 also specifies a set of legal and operational stencils that must appear alongside the container number on every box. The most important:
- Max Gross Weight — the maximum allowed combined weight of the container plus contents. Typically around 30,480 kg / 67,200 lbs for a standard 20ʹ or 40ʹ.
- Tare — the empty weight of the container itself. Typically 2,200 kg (~4,850 lbs) for a 20ʹ GP, 3,800 kg (~8,380 lbs) for a 40ʹ GP.
- Net / Payload — Max Gross minus Tare. The cargo the container can actually carry.
- Cubic Capacity — interior volume in cubic feet or cubic meters.
- CSC Safety Approval Plate — a separate ISO/CSC requirement (not ISO 6346 itself) but mounted alongside. Indicates the container has passed the structural inspection required by the Convention for Safe Containers and lists the next inspection due date.
- Owner’s logo or brand stencil — Maersk’s "Maersk," Hapag-Lloyd’s "HL," etc. Convention, not requirement.
Why this matters for operators
ISO 6346 is the thread that runs through every system that touches a container:
- Bills of lading use the 11-character ID as the primary key.
- Terminal and depot management systems (Navis, CRM 1Stop, every TOS in the industry) index everything off the same number.
- Equipment interchange receipts (EIR) — the documents that handle handoffs between depots, truckers, and shippers — carry the ID and the size/type code as the only two facts that matter for legal liability.
- Customs filings, CSC records, OCR systems on terminal gates — everything that processes containers at scale assumes ISO 6346 is intact and validates the check digit.
A container without a valid ISO 6346 identifier is, operationally, invisible. It can’t be tracked, can’t be insured, can’t be moved through a major port. The standard is mundane — eleven characters, a modulo-11 algorithm — but it’s the operational backbone of the entire industry.