E-invoicing for accounts receivable

Supported countries

Monite currently supports e-invoicing for entities and counterparts from:

  • 🇧🇪 Belgium
  • 🇩🇪 Germany
  • 🇳🇱 Netherlands

Need other countries? Let us know.

Peppol participant identifiers

To exchange electronic documents using the Peppol network, companies must be registered in Peppol. The Peppol participant ID includes the scheme and ID number.

Monite supports the following participant ID schemes:

SchemeValue used in Peppol ID
BE:ENBelgium Crossroads Bank for Enterprises Number
BE:VATBelgium VAT number
DE:VATGerman VAT number
NL:KVKDutch Chamber of Commerce Number (KVK)
NL:VATDutch VAT number

How to create and send an e-invoice

Creating e-invoices in Monite is similar to creating regular invoices, with a few key differences.

One of the differences is that e-invoices go through additional statuses - issuing and (optionally) failed.

Only draft and newly created invoices can be sent as e-invoices. Already issued invoices cannot be resent as e-invoices.

Before you begin

This guide assumes that:

1. Add counterpart e-invoicing details

Before creating an e-invoice, you must specify the Peppol ID of the counterpart.

Assuming the counterpart already exists in Monite, call POST /counterparts/{counterpart_id}/einvoicing_credentials and provide the counterpart’s scheme name and code (VAT number or business number, depending on the scheme). For example:

1curl -X POST 'https://api.sandbox.monite.com/v1/counterparts/104db...443/einvoicing_credentials' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-ID: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "network_schema": "DE:VAT",
8 "network_identifier": "087095777"
9 }'

Alternatively, if the counterpart has a VAT ID defined, Monite can look up their Peppol ID automatically based on their VAT registration. In this case, provide the UUID of the counterpart’s VAT ID when calling POST /counterparts/{counterpart_id}/einvoicing_credentials:

1curl -X POST 'https://api.sandbox.monite.com/v1/counterparts/104db...443/einvoicing_credentials' \
2 -H 'X-Monite-Version: 2024-05-25' \
3 -H 'X-Monite-Entity-ID: ENTITY_ID' \
4 -H 'Authorization: Bearer ACCESS_TOKEN' \
5 -H 'Content-Type: application/json' \
6 -d '{
7 "counterpart_vat_id_id": "ad01f529-0e93-4ee7-88b1-e67f1afee1a8"
8 }'
If the counterpart has several Peppol IDs with different schemes, you can add them all and later have your end users select the Peppol ID to send the e-invoice to.

In any case, the API call returns Monite id assigned to the counterpart’s Peppol identifier. Note down this id - you will need it later when creating e-invoices for this counterpart.

1{
2 "id": "a0bb9d89-9064-4af8-affa-3be052d07594",
3 "network_identifier": "087095777",
4 "network_schema": "DE:VAT"
5}

2. Create an e-invoice

Create a new draft invoice in the usual way, but with the following additional fields:

FieldDescription
is_einvoiceMust be true.
network_credentials_idUUID of the entity’s Peppol identifier.
counterpart_einvoicing_credentials_idUUID of the counterpart’s Peppol identifier that you obtained previously.

Example:

1{
2 "type": "invoice",
3 "currency": "EUR",
4 "counterpart_id": "104db547-6aa6-4e22-ad25-c2809ccbf443",
5 "line_items": [
6 ...
7 ],
8 ...
9 "is_invoice": true,
10 "network_credentials_id": "3c33e8af-d093-42d7-9269-66b32a679060",
11 "counterpart_einvoicing_credentials_id": "a0bb9d89-9064-4af8-affa-3be052d07594"
12}
While an invoice is still in the draft status, you can change its is_einvoice field to turn e-invoicing on or off for this invoice.

The response returns the full invoice data, along with the Peppol identifier details of the entity and counterpart:

1{
2 "id": "457fed28-7434-4578-8a01-ddcf51eed463",
3 "type": "invoice",
4 "status": "draft",
5 ...
6 "is_einvoice": true,
7 "einvoice_error_comment": null,
8 "network_credentials": {
9 "id": "3c33e8af-d093-42d7-9269-66b32a679060",
10 "network_identifier": "123456789",
11 "network_schema": "DE:VAT"
12 },
13 "counterpart_network_credentials": {
14 "id": "a0bb9d89-9064-4af8-affa-3be052d07594",
15 "network_identifier": "087095777",
16 "network_schema": "DE:VAT"
17 }
18}

3. Send an e-invoice

Before issuing an invoice, call POST /receivables/{receivable_id}/verify to make sure all required fields are filled in.

After a draft invoice has been finalized, call POST /receivables/{receivable_id}/issue to send the e-invoice through the e-invoicing network.

When an invoice has is_einvoice=true, the /receivables/{receivable_id}/issue endpoint works as follows:

  • The invoice is moved from the draft to issuing status, and the receivable.issuing webhook is triggered.

  • Monite attemts to send the document to the counterpart through the e-invoicing network.

  • If the e-invoice is successfully sent:

    • The /issue endpoint returns 200 OK.
    • Invoice status becomes issued and the receivable.issued webhook is triggered.
    • The rest of the invoice lifecycle applies as usual.
  • If the invoice failed to be sent via e-invoicing:

    • The /issue endpoint returns a 4xx error.
    • The error message from the e-invoicing network is saved to the einvoice_error_comment field of the invoice.
    • Invoice status becomes failed and the receivable.failed webhook is triggered.

Credit notes and e-invoicing

Credit notes inherit e-invoicing details (such as the counterpart’s Peppol identifier) from the invoice they are based on. If the original invoice was configured for e-invoicing delivery, the credit note will also be sent via e-invoicing, and vice versa.

Like e-invoices, credit notes go through additional statuses when sent via e-invoicing.

Test e-invoicing

In the Sandbox environment, send e-invoices and credit notes to the following test counterpart:

  • Country: Germany
  • Network scheme: DE:VAT
  • Network identifier: 087095777
  • Other details: any

Attempts to send documents to other counterparts will result in the “No action taken” error from POST /receivables/{receivable_id}/issue.

Limitations

  • Units of measure in e-invoices are sent as the generic C62 code (one, unit).
  • E-invoicing webhooks receivable.issuing and receivable.failed are not triggered in the Sandbox environment.