Search

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.

Original invoice rowCredit note (with discounts and charges)Credit note (simplified)
<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:

Allowed deviating details between recipient and buyer:

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.

Input (before complementation)Output (after complementation)
<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

Back to top