Configuring multi-channel delivery

Configure multiple delivery channels: Peppol, DICO, other procurement networks, email fallback and priorities.

One of the most powerful features of the PSB is multi-channel delivery: through a single API integration you can reach recipients on Peppol, other procurement networks and by email. The PSB automatically selects the best channel, but you can also control the routing yourself.

How does multi-channel work?

By default, the PSB routes all invoices via Peppol. The system checks whether the recipient is registered on Peppol and sends the invoice through the Peppol network. If the recipient is not on Peppol, the fallback mechanism kicks in.

By configuring multiple hooks with Send* topics, you can activate additional channels:

ChannelConfigurationUsagePeppolDefault, always activePrimary route for all Peppol participantsDICOHook with DICO topicConstruction sector invoices via the DICO chain standardOther networksHook with network-specific configurationDelivery to procurement networks such as Coupa and SAP Ariba (see configuration below)Email fallbackHook with email topicRecipients not reachable via any networkSFTPHook with SFTP configurationOn-premise systems with file transferHTTPSHook with HTTPS configurationEnterprise systems with direct API receptionCollabrrHook with Collabrr configurationDocuments to/from the Collabrr platform; can include a send instruction in the same call (e.g. "send via Peppol"). Uses Collabrr ID (-0003:XC...) as identifier
Automatic channel selection

The PSB selects the channel based on a priority order:

  1. PartyId-level hooks take precedence over environment-level hooks; if you have configured a channel for a specific recipient, that channel is always used
  2. Specific topics take precedence over wildcards; a hook for InvoiceSent takes priority over a wildcard hook
  3. When priorities are equal: hook-id as tiebreaker (alphanumeric -- integer IDs come before text, for example: 1 < 02 < 10 < dico < peppol)

Before sending an invoice, you can use queryRecipientParty to check which channel the PSB will use. There are two endpoints, one per document type:

POST /api/v1/{partyId}/salesInvoice/queryRecipientParty
POST /api/v1/{partyId}/purchaseOrder/queryRecipientParty

The body accepts a simple array ["0106:12345678"] or an object with meta attributes { "partyIds": [...], "metaAttributes": {...} }. Optional query parameters: ?preferredDocumentTypeId, ?includeOptions, ?documentFamily (purchaseOrder variant only).

The response shows the selected channel and the available alternatives.

Validation rule: one identifier per scheme per call

Within the same queryRecipientParty call, at most one identifier per scheme/agency code (e.g. 0106, 0190, 0208, 9944) may be included. Multiple identifiers in different schemes within the same call are permitted.

If this rule is violated, the PSB responds with:

EConnect.Psb.Models.EConnectException: 'Duplicate id agencies {code} requested.'

where {code} is the agency code without leading zero (scheme 0208208). To test multiple candidates within the same scheme, make separate API calls -- one per candidate.

For advanced lookups including Access Point URL and certificate, use the Peppol endpoint:

GET /api/v1/peppol/deliveryOption?partyIds=...&documentFamily=...&isCredit=...&documentTypeIds=...&preferredDocumentTypeId=...

The response contains partyId, documentTypeId, processId, protocol (As2/As4), url and certificate.

Forcing a channel

In some cases you may want to override the automatic channel selection. You can do this with the ?channel={hookId} query parameter on the send endpoints:

POST /api/v1/{partyId}/salesInvoice/send?channel=hook-123-abc

This forces the PSB to use the specified channel (hook), regardless of the automatic selection.

Peppol with email fallback as a separate channel

A popular combination is a Peppol hook with an email hook as fallback. Via conditional output topics, the Peppol hook publishes a Send*Fallback topic on delivery errors (HTTP 400, 404 or 500), which the email hook listens to. When the same email hook also explicitly listens to Send* (in addition to Send*Fallback), it automatically appears as channel peppol-fallback in the queryRecipientParty response. This allows the calling code to explicitly select the channel via ?channel=peppol-fallback on the send endpoints, which is useful for scenarios where Peppol is intentionally bypassed.

Setting up Coupa and Ariba
Coupa

eConnect automatically transforms UBL invoices into the cXML format that Coupa expects. The connection requires:

  1. Your client creates accounts on the Coupa CSP test and live environments
  2. The receiving party creates a Shared Secret
  3. TechSupport configures the connection in the PSB
Ariba (SAP Business Network)

The Ariba connection works with 1-to-1 trading relationships, unlike the open Peppol network:

  1. The supplier shares their AN-ID with the buyer
  2. SAP may require a paid subscription at higher volumes
  3. The test environment uses an AN-ID with suffix "-T"
XML transformation

The PSB automatically converts between all common e-invoice formats. If you send an invoice in NLCIUS format but the recipient expects XRechnung, the PSB transforms the document automatically. This works for all supported standards: BIS Billing, NLCIUS, PINT, XRechnung, Svefaktura, ebInterface, DICO, SETU and more.

Transformation is available from the 10K package onwards.

SI 2.0 and SALES005

The PSB supports transformation in both directions between SI 2.0 and SALES005:

  • SI 2.0 → SALES005
  • SALES005 → SI 2.0

Important: SALES005 invoices may not be sent via Peppol. Sending SALES005 requires an email connection. Multi-channel delivery handles this: you send primarily via Peppol, with automatic fallback to email when needed.

Target format on all channels except Peppol

When sending via email, SFTP or HTTPS endpoint, you can include a targetFormat. The PSB then transforms the invoice on-the-fly to the required format. A client who wants to convert a UBL invoice to SALES005 provides a targetDocumentTypeId on download or send -- the invoice is then automatically transformed.

Peppol does not support targetFormat (SALES005 is not allowed via Peppol). On all other channels -- email, SFTP, HTTPS -- targetFormat is available.

Availability

Multi-channel delivery is not included by default in the base service and must be purchased separately as a standalone service/configuration. Contact TechSupport for the options available to you.

Practical scenario

A large company sends invoices to:

  • Dutch clients → Peppol (automatic)
  • Construction sector companies → DICO (specific hook per partyId)
  • A multinational on another procurement network → specific hook
  • Small suppliers without a network → email fallback
  • Collabrr platform users → Collabrr (automatic via Collabrr ID)

All invoices are sent through the same API (POST /api/v1/{partyId}/salesInvoice/send). The PSB handles the correct routing, format and channel for each invoice.

Frequently asked questions
How does the PSB determine which channel to use for an invoice?

The PSB selects the channel based on a priority order. PartyId-level hooks take precedence over environment-level hooks, and specific topics take precedence over wildcards. By default, the PSB routes via Peppol. If the recipient is not on Peppol, the configured fallback kicks in (e.g. DICO, Coupa or email).

Can I override the automatically selected channel?

Yes, with the ?channel={hookId} query parameter on the send endpoints you can force a specific channel. This overrides the automatic channel selection. You can check in advance via queryRecipientParty which channel the PSB would select and decide from there whether to override.

Does multi-channel support document types other than invoices?

Yes, multi-channel routing works for all document types the PSB supports, such as credit notes, orders and order responses. All documents are sent through the same API and the PSB handles the correct routing, format and channel per document.


Need help setting up multi-channel delivery? Contact TechSupport.

Open the API reference