There is a nice WooCommerce function you can use to exempt someone from Tax/VAT calculations. You could, for example, enable exemption once they enter a Tax/VAT number, or maybe if they specify a given ZIP code.
Such function is called set_is_vat_exempt(), and together with a little trick to “get” a checkout field on the go, the snippet is pretty simple to build and test. Enjoy!
PHP Snippet: Remove Tax @ WooCommerce Checkout if Field Value Exists
Explanation of the Code:
- Hook:
- The first line uses
add_action
to hook the functionbbloomer_taxexempt_checkout_based_on_zip
to the actionwoocommerce_checkout_update_order_review
. - This means the function will be executed whenever the checkout review is updated during the checkout process.
- The first line uses
- Function
bbloomer_taxexempt_checkout_based_on_zip
:- This function takes an argument
$post_data
which is an array containing the data submitted during the checkout update.
- This function takes an argument
- Reset VAT Exemption:
- Inside the function, the line
WC()->customer->set_is_vat_exempt( false );
resets the customer’s VAT exemption status tofalse
initially.
- Inside the function, the line
- Parse Checkout Data:
- The line
parse_str( $post_data, $output );
parses the$post_data
into an associative array named$output
. Each key in the$output
array represents a field name from the checkout form (e.g.,billing_postcode
).
- The line
- Check Billing Postcode:
- The
if
statement checks if the value of thebilling_postcode
key in the$output
array matches the specific code'32444'
.
- The
- Set VAT Exemption (if matched):
- If the postcode matches, the line
WC()->customer->set_is_vat_exempt( true );
sets the customer’s VAT exemption status totrue
. This will potentially affect the calculation of taxes during checkout.
- If the postcode matches, the line
In summary, this code snippet checks the billing postcode entered during checkout. If it matches the specified code, the customer is marked as VAT exempt, potentially impacting the final checkout total.
/**
* @snippet Remove Tax if Field Value - WooCommerce Checkout
* @how-to Get CustomizeWoo.com FREE
* @author Rodolfo Melogli, BusinessBloomer.com
* @testedwith WooCommerce 8
* @community https://businessbloomer.com/club/
*/
add_action( 'woocommerce_checkout_update_order_review', 'bbloomer_taxexempt_checkout_based_on_zip' );
function bbloomer_taxexempt_checkout_based_on_zip( $post_data ) {
WC()->customer->set_is_vat_exempt( false );
parse_str( $post_data, $output );
if ( $output['billing_postcode'] === '32444' ) WC()->customer->set_is_vat_exempt( true );
}
The code doesn’t work in 2024. I’ve tried it and there is no error and issue and still doesn’t work.
Actually, it works perfectly and sets the tax to $0 – it must be something else
For me, the “Tax” field disappears completely. Is that correct? I would like it to be displayed as “Tax 0% – 0,00€”.
Is it possible? Thank you very much for your time.
No, this does not hide the tax, it sets it to 0. So it must be something else
Hi, what if i need this to work if a specific field is not empty? What would this line look like?
So, I’m using the following code since I have a custom field with a dropdown options: “Residential” and “Commercial” with name: billing_category but it’s not updating the Checkout page.
What am I doing wrong?
Hi Obaidullah thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
How to remove tax on specific payment gateway selection?
Hi Ankit, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hi Rodolfo, i tried with this code for a custom field with value of Yes or No, thats mean add tax or not, its working fine, but how could i refresh total price alfter the selection changes? The post code field could refresh the total price as what it is with woocommerce, but i’m looking for a solution for custom field.
Thanks a lot
Hi Enzo, you need to rename your custom field ID or name (don’t remember which one, so try both). Make it start with “billing_” or something like that. Let me know if that does the trick
Hey there! this is my adapted version of the code so that it only charges tax in NZ (New Zealand), I’m trying to make it so that instead of the tax being removed as such, the total value stays the same, it’s just not labelled as tax.
For example:
In New Zealand the tax rate is 15%, it’s known as GST.
I want to sell a product for $20.
So when I sell said product for $20 in New Zealand, I receive $17 after GST/Tax.
When I sell the same product to someone in Australia, or Canada (or literally any other country), I sell it for $20, and recieve $20 with no tax charged.
How can I adapt my code to do this?
Thanks,
Ben Elwood
Hey Ben, if I understand well, you can do that from the Woo settings alone without code
Hi here is my code with changes:
I added isset to not give php error and check if Vat is set.
and check if country is not spain. Code gives 0% Vat based on correct Eu Vat number
combining it wit EU VAT assistant plugin which checks VAT number in VIES
Nice!
Thanks, and thanks for the snippet
Hi I would like to ask what if instead of postcode, I want the whole Oregon State? How to do that?
if ( $output[‘billing_state’] === ‘oregon’ ) WC()->customer->set_is_vat_exempt( true ); is not working.
Please help. Thank You.
You need the 2-letter state code there
Hi Rodolfo,
Thank you for your contribution.
I used this snippet to disable tax from users outside EU, based on their choice on invoice dropdown field,
Although tax is disabled on checkout page. On payment success page the total includes tax.
Thanks George. Is the customer charges the right amount once they pay? If yes, than maybe it’s only a display issue that would need to be fixed either by me or by you (try disabling ALL plugins but WooCommerce and test again)
Hi, The code didnt work for me. THe code still working?
Yep, try disabling all your plugins and theme temporarily and test again
I think the problem is the plugin multi step checkout.
How do I get the direct value of the input in the onchange event or something? Because the value is not changing when I change the field value. I have to press F5 to work.
Hello there, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Man… I am just not good at this… but I really need this function if a simple checkbox is checked upon checkout. Is it as easy as creating a checkbox and applying custom CSS to the checkbox??
Matt, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
update the function please
Error:
parse_str(): Calling parse_str() without the result argument is deprecated
Done, thank you. Can you test again?
So this works on the checkout page, but the second I actually go through with the order and hit the order-received page the order includes a VAT value that’s saved in the record and will mess up our accounting.
What else do I need to tweak to make this work?
Hi Jason, thanks so much for your comment! Yes, this is possible, I haven’t tested it after checkout. It can be fixed in case it’s not a plugin/theme conflict but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hi ! I’m trying to set the tax 0 if the billing company field is set, but I don’t know how, can you help me?
Thank you so much !
Hello Jose, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hello!
How can I make this work if I want students and non profits with tax ID to be exempt at checkout without having them to register as users?
thank you!
Hello George, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hey,
Thanks a lot, I am using your solution and many other piece of code you share. I have noticed a undesirable behaviour of this code: if customer go back and forth between the payment page and the checkout page, a new custom field is_vat_exempt is set. That means that this custom field add up. I had the case where there was so many of them that it broke the payment validation. Is there a way to make sure there is a unic is_vat_exempt custom field for a given order?
Hi Jonathan – if you remove my snippet does that happen as well? If yes, and if you disable all plugins but Woo and swith temporarily to 2017 theme, does that happen again? Let me know
Hi. I am trying to use this on a custom radio button, but it’s not working.
Here is the code for the button which works.
But the code to remove the taxes isn’t working for me. I probably did something wrong.
Hi Boston – it could be your field is not “posting” or that the $post_data variable needs to be debugged. Let me know
I love this script and it works as expected, would that work with any other fields? I have added a custom field and I want to remove the tax when a checkbox is checked.
Thanks Nik 🙂 Yes, it should
Hi Rodolfo,
Great Code!
is there any way to update product subtotal too?
Thanks
Hello Sigma, thanks so much for your comment! Yes, this is possible – but unfortunately this is custom work and I cannot provide a complementary solution here via the blog comments. Thanks a lot for your understanding! ~R
Thanks Rodolfo, I use your code but unfortunatly it doesn’t work when you place an order. The thank-you page diplays the price with the tax even if at the check out it’s zero. Don’t know why… 🙁
Hey Federico 🙂 Try disabling all plugins and switching theme temporarily – does the snippet work then?
Hi Rodolfo, I have same issue of Federico. On checkout form your snippet works as expected, but on Thankyou page taxes are not exempted and the same happens on admin order page. I tried deactivating all plugins and changing theme but with no luck. How can i do to solve the issue?
Thanks, Fabrizio
Hey Fabrizio, thanks for your comment! I just tested this again with Storefront theme and it works perfectly. Maybe your theme (or another plugin) is messing/conflicting with my snippet?
To troubleshoot, disable all plugins but WooCommerce and also switch temporarily to “Twentyseventeen” theme (load the snippet there in functions.php) – does it work? If yes, you have a problem with your current theme or one of the plugins.
Hope this helps!
R
Hi Rodolfo
excellent snippet
one question , would this work for specific category of products ?
thanks in advance
Thanks for your comment John! I suggest you take a look at “conditional logic”: https://businessbloomer.com/conditional-logic-woocommerce-tutorial/ and https://businessbloomer.com/woocommerce-conditional-logic-ultimate-php-guide/. Let me know 🙂
Dear Rodolfo Melogli,
Many thanks for this contribution! It works when I apply this rule to the following fields:
billing_address_1
billing_postcode
billing_city
Unfortunately it doesn’t work when I want to apply it to any other fields. Somehow those fields don’t get validated automatically. In face I want to apply it to a new field which is the tax number of the customer. Once the customer has entered a tax number the additional tax should be removed.
Can you help me? Many thanks in advance!
Best,
Matthieu
Matthieu, thanks so much for your comment! Unfortunately this is custom troubleshooting work and I cannot help here via the blog comments. Thanks a lot for your understanding! ~R
Hi ROdolfo, is there a way to Remove Tax if customer selects payment method cash?
Thanks,
Sandra
Sandra, thanks for your comment! Yes, there is of course, you will need a little edit to the PHP of this snippet. Unfortunately this is custom work and I cannot provide a complementary solution here via the blog comments. Thanks a lot for your understanding! ~R
Hello dear Rodolfo,
you are great! Can you please give example how to use this function with Tax/VAT number field? I have setup field for UIC, but i have to remove VAT for order outside the country when VAT number is entered…
Thank you for this awesome piece of code! 🙂
Hey Vladimir, thanks for your comment! You’ll need to change the line:
… with the name of the variable generated by your new Tax field, which is custom to your code and I can’t help with in here I’m afraid! 🙂
How about hide Sale Tax if Sale Tax is zero?
Hey Vuster, thanks for your comment! I’m not sure I fully understand – could you send over a screenshot?
I agree. In some stores, there is no tax at all… yet WooCommerce still shows Tax: $0.00 in cart and checkout. I’d like to hide the Tax row if there is a $0 tax value for the cart/order.