A payment list from Excel to a bank XML file. Checked, in a minute.

Paste payments copied from Excel or CSV, fill in the payer’s IBAN, and download a pain.001 batch payment file. The file is checked right after generation by the same engine as SEPA pain.001 Doctor.

  • 4 Slovak banks, plus a generic DE (Deutsche Kreditwirtschaft) profile
  • 456 automated tests
  • max. 5000 payments
  • €0, no account
  • runs in your browser

01

Paste payments, fill in the payer. You get a finished XML.

Nothing you paste is sent anywhere. Generating and checking both run in your browser.

Payersaved profiles PRO
For a Slovak IBAN, this is derived automatically from the 4-digit bank code. For an IBAN from another country, fill it in by hand. Since February 2016, BIC has been optional for IBANs from EEA/SEPA countries anyway.
Optional. If you fill it in, it must contain at least the town and the country code, the minimum of a structured address under the EPC rules. We derive the country from the IBAN when you leave it empty.
Settings
Slovakia: VS/SS/KS packed into EndToEndId. Germany (DK): no VS/SS/KS, an unstructured Verwendungszweck and an optional EndToEndId column instead.
Slovak banks currently expect .03 for bulk import. Some banks are moving to .09, each on its own timetable. Both versions can carry a structured address.
Paymentsfrom Excel (Ctrl+V) or a .csv/.txt/.tsv file
Additional payment blocksseveral files at once PRO
Result · idle
PRO
fill in the payer and payments, press Generate or ⌘↵
status
idle
waiting

Would you rather not deal with this yourself? Send us the file and within 24 hours you get a written report on what needs fixing in it, addresses included, and the corrected file. 149 €

Get the file checked

02

Three things that most often break a hand-assembled XML file.

Assembling pain.001 XML by hand in a text editor or an Excel formula is possible, but one small mistake is enough for a bank to reject the file without explanation.

  1. Columns are recognized by name, not by position.

    The generator looks for headers like “IBAN”, “Amount”, “Name” automatically, in Slovak, English or German. For an unusual spreadsheet, check the mapping and fix it by hand in the dropdowns above the preview if needed.

  2. VS/SS/KS have no field of their own in the XML.

    They have to be written into EndToEndId in the exact order /VS.../SS.../KS... (the “sk” country profile does this automatically). The “de” profile skips VS/SS/KS entirely and uses an unstructured Verwendungszweck instead, since German banks don’t use these Slovak reference symbols.

  3. The format is one thing, a bank’s own rules another.

    After generation, the same engine as SEPA pain.001 Doctor runs over the file: BIC, execution date, accented characters, and the transaction cap for the selected bank.

03

Two functions. Payments in, XML out, checked right away.

No server, no API key, no sign-up. generator-pain001.js is plain JavaScript: read it, fork it, or run it in your own code or CI.

generator-pain001.js 0 dependencies
import { parseRows, mapColumns, buildXml } from './generator-pain001.js';
import { diagnose } from './doctor-pain001.js';
// or globally: const { parseRows, mapColumns, buildXml, bicFromIban } = window.SepaGenerator;

const rows = parseRows(excelRows);
const { payments } = mapColumns(rows, undefined, profile);

const xml = buildXml({
  bank:     'tatrabanka' | 'slsp' | 'vub' | 'csob' | 'generic',
  profile:  'sk' | 'de',  // 'de': Verwendungszweck instead of VS/SS/KS
  payer:    { name, iban, bic },
  execDate: '2026-09-06',  // default: tomorrow
  msgId:    undefined,       // default: auto ARL-YYYYMMDD-HHMMSS
  payments,       // {iban, amount, name, vs, ss, ks, message, bic, endToEndId, dateIso}[]
});

// the file is checked right away by the same engine as SEPA pain.001 Doctor:
const report = diagnose({ xml, bank: 'tatrabanka' });

Parsing Excel/CSV, mapping columns, and building the XML run exactly as the form above calls them, in your browser. There is no backend or API key that could carry your payments’ content anywhere else.

The order and mandatory/optional status of every XML field comes directly from Tatra banka’s technical documentation (pain.001.001.03, GroupHeader and PaymentInformation sections) and the same bank-specific rules SEPA pain.001 Doctor checks.

Free, open, no ads, and no tracking beyond anonymous usage counts. If the generator gets a case wrong, please report it as an issue on GitHub.

This tool is not affiliated with any bank and is not a bank itself. A clean check result does not guarantee a bank will accept the payment.

04

Pro for a bookkeeper who does this every month.

The free version generates a file with up to 5,000 payments, with no cap on the number of files or downloads. Pro is convenience for repeat monthly use; the limit of 5,000 payments per file applies there too.

  1. Saved payer profiles.

    Company name, IBAN, BIC and bank in one click from a dropdown, no retyping for every batch.

  2. Several files at once.

    Add several payment blocks (e.g. from three spreadsheets) and generate either a separate XML per block, or one merged file.

  3. Column-mapping templates.

    Preset column names for exports from Pohoda, Omega (KROS) or Money S3. The mapping can still always be checked and fixed by hand.

One licence for three tools. Pro for SEPA pain.001 Generator is activated by the same licence as camt.053 to Excel and Payment matcher: €9/month or €79/year for all three, VAT included. Stripe processes the payment through Managed Payments; Link (Sold through Link, LLC) sends you the receipt and the invoice. SEPA pain.001 Doctor is free and needs no licence.

Payment via Stripe, VAT included, cancel anytime. You get the licence key on the confirmation page right after payment.

no licence

05

Free. No account, no payment.

Built out of a real need: turn a payment list from Excel into a batch payment file without hand-assembling XML. No account, no payment, up to 5,000 payments per file, no cap on the number of files or downloads.

If it saves you an afternoon, let us know what the generator got wrong. Open an issue on GitHub.

Need this for a business? Bulk processing, an API for your accounting system, support. Tell us what you need and we’ll reply within 24 hours.

Tell us what you need

06

Questions people actually search for.

Direct answers about generating a SEPA pain.001 file from Excel.

How do I prepare Excel so the generator reads it?

Select the IBAN, amount and recipient-name columns (ideally with a header row) and copy the cells straight into the text field (Ctrl+C, Ctrl+V): Excel pastes them tab-separated and the generator detects that automatically, in Slovak, English or German headers. A CSV export delimited with a semicolon or comma works the same way, as does uploading a .csv/.txt/.tsv file directly. If the automatic column detection misses a field, fix it by hand in the dropdowns above the payments preview.

Where does the payment reference (VS/SS/KS) go in the SEPA XML?

pain.001.001.03 has no dedicated field for the Slovak variabilný/špecifický/konštantný symbol. In the “Slovakia” profile, the generator writes them into PmtId/EndToEndId as /VS.../SS.../KS..., exactly the National Bank of Slovakia convention checked by the sibling tool, SEPA pain.001 Doctor. In the “Germany (DK)” profile, these three fields don’t exist at all: the text goes into RmtInf/Ustrd (Verwendungszweck), and EndToEndId is taken from its own mapped column, or defaults to “NOTPROVIDED” if left empty.

How do I import the XML into my bank’s online banking?

Upload the downloaded .xml file in your bank’s online banking form for a batch/bulk payment (usually under Payments → Bulk payments → Import file). This works the same way at Tatra banka, SLSP, VÚB and ČSOB as at German, Austrian and Swiss banks (for example Sparkasse, Volksbank, Deutsche Bank, Commerzbank, Raiffeisen, Erste, UBS or PostFinance); the exact location differs between banks. If the import fails, check the SEPA pain.001 Doctor report shown right after generation first: it points to the exact element a bank will reject.

Is my payment data sent anywhere?

No. Parsing Excel and generating the XML both run entirely in your browser. IBANs, amounts and names are never sent anywhere; the tool has no backend. The only network activity is loading the page’s static files and an anonymous usage counter (Umami), which records only that generation happened and what the check result was, never the content of the payments.

How many payments can be in one file?

The generator processes at most 5000 payments at once. If payments have different execution dates, the generator automatically splits them into separate PmtInf blocks by date. Tatra banka accepts at most 500 transactions in one file, across all blocks together; splitting them into blocks within one file is not enough. For a Tatra banka file with more than 500 payments, SEPA pain.001 Doctor reports a blocking error after generation: split the payments into several files.

Why did the bank reject the file even after the check?

SEPA pain.001 Doctor checks publicly documented format and bank-specific rules, not your account’s status, whether the recipient’s account exists, or a bank’s internal limits (e.g. a daily transfer cap). A clean check result is therefore not a guarantee of acceptance. If a bank rejects the file anyway, check the exact error text in internet banking first.

What do I get with Pro?

Saved payer profiles (IBAN, BIC, bank in one click), generating several payment files at once, preset column-mapping templates for Pohoda, Omega (KROS) and Money S3, a history of the last 50 generated commands with re-download, and priority email support. Generating and checking the XML itself stays completely free, unchanged. See the Pro section.

Do I have to pay to generate an XML?

No. Generating and checking a file are free, up to 5,000 payments per file, with no cap on the number of files or downloads. Pro is just extra convenience for someone preparing batch payments repeatedly.

How do I get an invoice?

The licence is sold through Stripe Managed Payments. The merchant of record there is Link (Sold through Link, LLC), which sends you the receipt and the invoice as a PDF; Stripe calculates and remits the VAT. ARLing s. r. o. delivers the tool and the licence key.

What if I change computers?

The licence key isn’t tied to one device. You’ll find it on the confirmation page right after payment; on a new computer, just paste it manually into the licence-key field in the Pro section, and Pro activates there too.

What if I don’t want Pro, can I get a refund?

Yes. If Pro doesn’t work out for you, write within 14 days of purchase to support@arling.sk and we refund the payment through Stripe, no reason needed. You can cancel the subscription at any time in the Stripe customer portal; it stays active until the end of the paid period.

How does the “Germany (DK)” profile differ from “Slovakia”?

The “Germany (DK)” profile (Deutsche Kreditwirtschaft, the pain.001.001.03 rules used in German banking) hides the VS/SS/KS columns and offers one free-text Verwendungszweck instead (max. 140 characters, SEPA character set) plus an optional EndToEndId column. The bank list collapses to one generic “Bank nach DK-Regelwerk (pain.001.001.03)” preset instead of the four Slovak banks, since Tatra banka/SLSP/VÚB/ČSOB’s own per-bank rules don’t apply to it. BIC stays optional, as for any IBAN from an EEA/SEPA country.