EU import duty at WooCommerce checkout (the 2026 low-value rule)
By Mariusz Szatkowski · Updated: 2026-10-28
For most of the last decade, low-value parcels had an easy ride into the European Union. Anything under 150 EUR crossed the customs border duty-free, which is exactly why direct-to-consumer brands outside the EU could quote a clean price and ship without thinking much about duty. That era is ending. From 1 July 2026 the EU removes the 150 EUR customs duty-free threshold and charges a flat customs duty of 3 EUR per item on low-value consignments from outside the bloc sold to EU consumers in distance sales. For any store that sells into the EU from the UK, the US, Asia or anywhere else outside it, the price the shopper sees at checkout and the cost of actually receiving the parcel are about to diverge, unless the store does something about it. This guide explains what the rule is, who it hits, and how to surface the duty as a clear line at WooCommerce checkout instead of leaving it as a doorstep surprise.
What the 2026 rule actually says
Two thresholds have historically governed low-value imports into the EU. VAT became payable on essentially all commercial imports when the 22 EUR VAT exemption was abolished in 2021 and the Import One-Stop Shop (IOSS) was introduced. Customs duty, separately, was waived on consignments with an intrinsic value at or below 150 EUR. It is that second waiver, the customs duty de minimis, that changes in 2026.
Council Regulation (EU) 2026/382 deletes that relief (Article 1). In its place, from 1 July 2026 until 1 July 2028, Article 2 applies a customs duty of 3 EUR per item in a consignment with an intrinsic value up to 150 EUR, where the import is exempt from VAT under IOSS or the goods are goods in postal consignment. Delegated Regulation (EU) 2026/1022 redefined that term from 1 July 2026 (Article 1(24) of Delegated Regulation (EU) 2015/2446): goods in a consignment up to 150 EUR sold in a distance sale, excluding IOSS goods and goods that benefit from preferential measures. Together the two branches cover every distance sale up to 150 EUR, whoever carries the parcel; the only goods left out are those imported without IOSS under a preferential tariff. From 1 October 2026 the Commission checks monthly whether trade shifts to other channels and may propose extending the measure to the goods still excluded; by 1 December 2027 it assesses whether to propose extending it past 1 July 2028. Separately, from 1 November 2026 customs charge a Union handling fee of 2 EUR per item on goods sold in distance sales, at any consignment value (Regulation (EU) 2026/2108, Article 20(2); Delegated Regulation (EU) 2026/2152, Articles 1 and 2). It is a fee, not part of the duty.
The key mental shift is from “per parcel” to per item, and the law defines what an item is: one or more goods in a consignment sharing the same tariff classification, description and, where the declaration requires it, origin (Delegated Regulation (EU) 2015/2446, Article 1(61); Regulation (EU) 2026/2108, Article 5(78)). Commission guidance adds that the duty is charged per declaration line. So ten identical t-shirts are one item. A t-shirt, a candle and a notebook may be three. The flat duty is multiplied by the number of items, which is why a mixed cart can carry more duty than its modest value suggests.
Who needs to care
The rule applies to goods crossing the EU customs border from outside it. In practice that means:
- A US, UK or Asian store shipping physical products to EU customers.
- An EU brand that fulfils from a non-EU warehouse or dropships from outside the EU.
- Marketplaces and resellers sending low-value parcels into the EU.
An EU-based store shipping to EU customers is not subject to this import duty, because nothing crosses the customs border. If you are inside the EU shipping inside the EU, this guide is not about you. If any part of your fulfilment originates outside the EU and lands inside it, it is.
Why you should show it at checkout
When import duty is not surfaced at checkout, it does not disappear. It reappears as a carrier invoice on the doorstep: the courier pays the duty and a handling fee to release the parcel, then bills the recipient, often with a markup. The shopper, who already paid what they thought was the full price, now faces an unexpected charge before they can take delivery. The predictable results are refused parcels, chargebacks, angry reviews and support tickets, plus the cost of a return journey for the goods.
Warning: Duty you do not surface at checkout does not disappear; it returns as a carrier invoice on the doorstep, often with a handling markup. The predictable results are refused parcels, chargebacks and support tickets.
Surfacing an estimated duty line at checkout flips that experience. The shopper sees, before they pay, that there is an import duty of a few euro on their order. There is no ambush, the delivery completes, and the brand looks like it knows what it is doing in the EU. Even when the estimate is not to the cent, the transparency is what protects conversion and trust. This is the same logic hosted platforms use when they offer “delivered duty paid” pricing, and there is no reason a WooCommerce store cannot do the same.
Why WooCommerce does not do this on its own
WooCommerce ships a capable fees API and a flexible tax engine, but it has no native concept that matches this rule. There is no setting for “a flat duty per item that applies only when the origin is outside the EU, the destination is inside the EU, and the goods value is under a threshold.” Building it yourself means hooking woocommerce_cart_calculate_fees, working out the shopper’s destination country, comparing it against an EU country list, checking your store’s origin, counting distinct tariff lines in the cart, multiplying by your per-line amount, converting from EUR into your store currency, and adding the result as a fee that also behaves correctly in the block-based Cart and Checkout. That is a meaningful amount of logic to write, test against the classic and block checkouts, and keep HPOS-compatible.
How to add a clear duty line: the building blocks
Whether you write the code yourself or use a plugin, a correct implementation needs the same pieces:
The Customs settings screen in wp-admin, where you set the per-line amount, the value threshold and your store origin country.
- An origin check. The duty only applies when the store ships from outside the EU. Make the origin country explicit rather than guessing from the store address.
- A destination check. Read the shopper’s shipping country, fall back to billing, and compare it against a maintained list of EU member states.
- A value threshold. Apply the duty only when the cart goods value, excluding tax, is at or below the threshold (150 EUR under the rule).
- Tariff-line counting. Decide how a “line” is defined: per distinct product category is a sensible default, per distinct product is stricter, and an explicit per-product tariff code should always win when set.
- Currency handling. The rule is written in EUR; if you sell in another currency, convert the per-line amount before adding the fee.
- A real checkout line. Add the duty through the native fees API so it appears, correctly, in both the classic checkout and the Cart and Checkout Blocks, and is HPOS-compatible.
- Honest labelling. Call it an estimate. The final figure is set by customs at import, and a clear label avoids implying a binding assessment.
Doing it with the Customs plugin
The free Customs plugin packages exactly this logic. You set the per-line amount (3 EUR by default), the goods-value threshold (150 EUR by default), your store origin country and, if you do not sell in EUR, a conversion rate. When a cart ships from outside the EU to an EU destination and its goods value is under the threshold, Customs adds an “EU import duty (estimate)” line at cart and checkout, computed as the number of distinct tariff lines multiplied by your per-line amount. Tariff lines are counted from a per-product tariff code where you have set one, falling back to the product category, then the product. Because the line is added through the WooCommerce fees API, it shows up in the classic checkout and the block checkout alike, and it is HPOS-compatible. Intra-EU orders and orders over the threshold are left untouched. The plugin cannot see how a parcel will be declared, so it assumes a distance sale to a consumer; if you import without IOSS under a preferential tariff, leave the estimate off. It does not add the 2 EUR Union handling fee. The full estimating flow is in the free edition, so you can be transparent about EU import duty without a subscription.
The EU import duty estimate appears as its own clear line in the WooCommerce checkout, before the shopper pays.
A sensible rollout
Treat the duty line as a transparency feature, not a precise tax engine. Enable it, set your per-line amount and threshold to the current figures, and label it clearly as an estimate. Remember that the 2 EUR per item Union handling fee from 1 November 2026 comes on top, and update your settings if the headline figures change before the measure expires in 2028. The goal is simple: no shopper in the EU should be surprised by a customs charge on a parcel they already paid for.
Tip: Label the line clearly as an estimate. The final duty and the Union handling fee are set by customs at import, so an honest label avoids implying a binding assessment.