On 1 February 2026, Poland's National e-Invoicing System stopped being a conference topic and became part of the daily routine in every finance department. According to the Ministry of Finance schedule, the obligation first covered the largest taxpayers, and from 1 April 2026 it extended to every other business issuing B2B invoices. For software providers, that translated into a hard deadline: rebuild the way thousands of companies issue invoices, and do it before the clock runs out.
Most vendors treated the problem as a patch — they bolted a module onto an existing product and moved on. We took a different route. We built Biurko.io: a standalone e-invoicing platform designed from the first line of code around the realities of the KSeF 2.0 API.
This article walks through the full arc of that project — market context, the build-versus-buy decision, scope, architecture and the production release. We are not writing it to show off a technology stack. We are writing it because the decisions we made along the way are precisely the decisions facing any company that is considering building a business system of its own.
Market context: why KSeF turned out to be an operational problem, not a tax one
When the Ministry of Finance published successive versions of the timetable, most organisations dropped the file on the chief accountant's desk. That was a category error. KSeF is not a change to how tax is calculated — it is a change to how documents move, which means it touches sales, logistics, collections and customer service all at once.
A timetable with no slack in it
The rollout was staged: large entities from February 2026, small and medium-sized businesses from April 2026, and digitally excluded companies from January 2027. On paper that looks comfortable. In practice, a two-month gap between the first and second wave meant software providers needed a finished, tested product in January — for their entire customer base simultaneously.
There is one more strategically important detail. Under the current rules, 2026 remains a grace period in which penalties for errors and non-compliant systems are suspended, and the requirement to quote the KSeF number on bank transfers has been deferred to 2027. Businesses were given time to refine their processes — not permission to postpone the integration itself.
What the obligation means in practice
A structured invoice is not a PDF with a new name. It is an XML document conforming to the FA(3) schema, submitted to a central system that assigns it a number and returns an official confirmation of receipt. The consequences are entirely practical:
"I'll email the invoice" no longer exists — the document only becomes real once the government system accepts it.
There is no editing on the fly — a correction is a separate document, linked to the original KSeF number.
Your integration becomes a single point of failure — if it stops working, invoicing stops with it.
There is zero tolerance for incomplete counterparty data — the schema validates structure without mercy.
That last point proved to be the most expensive in practice. Companies had spent years tolerating patchy customer records, because a PDF invoice would go out regardless. A central validation engine accepts no such compromises.
The decision: buy, adapt or build
Every project of this size begins with the same question. With KSeF, the answer was genuinely non-obvious, because the vendor market filled up very quickly.
Why off-the-shelf tools were not enough
We assessed the available options against the needs of our client base — mid-sized companies, accountancy practices and groups operating several legal entities. Three things disqualified most of what was on the market.
Multi-entity handling. A large share of products assumed one licence equals one company. For an accountancy practice serving forty clients, or a group with six subsidiaries, that model is unworkable — not because of the price, but because an accountant would be switching accounts forty times a day.
Closed integration. KSeF modules embedded in large ERP suites worked correctly, but only inside those suites. A client running a bespoke CRM or an e-commerce platform had to build a bridge between two worlds and maintain it alone.
No predictability when things change. The schema and the API evolved throughout 2025. Companies dependent on an external vendor sat in a queue for updates with no influence over the priorities.
The criteria that settled it
We made the build-versus-buy call against four criteria, and we recommend them to any client facing a similar choice.
Is this process a differentiator for us? Invoicing on its own is not. Managing dozens of entities from one panel, in three languages, with full control over the submission queue — that is a different question.
How long will this system live? KSeF is a permanent obligation. The investment amortises over a decade, not a financial year.
What does dependency cost? When a critical revenue process is involved, being tied to someone else's roadmap is a real operational risk.
Can we actually maintain it? This is the question most organisations answer too optimistically. We answered yes, because external system integration is what we do every day.
It is worth saying plainly: for many companies, buying an off-the-shelf tool is the right answer. A bespoke product makes sense when the process is genuinely non-standard, the scale justifies the cost, and the organisation has the capability to support it. In our case, all three conditions held.
Scope: what had to be in the production release
We defined scope backwards from the usual approach — not from a wish list, but from the list of things without which the product would have been useless on day one.
A multi-company panel as a foundation, not a feature
This was the first architectural decision and the hardest one to reverse later. Multi-tenancy retrofitted into a finished system always looks like a prosthetic: separate logins, duplicated records, no consolidated reporting. We designed Biurko.io so that company context is a layer running through the entire application. Permissions, numbering sequences, KSeF settings and counterparty data are isolated per entity, but the user switches between them in a single click.
Integration with the Ministry of Finance API
This is the heart of the project and simultaneously its largest risk. The integration covers the full document lifecycle: authentication in the context of a specific tax identification number, submission of the invoice in the FA(3) schema, monitoring of processing status, retrieval of the KSeF number and the official receipt confirmation, plus ingestion of inbound documents.
The authentication layer relies on KSeF certificates, which taxpayers obtain through the certificate and permissions module provided by the Ministry. In engineering terms, that meant building secure storage and rotation of credentials separately for every entity the platform serves.
Three interface languages
Polish finance teams increasingly serve foreign-owned businesses, and shared service centres are rarely monolingual. The Biurko.io interface has shipped in three languages since the production release — not as a translation added afterwards, but as a design assumption that shaped content structure, date formats and field naming from the outset.
The stack, translated into business terms
We describe the technology here through the problem it solves. That is the framing worth using in any conversation about a system: nobody cares what the framework is called until they know what follows from it.
Laravel and Inertia: one environment instead of two teams
A conventional split between a separate backend and a separate frontend means two repositories, two skill sets, and continuous work maintaining the API contract between them. On a product built against a hard regulatory deadline, that is a cost we chose not to carry.
Laravel with Inertia gives us an application where business logic lives in one place, while the interface layer remains modern and reactive without building a separate API purely for internal consumption. The commercial effect: a shorter path from product decision to working feature, and a smaller team required to maintain it.
Queues: asynchrony as a requirement, not an optimisation
This is the decision most often skipped by teams building their first government integration. Submitting an invoice to KSeF is not an instant operation — the document enters processing and the response arrives with a delay. If the user is watching a spinner while that happens, the product is unusable.
In Biurko.io, every operation involving an external system goes through a queue. That delivers three concrete benefits:
Resilience to API downtime — if the other side is unavailable, the job waits and retries rather than throwing an error at the user.
Predictable performance under bulk load — an accountancy practice sending five hundred invoices on the first of the month does not bring the application down.
Full control over retries — and in a fiscal integration, that is the difference between a document submitted once and one submitted twice.
WebSockets and Reverb: real-time status
Since operations are asynchronous, users need to know what is happening without refreshing the page. Reverb — the WebSocket server in the Laravel ecosystem — lets us push status changes to the browser at the moment they actually occur.
It sounds like a UX detail. In reality it is the feature that builds trust in the system. An accountant who watches a document pass validation and receive its number stops checking it manually in the government portal. That is genuine time recovered, repeated on every single document.
Three environments mirroring the Ministry's addressing
The Ministry of Finance maintains three entirely separate environments — test, demo and production. Each has its own addresses, its own data and its own purpose, and an invoice sent to one is not visible in the others. The test environments exist solely for integration work, and real company data must not be submitted to them.
We built a matching structure on our side: separate test, demo and production environments, each configured against the correct addressing. That lets us test changes on synthetic data, validate scenarios in the pre-production environment with real permissions, and only then release to production. With an integration that carries tax consequences, there is no room for shortcuts.
What working with a government API taught us
A few observations that carry over to any public sector integration.
Documentation is a moving target. The API specification changed during development. An architecture that isolates the communication layer from business logic stops being an academic ideal and becomes a condition of hitting the deadline.
A test environment is not production. Behaviour observed in testing does not always map one-to-one. The demo stage, with real permissions but no legal consequences, saved us from several surprises.
Error handling is half the project. The happy path took a fraction of the time. The rest was failure scenarios: rejected documents, timeouts, expired sessions, system unavailability. In fiscal integrations, those paths are what determine product quality.
A regulatory deadline is not negotiable. That changes how scope is managed. The priority is the list of features without which the product cannot launch; everything else is a candidate for the next iteration.
The outcome
The project delivered a live production release of Biurko.io — a platform covering the full document journey, from issue to archive, without leaving a single interface.
For the user
Whoever handles invoicing works in one panel regardless of how many entities they serve. Switching company context requires no re-authentication. Submission statuses update live, and documents rejected by the central system land in a clearly separated queue with the reason attached, rather than disappearing into a log file.
For the organisation
The platform covers scenarios that a conventional invoicing tool would leave to manual work: bulk submission, retries on failed attempts, corrections linked to the original KSeF number, and ingestion of purchase invoices. Each of those is hours recovered over a month — and with an obligation that applies to every single B2B transaction, the savings scale with document volume rather than headcount.
For maintenance
Environment separation and asynchronous architecture mean that updates forced by changes on the Ministry's side land predictably: test first, then demo, then production. That sounds mundane, but for a system with tax consequences it is the only acceptable working model — and the one most commonly abandoned by teams building their first integration.
What this means if you are planning a system of your own
Biurko.io is our product, but the patterns behind it are universal and hold equally well in CRM, ERP and process automation work.
Start from what will not change. Here, the constant was a legal obligation and its timetable. In your system, the constant will be a core business process. Build the architecture around it — everything else is configuration.
Treat asynchrony as a design assumption. Any system that talks to the outside world — a bank, a courier, a marketplace, a government API — has to assume the other side will be slow or unavailable. Adding that later means a rebuild.
Decide on multi-entity and multi-language support at the start. These are the two things that are almost impossible to add cheaply after the fact.
Invest in environments. Separate test, demo and production is a cost that repays itself the first time you avoid an incident involving live client data.
Summary
KSeF forced the Polish market into something many companies were not ready for: a shift from documents that somehow circulate to a process that has to be watertight, repeatable and failure-resistant. Biurko.io was our answer to that challenge, from the first analysis through to a production release aligned with the Ministry of Finance's environment addressing.
The most important conclusion from the project is not a technical one. It is this: a system that runs a critical process in your company should be designed around that process, not the other way round. Bending an organisation to fit the constraints of an off-the-shelf tool is a cost that never appears on the licence invoice — it appears in the hours your team spends working around the software.
If you want a system built around your company's actual processes, get in touch. Our team will help you translate business objectives into concrete IT solutions — from the initial analysis and the build-versus-buy decision through to deployment and ongoing support. The first consultation is free.



