Support » Plugin: WooCommerce EU VAT Assistant » FAQ – OSS/IOSS regulations from the 1st of July, 2021 (Updated 1st July 2021)

  • Plugin Author Diego

    (@daigo75)


    This topic covers the aspect of the regulations that apply to merchants whose sales fall under the new IOSS VAT regime, coming into effect on the 1st of July, 2021. The information comes from the answers given to users who enquired about this topic, and have been put together in this single topic, for convenience.

    We must clarify that we are not accountants, nor tax advisors, therefore the following doesn’t constitute official tax advice, nor legal advice. We strongly recommend to consult your accountant to confirm the correct approach to take in your specific business, as we won’t be able to guarantee the accuracy of our answers, not take any responsibility in case of compliance issues. You are free to use the information and solutions provided below, at your own risk.

    General question: will the EU VAT Assistant be updated provide features specific to the IOSS regime, coming into effect on the 1st of July 2021?

    Answer
    The EU VAT Assistant can be used, to a certain extent, even after the 1st of July. However, please keep in mind that it’s designed primarily for digital products, and doesn’t implement features specific to physical goods, or to the element of shipping. It’s already possible, with some custom filters, to cover some the rules applicable to the shipping of goods, such as the VAT exemption over 150 EUR (or 135 GBP, for the UK). More about this below.

    10K VAT MOSS registration
    Regulation link: https://ec.europa.eu/taxation_customs/business/vat/modernising-vat-cross-border-ecommerce_en

    Regulation summary

    The abolition of the “distance sales threshold” and the creation of a unique and common threshold of EUR 10,000 throughout the EU up to which B2C EU cross-border supplies remain subject to the VAT rules of the Member State of dispatch, and above which supplies become subject to the VAT rules of the Member State of destination

    Question: does the EU VAT Assistant keep track of the sales and inform the merchant?

    Answer
    We are aware of the threshold regulations, as they have been in place for sales of digital services for a while now. As of today, we don’t have a plan to introduce a feature to keep track of the cumulative sales to see when that threshold is reached.

    Based on our understanding, the process is the following:
    1. As long as a business is under 10K of B2C EU sales, it can apply the VAT rules of the source country. This is not compulsory, and a business can opt to join the VAT OSS system immediately.
    2. As soon as the business reaches 10K of B2C EU sales, it has to apply the new regime. This means performing a couple of steps:

    1. Registering for the VAT OSS system. This is a manual process.
    2. Configuring the VAT rates for the 27 EU countries, for the applicable tax classes. This is also a manual process, as the EU VAT Assistant doesn’t change existing VAT rates (that’s not a planned feature, either. It’s up to the merchant to keep the rates up to date).

    After some consideration, we came to the conclusion that the manual work would described above (see #2.1 amd 2#2.) have to be done anyway, and that the transition to the VAT OSS system is usually a once-off operation. Once a business reaches the 10K of sales, it would make little sense to go back to the pre-threshold regime the year after (i.e. a business doesn’t go back and forth from OSS to “source VAT”, as that would add administrative work).

    We opted to leave out any automatic switching from one regime to the other. A business can simply run one of the included reports to have an idea of how close they are to the threshold (the EU VAT Assistant shows the amount per country, one just has to make a sum), and start the registration ahead of time. When the registration is complete, they can simply change the VAT rates in the tax settings and the EU VAT Assistant will track the country-specific sales as it normally does.

    In conclusion, we determined that the little benefit brought by a “sales tracking” feature would not justify the work required to implement it, and we put it aside for now (i.e. it won’t be added to the EU VAT Assistant).

    VAT exemption thresholds
    The new IOSS regulations require the application of VAT to all sales made to extra-EU countries, when such sales don’t exceed 150 EUR. The UK has a similar rule, where the sales to EU customer by a UK merchant should be subject to VAT when they are under 135 GBP. When the order amounts are above 150 EUR (EU rule) or (135 GBP) UK rule, then the VAT is handled at the destination, and the order should be exempted from it.

    Question: does the EU VAT Assistant check the order totals and apply VAT exemptions as needed?

    Answer
    The short answer to this question would be that the EU VAT Assistant doesn’t perform this kind of check, but it’s possible to introduce them with a simple filter.

    As we explained in other threads, and as described on the plugin page, we wrote the EU VAT Assistant specifically to handle the VAT MOSS regulations, which apply to digital products. The aspects related to the sales of physical goods, such as different VAT regimes depending on the delivered goods, are outside the the plugin’s scope. Due to that, the EU VAT Assistant won’t check the cart totals, nor apply an exemption if the cart total is above a certain amount (e.g. 135 GBP for the UK, or 150 EUR for the EU).

    We’re working on a solution that will replace the EU VAT Assistant, which will include better support for physical goods. In the meantime, special rules can still be handled with some custom filters, which can be used to apply a VAT exemption when the cart total is over a certain amount.

    How to calculate the order totals for the VAT exemption
    Based on the documentation we have received, the thresholds after which an order should be shipped without VAT are 150 EUR for EU countries, and 135 GBP for the UK. One aspect that caused confusion is what elements of an order counts towards the calculation. Different sources report different information, therefore we rely on official sources.

    Both the EU and the UK rules indicate that the order total should be calculated on the intrinsic value of the goods being sold, excluding shipping costs and insurance. Based on our understanding, the intrinsic value also excludes discounts applied to the order, as the discount doesn’t reduce the actual value of the goods.

    Based on the above, the formula to calculate the order total, to apply the VAT exemption, would be the following:
    cart total before tax and discounts - shipping costs - insurance costs

    Below are some examples of filters that calculate the order threshold based on the above assumption, and set a VAT exemption when such a threshold is exceeded.

    Snippet #1 – Apply a VAT exemption when selling goods worth more than 150 EUR to EU customers

    
    /**
      * Apply a VAT exemption for orders shipped to EU countries, whose value is above 150 EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && \Aelia\WC\EU_VAT_Assistant\WC_Aelia_EU_VAT_Assistant::instance()->is_eu_country($vat_country)) {
        // Calculate the cart total threshold of 150 EUR to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply('wc_aelia_eu_vat_assistant_convert', 150, 'EUR', get_woocommerce_currency());
        
        // If the cart subtotal is above 150 EUR, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);

    Snippet #2 – Apply a VAT exemption when selling goods worth more than 135 GBP EUR to UK customers

    /**
      * Apply a VAT exemption for orders shipped to the UK, whose value is above 135 GBP EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && ($vat_country === 'GB')) {
        // Calculate the cart total threshold of 135 GBP to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply('wc_aelia_eu_vat_assistant_convert', 135, 'GBP', get_woocommerce_currency());
        
        // If the cart subtotal is above 135 GBP, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);

    Question: What about Northern Ireland? Should the VAT exemption be applied when selling to it?

    Answer
    It is our understanding that there are two different regimes applicable to customers from Northern Ireland.
    1. Sellers from the UK and the EU apply VAT as they do normally, without thresholds.
    2. Sellers from outside the UK and the EU apply VAT to orders whose value is under 135 GBP, and a VAT exemption when the amount is above.

    The main challenge arises from the fact that Northern Ireland is not an actual country, but it’s part of the UK. Due to that, there isn’t a specific country code assigned to it. It should be possible to cover this gap with as follows:

    1. Use the following code snippet to make Northern Ireland a separate country:

    
    add_filter('woocommerce_countries', function($countries) {
      // "XI" is a special ISO code assigned to Northern Ireland. It can be used to handle that area as 
      // a separate country. It's also possible to validate VAT numbers starting with XI using the VIES system
      $countries['XI'] = __('Northern Ireland', 'woocommerce');
      return $countries;
    });
    

    2. Go to WooCommerce > Settings > Tax and edit the appropriate tax classes, adding a VAT rate for country code “XI”.

    This setup should be sufficient for sellers from the EU and the UK, and will have the following effect:
    1. Northern Ireland will appear in the list of countries at checkout
    2. WooCommerce will apply the corresponding VAT to the order, automatically.
    3. Customers from Northern Ireland will be able to enter their VAT number, starting with “XI”, and get a VAT exemption.

    Sellers from outside the EU need to perform an additional step
    Since Northern Ireland has its own ISO code, the snippet written for the UK has to be changed slightly to take that into account. The following snippet applies an exemption for orders over 135 GBP shipped to the UK or Northern Ireland:

    Snippet #3 – Apply a VAT exemption when selling goods worth more than 135 GBP EUR to customers from the UK and Northern Ireland

    /**
      * Apply a VAT exemption for orders shipped to the UK and Northern Ireland, whose value is above 135 GBP EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && (in_array($vat_country, ['GB', 'XI']))) {
        // Calculate the cart total threshold of 135 GBP to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply('wc_aelia_eu_vat_assistant_convert', 135, 'GBP', get_woocommerce_currency());
        
        // If the cart subtotal is above 135 GBP, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);

    The above should be sufficient to cover all the scenarios that we have been described.

    • This topic was modified 7 months ago by Diego. Reason: Formatting
    • This topic was modified 7 months ago by Diego. Reason: Fixed title
Viewing 15 replies - 1 through 15 (of 17 total)
  • OneTwo3D

    (@cyrix2000)

    I tried to implement the filter above in my functions.php but nothing happens (no VAT exemption is triggered when my shopping basket exceeds 150€). Is there anything else I need to activate/set somehwere to make it work?

    Update:
    I managed to get it workingin a very “basic” mode by reducing the if conditions and checks implemented down to this:

    add_filter(‘wc_aelia_eu_vat_assistant_customer_vat_exemption’, function($customer_vat_exemption, $vat_country, $vat_number) {
    if(WC()->cart->get_subtotal() > 150) {
    $customer_vat_exemption = true;
    }
    return $customer_vat_exemption;
    }, 50, 3);`

    It seems the check for:
    – VAT exemption
    – EU Country
    – currency conversion from basket currency to 150EUR limit
    aren’t working.

    • This reply was modified 6 months ago by OneTwo3D. Reason: updates
    Plugin Author Diego

    (@daigo75)

    It looks like there is a small error in the code snippets. Instead of calling apply_filters() to convert the threshold, the code calls apply(), which is an invalid function. The snippets below fix that bug.

    Snippet #1 – Apply a VAT exemption when selling goods worth more than 150 EUR to EU customers

    /**
      * Apply a VAT exemption for orders shipped to EU countries, whose value is above 150 EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && \Aelia\WC\EU_VAT_Assistant\WC_Aelia_EU_VAT_Assistant::instance()->is_eu_country($vat_country)) {
        // Calculate the cart total threshold of 150 EUR to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply_filters('wc_aelia_eu_vat_assistant_convert', 150, 'EUR', get_woocommerce_currency());
        
        // If the cart subtotal is above 150 EUR, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);
    

    Snippet #2 – Apply a VAT exemption when selling goods worth more than 135 GBP EUR to UK customers

    /**
      * Apply a VAT exemption for orders shipped to the UK, whose value is above 135 GBP EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && ($vat_country === 'GB')) {
        // Calculate the cart total threshold of 135 GBP to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply_filters('wc_aelia_eu_vat_assistant_convert', 135, 'GBP', get_woocommerce_currency());
        
        // If the cart subtotal is above 135 GBP, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);

    Snippet #3 – Apply a VAT exemption when selling goods worth more than 135 GBP EUR to customers from the UK and Northern Ireland

    /**
      * Apply a VAT exemption for orders shipped to the UK and Northern Ireland, whose value is above 135 GBP EUR.
      * 
      * @param bool $customer_vat_exemption
      * @param string $vat_country
      * @param string $vat_number
      * @return bool
      */
    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
      if(!$customer_vat_exemption && (in_array($vat_country, ['GB', 'XI']))) {
        // Calculate the cart total threshold of 135 GBP to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = apply_filters('wc_aelia_eu_vat_assistant_convert', 135, 'GBP', get_woocommerce_currency());
        
        // If the cart subtotal is above 135 GBP, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);
    OneTwo3D

    (@cyrix2000)

    Thanks Diego, that’s now working as it should 🙂

    Hi there @daigo75

    We are thinking of getting this plugin and then letting our developer carry out the changes to get it fully compliant with IOSS rules for 2021

    However, I noticed on your forum post that the plugin was never developed with IOSS in mind (as it wasn’t around then) and you are working on a new version.

    What is the time-frame on this new version as I don’t want to buy the plugin and then have my developer spend time playing around with the update/coding to get it up to date if you have a new version due out in the next month or so.

    Please advise

    Thank you

    Adam

    Plugin Author Diego

    (@daigo75)

    The original plan was to release the new product in the first quarter of 2021, but we had to focus on other tasks and that caused several delays. Our new plan is to have the new product ready in Q3 2021.

    In the meantime, you could still use the EU VAT Assistant as it is. The plugin itself is free, and the code snippets we posted can already help with the IOSS rules. Any custom feature you might want to implement should also work with the new plugin, as we are planning to keep backward compatibility in the new release.

    We would also be interested very much in a plugin that would make the newest EU VAT rules easy to apply to a woocomerce shop. There doesn’t seem to be any alternative or option around

    I think i’ve found one from:

    yithemes.com

    https://docs.yithemes.com/yith-woocommerce-eu-vat/installation/import-one-stop-shop-ioss/

    Check it out and let me know what you think…..

    Plugin Author Diego

    (@daigo75)

    @impressao3d Although it’s not specifically designed for that purpose, the EU VAT Assistant can already be used to apply the IOSS VAT rules, by using the code snippets from this article (see https://wordpress.org/support/topic/faq-oss-ioss-regulations-from-the-1st-of-july-2021-addendum/#post-14718709). The plugin is free, and code snippets are ready to be used, so you can give them a try whenever you like.

    Plugin Author Diego

    (@daigo75)

    @adamstewart001 we don’t know how the VAT plugin from YITH works. Due to that, we won’t be able to comment on its features. The best way to find out would be to try it.

    Please note that the EU VAT Assistant, in its current form, is in maintenance mode, while we work on the alternative solution that will replace it (see FAQ). Support for the IOSS regulations will be added to the new plugin, while the EU VAT Assistant will remain a solution for VAT MOSS (i.e. mainly for digital products).

    OneTwo3D

    (@cyrix2000)

    The workaround above stopped working again…

    • This reply was modified 5 months ago by OneTwo3D.
    Plugin Author Diego

    (@daigo75)

    There hasn’t been any change in the plugin in two months, and the code snippets were confirmed working three weeks ago, so they should still work. If they don’t, either someone removed them, changed them or there’s something else (some other code, or another plugin) interfering with the logic.

    jy313

    (@jy313)

    The snippet code don’t work unfortunately

    Plugin Author Diego

    (@daigo75)

    Our tests indicate that the revised code snippets we posted around a month ago, which fixed an error in the original ones, still work with the latest version of WooCommerce and, of course, the latest EU VAT Assistant. Nothing has changed, in our plugin, that could affect them.

    If they don’t seem to work, we would recommend to ask your developer to review them and check if there might be a conflict with some other element on the site.

    The snippet also doesn’t work for me.

    Changing the code to this:

    add_filter('wc_aelia_eu_vat_assistant_customer_vat_exemption', function($customer_vat_exemption, $vat_country, $vat_number) {
    
    	
      if(!$customer_vat_exemption && \Aelia\WC\EU_VAT_Assistant\WC_Aelia_EU_VAT_Assistant::instance()->is_eu_country('FR')) {
    
        // Calculate the cart total threshold of 150 EUR to the active currency
        // @link https://wordpress.org/support/topic/faq-eu-vat-assistant-and-multiple-currencies/
        $cart_total_threshold = 135; //apply_filters('wc_aelia_eu_vat_assistant_convert', 150, 'EUR', get_woocommerce_currency());
    
        
        // If the cart subtotal is above 150 EUR, apply a VAT exemption. The subtotal
        // is the sum of the price of each product, excluding VAT. This subtotal does
        // not include shipping costs, unless they are part of the product prices (in
        // which case, they do count towards the threshold).
        if(WC()->cart->get_subtotal() > $cart_total_threshold) {
          $customer_vat_exemption = true;
        }
      }
    
      return $customer_vat_exemption;
    }, 50, 3);

    – allows it work but obviously incorrectly. I have this working on a local dev setup with no other plugins running. It seems the $vat_country array is empty when the filter is called and wc_aelia_eu_vat_assistant_convert is not returning.

    • This reply was modified 3 months, 2 weeks ago by Heliocles. Reason: missed words

    Looking further into the code, the reason it isn’t working is:

    1. It requires you to have EUR currency conversion added in the admin – my shop is in pounds sterling so I would never have even looked into that if I hadn’t researched the log files. Thankfully you guys have a snippet which adds currencies as I found in another support thread.

    add_filter('wc_aelia_cs_enabled_currencies', function($currencies) {
      // Add currencies as needed
      return array('EUR', 'GBP');
    }, 10, 1);

    2. $vat_country is empty during filter execution due to code in file plugin-main.php:

    line 1156 $this->vat_country = '';

    and this variable doesn’t get set because the code requires an entered VAT number to continue:

    line 1166 if(!empty($customer_country) && !empty($vat_number)) {

    Anyone wishing to make the snippets work should copy the first snippet above to functions.php and amend line 1166 of plugin-main.php (inside the plugin’s folder and then inside ‘src’ folder) to read:

    if(!empty($customer_country)) {

    Although this will be overwritten each time you update the plugin.

    • This reply was modified 3 months, 2 weeks ago by Heliocles.
Viewing 15 replies - 1 through 15 (of 17 total)
  • You must be logged in to reply to this topic.