# Virtuaaliviivakoodi

> Source: https://docs.barcoder.ai/docs/standards/virtuaaliviivakoodi
> research date 2026-10-06 · extracted at 2026-10-06
> Publisher: Barcoder — encyclopedia of QR, barcode and payment-code standards

Specifications:
- [Bank Bar Code Guide v5.3 — Finance Finland](https://www.finanssiala.fi/wp-content/uploads/2021/03/Bank_bar_code_guide.pdf)
- [Pankkiviivakoodi-opas v5.3 (Finnish/Swedish) — Finanssiala](https://www.finanssiala.fi/wp-content/uploads/2021/03/Pankkiviivakoodi-opas.pdf)
- [Forming a Finnish reference number — Finance Finland](https://www.finanssiala.fi/wp-content/uploads/2021/03/Forming_a_Finnish_reference_number.pdf)
- [Guidelines for the QR code in the Credit Transfer Forms — Finance Finland](https://www.finanssiala.fi/wp-content/uploads/2021/03/QR_code_in_credit_transfer_forms.pdf)

## Overview

The **virtuaaliviivakoodi** ("virtual barcode") is the 54-digit human-readable form of the Finnish **bank bar code** (*pankkiviivakoodi*), a Code 128 symbol printed on the credit transfer form (*tilisiirtolomake*) of Finnish invoices <sup>[1][1]</sup><sup>[8][8]</sup>. The bank bar code is approved by **Finance Finland** (Finanssiala, FFI) and was jointly developed by Finnish banks "to accelerate payments and to prevent erroneous data from being keyed in" <sup>[1][1]</sup>. It packs the payee's IBAN, the amount, a creditor reference (Finnish national *viitenumero* in version 4, ISO 11649 RF reference in version 5) and the due date into a fixed-length numeric string that banking apps can read with a camera or accept by pasting <sup>[1][1]</sup><sup>[7][7]</sup>.

## History

- The current specification is the **Bank Bar Code Guide version 5.3**, published 8 November 2012 and corrected 21 October 2019 <sup>[1][1]</sup>. Its version history lists v5.1 (20 October 2009) and v5.2 (26 January 2010, corrected version-5 test invoice; 16 March 2010 added an end date for symbol version 2) <sup>[1][1]</sup>.
- Version 5.3 of the guide **removed bar code symbol version 2**, the calculation of "check digit 1" and the version-2 test invoices, leaving only symbol versions 4 and 5 <sup>[1][1]</sup>.
- The 2019 correction renamed the publisher from the Federation of Finnish Financial Services to **Finance Finland** <sup>[1][1]</sup>.
- In February 2014 a QR code was added to the standard credit transfer form template (in the place previously used for the BIC); Finance Finland's July 2015 QR guideline states that the QR code and the domestic bar code "will at first function side by side" <sup>[3][3]</sup>.
- The Finnish national creditor reference rules in Finance Finland's English guide are dated 1 November 2009 <sup>[4][4]</sup>. Finance Finland's October 2023 RF guide states that an RF reference no longer has to be derived from a Finnish reference; the body text gives 19 November 2023 as the date of that change while the cover note gives 18 November 2024 <sup>[5][5]</sup> (the two dates conflict within the same document).

The original introduction date of the Finnish bank bar code is not given in the sources consulted.

## Technical specification

### Symbology

- **Symbology:** USS Code 128 per ISO/IEC 15417, **Character Set C only**, with a fixed Start Code C and no set changes inside the symbol; numeric data only, fixed number of code characters <sup>[1][1]</sup> (see [Code 128](https://docs.barcoder.ai/docs/standards/code-128)).
- **Size:** length 70–105 mm (banks' optical reading prefers 105 mm), height 10.0–12.7 mm; left quiet zone 20 mm, right quiet zone at least 20 mm; at most 5.0 mm quiet zone below <sup>[1][1]</sup>.
- **Print quality:** at least grade 1.5/10/670 measured per ISO/IEC 15416:2000 <sup>[1][1]</sup>.
- **Check character:** the standard Code 128 Modulo 103 check ("Check Digit 2"), computed over the Start C value 105 (weight 1) and the 27 digit pairs (weights 1–27) <sup>[1][1]</sup>.
- Only one account number fits; no other bar codes may be printed on the credit transfer form under the bar-code-only rules, and the code can only be printed for IBANs beginning with `FI` <sup>[1][1]</sup>.

### Data structure (54 digits)

| Field | Version 4 (national reference) | Version 5 (RF reference) |
|---|---|---|
| Version number | 1 digit, `4` | 1 digit, `5` |
| Payee IBAN without `FI` | 16 digits | 16 digits |
| Euros | 6 digits, zero-padded | 6 digits |
| Cents | 2 digits | 2 digits |
| Reserve | 3 digits, `000` | not used |
| Reference | 20 digits, national reference, zero-padded on the left | 23 digits: RF check digits + zeros + reference body |
| Due date | 6 digits `YYMMDD` (may be zeros) | 6 digits `YYMMDD` |
| **Total** | **54** | **54** |

Source: <sup>[1][1]</sup>.

- **Amount:** range 000000.00–999999.99 euros; if the invoice exceeds 99 999 999 cents, or if the payer chooses the amount, the euro and cent fields are printed as `00000000` (or the bar code is omitted) <sup>[1][1]</sup>.
- **Version 5 reference:** formed by removing `RF` from the RF reference and inserting zeros after position 2 to reach 23 digits — e.g. national `9991` → `RF04 9991` → `04000000000000000009991`. If the RF reference contains letters after `RF` (allowed by ISO 11649), the bar code is not formed or the reference field is printed as zeros <sup>[1][1]</sup>.
- **Worked example (from the spec, version 4, test invoice 2):** IBAN FI58 1017 1000 0001 22, €482.99, reference 55958 22432 94671, due 31.01.2012 → digit pairs `45 81 01 71 00 00 00 12 20 00 48 29 90 00 00 00 05 59 58 22 43 29 46 71 12 01 31`, Modulo 103 check value 55 <sup>[1][1]</sup>, i.e. the virtual barcode `458101710000001220004829900000000559582243294671120131`. The same invoice in version 5 (RF06 5595 8224 3294 671, due 31.1.2010) yields check value 31 <sup>[1][1]</sup>.
- **Virtual barcode:** the [akselinurmio/virtuaaliviivakoodi](https://github.com/akselinurmio/virtuaaliviivakoodi) README describes *virtuaaliviivakoodi* as the "clear text implementation" of the pankkiviivakoodi; libraries output it as a plain 54-digit string, e.g. `437159030000007760000122500000000000000000011112161221` for FI37 1590 3000 0007 76, reference 11112, €12.25, due 21.12.2016 <sup>[8][8]</sup><sup>[10][10]</sup>.

### Finnish national reference number (viitenumero)

- Minimum 4 digits (3 + check digit); maximum 19 + 1 digits; printed in groups of five digits with leading zeros omitted <sup>[4][4]</sup>.
- **Check digit (7-3-1):** multiply the digits from right to left by 7, 3, 1, 7, 3, 1…; subtract the sum from the next full ten; a result of 10 gives 0. Example: stem `123456` → sum 89 → check digit 1 → `12 34561` <sup>[4][4]</sup>.
- The RF Creditor Reference ([RF Creditor Reference (ISO 11649)](https://docs.barcoder.ai/docs/standards/rf-creditor-reference)) is printed in groups of **four** characters from left to right, has two ISO 11649 check digits (same algorithm as IBAN) and a maximum length of 21 alphanumeric characters <sup>[5][5]</sup>. If a credit transfer form carries a bar code, version 5 must be adopted together with the RF reference <sup>[5][5]</sup>.

## Use cases

- **Paper and PDF invoices:** printed on the Finance Finland credit transfer form; the bar code can only be used when the invoice uses a reference number <sup>[1][1]</sup>.
- **Bank channels:** readable "on an ATM, at a bank payment centre, with a mobile application, or with a reader connected to a PC"; payers can still key data manually <sup>[1][1]</sup>.
- **Mobile banking:** Nordea Mobile lets users pay an invoice "without typing" by scanning it with the phone camera or by using the virtual barcode <sup>[7][7]</sup>; Nordea Mobile's "Scan invoice" feature pre-fills payment details from the invoice barcode <sup>[12][12]</sup>.
- **Invoice generation tooling:** the Typst template *laskutys* produces Finnish-standard invoices with an optional bank barcode and EPC QR code <sup>[11][11]</sup>; Python, Ruby and JavaScript libraries generate the string for invoicing systems <sup>[8][8]</sup><sup>[9][9]</sup><sup>[10][10]</sup>.

## Implementations

All repositories found are small; only a reference-number utility exceeds 10 stars.

- **[akselinurmio/virtuaaliviivakoodi](https://github.com/akselinurmio/virtuaaliviivakoodi)** — JavaScript (npm `virtuaaliviivakoodi`), 8 stars, active 2026-06; generates versions 4 and 5, Node.js 20+ <sup>[8][8]</sup>.
- **[nocfo/virtuaaliviivakoodi](https://github.com/nocfo/virtuaaliviivakoodi)** — Python (PyPI `virtuaaliviivakoodi`), 3 stars, last push 2024-10; generates **and deconstructs** virtual barcodes <sup>[9][9]</sup>.
- **[kiskolabs/virtuaaliviivakoodi](https://github.com/kiskolabs/virtuaaliviivakoodi)** — Ruby gem, 4 stars, last push 2024-03; versions 4 and 5 <sup>[10][10]</sup>.
- **[TheJiahao/laskutys](https://github.com/TheJiahao/laskutys)** — Typst invoice template, 8 stars, 2026-02; bank barcode + EPC QR + RF reference generation <sup>[11][11]</sup>.
- **[lupinesse/barcode-wallet](https://github.com/lupinesse/barcode-wallet)** — JavaScript PWA, 0 stars, 2026-06; scans Finnish bill barcodes (Code 128 and others) from camera, image or PDF and re-renders the decoded value <sup>[13][13]</sup>.
- **[vkomulai/finnish-bank-utils](https://github.com/vkomulai/finnish-bank-utils)** — JavaScript, 22 stars, last push 2019-10; validates and creates Finnish IBANs and reference numbers (not the barcode itself) <sup>[6][6]</sup>.
## Comparison

- **vs. [EPC QR / Stuzza](https://docs.barcoder.ai/docs/standards/epc-qr):** Finance Finland's 2015 guideline says QR codes "will in the future replace bank bar codes in the Single European Payments Area" <sup>[3][3]</sup>. The bank bar code holds 54 digits; the QR code holds almost any character data <sup>[3][3]</sup>. The bar code requires a reference number and an `FI` IBAN <sup>[1][1]</sup>, whereas the QR code can be used whether the invoice carries a reference number or a free-text message, and carries the beneficiary name, BIC and IBAN <sup>[3][3]</sup>. The Finnish QR profile is EPC version `001`, maximum QR version 13 / 331 bytes, X-dimension 0.5 mm (max 3.5 cm), with the due date carried in the beneficiary-to-originator field as `ReqdExctnDt/YYYY-MM-DD` <sup>[3][3]</sup>. Both may be printed on the same credit transfer form <sup>[3][3]</sup>. Choose the bank bar code for compatibility with legacy Finnish readers and the virtual-barcode copy/paste flow; choose EPC QR for name/BIC/free-text content and SEPA-wide recognition.
- **vs. national vs. RF reference:** version 4 carries the national viitenumero (max 20 digits), version 5 the numeric RF reference (23 digits); purely alphabetic RF content cannot be represented <sup>[1][1]</sup>.

## Fun facts

The bar code's Modulo 103 check gives the Start character and the first digit pair the same weight (1) — the spec flags this with "NOTE!" <sup>[1][1]</sup>. The same guide notes that banks' optical readers prefer the maximum 105 mm length over the 70 mm minimum <sup>[1][1]</sup>.

## Status

**Active.** Bank Bar Code Guide v5.3 (with both versions 4 and 5) remains listed among Finance Finland's current payment technical documents alongside the QR code guidelines and RF reference guides <sup>[2][2]</sup>. Nordea's current mobile banking page advertises paying invoices via the virtual barcode <sup>[7][7]</sup>. Finance Finland states that no decision has been made on discontinuing the Finnish national creditor reference <sup>[5][5]</sup>. EPC QR is positioned as the eventual successor <sup>[3][3]</sup>.

## Sources

[1] [Bank Bar Code Guide, Version 5.3](https://www.finanssiala.fi/wp-content/uploads/2021/03/Bank_bar_code_guide.pdf) — Finance Finland, 2012 (corrected 2019), accessed 2026.
[2] [Payment services: Technical Documents](https://www.finanssiala.fi/en/topics/payment-services-in-finland/payment-technical-documents/) — Finance Finland, accessed 2026.
[3] [Guidelines for the QR code in the Credit Transfer Forms](https://www.finanssiala.fi/wp-content/uploads/2021/03/QR_code_in_credit_transfer_forms.pdf) — Finance Finland, July 2015, accessed 2026.
[4] [Forming a Finnish reference number](https://www.finanssiala.fi/wp-content/uploads/2021/03/Forming_a_Finnish_reference_number.pdf) — Finance Finland, 1 November 2009, accessed 2026.
[5] [Introduction of the Global Structured Creditor Reference (RF) in Finnish Companies](https://www.finanssiala.fi/wp-content/uploads/2024/04/introduction-of-the-global-structured-creditor-reference-in-finnish-companies-2023.pdf) — Finance Finland, October 2023, accessed 2026.
[6] [vkomulai/finnish-bank-utils](https://github.com/vkomulai/finnish-bank-utils) — GitHub, accessed 2026.
[7] [Ota käyttöön Nordea Mobile](https://www.nordea.fi/private-banking/palvelumme-sinulle/paivittaiset-pankkiasiat/ota-kayttoon-nordea-mobile.html) — Nordea, accessed 2026.
[8] [akselinurmio/virtuaaliviivakoodi](https://github.com/akselinurmio/virtuaaliviivakoodi) — GitHub, accessed 2026.
[9] [nocfo/virtuaaliviivakoodi](https://github.com/nocfo/virtuaaliviivakoodi) — GitHub, accessed 2026.
[10] [kiskolabs/virtuaaliviivakoodi](https://github.com/kiskolabs/virtuaaliviivakoodi) — GitHub, accessed 2026.
[11] [TheJiahao/laskutys](https://github.com/TheJiahao/laskutys) — GitHub, accessed 2026.
[12] [Finland — Banking QR/Barcode Standards Report](https://docs.barcoder.ai/docs/payments/FI) — Barcoder research corpus, 2025.
[13] [lupinesse/barcode-wallet](https://github.com/lupinesse/barcode-wallet) — GitHub, accessed 2026.

[1]: https://www.finanssiala.fi/wp-content/uploads/2021/03/Bank_bar_code_guide.pdf
[2]: https://www.finanssiala.fi/en/topics/payment-services-in-finland/payment-technical-documents/
[3]: https://www.finanssiala.fi/wp-content/uploads/2021/03/QR_code_in_credit_transfer_forms.pdf
[4]: https://www.finanssiala.fi/wp-content/uploads/2021/03/Forming_a_Finnish_reference_number.pdf
[5]: https://www.finanssiala.fi/wp-content/uploads/2024/04/introduction-of-the-global-structured-creditor-reference-in-finnish-companies-2023.pdf
[6]: https://github.com/vkomulai/finnish-bank-utils
[7]: https://www.nordea.fi/private-banking/palvelumme-sinulle/paivittaiset-pankkiasiat/ota-kayttoon-nordea-mobile.html
[8]: https://github.com/akselinurmio/virtuaaliviivakoodi
[9]: https://github.com/nocfo/virtuaaliviivakoodi
[10]: https://github.com/kiskolabs/virtuaaliviivakoodi
[11]: https://github.com/TheJiahao/laskutys
[12]: https://docs.barcoder.ai/docs/payments/FI
[13]: https://github.com/lupinesse/barcode-wallet

## Deployments

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

- **FI** — [FI-finland.md](https://docs.barcoder.ai/docs/payments/FI)
