Product Decisions This Supports
- Build vs. buy on EU VAT logic. VAT number validation (VIES) and VAT rate lookup are commodity problems with well-known edge cases: VIES SOAP downtime, per-country rate changes, reverse-charge rules, and "valid format but unregistered" numbers. This package lets you buy that logic (MIT, no vendor lock-in) instead of owning a maintenance burden that produces zero differentiation.
- B2B checkout and self-serve signup scope. Directly supports decisions like: do we validate VAT IDs at registration or at first invoice? Do we apply reverse charge automatically when a valid VAT ID is supplied? Do we store validation timestamps and consultation numbers for audit defense?
- Roadmap for EU expansion. A VAT lookup layer is a prerequisite capability for geo-based pricing, VAT-inclusive vs. VAT-exclusive display, invoicing/receipts, and marketplace-seller onboarding (lightweight KYC). Each of those becomes a smaller epic once this exists.
- Pricing and packaging. Enables tax-inclusive display per country and correct gross-vs-net revenue reporting, which feeds pricing experiments and margin analysis.
- Failure-mode policy (a real product decision, not an engineering one). Because VIES is frequently unavailable, you must decide the UX: hard-block checkout on validation failure, soft-pass with deferred re-validation, or queue-and-reconcile. This package surfaces that question early rather than at launch.
- Deprioritization signal. With ~20 stars and zero dependents, this is not a de-risked, widely-adopted integration. Treat it as a thin convenience wrapper, not a strategic dependency — which argues for keeping the abstraction seam thin so it can be swapped.
When to Consider This Package
Consider it when:
- You are on Symfony and want DI-configured access to
ibericode/vat without writing your own service definitions, caching decorators, and HTTP client wiring.
- You sell (or plan to sell) B2B into the EU and need VIES validation plus VAT rate lookup in one dependency.
- You want MIT-licensed, self-hosted tax logic with no per-call vendor fees and no data leaving your infrastructure beyond the VIES call itself.
- Your tax needs are EU-scoped and display/validation-only — you are not filing returns or computing jurisdiction-complex line-item tax.
Look elsewhere when:
- You are on Laravel. This is a Symfony bundle (
Symfony\Bundle-style DI extension). It will not drop into a Laravel app. The realistic path is depending on ibericode/vat directly and writing a ~50-line service provider plus a cache decorator — roughly a day of work, and you keep Laravel-native config, facades, and testing idioms. Budget that as the actual adoption cost, not composer require of this bundle.
- You need a tax engine, not a lookup. Avalara, Stripe Tax, or TaxJar if you need product tax categories, US/global nexus, filing, or an SLA. VIES returns a validity flag and a rate; it is not a calculation engine and does not indemnify you.
- You need availability guarantees. VIES has no SLA. If checkout correctness depends on it, plan for caching, async re-validation, and a documented fallback — this package does not provide those policies, only the transport.
- You weigh community signal heavily. Zero dependents and a small star count mean limited field-testing. Mitigate with your own integration tests against recorded VIES responses plus a live smoke test in staging.
- You're not on PHP. Obvious, but worth stating in a roadmap doc — cross-language parity means picking a different library per runtime.
How to Pitch It (Stakeholders)
To executives: This is a small, free (MIT) open-source component that handles EU VAT number validation and rate lookup — the plumbing behind B2B reverse-charge invoicing. It removes a recurring compliance maintenance cost from our roadmap for near-zero spend, and it unblocks EU expansion, tax-correct pricing display, and marketplace-seller onboarding. The strategic risk is low because it is a thin wrapper over a public EU service; there is no vendor contract and no lock-in.
To engineering: Two things to be explicit about. First, this is a Symfony bundle, not a Laravel package — so for our stack we should adopt ibericode/vat directly and wrap it in a service provider, keeping the interface narrow (one VatValidator contract) so the underlying implementation is replaceable. Second, VIES is unreliable by design: we need caching by VAT number with TTL, a documented behavior when VIES is down (recommend: soft-pass with persisted pending status and a queued re-check), and logging of the consultation reference for audit. Estimated effort: ~1–2 days including tests; treat the wrapper as ours, the library as a swappable detail.
Decision requested: Approve adoption of ibericode/vat (not the Symfony bundle) behind an internal interface, and approve a written policy for checkout behavior during VIES outages — that policy, not the library choice, is the thing that will actually generate support tickets.