How to correctly setup SaaS subscriptions to charge VAT in Europe
If you think you can just setup a simple Stripe integration and move on, like us, you’d be sadly mistaken.
I remember like it was yesterday, we were beginning to plan for our paid subscriptions launch and needed to integrate a payments provider. Allocating two weeks should easily be enough right? Stripe must have it covered. I mean, we’re not the first European company to offer paid subscriptions, there has to be a step by step process to follow… 🕳🐇
and down the rabbit hole we went, and it got deeper and deeper.
In this article, I’m going to share some of our research and findings so that you have a good overview of how to approach the process for your SAAS business and hopefully save your hair.
First, let me briefly describe the kind of online service we offer to be sure that it can relate to your needs. As a German software company, we are a part of the EU and the creators of Tempo; an email client that can be used for business (B2B) and personal use (B2C), by individuals and companies worldwide.
We wanted to be able to offer a monthly and annual licence (possibly tiered), purchased using a credit card. Later, it would be great if it can support digital wallets such as Apple pay, Wechat, Alipay etc., and we also anticipate the ability to offer discount codes, and licence keys for group payments. We also wish to offer a trial period without the need to enter a payment method up front (speaking from our personal peeves when that trial expires, you’ve forgotten to cancel and get billed).
All of these needs pointed to Stripe, which we had already tried out for our early supporters program but to begin to offer real subscriptions to customers in Europe, VAT needs to be calculated and reported. Surprisingly Stripe does not directly offer this service yet (they do have third party integrations and I’ll touch on those a bit later on).
There are 44 countries in Europe, and different rates of VAT apply in the EU member states, ranging from 17% in Luxembourg to 27% in Hungary (Source of truth for all countries by PWC ). This would need to be calculated in real-time during checkout. Then depending on if the sale is to a proven corporation or non-corporate (individual) and where they are located, the checkout process varies:
1 Non-corporate within EU.
VAT rate applied from buyer’s country.
2 Corporation within EU (not Germany)
No VAT is applied so long as a valid VAT number is provided (yep it needs verification). The invoice should state that the reverse charge rule applies and thus the turnover is subject at the place of the recipient’s service.
3 Corporation (and non-corporate) within Germany
German VAT 19% is applied
4 Non-corporate / Corporate outside of EU
N̵o̵ ̵V̵A̵T̵ ̵a̵p̵p̵l̵i̵e̵d̵.̵ ̵I̵n̵v̵o̵i̵c̵e̵ ̵s̵h̵o̵u̵l̵d̵ ̵s̵t̵a̵t̵e̵ ̵t̵h̵a̵t̵ ̵t̵h̵e̵ ̵s̵e̵r̵v̵i̵c̵e̵ ̵i̵s̵ ̵n̵o̵t̵ ̵t̵a̵x̵a̵b̵l̵e̵ ̵i̵n̵ ̵G̵e̵r̵m̵a̵n̵y̵.̵ Correction — VAT can be applicable. Using an MoR will determine and charge this for you automatically — e.g. in New York USA it’s 8.875%
Invoice requirements (in Germany)
- All of our company details
- Invoice date, Invoice Number
- Customer’s name, Company name (if applicable), Address
- Description of service supplied
- Tax ID (Optional)
- Price without VAT, VAT rate, total VAT amount, price with VAT
Double check that your chosen payment provider can correctly configure the invoices to be compliant in your country.
For every VAT payment, the sum must be reported to the relevant tax authority in each EU country where it was charged. So in the case that you have 20 non-corporate customers in separate EU member countries, you will need to report the income to those 20 tax authorities.
The tax declaration to the authority in your registered country needs to include the following:
- Total sales and purchases
- VAT owed
- Amount of VAT to be reclaimed
- VAT refund due
Note — you must keep records for at least 10 years to show you are EU VAT compliant.
Luckily, there’s a scheme called VAT MOSS (Mini One Stop Shop), an online portal that helps you combine every single one of your EU VAT payments into one single tax return via the tax authority of your choice. That tax authority will then deal with the distribution of funds to each EU member state.
The MOSS registration takes some time so aim to have everything in place before you start issuing invoices. Check the process in your country. In the UK you must have MOSS registered by the 10th day of the month after your first sale. (e.g. first sale 8 Jan, registered by 10 Feb). Post-Brexit, I guess that the UK will be treated as if it were a non-EU country, but again no one knows for sure what the heck will happen, watch this [________].
The 3 main options for handling VAT
- The most convenient solution is to use a Merchant of Record(MoR) who acts as a reseller for your SaaS and handles the payment, invoices, tax, and handling of the tax. Examples: Paddle, Fastspring.
- Use a third party tax SaaS service that integrates with your chosen payment gateway (e.g. Stripe, Braintree, Gocardless) to automate invoicing at the correct rates as well as providing ready to submit tax reports. Examples: Quaderno, Octobat. You then handle the tax registration and remittance of taxes yourself. An exception is Payhip which submits tax reports and remits on your behalf.
- Do it yourself (DIY) solution: Input the relevant tax rates to your chosen payment provider. Potentially using APIs from Taxlayer or Avalara. Stripe Checkout “setup mode” also allows this. Register and remit yourself.
You might be thinking “what about, Chargebee, Recurly and Chargify?” I won’t cover these as they are neither a payment gateway, or MoR — they specialize in managing your subscription and billing logic and therefore add another layer in the tech stack. Note that Stripe Billing can also handle subscriptions.
We decided we didn’t want to add third parties (no.2) into the mix so we looked deeper into the custom setup process with Stripe Checkout (no.3) and MoR providers (no.1).
Handling VAT with Stripe Checkout
Stripe Checkout allows you to create tax rate objects for every EU location from the Stripe dashboard. When a user subscribes and enters an address and VAT id (if any) they can check if there is a tax rate object and apply it. Stripe validates any given VAT number against VIES (the VAT Information Exchange System) to prove the number is verified, after which the webhook is received, the customer is changed to “reverse charge” and is charged without VAT.
Note that VIES is a government system that has been known to be down for maintenance,🙈 so you might want to account for how you handle that in the checkout flow.
It can also happen that countries change their VAT rate (like with the recent COVID-19 event) and this needs to be updated manually. Note that you cannot change an existing tax rate object, so will need to create a unique one e.g. Germany-COVID.
Our contact told us that they kept their fees all charged in EUR and not adapted to the customer’s local currency and they made the decision that all prices were tax inclusive. For reporting of transactions with VAT (which isn’t handled directly by Stripe) they used MOSS.
Stripe 1.4 % + €0.25 for European cards, 2.9 % + €0.25 for all others. If currency conversion is required, an additional 2% fee will apply.
Time: 5 to 10 days (does not include trial/account creation/etc.)
How: Create a page on your website with the form to enter the address and VAT ID, after which you redirect the user to the Stripe Checkout.
- Huge $2B valued company ($1.6B in funding!) — isn’t going out of business anytime soon.
- Developer friendly, test environment within account, great documentation
- Localized prices
- Great for selling in single or very few markets where manual VAT handling is less hassle
- The biggest hurdle for doing business in Europe is that Stripe does not automate VAT for you out of the box. Tax handling is a big gaping hole here in Europe.
- Have to build your own form to collect the location of the user + VAT ID in order to determine the tax rate which you then can pass along when you redirect the user to the Stripe Checkout.
- Stripe issues invoices for every transaction which can get messy.
Given the size of Stripe, we were quite surprised that they didn’t have a resource doc to clarify the process of managing VAT with European customers. It required a fair amount of research on our own and back-and-forth with their support staff.
Using a Merchant of Record (MoR)
This all-in-one solution piqued our interest — no need to build another layer on top of Stripe, pay for third parties or spend time manually working with an accountant. A MoR handles the entire customer billing journey and tax processes on your side. You only receive one invoice from them per month instead of after every transaction.
Ultimately, at this stage we’d rather spend our time making the core product even better than trying to optimize/customize every inch of our payment flow or deal with manual reporting .We decided to go with Paddle over Fastspring for a few reasons. Mainly due to their EU location, lower cut per transaction, and as they don’t prevent you from taking your customer data to another service if you decide to switch (more about this here).
Fee: 5% + $0.5 per transaction (excluding reversals, refunds and other chargebacks)
- MoR — on top of payments processing, all VAT handled for you. Weeee!
- You receive an invoice 1x a month with what paddle owes you as opposed to every transaction with Stripe.
- Tech team is receptive to feedback and make strides to improve
- No customer portal — for a customer to view all invoices, or manage their account you need to build you own page using APIs from Paddle
- No sandbox environment for test accounts with dummy credit cards. Paddle can manually setup a separate account but there is a limit of $100 before the risk team will start contacting you. Kinda inconvenient.
Some quirks collected from the Paddle customers we spoke with:
- When creating plans, make sure you add a quantity. You can’t move users from plan with quantity 0 to quantity 1
- Paddle creates reverse invoice (2nd week of the month)
- Coupons you or your customers apply do not take VAT into account
- You get 10 characters to put a name on an invoice
- Their trial system might not be up to what you need so consider building your own. Issues: Their trial required credit card credentials upfront. When a plan has one or more subscribers you can’t change trial length. You can’t move people to different plan when on trial. No buy now button so users need to wait to trial expires to pay. Paddle sends 5 emails to users during trial
- Checkout flow has its quirks: strongly worded legal language, 1 styling for all products, if offering only one payment option it still includes a back button to change payment option
- No 2 factor authentication for dashboard
- From the subscriber’s view you can’t see if a customer is using a coupon, you’ll need to click into each order to see
- All sorted data by database entry
So that’s it for now, easy right?! 😅 Once we’ve launched payments and had a few months of transactions under our belt, we may share more direct insights and learnings. Until then, now’s a great time to give Tempo’s free beta for Mac a whirl. Yourtempo.co 💌
Thanks to those who took the time to share their insights of Paddle and Stripe with us 🙏 Valerio @ Framer, Kilian Valkhof @ Polypane, Derrick Reimer @ Savvycal, Patrick @ Zentered, Robin Warren @ Corrello, Dominik Tobschall @ Speedinvest.
I recommend to read the full discussion from July on Indiehackers, and this larger overview of SaaS payment platforms on CourseMaker. Lastly, this July post by Mergify talks about how they moved back to Stripe after some time with Paddle.
We’re also curious to learn about your experience with handling VAT payments for your SAAS business. Please drop your comments below.