Virtuemart Extensions by

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

EU VAT and Mini One Stop Shop Tax System for Virtuemart (MOSS)

One Page Checkout for Virtuemart 3 (and Virtuemart2) now comes with a special calculation plugin which is capable of calculating tax on your digital sales to European Union the way they are ought to calculated. The plugin generally supports two modes - normal EU VAT tax mode where each product, shipping or payment fee can have it's own home tax rate or if you sell digital products, the customer rate is used. The plugin does not require our One Page Checkout to be used, it can run as a standalone calculation plugin, but it uses OPC EU VAT checker code to validate the EU VAT numbers. No shopper groups configuration is needed and no country configuration is needed. MOSS rates are downloaded from Google Drive. 


Quick set up: 

1. install OPC (follow OPC installation guide), OPC is not enabled by default and it is not required by this plugin to be enabled

2. install Moss plugin from OPC Extensions tab at the One Page Checkout backend

0moss install

3. visit the plugin at Joomla Plugin manager (see gallery for general plugin configuration), enable it and click save  (please visit the plugin configuration)

01moss enable

7plugin config

4. set up your tax categories for physical products (if applicable and if you use multiple tax rates): 

1category str

Top category (Taxes) can be unpublished

- Tax 10 (child category which must be published)

- Tax 20 (another child category which must be published)

4.1 Associate each product to either Tax 10 category or Tax 20 category so that you can filter the calculation rules per product categories

VAT 13 Product Notes: 

- category is set to VAT 13

- IMPORTANT: Each product must use "Apply default rules" otherwise any calculation restrictions are ignored (i.e. no shopper group applies, no country restrictions apply and the rule will be used even where it shouldn't)

- IMPORTANT: Do not use "Override Final", otherwise the resulting price will be always the same and the VAT may be mis calculated (applies to all VM versions)

2product 2setup

Product with Hight VAT Rate (24)

3product setup


4.2 Create a new calculation rule with MATH OPERATION: moss  (Moss Rates and EU VAT)



- set the filter to VAT 13 (low rate)

- you do not need to use Shopper groups and/or country filter. The EU and non-EU countries are automatically recognized by the plugin

- MOSS is used ONLY FOR DIGITAL PRODUCTS or if you are registred in more than one EU country for VAT (i.e. you pay the customer VAT rate to his country tax office), default type of tax is "EU VAT" for all physical products in EU

Another Vat Rate (24): 



The VAT rate comes from the Value configuration above. The VAT is applied only if it meets EU VAT rules (i.e. customer is inside EU and many other rules)

4.3 To set up normal EU VAT Tax mode you set "default value" for the tax calculation (i.e. 20 for 20% rate) + associate your Tax 10 or Tax 20 to the VM calculation 

4.4. Repeat the 4.3 for all your tax rates for physical products

(see printscreens above, the same applies for VM3 version as well)

4.5 Configure shipping and payment to use either one of the tax calcution. IN NO CASE LEAVE "use default" AS THIS WON'T WORK. Always set a specific tax rate. If you choose our plugin for the tax calculation, the tax will only be calculated if the customer is tax eligible. 



- never use "Apply default rules" in shipping OR payment configuration

- VAT rate for shipping will only be applied if the customer meets EU rules (i.e. is inside EU and does not have a valid VAT ID)

5. To set up MOSS rates for your digital products: 

5.1 Add new calculation in virtuemart and choosee MATH OPERATION moss (Moss Rates and EU VAT), CLICK APPLY

5.2 New checkbox is now shown at the bottom (vm3) or at the top of the page (vm2): MOSS vs EU Vat 

5.3 Make sure you check this checkbox and CLICK APPLY

5.4 Further configuratino is now revealed, click "Clear current data and load CSV from google drive" 

5.5 Return to the calculation/Tax configuration and check if the EU VAT rates are correct. We do not take any responsibility for the correctness of this data and you should consult the rates applicapable on your services with your account and they should be rechecked at least once a year. Copy the CSV to your own google drive where your accountant can update the rates as needed. If the rates get changed, you must click to load the new rates again. This plugin does not update the rates automatically. 

5.6 If you are tax-free eligible in your own country in European union you can set zero tax rate for your own country


Enable debug mode in Joomla plugin configuration to see why the rates were selected 

8debug moss

The demo mode will display notices on all Joomla pages where the plugin calculates the tax (this notice is for a customer visiting a GR site from SK)

9debug msg

This plugin is distributed with OPC installer, but support for this must be purchased individually of 79 euro - in case you need help with the installation and setting up custom (local) VAT rules. 


New Features (Oct 2016)

Added a support for UK tax codes which can be used also in other EU countries. The order items and order taxes are stored in a separate table with a reference to: 

- vat delivery country

- tax code which can differ: 

- T0 no tax is applied, this is used for non-EU countries 

- T1 defualt tax rate in the home country 

- T4 - goods sold to EUVAT registered persons outside home country

- T22 - services sold to EUVAT registered persons outside home country

- other tax codes can be configured per lower rate VAT

Optional features - GeoLocator

Install GeoLocator from OPC Extensions

11geolocator install



After the installation either visit it via Components -> GeoLocator or visit the first-time URL with: 


or visit your frontend after the DB is installed to check the geolocator data



- the above is availble at your

- the image also displayes the data from EU VAT and MOSS plugin: 

-- customer got his cart address already filled which got higher priority than IP country address 

-- 3rd party calcution plugins may cause issues in some cases - you may want to try to re-order them in Joomla plugin manager to see if the VAT gets working correctly

Optional - OPC EU VAT Field

Visit your Components -> Onepage -> Shopper Groups and at the bottom you'll find these: 



You can use OPC core field (opc_vat) or your already existing VAT field, just enter it's name at the config. OPC automatically creates this field in shopper fields and the proper VAT field config should look like this: 

14opc vat fields


At the checkout, the VAT field may look like this: 



- the Validate... button is optional and can be disabled in OPC configuration, but makes the process much more clear especially if the EU VIES system is down

Quick gallery

All images in this guide in full resolution


Moss and EU VAT plugin detail description

The plugin supports 2 basic modes:

- digital sales for telecomunication and other digital services which are part of Mini One Stop Shop EU scheme (MOSS)
- physical products which are subject to VAT rules (EUVAT scheme)

General Options

First, basic options which influence the VAT rate calculation and detection (Global configuration in Joomla Plugin Manager -> VM3 EU VAT and MOSS Calculation Plugin)
- List of EU countries (update this once EU country list changes)
- [HOME] Home Countries (set a list of countries in which you got official EU VAT registration. If you ship physical products to any specific EU country above a certain threshold you must register for VAT ID in that country)
- Use Geolocator (geolocator is a component provided by to detect a country of the customer from his IP address and thus default rates can be calculated for anonymous - not yet logged in users)
- [ST_OPTION] Ignore ST address: in some special cases where the Ship To (ST) address of your customers is always a 3rd party stock warehouse you may want to ignore the ST - Ship to address.
- [ZERO_RATE_PRIVATE_OPTION] Set zero rate for non EU private persons: EU legislation does not concern 3rd countries tax systems and thus you should apply the tax of the receiving country for any purchases by the private persons within MOSS scheme and follow their own tax or vat rules. Example: if you ship digital products to Tunisia to private persons you should pay tax in Tunisia. Since it's not possible to follow taxes in the whole world most companies consider such a purchase to be a domestic purchase and thus they pay the local tax rate. There is also a problem with "proof of domicile" where you should be able to provide a proof to your tax authorities about the address of the customer (within this plugin it is handled with IP to country detection)
- Set zero rate for EU companies with valid EU VAT (this should be default, but in some cases the foreign EU company can ask for VAT returns from your own country.)

Other options:

[COMPANY_FIELD] Bill To Virtuemart company shopper field - by default this is "company" and if this shopper field is not empty, the person is considered to be a business entitity instead of private person
[PRIVATE_FIELD] Bill To Virtuemart private person shopper field - used in DE where the shopper fields should include a custom input if the customer is a private person or not. If private person is selected, the company input is ignored.
[VAT_FIELD] Virtuemart EU VAT field: when used with OPC, the opc_vat is used by default, but you can also use 3rd party EU VAT inputs.
Debug - display messages from the plugin how and why the rate was selected.
Tax display in VM: Plugin changes the name of the calculation dynamically per the tax rate and country detected. NN -> numeric tax rate, DD -> decimals of the tax rate, CC -> country 2 ISO code, furthermore you can also use CCC for country 3 iso code


[HOME] Home countries where VAT will be charged -> should be equal to the plugin general configuration as above. The list is separated by comma or includes a single ISO 2 code.
[HOME_VAT_ID] Your main EU VAT number including country prefix, which will be used as a requester number for SOAP call. Important: your VAT ID is used to make the queries agains VIES. If you do not enter your own VAT ID here, you can get rate limited by VIES which may cause problems with the validation. Each validation returnes a TOKEN which can be used as a validation proof and this token together with entered COUNTRY and IP address is stored in #__onepage_moss table. It is given an ORDER ID if the customer makes the order after the validation.
[VAT_FIELD] Enable OPC core EU VAT field -> this will automatically check or create a new shopper fields (opc_vat and opc_vat_info) within VM shopper fields. If you are using 3rd party field name, you can set it in the next configuration.
[VAT_FIELD] Field name -> should be equal to the plugins' master configuration
[BUTTON] Show button to check the EU VAT validity -> this will give immidiate result to your customers after the button is clicked. If this option is not enabled, the validation is done upon leaving the field automatically. Make sure that the responses are visible on your OPC theme.
[ST_OPTION_2] Require ship to address country match with VAT ID (default). Validation will return an error in case the selected country does not match VAT_FIELD value country
Allow invalid VAT IDs to be stored -> If non-EU (US or Tunisian) company enters their registered company number, this number will be allowed to be stored even when it's not an EUVAT number.


1: VAT is validated at the checkout either automatically after leaving VAT_FIELD or after BUTTON is pressed. For sucessull validation, the result is stored in session
2: VAT is validated second time (or session is used) at the checkout validation before order is created
3: To limit the number of calls to VIES, the plugin checks #__onepage_moss table for recent validation attempts

Plugin VAT validation Steps:

(returning FALSE means that another rules are used)

3: VAT_FIELD is not valid but home applies, returns FALSE
4: CUSTOMER_COUNTRY not in EU returns TRUE
5. ST_OPTION_2 is enabled and CUSTOMER_COUNTRY does not match VAT_FIEld country returns FALSE
6. Communication error returns TRUE
7. Valid VAT_FIELD returns TRUE

- plugin uses classes from within OPC helper files and thus OPC must be installed, but it does not need to be used in case you are using any 3rd party OPC solutions. If needed we can include the OPC helper files in the plugin, so it can be used completely standalone. The validation of the VAT is done against EU VIES system, which in some cases may require a valid company name to be present. (per VAT_FIELD)

Checkout VAT validation in OPC

(returning FALSE gives checkout error):

0. By default VAT_FIELD is valid
1. ST_OPTION_2 is not enabled and validation status is "country does not match VAT_FIELD" the vat is validated against BT address when ST is used
2. BT is not in EU and VAT_FIELD is still invalid per rule 1, returns TRUE
3. if VAT_FIELD in not valid or we got COUNTRY match error when ST_OPTION_2 is disabled returns FALSE
4. if there is communication error during the checkout validation, returns TRUE (i.e. unknown VAT_FIELD is considered to be valid)
5. Only if VAT_FIELD is valid, the shopper groups are updated per OPC configuration



by default COUNTRY is picked from ST address unless ST_OPTION is enabled
it is then checked within the Bill To (BT) address
and if no address is selected, the GeoLocator is used (if installed)
if GeoLocator detects satellite or proxy connection, NO ADDRESS IS DETECTED and thus HOME COUNTRY IS USED (note: home country can be outside EU where the first one from HOME_OPTION is used as default if no address is detected)


if cart is empty, the COUNTRY is taken from customer's registered BT address
once the customer is in the cart and no ST address is selected, the cart's changed BT address is used
if the customer chooses ST address in the cart, the ST address got the highest priority as far as ST_OPTION is not enabled
if no address is selected, the GeoLocator is used (if installed)
if GeoLocator detects satellite or proxy connection, NO ADDRESS IS DETECTED and thus HOME COUNTRY IS USED (note: home country can be outside EU where the first one from HOME_OPTION is used as default if no address is detected)

Further definitions

[DEFAULT_RATE] Default tax rate: Default tax rate is a tax rate returned for the first HOME country. If you are UK based and your home rate is 20 percent, the 20 percent is returned. If you are SK based and you do not pay VAT for domestic sales under the EU thresholds (SK: 49 000 eur), your default rate can be zero. If you are US based and registered for MOSS or EUVAT in EU, your default rate should be zero.
RETURNED: no following rules apply and the rate is used for tax calculation
TAX_TABLE_RATE: #__virtuemart_calc_plg_moss_calc_config -> contains an association of country to the rate per plugin ID. By default this table only includes EU countries and thus any non-EU query returns zero rate. If in MOSS mode, the rate is returned by checking the table, if in EUVAT (not in MOSS mode) the HOME_RATE is returned
CUSTOMER_COUNTRY: This is by default ST country per the above rules, if ST_OPTION is disabled, the BT country is returned - see section "Getting CUSTOMER_COUNTRY"
HOME_RATE: if CUSTOMER_COUNTRY is HOME country, the rate is returned for this country. If HOME_RATE applies but CUSTOMER_COUNTRY is not HOME, the rate is returned for the first HOME country in configuration

Tax calcultion rules in the plugin

1: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is not enabled and PRIVATE_FIELD in BT is not empty HOME_RATE is RETURNED
2: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is not enabled and PRIVATE_FIELD in ST is not empty HOME_RATE is RETURNED
3: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is not enabled and COMPANY_FIELD in BT is not empty HOME_RATE is RETURNED
4: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is not enabled and none of the 1-3 rules apply, ZERO_RATE is returned

5: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is enabled and CUSTOMER_BT is HOME country, the HOME_RATE is RETURNED (example: customer BT is in EU, but customer ST is not in EU)
6: If CUSTOMER_COUNTRY is not in EU and ZERO_RATE_PRIVATE_OPTION is enabled and rule 5 does not apply, ZERO_RATE is returned (example: customer BT is not in EU, and customer ST is not in EU)

7: If CUSTOMER_COUNTRY is EMPTY (not detected) it is set to HOME country
8: If CUSTOMER_COUNTRY is in EU and PRIVATE_FIELD in BT is not empty TAX_TABLE_RATE is returned
9: If CUSTOMER_COUNTRY is in EU and PRIVATE_FIELD in ST is not empty TAX_TABLE_RATE is returned
10: If CUSTOMER_COUNTRY is in EU and COMPANY_FIELD is empty and VAT_FIELD is empty TAX_TABLE_RATE is returned
12: If CUSTOMER_COUNTRY is in EU and COMPANY_FIELD is not empty and VAT_FIELD and CUSTOMER_COUNTRY is not HOME country, VAT_FIELD is validated and if valid ZERO_RATE is returned
13: If CUSTOMER_COUNTRY is in EU and COMPANY_FIELD is not empty and VAT_FIELD and CUSTOMER_COUNTRY is not HOME country, VAT_FIELD is not validated following rules apply

14: If CUSTOMER_COUNTRY is home country or if it is empty, it is set to HOME country, HOME_RATE is returned

15: If CUSTOMER_COUNTRY_BT is not in EU , but customer CUSTOMER_COUNTRY in in EU and it is not a HOME country and EUVAT field is filled VAT_FIELD is validated and if valid, zero rate is returned (Example: San Marino company ships to Italy with a valid EU VAT ID where home country is Spain)


Other uses of this plugin

In MOSS mode, the plugin is capable of returning a rate per the association of the country to the rate. If you pay taxes outside EU, the plugin can also be used to charge tax for non-EU private persons as far as the country is listed within TAX_TABLE_RATE
In EUVAT mode when TAX_TABLE_RATE should be returned, it returns always HOME_RATE
Default rate: if none of the above rules are met, the default value from within the VM calculation is used. This is particularly useful for EUVAT mode.

General advises

The plugin is capable of operating in mixed mode, where you can charge EUVAT tax for physical products and MOSS VAT for digital products. To differentiate such products we suggest to use VM cateogories and filter the calculation rule within these categories:
Example of Category structure:
Taxes (unpublished top category)
- Low Rate (published child category for Low rate for EUVAT physical products)
- High Rate (published child category for High rate for EUVAT physical products)
- MOSS Rate (published child category for dynamic rate for MOSS digital products per customer address)
We do not suggest to configure COUNTRY FILTER in VM calculation as countries are automatically handled and filtered by the plugin logic itself.



You are here