Productinvoice.xhub.ioDogfooding

Our Biggest Customer Is Ourselves -- How invoice.xhub.io Runs on the Invoice API

invoice.xhub.io uses the same API we offer to developers. A dogfooding story about shared libraries, real validation, and why the best test is your own product.

Our Biggest Customer Is Ourselves -- How invoice.xhub.io Runs on the Invoice API
Patrick Jerominek

Patrick Jerominek

Cofounder & CEO

February 12, 2026
8 min reading time

Our Biggest Customer Is Ourselves

Today we're launching invoice.xhub.io -- a SaaS application for creating and sending e-invoices, completely without code. What looks like a new product from the outside is, under the hood, a pretty radical proof of concept: invoice.xhub.io is built on the invoice-api.xhub.io engine.

Not alongside it. Not inspired by it. Directly on top of it.


Why Dogfooding Is More Than a Buzzword

Every API provider says: "Our API is production-ready." But the most honest proof is when you build your own product on it. That's exactly what we did.

Every e-invoice that a user creates in invoice.xhub.io goes through exactly the same path as an API call from a developer:

  1. Structured data is collected from the form or the AI assistant
  2. The same generation engine converts it into XRechnung, ZUGFeRD, or Peppol BIS
  3. The same validation checks against KoSIT schemas and Schematron rules
  4. The same PDF engine generates PDF/A-3 with embedded XML

No special path. No internal shortcut. If the engine has a bug, we notice it first -- because it affects our own product.


Where the API Lives Inside

Specifically, invoice.xhub.io uses the Invoice API engine in these areas:

Invoice Generation

When a user clicks "Create Invoice" in the SaaS, the same thing happens behind the scenes as with a POST /api/v1/invoice/de/xrechnung/generate call. The input data is translated into the internal invoice model, the engine generates the XML -- and the user gets their XRechnung without even knowing what XRechnung technically is.

Real-Time Validation

The SaaS validates invoices during input. Missing the VAT ID? The validation engine reports BR-DE-03. But instead of the cryptic error code, the UI shows: "Please enter your customer's VAT ID." Same check, different language.

PDF Generation

ZUGFeRD requires a PDF/A-3 with embedded XML. The PDF engine that API customers use via the endpoint also generates the PDFs in the SaaS. Same fonts, same layout, same conformity.

Parsing Incoming Invoices

Users can also upload and check e-invoices in the SaaS. The parsing engine extracts structured data from XRechnung XML or ZUGFeRD PDFs -- the same one that powers the parser endpoint of the API.


The Architecture Behind It: Shared Libraries

The reason this works is a decision we made from day one: All core logic lives in standalone libraries, not in the API itself.

LibraryPurposeUsed by
Invoice Outbound DEGenerate XRechnung, ZUGFeRD, PeppolAPI + SaaS
Invoice Inbound DEParse and validate e-invoicesAPI + SaaS
Invoice InterfaceShared data modelAPI + SaaS
PDF EnginePDF/A-3 with embedded XMLAPI + SaaS

When we fix a bug in the validation, it's fixed in both products simultaneously. When we support a new format, it's available in both products. No sync issues, no feature drift.


What We Found Through Dogfooding

Building our own product on the API uncovered problems that no unit test would have found:

Edge Cases in Validation

A user in the SaaS enters invoice data piece by piece. This means: The engine must provide meaningful error messages even with incomplete data -- not just with finished invoices. This forced us to make the validation more granular.

Performance Under Real Conditions

In the API context, a single request is fast. But in the SaaS, we validate on every keystroke. This showed us where the engine needs optimization -- and those optimizations now benefit API customers as well.

Error Messages for Humans

BR-CO-10: Sum of line amounts does not equal invoice total is clear for a developer. Not for a freelancer. We built a translation layer that converts Schematron error codes into natural language. We could offer this mapping as an API feature in the future.


What This Means for API Customers

If you use the Invoice API, you directly benefit from the fact that we use it ourselves:

  • Higher stability -- Bugs surface internally before they affect you
  • Better performance -- Optimizations we need for the SaaS land in the engine
  • More realistic tests -- Our test coverage goes beyond synthetic test data
  • Faster iteration -- Feature requests from the SaaS team flow directly back

The API is not a byproduct. It's the foundation.


Two Products, One Engine

invoice-api.xhub.ioinvoice.xhub.io
For whomDevelopers & tech teamsFreelancers, SMBs, accounting
AccessREST API with API keyWeb interface in the browser
EngineDirectThe same -- via shared libraries
ValidationKoSIT SchematronKoSIT Schematron (+ human-readable error messages)
OutputXML, PDF, JSONSame formats, ready to download/send

Try It Out

Are you a developer? The API remains as before at invoice-api.xhub.io. Try it in the Playground or get started with the Quickstart.

Just want to create an e-invoice? invoice.xhub.io -- same engine, no code needed.

Questions? Contact us.

Share article
Patrick Jerominek

Written by

Patrick Jerominek

Cofounder & CEO

Builds APIs that developers love. Writes about e-invoicing, TypeScript, and everything in between.

Ready to master e-invoicing?

Get started in under 5 minutes with Invoice-api.xhub. No credit card required.