Guides

EU import duty at WooCommerce checkout (the 2026 low-value rule)

By Mariusz Szatkowski · Updated: 2026-06-30

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 applies a flat customs duty per tariff line on low-value consignments arriving from outside the bloc. 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.

From 1 July 2026, consignments valued at or below 150 EUR shipped into the EU from outside it are no longer duty-free. Instead of computing a full tariff classification for every cheap parcel, the EU applies a simplified, flat customs duty per tariff line. The announced figure is 3 EUR per distinct tariff line, and it is framed as a temporary, transitional measure running until 1 July 2028, bridging the gap until the broader customs union reform and the full abolition of the de minimis take effect. A separate national handling charge per customs line is also expected to appear in some member states later, which stores should watch for but which is distinct from the duty itself.

The key mental shift is from “per parcel” or “per item” to per tariff line. A tariff line is, roughly, a group of goods that share a customs classification. Ten identical t-shirts are one line. A t-shirt, a candle and a notebook may be three. The flat duty is multiplied by the number of distinct lines, 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.

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 tariff line 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:

  1. 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.
  2. A destination check. Read the shopper’s shipping country, fall back to billing, and compare it against a maintained list of EU member states.
  3. 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).
  4. 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.
  5. Currency handling. The rule is written in EUR; if you sell in another currency, convert the per-line amount before adding the fee.
  6. 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.
  7. 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 full estimating flow is in the free edition, so you can be transparent about EU import duty without a subscription.

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. Watch for the separate national handling charges expected in some member states, 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.

Customs for WooCommerce