Most SaaS companies that sell to EU businesses start with the same manual process: a customer submits a VAT number at signup, someone on the finance team logs into the EU VIES website, types in the number, and records the result in a spreadsheet. It takes 10–15 minutes per customer, creates gaps in the audit trail when someone forgets to do it, and fails entirely when VIES is slow or down. Real-time API-based verification eliminates all of these problems — and the business case is stronger than most teams expect.
The 5 business benefits of real-time VAT verification
- 1.**Eliminate VAT liability on reverse-charge invoices.** If you apply zero-rate reverse charge without a valid VIES confirmation at the time of supply, you are personally liable for the VAT amount. Real-time verification ensures every reverse-charge invoice has a timestamped, request-ID-linked validation record behind it.
- 2.**Remove manual work from finance workflows.** At 10–15 minutes per customer, a team onboarding 200 B2B customers per month spends 33–50 hours per month on manual VAT lookups. API verification reduces that to zero.
- 3.**Instant fraud detection via company name verification.** The VIES response includes the registered company name and address for most EU countries. When the name doesn't match what the customer claimed, or the address is in a completely different country, that's a signal worth investigating before you onboard them.
- 4.**Automatic audit trail built on every transaction.** Every API call returns a unique request_id. Store it alongside the invoice and you have a timestamped, immutable record that the VAT number was validated — exactly what a tax audit requires.
- 5.**Monthly re-validation catches deregistrations before they create liability.** A customer's VAT number that was valid at onboarding can become inactive at any time. A monthly re-validation job catches these before your next invoice run, so you never issue a reverse-charge invoice to a deregistered business.
What real-time looks like in practice
The difference between manual and API-based verification isn't just speed — it's the completeness of the data captured and the reliability of the process. Manual verification depends on a person remembering to do it. API verification happens as a side effect of the normal checkout or onboarding flow.
| Dimension | Manual (VIES website) | API (real-time) |
|---|---|---|
| Time per validation | 10–15 minutes | < 500ms |
| Error rate | ~5% (human transcription) | ~0% (automated) |
| Audit trail | Spreadsheet or email — easily lost | request_id stored with invoice |
| VIES downtime handling | Person retries later, forgets | service_unavailable status, auto-retry |
| Re-validation | Manual — rarely done | Automated monthly job |
| Company name check | Visual only | Programmatic mismatch detection |
The service_unavailable problem: why real-time must be resilient
VIES is down approximately 2% of the time — roughly 14–15 hours per month. A naive implementation that rejects any customer whose validation fails will incorrectly block valid EU businesses during those windows. The correct approach is to distinguish between 'this number is invalid' and 'the service is currently unreachable', and to handle each differently.
Warning
Never treat service_unavailable as invalid. VIES is unavailable ~2% of the time. If you reject customers when VIES is down, you will lose approximately 2% of your EU B2B signups unnecessarily — plus you will block re-activations of valid customers during outages.
async function validateVatAtOnboarding(country: string, vatNumber: string) {
const res = await fetch(
`https://www.taxid.dev/api/v1/validate/${country}/${vatNumber}`,
{ headers: { Authorization: `Bearer ${process.env.TAXID_API_KEY}` } }
);
const data = await res.json();
switch (data.status) {
case 'active':
// Valid — store record, proceed with reverse charge treatment
return { allowed: true, reverseCharge: true, companyName: data.company_name };
case 'invalid':
case 'inactive':
// Definitively not a registered business
return { allowed: false, reverseCharge: false };
case 'format_invalid':
// The number is syntactically wrong — prompt to correct
return { allowed: false, reverseCharge: false, promptCorrection: true };
case 'service_unavailable':
// VIES is down — allow through, schedule re-validation
await scheduleRevalidation(vatNumber, country);
return { allowed: true, reverseCharge: true, pendingValidation: true };
}
}ROI calculation for a 500-customer SaaS
For a SaaS with 500 EU B2B customers, assume 30 new customers per month and a monthly re-validation job running on all 500. At 10 minutes per manual check, that's 300 minutes (5 hours) of new customer validation plus another 500 minutes (8.3 hours) of monthly re-validation — 13.3 hours of finance time per month, every month. At a fully-loaded cost of $50/hour, that's $665/month in labour cost, just for VAT number management. The TaxID API at scale pricing costs less than $80/month for this volume. Beyond cost, the API eliminates audit exposure: a single missed re-validation that results in a reverse-charge invoice to a deregistered business can trigger a tax authority assessment for the full VAT amount on every invoice since the deregistration.
Frequently asked questions
- →**Is real-time validation required or just recommended?** Required for zero-rate reverse charge. The EU VAT Directive requires you to verify the buyer's taxable status before applying zero-rate treatment. Real-time VIES validation is the standard way to satisfy this requirement.
- →**What happens if the API is slow at checkout?** The TaxID API returns cached results in under 10ms for recently validated numbers. Cold VIES calls typically complete in 300–600ms. This is fast enough to include inline in a checkout flow without impacting conversion.
- →**Can I batch validate a list of VAT numbers?** Yes — use concurrent API calls with a rate limiter. See the bulk VAT validation guide for implementation patterns.
Related resources
Start validating EU VAT numbers
Free plan — 100 validations/month. No credit card required.