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 and DDP enforcement, de minimis thresholds and Incoterm notes.

Updated Module version 1.1.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.
  • Countries enforcing DDP (ISO codes): comma-separated list of destinations for which DDP mode is mandatory. Customers shipping to these countries cannot switch to DAP. Default value: US (in the United States, duties must be borne by the seller). Leave empty to disable global enforcement.
  • 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.
  • Enforce DDP for this country: makes DDP mode mandatory for this destination (the customer cannot choose DAP). Cumulative with the global list of DDP-enforcing countries.

Saved rates appear in a summary table below the form, with a “DDP enforced” column (Yes / No) and the option to delete each row. 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.

Enforcing DDP for specific countries

For some destinations, leaving the choice to the customer is not desirable: this is the case of the United States, where duties must be borne by the seller. The module lets you enforce DDP mode at two levels:

  • Globally, via the “Countries enforcing DDP (ISO codes)” field in the general configuration (default US).
  • Per country, via the “Enforce DDP for this country” option in the per-country rate form. The “DDP enforced” column in the summary table then shows “Yes”.

A country is considered to enforce DDP if it appears in the global list or if its country rate carries the corresponding flag. For these destinations, the checkout block only shows a message stating that duties must be settled with the order: the DAP option is removed and DDP mode is applied automatically, even if the customer had previously selected DAP.

If you enforce DDP for a country without assigning it a rate schedule (global rate at 0% and no dedicated rate), the order is recorded as DDP but no fee is charged. In that case, the module shows no customs note (PDF invoice, customer detail, back-office block) so as not to tell the customer they paid duties they were never charged. Be sure to set a rate or a fixed fee for every country where you enforce DDP.

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). For a country that enforces DDP, only DDP mode is offered.

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).

When an order is in DDP but with no fee charged (amount at 0 — for example DDP enforced for a country with no configured rate), none of these notes appear: no back-office badge, no customer block, no invoice note.

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 — except for a country that enforces DDP, where an informational message is shown even without an amount.

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