Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

handy_man's avatar

New VAT rules for the EU

How do people deal with these rules when charging users through something such as Stripe and cashier? Selling services to EU customers now requires that you know what to charge them in terms of VAT.

My SASS application that is yet to launch will be surely incredibly affected by this change? I didn't intend to register for VAT or charge it unless the business went above the £81k a year threshold that the UK has for small businesses in which case I would have to.

but with the new EU law I need to know where each user is registered in terms of country and charge them VAT based on their country of origin. How can I implement this into the SASS app with Stripe doing the subscriptions etc?

If this post makes little sense please see: https://www.gov.uk/government/news/digital-services-suppliers-urged-to-register-for-new-eu-vat-service

There's quite a bit about this online, but how does this affect the use of SASS applications for small businesses such as Laracasts?

0 likes
8 replies
christopher's avatar

Dont forget - if the user has a valid VAT ID you dont have to charge the tax. Only if the user does not have a VAT ID you have to charge the tax from the country of the user.

You can check a VAT ID of a user/company here: http://ec.europa.eu/taxation_customs/vies/?locale=en ( i think they have an API to do this, but dont really know )

Unless you have hundreds of customers you could do it manually.

If you charge with stripe of course you have to pass the tax to stripe depending on the country of the user.

I really think there must be a table or something like this which lists the tax % of each country.

Basically its simple: If the user signed up and select the country germany you have to charge the 19% tax. You could make your table with the country codes and tax.

Then if he subscribes, you get the tax related to the country and pass it to stripe e.g

"tax_percent": $user->country->tax,

https://support.stripe.com/questions/handling-tax-on-subscriptions

1 like
handy_man's avatar

So essentially as I thought I'm going to need to have a list of all tax percentages and store them in my local DB and then charge based on what the user gives me as their username.

This just adds a massive pain to the entire process... especially when this is such a small business starting out I understand I'd have to deal with all TAX issues later on. Only then when the business reached 81k a year, but at that stage it would probably be a full time job so not such a bad deal.

Looking at the link provided by Stripe, what are the benefits of using one of the systems Stripe suggests? I only plan on using stripe for the payments so is there a best option for dealing with Tax Automatically? or will it simply be a database interaction as indicated by @kayyyy ?

londoh's avatar

@handy_man

I've also been looking at this some.

yea its a mess and I dont think its as quite as 'simple' as @kayyyy suggests ;-)

Here's some stuff I think might be true: maybe: perhaps:

If you try to figure out customer tax country yourself you have to get 2 confirmations of it. For example: they fill out a form with address and country, and you cross ref with their IP.

But as I understand it if you are using Stripe you can use one of the packages they suggest for a modest fee, and that auto takes care of figuring out where the customer is and what tax rate they are liable for

Since you're in the UK if you register with HMRC VATMOSS - ("VAT Mini One Stop Shop" - yuck,gag. or VATMESS as I've seen it written!) that avoids you having to register with all member states and make 28 vat returns. You just make 1 return to HMRC and they deal with dishing it out.

If you register with VATMOSS and your sales are less the current small biz VAT threshold (£81k ?) you dont have to charge/pay VAT on your UK sales.

There has also been a lot of discussion about whether or not you have to register as a "Data Controller" with the Information Controllers office ( https://ico.org.uk ) in order to comply with this.

My understanding at the moment is that probably you dont need to be a Data Controller. But if it is the case that you confirm customer location yourself and are therefore storing customer personal data - you might have to register and then you have to keep detailed records of transactions for 10 years.

Its also worth mentioning that according to my lay understanding of the EU rules on this sh!t Jeffrey (yes... J. Way in the US) is also obliged to charge VAT at the appropriate rate to his EU customers and hand it over to the EU - its a joke yea? oh no they are serius!

Regards

l. disclaimer: my opinions are my own and often wrong, and I am not a lawyer or an accountant or any of those things. Its worth keeping in mind that most UK lawyers and accountants will give a free initial meeting - book some and get your questions prepared before you go!

christopher's avatar

I found this service: https://vatapi.com/

looks pretty straight forward.

But you are right - its a mess to handle this stupid vat rules from this damn EU - particularly if you have a small business :D

1 like
mpociot's avatar

Hey @handy_man and everyone else interested in this topic,

As @stefanverweij mentioned - you should take a look at my VAT Calculator package. It's especially targeted at SaaS applications.

The package doesn't handle reduced taxes, but since it's built for e-services this doesn't matter. It has support for VAT-ID validation, IP 2 country lookup and cashier integration:

use Laravel\Cashier\Billable;
use Mpociot\VatCalculator\Traits\BillableWithinTheEU;
use Laravel\Cashier\Contracts\Billable as BillableContract;

class User extends Model implements BillableContract
{
    use Billable, BillableWithinTheEU;

    protected $dates = ['trial_ends_at', 'subscription_ends_at'];
}

So you can use:

$user->useTaxFrom('NL')->subscription('monthly')->create($creditCardToken);
1 like
Reached's avatar

I can highly recommend @mpociot's package for handling this with Laravel :)

1 like

Please or to participate in this conversation.