KSeF — Poland's National e-Invoicing System — is now mandatory. The legal part (who, when, what penalties) is handled by your accountant. The part that actually hurts is technical: does your system even talk to KSeF, and does it do it well? That's where small companies are losing hours right now.
Let's recap the facts without panic. Since 1 February 2026, the largest taxpayers (over 200M PLN in sales for 2024) must issue invoices through KSeF — and receiving invoices via KSeF became mandatory for everyone, whether they issue through it yet or not. Since 1 April 2026, the obligation to issue covers practically the whole B2B market, including the typical 10–50 person company. If you're reading this and still saying "we'll sort it out soon", you're already past the deadline. The good news: you're not alone, and most problems are repeatable and can be cleaned up in days, not months.
KSeF isn't "another PDF with a different logo". It's a national database to which you send an invoice in a strictly defined XML structure (the FA(3) schema). The system validates it, assigns a KSeF number, and only then does the invoice legally exist. There's no negotiating with the schema. If something is missing or in the wrong format, the invoice bounces. Your ERP either handles it or it doesn't.
Two sides you have to connect
Most companies think of KSeF purely as issuing. That's half the problem — and often the easier half.
The sending side. Your system has to generate an invoice in the FA(3) schema, send it to KSeF via the API, read back the status (accepted / rejected), and store the assigned KSeF number on the document. Sounds simple, until the schema bounces.
The receiving side. This is the pain nobody mentions in training sessions. Every cost invoice from a supplier now lands in KSeF, and it's you who has to pull it out. If you buy a lot — materials, services, fuel — someone has to fetch those invoices from the system, match them, and book them. Done by hand, one at a time, by number, that's a full-time job you don't have.
Decide deliberately about both sides before you declare "KSeF is done".
Where the integration actually breaks
The FA(3) schema is merciless toward the mess you've been hiding in descriptions and comments for years. The most common reasons for rejection that we see:
- A dirty customer file. Tax IDs sometimes with a
PLprefix, sometimes without. Customers with no complete address. The same firm in several versions. KSeF doesn't forgive that. - Fields you never used to fill in. GTU codes, procedure markings, units of measure as a consistent dictionary — not "pcs.", "pcs", "pieces" typed freehand by three different sales reps.
- Attachments. KSeF doesn't carry your nice PDF with the spec or a photo. You send the invoice structure separately from whatever you used to attach. You have to rethink where those materials now live.
- Numbering and offline mode. What happens when KSeF has an outage? There's an offline24 mode and a QR code on the invoice — but your system has to support it, rather than freezing sales for half a day.
A real example
At one of our clients — a 28-person electrical wholesaler running on Comarch Optima — the first week of mandatory KSeF looked like this: about 35% of sales invoices bounced with a validation error. The reason was painfully boring. In the customer file, some tax IDs had a PL prefix and some didn't. Dozens of customers had no full address. Sales reps entered units of measure "off the top of their heads". The Ministry's system lets none of that through.
Cleaning up the customer file and field mapping took 3 working days. The rejection rate dropped below 2%. But the real win was on the other side: the bookkeeper was pulling cost invoices from KSeF by hand — one at a time, by number — losing about 1.5 hours a day on it. After we connected automatic retrieval into Optima, that shrank to a handful of minutes. The rest of the day went back to actual bookkeeping, not clicking around a portal.
This isn't a spectacular AI story. It's a boring integration that simply works — which is exactly why it pays for itself.
What to do if your system can't handle it
Three scenarios, depending on what you run:
- You have a modern ERP (Comarch Optima, enova365, Subiekt). The vendor has a KSeF module. Your job isn't writing the integration — it's configuring it correctly and, above all, cleaning up the data that flows into it. That's 80% of the work.
- You have an older or heavily customised system (e.g. a homegrown invoicing add-on, an ageing Microsoft Dynamics AX). Often there's no native KSeF. Then you build a bridge — middleware that takes the invoice from your system, translates it to FA(3), and talks to the KSeF API. That's a few to a dozen-odd days of work, but it saves a system you don't want to replace yet.
- You issue few invoices. You can use the free Taxpayer Application or a simple bridge, with no ERP integration. A cheap option if your volume is low — but the manual work on receiving cost invoices will hurt soon enough anyway.
The choice isn't religious. It depends on invoice volume and on how many hours a month you're willing to give up to clicking.
A plan for the next few weeks
If KSeF "works but hurts", or you're still putting it off, do this in order:
- Count the rejections from the last two weeks. If it's more than a few percent, you have a data problem, not a system problem.
- Clean the customer file: tax IDs, addresses, duplicates. It's the same source of truth that saves you in five other places.
- Check the receiving side. Who pulls cost invoices, and how? If the answer is "by hand, one at a time", that's your hidden full-time job.
- Set a plan for a KSeF outage: offline24 mode, who reacts, how not to freeze sales.
Most companies don't need a revolution. They need clean data and a correctly wired system — and that's days of work, not quarters. If your invoices are bouncing or your bookkeeper is drowning in manual retrieval, let's talk. The first call is free and takes half an hour.
KSeF isn't a legal problem your accountant solves. It's a data and integration problem — either you've sorted those out, or the invoice bounces.