Skip to content

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/quittio
composer require quittio/core quittio/country-de
Animation: the code builds invoice INV-2026-0042 step by step, Quittio validates it (EN 16931, KoSIT: valid) and outputs ZUGFeRD, XRechnung and Peppol.InvoiceController.phpCopy$result = Quittio::invoice() ->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') ->dueInDays(14) ->render();
  • 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.

Laravel apps, other PHP frameworks and plain PHP pass invoice data to Quittio. Quittio calculates, validates on seven levels with the KoSIT validator and veraPDF, and outputs ZUGFeRD, XRechnung 3.0 and Peppol BIS 3.0 as well as PDF, HTML and JSON.
  • 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.

InvoiceService.php
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 XML
invoice.php
use 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
Invoice INV-2026-0042 from Example Software Ltd to Customer Ltd for €2,864.67, created by Quittio with the default template

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. 1 Jan 2025

    Receive

    Every business in Germany must be able to receive e-invoices.

  2. 1 Jan 2027

    Issue above €800,000

    Businesses with more than €800,000 prior-year turnover must issue e-invoices domestically.

  3. 1 Jan 2028

    Issue for everyone

    All businesses issue e-invoices for domestic B2B transactions.

What this means for your app

Sources: sec. 14 UStG, sec. 27 (38) UStG, Federal Ministry of Finance letter of 15 Oct 2025.

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.

  1. L1StructureData formats, country and currency codes, decimals
  2. L2Mandatory fieldsMandatory and allowed fields of the chosen profile
  3. L3Business rulesEN 16931 (BR-…), XRechnung, Peppol and German VAT Act (DE-USTG-…)
  4. L4XSDXML against the schema (CII D16B, UBL 2.1)
  5. L5KoSITOfficial Schematron rules in the KoSIT validator
  6. L6veraPDFPDF/A-3b conformance of the PDF
  7. L7PlausibilityIBAN, BIC, VAT ID, Leitweg-ID, optional VIES
Validation report · xrechnung-cii1 error
  • 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')

Open source and Managed

Start for free. Managed when your app issues invoices.

Open source · MIT

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
Early access · from €149 per project

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 up
claude 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.