KSeF in enova365, Optima and Subiekt GT: seven months in
Why This Post Is Dated September and Not January
Every comparison of KSeF support across Polish ERPs was written before the mandate started. Same question in all of them — will your system be ready? — and all of them went stale in April, when the obligation reached everyone below the 200 million złoty threshold. Large taxpayers went first, on 1 February. Everyone else on 1 April.
The useful question now is a different one. Seven months of real invoices have run through these systems. What broke — and does the choice of ERP explain any of it?
Barely, and not where people expect. I write here mostly about enova365, Optima and Subiekt GT as integration targets, and I recently put their APIs side by side. This is the KSeF row of that table, expanded. The honest version is shorter, and stranger, than any vendor comparison would allow.
All Three Send. Close That Row.
enova365 shipped 2.0 API support well before the deadline and includes it in the system. Comarch has had a KSeF module inside Optima since the 2023/2024 line, so anyone on a supported version already has it. InsERT pushed the KSeF work through the Subiekt GT 1.89 wave — the version your Sfera licence wants activated anyway.
Three vendors, three architectures, one identical outcome: an invoice leaves the system, the national register accepts it, a KSeF number comes back. In seven months I have not seen a single project where sending was the thing that failed.
Which has a practical consequence. If a vendor's KSeF pitch is still about sending — about compliance, about readiness — they are quoting you for a problem that arrived with your licence. Ask them about receiving instead, and watch what happens.
The Half That Was Never Scoped
Here is the change nobody costed properly. Before the mandate, a purchase invoice arrived because a supplier chose to send it to you: an email, a PDF, sometimes paper. The arrival was somebody's decision — and if it never arrived, the supplier eventually chased it.
Now the structured invoice in KSeF is the invoice. The PDF in your inbox is a courtesy copy of a document you already legally received. Nobody has to send you anything.
So a supplier who stopped emailing — and why wouldn't they, they issued it into the national system — is a supplier whose invoices quietly stop appearing in your books. Nothing errors. Nothing is missing, in the sense a system can detect. From your ERP's point of view, that supplier just went quiet.
This is the same failure shape I keep running into elsewhere: an absent field is not an empty field, and systems report absence as calm. A document you never pulled looks exactly like a document that doesn't exist.
The measurement, and it takes one hour. Take one closed month. Pull your KSeF inbound list for it — every structured invoice issued to your NIP in that period. Count it. Now count the purchase invoices in your register for the same month. Two numbers.
They will not match. The direction tells you what you are dealing with. More in KSeF than in the books is the expensive one: those are deductions you have not taken and documents you do not know you hold. I have seen that gap run into double-digit percentages at companies that consider their accounting tidy, and the cause is always the same — the process still starts with an email.
All three of these ERPs can pull the inbound list. None of them will tell you that you never looked.
The Three Quiet States
Sending works. Not sending is where the risk moved — and all three systems handle it the same unhelpful way: the failure is an absence.
One: issued, never sent. The document sits in your books with a number from the series and no KSeF number. Not rejected — nobody ever attempted it. The send died on a credential, a queue, a service that stopped, a person who was going to get to it later. Your ERP holds a document that is, as far as the tax authority knows, not an invoice. No error shows, because no operation failed. There was no operation.
Two: sent, rejected, unread. A submission came back refused — a validation problem, a schema issue, a permission gone stale. Somewhere there is a message saying so. Rejections are rare enough that nobody built a habit of checking, and rare things with no habit attached turn up in an audit rather than in a report.
Three: offline24, clock running. An invoice issued in offline mode has to reach KSeF within 24 hours. That part is new: it is the only deadline in Polish accounting measured in hours. Everything else in the calendar runs in days or months — the 15th, the 20th, the 25th — and a team built around a monthly rhythm has no reflex for a clock that expires overnight. Offline24 also puts two dates on one document, the offline issue date and the date KSeF accepted it, and for period assignment they are not interchangeable. Check which one your system stores, and which one your reports read, before you lean on either.
None of the three raises an alarm for any of this. Not carelessness on the vendors' part — an ERP alerts on operations that fail, and all three of these are operations that never ran.
What an Agent Can Actually Read
Here the API comparison starts to matter again, and here the three do diverge — not in KSeF capability, but in how cheaply something outside the ERP can see the state.
enova365 exposes the invoice record, its KSeF number and its submission state through the WebAPI, which makes a nightly reconciliation a small job. Optima's answer depends on your version and your module licences, which is the recurring theme with Optima: the capability usually exists, the question is whether your particular installation has the endpoint. Subiekt GT keeps the pattern it keeps everywhere — the data is reachable through Sfera on the Windows host, at the cost of a small service that owns a COM session and needs babysitting.
Different effort, same reachable facts. In all three cases you can answer, from outside, the only three questions that matter: which documents have no KSeF number, which submissions came back refused, and which offline invoices are still inside their day.
The Audit, and the First Thing Worth Building
One afternoon, on your own data, no vendor involved:
- Inbound coverage. KSeF inbound count against purchase register count, one closed month. The gap is your number.
- Unsent and quiet. Sales documents in the books with no KSeF number and no recorded failure, listed with age in days. The oldest one tells you how long a document can sit unnoticed in your process.
- Rejections. Every refused submission from the last six months, and for each one, how many days passed before a person acted. If you cannot answer, that is the answer.
- Custody. Who generated your KSeF certificate, and when does it expire? It is valid for at most two years from issue, which for most companies means a date somewhere in 2028 sitting in nobody's calendar — and with a type-2 certificate, expiry means you cannot issue offline at all any more. The 2028 part is not urgent. The part where one named person holds it and nobody else can get to it is urgent today, and it is the same access question that predicts how every integration project will go.
Then build the boring thing. A read-only nightly job that emails three counts to one person. No write access, no approvals, no risk — and it makes visible a class of problem that is currently invisible in all three systems. If the counts come back at zero every morning for a month, you have bought certainty for almost nothing. That is a good outcome too, and the cheapest one on offer.
Running enova365, Optima or Subiekt GT and not sure what KSeF is quietly not telling you? Get in touch. This read-only reconciliation is the first thing I build on all three — it costs little, argues with nothing, and it is the only honest way to find out whether there is a bigger project here at all.
Check a Polish VAT counterparty in seconds, free
KsięgoAI checks a NIP against the VAT white list and VIES, scores the risk and saves proof of due diligence. Works in Telegram and Claude.
Try KsięgoAI→Let’s talk about your project
Free 30-minute consultation. We’ll figure out if and how I can help.



