If you build software that touches cross-border trade, customs classification is one of those problems that looks simple until it isn't. A single product does not have a single code. It has a code per regime, and the regimes only partly overlap.
Here's the model that makes it tractable.
The shared base
Every product carries a six-digit HS code from the World Customs Organization. Treat this as the canonical key. It's stable across countries.
Regional extensions
Each authority appends its own digits:
UK Commodity Codes extend the six-digit base for UK tariff and trade purposes.
EU Combined Nomenclature (CN) adds two digits to make an eight-digit code. It's the base for EU export classification and the first eight digits of TARIC.
TARIC layers import measures (suspensions, quotas, preferences) on top of the CN.
Canada Customs Tariff uses the same HS base with its own national structure.
Implementation notes:
Store the six-digit HS as your shared identifier, then map regional codes against it.
The CN updates annually, effective 1 January. Version your reference data.
Don't assume a CN code is valid for a UK declaration. It isn't.
Getting this wrong surfaces as incorrect duty rates and held shipments, not as a clean error. So validation matters more than it looks.
For the regional detail behind this model, see this guide to UK, EU and Canada commodity codes.
Building classification into a product? Watch a demo.













