How to create a SEPA XML payment file from Excel

Blog · 2026-10-02 · 2 min read

Free tool: Open the free SEPA XML generator – runs in your browser, files are not uploaded.

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

ColumnRequired?Notes
NameYesThe beneficiary's name, up to 70 characters. Accents are converted to the SEPA character set (for example ä → ae).
IBANYesSpaces are fine; they are removed. Each IBAN is checked for country length and its mod-97 check digits.
AmountYesIn euro, at most two decimals. Both 1.234,56 and 1,234.56 styles are understood; ambiguous values are flagged.
ReferenceRecommendedUnstructured remittance information, up to 140 characters – the text the payee sees, e.g. the invoice number.
BICOptionalWithin 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:

  1. Group header (GrpHdr): a unique message ID, the creation time, the number of transactions and the control sum (the total of all amounts).
  2. Payment information (PmtInf): your account, the execution date, the service level SEPA and the charge bearer SLEV.
  3. 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

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.

Free tool: Open the free SEPA XML generator – runs in your browser, files are not uploaded.

Sources

Related guides

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.