PS PrestaShop Intermediate

Customs Duty DDP / DAP — Complete Guide

Install, configure and run the DDP / DAP choice at checkout for European stores shipping outside the EU: fee calculation, per-country rates, de minimis thresholds and Incoterm notes.

Updated Module version 1.0.2

Overview and requirements

The Customs Duty DDP / DAP module is built for stores established in the European Union that ship to destinations outside the EU. As soon as the delivery address leaves the EU customs territory, a choice block appears in the carrier step of the checkout: the customer decides to pay customs duties and import taxes immediately with their order (DDP) or upon delivery to the carrier (DAP).

  • Compatible with PrestaShop 8.0 to 9.x, the Classic theme and derived themes.
  • PHP 7.4 to 8.3.
  • Multistore and multi-currency: fees are calculated in the cart currency.
  • Multilingual (FR/EN/ES/DE/IT, plus PT provided).
  • No file overrides: native hooks only.

The module does not compute the real duties with customs authorities: it applies your rate schedule (percentage rate, fixed fees, thresholds) to produce a reliable estimate shown to the customer. In DDP mode, that amount is charged on the store; you must then ship using a DDP service with your carrier.

Installation

Install the module like any PrestaShop module:

  1. Download the dfcustomsduty.zip archive from your customer account.
  2. In the back office, go to Modules > Module Manager.
  3. Click Upload a module and drop the archive.
  4. Once installed, click Configure.

On installation, the module registers its hooks, creates its tables (per-cart choice tracking, per-order persistence, per-country rates) and automatically creates a hidden virtual product “Customs duties and import taxes (DDP)”, tax-free and orderable out of stock. This product never appears in the catalog: it only serves as a billing carrier when the customer chooses DDP mode.

The default rate is 0% after installation. Until it is configured (global rate or per-country rate), no fee is calculated and the choice block does not appear. This is intentional, to avoid charging your customers an arbitrary rate.

General configuration

The configuration page gathers the rate-schedule and display settings:

  • Enable the module: global switch.
  • Preselected mode at checkout: DDP (recommended) or DAP. This is the option checked by default until the customer makes a choice.
  • Default rate (%): percentage applied to the order value to estimate duties + import VAT. Overridden case by case by per-country rates.
  • Fixed handling fee: fixed amount added to the calculation, in the store default currency, tax excluded.
  • Duty-free threshold (de minimis): below this order value, no fee is applied. 0 = no threshold.
  • Include shipping costs in the calculation base: the customs value (CIF) generally includes transport.
  • Show a notice in the cart: informs the customer upfront that a non-EU delivery will incur fees.
  • EU customs territory countries (ISO codes): comma-separated list. Any delivery to a country not in this list is treated as outside the EU.

By default, the EU list contains the 27 member states plus Monaco (in a customs union with France). You can adjust it freely, for example to handle certain special-tax territories separately.

Calculation base and formula

The estimated fees are calculated as follows, in the cart currency and tax-free:

base = products total excl. tax (excluding the fee product)
       + shipping excl. tax   (if the option is enabled)

fee = base × country_rate(%) + fixed_fee

The duty-free threshold is evaluated first: if the base is below the applicable threshold (the country threshold if defined, otherwise the global threshold), no fee is charged. Fixed fees and thresholds, stored in the store default currency, are automatically converted into the cart currency.

Per-destination country rates

Below the general settings, the “Add / edit a country rate” form lets you fine-tune the schedule destination by destination:

  • Destination country: selected from the store’s country list.
  • Rate (%): replaces the global rate for this country.
  • Fixed fee: handling fee specific to this country.
  • Duty-free threshold: specific de minimis threshold. Leave 0 to use the global threshold.

Saved rates appear in a summary table below the form, where each row can be deleted. A country without a dedicated rate automatically uses the global values.

Common example: for the United States, enter a duty-free threshold of 800 to reflect the 800 USD de minimis. For Switzerland or the United Kingdom, set the rate and threshold matching their import rules.

Customer experience at checkout

When the delivery is outside the EU and a schedule applies, the customer sees two options in the carrier step:

DDP mode — pay now

The fee product is added to the cart with a dynamically calculated price. The amount integrates into the order totals, appears on the invoice and native emails, and the customer has nothing left to pay when the parcel arrives. It is the closest experience to a domestic purchase.

DAP mode — pay upon delivery

No fee is added to the order, but a clear estimate is displayed and the customer is warned that the carrier will charge them duties, taxes and any handling fees before handing over the parcel. The note then appears on their order and invoice.

Switching options is instant: the cart and totals are recalculated via AJAX, and the checkout progress is preserved (the customer stays at the carrier step).

Order and invoice tracking

When the order is validated, the chosen mode, amount and destination country are recorded. This information is then visible:

  • in the customer order detail, with a clear reminder of what has been paid or remains due;
  • on the back-office order page, via a DDP or DAP badge showing the amount and destination;
  • on the PDF invoice, with the matching Incoterm note (DDP: duties paid at order time; DAP: duties payable by the recipient).

Translations

All visible labels (checkout block, cart notice, order detail, back office, invoice notes) are translated. The module ships with translation files for French, English, Spanish, German, Italian and Portuguese. You can also adjust any text from Advanced Parameters > Translations > Module translations in the back office.

FAQ and troubleshooting

The choice block does not appear

Check three things: the module is enabled, the delivery address is indeed outside the configured EU customs territory, and a schedule produces an amount greater than zero (global or country rate set, base above the duty-free threshold). As long as the rate stays at 0% with no fixed fees, no block appears.

The amount looks incorrect in multi-currency

Fixed fees and thresholds are entered in the store default currency, then converted into the cart currency using your exchange rates. Make sure your currency conversion rates are up to date.

Does the “Customs fee” product appear in my catalog?

No. It is created with “nowhere” visibility and is only used as an internal billing carrier in DDP mode. Do not delete it manually: uninstalling handles it cleanly.

Do I need to ship differently under DDP?

Yes. Under DDP, you have collected the duties from the customer: you must therefore choose a DDP shipping service with your carrier or forwarder, who will re-invoice you for the duties actually paid. The module handles collection and information, not the customs declaration itself.

What happens on uninstall?

Uninstalling removes the hooks, configuration variables, module tables and the virtual fee product. No residual data is left in the database.

Was this page helpful?

Still stuck? Contact support