Most online banks in the euro area let a business upload a single file that contains many payments – salaries, supplier invoices, refunds – instead of typing them one by one. That file is a SEPA Credit Transfer initiation message in ISO 20022 XML, usually called pain.001. If your payment list lives in Excel or Google Sheets, you can turn it into that file in a few minutes.
1. Put your payments in a sheet with these columns
| Column | Required? | Notes |
|---|---|---|
| Name | Yes | The beneficiary's name, up to 70 characters. Accents are converted to the SEPA character set (for example ä → ae). |
| IBAN | Yes | Spaces are fine; they are removed. Each IBAN is checked for country length and its mod-97 check digits. |
| Amount | Yes | In euro, at most two decimals. Both 1.234,56 and 1,234.56 styles are understood; ambiguous values are flagged. |
| Reference | Recommended | Unstructured remittance information, up to 140 characters – the text the payee sees, e.g. the invoice number. |
| BIC | Optional | Within the EEA the IBAN alone is enough. Some banks still ask for it for payments to non-EEA SEPA countries (for example Switzerland or the UK). |
Keep one payment per row, no merged cells and no subtotal rows. Save as .xlsx or .csv.
2. Add your own (debtor) details
The file also needs the account the money leaves from: your company name, your IBAN and, optionally, your BIC, plus the requested execution date (the day you want the bank to execute the payments).
3. Generate the XML
A pain.001 file has three levels:
- Group header (
GrpHdr): a unique message ID, the creation time, the number of transactions and the control sum (the total of all amounts). - Payment information (
PmtInf): your account, the execution date, the service levelSEPAand the charge bearerSLEV. - One credit transfer per payee (
CdtTrfTxInf): the end-to-end ID, amount, name, IBAN and reference.
A shortened example (pain.001.001.03):
<GrpHdr><MsgId>MSG20261002-0001</MsgId><CreDtTm>2026-10-02T09:30:00</CreDtTm>
<NbOfTxs>2</NbOfTxs><CtrlSum>1750.00</CtrlSum>...</GrpHdr>
<PmtInf>... <ReqdExctnDt>2026-10-05</ReqdExctnDt> ...
<CdtTrfTxInf><PmtId><EndToEndId>INV-1042</EndToEndId></PmtId>
<Amt><InstdAmt Ccy="EUR">1250.00</InstdAmt></Amt>
<Cdtr><Nm>Example Supplier GmbH</Nm></Cdtr>
<CdtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></CdtrAcct>
<RmtInf><Ustrd>Invoice 1042</Ustrd></RmtInf></CdtTrfTxInf>
Writing this by hand is error-prone: one wrong control sum and the bank rejects the whole file. Our PayBatchKit reads the sheet in your browser, checks every row and writes the XML for you. The data is not uploaded anywhere.
4. The checks that prevent rejections
- IBAN check digits – catches most typing errors (see how IBAN validation works).
- Character set – SEPA allows only a basic Latin set. Characters such as
&,ßor emoji must be converted or removed. - Control sum and count – must match the transactions exactly, in cents.
- Field lengths – name 70, reference 140, end-to-end ID 35 characters.
- Currency – SEPA credit transfers are in euro only.
5. Upload and check the preview
In online banking look for "file upload", "SEPA file", "Sammelüberweisung", "virement groupé" or "batch payment". After uploading, always check the bank's preview (number of payments and total) before approving. The first time, test with a small file.
Which version: .03 or .09?
Use pain.001.001.03 unless your bank asks for pain.001.001.09. The differences are explained in pain.001.001.03 vs .09.
Sources
- ISO 20022 message catalogue (pain.001)
- European Payments Council – SEPA Credit Transfer rulebook and implementation guidelines
Related guides
- pain.001.001.03 vs pain.001.001.09
- SEPA structured addresses: the November 2026 deadline was postponed
- How IBAN validation works
Published 2026-10-02 by Karuna Labs. Our tools check file structure and checksums; always review outputs (and payment files in your bank's preview) before relying on them. This is general information, not financial, tax or legal advice.