Skip to main content
iVentureTeam
E-Invoicing

Odoo KSeF Integration: Poland FA(3) E-Invoicing Setup in Odoo 19/20

Odoo KSeF guide for Poland: who must use KSeF 2.0 and when, FA(3) setup in Odoo 19 and 20, rejection codes, offline24 gaps and connector options compared.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 12, 202612 min read1 view
Odoo KSeF Integration: Poland FA(3) E-Invoicing Setup in Odoo 19/20 cover

Poland's KSeF is not optional any more, and the 2027 deadline removes the last exemptions. Our Odoo integration services help Polish companies get Odoo KSeF working on real invoices, not just demo data.

This guide is for finance leads, controllers and IT owners running Odoo in Poland, or rolling it out to a Polish entity. If you run Odoo in several countries, our guide to Odoo localization gaps by country shows where other country modules fall short too.

What is KSeF 2.0 and who must use it?

KSeF 2.0 is Poland's national e-invoicing system, and from 2027 every VAT taxpayer issuing B2B invoices must use it. Invoices become structured XML files in the FA(3) format, each with its own KSeF number.

Poland's Ministry of Finance describes KSeF as a platform for issuing, sending, receiving and storing invoices. An e-invoice is archived in KSeF for 10 years, and once accepted it cannot be edited. Errors are fixed with a correction invoice.

DateWhat changed
1 February 2026KSeF 2.0 live; mandatory for firms with 2024 sales above PLN 200 million (incl. VAT); all firms receive invoices through KSeF
1 April 2026Mandatory for all other businesses
Until 31 December 2026Invoices outside KSeF allowed if such invoices total PLN 10,000 or less (incl. VAT) in the month
Until 31 December 2026Cash register invoices and receipts with the buyer's NIP up to PLN 450 stay outside KSeF
1 January 2027KSeF mandatory for the remaining small sellers
1 January 2027KSeF number required in split-payment transfers

KSeF 1.0 was switched off when KSeF 2.0 went live, so any older connector built for the first API had to be replaced. The Ministry also offers free tools, a web taxpayer app and a mobile app, but they do not post invoices to your ledger.

What does Odoo KSeF support out of the box?

Odoo's Polish localization ships a KSeF module that turns posted invoices into FA(3) XML and sends them to KSeF from the Send dialog. It sits next to the chart of accounts, tax report and JPK modules.

The Odoo 20 Poland documentation lists the modules installed with the Polish localization:

ModuleTechnical nameWhat it doesEdition
Poland - Accountingl10n_plChart of accounts, taxes, tax report, fiscal positionsCommunity
Polish - E-Invoicing FA (3)l10n_pl_ediKSeF sending, status, UPO and bill importCommunity
Poland - Accounting Reportsl10n_pl_reportsPolish accounting reportsEnterprise
Poland - JPK FA Reportsl10n_pl_reports_jpk_faJPK_FA XML reportsEnterprise
Poland - JPK_VAT PoSl10n_pl_reports_pos_jpkPoS data in the JPK reportEnterprise
Poland - Taxable Supply Datel10n_pl_taxable_supply_dateTaxable supply datesEnterprise

We checked the edition column against Odoo's public source code: l10n_pl and l10n_pl_edi are in the Community repository under LGPL-3, while the reporting modules are not. So KSeF sending works in Community, but JPK reporting needs Enterprise.

Which Odoo versions support KSeF: 18, 19 or 20?

The standard KSeF module exists in Odoo 18.0, 19.0 and 20.0, and not in 17.0. If you are on Odoo 17 or older, plan an upgrade or a third-party connector.

All three versions talk to the KSeF 2.0 API and use the FA(3) schema. The setup steps in the Odoo 19 Poland documentation match the Odoo 20 page, so a KSeF integration in Odoo 19 works the same way as in Odoo 20.

Fixes keep landing in stable branches. One Odoo fix added the PrefiksPodatnika element for EU transactions, needed for intra-EU and triangular sales, and it was merged from 18.0 up to master. Keep your Odoo source updated, or you may miss fixes like this.

Still on Odoo 17? Standard support for 17.0 ended in September 2026, and our Odoo upgrade services can move you to 19 or 20 so you get the standard module.

How do you set up Odoo KSeF integration in Odoo 19 and 20?

Setup takes four parts: a KSeF certificate, the Odoo settings, complete company data and complete customer data. Do it in the KSeF test environment first.

  1. Get KSeF credentials: log in to the KSeF taxpayer app with your company NIP, request a certificate and save the password you create.
  2. Download the files: save the .pem certificate file and the private key that KSeF issues.
  3. Enable KSeF in Odoo: go to Accounting, Configuration, Settings, find Polish Localization and turn on Allow KSeF integration.
  4. Upload the certificate: name it, choose Create and edit, upload the .pem file and enter the certificate password.
  5. Add the private key: in the Private Key field choose Create and paste the key; Odoo reads the public key from the .pem file.
  6. Complete the company: set Country to Poland, a valid Polish NIP, plus street and city, which the module checks before sending.
  7. Complete customers: add Country and VAT number for every customer whose invoices go to KSeF.

The module defaults to the production KSeF API. In its source code the switch to the test API is a system parameter, l10n_pl_edi_ksef.mode, so ask your partner to set it before your first test, and to switch it back before go-live.

How does sending, status and UPO work in Odoo?

You send a posted invoice with Send, tick Send via KSeF (e-Faktura), and Odoo builds the FA(3) XML, submits it and keeps a copy in the chatter. Status and the UPO follow from the invoice form.

  • Send: Odoo opens an online KSeF session, encrypts the invoice, submits it and stores the XML on the invoice.
  • Export FA(3) XML: download the file to check it before or after sending.
  • Check invoice status: reads the live status into the eInvoice status field.
  • Check invoice UPO: downloads the Official Receipt Certificate once KSeF has accepted the invoice.
  • Vendor bills: a scheduled action fetches bills from KSeF every three hours.
  • Locked invoices: an invoice that is sent or accepted cannot be reset to draft.

The code also contains a weekly job that rechecks invoices still marked Sent, and a job that renews KSeF tokens every six days. If invoices sit in Sent for hours, check them by hand rather than waiting for the weekly job. You can change any interval under Scheduled Actions in developer mode.

Credit notes go out as KSeF corrections. The module maps them to KOR, or to KOR_ZAL and KOR_ROZ when they correct an advance or settlement invoice, and fills in the original invoice number and KSeF number.

How do you fix KSeF rejection errors in Odoo?

Read the KSeF code on the invoice, fix the data in Odoo, and resend; most rejections come from missing data, permissions or duplicates. The module maps each KSeF code to a status and a chatter message.

KSeF codeMeaning in OdooUsual fix
410Incorrect scope of permissionsGrant the certificate's user the invoicing right in KSeF
415Invoice with an attachment not allowedRegister for attachments in e-US or send without one
430Invoice file verification errorExport the FA(3) XML and check required fields
440Duplicate invoiceCheck numbering; the same invoice was already sent
450Semantics verification errorFix tax tags, NIP, dates or amounts, then resend
500Unknown errorRetry later; check KSeF service notices

Codes 100 and 150 mean the invoice is still processing, and 200 means accepted. If you see 450 on EU or triangular sales, update Odoo first: that is exactly the area the PrefiksPodatnika fix covered.

What about KSeF offline24 and QR codes in Odoo?

Odoo prints a KSeF QR code on accepted invoices, but we found no offline24 or emergency mode handling in the standard 20.0 code. If you must invoice while KSeF or your link is down, plan for that gap.

KSeF 2.0 has three offline procedures. The Ministry's FAQ describes them like this:

  • Offline24: issue without a KSeF connection and send it by the next business day.
  • Offline during maintenance: send it no later than the day after the planned break ends.
  • Emergency mode: after a failure announced by the Ministry, send within 7 business days.

An invoice handed to the buyer before it reaches KSeF needs two QR codes: one marked OFFLINE and one marked CERTYFIKAT, which needs a type 2 KSeF certificate. Online invoices carry one QR code with the KSeF number.

The standard module builds the single online QR link only. For counter sales, field service or warehouses that print invoices on the spot, you need either a connector with offline support or custom code on top of l10n_pl_edi.

Standard module or KSeF connector: which option fits?

Odoo KSeF options: Which route fits your invoicing?

Start with the standard Odoo module, and add a connector or custom code only for a gap you can name. The table compares the three routes we see in Polish Odoo projects.

FactorStandard l10n_pl_ediThird-party connectorCustom extension
Odoo versions18.0, 19.0, 20.0Depends on vendorYour version
Odoo OnlineYes, built inNo, Online blocks third-party modulesNo
Offline24 and two QR codesNot found in 20.0 codeSome vendors offer itBuilt to your rules
Upgrade effortMoves with OdooWait for the vendor's portYour partner ports it
SupportOdoo support and your partnerVendorYour partner
Best forMost online invoicingOffline-heavy or older versionsSpecific gaps on 19 or 20

Odoo's own documentation says Odoo Online cannot run custom or Odoo Apps Store modules. If you need a connector, you need Odoo.sh or on-premise; our comparison of Odoo Online, Odoo.sh and on-premise explains the trade-offs.

Third-party connectors also add an upgrade dependency. Before you buy one, ask which Odoo versions it supports today and how fast it ported the last major release.

Odoo KSeF for Poland by industry

The KSeF rules are the same for everyone, but the hard cases differ by industry. These are the patterns we check first for e-invoicing Poland projects in Odoo.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
ManufacturingAdvance and final invoices on long ordersZAL, ROZ and KOR types in l10n_pl_ediTest down payment flows end to end
Wholesale and distributionHigh invoice volume, many correctionsBulk send, status checks, credit notes as KORTune scheduled jobs and error queues
Retail and PoSReceipts with NIP after 2026PoS invoicing plus JPK_VAT PoS modulePlan the 2027 switch for counter sales
Field serviceInvoicing without connectivityStandard module is online onlyAdd offline24 handling where needed
Groups with EU tradeIntra-EU and triangular salesPrefiksPodatnika fix in stable branchesUpdate source and retest EU tax tags

KSeF readiness checklist for Odoo before 1 January 2027

Run this checklist now, because 2027 removes the small-seller relief and adds KSeF numbers to split-payment transfers. Each step is quick on its own; skipping one is what causes rejections later.

  1. Confirm your Odoo version is 18.0 or later and your source is current.
  2. Generate KSeF certificates for test and production, and store passwords safely.
  3. Clean company and customer data: NIP, country, street and city.
  4. Send one of each invoice type in test: standard, advance, settlement and correction.
  5. Turn on vendor bill import and agree who reviews fetched bills.
  6. Decide how you will invoice offline, if you ever need to.
  7. Check that payment runs for split-payment invoices can carry the KSeF number.
  8. Train the team on statuses, the UPO and why a sent invoice cannot go back to draft.

Not sure how big the job is? The Odoo project estimate tool gives a first number, and our Odoo 20 accounting release notes show what else changed in invoicing.

How iVentureTeam helps with Odoo KSeF integration

Adding a Polish entity? Price Odoo first

iVentureTeam sets up and tests Odoo KSeF on your real invoice types, then fills the gaps the standard module leaves. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.

  • KSeF test plan: every invoice type you issue, sent to the KSeF test environment before go-live.
  • Gap fixes: offline24 handling, extra checks or a connector, built only where the standard module falls short.
  • New rollouts: a Polish entity added to Odoo; see our Odoo implementation cost ranges, from $3k to $9k for small projects.
  • Upgrades: moving Odoo 17 or older to a version with the standard KSeF module.
  • Ongoing care: Odoo ERP support that applies upstream fixes and watches rejected invoices.

If you also trade in Belgium or France, our guides on Odoo Peppol e-invoicing in Belgium and Odoo e-invoicing in France cover those mandates.

The bottom line on Odoo KSeF

For most Polish companies on Odoo 18, 19 or 20, the standard KSeF module is the right start, and custom work should target named gaps only. Older versions need an upgrade or a connector.

Test every invoice type in the KSeF test environment, clean your partner data, and decide early how you will handle offline invoicing. Do that before 2027 and KSeF becomes routine instead of a monthly fire drill.

Ready to get Odoo KSeF working on your real invoices?

Request a KSeF review

Find out what your Odoo needs for KSeF before the 2027 deadline. Request an Odoo KSeF readiness review, call +91-90235-15208, or email business@iventureteam.com.

Frequently Asked Questions

Does Odoo support KSeF?

+

Yes. Odoo 18, 19 and 20 include the Polish E-Invoicing FA(3) module, l10n_pl_edi, which sends invoices to KSeF, checks their status, downloads the UPO and imports vendor bills.

Is the Odoo KSeF module free?

+

The l10n_pl_edi module is part of Odoo Community under the LGPL-3 license, so there is no separate module fee. Polish JPK reports sit in Enterprise modules, which need an Odoo subscription.

Does Odoo 17 support KSeF?

+

No. The standard KSeF module starts in Odoo 18.0. On Odoo 17 or older you need an upgrade or a third-party connector, and Odoo 17 standard support ended in September 2026.

When is KSeF mandatory?

+

KSeF 2.0 became mandatory on 1 February 2026 for firms with 2024 sales above PLN 200 million, and on 1 April 2026 for others. Sellers under PLN 10,000 a month on such invoices must join from 1 January 2027.

What is the FA(3) format?

+

FA(3) is the logical structure of the Polish structured invoice used by KSeF 2.0. Odoo generates FA(3) XML when you send an invoice and lets you export the file from the invoice form.

Does Odoo support KSeF offline24 mode?

+

We found no offline24 or emergency mode handling in the standard Odoo 20.0 code. If you must invoice without a KSeF connection, plan a connector or custom extension that adds the two required QR codes.

Can I edit an invoice after sending it to KSeF?

+

No. An invoice accepted by KSeF is a legal document, and Odoo blocks reset to draft once it is sent or accepted. Issue a credit note, which Odoo sends to KSeF as a correction invoice.

How do I test KSeF in Odoo without sending real invoices?

+

Use KSeF test credentials and switch the module to the test API with the l10n_pl_edi_ksef.mode system parameter. The default is production, so set it before your first test and reset it before go-live.

Can I use a KSeF connector on Odoo Online?

+

No. Odoo Online does not allow custom or Odoo Apps Store modules, so you can only use the built-in KSeF module there. Connectors need Odoo.sh or an on-premise installation.

Free integration feasibility review

Connecting your other systems to Odoo?

Tell us what needs to sync between your systems and Odoo. We recommend a connector, API or custom approach and plan how failures are handled.

Free, with no obligation. A senior consultant replies within 12 business hours.