Technical guide to SEPA payment processing for developers, covering credit transfers, direct debits, mandates, and XML formats.
The Single Euro Payments Area (SEPA) enables euro-denominated payments across 36 countries using standardized formats and rules. If you process payments in Europe, you work with SEPA whether you realize it or not. Your PSP abstracts much of the complexity, but understanding the underlying mechanics helps you build better payment systems and debug problems faster.
A push payment: the payer instructs their bank to send money to the payee. This is the standard bank transfer.
Characteristics:
Use cases: Invoice payments, payouts to suppliers or customers, salary payments.
Same as SCT but settles in seconds (target: under 10 seconds, 24/7/365).
Characteristics:
Developer impact: If your platform processes payouts, SCT Inst dramatically improves the user experience. Funds arrive in seconds instead of next business day.
A pull payment: the payee (you) instructs the payer's bank to debit the payer's account based on a pre-signed mandate.
Characteristics:
Use cases: Subscription billing, utility bills, membership fees, loan repayments.
Like SDD Core but for business-to-business payments.
Key difference: No 8-week no-questions-asked chargeback right. The debtor's bank verifies the mandate before processing. This makes B2B direct debits more reliable for the creditor but requires the debtor's bank to hold a copy of the mandate.
A SEPA Direct Debit mandate is the legal authorization from the payer allowing you to collect payments from their account. Getting mandate management right is critical.
Every mandate must contain:
For online businesses, digital mandates are the practical option:
1. Customer enters their IBAN on your checkout page
2. You present the mandate text with all required fields
3. Customer confirms (checkbox + submit, or electronic signature)
4. You store the mandate and generate the UMR
5. You can now submit direct debit collections against this mandate
IBAN validation is mandatory. Validate the format (country code + check digits + BBAN) and optionally verify the account exists through your bank or PSP.
Created -> Active -> (Amended | Cancelled | Expired)
A mandate expires if not used for 36 months. Track the last collection date and warn customers before expiry if they have not been charged recently.
If you interact with bank systems directly (rather than through a PSP), you need to produce and consume SEPA XML messages.
Used to instruct your bank to send credit transfers:
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>MSG-2026-01-20-001</MsgId>
<CreDtTm>2026-01-20T10:00:00</CreDtTm>
<NbOfTxs>1</NbOfTxs>
<CtrlSum>150.00</CtrlSum>
<InitgPty><Nm>Your Company BV</Nm></InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId>PMT-001</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<NbOfTxs>1</NbOfTxs>
<PmtTpInf><SvcLvl><Cd>SEPA</Cd></SvcLvl></PmtTpInf>
<ReqdExctnDt><Dt>2026-01-22</Dt></ReqdExctnDt>
<Dbtr><Nm>Your Company BV</Nm></Dbtr>
<DbtrAcct><Id><IBAN>NL00ABCD0123456789</IBAN></Id></DbtrAcct>
<CdtTrfTxInf>
<PmtId><EndToEndId>INV-2026-0042</EndToEndId></PmtId>
<Amt><InstdAmt Ccy="EUR">150.00</InstdAmt></Amt>
<Cdtr><Nm>Supplier BV</Nm></Cdtr>
<CdtrAcct><Id><IBAN>DE00EFGH9876543210</IBAN></Id></CdtrAcct>
<RmtInf><Ustrd>Invoice 2026-0042</Ustrd></RmtInf>
</CdtTrfTxInf>
</PmtInf>
</CstmrCdtTrfInitn>
Used to submit direct debit collection instructions:
Used to receive bank statements for reconciliation. Contains your account movements with structured remittance information.
Understanding SEPA processing timelines prevents confusion:
SEPA transactions can fail at various stages. Common return reasons:
| Code | Meaning | Action |
|---|---|---|
| AC01 | Incorrect IBAN | Verify IBAN with customer |
| AC04 | Closed account | Request new payment details |
| AC06 | Blocked account | Contact customer |
| AG01 | Transaction forbidden | Check mandate status |
| AM04 | Insufficient funds | Retry after a few days |
| MD01 | No valid mandate | Re-sign mandate |
| MS02 | Refusal by debtor | Contact customer |
| MS03 | Reason not specified | Contact customer's bank |
Track return codes and build automated responses: retry for transient issues (AM04), request customer action for permanent issues (AC01, AC04), and flag anomalies for manual review.
SEPA is well-specified and reliable once you understand its rules. The mandate lifecycle, processing timelines, and chargeback windows are the areas where developers most often make mistakes. Build mandate management into your data model from the start, respect processing deadlines, and handle return codes systematically.
Whether you're modernizing your infrastructure, navigating compliance, or building new software - we can help.
Book a 30-min Call