You can use the Address2 field for VAT number input. Just make sure to translate the theme language string to say what makes sense from your customer’s point of view. EU buyers already know that they need to input the VAT number so they are looking for it anyway. Also, you can make this field mandatory if you have only B2B customers.
Topic summary
EU merchants face a critical compliance issue: Shopify lacks native functionality to collect VAT/TAX numbers during checkout, which is legally required when invoicing companies in the European Union. This affects approximately 15% of customers for some merchants, with B2B-focused stores impacted even more severely.
Current workarounds include:
- Cart-based apps (poor UX as customers skip cart)
- Custom checkout code requiring Shopify Plus ($2000/month) plus developer costs or apps like Sufio ($40/month)
- Using address2 field with Shopify Flow to capture VAT numbers in customer notes
Recent developments:
- A previously mentioned native “Enable fields for additional information” feature in Settings > Checkout appears unavailable, even for Plus merchants
- Code-based solutions using metafields on cart pages recently stopped working, with Shopify support declining to assist
- New apps have emerged: “OO EU Tax Exemption” and “Checkout VAT Number” offer direct checkout collection, though pricing concerns were raised
Unresolved needs:
- Automatic VAT deduction for validated B2B customers
- VIES validation integration
- Proper intracommunity supply invoice generation
Merchants express frustration that this basic EU compliance feature remains unavailable without expensive workarounds, with some stating they wouldn’t choose Shopify for European B2B operations.
Hi Nimrod,
Thanks for your input. ![]()
Yes, that will soon be the only solution left. I have made the change as you have suggested. But it is not just straightforward, as our integration into our accounting system also needs to be adjusted.
As mentioned earlier, I used the method with meta fields (this code in the cart.lic file (Name can be different):
)
which worked well as you could also check the user’s input. Unfortunately, it doesn’t work anymore. If you could be sure that this solution would work, we were already well on our way.
There’s not much help available from Shopify’s support. ![]()
Then again. If anyone has had the same challenges with the META field solution and found a solution, we would like to hear from you.
![]()
Well, this is exactly what we are doing. It’s faster to do the adjustment to accounting software than to expect Shopify to solve this issue anytime soon :))
I don’t know if the following issue has already been resolved, but I’ve found a small/temporary solution, at least. You can translate the ‘adress 2’ field in the translator to ‘vat number.’ The drawback, however, is that it doesn’t get saved properly in the correct field. For this, I’ve come up with the following solution: creating a metafield at the ‘customer’ level and then, using the ‘flow app,’ when an order is created and it contains the ‘address 2’ field (in our case, the VAT number), then save it in the metafield that was previously created at the ‘customer’ level.
Now we have our custom metafield “vat number” filled with the correct vat number information.
I hope this provides a small solution ![]()
Do you mind elaborating on the flow method? so you use a trigger, condition and action. The action in this case would be “update customer metafield”? Regarding the condition, do you use “order.billingAddress.address2” as a sole condition, or also the “order.shippingAddress.address2” as an additional “or” condition? If you could break this down into baby steps, you’d save some lives. Thanks for the tips though, currently working on the implementation. Feel free to drop it a a screenshot or 2 ![]()
To everyone stuck with this problem: Make sure to edit the address2 name to VAT/TIN/ whatever you need at online store → edit default theme content and not via a translating app, as the app solution somehow won’t display the changes on the checkout screen.
Update: I fixed the problem with a very similar approach. Creating a metafield works but I had no idea what to do with it as I signed up for the Sufio invoicing sotware. Luckily you can edit the invoice design code there and so I made a technically SUPER ugly workaround but the invoice looks perfect now.
So if you work with Sufio and want the invoices to work for EU:
-
Translate the addressline2 field on the checkout to “Add VAT”/TIN/whatever tax info you need
-
Go to the flows app and select “order created” as a trigger → "check if…
order.billingAddress.address2 not empty and exists → “Update customer note” with “{{order.billingAddress.address1}}” and “update order note” with “VAT(or TIN/EAN,…): {{order.billingAddress.address2}}” aka. add 2x “do this” flow, 1 for each
-
Go to Sufio → design → Edit code
-
Modify the client addres ID to show the customer note where we isolated address line 1 :
{{ customer.note.text }} -
Add the isolated VAT/TIN/… which we stored as the order note below by adding this piece of code:
{{ order.note.text }}
This solution took me 4.5 hours of mental madness inside a polish shopping mall co-working space. F you shopify, but we made it.
No idea how it’ll affect me expanding to other countries later though but by then I should be able to hop on shopify plus so we’ll see.
Hi All,
Since this thread is still active, I will share our latest solution working with webhooks.
This comes in handy when you are not using sufio as an in between app, but if you want to link to an ERP for example.
We use a cart drawer or a cart page in this case:
- In the cart drawer we have a checkbox “Need an invoice?”
- Once clicked you can only submit with a valid VAT number filled out
- We validate the VAT number (vies validation)
- You can proceed to the checkout
- The VAT number is then stored as an order note
- We have a webhook on “order creation” that checks for the VAT number and moves it over to a customer metafield
- This field can than be mapped to the client VAT field in the ERP software
Excellent addition!
Also, just figured that you can capture it with a product personalization app like “live product options” by adding a custom field below the product variants. Might help someone depending on the product you’re selling.
Just one question: What do you use to create that checkbox field? I tried some apps but since I’m using the debutify theme I seem to have some problems adding code to the drawer.
You’ll need to add the html to the cart-drawer.liquid file
Assuming you’re a registered business in Germany, and you sell B2B to Austria, this would mean an intracommunity supply, which is tax free. However, having the b2b customer filling in the VAT number, will not have the Taxes deducted from the checkout?
I thinks it’s such a standard thing to ask, why is @Shopify_77 not able to solve it appropriately?
I do not sell to Autralia. I’m registred in Denmark (EU) When companies sell B2B inside EU they must collect VAT number for documentation to the TAX autority. This is why, when you sell goods B2B inside EU without taxes, but you must to document this.
I wrote Austria, not australia ![]()
So I know the problem. However, I think just collecting the VAT number is not enough as it would not deduct the VAT from the b2b customer automatically?
what we need it
-
enable b2b customers to fill in company name and VAT-number at CHECKOUT not at cart
-
If VAT is correct (VIES approved) deduct the VAT for the customer
-
Create in voice including the intracommunity supply.
Or how do you subsctract the VAT after the VAT-number was filled in?
Sorry about Austria… ![]()
We only sell to B2B.
We have a delivery setup without TAX. Invoices at handle in an externel services.
Therefore agree with 1 and 2.
Yes, this is cumbersome. Here in Germany, when you sell B2B to Germany you have to collect VAT but not when it’s to any other EU country. Shopify always charges VAT for sales to any EU country if your shop is within EU.
After some back and forth with their support, the workaround we now use is:
- Define a manual collection with all your products. Yes, it has to be a manual collection, an automatic one won’t work for this.
- Define a product tax override for this collection for every EU country that is not yours. For that go to the online shop settings - Taxes and duties - select European Union, go to Product Overrides in the section Tax Overrides, click on Add product override, select your “all products” collection, the EU country and set the tax rate to 0%.
In case you define a new product don’t forget to add it to this collection.
Ugly, but it works and we don’t have to manually deduct the VAT from the invoice. BTW the tax estimate calculator currently doesn’t properly calculate the VAT based on country alone, but it is correct once you have filled out the complete address and it is validated.
Awesome, thank you very much for this workaround.
I assume it works perfectly fine for b2b customers, but what if you sell to b2b and b2c ?
You’re welcome and please don’t hesitate to “thumbs up” my previous post if you found it helpful. Newbie here who can use the rep. ![]()
As for b2c and b2b, if I had to sell to both I’d use separate, dedicated storefronts and GitHub to synchronize the theme. Products synchronized by export/import if necessary. This of course with any of the cheap basic plans. I hear that Shopify Plus has a lot more functionality built in but it’s “not for us”.
This is exactly what we need also. I know many websites have it so there should be an easy way to do it (without the need of touching the code/hiring someone to do it).
Could they share the html code needed to create this field?
Hey dropshop, we are currently working on a b2b store, maybe you think you can help us to create the setup? We are a German company creanimation.de — would be super great to write via mail or have a call
best, Fabian