# Channel Code

> Source: https://docs.barcoder.ai/docs/standards/channel-code
> research date 2026-06-03 · extracted at 2026-10-03
> Publisher: Barcoder — encyclopedia of QR, barcode and payment-code standards

Specifications:
- [Channel Code — Seagull Scientific Barcode Guide](https://barcodeguide.seagullscientific.com/Content/Symbologies/Channel_Code.htm)
- [Channel Code Barcode (ANSI/AIM BC12-1998) — Neodynamic](https://www.neodynamic.com/barcodes/Channel-Code-Barcode.aspx)

## Overview

**Channel Code** is a linear, continuous, self-checking, bidirectional 1D barcode symbology designed to encode short numeric strings — between two and seven digits — in the shortest possible space <sup>[1][1]</sup><sup>[2][2]</sup>. It supports only the numeric digits 0–9 <sup>[2][2]</sup> and requires no separate check character because it is self-correcting <sup>[2][2]</sup>. Its design goal is maximum compactness for tiny print areas <sup>[1][1]</sup><sup>[2][2]</sup>.

## History

Channel Code was invented by **Ted Williams** and **Andy Longacre** in **1992** <sup>[2][2]</sup>. It is standardized as **AIM BC12 — Uniform Symbology Specification: Channel Code** (also referenced as ANSI/AIM BC12-1998 / USS Channel Code) <sup>[2][2]</sup><sup>[1][1]</sup>.

## Technical specification

- **Character set:** numeric digits 0–9 only <sup>[2][2]</sup>.
- **Compactness principle:** rather than assigning each digit its own pattern, Channel Code encodes the entire numeric value as a single combinatorial arrangement within a fixed number of "channels," allowing very short symbols <sup>[2][2]</sup>.
- **Channels 3–8:** six symbol sizes are defined, called channels 3 through 8. The channel number equals one more than the number of digits encoded (e.g. channel 5 encodes four digits) <sup>[2][2]</sup><sup>[1][1]</sup>. Each channel has a fixed value range:

  | Channel | Digits | Value range |
  |---------|--------|-------------|
  | 3 | 2 | 0–26 |
  | 4 | 3 | 0–292 |
  | 5 | 4 | 0–3,493 |
  | 6 | 5 | 0–44,072 |
  | 7 | 6 | 0–576,688 |
  | 8 | 7 | 0–7,742,862 |

  <sup>[2][2]</sup><sup>[1][1]</sup>
- **Self-checking:** the symbology is self-checking/self-correcting and needs no extra check character <sup>[2][2]</sup>. (An optional check bar suffix is available in some implementations via an `includecheck` option <sup>[5][5]</sup>.)
- **Scanner attunement:** a scanner must be set ("attuned") to the specific channel of the symbol it is reading; it is recommended to fix the channel so all relevant scanners use a matching setting <sup>[2][2]</sup><sup>[1][1]</sup>.
- **Dimensions:** the minimum bar height is 5.0 mm or 15 percent of the symbol length, whichever is greater <sup>[1][1]</sup>.

## Use cases

Channel Code is intended for situations demanding the **smallest possible symbol footprint** for a short numeric value — i.e. very small or constrained print areas where a conventional numeric barcode would not fit <sup>[1][1]</sup><sup>[2][2]</sup>. Its self-checking, no-check-character design and tight value ranges make it suited to compact serial/sequence numbering rather than general-purpose labelling.

## Implementations

- **[BWIPP (postscriptbarcode)](https://github.com/bwipp/postscriptbarcode)** — PostScript, active 2026. Implements Channel Code via the `channelcode` encoder with options `shortfinder` (shortened finder pattern) and `includecheck` (optional check-bar suffix), plus `includetext` for human-readable output <sup>[5][5]</sup>.
- **[zint](https://github.com/zint/zint)** — C, ~771 stars, active 2026. Lists Channel Code among its 50+ supported symbologies <sup>[3][3]</sup>.
- **[bwip-js](https://github.com/metafloor/bwip-js)** — JavaScript port of BWIPP, ~2.4k stars, active 2026; also supports Channel Code <sup>[3][3]</sup>.

## Comparison

- **Channel Code vs. other compact numeric codes:** unlike Interleaved 2 of 5 or MSI, which add width per additional digit at a roughly constant rate, Channel Code packs a whole bounded numeric value into a single fixed-size channel symbol, achieving shorter symbols for small values <sup>[2][2]</sup><sup>[1][1]</sup>.
- **Self-checking without a check digit:** whereas MSI is not self-checking and Code 11 relies on appended C/K check digits, Channel Code is inherently self-correcting and requires no check character <sup>[2][2]</sup>.
- **Trade-off:** the gain in density comes at the cost of scanner channel-attunement requirements and strict per-channel value ceilings, limiting it to short, bounded numeric data <sup>[2][2]</sup><sup>[1][1]</sup>.

## Status

Channel Code is a **specialized, niche** symbology — uncommon in mainstream use but standardized (AIM BC12) and supported by current barcode-generation libraries (BWIPP, zint, bwip-js). It survives as the compact-numeric option of choice for very small print areas rather than as a general-purpose code <sup>[1][1]</sup><sup>[2][2]</sup><sup>[5][5]</sup>.

## Sources

[1] [Channel Code](https://barcodeguide.seagullscientific.com/Content/Symbologies/Channel_Code.htm) — Seagull Scientific Barcode Guide, accessed 2026.
[2] [Channel Code Barcode (ANSI/AIM BC12-1998)](https://www.neodynamic.com/barcodes/Channel-Code-Barcode.aspx) — Neodynamic, accessed 2026.
[3] [zint — A barcode encoding library](https://github.com/zint/zint) — GitHub (zint/zint), accessed 2026.
[4] [Channel Code](https://help.seagullscientific.com/2016/en/Subsystems/Symbology/Content/Channel_Code.htm) — Seagull Scientific (BarTender) help, accessed 2026.
[5] [Channel Code](https://github.com/bwipp/postscriptbarcode/wiki/Channel-Code) — BWIPP (postscriptbarcode) wiki, accessed 2026.

[1]: https://barcodeguide.seagullscientific.com/Content/Symbologies/Channel_Code.htm
[2]: https://www.neodynamic.com/barcodes/Channel-Code-Barcode.aspx
[3]: https://github.com/zint/zint
[4]: https://help.seagullscientific.com/2016/en/Subsystems/Symbology/Content/Channel_Code.htm
[5]: https://github.com/bwipp/postscriptbarcode/wiki/Channel-Code

## Deployments

_No country reports mention this standard by name._

## Regions / aggregations not mapped to a single country

- Universal
