Finvoice 3.0
Finvoice is the Finnish national e-invoice format, maintained by Finance Finland (Finanssiala ry). It is widely used for B2B, B2G, and B2C invoicing through Finnish operator and bank networks. Finvoice 3.0 is the current version and is aligned with the European EN16931 standard.
Maventa supports Finvoice versions 1.3, 2.0, 2.01, and 3.0. Finvoice 3.0 is recommended for all new integrations.
For details on Finnish delivery channels, consumer invoicing, and country-specific requirements, see the e-invoicing in Finland page.
Validation
Finvoice 1.3, 2.0, 2.01, and non-EN16931 versions of Finvoice 3.0 have XSD validation only. XSD validation verifies the structure of the document and performs simple data type checks, but it cannot detect calculation or logical errors in the invoice content.
Finvoice 3.0 invoices marked as EN16931 (with <SpecificationIdentifier>EN16931</SpecificationIdentifier> in the MessageDetails) are validated against the full EN16931 rule set in addition to XSD validation.
Discounts and charges in invoice rows
Finvoice supports multiple ways to express discounts and charges on invoice rows. Understanding the calculation logic is important for producing valid invoices.
Row amount calculation
The VAT-excluded amount for a row is calculated as:
RowVatExcludedAmount =
(InvoicedQuantity × UnitPriceNetAmount)
- RowDiscountAmount (or sum of RowProgressiveDiscountDetails/RowDiscountAmount)
+ sum of RowChargeDetails/Amount
The unit price net amount is:
UnitPriceNetAmount = UnitPriceAmount - UnitPriceDiscountAmount
UnitPriceAmount and UnitPriceNetAmount must always be positive, regardless of whether the document is an invoice or a credit note. InvoicedQuantity can be negative (used in credit notes).
Discount and charge types
Finvoice supports three types of adjustments on invoice rows:
| Type | Element | Description |
|---|---|---|
| Unit price discount | UnitPriceDiscountAmount |
Discount applied to the unit price before quantity multiplication |
| Row discount | RowDiscountAmount |
Single discount applied to the row total |
| Progressive row discounts | RowProgressiveDiscountDetails |
Multiple sequential discounts, each applied to the result of the previous one |
| Row charge | RowChargeDetails/Amount |
Additional charge added to the row total |
RowDiscountAmount and RowProgressiveDiscountDetails are mutually exclusive. Use one or the other on a single row, not both.
Discount examples
The following examples show different ways to apply discounts and charges on a Finvoice invoice row.
Row without discounts or charges
No adjustments applied. The row amount is simply the quantity multiplied by the unit price.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceNetAmount>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">19,36</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">80,65</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">100,01</RowAmount>
</InvoiceRow>Single row discount (50%)
A single discount applied to the row total after quantity multiplication.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceNetAmount>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">40,33</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">80,65</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">9,68</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">40,32</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">50,00</RowAmount>
</InvoiceRow>Unit price discount only
A discount applied directly to the unit price before quantity multiplication.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceNetAmount>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">9,68</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">40,32</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">50,00</RowAmount>
</InvoiceRow>Unit discount combined with row discount
A unit price discount followed by an additional row-level discount.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceNetAmount>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">20,16</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">40,32</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">4,84</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">20,16</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">25,00</RowAmount>
</InvoiceRow>Multiple progressive row discounts
Multiple sequential discounts using RowProgressiveDiscountDetails. Each discount is applied to the result of the previous one, plus a fixed discount at the end.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceNetAmount>
<RowProgressiveDiscountDetails>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">40,33</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">80,65</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
</RowProgressiveDiscountDetails>
<RowProgressiveDiscountDetails>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">20,16</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">40,32</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
</RowProgressiveDiscountDetails>
<RowProgressiveDiscountDetails>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">10,16</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">20,16</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
</RowProgressiveDiscountDetails>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">2,40</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">10,00</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">12,40</RowAmount>
</InvoiceRow>Unit discount with progressive row discounts
A unit price discount combined with multiple progressive row discounts.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="EA">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR">80,64516</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">40,32258</UnitPriceNetAmount>
<RowProgressiveDiscountDetails>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">20,16</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">40,32</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
</RowProgressiveDiscountDetails>
<RowProgressiveDiscountDetails>
<RowDiscountPercent>50,00</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">10,08</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">20,16</RowDiscountBaseAmount>
<RowDiscountTypeCode>95</RowDiscountTypeCode>
</RowProgressiveDiscountDetails>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">2,42</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">10,08</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">12,50</RowAmount>
</InvoiceRow>Unit discount, row discount, and row charge
All three adjustment types combined on a single row: unit price discount, row discount, and a row charge.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="C62">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR"
UnitPriceUnitCode="kpl"
QuantityUnitCodeUN="C62">110,00</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">10,00</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">100,00</UnitPriceNetAmount>
<RowDiscountPercent>55,0</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">55,00</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">100,00</RowDiscountBaseAmount>
<RowDiscountTypeText>Discount #1</RowDiscountTypeText>
<RowChargeDetails>
<ReasonText>Charge #1</ReasonText>
<Amount AmountCurrencyIdentifier="EUR">50,00</Amount>
</RowChargeDetails>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">22,80</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">95,00</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">117,80</RowAmount>
</InvoiceRow>Calculation: (1 × 100.00) - 55.00 + 50.00 = 95.00 EUR (VAT excluded)
Credit notes
When creating a credit note in Finvoice, the InvoicedQuantity is set to a negative value. The UnitPriceAmount and UnitPriceNetAmount remain positive.
If the original invoice row included discounts or charges, these amounts must be negated in the credit note as well.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="C62">1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR"
UnitPriceUnitCode="kpl"
QuantityUnitCodeUN="C62">110,00</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">10,00</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">100,00</UnitPriceNetAmount>
<RowDiscountPercent>55,0</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">55,00</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">100,00</RowDiscountBaseAmount>
<RowDiscountTypeText>Discount #1</RowDiscountTypeText>
<RowChargeDetails>
<ReasonText>Charge #1</ReasonText>
<Amount AmountCurrencyIdentifier="EUR">50,00</Amount>
</RowChargeDetails>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">22,80</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">95,00</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">117,80</RowAmount>
</InvoiceRow>Negate the quantity and all discount/charge amounts. Unit prices remain positive.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="C62">-1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR"
UnitPriceUnitCode="kpl"
QuantityUnitCodeUN="C62">110,00</UnitPriceAmount>
<UnitPriceDiscountAmount AmountCurrencyIdentifier="EUR">10,00</UnitPriceDiscountAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">100,00</UnitPriceNetAmount>
<RowDiscountPercent>55,0</RowDiscountPercent>
<RowDiscountAmount AmountCurrencyIdentifier="EUR">-55,00</RowDiscountAmount>
<RowDiscountBaseAmount AmountCurrencyIdentifier="EUR">-100,00</RowDiscountBaseAmount>
<RowDiscountTypeText>Discount #1</RowDiscountTypeText>
<RowChargeDetails>
<ReasonText>Charge #1</ReasonText>
<Amount AmountCurrencyIdentifier="EUR">-50,00</Amount>
</RowChargeDetails>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">-22,80</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">-95,00</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">-117,80</RowAmount>
</InvoiceRow>Alternatively, credit the row using the net unit price directly, without separate discount and charge elements.
<InvoiceRow>
<ArticleName>Article</ArticleName>
<InvoicedQuantity QuantityUnitCode="kpl" QuantityUnitCodeUN="C62">-1,00</InvoicedQuantity>
<UnitPriceAmount AmountCurrencyIdentifier="EUR"
UnitPriceUnitCode="kpl"
QuantityUnitCodeUN="C62">95,00</UnitPriceAmount>
<UnitPriceNetAmount AmountCurrencyIdentifier="EUR">95,00</UnitPriceNetAmount>
<RowVatRatePercent>24,00</RowVatRatePercent>
<RowVatCode>S</RowVatCode>
<RowVatAmount AmountCurrencyIdentifier="EUR">-22,80</RowVatAmount>
<RowVatExcludedAmount AmountCurrencyIdentifier="EUR">-95,00</RowVatExcludedAmount>
<RowAmount AmountCurrencyIdentifier="EUR">-117,80</RowAmount>
</InvoiceRow>Resolving the invoice recipient
When sending a Finvoice invoice, Maventa resolves the invoice recipient from the XML data. To route the invoice successfully, the recipient must have a party name and at least one of the following: an electronic address, an organisation number, a postal address, or an email address.
Recipient complementation from buyer details
If the InvoiceRecipientPartyDetails element is missing or incomplete, Maventa can complement it using data from the BuyerPartyDetails element. This ensures the invoice can be routed even when the recipient details are not fully populated.
Complementation occurs when:
- The recipient lacks sufficient information for routing
- All provided recipient details match the buyer details exactly (case-sensitive comparison)
- Some recipient details differ from the buyer, but only in fields that are considered allowed deviations
- The recipient contains only a single detail (email address, contact name, or OVT number) that aligns with buyer information
Allowed deviating details between recipient and buyer:
- Site code
- Department
- Contact person name
- Email address
- Phone number
Complementation does not occur when the recipient contains only postal address components (town, postal code, or country code/name) without other identifying information.
Complementation example
In this example, the invoice has InvoiceRecipientCommunicationDetails but no InvoiceRecipientPartyDetails. Since the communication details match the buyer, Maventa complements the recipient with the buyer’s party details.
<Finvoice Version="1.3">
<InvoiceRecipientCommunicationDetails>
<InvoiceRecipientPhoneNumberIdentifier>123456</InvoiceRecipientPhoneNumberIdentifier>
<InvoiceRecipientEmailaddressIdentifier>email@email.com</InvoiceRecipientEmailaddressIdentifier>
</InvoiceRecipientCommunicationDetails>
<BuyerPartyDetails>
<BuyerPartyIdentifier>3333333-3</BuyerPartyIdentifier>
<BuyerOrganisationName>Name1</BuyerOrganisationName>
<BuyerOrganisationName>Name2</BuyerOrganisationName>
<BuyerOrganisationTaxCode>FI33333333</BuyerOrganisationTaxCode>
<BuyerPostalAddressDetails>
<BuyerStreetName>StreetName</BuyerStreetName>
<BuyerTownName>TownName</BuyerTownName>
<BuyerPostCodeIdentifier>11111</BuyerPostCodeIdentifier>
<CountryCode>FI</CountryCode>
<CountryName>Finland</CountryName>
</BuyerPostalAddressDetails>
</BuyerPartyDetails>
<BuyerCommunicationDetails>
<BuyerPhoneNumberIdentifier>123456</BuyerPhoneNumberIdentifier>
<BuyerEmailaddressIdentifier>email@email.com</BuyerEmailaddressIdentifier>
</BuyerCommunicationDetails>
</Finvoice>Maventa adds the InvoiceRecipientPartyDetails element, populated from the buyer’s details.
<Finvoice Version="1.3">
<InvoiceRecipientPartyDetails>
<InvoiceRecipientPartyIdentifier>3333333-3</InvoiceRecipientPartyIdentifier>
<InvoiceRecipientOrganisationName>Name1</InvoiceRecipientOrganisationName>
<InvoiceRecipientOrganisationName>Name2</InvoiceRecipientOrganisationName>
<InvoiceRecipientOrganisationTaxCode>FI33333333</InvoiceRecipientOrganisationTaxCode>
<InvoiceRecipientPostalAddressDetails>
<InvoiceRecipientStreetName>StreetName</InvoiceRecipientStreetName>
<InvoiceRecipientTownName>TownName</InvoiceRecipientTownName>
<InvoiceRecipientPostCodeIdentifier>11111</InvoiceRecipientPostCodeIdentifier>
<CountryCode>FI</CountryCode>
<CountryName>Finland</CountryName>
</InvoiceRecipientPostalAddressDetails>
</InvoiceRecipientPartyDetails>
<InvoiceRecipientCommunicationDetails>
<InvoiceRecipientPhoneNumberIdentifier>123456</InvoiceRecipientPhoneNumberIdentifier>
<InvoiceRecipientEmailaddressIdentifier>email@email.com</InvoiceRecipientEmailaddressIdentifier>
</InvoiceRecipientCommunicationDetails>
<BuyerPartyDetails>
<BuyerPartyIdentifier>3333333-3</BuyerPartyIdentifier>
<BuyerOrganisationName>Name1</BuyerOrganisationName>
<BuyerOrganisationName>Name2</BuyerOrganisationName>
<BuyerOrganisationTaxCode>FI33333333</BuyerOrganisationTaxCode>
<BuyerPostalAddressDetails>
<BuyerStreetName>StreetName</BuyerStreetName>
<BuyerTownName>TownName</BuyerTownName>
<BuyerPostCodeIdentifier>11111</BuyerPostCodeIdentifier>
<CountryCode>FI</CountryCode>
<CountryName>Finland</CountryName>
</BuyerPostalAddressDetails>
</BuyerPartyDetails>
<BuyerCommunicationDetails>
<BuyerPhoneNumberIdentifier>123456</BuyerPhoneNumberIdentifier>
<BuyerEmailaddressIdentifier>email@email.com</BuyerEmailaddressIdentifier>
</BuyerCommunicationDetails>
</Finvoice>SpecificationDetails element
Finvoice supports a <SpecificationDetails> element that allows free-form specification text on the invoice. This element is rendered in a monospace font (Courier) to preserve column alignment and formatted text exactly as provided in the XML.
<SpecificationDetails>
<SpecificationFreeText>LASKUN VAPAAMUOTOISET ERITTELYTIEDOT:</SpecificationFreeText>
<SpecificationFreeText>Sarake-1 Sarake-2 Sarake-3</SpecificationFreeText>
<SpecificationFreeText>---------------------------------------------------------------------------------------------------</SpecificationFreeText>
<SpecificationFreeText>1.sarakkeen tieto 2.sarakkeen tieto 10,00</SpecificationFreeText>
<SpecificationFreeText>Toinen rivi Toinen rivi 1 000,00</SpecificationFreeText>
<SpecificationFreeText>Kolmas rivi 3/2 1,00</SpecificationFreeText>
</SpecificationDetails>External resources
- Finvoice 3.0 specification (Finance Finland)
- TEAPPSXML 3.0 specification (Tietoevry)
- Finvoice 3.0 & TEAPPSXML 3.0 mapping document