Stripe Tax + Hungarian VAT · the implementation playbook
Stripe Tax handles the calculation. The 'Hungarian VAT compliant invoice' part is on you. Here is the full chain we ship.
Stripe Tax handles the calculation. The 'Hungarian VAT compliant invoice' part is on you. Here is the full chain we ship.
We see the same mistake every quarter at SaaS audits. The team enabled Stripe Tax, ticked Hungary, and assumed the box now says 'compliant'. It does not. Stripe Tax computes the tax. The Hungarian-law-compliant invoice and the NAV reporting are still your problem. This post is the chain we ship for clients selling SaaS into and from Hungary.
Disclaimer: laws are laws and your accountant approves the final spec. Everything below is engineering shape. The numbers (27% standard rate, B2B reverse charge, MOSS / OSS thresholds) are from current Hungarian and EU rules as of 2026-04-26 · check before go-live.
Stripe Tax determines whether a transaction is taxable, at what rate, where, and stamps that on the invoice. It also covers thresholds (EU OSS, US economic nexus). It does NOT issue Hungarian e-invoices, file with NAV, or generate the legally required invoice fields under Hungarian law (Act CXXVII of 2007 §169). You still need a billing layer that can.
Use `automatic_tax: { enabled: true }` on every Subscription and Invoice. Pass the right address fields on the Customer · billing address is the source of truth for VAT location. For B2B EU sales, capture and pass the buyer's `tax_ids` · Stripe Tax then applies reverse charge automatically and stamps the buyer's VAT ID on the invoice.
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET!);
await stripe.customers.update(customerId, {
address: { country: "HU", postal_code: "1051", city: "Budapest", line1: "..." },
tax_id_data: vatNumber
? [{ type: "eu_vat", value: vatNumber }]
: undefined,
});
await stripe.subscriptions.create({
customer: customerId,
items: [{ price: priceId }],
automatic_tax: { enabled: true },
collection_method: "charge_automatically",
});A Hungarian VAT number on a customer record is worth nothing if you have not validated it. NAV publishes a SOAP / REST endpoint, the EU offers VIES, and Stripe will verify EU VAT IDs you attach to a customer. Do all three at the right moments: validate at signup, re-validate periodically, and re-check before issuing a B2B reverse-charge invoice. Cache the result with a short TTL · VIES rate-limits hard.
Hungarian law (Act CXXVII of 2007) requires fields Stripe's default invoice does not include in the right format · sequential number under a registered range, supplier and buyer tax numbers, exact issue and supply dates in HU format, line-item VAT rate, the VAT amount in HUF if billing in another currency, and a few more. We generate the invoice in our billing layer and reference Stripe's invoice as the underlying transaction.
Hungary requires every B2B and B2C invoice issued by a Hungarian-registered taxpayer to be reported to the NAV Online Invoice system within minutes of issue. v3 is mandatory in 2026. The integration is XML over REST with a signed token; failure responses come back with explicit error codes. We retry on transient failures, surface persistent ones in our ops dashboard, and never block the customer-facing flow on NAV being slow.
// pseudo-code for the NAV submission flow
async function reportToNav(invoiceId: string) {
const xml = await renderInvoiceXml(invoiceId);
const token = await navTokenExchange();
const r = await navClient.manageInvoice({
operation: "CREATE",
invoice: xml,
token,
});
if (r.result.funcCode === "OK") {
await markReported(invoiceId, r.transactionId);
} else {
await enqueueRetry(invoiceId, r.result);
}
}Most teams ship the domestic flow correctly and then break on a Polish or German B2B sale. Reverse charge means: the buyer pays the VAT in their own country, you charge zero, your invoice carries the legend and the buyer's VAT ID. Stripe Tax does the calculation if `tax_ids` is set. Your billing layer must render the correct legend, your accounting code must classify the transaction as reverse-charge for the recapitulative statement (A60 in HU).
Quarterly, Hungarian VAT-registered sellers must file an A60 listing all intra-EU B2B sales with VAT IDs and amounts. Stripe Tax exports a file you can use as the source. Your accountant needs the data in a format their system reads · do this once, automate it, do not do it by hand at quarter end.
If your accountant tells you 'just send me a CSV at quarter-end', you have a system-design opportunity. The same data plus a `nav_status` column plus a downloadable A60 saves a day of finger-pointing every quarter.
The shape that survives audit is: Stripe Tax for calculation, an in-house billing service for legally compliant invoices, an async NAV reporter behind a queue, a verified VAT-ID flow on signup and renewal, and a quarterly export the accountant can ingest. Build that once, treat it as a system, do not retrofit it on the night before a tax inspection.

Founder, DField Solutions
I've shipped production products from fintech to creator-tooling · for startups and enterprises, from Budapest to San Francisco.
Let's talk about your project. 30 minutes, no strings.