Invoices, settled. E-invoicing for PHP and Laravel.
Quittio creates, validates, reads and archives electronic invoices according to EN 16931, in any PHP 8.3 project and with a dedicated Laravel integration. ZUGFeRD, XRechnung and Peppol from one data model, checked with the official validators.
composer require quittio/quittiocomposer require quittio/core quittio/country-de- EN 16931
- ZUGFeRD / Factur-X
- XRechnung 3.0
- Peppol BIS 3.0
- UBL 2.1
- PDF/A-3b
- KoSIT
- veraPDF
- PHP 8.3+
- Laravel 13
How Quittio works
Your data in. Valid e-invoices out.
Quittio calculates totals and VAT, checks every invoice on seven levels against the official rules and renders the format your customer needs.


Compliant
Mandatory fields under German VAT law, tax presets for reverse charge, small businesses and intra-community supplies. A guard makes sure PDF and XML show the same data.
Validated
Seven validation levels from data structure to PDF/A-3b. The official rules run in the KoSIT validator and veraPDF, locally and in your CI.
Developer-friendly
A fluent API with sensible defaults, in plain PHP and in Laravel, there with fakes and assertions for Pest. A few lines instead of an XML project.
How it works
Create, output, validate, read.
Real examples from the documentation. No hand-written XML, no rounding errors.
use Quittio\Core\Builder\Party;
use Quittio\Core\Enums\UnitCode;
use Quittio\Laravel\Facades\Quittio;
$result = Quittio::invoice() // seller and bank account from config/quittio.php
->number('INV-2026-0042')
->deliveryDate('2026-09-30')
->buyer(Party::make('Customer Ltd')
->vatId('IE7654321K')
->address('5 Station Road', 'T12 X2Y3', 'Cork', 'IE')))
->line('Web development', netPrice: '95.00', quantity: 24, unit: UnitCode::Hour)
->line('Hosting', netPrice: '49.00') // quantity 1, standard VAT rate by default
->dueInDays(14)
->render(); // ZUGFeRD: PDF/A-3 with embedded XMLuse Quittio\Core\Builder\InvoiceBuilder;
use Quittio\Core\Builder\Party;
use Quittio\Core\Enums\PaymentMeansCode;
use Quittio\Core\Enums\UnitCode;
use Quittio\Core\Quittio;
use Quittio\Core\Tax\CountryDefaultVat;
// once: configuration, country packs and the default VAT rate
$quittio = Quittio::create($config, $countryPacks);
InvoiceBuilder::useDefaultVat(new CountryDefaultVat($quittio->countries()));
$invoice = InvoiceBuilder::make()
->seller(Party::make('Example Software Ltd')
->vatId('IE1234567T')
->address('12 Harbour Road', 'D02 X285', 'Dublin', 'IE'))
->payment(PaymentMeansCode::SepaCreditTransfer, iban: 'IE29AIBK93115212345678')
->number('INV-2026-0042')
->deliveryDate('2026-09-30')
->buyer(Party::make('Customer Ltd')
->vatId('IE7654321K')
->address('5 Station Road', 'T12 X2Y3', 'Cork', 'IE')))
->line('Web development', netPrice: '95.00', quantity: 24, unit: UnitCode::Hour)
->line('Hosting', netPrice: '49.00') // quantity 1, standard VAT rate by default
->dueInDays(14);
$result = $quittio->make($invoice)->render(); // ZUGFeRD: PDF/A-3 with embedded XML
Quittio::make($invoice)->format('xrechnung-cii')->render(); // XRechnung 3.0, CII
Quittio::make($invoice)->format('xrechnung-ubl')->render(); // XRechnung 3.0, UBL
Quittio::make($invoice)->format('peppol')->render(); // Peppol BIS Billing 3.0
$result->pdf();
$result->save('invoices', '2026/');
$result->cancel('ST-2026-0001', reason: 'Charged twice'); // the cancellation, rendered$quittio->make($invoice)->format('xrechnung-cii')->render(); // XRechnung 3.0, CII
$quittio->make($invoice)->format('xrechnung-ubl')->render(); // XRechnung 3.0, UBL
$quittio->make($invoice)->format('peppol')->render(); // Peppol BIS Billing 3.0
$result->pdf();
$result->save(__DIR__.'/invoices'); // directory or file path
$cancellation = $quittio->cancellation($result->data(), 'ST-2026-0001', reason: 'Charged twice');
$quittio->make($cancellation)->render(); // the cancellation, rendered$report = Quittio::invoice()
->buyer($customer)
->line('Consulting', netPrice: '120.00')
->check('xrechnung-cii'); // validates like render(), no PDF, never throws
$report->isValid(); // false
$report->errors(); // [BR-DE-15] The buyer reference (BT-10) is missing.$invoice = InvoiceBuilder::make()
->seller($company)
->buyer($customer)
->line('Consulting', netPrice: '120.00');
// validates like render(), no PDF, never throws
$report = $quittio->make($invoice)->format('xrechnung-cii')->check();
$report->isValid(); // false
$report->errors(); // [BR-DE-15] The buyer reference (BT-10) is missing.- L1StructureData model fully calculated
- L2Profile XRECHNUNGMandatory fields present
- L3BR-DE-15The buyer reference (BT-10, Leitweg-ID) is missing.
- L3DE-USTG-06Delivery date set
- L4XSDnot checked, the data stage has errors
Fix:
->buyerReference('04011000-12345-03')$read = Quittio::read($request->file('invoice')->get()); // XML or PDF
$invoice = $read->data; // InvoiceData as stated in the document
$invoice->number; // "INV-2026-0101"
$invoice->seller->name; // the supplier
$invoice->totals?->amountDue; // amount due
$read->profile; // e.g. "en16931" or "xrechnung"$read = $quittio->readFile($_FILES['invoice']['tmp_name']); // XML or PDF
$invoice = $read->data; // InvoiceData as stated in the document
$invoice->number; // "INV-2026-0101"
$invoice->seller->name; // the supplier
$invoice->totals?->amountDue; // amount due
$read->profile; // e.g. "en16931" or "xrechnung"Read: INV-2026-0101
- Supplier
- Supplier Ltd
- Profile
- en16931
- Amount due
- €1,230.00
- Findings
- none
Why now
Germany is rolling out e-invoicing step by step.
For domestic invoices between businesses. Exceptions include small invoices up to €250, tickets and invoices to consumers.
1 Jan 2025
Receive
Every business in Germany must be able to receive e-invoices.
1 Jan 2027
Issue above €800,000
Businesses with more than €800,000 prior-year turnover must issue e-invoices domestically.
1 Jan 2028
Issue for everyone
All businesses issue e-invoices for domestic B2B transactions.
Sources: sec. 14 UStG, sec. 27 (38) UStG, Federal Ministry of Finance letter of 15 Oct 2025.
Features
Everything an e-invoice needs.
One data model, every format
ZUGFeRD, XRechnung, Peppol, CII and UBL from the same data. Switching format is one line.
MoreAny PHP project
quittio/core runs in any PHP 8.3 project: Symfony, Slim, a shop plugin or your own framework. Laravel is optional.
MoreLaravel-native
Facade, queue, events, mail, storage, Blade and Artisan commands.
MoreDoes the maths
Totals, VAT and rounding according to the BR-CO rules of EN 16931.
MorePDF templates
Logo and colours, single partials or your own template. DIN 5008 and payment QR codes included.
MoreIncoming invoices
Read and check CII, UBL and ZUGFeRD, protected against XXE and zip bombs.
MoreMore documents
Quotes, delivery notes, proforma invoices, payment reminders and statements.
MoreTesting
Quittio::fake(), assertions, factories and scenarios for Pest and PHPUnit.
MoreCountry packs
Germany first: mandatory fields, tax presets, BR-DE rules.
More
Validation
Errors at render time, not at your customer.
Quittio checks every invoice on seven levels. The official rules run in the KoSIT validator and veraPDF.
- L1StructureData formats, country and currency codes, decimals
- L2Mandatory fieldsMandatory and allowed fields of the chosen profile
- L3Business rulesEN 16931 (BR-…), XRechnung, Peppol and German VAT Act (DE-USTG-…)
- L4XSDXML against the schema (CII D16B, UBL 2.1)
- L5KoSITOfficial Schematron rules in the KoSIT validator
- L6veraPDFPDF/A-3b conformance of the PDF
- L7PlausibilityIBAN, BIC, VAT ID, Leitweg-ID, optional VIES
- L1StructureData model fully calculated
- L2Profile XRECHNUNGMandatory fields present
- L3BR-DE-15The buyer reference (BT-10, Leitweg-ID) is missing.
- L3DE-USTG-06Delivery date set
- L4XSDnot checked, the data stage has errors
Fix:
->buyerReference('04011000-12345-03')Sample files
See the result.
One invoice in every format, created with Quittio and accepted by the official KoSIT validator without errors or warnings.
- ZUGFeRD (EN 16931)PDF/A-3b with XMLRE-2026-0042.pdfDownload
- XRechnung (CII)XMLRE-2026-0042-xrechnung-cii.xmlDownload
- XRechnung (UBL)XMLRE-2026-0042-xrechnung-ubl.xmlDownload
- Peppol BIS 3.0XMLRE-2026-0042-peppol.xmlDownload
- KoSIT validation reportHTML, for the XRechnung (CII)RE-2026-0042-kosit.htmlView (opens in a new tab)
Open source and Managed
Start for free. Managed when your app issues invoices.
Quittio
Create, validate, read and render. For any PHP project, with or without Laravel, free of charge.
- ZUGFeRD, XRechnung, Peppol, UBL, CII
- Validation L1–L7 with KoSIT and veraPDF
- PDF templates, DIN 5008, payment QR codes
- Read and check incoming invoices
Quittio Managed
Does your Laravel app issue the invoices itself? Then you need more than a PDF.
- Gapless numbering
- Immutable invoices and an archive with SHA-256
- Cancellation, partial cancellation and correction
- Delivery, audit log and retention
AI assistants
Your AI assistant knows Quittio.
The documentation is available as Markdown, as llms.txt and as an MCP server, so Claude Code, Cursor or Copilot write code for the current version.
How to set it upclaude mcp add --transport http quittio-docs https://docs.quittio.dev/mcp- Claude Code
- Cursor
- GitHub Copilot
- Claude Desktop
- Laravel Boost
Frequently asked questions
Do I need Laravel?
No. quittio/core runs in any PHP 8.3 project, for example with Symfony, Slim or no framework at all. You only need Laravel 13 for the integration and for Quittio Managed. There is a guide: “Create e-invoices with plain PHP, no Laravel needed”.
Is Quittio free?
Yes. The core, the Laravel integration and the German country pack are MIT licensed. Only Quittio Managed, the invoice management in your database, is paid.
Which formats does Quittio support?
ZUGFeRD/Factur-X, XRechnung 3.0 (CII and UBL), Peppol BIS Billing 3.0, CII and UBL 2.1, plus PDF, HTML and JSON.
Does Quittio replace my accounting or tax adviser?
No. Quittio creates and validates invoices. Accounting, VAT returns and advice stay where they are.
Is Quittio production-ready?
Version 0.3.0 creates invoices that pass the official validators. The API may still change until 1.0.0, and the legal texts of the country pack are being reviewed by a tax adviser.
What is the difference between Quittio and Quittio Managed?
Quittio creates the files. Managed handles the invoices afterwards: numbering, immutability, archive, cancellations, delivery and retention.
Your first valid e-invoice in ten minutes.
Install, add your company details, build an invoice. Quittio checks the rest.