Skip to content
barcoder

Standards/epc-qr

EPC QR / Stuzza

TypeQR Code
PrimaryAT
Completeness89%high

Overview

The EPC QR code (also called SEPA Credit Transfer QR Code or SCT QR) is a European Payments Council standard for encoding the data needed to initiate a SEPA Credit Transfer into a qr-code symbol [1, 2]. The payload is plain-text, line-separated, in a format called BCD — "Beneficiary Credit Data." A user scans the code in any compliant mobile banking app, which auto-populates the transfer form (recipient name, IBAN, amount, reference). The standard was pioneered by Austria's STUZZA in 2012 and adopted by the EPC in February 2013 [3, 4]. The latest revision is v2.10, published 17 June 2024 [1].

History

The Austrian payment-standards organisation STUZZA (Studiengesellschaft für Zusammenarbeit im Zahlungsverkehr) defined the original QR payment standard in 2012, deployed locally under the name Stuzza QR or "Zahlen mit Code" [3]. The European Payments Council adopted and generalised it as EPC069-12 in February 2013, making it a pan-European standard [1, 4].

Country adoption rolled out incrementally — Austria from 2012, Finland in 2015, Germany in 2015 (as Girocode), Netherlands in 2016, Belgium and others following [1, 3]. The standard is now supported by all major banks in the eurozone for invoice / payment-slip QR scanning [3].

Version evolution:

  • v001 (2013) — BIC field mandatory.
  • v002 (current generation) — BIC optional within the EEA, since IBAN alone is now sufficient for SEPA routing [3].
  • v2.10 (17 June 2024) — current EPC guideline revision [1].

Technical specification

The payload is a plain-text, newline-separated set of 11 fields (BCD format) [1, 3]:

# Field Max length Required
1 Service Tag 3 Yes — always BCD
2 Version 3 Yes — 001 or 002
3 Character set 1 Yes — 18 (see below)
4 Identification 3 Yes — always SCT (SEPA Credit Transfer)
5 BIC 11 Mandatory in v001; optional within EEA in v002
6 Beneficiary name 70 Yes
7 IBAN 34 Yes
8 Amount 12 Optional, format EUR<value> (max EUR 999 999 999.99)
9 Purpose code 4 Optional, ISO 20022 purpose codes
10 Structured reference (RF) 35 Optional (mutually exclusive with field 11)
11 Unstructured remittance info 140 Optional (mutually exclusive with field 10)

Character set codes [3]:

Code Encoding
1 UTF-8
2 ISO 8859-1
3 ISO 8859-2
4 ISO 8859-4
5 ISO 8859-5
6 ISO 8859-7
7 ISO 8859-10
8 ISO 8859-15

QR symbology constraints per the EPC guideline [3]:

  • Underlying symbology: qr-code (ISO/IEC 18004)
  • Error correction level: M (mandated)
  • Maximum QR version: 13 (i.e. ≤ 331 bytes of payload)
  • Encoding mode: Byte (most implementations) or auto

Sample payload (Austrian example) [3]:

BCD
002
1
SCT
BKAUATWW
Musterempfänger GmbH
AT611904300234573201
EUR123.45
SALA

Rechnung 12345

Use cases

The EPC QR code is designed for one use case — initiating a SEPA Credit Transfer from printed media — but the deployment contexts are broad:

  • Printed invoices in Austria, Germany, Netherlands, Belgium, Finland and other SEPA countries — utility bills, telecom invoices, insurance premiums, donation requests [3, 4].
  • Payment slips — replacing or supplementing OCR-readable reference lines on bank-issued forms.
  • Donation campaigns — NGOs and religious institutions print QR codes on flyers; donors scan and approve in one tap.
  • E-commerce checkout as an alternative to card payment, particularly for high-value transactions where the merchant avoids card fees by accepting a bank transfer initiated via QR.
  • Cross-border SEPA payments — the same QR works in any SEPA country with a compliant banking app; the standard's pan-European scope was a deliberate EPC design goal [1].

Country-specific brandings of the same underlying EPC QR standard [at-cro, 3]:

  • Stuzza QR / Zahlen mit Code (Austria)
  • Girocode (Germany)
  • Bezahlcode (older German alternative, mostly superseded)

Implementations

The BCD format is simple newline-separated text + a standard QR encoder, so library support exists in every major language. Banking apps in supporting countries scan EPC QR natively.

Open-source libraries with explicit EPC QR / BCD support:

Repo Language Stars License Last release Notes
smhg/sepa-qr-data-php PHP 61 MIT v3.0.0, 31 May 2025 The maintained PHP 8 successor to the deprecated smhg/sepa-qr-php; explicitly tracks the EPC069-12 standard and emits the BCD payload string for a downstream QR encoder [5]
heuer/segno Python 782 BSD-3-Clause v1.6.6, Mar 2025 Pure-Python ISO/IEC 18004 QR encoder with a built-in segno.helpers.make_epc_qr() helper that takes name/IBAN/amount and emits a valid EPC QR symbol [7]
RikudouSage/QrPaymentEU PHP 18 MIT v1.4.0, Sep 2021 EU-payment library that produces the canonical BCD/SCT string (BCD\nSCT\n…) for printing as a QR [6]
paulmillr/qr TypeScript 339 MIT / Apache-2.0 v0.6.0, Apr 2026 Generic zero-dep QR encoder + reader for the symbology layer; pairs with any of the above EPC BCD-string generators [12]
smhg/sepa-qr-php (deprecated) PHP 51 MIT v3.1.0, Feb 2020 Predecessor of sepa-qr-data-php; left in place for legacy installs only — new projects should use the successor [5]

Commercial / other:

  • .NET — DevExpress XtraReports ships QRCodeEPCGenerator as part of its barcode component [8].

Decoders: any QR Code decoder produces the text payload; the BCD field-parsing is trivial (split by newline). qr-code decoders such as zxing/zxing handle the QR side; the application reads the resulting plain-text payload.

Hosted tools: zv.psa.at (Austria's PSA reference generator); the PSA also publishes the BCD documentation for downstream implementers AT.

Comparison

vs. hub3 (Croatian PDF417 standard) — HUB3 carries similar payment data but uses the pdf417 symbology and 14 newline-separated fields rather than QR Code and 11. HUB3's payload includes a Croatia-specific model + reference number field structure that doesn't map cleanly to EPC QR; this is why Croatia maintains both standards in parallel [hub3-ref]. EPC QR is supported in Croatia for cross-border SEPA payments, HUB3 remains the domestic norm.

vs. national EMVCo-MPM QR standards (SGQR, DuitNow QR, PromptPay, QRIS, Bharat QR) — These use the EMVCo TLV binary-ish format with a CRC, support consumer-presented as well as merchant-presented modes, and typically initiate an instant-payment rail transaction (settles in seconds). EPC QR uses BCD plain text and initiates a SEPA Credit Transfer (which historically settled in a business day, though SEPA Instant changes that). Different design lineages: EPC QR comes from the European banking community via Austria; EMVCo MPM comes from the global card-networks via Singapore.

vs. Wero (next-generation pan-European wallet, rolling out 2024–2026) — Wero is the European Payments Initiative's successor wallet, designed for instant P2P / merchant transactions across SEPA, and likely to overlap EPC QR's invoice-payment niche over time. Wero supports QR-based payments natively. EPC QR is not formally being replaced, but Wero's growth may slowly cannibalise the invoice-payment workflow AT.

A regional banking standard adopted pan-Europe in 12 months. The EPC QR specification is a rare case where a single small country wrote the spec and the European Payments Council adopted essentially the same format within a year. STUZZA, Austria's payment-standards body (now folded into PSA), published the original Stuzza QR specification in 2012; the EPC formalised it as EPC069-12 in February 2013 [3, 4]. Most pan-European banking standards take a decade of multi-country negotiation.

Mandated Austrian visual chrome around every payment QR. The Austrian branding "Zahlen mit Code" (literally "Pay with code") is printed next to every EPC QR on Austrian invoices, with vertical text and a distinctive frame. This visual identity is mandated by PSA so consumers can recognise payment-enabled QRs at a glance — German Girocode uses similar but slightly different framing AT.

A 14-character ASCII header decides everything. The first three newlines of every EPC QR payload are literally BCD\n + a version line (001 or 002) + SCT\n ("SEPA Credit Transfer") — three short ASCII tokens that mark this as an EPC-compliant SCT QR. A scanner that doesn't recognise the BCD marker treats the rest as free text and the payment flow never starts; downstream every implementation hardcodes this exact prefix.

BIC stopped being mandatory mid-life. The v001 spec (2013) required the recipient's BIC; the v002 generation (still current under v2.10) made BIC optional within the EEA, because IBAN-only routing became sufficient under the SEPA Regulation [3]. EPC QR is therefore one of the few payment-standard formats whose required-field set shrank over time as the rail it rides got smarter.

SEPA Instant turns EPC QR into a real-time rail. From 9 October 2025, all SEPA PSPs were required to send SEPA instant payments (receiving had been mandatory since 9 January 2025) [1]. The EPC QR payload format did not change, but the rail behind it now settles in seconds — converting a 12-year-old "scan a paper bill and wait a business day" workflow into a "scan and the money is there" experience without touching the standard.

Status

Active and pan-European. Maintained by the European Payments Council as guideline document EPC069-12, current revision v2.10 dated 17 June 2024 [1]. Supported by essentially all eurozone banks for invoice scanning, with country-specific brandings (Stuzza QR / Girocode / etc.) [3]. SEPA Instant Credit Transfer (mandatory across SEPA from 9 October 2025) is making the rail behind EPC QR settle instantly, which removes the historical "QR scan → next-day settlement" awkwardness without changing the EPC QR payload format [hub3-ref].

No deprecation planned. The pan-European Wero wallet may eventually overlap this niche, but for now EPC QR remains the default for printed-invoice payment initiation across the eurozone.

Sources

  1. EPC QR code — Wikipedia
  2. Quick Response Code: Guidelines (EPC069-12) — European Payments Council
  3. European Payments Council documentation
  4. What is the EPC QR Code? — Yowpay
  5. smhg/sepa-qr-php (deprecated predecessor) — GitHub
  6. RikudouSage/QrPaymentEU — GitHub
  7. EPC QR Codes — Segno documentation
  8. EPC QR Code — DevExpress XtraReports
  9. zxing/zxing — QR decoder
  10. AT-austria.md — internal country report (STUZZA, PSA, bank apps)
  11. HUB3 entry — comparison
  12. paulmillr/qr — GitHub
  13. smhg/sepa-qr-data-php — GitHub (active successor)

Deployments

Found in the following country reports (grep across reports/countries/):

Supported by

source · docs/standards/epc-qr/index.md