A production invoice generator serving freelancers across 7 EU countries. Three invoice types, seven languages, client-side PDF generation, and a Stripe-powered freemium model. Built and shipped solo.
Freelancers across Europe deal with the same frustration. Every country has different VAT rates, different tax ID formats, different legal requirements. A Slovak invoice needs IČO, DIČ, and IČ DPH fields. A German one needs Steuernummer and USt-IdNr. A French one needs SIRET and RCS. Miss one field and the invoice isn’t legally valid.
Existing tools are either US-focused, expensive, or try to do everything. Most freelancers end up with Word templates and manual calculations. I built euinvoice to solve this for real. A free tool that handles the complexity so the user doesn’t have to.
The heart of euinvoice is its VAT engine. Each of the seven supported countries (Slovakia, Germany, Austria, Netherlands, Poland, Czech Republic, and France) has its own VAT rate, small business threshold, legal text, tax ID fields, and date format. A single configuration object drives the entire app: forms, PDF output, validation, and SEO pages all read from one source of truth.
The engine handles three invoice types automatically. Standard VAT invoices apply the correct country rate. Reverse charge invoices are auto-detected when the supplier and client are in different EU countries and the client has a valid VAT ID. The tax liability shifts to the buyer under Article 196. VAT-exempt invoices apply when the supplier is below their country’s small business threshold. All calculations use floating-point-safe arithmetic to prevent rounding errors on financial amounts.
Every invoice PDF is generated entirely in the browser using @react-pdf/renderer. No server call, no queue, no infrastructure cost. The user fills in the form, clicks download, and the PDF renders client-side in milliseconds. Data never leaves the browser.
The PDF adapts to context. Domestic invoices use the local language for labels: FAKTÚRA for Slovakia, RECHNUNG for Germany, FACTURE for France. Cross-border invoices switch to English automatically. Legal notices are country-specific: Slovakia cites § 69 ods. 12, Germany references § 13b UStG. Tax ID fields shown on the PDF match the supplier’s country requirements. The result is a legally compliant document that looks correct regardless of which two EU countries are involved.
Internationalization in euinvoice goes far beyond translating strings. The UI runs in seven languages: English, German, Slovak, Polish, Czech, French, and Dutch. But each language also means different form fields, different validation rules, and different business logic.
A Polish invoice shows NIP as the tax identifier. A Dutch one shows KVK-nummer. A German invoice under the small business exemption gets Kleinunternehmerregelung legal text, while a Czech one gets Osvobození od DPH. Dates format differently: dd.MM.yyyy in Germany, dd/MM/yyyy in France, dd-MM-yyyy in the Netherlands. Currency switches automatically. EUR for most countries, CZK for Czech Republic, PLN for Poland. Every combination of language, country, and invoice type produces a different but legally correct result.
The database runs on Supabase PostgreSQL with Row-Level Security enforced on every table. Users can only access their own profiles, invoices, and clients. Not through application logic, but through database policies. Even if the API is misused, the data stays isolated.
Invoices store supplier and client details as JSONB snapshots, decoupling history from the current profile. If a user updates their address, existing invoices remain unchanged. An atomic counter tracks global invoice generation for social proof on the landing page. Account deletion cascades through all related data. Data export generates a full JSON dump for GDPR portability. Magic link authentication via Resend means no passwords to store or breach.
euinvoice uses a three-tier freemium model. The free tier lets anyone generate unlimited invoices without an account. Data stays in the browser. Creating a free account adds invoice history, supplier auto-fill, and saved invoices. The Pro tier at €12/month unlocks a client directory, custom invoice numbering, and priority support.
Stripe handles the payment infrastructure. Checkout sessions create subscriptions, webhooks manage the lifecycle: upgrading the user’s tier on successful payment, downgrading on cancellation. The customer portal lets users manage their subscription without touching the app. Webhook signature verification ensures every event is genuine. The free tier is generous enough to drive adoption, and the Pro features solve real workflow pain points that grow with the user’s business.
Financial software has no room for bugs. A rounding error on a VAT calculation means an incorrect invoice. A missed reverse charge detection means tax liability in the wrong country. So every critical path is tested.
379 Vitest tests cover VAT calculations with floating-point edge cases, reverse charge auto-detection across all country pairs, PDF output validation for all three invoice types, country-specific legal text and tax ID visibility, Pro tier feature gating, and client directory pre-fill behavior. The test suite runs in under 200 milliseconds. Sentry tracks errors in production across client, server, and edge runtimes. Umami provides privacy-first analytics without cookies.
euinvoice.app is proof that one person can build, monetize, and maintain a compliant multi-country SaaS product. Every VAT rule, every PDF, every test. Built and shipped solo.