Skip to main content

Case · Xledger → Lloyds Bank

From an Xledger export to Lloyds, without a portal upload

An international foundation headquartered in the UK pays its partners and suppliers from Lloyds. Its Xledger exports did not meet the Lloyds profile. Now they are converted, encrypted and sent on their own, and the bank’s answers come back.

An international foundation

Headquartered in the UK, paying in several currencies. Confidential client.

Source
Xledger · pain.001.001.03
Output
Lloyds CBD · pain.001.001.09
Channel
SFTP · PGP-encrypted
Back from the bank
pain.002 · statements

The foundation runs its finance in Xledger and banks with Lloyds Commercial Banking Direct. Xledger’s payment export is pain.001.001.03; Lloyds asks for pain.001.001.09 with its own rules on the initiating party, the debtor agent, the payment rail and the account identifiers. Files were rejected, fixed by hand and uploaded again.

We built a converter with an explicit Lloyds profile and a bridge to the bank. The file is converted in the browser, the finance user reviews every change, and one click encrypts it with the bank’s PGP key and sends it over SFTP from an address Lloyds allowlists. Status reports and statements are pulled back every few minutes and matched to the payments they answer.

One payment, from Xledger to Lloyds and back

Xledger

pain.001.001.03 · Xledger export

<PmtInf>  <PmtTpInf>    <SvcLvl><Cd>NURG</Cd></SvcLvl>  </PmtTpInf>  <CdtTrfTxInf>    <Amt><InstdAmt Ccy="USD">2500.00</InstdAmt></Amt>  </CdtTrfTxInf></PmtInf>

Agent

Bacs carries GBP only

Reviewed by a person

pain.001.001.09 · Lloyds CBD profile

<PmtInf>  <PmtTpInf>    <SvcLvl><Cd>URGP</Cd></SvcLvl>  </PmtTpInf>  <CdtTrfTxInf>    <Amt><InstdAmt Ccy="USD">2500.00</InstdAmt></Amt>  </CdtTrfTxInf></PmtInf>
✓ ISO 20022 XSD✓ Lloyds CBD v9 profile✓ Cut-off · UK working day
Sent over SFTP to →
Lloyds Bank
← pain.002 · accepted

1 / 6
The scene in words
  1. Xledger exports the payment run as pain.001.001.03.
  2. The agent checks it against the Lloyds profile: a US dollar payment is on Bacs, which only carries sterling.
  3. It moves the batch to the international rail, sets the initiating party Lloyds assigned, and puts the IBAN where Lloyds reads it.
  4. It writes pain.001.001.09 for Lloyds Commercial Banking Direct, and a person reviews every change before anything leaves.
  5. The file is validated, encrypted with the bank’s PGP key and sent over SFTP, inside the cut-off for the day.
  6. The bank’s pain.002 status report comes back and marks the payment accepted. Statements arrive the same way.

What the Lloyds profile checks

The initiating party carries the client ID Lloyds assigned at onboarding, one per environment, so a test file can never reach production. The debtor agent needs a sort code or a BIC. Bacs only carries sterling, so a batch in another currency is moved to the international rail and flagged for review.

Account numbers sent in the wrong element are moved to the IBAN element. A requested execution date in the past is moved to the next working day and shown to the user. Malformed creation timestamps are rejected rather than guessed.

How the bridge talks to Lloyds

Conversion happens in the browser; nothing is uploaded until the user presses Submit to Lloyds. The server then encrypts the file with the bank’s PGP key, sends it over SFTP with a pinned host key from a fixed address on the bank’s allowlist, and records it in a ledger.

A timed job collects the bank’s outbound folder every few minutes: pain.002 status reports update each submission, and statements (MT940 or camt.053) are kept for reconciliation. Access to the app sits behind single sign-on with an email allowlist.

What is a pain.001 file?

pain.001 is the ISO 20022 XML message a company sends its bank to start credit transfers. One file carries a batch of payments: who pays, who is paid, the IBANs, the amounts and the execution date. Accounting and ERP systems such as Twinfield and Xledger export it, and the finance team uploads it to the bank or sends it over SFTP.

The bank checks the file against the ISO schema (XSD) and against its own usage guidelines before it pays. A file that fails either check is rejected as a whole or payment by payment.

pain.001.001.03 and pain.001.001.09

pain.001.001.03 is the 2009 version of the message, and it is still what most accounting systems export. pain.001.001.09 is the 2019 version, which the European Payments Council adopted for SEPA in November 2023. It adds structured address elements, the LEI and a few other fields, and some elements move or change name.

Converting is not a find-and-replace on the namespace. The group header, the execution date format, the address and the bank-specific identifiers all change, and every bank publishes its own rules on top of the standard.

Questions about this case

Does Lloyds Bank accept pain.001.001.03?

Lloyds Commercial Banking Direct asks for pain.001.001.09 with its own usage guidelines: the initiating party ID it assigns, a debtor agent with a sort code or BIC, and service levels that match the payment rail and currency.

Can payment files be sent to Lloyds automatically?

Yes. Lloyds Commercial Banking Direct accepts files over SFTP, encrypted with PGP or signed with PKI. Our bridge PGP-encrypts the converted file, sends it from an allowlisted address, and pulls the pain.002 status reports back.

Can Xledger payments go to Lloyds without manual edits?

Yes, through a converter that knows the Lloyds profile. It fixes what is safe to fix, shows every change, and stops on what only a person can decide, such as a payment date in the past.

What comes back from the bank?

pain.002 payment status reports, matched to each submission, and statements in MT940 or camt.053 for reconciliation.