Grzegorz Giewon · UnitSoftware

Grzegorz Giewon · UnitSoftware · Warsaw

Your ERP speaks XRechnung. Poland only accepts KSeF.

I build the connector between them. Both directions, validated against EN 16931, in .NET, inside the system you already run. I have written it once already — you are not paying for my first attempt. Most often I do it as a subcontractor to the partner running the rollout: the implementation and the client relationship stay theirs.

Poland · KSeF
mandatory since
Penalties
suspended until
Germany · issuing
from above €800k
Working model
subcontractor to implementation partners
Availability
a standing block of 10–15 h/week · remote · CET

What KSeF is, in four sentences

KSeF is Poland’s national e-invoicing system. Since 1 April 2026, invoices between Polish businesses are not valid unless they are issued as structured XML through a government API — email and PDF no longer count on their own. Every invoice receives a KSeF number assigned by the system. From 1 January 2027 there are penalties: up to 100% of the VAT on an invoice issued outside it.

Two mandates land on the same date. A German group with a Polish plant hits Polish KSeF penalties and the German obligation to issue XRechnung on 1 January 2027 — one ERP, one IT department, two national formats sitting on the same EN 16931 standard.

Who this is for

  • You are rolling out SAP or another large ERP and hit something it will not do. The release is too old for native KSeF, the standard has no XAdES signing or document rendering, and upgrading is not on the table for this project. I build the satellite that closes the gap and hand it over with documentation — as a subcontractor, under your brand if you prefer. The implementation, the contract and the client relationship stay yours. Terms, scope and billing →
  • You sell software into Poland and your customers are asking for KSeF. You need a KSeF module inside your product, not a Polish invoicing product next to it. The pieces already exist — authentication, FA(3), XAdES signing, QR codes, retry logic.
  • You have a subsidiary, plant or branch in Poland that issues invoices. A Polish VAT number alone does not put you in KSeF — a fixed establishment taking part in the supply does. Once your advisor confirms you are in scope, what is left is a software problem, and that one is mine.
  • You are German or Austrian and both mandates land on the same day. Same EN 16931 base underneath, two different national layers on top. I have built the converter between them.

What I don’t do. I don’t sell my own invoicing product and I don’t implement accounting packages. I work on what you already have.

I am not a tax advisor. Whether your Polish operation is a fixed establishment is a tax question, and your advisor answers it. I build what follows from the answer.

Where this already runs. Every tool listed below was built this way — for implementation partners who deliver it onward as part of their own project. They are in production today at Polish entities of international industrial groups: automotive, packaging, renewable energy, measurement instruments, electronics.

How this differs from a subscription

You do not pay per invoice

Intermediaries and the KSeF modules bundled into off-the-shelf systems bill by document count: the tier grows with your invoice volume and you keep paying it every month for as long as you keep invoicing. Here you pay once to have the integration built, then only for maintenance if you want it. Invoice volume does not change the bill.

Source, documentation and full rights are assigned to you in writing. You stay on maintenance, carry on alone, or hand it to another contractor — with no proprietary format and no dependency on my infrastructure after handover.

Invoices never leave your infrastructure

The integration runs inside your network or your cloud and talks to the KSeF API directly. There is no third party in the document path: no sub-processor to add to your record of processing activities, no data processing agreement with an intermediary, and no new cloud vendor for your security team to approve. For a group where onboarding a processor into an invoicing flow is a multi-week procedure, that is usually the deciding difference.

If a hosted setup suits you better, I will say so on the first call — not every scenario needs something built on your side.

Services

XRechnung ↔ KSeF

Conversion between XRechnung and KSeF in both directions, plus sending and receiving through the KSeF API: authentication, KSeF numbers, QR codes. Both formats sit on EN 16931 — the hard part is the national layer on top, and that is the part I have already solved. Validation against EN 16931 is built in, so you find out an invoice is wrong before the tax office does.

KSeF integration for an existing system

First I work out how your system issues and receives invoices today. Then I connect it: certificate-based authentication, structured invoices out, supplier invoices in, KSeF numbers, QR codes, XAdES signing. Built to survive what actually fails in production — timeouts, API outages, validation rejections. No system replacement, no rewrite.

SAF-T (JPK) reporting

Poland’s SAF-T files — JPK_V7M and the rest — generated and filed straight from your system, validated before submission, with the official confirmation (UPO) captured automatically. No Excel exports, no pasting into a government application, and nobody on your finance team needs to read Polish to file.

Maintenance and .NET modernisation

I take over software left behind by a previous supplier, and move older systems — .NET Framework, WinForms, WCF — onto current .NET. In stages, with production running throughout.

Tools I have built

I don’t start from zero on every engagement.

XRechnungKsefConnector

Converts invoices between XRechnung and KSeF in both directions, and handles sending and receiving through the KSeF API — authentication, KSeF number handling.

XRechnungVisualizer

XRechnung in CII and UBL, validated against EN 16931, with PDF export. The document your accounts-payable team can actually read.

XMLVisualizer

Readable rendering of Polish SAF-T files and KSeF invoices, with PDF export, as a desktop app and in the browser. Nobody in finance verifies raw XML.

RSAHelper

XAdES signing, KSeF certificates, invoice-to-HTML/PDF conversion, QR codes and XML validation. Runs as a REST service; Docker and Podman images available.

JPK WysyłkaXML

Full SAF-T application: generation, validation, editing the file contents before submission, and filing to the government gateway. Built on .NET 10.

WysylkaJPK

The same filing path without the editor, but with automatic document repair — missing fields get sensible defaults instead of bouncing off gateway validation.

NipService / WhiteListChecker

Polish VAT number and bank account verification against the official taxpayer whitelist, exposed as a REST service and resilient to registry downtime.

Try one now: XRechnungVisualizer runs in the browser — drop in an XRechnung file (CII or UBL) and see whether it passes EN 16931 validation, no account needed. The rendered invoice and PDF come out in German or English; the surrounding interface is still Polish. Manuals and installers for the other tools are on the downloads page, also without signing in.

How it works

The connector sits beside your system, not inside your invoicing logic. Your ERP keeps issuing invoices the way it does today.

Integration architecture Your ERP sends an invoice to the connector. The connector maps it to the required national format, signs it, and submits it either to the Polish KSeF API or as XRechnung to a German recipient. A queue with retry logic sits between the connector and each outbound API, so an outage does not stop invoicing. Your ERP unchanged Connector EN 16931 mapping XAdES signing validation KSeF API FA(3) · Poland XRechnung CII / UBL · Germany queue
The queue is the part that matters in production. Government APIs go down, and an invoice that cannot be submitted has to wait rather than fail.

The same invoice, both formats

Both sit on EN 16931. The difference is the national layer — which is exactly the part the mapping has to get right.

XRechnung · CII
<ram:SpecifiedTradeSettlement>
  <ram:InvoiceCurrencyCode>
    EUR
  </ram:InvoiceCurrencyCode>
  <ram:ApplicableTradeTax>
    <ram:CalculatedAmount>190.00</…>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:RateApplicablePercent>
      19.00
    </ram:RateApplicablePercent>
  </ram:ApplicableTradeTax>
</ram:SpecifiedTradeSettlement>
KSeF · FA(3)
<Fa>
  <KodWaluty>PLN</KodWaluty>
  <P_13_1>1000.00</P_13_1>
  <P_14_1>230.00</P_14_1>
  <StawkaPodatku>
    23
  </StawkaPodatku>
  <P_15>1230.00</P_15>
</Fa>

Field names are not the hard part. Rounding rules, tax categories, exemption reasons and what counts as a valid correction differ between the two, and that is where mappings break.

What it looks like

Screens from software that is in production. The data on them is test or default data — nothing belonging to a client. The interface is in Polish, because these tools were built for Polish finance teams; the documents they produce come out in German or English, and an English interface is a matter of translation, not rework.

Invoices and returns, made readable

Nobody in finance verifies raw XML. These render it — and validate it — before it reaches a tax authority.

XRechnungVisualizer — CII and UBL, validated against EN 16931, with PDF export. This one you can try yourself in the browser.
XRechnungVisualizer — CII and UBL, validated against EN 16931, with PDF export. This one you can try yourself in the browser.
XMLVisualizer — Polish SAF-T files and KSeF invoices rendered as readable HTML, with PDF export.
XMLVisualizer — Polish SAF-T files and KSeF invoices rendered as readable HTML, with PDF export.
RSAHelper — XAdES signing, KSeF certificates, QR codes and XML validation, exposed as a REST service with an OpenAPI schema.
RSAHelper — XAdES signing, KSeF certificates, QR codes and XML validation, exposed as a REST service with an OpenAPI schema.

Polish SAF-T (JPK), end to end

What your Polish entity files every month. Two interfaces over the same logic, because finance teams work differently.

Browser version: file status, quick actions, and the health of the local signing service.
Browser version: file status, quick actions, and the health of the local signing service.
Filing in four steps, signed either by the local service or by an external tool.
Filing in four steps, signed either by the local service or by an external tool.
JPK V7M editor — declaration and ledger sections, with validation flagging gaps before submission.
JPK V7M editor — declaration and ledger sections, with validation flagging gaps before submission.
Desktop version: a sales row with GTU markers, special procedures and the K_ fields.
Desktop version: a sales row with GTU markers, special procedures and the K_ fields.
WysylkaJPK — one screen: point at the file, repair it, file it with the ministry gateway.
WysylkaJPK — one screen: point at the file, repair it, file it with the ministry gateway.

Technology

Day to day .NET 8–10 · C# · ASP.NET Core (REST, OpenAPI) · Entity Framework Core · WPF · WinUI
E-invoicing KSeF · XRechnung · EN 16931 · Peppol formats · SAF-T (JPK) · XAdES · XML/XSD · government APIs
Desktop interfaces DevExpress · Telerik · Syncfusion · CommunityToolkit MVVM · Prism
Quality and operations NUnit / xUnit · NSubstitute · Playwright · Polly · NLog · Prometheus · CI/CD · architecture tests · SBOM
Legacy systems .NET Framework 3.5–4.8 · WCF · WinForms · migrations to .NET 8+

Working with clients outside Poland

The things a Polish client never has to ask, and a foreign one cannot look up.

Time zone Warsaw is CET/CEST — the same working day as Berlin, Vienna, Amsterdam and Stockholm, one hour ahead of London. No overnight handoff.
Contracting Contracts in English or German. Polish or German law, your choice. I work on your paper or mine, and I will sign your NDA before the first call if you want.
Invoicing EUR for clients outside Poland. Invoices to EU businesses are issued without VAT under the reverse-charge mechanism — your EU VAT ID goes on the invoice.
GDPR I am established in the EU, so there is no third-country transfer, no standard contractual clauses and no transfer impact assessment. I will sign your DPA.
Code ownership Source, documentation and full rights are assigned to you in writing on delivery, under the governing law of the contract. You stay on maintenance or you carry on without me.
Capacity 10–15 h per week. The connector already exists — what you are buying is integration and configuration, not research and development. For anything larger I will say so before we start, not after.

UnitSoftware Grzegorz Giewon is a registered Polish sole proprietorship, EU VAT registered as PL5732296089 — verifiable in VIES. My own invoices go through KSeF; I am not selling you something I have not had to run myself.

How we work

1. A call, 20 minutes. You describe how you invoice today and in what. I tell you whether this is a week of work or a quarter — and whether I am the right person at all.

2. Analysis and quote. You get the scope, an estimate and the commercial terms in writing, in EUR, before anything starts.

3. Delivery in stages. Test environment first, then production. Something working at the end of each stage, with progress visible in your tracker or mine.

4. Handover. Code, documentation and full rights assigned to you in writing, under the governing law of the contract. You stay on maintenance or you carry on without me.

Questions

Does KSeF apply to my company?

A Polish VAT registration on its own does not put you in scope. The test is a fixed establishment in Poland that actually takes part in the supply being invoiced — which requires people, technical resources, sufficient permanence and involvement in the transaction. A postal address or a passive warehouse is not enough. Whether you have one is a tax question, and your advisor answers it. I build what follows from the answer.

We are not in scope, but our Polish suppliers are. What changes for us?

They still have to issue through KSeF, and then hand the invoice to you by an agreed channel — PDF by email, paper, or a visualisation carrying a QR code and a download link. Nothing forces you into the system. If you want that inbound flow automated into your accounts-payable process, that is a build.

We integrated in early 2026. Is anything about to break?

Possibly. The FA(2) schema was replaced by FA(3) on 1 February 2026 — if you integrated before that, you have already felt it. Anyone starting now should build against FA(3) directly.

We need XRechnung as well. Can you do both?

Yes, and that is the reason to talk to me rather than a general KSeF vendor. Germany has required the ability to receive EN 16931 invoices since January 2025, and issuing becomes mandatory from 1 January 2027 above €800k turnover. Same EN 16931 base underneath, two different national layers on top. I have built the converter between them and it runs in production.

Do I have to replace my system?

No. KSeF talks over an API, so in most cases the integration is built into the system you already run. Replacing working software to satisfy a reporting obligation is almost never the cheap option.

What happens when the KSeF API stops responding?

That is a scenario to design for from the start, not to discover in production. I build with queueing, retries and an offline mode, so an outage on the government side does not stop you invoicing. The regulation itself provides for offline issuing — the software has to know how to use it.

How long does an integration take?

Four to six weeks from analysis to production for a typical company system. The biggest unknown is rarely KSeF — it is the state of the code being connected, and, on cross-border projects, how the Polish entity’s data reaches the group ERP.

Our finance team does not read Polish. Are the tools usable in English?

Ask me before you commit to anything on this. The applications were built for Polish deployments and the screenshots on this site show a Polish interface. English localisation is a scoped item, not something I will claim is already done.

Are you a tax advisor?

No. I do not determine whether you have a fixed establishment, and I do not give tax advice. I write the software that implements the answer your advisor gives you.

You are one person. What happens if you become unavailable?

A fair question, and the answer is what I already do from day one rather than an assurance. Code lands in your repository from the start — it is not handed over at acceptance. Copyright is assigned to you in writing. The integration is built on components with public documentation: the manuals are downloadable from this site without an account, so you can judge in advance whether an outsider could follow them. There is no proprietary format and no dependency on my infrastructure after handover. In the worst case you are left with working .NET code that another developer can pick up — not a service that expires with the contract.

Let’s talk about your invoices

Twenty minutes, no commitment. Tell me what you invoice in and where your Polish entity sits — we can work out the rest. I reply in English.

Booking times are shown in Warsaw time (CET/CEST) — the same working day as Berlin, Vienna and Stockholm. Already know what you need? Book an hour of technical consultation instead — code review, integration design, or taking apart the specific problem that is blocking you.

Existing clients: installers, builds prepared for your deployment and documentation are in the client area. Sign-in is by a code sent to your email address — no account to create, no password to remember. Access is granted to the addresses you nominate, and each client sees only their own files.

Support requests: support@unitsoftware.com.pl