<!-- md-source: 51e79266ab8c FactoorSharpWeb/wwwroot/de/Home/PeppolDotNet.md -->

# Peppol BIS Billing 3.0 with .NET and C#

> Markdown version of <https://www.factoorsharp.de/en/Home/PeppolDotNet> for AI agents.
> Languages: [Deutsch](https://www.factoorsharp.de/de/Home/PeppolDotNet.md) ·
> [English](https://www.factoorsharp.de/en/Home/PeppolDotNet.md) ·
> [Français](https://www.factoorsharp.de/fr/Home/PeppolDotNet.md)

Peppol BIS Billing 3.0 is a CIUS (Core Invoice Usage Specification) on top of EN 16931 –
technically the same UBL structure as XRechnung, told apart by the specification
identifier BT-24. With FactoorSharp both come out of the same invoice model, in C# and
VB.NET.

**Scope:** this page is about the document level – creating, reading, identifying.
Sending invoices across the Peppol network (AS4) is an access point's job; see the
section "Where FactoorSharp stops".

## Creating a Peppol invoice

```csharp
FacturXInvoice.SetLicense("YOUR-LICENSE-KEY");

var invoice = FacturXInvoice.CreateInvoice(
    "RE-2025-0042",
    new DateTime(2025, 9, 3),
    CurrencyCodes.EUR);

invoice.SetSeller("BikeTech GmbH", "10115", "Berlin", "Radweg 12", CountryCodes.DE);
invoice.SetBuyer("City Bikes AG", "20457", "Hamburg", "Hafenstraße 45", CountryCodes.DE);

// flag the invoice as Peppol BIS Billing 3.0 instead of XRechnung (BT-24)
invoice.SpecificationIdentifier = SpecificationIdentifiers.PeppolBisBilling30;

// Peppol has no CII syntax, so UBL is stated explicitly
invoice.Save("peppol-invoice.xml", ZUGFeRDVersion.Version25, Profile.XRechnung, ZUGFeRDFormats.UBL);
```

## XRechnung or Peppol BIS Billing 3.0? Same core, different identifier

Both are CIUS on top of EN 16931 and use the same UBL structure. What tells them apart
is the specification identifier BT-24, which appears as `cbc:CustomizationID` in the
XML. If you already produce XRechnung documents, Peppol needs no second invoice model
and no second library – just a different identifier when saving.

BT-24 is not a closed code list: CIUS of other EU countries can be set through
`SpecificationIdentifier` as a URN as well.

```csharp
// The same invoice model, three target formats – told apart by BT-24 alone:

// 1. XRechnung (the default for the XRechnung profile, identifier set automatically)
invoice.Save("xrechnung.xml", ZUGFeRDVersion.Version25, Profile.XRechnung);

// 2. XRechnung with the KoSIT extension
invoice.SpecificationIdentifier = SpecificationIdentifiers.XRechnung30Extension;
invoice.Save("xrechnung-extension.xml", ZUGFeRDVersion.Version25, Profile.XRechnung);

// 3. Peppol BIS Billing 3.0
invoice.SpecificationIdentifier = SpecificationIdentifiers.PeppolBisBilling30;
invoice.Save("peppol-invoice.xml", ZUGFeRDVersion.Version25, Profile.XRechnung, ZUGFeRDFormats.UBL);
```

## What Peppol additionally requires

The specification identifier alone does not turn an XRechnung into a valid Peppol
invoice. Two things that stay optional in a plain XRechnung are mandatory for Peppol BIS
Billing 3.0:

- **Endpoint identifiers (BT-34 / BT-49):** seller and buyer each need an electronic
  address with its scheme – that is how the Service Metadata Publisher (SMP) finds the
  recipient.
- **Buyer reference or purchase order reference (BT-10 / BT-13):** at least one of the
  two fields has to be filled. For XRechnung documents sent to German public
  authorities, BT-10 usually already holds the Leitweg-ID.

```csharp
// Electronic addresses of seller and buyer (BT-34 / BT-49).
// Common choices are the VAT number (scheme 9930 for Germany) or a GLN (scheme 0088).
invoice.SetSellerElectronicAddress("DE123456789", ElectronicAddressSchemeIdentifiers.GermanyVatNumber);
invoice.SetBuyerElectronicAddress("DE987654321", ElectronicAddressSchemeIdentifiers.GermanyVatNumber);

// Peppol BIS Billing 3.0 requires at least one of these two fields
invoice.ReferenceOrderNo = "PROJ-4711"; // buyer reference, BT-10
// or alternatively:
invoice.OrderNo = "PO-2026-0042";       // purchase order reference, BT-13
```

The business process BT-23 is set automatically on save, because both XRechnung and
Peppol BIS Billing require it.

## Processing incoming Peppol invoices

Reading works exactly as it does for ZUGFeRD and XRechnung. Which rule set the sender
used is recorded in BT-24; the endpoint identifiers sit on the parties. Electronic
addresses are not limited to seller and buyer – the data model provides for them at 19
business terms.

```csharp
var invoice = FacturXInvoice.Load("peppol-invoice.xml");

// Which rule set was it? BT-24 appears as cbc:CustomizationID in the document.
if (invoice.SpecificationIdentifier == SpecificationIdentifiers.PeppolBisBilling30)
{
    var sellerEndpoint = invoice.Seller.ElectronicAddress;   // BT-34
    var buyerEndpoint = invoice.Buyer.ElectronicAddress;     // BT-49
}
```

## Where FactoorSharp stops: the access point

Peppol consists of two parts that are often lumped together: the **document** and the
**network**. FactoorSharp covers the first. Transport across the Peppol network over AS4
is handled by an access point.

| With FactoorSharp | What an access point is for |
|---|---|
| Create and read Peppol BIS Billing 3.0 (UBL) | Sending and receiving across the Peppol network (AS4) |
| Set and evaluate the specification identifier BT-24 | Registration as a Peppol participant |
| Business process BT-23 (set automatically on save) | Recipient lookup via SMP and SML |
| Endpoint identifiers BT-34 / BT-49 with their EAS scheme | Certificates and delivery receipts |
| Fill the mandatory fields BT-10 / BT-13 | |
| ZUGFeRD, Factur-X and XRechnung from the same model | |

## Typical scenarios

- Invoicing business partners elsewhere in the EU who receive via Peppol
- Feeding an existing access point as the document source
- Extending an existing XRechnung integration to Peppol
- Processing incoming UBL invoices from the Peppol network

## Frequently asked questions

**Can FactoorSharp send Peppol invoices?**
No. FactoorSharp works at the document level: it creates, reads and validates Peppol BIS
Billing 3.0 documents. Sending across the Peppol network runs over AS4 and requires an
access point as well as registration as a Peppol participant.

**What is the difference between XRechnung and Peppol BIS Billing 3.0?**
Both are CIUS on top of EN 16931 and use the same UBL structure. What tells them apart
is BT-24 (`cbc:CustomizationID`). XRechnung is the German standard for public
authorities; Peppol BIS Billing 3.0 is the rule set for exchange across the Peppol
network. Peppol additionally requires endpoint identifiers for both parties
(BT-34 / BT-49) and at least one of the fields BT-10 or BT-13.

**Does FactoorSharp support UBL?**
Yes. Alongside CII syntax, FactoorSharp also writes UBL – through `ZUGFeRDFormats.UBL`
when saving. For Peppol that is mandatory, because Peppol BIS Billing 3.0 has no CII
syntax.

**Which endpoint identifiers are supported?**
The electronic address is set together with a scheme from the EAS code list, for
instance the German VAT number (scheme 9930) or a GLN (scheme 0088). The constants live
in `ElectronicAddressSchemeIdentifiers`.

**Do I have to rework my existing invoice model for Peppol?**
No. If you already create ZUGFeRD or XRechnung documents with FactoorSharp, Peppol means
setting the specification identifier and saving as UBL. Line items, taxes and parties
stay as they are.

**Is there a free trial license?**
Yes, 30 days with the full feature set, no payment details required.

## Related pages

- [Product overview](https://www.factoorsharp.de/en/Home/Index.md) – features, pricing, FAQ
- [ZUGFeRD .NET and ZUGFeRD C#](https://www.factoorsharp.de/en/Home/ZugferdDotNet.md) –
  a compact overview for .NET projects
- [Getting started](https://www.factoorsharp.de/en/Home/GettingStarted.md) – installation
  and your first Factur-X invoice
- [Sign up](https://www.factoorsharp.de/account/SignUp?culture=en) – 30-day free trial
