SEPA Payment QR Code (EPC, GiroCode)

On an invoice, a membership request or a collection: the payer scans the code from their banking app, which prefills the beneficiary, IBAN, amount and reference.

  • Free
  • No sign-up
  • Never expires
  • No scan tracking

Static QR codes: the content is written into the code itself, with no redirection through our servers. It will always work, unlike “dynamic” QR codes that stop working at the end of a free trial. Static vs. dynamic: the difference

What should your QR code open?
Content: SEPA transfer

    Customization

    Style presets
    Colors
    Shapes
    Modules
    Corner finder pattern outline
    Corner finder pattern center
    Logo in the center

    PNG, JPG, WebP or SVG, 2 MB at most. The image stays on your device. The error correction level switches to H to make up for the covered area.

    Frame and call to action
    Frame

    32 characters at most. A short prompt works best.

    Error correction M

    Share of the code that can be damaged, dirty or covered without preventing reading. The higher it is, the more modules the code has.

    100% local processing, nothing is uploaded

    How does it work?

    Enter the beneficiary’s name, their IBAN (checked with its check digits), the amount if you know it and a free-text remittance or a structured RF reference (ISO 11649, also checked). The BIC is only required for an account outside the European Economic Area.

    The code follows the European Payments Council’s EPC069-12 standard (version 3.1 of March 19, 2024), also known as “GiroCode”: version 002, UTF-8 character set, error correction level M, 331 bytes and version 13 at most. The logo is therefore disabled for this type of code. The payer scans it from their banking app (the feature exists in many banks, particularly in Germany, Austria and Belgium; it is still rare elsewhere): the transfer fields are prefilled, and all they have to do is confirm.

    The standard asks for the information to be displayed in plain text next to the code too, so that the payer can check the beneficiary and the amount. No bank details are uploaded: the code is computed in your browser.

    Examples

    A club membership fee

    “Friends of the Park Association”, a German IBAN, €25, remittance “Membership 2027 Smith”: 102 bytes, a code of 41 × 41 modules at level M. On a form read from 20 cm (8 in), allow 4 cm (1.6 in) per side.

    A contractor’s invoice

    For €1,250.40 with the structured reference RF18 5390 0754 7034, the content fits in 83 bytes: a code of 37 × 37 modules. The RF reference lets the beneficiary match the payment to the invoice automatically.

    Frequently asked questions

    Can every bank read this QR code?
    No. It is an optional feature for banks. It is widespread in Germany, Austria and Belgium, rarer elsewhere. Always show the IBAN and the amount in plain text next to the code, so that everyone can pay.
    What is a structured RF reference?
    A standardized creditor reference (ISO 11649): “RF”, two check digits and up to 21 characters. It can be verified by calculation, which avoids typing errors and makes automatic matching easier. Otherwise, use a free-text remittance of 140 characters at most.
    Does the code trigger the payment?
    No. It only prefills the transfer in the banking app; the payer checks and confirms it themselves, with their usual authentication.
    How can fake payment QR codes be avoided?
    As a payer: check the beneficiary’s name and the IBAN shown by the bank before confirming. As an issuer: print the code on your own documents, never on a sticker that is easy to replace. Our scanner shows the content of a transfer code without triggering anything.
    Will my QR code expire?
    No. The QR codes created here are static: your link, text or credentials are written into the pattern of the code itself. There is no server between the phone and your content, so there is nothing to renew or pay for: the code will work as long as the content (your website, for example) exists.

    Official sources

    Last checked: