Skip to content
← All packages

Tax for Laravel

A self-hostable consumption-tax engine for Laravel. It owns the calculation logic, place-of-supply, reverse-charge, rate application, inclusive and exclusive, and sources only the rate data behind a pluggable contract. No forced third-party tax SaaS.

Tax for Laravel owns the tax calculation logic, place-of-supply, reverse-charge, rate application, inclusive and exclusive pricing, and sources only the rate data behind a pluggable contract. There is no forced third-party calculation SaaS. It is built on Geo for Laravel, so every supply is assessed against a jurisdiction resolved from canonical ISO data. Tax is a function of seller registrations, buyer jurisdiction and product type, never a fuzzy country-name match.

Own the logic, source the data

The engine decides whether and how to tax a supply. The TaxRateSource contract supplies the rate number, whether that is an EU TEDB feed, the US SST files or a commercial adapter. A missing rate is refused, never assumed to be zero percent. That boundary is the whole design: the parts that must be correct and auditable live in the package, and the data that changes constantly plugs in behind a contract you control.

What It Does

EU VAT

Article 44, 45 and 58 place-of-supply, intra-EU B2B reverse charge, VIES-validated customer tax IDs. A German entity selling to a validated French business self-accounts, a French entity charges French VAT.

National VAT and GST

UK, CH, NO, AU, NZ, MX, SG, TW, UAE, SA, JP, KR, TH, UA and more, plus India dual GST (IGST versus CGST and SGST) and Malaysia SST.

US Sales Tax

Gates on three things before applying a rate: the state must resolve via rooftop geocoding, the seller must have nexus in it, and the product must be taxable there. Otherwise it returns NotRegistered or Exempt, never a wrong charge.

Canada GST and HST

Province-level combined rate with cross-border B2B self-assessment, resolved at province level with no local tax lookup.

Multi-Entity Routing

Tax depends on which selling entity issues the invoice. SellerRegistrations is the seller side the billing engine supplies per invoice, so the same buyer is taxed correctly whichever entity sells.

Exact Money

Amounts are brick/money and rate maths rounds half-up once. Deny-by-default throughout: no regime or no rate raises an exception, never a silent zero.

Honest coverage

The docs carry the full per-country table with sources and confidence, plus an honest list of jurisdictions omitted until their rate data is verified, a national-VAT batch pending primary-source confirmation, some Pakistani provinces and Brazil. The engine omits rather than ship a rate it cannot stand behind.

Contracts all the way down

TaxCalculator, TaxRegime, TaxRateSource, RegimeRegistry, AddressGeocoder, VatIdValidator and ReturnAggregator are all contracts you can bind and override. Rate sources compose: static, remote, caching and chain. The shipped GeocodioGeocoder resolves US and Canada addresses, and rate data plugs in via TaxRateSource. Unmodelled jurisdictions and missing rates are refused, not guessed.