Skip to content

Powered by Grav CMS + Helios Theme

Customs

This page covers what an international parcel needs before a courier will carry it, and where your store gets each fact from.

A customs declaration is built whenever a parcel crosses a customs border, and never otherwise. Sell within one country and you will never see this. Take one order from across a border and it appears in the buy sheet.

Parcels between EU countries do not cross one, because the EU is one customs union. Monaco counts as inside it, and so does Northern Ireland for goods. A parcel between Great Britain and Northern Ireland gets no declaration from the add-on either, which is right for a parcel to a consumer sent with a UK carrier and for a business registered for the UK Internal Market Scheme. A business-to-business parcel outside that scheme can need one, which an address cannot show, so make that one in your carrier's own panel. Some places inside an EU country are outside the union's customs or VAT area, and a parcel to one of them does need a declaration even from the same country: the Canary Islands, Ceuta and Melilla, the Åland Islands, the French overseas departments, Heligoland, Büsingen, Livigno, Campione d'Italia and Mount Athos. The add-on tells them apart by postcode.

Before you begin

  • A ship-from address with a country on it.
  • kahunacart.shipping.manage to record customs facts on a product or in the settings.
  • A real person's name for Certifying signer. A courier refuses an international parcel without one.

What a declaration needs

Per line: a description of what it is, how many, what they weigh in total, what they are worth in total, in which currency, and where they were made. The currency is the order's own, with the order's amounts, whatever currency the carrier account is in.

Once for the store: the name of the person certifying it, what the contents are, what the courier should do with a parcel nobody accepts, and your US export exemption if you ship from the States.

Important

The weight and the value are totals, not per item. Three mugs at 250 g is one line of quantity three weighing 750 g. Every courier spells it that way and everybody gets it wrong once.

Where each fact comes from

Three places, most specific first.

Source What it supplies
The product's or variant's own customs facts The harmonised code, the country of origin, and the description that goes on the form.
The order line Its title stands in for a customs description, and the weight and price frozen on the line are already what a declaration wants.
The Customs settings One country of origin for a shop that makes everything in one place, plus the store-wide answers below.

A variant's row wins over the product's field by field, not wholesale. A store that recorded a harmonised code for the product and a country of origin for one variant gets both, which is what they meant.

These are catalogue facts, not order facts. They do not change when an order changes, and they survive bin/plugin kahunacart reset, exactly like the box catalogue.

Record a product's customs facts

  1. In the admin sidebar, click KahunaCart, then Products, and open a product.
  2. Open the Shipping tab.
  3. Fill in Harmonised code, Country of origin and Customs description.
  4. Click Save.

To record different facts for one variant — a store that genuinely makes the blue one somewhere else — do the same on that variant.

Set the store-wide answers

  1. Open KahunaCart → Shipping carriers and the Settings tab.
  2. Open the Customs tab.
  3. Fill in the fields below.
  4. Click Save.
Setting What it is
Certifying signer A real person's name. It is the electronic equivalent of the signature at the bottom of the form, and a courier refuses the parcel without one.
Default country of origin Where your goods are made, for every product that does not say otherwise. Two letters, such as US or GB.
Contents type Documents, Gift, Sample, Merchandise, Humanitarian donation, Returned merchandise or Something else. Nearly always Merchandise.
Contents explanation Required when the type is Something else, ignored otherwise.
If it cannot be delivered Return it or abandon it. Returning it costs you the return leg; abandoning it means it is gone.
Export exemption (EEL/PFC) US exports only. NOEEI 30.37(a) covers a shipment under $2,500 per commodity, which is nearly everything a small store posts, and is the default.
AES ITN Required when the exemption is AES ITN, ignored otherwise.
Incoterm DDP, DDU, FCA, DAP or eDAP. DDP means you pay the duty and the customer gets no bill at the door. Empty lets the courier use its own default, which is normally the customer paying.

Caution

Declaring goods as a gift to lower somebody's duty is fraud, not a discount.

You are told what is missing before you spend money

The buy sheet builds the declaration before it offers you a button, reads back what is short, and names it per line — "three items need a country of origin", with the products linked. Fill them in, come back, and buy.

What it will not do is send an incomplete declaration and let a courier tell you, in an error array, that item 4 of 11 has no origin.

Four rules are checked in your store before anything is sent, because a courier's own wording for them is poor:

  • An explanation is required when the contents type is Something else.
  • An AES ITN number is required when the export exemption is AES ITN.
  • Every line needs the six facts above, with the weight and the value as totals.
  • A harmonised code goes out under one field name only.

Harmonised codes

A harmonised (HS) tariff code is how a customs officer knows what a thing is. Six to ten digits, and your national customs website has a lookup.

It is optional as far as your store is concerned — a parcel goes without one — but a parcel with a wrong or missing code is the single most common reason for one to sit in a shed for a fortnight.

Note

Shippo accepts the code under two different field names and silently prefers one of them. This add-on only ever sends the one it prefers, so a code you type here is the code that goes. A hand-rolled integration that picked the other name would have its codes quietly ignored with nothing said.

When customs goes wrong

What happened What you see What fixes it
A line has no country of origin The sheet names the line and the field Set it on the product, or set a store default
A line has no description Nothing. The line's own title is used Nothing, unless the title is wrong on a form
A line has no harmonised code Nothing. It goes without one Add one if parcels start being held
No certifying signer The sheet says so, before the button Fill it in on the Customs tab
Contents is Something else with no explanation Refused before anything is sent Write the explanation
Exemption is AES ITN with no number Refused before anything is sent Enter the ITN
A line weighs nothing The sheet names it Set a weight on the product. A declaration with a zero weight is refused
A line is worth nothing The sheet names it A genuinely free item still needs a customs value
The courier refuses the declaration The courier's own messages, verbatim Fix what it names and buy again. Nothing has been charged
A domestic order No customs anything Nothing. Attaching an empty declaration is a good way to have a domestic label refused

ShipEngine declarations

ShipEngine receives products on each packed parcel, with per-item values and weights and the shipment's contents, non-delivery choice and terms of trade. The driver checks that the declared quantities match the packed boxes before sending anything.

This driver cannot yet transmit an AES ITN filing reference. A declaration choosing AES_ITN is refused before an API call; create that export label in ShipEngine with its filing details. A commercial-invoice link is kept when ShipEngine returns one.

Sendcloud declarations

Sendcloud receives each item on the parcel with its description, quantity, weight and value per unit, its HS code and its country of origin, plus the order number as the invoice number and the reason for the export. Sendcloud requires an HS code on every item, so add one to each product you ship across a border.

A commercial export from the UK or the EU also needs your VAT number, and sometimes your EORI number. Put them in Settings → Sendcloud → VAT number and EORI number. Without a VAT number Sendcloud refuses the label, unless it runs on your own carrier contract. Sendcloud makes the customs documents itself. The add-on keeps the label file only, so download the customs documents from the shipment in Sendcloud's panel.