Reviewed June 2026, VAT thresholds and the OSS regime described here reflect the current EU rules; treat tax specifics as a starting point and confirm with an accountant for your own situation.

Selling across Europe from one PrestaShop install is mostly a configuration problem, three of them, actually: the language a customer reads, the currency they pay in, and the tax you're legally required to charge them. The first two are forgiving; get them wrong and you lose a sale. The third is not: get VAT wrong and you can owe back-tax to a tax authority in a country you've never visited. This guide ties the three together and goes deep on the one that scares merchants most, EU VAT, because the languages and currencies each have a dedicated guide of their own, linked below, and there's no point repeating them here.

If you want the full walkthrough of either of the other two pillars, start there and come back: multi-language store setup covers translating products, slugs and CMS pages properly, and multi-currency and international selling covers exchange rates, rounding and per-currency pricing. This page is the map that sits above both, with tax as its centre of gravity.

The three dials, and which one is unforgiving

A parcel on a map of Europe with location pins and connecting delivery routes, representing cross-border selling
Selling across Europe means tuning three dials at once: languages, currencies and tax.

It helps to be honest about the stakes before you touch a setting, because they are wildly different. Language and currency are conversion levers. Annoy a customer and they leave. Tax is a compliance obligation. Annoy a tax authority and you get an assessment. Here's the split that should drive how much care each one gets:

DialWhat it really isCost of getting it wrongWhere it lives in PrestaShop
LanguageConversion leverLost sale; damaged trust from a bad machine translationInternational → Localization → Languages
CurrencyConversion leverLost sale; cart abandonment from an "awkward" converted priceInternational → Localization → Currencies
Tax (VAT)Legal obligationBack-tax assessment, penalties, blocked OSS returnInternational → Taxes and Tax Rules

So what does that mean for how you spend your time? Most merchants over-invest in flag pickers and under-invest in tax rules. Reverse it. A customer forgives a euro price in Poland far more readily than the Polish tax office forgives a wrong VAT return. Spend an afternoon on the front-end polish, covered in currency selector and language flags, and spend a serious day on what follows.

How PrestaShop actually charges VAT

PrestaShop never stores "the VAT rate." It stores tax rules groups, and each product is assigned one. A tax rules group is a lookup table: for a given delivery country (and optionally state/region), it returns the tax rate to apply. The chain runs Tax (a single named rate, e.g. "DE Standard 19%") → Tax Rule (the country→rate mapping) → Tax Rules Group (the bundle of rules you assign to a product). Internally these are the Tax, TaxRule and TaxRulesGroup classes; the calculation at checkout flows through PrestaShop's TaxCalculator against the customer's delivery Address.

The practical consequence: VAT is decided by where the parcel is going, not where your store is hosted. That's exactly what EU distance-selling law requires for B2C above the threshold, so PrestaShop's model and the law line up, as long as your tax rules group actually contains a rule for every country you ship to.

Building a pan-EU tax rules group, step by step

  • Go to International → Taxes and confirm a Tax exists for each rate you'll need (PrestaShop's localization packs install most EU standard rates for you when you import a country pack, verify rather than assume).
  • Go to International → Taxes → Tax Rules and create or edit a group such as "EU OSS. Standard rate." Add one rule per destination country, each pointing at that country's standard rate. [SCREENSHOT: International → Taxes → Tax Rules, a tax rules group open with several country rules listed (DE 19%, FR 20%, etc.), one row per destination country]
  • Assign that group to your products. Per product it's on the Pricing tab as the Tax rule dropdown; for bulk changes use catalog mass-edit rather than touching products one by one.
  • Set the tax address basis under International → Taxes, in Tax options (the "Based on" option, PS_TAX_ADDRESS_TYPE): whether to base tax on the delivery address or the invoice address. For EU distance selling you want the delivery address.

One trap that catches people: shipping is taxable too, and at a rate tied to the carrier, not the product. If your carriers have no tax rule, you'll under-charge VAT on delivery and your OSS numbers won't reconcile. Set the carrier tax under each carrier's configuration in Shipping → Carriers.

Reduced rates and product-category quirks

The reason you can't get away with a single 27-country group for everything is that EU VAT isn't one rate per country, it's a standard rate plus reduced rates that apply to specific goods, and the categories differ by country. Books, food, children's items, e-books and some health products frequently sit at a reduced rate, and a product that's standard-rated in one member state can be reduced-rated in another.

In PrestaShop the clean way to handle this is one tax rules group per rate-class, not per country. So you might run:

  • EU Standard, your default group, standard rate per destination country.
  • EU Reduced (books/printed), reduced rate per country for products that qualify everywhere they're sold.
  • EU Reduced (food). A separate group, because the qualifying-country list is different.

Then you assign the right group to each product category. The point of separating them is auditability: when a rate changes, and EU reduced rates change more often than standard ones, you edit one group, not hunt through products. The benefit in plain terms: a rate change becomes a five-minute edit instead of a catalog-wide risk.

The €10,000 threshold and One-Stop Shop, decoded

This is the rule that turns "I sell to a few EU countries" into a tax-registration question. Up to €10,000 in total cross-border B2C sales across the EU per year, you may charge your home country's VAT rate on all of it. The moment your combined cross-border B2C sales pass that threshold in a year, you must charge the destination country's rate on cross-border B2C sales, for every EU country, from that point.

Without OSS, "charge destination VAT everywhere" would mean a separate VAT registration in every country you sell to. One-Stop Shop (OSS) is the relief: you register once, through your home country's tax authority, and file a single quarterly return covering all your EU cross-border B2C VAT. You still charge each country's correct rate (that's what your destination-based tax rules group does), OSS just consolidates the reporting into one return instead of 26.

SituationVAT rate you charge B2CWhat you file
Under €10k cross-border/yearYour home country's rateYour normal domestic VAT return
Over €10k, OSS registeredDestination country's rateOne quarterly OSS return + your domestic return
Over €10k, not OSS registeredDestination country's rateA separate VAT registration & return in each country (avoid this)

The PrestaShop side of crossing the threshold is exactly the destination-based tax rules group described above, so the right time to build it is before you cross €10k, not the week after, when you'd otherwise be retroactively under-collecting. Note this is the EU intra-community regime; the UK, Switzerland and Norway sit outside it with their own rules, which is why those markets often get their own carrier zones and tax handling.

B2B sales: the reverse-charge exemption

Cross-border sales to a business customer with a valid EU VAT number work differently again: under the reverse-charge mechanism, you don't charge VAT, the buyer accounts for it in their own country. To apply it correctly you must (a) verify the customer's VAT number is genuinely valid against the EU VIES database, and (b) show that customer net (tax-excluded) prices at checkout.

PrestaShop has partial native support, there's a B2B mode you enable under Shop Parameters → Customer Settings and a VAT-number field on the address, but the core does not validate the number against VIES in real time, and it won't automatically zero the tax for a verified EU business. That gap is where a wrong number costs you: accept an invalid VAT number, zero the tax, and you're the one liable for the uncollected VAT. Our Automatic EU VAT Checker closes it. It validates the number against VIES live at checkout, and a verified EU business is shown net prices and charged zero VAT automatically, with no manual look-up on your side. The benefit: legitimate B2B buyers convert without a tax surprise, and you're not personally exposed to a number that turns out to be fake.

Where languages and currencies plug in (without repeating their guides)

Tax is the spine, but a European sale still has to read right and price right. Rather than re-cover ground, here's how the three connect and where the detail lives:

  • Language → tax wording. Your invoice, your "VAT included/excluded" labels and your tax-exempt notices all need translating alongside products. The mechanics of adding languages, translating slugs and CMS pages are in multi-language store setup.
  • Currency → tax display. A destination-VAT price still has to render cleanly in the local currency, €9.99 shouldn't surface as PLN 44.73. Rounding rules, ECB auto-updates and per-currency pricing are in multi-currency and international selling.
  • The switcher itself. Letting visitors pick their language and currency from any page is a small UX detail with outsized retention impact, covered in currency selector and language flags.
  • Telling Google which version to serve. Multiple language URLs need hreflang or Google serves the wrong one, that's its own job, walked through in hreflang tags.
  • Separate sites, not just languages. If a market needs its own domain, catalogue or legal identity rather than just a translation, that's multistore territory, see PrestaShop multistore.

Shipping zones and local payment, briefly

Two more things vary by country and feed back into tax and conversion. Shipping is best handled as 2–4 carrier zones grouped by cost and transit time (Germany→Austria is a 1–2 day, ~€5 lane; Germany→Portugal is 5–7 days and several times the cost) with different free-shipping thresholds per zone, and remember each carrier needs its own tax rule, as noted above, or your VAT reconciliation drifts.

Payment preferences are sharply local: iDEAL is effectively mandatory in the Netherlands, BLIK and Przelewy24 in Poland, Bancontact in Belgium, and bank transfer plus Klarna carry real weight in Germany. The pragmatic minimum for pan-EU selling is a card processor that covers the major networks, PayPal, and one or two local methods for your largest non-domestic markets. We'd be overstating things to attach a single conversion-uplift number to "add a local method". The honest claim is narrower: in markets where a local method dominates, its absence is a hard blocker, not a soft one.

A launch order that won't bite you later

Don't open 27 countries on day one. Sequence it so the unforgiving dial is set before money moves:

  • Pick 1–2 neighbouring markets first, cheapest shipping, closest expectations, easiest support.
  • Build the destination-based tax rules group before you cross €10k, and register for OSS at (or just before) the threshold, never retroactively.
  • Translate fully, not halfway, a half-translated checkout reads as less trustworthy than an English one.
  • Add local currency with clean rounding, and the local payment method that market expects.
  • Place one real test order from each target country, confirm the VAT line, the carrier tax, the currency rounding and the payment method all behave before a real customer does it for you.

Frequently asked questions

Where in PrestaShop do I tell it to charge VAT by the customer's country?

Two places work together. The tax rules group on each product (International → Taxes → Tax Rules) holds one rule per destination country, each pointing at that country's rate. Then under International → Taxes → Tax options you set the "Based on" option (PS_TAX_ADDRESS_TYPE) to the delivery address, which is what EU distance selling requires. With both set, checkout's TaxCalculator picks the rate from where the parcel is going.

What is the €10,000 threshold, exactly?

Up to €10,000 in total cross-border B2C sales across the EU per year, you may charge your home country's VAT rate on all of it. Once your combined cross-border B2C sales pass that figure in a year, you must charge each destination country's rate from that point. Build the destination-based tax rules group before you cross it, not the week after, and confirm your own position with an accountant, since this is a legal obligation, not a setting.

Do I need a VAT registration in every country I sell to?

Not if you use One-Stop Shop (OSS). OSS lets you register once through your home country's tax authority and file a single quarterly return covering all your EU cross-border B2C VAT. You still charge each country's correct rate, your destination-based tax rules group does that, OSS just consolidates the reporting. Without OSS, charging destination VAT everywhere would mean a separate registration in each country. This is general information, not tax advice; verify registration timing with a professional.

How do I handle B2B sales to a verified EU business?

Cross-border B2B with a valid EU VAT number uses the reverse-charge mechanism: you don't charge VAT, the buyer accounts for it. To apply it correctly you must verify the number against the EU VIES database and show that customer net prices. PrestaShop has a B2B mode and a VAT-number field, but core doesn't validate against VIES live or auto-zero the tax, accept an invalid number and you're liable for the uncollected VAT. Our Automatic EU VAT Checker validates the number against VIES at checkout and shows verified businesses net prices automatically.

Is shipping taxable too?

Yes, and at a rate tied to the carrier, not the product. Set the tax rule on each carrier under Shipping → Carriers. Carriers with no tax rule under-charge VAT on delivery, and your OSS numbers won't reconcile.

The EU single market is genuinely one of the largest expansion opportunities a PrestaShop store has, and the platform is built to handle the complexity, multiple languages, multi-currency, and a tax engine that charges by destination address out of the box. The work that actually protects you isn't the flag picker; it's the tax rules group behind it. Get that right, lean on the sibling guides for the language and currency detail, and "selling across Europe" becomes a configuration you can trust rather than a liability you're hoping holds.

Share this post:
David Miller

David Miller

Founder, mypresta.rocks

David Miller is a PrestaShop specialist with over a decade of hands-on experience and the founder of mypresta.rocks, a software studio in Tychy, Poland. He builds and maintains a catalogue of 152 PrestaShop modules, including 21 "Revolution" suites spanning SEO, checkout, security, performance, marketing, search, support, and warehouse operations, that improve real stores every day, all tested against PrestaShop 1.7.8, 8.x, and 9.x. He also acts as caretaker for production stores turning over millions in annual sales, so his work is judged on live revenue, not demos. His experience runs the full breadth of ecommerce, performance, security, SEO, and marketing, and reaches beyond PrestaShop to WooCommerce, Shopify, and custom-built systems. On the blog he writes about the code-aware side of PrestaShop: what the platform really does under the hood, what breaks in production, and which fixes hold up.

Comments

No comments yet. Be the first!
Enjoyed this article?

Get our latest tips, guides and module updates delivered to your inbox.

You may unsubscribe at any moment. For that purpose, please find our contact info in the legal notice.

Loading...
Back to top