← All posts
·8 min read

The Stripe VAT Classification Problem: B2B vs B2C and the Evidence Gap

For SaaS companies on Stripe, one question changes the entire VAT treatment: is this customer a business or a consumer? Here's how to classify correctly, what evidence you need, and what to do when it's ambiguous.

B2BB2CVATDigital ServicesStripeReverse ChargeEU OSSVAT Classification

For SaaS companies selling digital services across the UK and EU, one small question changes the entire VAT treatment:

Is this customer a business, or a consumer?

That sounds simple. In Stripe, it often isn't.

A customer might enter a VAT ID. The VAT ID might be invalid. VIES might be unavailable. The billing country might say France while the card country says Germany. Or the customer might be a real business that simply never entered a VAT ID at checkout.

This is where a lot of Stripe-to-Xero VAT workflows start to break down.

For example, a German customer enters a VAT ID, but the ID is never validated. Stripe still has a customer record, a charge, and an invoice. Xero may still receive the transaction. But from a VAT perspective, the key question is still unresolved: was this actually a reverse charge B2B sale, or should VAT have been collected?

Most teams don't have a real classification process. They rely on whatever data happened to be collected at checkout, export it later, and ask an accountant to clean it up in a spreadsheet.

That might work when transaction volume is low. Once you have hundreds or thousands of Stripe charges across multiple countries, it starts to fall apart.

This post walks through how B2B vs B2C VAT classification works for digital services, what evidence you need, and which transactions should be flagged instead of guessed.

This article is for educational purposes only and does not constitute formal tax advice. For complex cases, consult a qualified accountant or tax adviser.

Why the B2B/B2C distinction matters so much

For UK and EU SaaS companies selling digital services, the B2B/B2C classification determines which VAT rules apply to the transaction.

ClassificationVAT treatmentWhat it means
B2B (EU customer)Reverse charge — 0% VATCustomer accounts for VAT in their country. You invoice at zero VAT with reverse charge wording.
B2C (EU customer)OSS — VAT at customer's local rateYou charge and remit VAT at the rate for the customer's country (e.g., 19% Germany, 25% Sweden).
B2B or B2C (UK customer)UK domestic — 20% VATStandard UK VAT applies regardless of customer type.
B2B or B2C (rest of world)Usually outside scopeUK VAT generally does not apply.

The difference between reverse charge and OSS is not a rounding error. It can be the difference between charging zero VAT and charging 19–27% VAT. Misclassifying a consumer as a business means you undercharged VAT — and you may owe that VAT to the relevant tax authority regardless of whether you collected it.

The classification decision flow

For EU customers, the classification logic follows a clear sequence. The practical challenge is that each step requires evidence, and evidence is not always clean.

Step 1 — Where is the customer?

Determine the customer's country using available location evidence: billing address, card country, and any additional signals. If the customer is in the UK, charge UK VAT. If outside the UK and EU, the transaction is outside scope. If in the EU, continue to Step 2.

Step 2 — Did the customer provide a VAT ID?

If no VAT ID was provided, the customer is treated as B2C. Apply OSS rules — charge VAT at the customer's country rate. If a VAT ID was provided, continue to Step 3.

Step 3 — Is the VAT ID valid?

Validate the VAT ID against VIES. If it comes back valid, the customer is B2B — apply reverse charge at 0% VAT. If invalid, expired, or unavailable, do not apply reverse charge. Either treat as B2C or flag for review.

Step 4 — Is the location evidence consistent?

For B2C transactions, EU OSS rules require at least two non-conflicting pieces of location evidence. If billing address says France but the card was issued in Germany, that's a conflict. Flag it for review rather than guessing.

In summary:

ScenarioClassificationTreatment
EU customer, valid VAT IDB2BReverse charge (0%)
EU customer, invalid VAT IDFlag for reviewDo not apply reverse charge
EU customer, no VAT ID, consistent evidenceB2COSS (local rate)
EU customer, no VAT ID, conflicting evidenceFlag for reviewDo not classify automatically
UK customerN/AUK domestic VAT (20%)
Non-UK, non-EU customerN/AOutside scope

What counts as evidence for B2B status

The presence of a VAT ID is the primary signal for B2B classification in the EU. But "a VAT ID was provided" is not the same as "the customer is a verified business."

For reverse charge treatment to be well-supported, you typically need:

  • A VAT ID that has been validated against VIES — not just format-checked, but confirmed as active with a stored result and timestamp
  • Validation linked to the transaction — evidence that the VAT ID was valid at or near the time of the charge, not just at some earlier point
  • Consistency with other signals — the VAT ID country should match the billing address country

A VAT ID from Germany paired with a billing address in Spain is worth investigating, not auto-classifying. It may be legitimate — businesses operate across borders — but it's an inconsistency that should be reviewed.

For a deeper look at how VAT ID validation works and why Stripe's built-in verification is not sufficient on its own, see Why Stripe VAT ID Verification Is Not Enough for Reverse Charge.

What counts as evidence for B2C status

When no valid VAT ID is present, the customer is generally treated as a consumer. But for EU B2C transactions, the location evidence matters because it determines which country's VAT rate applies.

Under EU OSS rules, the standard expectation is two non-conflicting pieces of location evidence. For most Stripe transactions, the available signals are:

  • Billing address — entered by the customer at checkout
  • Card country — the country where the payment card was issued (the BIN country)

If both point to the same country, classification is straightforward. If they conflict, the transaction should be flagged for review.

The IP address gap

Stripe Checkout captures the customer's IP address, but Stripe does not expose it through the API. This means one of the most useful location signals for B2C evidence is not available to downstream classification systems.

In practice, this means many Stripe-based SaaS companies are classifying EU B2C transactions with only one or two evidence signals. Transactions with a single signal — for example, a billing address but no card country — should be treated with lower confidence and reviewed rather than auto-classified.

Where it gets ambiguous

In a clean scenario, the customer either provides a valid VAT ID (B2B) or doesn't (B2C), the location evidence is consistent, and classification is straightforward. In practice, a significant number of transactions don't fit cleanly.

VAT ID provided but not yet validated

The customer entered a VAT ID at checkout, but VIES hasn't been checked yet — or VIES was down when the check was attempted. You have a signal that suggests B2B, but no confirmation. Applying reverse charge here is risky. The safer approach is to hold classification until validation completes, or flag the transaction for review.

VAT ID provided but invalid

The customer entered something that looks like a VAT ID, but VIES returns invalid. This could mean the number was mistyped, the business deregistered, or the format was wrong. The customer may genuinely be a business — but you cannot support reverse charge treatment without a valid result. Treat as B2C or flag for manual review.

No VAT ID, but the customer might be a business

Some businesses don't provide a VAT ID at checkout. They may not know it's relevant, or your checkout flow may not prompt for it clearly. These transactions will be classified as B2C by default, which may result in VAT being charged when reverse charge could have applied. This isn't a compliance error — charging VAT when you didn't need to is conservative, not wrong — but it can create friction with business customers who expect zero-rated invoices.

Conflicting location signals

Billing address says Netherlands, card country says Belgium. Which country's OSS rate applies? Neither answer is obviously correct. These transactions should be flagged rather than auto-classified, and resolved with additional context or manual review.

Small, exempt, or partially exempt businesses

Some EU businesses are VAT-exempt or below registration thresholds. They may not have a VAT ID at all. From your perspective, they look like consumers. Treating them as B2C and charging local-rate VAT is generally the correct approach — if they're not VAT-registered, reverse charge doesn't apply to them regardless.

The cost of getting it wrong

Misclassification in either direction has consequences.

Classifying B2C as B2B (charging 0% instead of local rate): You undercharged VAT. Depending on the jurisdiction, you may owe that VAT whether or not you collected it. This is the more expensive error.

Classifying B2B as B2C (charging local rate instead of 0%): You overcharged a business customer. This is less of a compliance risk — you collected VAT you didn't need to — but it creates friction with the customer and potential refund obligations. Business customers expect zero-rated invoices and may dispute charges that include VAT.

Not classifying at all: Defaulting everything to one treatment — typically UK domestic VAT or no VAT — avoids making a decision, but it doesn't avoid the problem. A default is still a decision — and if the VAT treatment is wrong, the reporting is still wrong.

The safer approach is to classify with confidence where the evidence supports it, and flag everything else for review.

Where Clearkite fits

This is the workflow Clearkite is built around.

Instead of waiting until month-end or quarter-end to untangle Stripe exports, Clearkite classifies each transaction using the evidence available at the time:

  • Was a VAT ID provided?
  • Was it validated against VIES?
  • What country does the billing address point to?
  • What country does the card point to?
  • Do the location signals agree?
  • Is the classification high-confidence, or should it be reviewed?

Clear cases are classified automatically. Ambiguous cases are not forced into a tax treatment just to make the spreadsheet look complete.

Clearkite stores the evidence behind each decision — VAT ID status, validation timestamp, customer country, card country, and final treatment — so the accountant is not just looking at a number in Xero. They can see why the transaction was classified that way.

The goal is simple: automate the obvious cases, surface the ones that need judgment, and keep an audit trail for both.

For a broader overview of how the four VAT treatments work for UK SaaS on Stripe, see Stripe VAT for UK SaaS: A Practical Guide.

Classify with evidence, not assumptions

If your current VAT process is just "VAT ID present equals B2B, no VAT ID equals B2C," you are probably missing important context.

A VAT ID that was never validated is not strong evidence. A single country signal may not be enough for OSS. And a transaction with conflicting data should not be quietly forced into whatever category makes the export balance.

The better approach is to classify what you can prove, flag what you cannot, and keep the evidence attached to the transaction.

That is what Clearkite is building for Stripe-based SaaS companies: VAT classification, validation, review, and Xero-ready data — without the month-end spreadsheet scramble.

Get early access to Clearkite →

Stop reconciling Stripe VAT by hand

Clearkite connects to Stripe, classifies transactions, validates VAT IDs, flags exceptions, and produces cleaner Xero-ready outputs for reconciliation and reporting.

Clearkite is currently in private beta for UK and EU SaaS companies using Stripe.

Get early access to Clearkite