How to send a Stripe invoice over Peppol, step by step
A concrete walkthrough from a finalised Stripe invoice to a delivered Peppol document, including what each delivery state actually means.
You have a customer who wants their invoice over Peppol, and the invoice already exists in Stripe. This is the walkthrough from that starting point to a delivered document. Stripe stays your billing system throughout: the invoice you send is the invoice you already raised.
1. Finalise the invoice in Stripe
Peppol delivery only works on finalised invoices and credit notes, not drafts. A draft can still change its number and its totals, and a structured invoice has to be authoritative — the number and amounts become part of the machine-readable document that lands in your customer's system. So finalise it in Stripe first, exactly as you would before emailing the PDF.
Credit notes work the same way, and are how you fix a document you have already sent: credit notes over Peppol covers that case.
2. Check your own company details
This is the step people skip, and it is the one that causes rejected sends. Your own profile (legal name, VAT number, registered address, country) flows straight into the UBL as the supplier fields. Peppol validation is strict about these. A missing VAT number or a malformed address can fail the document before it reaches anyone.
Peppost pre-fills this from what Stripe already holds when you connect, but it is worth a look before your first real send. If a field is thin in Stripe, fix it in Stripe so your source of truth stays correct. The account settings guide covers where each field comes from.
3. Connect Stripe to Peppost
You do this once. Sign in with Stripe, which runs an OAuth handshake: Peppost never sees your Stripe secret keys, only a scoped credential Stripe issues. Your company profile is read across automatically, and finalised invoices and credit notes become visible to send. A test-mode Stripe account works end to end, so you can rehearse before touching a live invoice.
4. Look up the recipient
A Peppol invoice is addressed to a participant identifier, usually built from the recipient's VAT or company number, rather than to an email address. Before sending, Peppost resolves that identifier against the Peppol Directory to confirm the recipient is registered and can accept the document. This happens before any credit is spent. If they come back as not reachable, checking a customer covers what to do next.
5. Dispatch
With the recipient confirmed, you send. Peppost generates the UBL 2.1 document in the Peppol BIS Billing 3.0 profile, attaches the original Stripe PDF as the human-readable rendering, and hands it to a certified access point. One credit is spent per send. The full click-path, including where each button lives, is in the sending guide.
What the delivery states mean
A send moves through stages rather than resolving at once:
- Sent to access point — the document has left Peppost and entered the network through the sending access point. Most sends reach this within seconds.
- Delivered — the recipient's access point has accepted the document. This is the confirmation that matters, and it usually arrives within a few minutes, depending on how quickly the recipient's system responds.
- Failed — something rejected the document. If it failed before leaving the access point, the credit is refunded automatically. If the recipient's access point raised the error after delivery was attempted, you see the original network error message. Commonly it is a supplier field that did not validate, which loops you back to step two.
Delivery status sits next to each invoice in the app. If a state stalls or an error message is opaque, the troubleshooting page maps the common ones to their causes, and the FAQ covers what happens to your credit when a send fails.
After the first one
The first send is the one worth doing carefully: check your details, use test mode, watch it go all the way to delivered. After that it is a couple of clicks per invoice, and a credit is spent only when you send. For the wider picture of why Stripe needs this layer at all, start with does Stripe support Peppol.