Foreign VAT and GST From Stripe Tax in QuickBooks
Stripe Tax collects EU, UK and Canadian VAT/GST in your Price currency, and QuickBooks holds it in one dollar account. How to split it and handle FX at...
A US company that sells software, courses or other digital products online usually meets foreign tax the same way: a customer in Germany, London or Toronto buys something, and it turns out the seller owes VAT or GST there from the first sale, or close to it. Stripe Tax can register those places, calculate the tax at checkout and collect it. The bookkeeping question comes after, and it is the one nobody warns you about.
On a US QuickBooks company, every one of those taxes tends to land in the same liability account as your state sales tax. That account is in US dollars. The returns are not. The EU return is in euros, the UK return is in pounds, the Canadian return is in Canadian dollars, and the amount you actually pay each authority will not match the dollar balance you were carrying for it.
This guide covers that situation from the bookkeeper's side: what Stripe Tax does for EU, UK and Canadian registrations, why all of that tax ends up in one QuickBooks account, how to split the account at filing time using Stripe's exports, and what happens to the currency difference when you pay. It is bookkeeping guidance, not tax advice. Whether and where you have to register is a question for each tax authority and your accountant.
Start a free trial to bring Stripe Tax amounts into QuickBooks automatically, so the filing-time split is the only part you do by hand.
What Stripe Tax does for a US business selling abroad
Stripe Tax calculates and collects tax in places where you have added a registration. It does not register you, and it does not file for you unless you use a filing partner. For a US business selling digital products, three registrations come up most often.
The EU, through the non-Union One Stop Shop. Stripe's EU tax guide says a business based outside the EU "might need to register to collect VAT from your first sale in an EU country." Instead of registering in every member state, a business selling services to individuals can use the non-Union OSS: "You can choose which EU country you register in," and you "only need to submit one return for all your EU sales to the country you registered in." The tax is still charged at each customer's local rate. Only the paperwork is consolidated.
The United Kingdom. The UK left the EU, so OSS does not cover it. Stripe's UK page puts the threshold for a business based outside the UK at one transaction: "you must register in the UK within 30 days of performing the first taxable transaction there." Sales to UK businesses fall under reverse charge and do not count as taxable transactions, so a seller with only business customers does not need to register.
Canada, through simplified GST/HST registration. Stripe's Canada federal page lists the registration threshold as 30,000 CAD per rolling 12 months and says a business based outside Canada that sells "digital products or services to Canadian individuals" completes "the simplified GST/HST registration." Under that regime, "You don't charge GST/HST on sales to business customers who provide their GST/HST registration number." Provincial taxes such as QST are separate registrations with their own rules.
All three share one pattern that matters for the books. Business customers who give you a valid tax ID usually pay no tax at checkout. For EU customers, Stripe says that when an eligible customer "provides their European VAT number in Stripe, we treat their transactions as a reverse charge and don't calculate tax for them." No tax is charged, so nothing reaches your liability account. The sale still exists, and Stripe's exports mark it with a taxability_reason of reverse_charge.
Why all of it lands in one QuickBooks account
On a US QuickBooks company, the place Stripe Tax amounts usually end up is a single liability account, and the reason is QuickBooks, not Stripe.
QuickBooks' US Sales Tax Center does not let a third party create official tax rates. So the documented way to bring Stripe Tax into a US file is a tax product: a non-inventory item called something like "Sales Tax," tied to a liability account. Acodei calls this its Tax Product method. Every Stripe Tax amount on an invoice or receipt is rolled into one line on that product, and the line posts to the liability account. Acodei's own guidance says that for a US QuickBooks company the Tax Product is usually the only workable method, and that you use Stripe's tax reports for the breakdown when it is time to file and pay from the liability account.
That was built with US states in mind, and it is fine for them. When the same company adds an OSS, UK or Canadian registration, nothing in the setup changes. German VAT, UK VAT and Canadian GST all arrive as more amounts on the same "Sales Tax" line and post to the same account, next to the Texas and Washington sales tax that were already there.
The setup is not wrong for doing that. QuickBooks is holding exactly what you collected, in dollars. What the account cannot tell you is who you owe it to, and in what currency. That information lives in Stripe.
Non-US QuickBooks companies have a different option. They can map individual Stripe tax rates to QuickBooks tax codes such as "GST 5%" and use QuickBooks' own tax reports. If your company is set up in the US, that route is generally not open to you, which is why this guide assumes the single account.
The currency problem hiding in that account
Stripe is precise about which currency every tax amount is in, and the precision is what makes the problem visible. From Stripe's tax reporting docs:
Tax calculation amounts are recorded in the integration currency, which can differ from the presentment currency, the settlement currency, and the tax authority's local filing currency.
The integration currency is the currency of your Price. If your US company prices everything in US dollars, as many do, then the 19% German VAT on a $100.00 sale is a $19.00 tax amount, and that $19.00 is what reaches QuickBooks.
Germany does not want $19.00. Stripe handles that too: "When the integration currency differs from the filing currency, Stripe Tax converts amounts using available exchange rates at the time of the transaction to calculate the filing currency." Every export carries both versions. The itemized export has tax_amount in your currency and filing_tax_amount in the authority's, with the filing_exchange_rate between them.
So you have two figures for every foreign tax amount, and they are fixed at the moment of the sale:
- The dollar amount in your QuickBooks liability account.
- The euro, pound or Canadian dollar amount you will report on the return, converted at the rate on the day of each sale.
The third figure arrives later. When you pay the return, you buy euros, pounds or Canadian dollars on the payment date, at that day's rate, from whatever bank or payment service you use. That amount almost never equals the dollars in the liability account. The difference is an exchange gain or loss, and it is the line most US bookkeepers are not expecting the first time an OSS return is paid.
If you price in euros or pounds rather than dollars, the integration currency changes, and so does the record in QuickBooks. How a foreign-currency sale lands in a US QuickBooks company depends on QuickBooks Multicurrency and on how your sync is configured. In Acodei, Multicurrency Support and Invoice Multicurrency are turned on by the Acodei team on request, not self-serve. Our guide to Stripe multicurrency in QuickBooks covers that setup. The rest of this guide assumes dollar pricing, which is the simpler and more common case.
Splitting the liability at filing time
The working method has three steps. Use the same date range for each.
1. Pull a summarized export from Stripe for the filing period. Stripe describes it this way: "Use this export for country-level filings and VAT OSS, and for simpler US states." It groups transactions by jurisdiction, and Stripe notes you "might have multiple rows per jurisdiction" when currencies or rates vary. You can also filter by jurisdiction before you export, which Stripe says is "especially useful for EU OSS registrations (which include multiple countries)."
2. Total each registration in your currency. For each row, the tax in your integration currency is total_tax_collected minus total_tax_refunded. Group by country_code, with every EU country rolled up under your OSS registration. These dollar totals are what your liability account is holding for each authority, so together they should explain the balance.
3. Take the return figures from the filing columns. filing_tax_payable is "the net tax liability (tax collected minus tax refunded) expressed in the tax authority's local filing currency," and filing_currency says which currency that is. Those are the numbers that go on the return.
If the dollar totals from step 2 do not add up to the liability balance in QuickBooks, stop and find out why before you file. The usual causes are refunds and timing. On refunds, Acodei's documentation is specific: a plain payment refund without an item breakdown does not always show how much of it was tax, so the refunded tax may not be reflected in QuickBooks. Stripe's export will show the refunded tax either way. The QuickBooks account may not, and the gap needs an adjusting entry. On timing, make sure both systems are cut off on the same date and in the same time zone. Stripe's exports carry both UTC and requested-timezone columns.
One account or sub-accounts
Some businesses leave the single account alone and do the split each period from the export, as above. Others want the balance sheet to show what is owed to each authority without opening a spreadsheet.
The documented Tax Product setup posts to one liability account. If you want sub-accounts, such as "Sales tax payable: US states," "VAT payable: EU OSS," "VAT payable: UK" and "GST/HST payable: Canada," the clean way is a reclassification journal entry at the end of each period. Debit the main account and credit each sub-account for the dollar totals from step 2. It costs one entry per period, and it means each sub-account clears to zero when that return is paid, which makes a missed or short payment easy to see.
Either way, keep the Stripe export for the period with the return. It is the only document that ties the dollars in QuickBooks to the foreign-currency figures you filed.
A worked example: one quarter, four authorities
A US software company prices in US dollars and has four registrations in Stripe Tax: two US states, the non-Union OSS for the EU, the UK, and simplified GST/HST in Canada. At the end of the quarter, the "Sales tax payable" account in QuickBooks shows $7,050.00.
The summarized export for the same quarter, grouped by registration:
| Registration | Tax in USD (collected minus refunded) | filing_currency | filing_tax_payable |
|---|---|---|---|
| US states | $3,100.00 | USD | 3,100.00 |
| EU (OSS) | $2,400.00 | EUR | 2,064.00 |
| United Kingdom | $900.00 | GBP | 666.00 |
| Canada (GST/HST) | $650.00 | CAD | 890.50 |
| Total | $7,050.00 |
The dollar column ties to QuickBooks exactly. Good. The filing column is what gets reported.
Now the payments. The US states are paid in dollars, so $3,100.00 clears $3,100.00. The other three are bought on the day they are paid:
| Registration | Owed | Rate on payment day | USD paid | Carried in QuickBooks | Difference |
|---|---|---|---|---|---|
| EU (OSS) | €2,064.00 | 1.1800 USD per EUR | $2,435.52 | $2,400.00 | $35.52 loss |
| United Kingdom | £666.00 | 1.3600 USD per GBP | $905.76 | $900.00 | $5.76 loss |
| Canada (GST/HST) | C$890.50 | 0.7250 USD per CAD | $645.61 | $650.00 | $4.39 gain |
After all four payments, the liability account would be left with a small balance unless you deal with it: $7,050.00 carried, $7,086.89 paid, a net difference of $36.89. Recording each payment as "debit Sales tax payable for the full USD amount paid" would push the account $36.89 negative and leave it there forever.
The cleaner treatment is to clear each authority's balance at exactly what it was carrying, and send the difference to its own line. For the EU payment:
| Account | Debit | Credit |
|---|---|---|
| Sales tax payable (or VAT payable: EU OSS) | 2,400.00 | |
| Exchange gain or loss | 35.52 | |
| Business checking | 2,435.52 |
The liability account clears to zero for that authority, the bank shows what actually left, and the $35.52 sits where an accountant expects to find currency movement. Which account your accountant prefers for that difference is their call. The point is that it is not tax, and it should not stay buried in the tax liability.
Two things change the size of the difference, and neither is under your control: how far the exchange rate moves between the sales and the payment, and how far your bank's rate is from the rates Stripe used. A quarter of quiet markets might produce a few dollars. A quarter where the dollar moves sharply will produce more, and the gap grows with how much foreign tax you are holding.
What to set up once, and what to check every period
Once:
- Decide whether you are keeping one liability account or splitting it with a periodic reclassification entry. Write the decision down.
- Decide which account takes the currency difference on tax payments, with your accountant.
- Confirm your Stripe Prices are in the currency you think they are. The integration currency drives what reaches QuickBooks.
Every period:
- Export the summarized report for each registration's filing period. The EU OSS, UK and Canadian periods may not line up with your US state periods, so pull each on its own dates.
- Tie the dollar totals to the liability account before filing.
- File from the
filing_tax_payablefigures. - Record each payment at the carried dollar amount, with the difference to the currency gain or loss line.
- Keep the export, the return and the payment confirmation together.
For more on the tax side of the same setup, our Stripe Tax and QuickBooks Online guide covers Stripe Tax and QuickBooks more broadly, and the Stripe Tax summarized export and itemized export entries explain the two reports used above in more depth.
Frequently Asked Questions
Does Stripe Tax file my EU, UK or Canadian returns?
No. Stripe says plainly, "You're responsible for filing and remitting your taxes. Stripe doesn't file taxes on your behalf." It calculates and collects the tax and gives you reports. Stripe also works with filing partners, and lists Taxually and Marosa for EU and international filing and Hands-off Sales Tax for the US and Canada.
Why is my VAT in dollars in QuickBooks when the return is in euros?
Because Stripe records tax in the currency of your Price. If you price in US dollars, the VAT on each sale is a dollar amount, and that is what reaches QuickBooks. Stripe converts each amount into the filing currency at the rate on the day of the sale, and shows both versions in its exports.
Can I put foreign VAT in a separate QuickBooks account?
Yes, but on a US QuickBooks company the usual sync setup posts all Stripe Tax to one liability account through a single tax product. The practical way to separate it is a reclassification journal entry each period, using the dollar totals per registration from Stripe's summarized export.
Where does the difference go when I pay a foreign tax return?
Clear the liability for the dollar amount it was carrying, and post the difference between that and the dollars you actually paid to a currency gain or loss account. Your accountant should confirm which account. The difference is not tax, so it should not stay in the tax liability account.
Do sales to EU or UK businesses go through the liability account?
Usually not. When a business customer provides a valid VAT number, Stripe treats eligible cross-border sales as reverse charge and calculates no tax, so there is no tax amount to sync. The sale still appears in Stripe's exports, marked with a reverse charge taxability reason.
Does registering for the non-Union OSS cover the UK?
No. The UK is not part of the EU, and Stripe notes that OSS registrations "don't allow tax calculations in the UK." UK VAT needs its own registration and its own return.
Keep the dollars and the filing currencies apart
Foreign VAT and GST are not hard to collect once Stripe Tax is set up. They are easy to lose track of afterwards, because the QuickBooks account that holds them looks exactly like the one that held your US sales tax. Treat the dollar balance as what you collected, take the return figures from Stripe's filing columns, and record the difference at payment as what it is.
Start a free trial to sync Stripe Tax into QuickBooks automatically, so your liability account is complete before you start splitting it.
Automate your Stripe to QuickBooks sync
Save hours every month. Acodei automatically syncs your Stripe transactions, invoices, and payouts to QuickBooks Online.
14-day free trial · card required · cancel anytime
How Acodei handles this in your stack
Stripe QuickBooks Integration
See how Acodei syncs Stripe payments, fees, refunds, invoices, and payouts into QuickBooks Online automatically.
Or go straight to a capability
Advanced Product Mapping
Map Stripe products to QuickBooks with rule-based logic on product ID, price ID, metadata, and account. Set rule priority and extend mapping to refunds and fees.
Automated Invoice Sync
Bring Stripe invoices into QuickBooks and auto-apply payments and credit memos, with numbering, invoice matching, and quantity tracking to cut double-entry.
Multi-Currency Mastery
Sync Stripe transactions across currencies with automatic exchange rate handling and currency-specific customer records. Our team enables multicurrency on request, and zero-decimal currencies such as JPY are not supported.
Class Mapping
Map Stripe products to QuickBooks classes for scalable categorization and multi-entity reporting. Class tracking requires QuickBooks Online Plus or Advanced.
Historical Data Import
Backfill historical Stripe data into QuickBooks by month range. Preview volume and cost before syncing so reporting starts from a complete baseline.
How to Connect Stripe to QuickBooks Online
Connect Stripe to QuickBooks Online in minutes. Acodei links both accounts with secure OAuth and syncs payments, fees, refunds, and payouts automatically.
Reconcile Stripe Payments in QuickBooks
Reconcile Stripe in QuickBooks Online automatically. Acodei splits out fees, matches payouts to deposits, and keeps every charge audit-ready.
Related articles
Acodei Journal
Marketplace Facilitator Tax With Stripe in QuickBooks
Acodei Content Team
Marketplace Facilitator Tax With Stripe in QuickBooks
10/3/2026
Acodei Journal
Stripe Tax and Use Tax: Recording It in QuickBooks
Acodei Content Team
Stripe Tax and Use Tax: Recording It in QuickBooks
10/2/2026
Acodei Journal
Stripe Tax Imports: Off-Stripe Sales Without Double Counting
Acodei Content Team
Stripe Tax Imports: Off-Stripe Sales Without Double Counting
10/2/2026
Get more operational finance guides like this one
We will only send high-value product and finance content.