VAT Number and EU VIES Validation for WooCommerce Documentation and FAQ

VAT Number and EU VIES Validation for WooCommerce, by Naked Cat Plugins, adds a VAT number field to your WooCommerce checkout, validates it against the European Commission’s VIES service, and removes VAT from qualifying B2B orders inside the EU. This page covers how it decides, what it stores, and how to configure it.

Table of Contents

Support

How to request technical support?

If the issue you need technical support with is not covered on this page, click the link next to the license key, on the plugin settings, and fill out the ticket with your request.

Where do I report security vulnerabilities found in this plugin?

You can report any security bugs found in the source code of this plugin through the Patchstack Vulnerability Disclosure Program.

The Patchstack team will assist you with verification, CVE assignment and take care of notifying us.

Getting started

What does this plugin actually do?

Three things, in order:

  1. Collects a VAT number at the checkout, on both the classic and the Blocks checkout, and in My Account.
  2. Validates it: the format for its country, then the check digit where we have a verified algorithm, then the European Commission’s VIES service.
  3. Decides whether the order qualifies for the intra-Community B2B exemption, and if it does, removes the VAT.

It records why, on every order, so you can reconstruct the decision later.

What does it not do?

It decides who is exempt. It does not decide what rate to charge. When it exempts a customer, WooCommerce charges them no tax. When it does not, your normal WooCommerce tax rates apply, whatever those are. Entering and maintaining those rates is your responsibility: use WooCommerce Tax, or enter them by hand under WooCommerce > Settings > Tax.

It never removes VAT for a customer outside the EU. If a non-EU customer is charged nothing, that is because you have set a zero rate for their country, not because of this plugin.

Where are the settings?

WooCommerce > Settings > Tax > VAT Number and VIES.

Getting started guide

The settings screen is WooCommerce > Settings > Tax > VAT Number and VIES, and this walks down it in order.

Before you start: your tax rates

This plugin decides who is exempt. It does not create tax rates. So two things need to be right before any of it means anything:

  • Your shop’s country, under WooCommerce > Settings > General. That is the country the exemption is judged against, so a wrong one makes every decision wrong.
  • Taxes enabled, and rates entered under WooCommerce > Settings > Tax, for the countries you sell to.

Note: if a customer does not qualify for the exemption, those rates are what they pay. If you have no rates entered, they pay nothing, and that is not this plugin’s doing.

Licence

Install the plugin and insert the provided license code. The rest of the settings appear disabled until the license is active.

Your responsibility

Straight after the licence there is one checkbox to accept, and until you do the plugin does nothing at all: no field on the checkout, no validation, and no VAT removed. The rest of the settings do not appear either.

It is there because of what this plugin does. It applies rules and keeps evidence, it does not give legal, tax or accounting advice, it cannot know your circumstances, and it can be wrong. What your shop charges, what it exempts and what you declare stay yours to answer for, with your accountant.

The moment you accept is recorded, with the version whose wording you saw.

The readiness check

Once the licence is active, the top of the screen lists eight checks. Green means there is nothing to do, amber means it works but probably not the way you intended, and red means no order can be exempted until you fix it.

  • WooCommerce version. Green on WooCommerce 9.0 or newer. Update WooCommerce.
  • Taxes are enabled. Green when tax calculation is on, under WooCommerce > Settings > General. With it off there is no VAT on the order to remove.
  • Tax follows the address that decides. Green when WooCommerce charges tax from the same address this plugin judges on, the shipping one. Set Calculate tax based on to the customer shipping address under WooCommerce > Settings > Tax. Amber if you sell only virtual products, where the two are the same address anyway.
  • The shop is in the EU VAT area. Green when your shop country is an EU member state, under WooCommerce > Settings > General, and your shop address is not in a part of one that sits outside the EU VAT area. There is no intra-EU exemption to apply from outside the EU, and none to apply from any of the territories listed further down either. If your shop is in one of those, this stays red and no order is ever exempted, which is correct: see the question about it below.
  • VIES validation is on. Green when VIES validation below is not set to “Do not validate”. With it off nothing is ever confirmed, and a confirmation is required before VAT comes off.
  • Your own VAT number is confirmed. Green when your shop VAT country and number are filled in below and VIES confirmed them. Save them again to re-check.
  • The field reaches the checkout. Always green on a classic checkout. On a Blocks checkout, green when the VAT number block is on the page set as your checkout under WooCommerce > Settings > Advanced. Add it in the block editor if it is missing, or nobody is ever asked for a number.
  • No other VAT plugin is active. Green when this is the only one running. Deactivate the others: each asks the customer separately and the last one to run decides.

Your own VAT number

Fill in your shop’s VAT country and VAT number.

Do this even though the plugin works without it. It is what makes the European Commission return a consultation number with each check, the timestamped proof that you checked, which is the difference between validating a number and being able to show later that you did.

The number is checked against VIES the moment you save it and the result appears underneath, so a typo tells you straight away. A number VIES cannot read is refused rather than saved, because it would break every check your shop makes.

The VAT number field

Choose whether the field is asked for Optionally, Always, Always, and registered in VIES, or Never, and which customers see it. Optionally, shown to EU countries only, suits most shops and is the default.

Note: “Always, and registered in VIES” is stricter than it sounds. It turns away real businesses that never enrolled for intra-EU trade, and every private customer using their own tax number. Only pick it if you genuinely sell to nobody else.

If you are switching from another VAT plugin, deactivate that plugin now. Do not run two. Your existing numbers are read automatically, so nothing is lost by deactivating it and nothing needs importing. See “Which plugins can it read numbers from?” below for the list, and “Should I run this alongside my old VAT plugin?” for why running both is a bad idea.

Validation

Leave check digit validation on: it catches most typos instantly, without waiting for a network round trip.

Leave VIES validation on as well. With it off the plugin never removes VAT at all, whatever conditions you set for removing VAT, because a VAT number confirmed in VIES is a substantive condition of the exemption and not a formality.

The setting for what happens if VIES is unreachable is best left on “accept the number but do not remove VAT”. Refusing orders during an outage at the European Commission turns their downtime into your lost sales.

VAT removal

Pick your conditions for removing VAT. Recommended is the sensible default and is deliberately stricter than the VAT Directive’s literal minimum, so a triangulation case is not silently zero-rated.

Read the note above it about the shipping address deciding, not the billing address, and check that matches how you actually ship.

Cache

The default of one day is fine. It affects checkout speed only: the number is always re-checked live when the order is placed.

Finally: place a test order

The step people skip, and the only one that proves the setup works.

Add something to the cart and check out with a VAT number from an EU country other than your own, shipped to that same country. A real number from a customer or a supplier invoice works best. You should see the VAT come off the total and a line saying so.

Then open that order in the admin. The VAT number panel shows what was checked, when, what VIES answered, whether VAT was removed and why. If that panel reads correctly, you are set up.

Note: the exemption does not apply if you have not submitted a correct recapitulative statement, the European Community Sales List, for the supply. WooCommerce > EC Sales List builds it for you from the orders you exempted, and filing it is still yours to do. See “Where do I find the European Community Sales List?” below.

Every quarter: the European Community Sales List

Setup is done. The recurring part is the recapitulative statement, the European Community Sales List, at WooCommerce > EC Sales List. It opens on last quarter, the one you are usually filing.

The first table is what you file, one line per customer VAT number. The second is the proof behind it, including the consultation number VIES issued for each check. Both export to CSV. See “Where do I find the European Community Sales List?” below for what is counted and why an order might be missing.

The VAT number field

Where does the field appear?

On the classic checkout it is added to the billing section. On the Blocks checkout it is a block, added to your checkout page automatically the first time the plugin runs, positioned after the billing address. You can move it in the block editor like any other block.

If you remove it, it stays removed. The plugin places it once and never puts it back.

Can I give the field a heading and a line of explanation?

Yes. Select the block in the checkout editor and type over the heading, and add the optional line of text underneath it if you want one. Both behave like the headings WooCommerce’s own checkout sections have, and they sit with the same spacing.

The heading starts out following the field label you set in the settings, including its translations, and keeps following it for as long as you leave it alone. Type your own and the block keeps yours from then on. The line of text underneath is empty unless you write something.

Can I make the field required?

Yes, under “Ask for a VAT number”:

  • Optionally suits most shops, since it serves business and consumer customers alike.
  • Always suits a shop that sells only to businesses. An order cannot be placed without a number.
  • Always, and registered in VIES is stricter than it sounds. VIES lists only those registered for intra-EU trade, so a real company with a perfectly valid national VAT number is turned away if it never enrolled, and so is any private customer using their own tax number. Sole traders and smaller businesses often have not enrolled either. Choose it only if you genuinely sell to nobody else.
  • Never hides the field and stops all validation and VAT removal.

Do customers have to type the country prefix?

No. The field accepts a number with or without its prefix. Without one, the number is read against the customer’s billing country.

By default the prefix is added when the number is stored, so 123456789 entered by a Portuguese customer is stored as PT123456789. You can turn that off, though we recommend against it.

The prefix is what makes a stored number self-describing. With it, the number says which country issued it wherever it ends up. Without it, 123456789 is just nine digits, and anything reading it later, an invoice, an accounting export, another plugin, has to guess the country from the billing address. That guess is wrong for any customer whose VAT number was issued somewhere other than where they are billed. This plugin itself is unaffected either way, because it records the country in a field of its own, so the cost falls entirely on whatever you send the number to next.

Which customers see the field?

Set by “Show the field to customers billing in”: EU countries only, EU plus the UK and Switzerland, or every country. EU only is the usual choice, since VAT removal applies only within the EU. The wider options are for shops that want the number on file for invoicing.

Can I require a company name with it?

Yes. When switched on, a customer who enters a VAT number must also fill in the billing company field. It applies to both checkouts.

Validation

What is checked, and in what order?

Cheapest first, and nothing further is tried once something fails:

  1. The field is not empty.
  2. Your licence is active.
  3. The country is one we recognise.
  4. The number matches that country’s format.
  5. The check digit is correct, where we have a verified algorithm for that country.
  6. VIES, if it is switched on and your shop is in the EU.

VIES is never called speculatively. A number that fails any earlier step never reaches it.

This plugin was built for performance, and this is where most of it comes from. VIES is a public service on the other side of the internet, and a call to it is slower than everything else the checkout does put together. The format and check-digit tests are pure arithmetic and cost nothing measurable, so the great majority of wrong numbers are caught and answered instantly, without your customer waiting on a network round trip. Being lighter on a free public service is a welcome side effect, not the reason.

Which countries get check-digit validation?

The check digit is verified for 26 countries: Austria, Belgium, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden, United Kingdom.

Format only, no check digit: Bulgaria, Latvia, Northern Ireland, Norway, Switzerland. Numbers from these countries are checked for their expected shape and then sent to VIES. They are never rejected before that.

We only implement an algorithm where it is documented and verifiable. Guessing would reject real customers.

What does “not registered in VIES” mean?

It means that business is not listed in the EU system for checking VAT numbers used for trade between EU countries. It does not mean the number is invalid. VIES lists only those registered for intra-EU trade, so a perfectly valid national VAT number is simply absent from it if its holder never enrolled. That includes private individuals, who in several countries have a VAT or tax number of their own and are never listed.

The practical consequence is that VAT is not removed. The order goes through as normal.

What happens if VIES is unavailable?

VIES goes down. It is a free public service and outages are ordinary.

  • If we hold a recent stored result for that number, it is used, and the order records that it came from a stored answer rather than a live one.
  • If we do not, the setting “If VIES is unreachable” decides: accept the number but do not remove VAT (the default), or refuse the order. Refusing is marked not recommended, because an outage at the European Commission becomes lost sales for you.

An outage is never recorded as an invalid number. Those are different facts and the plugin keeps them apart everywhere.

Why should I enter my own VAT number?

Because it is the difference between checking a number and being able to prove you checked it.

VIES returns a consultation number only when the query identifies the shop making it. That consultation number is the recognised proof that the check took place, at that moment, for that number. Without your own VAT number in the settings, validation still works and VAT is still removed, but no proof is produced.

Your number is sent on exactly one check per order, the one recorded against it. The checks that happen while a customer is still editing the checkout deliberately go without it: they return the same answer, and asking for a formal consultation number every time somebody pauses typing would mint legal records nobody will ever read.

The plugin checks your number against VIES when you save it, and tells you what it found.

It refuses to save a number VIES cannot read, one with the wrong shape or a failed check digit, and keeps whatever you had before. That is deliberate: VIES rejects the whole query when it cannot parse who is asking, so a typo here would quietly stop validation working for every customer on your site, not just for one.

A number that is simply not listed in VIES is saved normally. It costs you nothing: your checks still run and still receive a consultation number.

Removing VAT

When is VAT removed?

Every level requires all of this: your shop is in the EU, the goods go to a different EU country, the VAT number was confirmed by VIES, and the number was issued by a country other than your own.

That last condition is the law, not a preference. A customer registered in your own country is a domestic sale even when the goods travel abroad.

On top of that, the “Conditions for removing VAT” setting adds:

  • Directive minimum: nothing further. This is what the VAT Directive literally requires. It allows a customer registered in one EU country to buy from you and have the order shipped to a different one, which is legal on the face of the text but is a triangulation case you may not want handled automatically.
  • Recommended: the VAT number must also have been issued by the country you are shipping to. Stricter than the Directive, and it blocks the triangulation case above rather than silently zero-rating it.
  • Strictest: the billing address country must match the VAT number as well.

What about the Canary Islands, Åland, Livigno and other territories outside the EU VAT area?

Some parts of EU member states sit outside the EU VAT area. They are in the country, and the country is in the EU, but a sale going there is an export, not an intra-Community supply, whatever VAT number the customer holds and however cleanly VIES confirms it.

So the plugin does not exempt those sales, records why on the order, and keeps them off your European Community Sales List, where an export does not belong.

It does not zero rate them either. Zero rating an export depends on evidence that the goods left the customs territory, which this plugin cannot see, and the rate is your tax table’s business. If you sell to any of these territories, set a 0% rate for them under WooCommerce > Settings > Tax. Until you do, those orders are charged your ordinary domestic rate.

Which territories are recognised

Territory Country Province Postcodes
Canary Islands Spain Las Palmas, Santa Cruz de Tenerife 35, 38
Ceuta Spain Ceuta 51
Melilla Spain Melilla 52
Åland Islands Finland none exists 22000 to 22999
Heligoland Germany none exists 27498
Büsingen am Hochrhein Germany none exists 78266
Livigno Italy too coarse to use 23041
Campione d’Italia Italy too coarse to use 22061
Mount Athos Greece none exists 63086

For the Spanish territories, either signal on its own is enough and the two are not required to agree. An address can arrive through an import or an API with only one of them filled in, a shop can hide the province field, and a customer can pick the wrong province from a list. When they disagree the likeliest explanation is incomplete data, and treating an export as an intra-Community supply is the more expensive of the two mistakes.

Finland and Germany have no province field for WooCommerce to fill in, and Italy’s is the province, which is far larger than the two comuni concerned, so for Åland, Heligoland, Büsingen, Livigno and Campione the postcode is the only signal. That is a real limitation rather than an oversight: if your checkout does not collect a postcode, or a customer leaves it out, those addresses are not recognised and are treated as ordinary mainland Finland or Germany. Nothing can be inferred from the country alone without misclassifying every mainland order along with it. If you sell to those territories, keep the postcode field required.

For Livigno and Campione d’Italia the postcodes above are the ones in use since 18 June 2018. Both towns had different codes before that, and those old codes now belong to ordinary, fully taxed Italian addresses, so the plugin deliberately does not recognise them. Recognising them would zero rate somebody else’s normal order.

A few setups offer Åland as a country of its own, AX, rather than Finland plus a postcode. That works too, by a different route: AX is not an EU VAT country at all, so the sale is refused as a destination outside the EU rather than as a territory. The outcome and the paperwork are the same.

What does not change

Nothing else about the field. It is still shown, still required if you made it required, and the number is still checked against VIES, because a customer there holds an ordinary VAT number of their country and you may still want it on the invoice and on your export paperwork. Only the exemption is refused.

The order’s VAT number panel says so in words and names the territory, so an order placed today can still be explained years from now.

The French overseas departments (Guadeloupe, Martinique, Réunion, Mayotte, French Guiana) need no rule of their own: WooCommerce gives each of them its own country, and none of those is an EU VAT country, so a sale there is already refused as a destination outside the EU. The same is true of the other overseas collectivities.

Monaco goes the other way and is worth knowing about: it is not an EU member state, but VAT law treats trade with it as trade with France, and its businesses hold French VAT numbers. So a sale to Monaco is an ordinary intra-Community supply and the plugin exempts it like any other French one.

The Italian waters of Lake Lugano are excluded too and have no postcode of their own, so no address-based rule can find them. They are tracked, and each one is a small addition rather than a change to how the decision is made.

My shop is in one of those territories. Why is VAT never removed from any order?

Because it cannot be, on any order, ever.

A shop established in any of the territories listed above is itself outside the EU VAT area. It does not make intra-Community supplies at all, so there is no order it could apply the exemption to: not to a VAT registered business in another member state, not with a VIES confirmed number, not on any settings combination. There is no setting that changes this, because there is no situation in which the exemption applies.

This is the plugin working, not failing. Everything except the exemption carries on:

  • The VAT number field appears at your checkout as normal.
  • The check digit validation runs.
  • The number is confirmed against VIES.
  • It is stored on the order and on the customer’s account, for your invoicing and your export paperwork.
  • Your European Community Sales List stays empty, which is correct: it lists intra-Community supplies, and you make none.

In effect the plugin becomes a VAT number field with VIES validation, and decides nothing about tax. For a shop in one of these territories, that is the right answer rather than a reduced one.

The readiness check on the settings screen says so and names the territory, so you can see at a glance that it is deliberate. It is shown in red, because the shop genuinely cannot do the thing the exemption exists to do, and every order records the same reason in words in its VAT number panel.

What about Northern Ireland?

We remove VAT from goods you sell to Northern Ireland. We do not remove it from anything else.

Northern Ireland is a special case. Since the Windsor Framework it has stayed inside the EU VAT rules for goods, while the rest of the United Kingdom has not. Businesses there have VAT numbers that start with XI.

We remove the VAT only when all three of these are true:

  • The customer’s VAT number starts with XI, and VIES confirms it.
  • The delivery address is in Northern Ireland, which means a postcode starting with BT.
  • The order contains physical products and nothing else.

If the first two match but there is a download, a subscription or anything else marked virtual in the basket, we charge VAT on the whole order and say so on the order itself. We would rather charge VAT you can claim back than remove VAT you turn out to owe.

Why we are this careful. Telling a product from a service is a judgement about your shop, and we cannot make it for you. Our rule is a simple one: anything you have marked as virtual is a service, everything else is a product. That is good enough to sort your European Community Sales List into its two columns, where both are shown either way. It is not good enough to decide on its own that you owe no VAT, so we only ever let it answer no.

If your shop sells services as ordinary products, or products as virtual ones, that rule will be wrong for you. It can be changed to match your catalogue: your developer can do it in a line, or ask us.

There is no button to remove VAT from one order by hand. If you need to, change the tax on the order in WooCommerce while it can still be edited, or fix how the products are set up so the order is goods only.

Does this handle the Italian split payment (scissione dei pagamenti)?

No, and it should not.

Split payment applies to supplies to Italian public administrations and certain listed entities. The customer pays the VAT straight to the tax authority instead of to you. It is not an exemption: the invoice still shows the VAT in full and at the normal rate, and nothing about the VAT number changes. Only the route the money takes changes.

So there is nothing here for a VAT number validation plugin to detect or decide. It belongs to your invoicing and accounting, not to the exemption rule. It is mentioned here only so you can be sure the omission is deliberate rather than a gap, since it comes up alongside the other Italian special cases above.

Which address decides, billing or shipping?

The shipping address. Some plugins let you choose between the two. This one does not, because the exemption depends on the goods physically leaving for another EU country, so where they are sent is what matters and where the invoice is addressed is not.

When an order has no separate shipping address, the billing address is the shipping address and is used as one. Orders with nothing to ship, such as downloads, virtual products or services, have no shipping address at all; for those the billing address is used, because it is the only address the order has.

A shop that sells only services or downloads, where nothing is ever dispatched, can make the billing address decide everywhere. See “Can I override how the exemption is decided?” below.

Why is VAT still charged on an order with a valid VAT number?

The most common reasons, in order:

  • The order is not leaving the country it is being sold from. That is a domestic sale.
  • The VAT number was issued by the same country the order is being sold from.
  • The VAT number was not issued by the country the order is being sent to (on Recommended or above).
  • The number is not listed in VIES.
  • The order is going to a part of an EU country that is outside the EU VAT area, such as the Canary Islands.

The order records which of these applied. Open the order and look at the VAT number panel.

Can I remove VAT for businesses in my own country?

Not from the settings, no. A sale that starts and ends in your country is a domestic sale, and the exemption is for goods going to a business in another EU country. A customer being VAT registered does not change that.

Some plugins offer this as a checkbox and some switch it on by default. This one does not, because a setting that quietly contradicts the rule printed above it is worse than no setting.

If your accountant has told you it applies to your particular situation, it can be turned on in code. See “Can I override how the exemption is decided?” below. Once it is on, the settings screen says so, and every order it affects records that this is why VAT was removed.

Do I still have obligations after the plugin removes VAT?

Yes. The exemption does not apply if you have not submitted a correct recapitulative statement, the European Community Sales List, for the supply. The plugin builds that statement for you, under WooCommerce > EC Sales List, but submitting it is yours to do.

European Community Sales List

Where do I find the European Community Sales List?

The recapitulative statement, the European Community Sales List (shortened to EC Sales List in the admin menu, where the full name will not fit), is at WooCommerce > EC Sales List. It asks for WooCommerce’s “view reports” permission rather than the right to change settings, so a bookkeeper can be given the report without being given the plugin.

It is on by default and can be switched off under Recapitulative statement on the settings screen, which hides the report and the triangular question on the order screen. Turn it off if you produce the statement from your accounting software and do not want a second version of the same numbers in wp-admin.

What is in the report?

Two tables covering the same period.

What you file is the statement itself: one line per customer VAT number, goods and services stated separately, triangular supplies marked, and the total for the period.

The proof behind it is one line per order: the consultation number VIES issued, the moment the check really happened, the name the number is registered to, and the rule that allowed the exemption.

Can I rely on the report as it stands?

Treat it as a tool that helps you prepare the statement, not as the statement and not as a legal or accounting document. It is built only from the orders this plugin judged and recorded, so there are things it cannot know:

  • A sale that was zero rated by something other than this plugin does not appear, even though it may belong on your statement.
  • An order edited after it was placed changes these figures, including for a period you have already filed.
  • Amounts taken in another currency are shown as they were taken and are never converted.
  • The goods and services split is a heuristic, and whether a supply is triangular is your answer rather than ours.

Check it against your own records before filing, and file under your own responsibility.

How are triangular supplies marked?

By you, on the order. Open it and tick Triangular in the VAT number panel.

It is not worked out for you because it cannot be. A triangular supply under Article 141 is one where your customer bought as an intermediary and had the goods sent straight on to their own customer in a third member state. Nothing in an order records that.

The nearest thing an order does show is that the VAT number and the delivery country differ, and that has innocent explanations, such as a company having its own goods delivered to its own warehouse abroad. So the report flags those orders with Check in the Triangular column and links to them, and leaves the answer to you.

Note that with the conditions for removing VAT on Recommended, an order whose VAT number country is not the destination is not exempted at all, so it never reaches this report. Those orders appear only on Directive minimum.

Which orders does it count?

Only the ones this plugin actually exempted, and only in the statuses processing and completed. An order that carries a VAT number but was charged VAT is not an intra-Community supply and does not belong in the statement.

Developers can change the statuses with the nakedcat_vat_number_ecsl_statuses filter.

Why is an order missing from it?

In this order of likelihood: its status is not one the report counts, VAT was never removed from it, or its date falls outside the period. Open the order and read the VAT number panel: it says whether the order is on the statement, and if not, why.

One case is worth watching for, and the report points it out above the tables: an order that carries no VAT and is still not on the statement. That happens when the VAT number was edited after the order was placed, since the decision is made again but the tax is deliberately not recalculated. The sale went out zero rated and may belong on your statement even though this report will not put it there.

How are refunds treated?

A refund is reported in the period it was granted, not the period of the original order, so a supply made last quarter and refunded this one is a correction on this quarter’s statement. It appears as a negative line and is split between goods and services in the same proportion as the order it came from.

Does it convert currencies?

No. If a period contains supplies in more than one currency the report says so and leaves the amounts alone. Nothing here records the exchange rate that applied on the day of each order, and using today’s rate would put a number on a statutory return that nobody could reproduce later.

Where does an order say whether it is on the statement?

In the VAT number panel on the order screen, under European Community Sales List. An order that is on it says so and offers the triangular question. An order that is not says why, in words: the VAT number is registered in one country and the goods went to another, VIES never confirmed the number, the sale never left your country, and so on.

How do I know if a period changed after I filed it?

Exporting the summary records what you took away: the period, the moment, and the figures for each customer. Open that period again later and the report compares the two. It either says nothing has changed since, or names the customers whose lines have and warns that a period you have already filed may need correcting.

That matters because a period is never really closed. An order in it can be refunded, edited or marked triangular months later, and nothing else in WooCommerce would tell you that the statement you filed no longer matches your own records.

Exporting again replaces the record. The last twenty periods are kept, which is five years of quarters. Only the summary export is recorded, since that is the statement; the detail export is the evidence behind it.

Can I export it?

Yes, each table has its own CSV. Amounts are written with a dot as the decimal separator and no thousands separator, whatever your site language, because a decimal comma turns one column into two in many spreadsheets.

Does the plugin file the statement for me?

No, and it does not talk to any tax authority. It produces the figures and the evidence behind them. Submitting the statement is yours to do, in whatever form your country requires.

Orders

Where does the customer see their VAT number?

On the order confirmation page, in their account under the order, and on the order emails, listed with the order totals in the same place WooCommerce shows the payment method. It appears in both classic and block themes, because it is added to WooCommerce’s own order totals table rather than drawn separately.

It is deliberately not added to the billing address. Some plugins do that, and it means the number ends up wherever an address is used, including shipping labels. A VAT number is part of the order, not part of where somebody lives.

Developers can remove it with the nakedcat_vat_number_show_in_order_totals filter, or change the row with nakedcat_vat_number_order_totals_row. See the Developers section.

Can I find an order by VAT number?

Yes. Type or paste the number into the search box on the orders list and press enter, with the search set to its usual “All”. It works on both order storage systems.

Can I see and search VAT numbers on the customers list?

Yes. Users has a column showing each customer’s number, and searching that screen matches VAT numbers as well as names and emails, so pasting a number finds the customer it belongs to.

Customers who came from another VAT plugin appear there straight away, before they have ordered again and before you import anything. Both the column and the search read the other plugin’s key as well as ours.

The column is not sortable, on purpose: sorting a list of tax numbers puts every Portuguese customer together and answers no question anybody actually has.

Where do I see what happened?

Two places:

  • The orders list has a VAT number column, showing the number and its state.
  • The order screen has a VAT number panel with the full record: the number, the status, when it was checked, whether the answer came from a stored result, the VIES consultation number, the trader name and registered address VIES returned, whether VAT was removed, which address decided, the customer’s IP address, and the country that IP resolved to.

What do the icons in the orders column mean?

  • Confirmed: the business was registered in VIES when we checked.
  • Not listed in VIES: checked, not found. Not an error. VAT was charged as normal.
  • Not checked: no VIES check was made for this order.
  • Recorded by another plugin: this order predates this plugin. It shows the number that other plugin stored, and nothing else, because this plugin did not check it and did not decide its tax.

What is “Country by IP” on the order?

The country the customer’s IP address resolved to at the moment the order was placed. It is there for your records, and it decides nothing.

It comes from whatever your shop is already set up with, and nothing is ever sent anywhere to work it out: a country header from your CDN if you use one (Cloudflare sets one, for example), or WooCommerce’s own MaxMind geolocation if you have entered a licence key under WooCommerce > Settings > Integration. With neither of those, the row simply does not appear rather than a lookup being sent to some third party with your customer’s IP address in it.

It is worked out once, when the order is placed, and never again. Geolocation databases are rewritten constantly, so asking a year later would answer a different question and pass the answer off as a fact about the past. Editing the number or re-checking it leaves the recorded country alone.

A country that differs from the billing address is completely ordinary. Company networks route through head office, people use VPNs, and customers travel. The panel says so rather than flagging it.

The reason it changes nothing is that for the B2B exemption an IP address is not evidence of anything. What the exemption rests on is the VAT number confirmed in VIES and the goods going to a business in another EU country, and the proof of that, in law, is transport documents, insurance and bank records. An IP address appears nowhere on that list. Where it does count is a different set of rules: business to consumer sales of digital services, which need two non-contradictory pieces of evidence of where the customer is. This plugin does not handle those, so it does not pretend the IP country is doing work it is not.

Can I edit a customer’s VAT number in WP Admin?

Yes. It is on the customer’s own profile screen, under Billing, alongside the address WooCommerce keeps there. Save it the way you would any other field on that page.

What you type is tidied up the same way the checkout tidies it, so lt 100005065913 is stored as LT100005065913 and the country is recorded with it. Clearing the field removes both.

Editing a customer’s profile never changes an existing order. The customer’s current number and the number an order was placed under are different facts, and an order has to keep the one it was placed under.

Can I edit the VAT number on an order?

Yes, in the billing address panel, like any other billing field.

Saving checks the number and records the answer, but never refuses it. You may be transcribing a customer’s paperwork, repairing a bad import, or entering a number for a country we cannot check.

It does not change the tax already on the order. WooCommerce recalculates tax when you ask it to, and not otherwise. Use WooCommerce’s own Recalculate button if you want the new number applied to the totals.

Can I re-check a number later?

Yes. The order panel has a “Check again now” button. It tells you it is working while it waits for VIES, and reports what it found at the top of the screen as well as in the order notes.

It does not change the order or its tax. The check made when the order was placed is the one that counts, because that is the one contemporaneous with the supply.

Switching from another plugin

We call this Zero-Touch Migration: your customers’ numbers migrate themselves while the shop runs, so there is nothing to export, nothing to import and no maintenance window. The questions below are the detail.

Will I lose the VAT numbers I already have?

No. The plugin reads numbers stored by other plugins and treats them as if they were its own. Nothing needs importing, and nothing of theirs is touched, so switching is safe and reversible.

Reading another plugin’s data does not require that plugin to be active. Deactivate it: the numbers stay in the database and we still find them.

A returning customer sees their existing number already filled in at the checkout, in My Account and on the address form. The first time they save it, it becomes ours.

Which plugins can it read numbers from?

These, in this order of preference when a customer has a number stored by more than one:

Plugin
WooCommerce EU VAT Number, the official WooCommerce extension
EU VAT Assistant by Aelia
EU VAT Compliance by Simba Hosting
These three write a customer’s number to the same place, so there is nothing to choose between them.
EU/UK VAT Validation Manager by WPFactory, formerly Alg
Teamwant VIES VAT for WooCommerce, sold as European VAT Validator
InvoiceXpress for WooCommerce, our own
NIF (Num. de Contribuinte Português) for WooCommerce, our own free plugin
APG NIF/CIF/NIE, free, and stores to the same place

The order is by how specific each field is, and only matters for a customer who has a number stored by more than one plugin. The fields above exist to hold a VAT number and nothing else, so they are trusted first. The last asks every customer for a number for invoicing, business or not, so it is read only when nothing better is there. Anything already stored by this plugin beats all of them.

On orders those first three do have their own separate fields, so there the order between them is by specificity too.

Aelia and WPFactory both let a site rename their field. Where they do, we ask them for the name rather than assuming it.

Teamwant stores under two different keys depending on which checkout took the order, and both are read. One thing it does that no migration can undo: when your checkout already has a field called vat or billing_vat, from a theme or another plugin, it uses that field instead of adding its own. Numbers collected that way are under that field’s key, not under Teamwant’s, so check --list-sources against your own database before concluding there is nothing to bring across.

wp nakedcat-vat migrate --list-sources prints this list as your own site sees it, including the exact database keys, which is the quickest way to confirm your old plugin is covered.

Do I have to run a migration?

No. There is nothing you need to do.

The migration is continuous and happens by itself, a customer at a time, only when it is needed. Whenever the plugin wants a customer’s VAT number, for the checkout, for My Account or for the address form, it looks for its own first and then at every other plugin’s, and uses whatever it finds. The customer sees their number where they expect it and never knows anything changed. The next time they save it, it quietly becomes ours.

Nothing is copied in advance, nothing runs on activation, and there is no batch job waiting to time out on a large store. A shop with fifty thousand customers is migrated exactly as cheaply as one with fifty, because the work only happens for the customers who actually come back.

Old orders are left as they are. They keep showing the number the other plugin recorded, labelled as such, because that plugin made the check and we cannot vouch for it.

Can I migrate everything at once anyway?

You can, and there are two fair reasons to want to: you would rather not wait for customers to drift across, or you want to see what is actually there before you commit to switching.

It is optional. If you skip it, everything above still happens.

With WP-CLI:

wp nakedcat-vat migrate                  # shows what it would do, changes nothing
wp nakedcat-vat migrate --list-sources   # what this install would read
wp nakedcat-vat migrate --execute        # applies it
wp nakedcat-vat migrate --from=aelia     # only from one plugin
wp nakedcat-vat migrate --users          # customers only
wp nakedcat-vat migrate --orders         # orders only
wp nakedcat-vat migrate --limit=50       # a first look

Given neither --users nor --orders, it does both. --from matches loosely and is not case sensitive, so --from=aelia is enough; --list-sources prints the names to use.

It deletes nothing. The other plugin keeps its data exactly as it was, so nothing is burned behind you and you can go back if you need to. If you later want the old data tidied away, see the next answer: it is a separate, deliberate step, and not something the site can ever do on its own.

Running it changes nothing about how the plugin behaves. It simply does in one go what would otherwise happen gradually, so the report is worth more than the write: --list-sources and a plain dry run will tell you how many numbers you have and which plugin each came from, before you decide anything.

Orders migrated this way get the number and its country and nothing else. No validation record is written, because we did not make that check and cannot say when the other plugin made theirs.

Can I delete the old plugin’s numbers once they are copied?

Yes, with --delete-source, and please read this before you use it.

wp nakedcat-vat migrate --execute --delete-source

It deletes only the single key each record was actually read from, never the whole list of possible sources, and never anything it did not just copy. It requires --execute, so a dry run can never delete anything, and it asks you to confirm before it starts. --yes skips that prompt, which is only for scripting.

It is not reversible. It is the one thing in this plugin that removes another plugin’s data, which is why it is off by default, why it asks, and why the automatic migration that happens as customers order never does it no matter how it is configured.

Most shops never need it. The old keys sitting there cost nothing, and leaving them is what lets you change your mind. Reach for this only when you have decided you are not going back, and take a database backup first.

Should I run this alongside my old VAT plugin?

No, and not even briefly. Run one VAT plugin at a time.

Two of them will both add a VAT field to your checkout, both try to validate what the customer types, and both decide whether to remove the tax. Your customers may see the field twice, the messages can contradict each other, and which plugin wins the decision about VAT is genuinely unpredictable, because it comes down to the order the two happen to run in. An order can end up exempted by one plugin and taxed by the other on the next page load.

The safe sequence is: install this plugin, deactivate the old one, then check a test order. You do not have to migrate first and you do not have to hurry, because the old plugin’s data stays in the database either way and this plugin reads it whether that plugin is active or not.

If something is wrong, deactivate this one and reactivate the old one. Their data is still there.

Will it overwrite a number I already have?

Never. Anything already stored by this plugin wins over every other source, which also makes the migration safe to run twice.

Speed and caching

Is the checkout slowed down by all this checking?

Very little, by design.

Most numbers never reach VIES at all: the format and check-digit tests run first and answer instantly. When a number does have to be checked, the answer is remembered, so the same customer editing their address, changing country or simply pausing while they type is answered from memory rather than from Brussels.

There are several layers of that memory, from one that lasts a single page load to one shared by everybody on your site, and the plugin works its way outward through them before it considers making a call. None of it needs configuring, and none of it requires a caching plugin or any special hosting: it works on ordinary shared hosting, and takes advantage of a persistent object cache if your host provides one.

How long are results kept?

Confirmed results are kept for as long as you choose, one day by default. This affects checkout speed only: the number is always re-checked live when the order is placed.

Numbers VIES did not recognise are kept for one minute, and that is not configurable. It is long enough to absorb a double submit and short enough that a business whose registration goes live is not told otherwise for the rest of the day.

Outages are never cached.

Whatever you pick, a stored result is still used if VIES is unreachable at the moment an order is placed, because a stale answer beats a failed order.

Developers

How do I read a customer’s VAT number from my own code?

Four functions, and they are the only part of this plugin you should call. Everything else is internal and may be renamed or removed in any release.

nakedcat_vat_number_from_order( $order );          // '' or e.g. 'PT980405319'
nakedcat_vat_number_country_from_order( $order );  // '' or e.g. 'PT'
nakedcat_vat_number_from_user( $user );            // '' or the customer's current number
nakedcat_vat_number_country_from_user( $user );    // '' or its country

Each takes an object or an ID, and each returns a string, empty when there is nothing to return, so you never have to check a shape before using the result.

function_exists( 'nakedcat_vat_number_from_order' ) is the way to check whether this plugin is active, and each function’s return value has a filter of the same name.

Order or customer? The order records what was true when it was placed. The customer record is their number today, and they may have corrected or removed it since. Use the order when you are describing an order, including old ones, and the customer only when you are preparing something new for them.

Why ask for the country separately? Because it is the country that issued the number, which is not necessarily the billing or shipping country: a business can hold VAT registrations in more than one member state. It is also stored separately from the number, so it still answers correctly on a shop that has turned the country prefix off, where the stored number is bare.

These deliberately do not tell you whether the number was validated. Whether a number was checked, when, against what, and whether that justifies removing VAT are questions with expensive wrong answers, so the plugin keeps that reasoning to itself. What was found is on the order, in the metabox.

They read this plugin’s own data only. A number left behind by another VAT plugin is not returned; bring it across with wp nakedcat-vat migrate so one key is the answer everywhere.

Are there hooks for other plugins?

Yes. These fire so an invoicing or accounting plugin can keep its own copy in step without reading our meta keys:

Hook Arguments
nakedcat_vat_number_order_saved $order, $number, $result, $decision, $context
nakedcat_vat_number_user_saved $user_id, $number, $result, $context
nakedcat_vat_number_order_cleared $order, $previous_number
nakedcat_vat_number_user_cleared $user_id

$context is checkout, admin or account. Only checkout is contemporaneous with the supply, which matters if you are treating the number as proof.

Can I override how the exemption is decided?

Two filters, both off by default, and neither of them recommended.

Both are deliberately kept out of the settings screen. Each one makes the plugin depart from what the VAT Directive actually asks for, so turning one on should be a deliberate act by somebody whose accountant has told them it applies to their situation, not a checkbox somebody ticks while skimming. The defaults follow the law; these do not.

If you turn one on, the responsibility for the tax charged on those orders is yours.

When either is active the settings screen says so, in red, and every order it affects records that it was involved. Neither is hidden from you once it is on.

Use the billing address instead of the shipping address

add_filter( 'nakedcat_vat_number_use_billing_country', '__return_true' );

Not recommended, and almost certainly not needed.

You probably do not need this at all. When an order has no shipping address, which is every order on a services or downloads-only shop, the plugin already uses the billing address, because it is the only address the order has. That happens by itself and always has. A shop that never dispatches anything is therefore already deciding on the billing address without touching this filter.

Which leaves one case: a shop that does collect a shipping address but wants the billing address to decide anyway. That is the case we do not endorse. The exemption depends on the goods physically leaving for another EU country, which is why the shipping address decides, so overriding it means zero-rating on evidence the Directive does not ask for.

There is also an open question underneath all of this. The plugin’s exemption rules are written for goods under Article 138, whereas cross-border B2B services are reverse-charged under Articles 44 and 196 on a different evidential basis. We have not finished working out whether a services shop needs different rules altogether. Until we have, this filter is a workaround, not an answer.

Remove VAT on wholly domestic sales

add_filter( 'nakedcat_vat_number_allow_domestic_exemption', '__return_true' );

Not recommended. Overrides one condition and one only: that the VAT number must have been issued by a country other than your own. Everything else each set of conditions requires still has to be met, including confirmation by VIES.

It applies only when the sale is entirely domestic, meaning your country, the shipping country and the VAT number’s country are all the same. A VAT number from your own country shipping to another EU country stays taxable whatever you set here, because the goods leave from the same country the customer is registered in.

Be aware that this is not how the VAT Directive works. Article 138 exempts goods going to a business in another Member State, and a domestic sale is not that. It exists because some merchants are advised that their particular situation calls for it.

Can I stop the VAT number showing on the thank-you page and emails?

Yes:

add_filter( 'nakedcat_vat_number_show_in_order_totals', '__return_false' );

That removes the row from the order confirmation page, the My Account order view and the order emails, and changes nothing else: the number is still collected, still stored, and still on the order in WP Admin.

To keep it but change how it reads, filter the row instead. It has label and value, and the value is already escaped:

add_filter( 'nakedcat_vat_number_order_totals_row', function ( $row, $order ) {
    $row['label'] = 'Tax ID:';
    return $row;
}, 10, 2 );

Can another plugin decide the field is not needed for one customer?

Yes. “Ask always” is a shop-wide setting, but whether it applies is sometimes a fact about the individual order: a shop that offers “I do not want a VAT number on my invoice” as a checkout choice has to be able to honour it without turning the setting off for everybody.

In PHP, which is what actually decides:

add_filter( 'nakedcat_vat_number_required', function ( $required, $country, $order ) {
    if ( $order && $order->get_meta( '_wc_other/your-plugin/no-vat-invoice' ) ) {
        return false;
    }
    return $required;
}, 10, 3 );

On the Blocks checkout there are two matching JavaScript filters, so the shopper sees the same answer rather than being stopped at the end:

wp.hooks.addFilter( 'nakedcat_vat_number.required', 'your-plugin', ( required, context ) =>
    context.additionalFields[ 'your-plugin/no-vat-invoice' ] ? false : required
);

wp.hooks.addFilter( 'nakedcat_vat_number.show', 'your-plugin', ( show, context ) =>
    context.additionalFields[ 'your-plugin/no-vat-invoice' ] ? false : show
);

context carries billingCountry, additionalFields and the current value, and both filters re-run whenever any of those change, so a checkbox takes effect the moment it is ticked.

Use nakedcat_vat_number.show rather than hiding the field with CSS. A field hidden that way is still on the page as far as the checkout is concerned, so if it is also required the shopper is stopped by an error about a field they cannot see.

Are there other filters?

Filter Does
nakedcat_vat_number_field_priority Where the field sits among the classic checkout’s billing fields. Default 120.
nakedcat_vat_number_block_placement_pages Which pages the checkout block is added to on first run.
nakedcat_vat_number_vies_timeout How long to wait for VIES before treating it as unreachable.
nakedcat_vat_number_exemption_inputs The decision inputs, before they are evaluated.
nakedcat_vat_number_exemption_decision The finished decision, after it is made.
nakedcat_vat_number_checkout_rate_limit How many checks one shopper may make while ordering. Default 30.
nakedcat_vat_number_checkout_rate_window The period that allowance covers, in seconds. Default 300.
nakedcat_vat_number_rest_rate_limit The same for the REST endpoint, which allows 20 rather than 30.
nakedcat_vat_number_rest_rate_window The period that allowance covers, in seconds.
nakedcat_vat_number_palette_commands What the plugin adds to the WordPress command palette.
nakedcat_vat_number_ecsl_statuses Which order statuses count as a supply on the European Community Sales List. Default processing and completed.
nakedcat_vat_number_ecsl_split The goods and services split for one order on the European Community Sales List.
nakedcat_vat_number_goods_only Whether an order or cart carries nothing but goods. Decides whether a Northern Ireland order is exempted.
nakedcat_vat_number_territories The set of territories treated as outside the EU VAT area. For adding one we do not ship.
nakedcat_vat_number_territory_<id> Whether one territory is recognised. Return false to treat it as an ordinary part of its country. The ids are es_canarias, es_ceuta, es_melilla, fi_aland, de_heligoland, de_buesingen, it_livigno, it_campione and gr_mount_athos, so the Canary Islands hook is nakedcat_vat_number_territory_es_canarias.

The four rate limits exist so a shop with an unusual checkout can loosen them, not because they normally need changing. They deliberately never apply to the check made when an order is actually placed: that one has to happen, whatever anybody typed beforehand.

nakedcat_vat_number_ecsl_split receives an array of goods and services that add up to the order’s net, and the order itself. The default treats a virtual product as a service and everything else as goods, with shipping and fees following the goods unless the order is entirely virtual. That is a heuristic, and a shop that knows its own catalogue can answer it properly.

The exemption pair are low level and exist for cases a boolean cannot express, such as a per-product goods-versus-services distinction. Prefer the two named above them: those are introspectable, so the settings screen can report them and the order can record them, while a filter that reshapes an array leaves nothing able to explain what it did.

Where is the data stored?

Key
Order number _nakedcat_vat_number
Order country _nakedcat_vat_country
Order proof _nakedcat_vat_validation (JSON)
Order exemption decision _nakedcat_vat_exemption (JSON)
Customer number nakedcat_vat_number
Customer country nakedcat_vat_country

The proof is where the VIES answer lives: the status and reason, the consultation number, the trader name and address VIES returned, whether the answer came from a stored result, the plugin version that recorded it, and the country the customer’s IP resolved to. The customer’s IP address itself is not copied: WooCommerce already stores it on every order, and a second copy would be one more thing to disclose, export and erase for a value that is one method call away.

Is there a REST endpoint?

POST /wp-json/nakedcat-vat/v1/validate with {"vat_number": "...", "country": "..."}. It requires either the manage_woocommerce capability or an active WooCommerce customer session, and is rate limited. It never returns your own VAT number.

Can I jump to the settings from the command palette?

Yes. Press the command palette shortcut anywhere in WP Admin and start typing “VAT”, and you get two entries: one that opens the plugin’s settings and one that opens this documentation page in a new tab.

WordPress already turns every admin menu and submenu item into a palette command on its own. This plugin’s settings are not a menu item, they are a section inside WooCommerce’s own tax settings, so without this they would never appear. Which screens have a palette at all depends on your WordPress version: recent versions offer it throughout WP Admin, older ones only inside the editors.

Only users who can manage WooCommerce are given the commands, and nakedcat_vat_number_palette_commands changes or removes them.

Does it work with AI agents and MCP clients?

Yes. The plugin registers a nakedcat-vat-number/validate-vat-number ability through the WordPress Abilities API when that is available, returning the full structured result rather than a boolean, so an agent gets the reason a number failed and not merely that it did.

Because it is an ability rather than a private endpoint, anything that exposes this site’s abilities over MCP offers it too. A shop manager can ask an AI client to check a VAT number in conversation, and the client calls the same validator the checkout uses, with the same rules, the same caching and the same rate limits. It is marked read only, non destructive and idempotent, so an agent can tell it is safe to call.

It also reports what each layer of validation decided, as a closed set of codes the ability’s own schema explains, so an agent never has to infer them:

format passed, failed, not_checked
check_digit passed, failed, no_algorithm, not_checked
vies confirmed, not_listed, unavailable, disabled, not_applicable, requester_rejected, not_checked

This matters because the overall status cannot tell two very different situations apart. A number the customer mistyped and a perfectly formed number that simply is not registered for intra-EU trade both come back invalid, and they call for opposite responses: ask the customer to check what they typed, or charge the VAT and carry on. The first reads check_digit: failed, the second check_digit: passed, vies: not_listed.

no_algorithm is not a failure. We verify a check digit for 26 of the 31 territories we recognise, and for the other five saying so is more honest than reporting a pass.

Compatibility

Does it work with the Blocks checkout?

Yes, both checkouts are fully supported, including live totals: the VAT comes off as soon as a qualifying number is entered, without waiting for the order to be placed.

Does it work with WPML?

Yes. If you rename the field, that label is registered for translation, so you can give it different wording per language under WPML > String Translation. Left at its default it is translated already, along with every other message the plugin shows.

Nothing else needs translating: VAT numbers are data, not text, and they live on orders and customers, which are not translated in the first place.

Does it work with HPOS?

Yes. High-Performance Order Storage and the legacy post storage are both supported.

Does it work with Shop as Client PRO?

Yes. When a shop manager places an order on a customer’s behalf with Shop as Client PRO, the customer’s VAT number is filled in for them on both checkouts, so nobody has to retype a number the customer already gave you.

It reads the number the same way the customer’s own checkout does, which means a customer whose number is still stored by your previous VAT plugin fills in correctly too, before any migration has touched them.

This needs Shop as Client PRO 8.1 or later.

Does it support Great Britain, Northern Ireland, Norway or Switzerland?

Northern Ireland: yes, for goods. VIES lists XI numbers and the plugin checks them like any other, and it removes VAT when the order is goods being sent to a Northern Ireland address on a confirmed XI number. Services are not covered, because Northern Ireland is inside the EU VAT rules for goods only. See “What about Northern Ireland?” above for exactly when VAT comes off. The format is checked locally; the check digit is not, because we have not verified that algorithm to the standard we hold the others to.

Great Britain, Norway and Switzerland: not yet. None of them is in VIES, and each has its own national service with its own rules. What the plugin does today is recognise the shape of their numbers so one can be collected and kept: set “Show the field to customers billing in” to “EU, plus the UK and Switzerland” (or “Every country”, which is the one that includes Norway), and the number is stored on the order and on the customer for your invoices. It is never validated, and VAT is never removed for those countries. Northern Ireland is the exception described above, and it is the only one.

We plan to add real validation for them, and how soon depends on how many people ask. If you need it, please tell us: get in touch through our pre-sales questions page. It genuinely does decide what gets built next.

Does it need the SOAP extension?

No, and it never falls back to SOAP either. It uses the European Commission’s REST API and nothing else. Some other plugins refuse to activate without the SOAP extension; this one has no PHP extension requirements beyond WordPress’s own.

When VIES cannot be reached, the plugin uses the most recent stored answer for that number rather than a different protocol. See “What happens if VIES is unavailable?” above.