Peppol BIS Billing 3.0 with PHP
The European format for invoices sent through the Peppol network. Quittio creates the UBL; you reach the network through a provider.
What is Peppol?
Peppol is a European network for exchanging business documents. Invoices in it follow Peppol BIS Billing 3.0: UBL according to EN 16931 with additional Peppol rules and participant IDs.
Who is it for?
- Invoices to authorities and businesses in countries with a Peppol mandate
- Invoices between businesses in Belgium, with the country pack BE (not yet tax-reviewed)
- Recipients who receive invoices through an access point
- International B2B customers
How it works with Quittio
use Quittio\Core\Builder\Party;
use Quittio\Laravel\Facades\Quittio;
$result = Quittio::invoice()
->number('RE-2026-0042')
->deliveryDate('2026-09-30')
->buyer(Party::make('Kunde AG')
->vatId('DE987654321')
->address('Bahnhofstraße 5', '54321', 'Beispielstadt', 'DE'))
->line('Web development', netPrice: '95.00', quantity: 24)
->format('peppol')
->render();use Quittio\Core\Builder\InvoiceBuilder;
use Quittio\Core\Builder\Party;
use Quittio\Core\Quittio;
use Quittio\Core\Tax\CountryDefaultVat;
use Quittio\Country\DE\CountryDE;
// once at start-up: country pack and default VAT
$quittio = Quittio::create([], [new CountryDE]);
InvoiceBuilder::useDefaultVat(new CountryDefaultVat($quittio->countries()));
$invoice = InvoiceBuilder::make()
->seller($company) // seller and bank account in code
->number('RE-2026-0042')
->deliveryDate('2026-09-30')
->buyer(Party::make('Kunde AG')
->vatId('DE987654321')
->address('Bahnhofstraße 5', '54321', 'Beispielstadt', 'DE'))
->line('Web development', netPrice: '95.00', quantity: 24);
$result = $quittio->make($invoice)->format('peppol')->render();Without Laravel you only need quittio/core and quittio/country-de. The complete script is in the guide E-invoices with plain PHP, no Laravel needed.
Checked with: KoSIT validator with the Peppol rules
Sample file: RE-2026-0042-peppol.xml
Profiles and variants
- peppolUBL according to Peppol BIS Billing 3.0
Sending through the Peppol network comes with Quittio Managed 1.2.0 (quittio/peppol). Until then, hand the file to your access point provider.
Questions about Peppol
Do I need an access point?
To send through the Peppol network, yes. Quittio creates the valid file; a certified provider handles the transport.
Is Peppol mandatory in Germany?
No. In Germany, ZUGFeRD or XRechnung are sufficient. Peppol is an additional channel used by some authorities and international customers.
Does Quittio check the Peppol rules itself?
Yes, every Peppol rule that the data of an invoice can break, in PHP with readable messages before any XML is written: for example an e-mail scheme as electronic address or a GLN with a wrong check digit. The national rules of single countries (e.g. Norway, Denmark, Sweden) are not ported to PHP. The KoSIT validator with the Peppol rules stays the authority.
When which invoice becomes mandatory is explained in our guide to the German e-invoicing mandate.