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.
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.
| Date | What changed |
|---|---|
| 1 February 2026 | KSeF 2.0 live; mandatory for firms with 2024 sales above PLN 200 million (incl. VAT); all firms receive invoices through KSeF |
| 1 April 2026 | Mandatory for all other businesses |
| Until 31 December 2026 | Invoices outside KSeF allowed if such invoices total PLN 10,000 or less (incl. VAT) in the month |
| Until 31 December 2026 | Cash register invoices and receipts with the buyer's NIP up to PLN 450 stay outside KSeF |
| 1 January 2027 | KSeF mandatory for the remaining small sellers |
| 1 January 2027 | KSeF 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:
| Module | Technical name | What it does | Edition |
|---|---|---|---|
| Poland - Accounting | l10n_pl | Chart of accounts, taxes, tax report, fiscal positions | Community |
| Polish - E-Invoicing FA (3) | l10n_pl_edi | KSeF sending, status, UPO and bill import | Community |
| Poland - Accounting Reports | l10n_pl_reports | Polish accounting reports | Enterprise |
| Poland - JPK FA Reports | l10n_pl_reports_jpk_fa | JPK_FA XML reports | Enterprise |
| Poland - JPK_VAT PoS | l10n_pl_reports_pos_jpk | PoS data in the JPK report | Enterprise |
| Poland - Taxable Supply Date | l10n_pl_taxable_supply_date | Taxable supply dates | Enterprise |
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.
- Get KSeF credentials: log in to the KSeF taxpayer app with your company NIP, request a certificate and save the password you create.
- Download the files: save the .pem certificate file and the private key that KSeF issues.
- Enable KSeF in Odoo: go to Accounting, Configuration, Settings, find Polish Localization and turn on Allow KSeF integration.
- Upload the certificate: name it, choose Create and edit, upload the .pem file and enter the certificate password.
- Add the private key: in the Private Key field choose Create and paste the key; Odoo reads the public key from the .pem file.
- Complete the company: set Country to Poland, a valid Polish NIP, plus street and city, which the module checks before sending.
- 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 code | Meaning in Odoo | Usual fix |
|---|---|---|
| 410 | Incorrect scope of permissions | Grant the certificate's user the invoicing right in KSeF |
| 415 | Invoice with an attachment not allowed | Register for attachments in e-US or send without one |
| 430 | Invoice file verification error | Export the FA(3) XML and check required fields |
| 440 | Duplicate invoice | Check numbering; the same invoice was already sent |
| 450 | Semantics verification error | Fix tax tags, NIP, dates or amounts, then resend |
| 500 | Unknown error | Retry 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?

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.
| Factor | Standard l10n_pl_edi | Third-party connector | Custom extension |
|---|---|---|---|
| Odoo versions | 18.0, 19.0, 20.0 | Depends on vendor | Your version |
| Odoo Online | Yes, built in | No, Online blocks third-party modules | No |
| Offline24 and two QR codes | Not found in 20.0 code | Some vendors offer it | Built to your rules |
| Upgrade effort | Moves with Odoo | Wait for the vendor's port | Your partner ports it |
| Support | Odoo support and your partner | Vendor | Your partner |
| Best for | Most online invoicing | Offline-heavy or older versions | Specific 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.
| Industry | Pain or cost driver | Odoo approach | How iVentureTeam helps |
|---|---|---|---|
| Manufacturing | Advance and final invoices on long orders | ZAL, ROZ and KOR types in l10n_pl_edi | Test down payment flows end to end |
| Wholesale and distribution | High invoice volume, many corrections | Bulk send, status checks, credit notes as KOR | Tune scheduled jobs and error queues |
| Retail and PoS | Receipts with NIP after 2026 | PoS invoicing plus JPK_VAT PoS module | Plan the 2027 switch for counter sales |
| Field service | Invoicing without connectivity | Standard module is online only | Add offline24 handling where needed |
| Groups with EU trade | Intra-EU and triangular sales | PrefiksPodatnika fix in stable branches | Update 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.
- Confirm your Odoo version is 18.0 or later and your source is current.
- Generate KSeF certificates for test and production, and store passwords safely.
- Clean company and customer data: NIP, country, street and city.
- Send one of each invoice type in test: standard, advance, settlement and correction.
- Turn on vendor bill import and agree who reviews fetched bills.
- Decide how you will invoice offline, if you ever need to.
- Check that payment runs for split-payment invoices can carry the KSeF number.
- 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

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?

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.
Free Odoo tools
All tools- Odoo Health CheckVersion, modules, findings and upgrade cost
- Odoo App SelectorWhich apps you need, by industry
- Odoo Project EstimateIndicative cost and timeline in minutes
- Odoo Implementation Cost CalculatorImplementation cost and timeline, in minutes
- Odoo Migration Cost CalculatorVersion jump or legacy ERP, priced in minutes
Continue reading
Odoo E-Invoicing Compliance in Egypt: ETA E-Invoice, E-Receipt and KSA
Odoo e-invoicing compliance for Egypt: what Odoo 19 and 20 cover for ETA e-invoices, why the e-receipt needs a partner, and how it compares with ZATCA.
Odoo Localization Gaps: What Country Modules Cover and What They Miss
Odoo localization explained: what l10n country modules include, which need Enterprise, the local accounting gaps they leave, and when to build custom.
Odoo vs AutoCount for Malaysian SMEs: Odoo 20, MyInvois and Cost
Odoo vs AutoCount for Malaysian SMEs: Odoo 20 features, MyInvois setup, SST, payroll gaps, AutoCount Cloud pricing and a three-year cost comparison.
