---
title: "SEPA Payments"
space: "ERPNext"
url: "https://www.prilk.com/docs/erpnext/localization/netherlands/sepa-payments"
updated: "2026-05-14"
---

# SEPA Payments

Pay multiple suppliers in one batch by uploading a SEPA XML file to your
bank's online portal — much faster than entering each transfer manually,
and the bank's checks happen client-side before money moves.

This module generates **PAIN.001.001.03** XML (the current SEPA Credit
Transfer schema) from a Payment Order, validates IBANs, looks up BIC codes
for Dutch banks automatically, and attaches the resulting file to the
Payment Order for download.

## When to use this

- **Batch supplier payments** — you have 10 Purchase Invoices due, you want
  to pay all of them on Friday in one bank upload.
- **Salary runs** if you're not on a payroll provider — single XML, one bank
  upload, dozens of net-salary credits.
- **Refunds to Customers** that don't go via Mollie / your payment provider.

## What it does *not* do

- **SEPA Direct Debit (SDD)** — not yet implemented. You can still create a
  Payment Order for direct debits but the XML generator will reject it.
  Use your bank's own SDD portal for now.
- **Cross-currency** — SEPA is EUR only. Non-EUR payments still go through
  ERPNext's standard payment flow, just not through this XML.
- **Real-time / instant SEPA** — this generates a batch file; your bank may
  offer instant transfers separately.

## Creating a SEPA batch

1. **Settle individual Payment Entries first.** Each Purchase Invoice gets
   its Payment Entry created and saved (but not submitted) — these reference
   the supplier's bank details.
2. **Create a Payment Order** (Accounts → Payment Order → New). Pick the
   company bank account that will be debited.
3. **Add references** — pick the saved Payment Entries that should be part
   of this batch.
4. **Save**. The Payment Order form now shows a **Generate SEPA XML**
   button (added by NL Localization when the country is Netherlands).
5. **Click Generate SEPA XML.** The module validates everything, then
   attaches the file. You'll see the result either as an attachment or as
   an error toast pointing at the offending field.
6. **Download the file** from the Attachments sidebar.
7. **Upload to your bank's portal** — every Dutch bank's business portal
   has a "SEPA batch upload" page. The bank validates the schema, shows you
   the per-line totals, and asks you to confirm.

## What gets validated

The generator refuses to produce an XML file unless every prerequisite is
met — the bank would reject it anyway, this just gives you the error first:

- **Debtor IBAN** (the company bank account) — present, mod-97 checksum valid.
- **Debtor BIC** — auto-filled from the IBAN if the bank is recognised
  (ABN AMRO, ING, Rabobank, Triodos, Knab, bunq, Bunq, ASN, SNS, RegioBank,
  Volksbank). If your bank isn't on the list, set BIC manually on the
  Company bank account.
- **Creditor IBAN per Payment Entry** — present, mod-97 checksum valid.
- **Amounts** — positive, EUR.
- **End-to-end reference** — each payment entry gets a unique reference so
  the bank statement reconciliation links back later.

If you hit a validation error, fix the offending Supplier / Payment Entry
and click Generate SEPA XML again — the file regenerates from scratch.

## Reconciling once paid

After uploading to the bank and the batch settles, the **Bank Reconciliation
Tool** (or the *advanced_bank_reconciliation* app if installed) will pick
up each line from the bank statement and match it to the corresponding
Payment Entry via the end-to-end reference baked into the XML.

## File location

The XML attaches to the Payment Order document under **Attachments** in the
sidebar. It's also archived in the File List so you can re-download later
for audit purposes.
