Anyone searching for a «customs API for marketplaces» usually pictures a service that Odoo sends the order to and that hands back the clearance done. That does not exist as such. There are three pieces that have to fit: the data on each line, which lives in Odoo; the channel that carries it to customs, which is the carrier or your customs representative; and the tax regime, which decides whether it is an export, IOSS or nothing.
First: does your shipment go through customs at all?
There are no customs between EU countries. An Amazon Germany order leaving your Barcelona warehouse carries no declaration: it carries destination VAT and OSS, as covered in selling on several Amazons from one Odoo. Customs shows up when goods leave the EU (the UK, Switzerland, Norway, Andorra) and when they come in from outside: stock held in a UK warehouse, or a supplier shipping straight from Asia to your customer. Without leaving Spain, it also applies to the Canary Islands, Ceuta and Melilla.
If everything you sell ships from a mainland Spanish warehouse to EU countries, this article is not your problem. Do not integrate customs «just in case»: check your fiscal positions and OSS, which is where money actually leaks.
What the declaration asks for, line by line
The declaration asks for it per line: tariff classification (the six-digit HS code, which the EU extends to eight digits for exports and ten for imports), a specific description, quantity, net weight, value with its currency and country of origin. Per shipment: incoterm, the exporter's EORI number and the invoice number. In Odoo 19 the product already has an HS code and a country of origin; the usual failure is that nobody fills them in or that they never reach the carrier, which is what to check in any carrier integration, as in UPS in Odoo: international shipping and customs. And «gift» or «accessories» is not a description: it is a reason to hold the parcel.
And the line value is not the marketplace price. The order carries campaign discounts, shipping charged to the customer and sometimes a coupon on the total. Customs wants the value of each line, and it has to match the invoice: an order-level discount is spread across lines by a fixed rule and shipping sits on its own, not buried in the last line. This is where rushed integrations break.
There is no «customs API»: there are two routes
With express or postal parcels, the carrier handles clearance. Its API takes the customs data with the shipment, as an electronic commercial invoice, and the carrier lodges the declaration. Integrating means Odoo sends HS code, origin and value per line when it generates the label.
With pallets, B2B or higher values, a customs representative lodges the declaration with the Spanish tax agency. Filing it straight from your ERP is possible, but for a small business it is rarely worth it. Integrating means Odoo hands over the data in the format they accept and gets back the MRN, the declaration's reference, to file with the delivery order and the invoice.
IOSS: only when goods enter the EU
Since July 2021 everything entering the EU pays VAT. For sales to consumers worth up to €150 (excluding shipping and insurance when charged separately, and excluding alcohol, tobacco and other excise goods), the seller can charge destination VAT at the point of sale and declare it monthly through IOSS. The IOSS number travels in the electronic customs data, not written on the box, and the customer pays nothing at the door. Without IOSS they pay VAT and a handling fee on delivery, and someone who did not expect to pay refuses the parcel.
Marketplaces change who is who: the platform is treated as the supplier for VAT purposes, collects the tax and uses its own IOSS number, which it gives you for the shipment. Your Odoo must not charge VAT again on the invoice and has to send the carrier the marketplace's IOSS number, not yours. The UK runs its own scheme: up to £135, UK VAT is collected at the point of sale, and by the marketplace when there is one.
Which documents go with the shipment
- Commercial invoice, or a pro forma when there is no sale: HS code, origin and value per line, incoterm and EORI.
- CN22 or CN23 when it goes by post, depending on value.
- Export declaration with its MRN. Keep it: it proves the VAT exemption.
- Statement on origin on the invoice when the destination has a trade agreement with the EU, such as the UK or Switzerland, and the goods meet the rules of origin.
- For returns, the reference to the original export. Without it, what comes back may be treated as a fresh import.
What we have and what we do not
We do not have a published customs connector: every carrier and every representative wants the data in its own way. What is published are the connectors that bring orders into Odoo, such as Amazon, Temu or AliExpress and the rest of the catalogue, on Odoo 17, 18 and 19, and Odoo 20 the day it ships. The customs layer is custom development, and its scope depends on how many destinations and clearance routes you have. And if you send a handful of parcels outside the EU each month, do not integrate anything: fill in HS codes and origins, use the carrier's form and keep the invoices.
Frequently asked questions
Do I need IOSS to sell on Amazon France from Spain?
No. There is no import between EU countries, so there is no IOSS. What applies is the destination country's VAT, declared through OSS.
Do shipments to the Canary Islands go through customs?
Yes. The Canary Islands are inside the EU customs territory but outside the VAT area, so shipments from mainland Spain carry a declaration and the local IGIC applies at destination instead of VAT. Ceuta and Melilla sit outside the customs union altogether.
Who decides the HS code, the marketplace or me?
You, or whoever declares on your behalf. The marketplace may ask for it on the listing, but getting the classification right is the declarant's responsibility. If you are torn between two codes, you can ask customs for a Binding Tariff Information (BTI) decision for your product.
Useful links inside FlexigoTech
What we do about this
Selling outside the EU and doing customs by hand?
Tell us which countries you ship to, which carriers you use, whether you work with a customs representative and which marketplaces your orders come from. We will tell you what can be solved with clean data in Odoo and what needs an integration. Write to comercial@flexigobe.com or book a call.

