---
title: "Commodity Codes"
space: "ERPNext"
url: "https://www.prilk.com/docs/erpnext/localization/europe/commodity-codes"
updated: "2026-05-15"
---

# Commodity Codes

Commodity codes (CN8 in EU terminology, also known as tariff numbers)
classify physical goods for customs and statistical purposes. Every
intra-EU shipment and every import / export needs the right code on
the paperwork.

This module adds CN8 validation on top of ERPNext's standard **Customs
Tariff Number** doctype, plus the Intrastat-related metadata fields on
Items and supply-chain doctypes.

## Where codes are stored

ERPNext has a **Customs Tariff Number** doctype (built-in to ERPNext).
Each Item links to one via the standard `customs_tariff_number` field.
This module:

1. Validates the format when you save a Customs Tariff Number record —
   8 digits for CN8, optionally up to 10 digits for HS/TARIC sub-codes.
2. Rejects clearly invalid codes (letters, wrong length).
3. Flags codes that have been deprecated in the current annex if a
   replacement is known.

If you ship something that genuinely doesn't have a code (services,
intangibles), tick **Skip Commodity Code Validation** on the Item — the
Intrastat report will then exclude that item from the goods totals.

## Intrastat metadata on Items

This module adds two custom fields to **Item**:

- **Intrastat Supplementary Unit** (`intrastat_supplementary_unit`) —
  the secondary unit of measure that the CN8 code requires. Common
  values: pieces, pairs, kilograms net, litres, square metres.
  Required for items in commodity-code chapters that have one (most
  textiles, footwear, and lighting do).
- **Skip Commodity Code Validation** (`skip_commodity_code_validation`) —
  bypass the CN8 validator. Use for services, intangibles, and
  composite items where the code is set at the line level.

## Intrastat metadata on supply-chain doctypes

For Intrastat reporting, the same shipment needs a **transport mode**
and a **region code**. These can be set at multiple levels — the most
specific wins:

| Doctype | Field | When to use |
|---|---|---|
| Shipping Rule | `intrastat_transport_code` | Per shipping method (e.g., your air-freight rule uses 4, your road rule uses 3) |
| Stock Entry | `intrastat_transport_code` | Per stock movement, for subcontracting where shipping rule isn't relevant |
| Subcontracting Receipt | `intrastat_transport_code` | Per receipt of subcontracted goods |
| Warehouse | `intrastat_region_code` | The NUTS region of the warehouse |

If none of these are set, the **EU Intracommunity Settings** defaults
apply. So at minimum: set the EU-wide defaults once, override per
Warehouse or Shipping Rule only where they differ.

## Transport codes (Intrastat)

| Code | Mode |
|---|---|
| 1 | Sea |
| 2 | Rail |
| 3 | Road |
| 4 | Air |
| 5 | Postal consignment |
| 7 | Fixed transport installations (pipelines) |
| 8 | Inland waterway |
| 9 | Self-propelled (vehicle moving under its own power) |

Most NL SMBs use 3 (Road) for road freight or 4 (Air) for international
parcels. Set the default in EU Intracommunity Settings, override at the
Shipping Rule level if needed.

## Where to look codes up

- [TARIC consultation](https://taxation-customs.ec.europa.eu/online-services/online-services-and-databases-customs/taric-consultation_en) — official EU lookup, free
- Your customs broker if you have one
- The annual CN8 revision (published Oct for the following year) from the European Commission

## What this module does *not* do

- **Set codes automatically.** You still need to classify each Item. The
  module validates what you set; it doesn't guess.
- **TARIC duty rates.** This is statistics + customs paperwork, not duty
  calculation. For duty rates and import VAT, you'll need a TARIC tool
  or your broker.
- **HS-to-CN8 conversion.** If you receive paperwork with 6-digit HS
  codes, you'll need to add the 7th and 8th digits manually (the CN8
  drills down to EU-specific subdivisions).
