Skip to content

Customs

Customs is a free WooCommerce plugin for stores shipping from outside the EU to EU customers. It adds an estimated EU import duty to cart and checkout as its own fee line, 3 EUR per tariff line by default. The line appears only for a non-EU origin, an EU destination and goods at or below the threshold.

Customs estimates the EU flat import duty and shows it to the shopper as its own line at cart and checkout, so there are no surprise charges on delivery. From 1 July 2026 the EU removes the 150 EUR duty-free threshold for low-value imports and, until 1 July 2028, charges a customs duty of 3 EUR per item in consignments up to 150 EUR imported under IOSS or in postal consignment (Council Regulation (EU) 2026/382, Article 2). Since 1 July 2026 goods in postal consignment means goods in a consignment up to 150 EUR sold in a distance sale to an EU customer, excluding IOSS goods and goods that benefit from preferential measures (Delegated Regulation (EU) 2015/2446, Article 1(24), as replaced by Delegated Regulation (EU) 2026/1022). Together that covers every distance sale up to 150 EUR, with or without IOSS; it turns on the sale, not on who carries the parcel. The only goods left out are those imported without IOSS that claim a preferential tariff - from version 1.2.0 the plugin allows you to exclude such products from duty calculation using a checkbox on the product Shipping tab.

The duty line is added only when all of these are true:

  • The feature is enabled.
  • The store ships from outside the EU (the configured origin country, or the WooCommerce base country). Ceuta and Melilla sit outside the EU customs territory (Regulation (EU) No 952/2013, Article 4(1)) and are treated as non-EU territories.
  • The destination (shipping, then billing) is an EU country.
  • The cart goods value is at or below your threshold. The value is the item total after coupons, without tax, shipping or fees, converted to EUR with your rate.
  • The order date falls within the statutory period of 1 July 2026 to 1 July 2028 (Council Regulation (EU) 2026/382, Article 2; can be disabled in settings if regulations are extended).

Intra-EU orders and orders over the threshold are left untouched. A cart with only virtual or downloadable products gets no duty line, because those products do not count as tariff lines. Ceuta and Melilla are recognised from the Spanish province (CE, ML) or a postcode starting with 51 or 52, for both the store address and the customer address.

The duty is the number of distinct tariff lines in the cart multiplied by your per-line amount (3 EUR by default). Tariff lines are counted from a per-product tariff code (_customs_tariff_code), falling back to the product category, then the product. Variations use their own code, then the parent’s code, and on the product basis they count under the parent product, so sizes and colours of one product are one line. Codes are compared after normalisation, so 6109.10 and 6109 10 are the same line. Goods sharing the same tariff code but produced in different countries of origin (configured on the product Shipping tab) count as separate tariff lines in line with the item definition (Delegated Regulation (EU) 2015/2446, Article 1(61)).

The amount is added through the native WooCommerce fees API, so it appears in both the classic checkout and the Cart and Checkout Blocks, and it is HPOS compatible.

Open WooCommerce > EU Import Duty:

  • Enable duty estimate - add the line to qualifying carts.
  • Who pays the duty - choose payment handling: charge at checkout (DDP, default), show as estimate outside total for parcels where carrier collects duty on delivery (DAP), or absorb the duty internally (recorded on the order without adding to the customer total). In the Cart and Checkout Blocks the DAP estimate is shown on the order confirmation and in the order emails, not in the cart.
  • Duty per tariff line (EUR) - the EU rule is 3 EUR per item, counted here as one item per distinct tariff line and country of origin.
  • Goods-value threshold (EUR) - the duty applies only at or below this value (EU rule: 150 EUR).
  • Store currency per 1 EUR - the conversion rate used to render the EUR amounts in your store currency; leave at 1 if you sell in EUR.
  • Store origin country - where parcels ship from; the duty only applies when this is outside the EU.
  • Default country of origin - fallback country assigned to products without a specific origin country set on their Shipping tab.
  • Tariff line basis - one line per distinct product category (recommended) or one line per distinct product. A tariff code set on a product always overrides this.
  • Count a subcategory under the category it sits in - off by default. When on, products are grouped by their top-level category, so two subcategories of one parent count as one line. When off, each assigned category counts on its own.
  • Checkout line label - the wording shown to the shopper (defaults to “EU import duty (estimate)”).
  • Apply tax to the duty - off by default, as customs duty is not normally taxed.
  • Only apply duty between 1 July 2026 and 1 July 2028 - enforce the statutory validity period of Regulation 2026/382 Article 2.
  • Tariff code (_customs_tariff_code) - for precise classification control.
  • Country of origin - declaration of where the good was manufactured.
  • Outside the 3 EUR duty - checkbox for non-IOSS imported goods that benefit from preferential tariff measures (e.g. free trade agreement with origin country). Flagged items and variations do not add a customs fee.
  • Customs description (_customs_desc) - specific description for customs declarations and carrier manifests (fallback to product title).

Customs paperwork and carrier export (v1.3.0)

Section titled “Customs paperwork and carrier export (v1.3.0)”

Customs 1.3.0 adds built-in export documentation and paperwork to the WooCommerce order screen:

  • Store EORI number - configured under WooCommerce > EU Import Duty (Union Customs Code, Reg. (EU) No 952/2013, Art. 9). The Economic Operators Registration and Identification number is automatically included on customs slips and carrier export manifests.
  • Customs description - set on each product’s Shipping tab (_customs_desc). Allows specifying exact descriptions for declarations (e.g. “Cotton knitted men’s t-shirt”) while keeping marketing titles customer-facing. Falls back to product title if not configured.
  • Printable Commercial Invoice / CN22 slip - available on each order via the “Customs Paperwork” metabox and order list actions. Formatted for A4 and label printing with exporter EORI, consignee details, HS codes, weights in kg, customs values, and statutory declaration text.
  • Carrier CSV export - export customs parcel data as a CSV file for carrier manifests, for single orders or in bulk with the Export Carrier Customs CSV action in the WooCommerce Orders table. Features built-in spreadsheet formula injection defense (CWE-1236).
  • REST API endpoint - GET /wp-json/customs/v1/orders/<id> provides structured JSON customs payloads for 3PL, ERP, and warehouse integrations (permission gated to edit_shop_orders or manage_woocommerce).

Customs PRO is a separate add-on sold through WP Desk. It requires WooCommerce and the free Customs plugin (1.0.17 or later) installed and active, and adds three things the free plugin leaves out:

  • Live EUR exchange rate. The European Central Bank daily reference rates are downloaded once a day by WP-Cron and the rate for your store currency converts the duty, instead of a rate typed by hand. A failed download keeps the last good rate in use; with no ECB rate for your currency, the rate typed in the free plugin is used. The rate, its ECB reference date and the result of the last download are shown under WooCommerce > EU Import Duty, with a button to download it immediately and a switch to turn it off.
  • Bulk tariff codes. A “Tariff code (HS)” field in the products list bulk edit sets the code on every selected product at once, and a “Customs tariff code (HS)” column is added to the WooCommerce product CSV export and import. A code must be 6 to 10 digits, optionally split by dots, spaces or hyphens, and is stored as digits only, so 6109.10.00 and 61091000 count as one tariff line. A bulk edit with an invalid code saves nothing for that field and says so; a CSV row with an invalid code fails with a message in the import log. An empty cell in the CSV removes the code.
  • Duty report. WooCommerce > EU Duty Report lists the orders charged the duty in a chosen month: date, order, status, destination country, tariff lines and amount, 50 per page, with a CSV export of the whole month. Figures are recorded when an order is placed, in the classic checkout and the Checkout block alike, and work with HPOS and post storage. Orders placed before Customs PRO was active are not listed. Draft, pending, failed and cancelled orders are left out.

Deactivating Customs PRO stops the daily rate download. The downloaded rates, the rate switch, the tariff codes and the duty recorded on orders are all kept.

Filter Arguments What it changes
customs/eu_countries array $codes The EU country codes used for the origin and destination checks (27 by default).
customs/eur_rate float $rate Store currency per 1 EUR. A value of 0 or below is ignored.
customs/intrinsic_goods_value float $value, WC_Cart $cart The goods value compared with the threshold, in store currency.
customs/tariff_line_key string $key, WC_Product $product, string $basis The grouping key of one cart item. Items with the same key are one line.
customs/tariff_line_count int $count, WC_Cart $cart, string $basis The computed number of tariff lines for a cart.
customs/duty_amount float $amount, int $lines, string $destination, WC_Cart $cart The final duty in store currency before it is added as a fee.

The amount is an estimate based on your settings. Final duties are determined by customs at import. From 1 November 2026 customs also 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). The plugin does not add that fee. Keep your per-line amount and threshold up to date with current rules.

Why is there no duty line on my test order?

Section titled “Why is there no duty line on my test order?”

Check the conditions in When the duty applies: the feature switch, a store origin outside the EU, an EU shipping or billing country, a goods value at or below the threshold and, with Legal period ticked, an order date inside the period. A cart of only virtual or downloadable products, or of products marked Outside the 3 EUR duty, also gets no line.

Do variations of one product count as several tariff lines?

Section titled “Do variations of one product count as several tariff lines?”

Not on the default settings. Without tariff codes they group by category, or by parent product on the product basis. They count separately only when they carry different tariff codes or different countries of origin.

Yes. Set Store currency per 1 EUR. The plugin converts the cart value to EUR for the threshold check and converts the duty back into your store currency. Customs PRO can fill the rate from the ECB daily rates instead.

Does the plugin add the 2 EUR handling fee?

Section titled “Does the plugin add the 2 EUR handling fee?”

No. It only adds the duty line described above.