From 1 January 2027 e-invoicing becomes mandatory for taxpayers outside the VAT system too
Generate valid UBL 2.1 XML under HR CIUS 2025, check all 62 official rules, and store documents in an archive with 11-year retention - without hand-writing XML.
✓ Laravel 11–13, Filament v5, PHP 8.3+
✓ Perpetual licence, no subscription
✓ All 62 official HR CIUS rules
✓ No activation, no licence server
✓ Open-source core (MIT)
✓ Runs entirely locally, sends no data
Documentation in Croatian and English
The seller and the operator come from config, because they are identical on every document. The builder derives the amounts, the VAT breakdown and the Croatian extension. You describe only what your application alone knows.
class Invoice extends Model
{
use MapsToEracun;
protected function eracunBuyer(): Party
{
return self::eracunPartyFrom($this->customer);
}
protected function eracunLines(): iterable
{
foreach ($this->items as $item) {
yield [
'name' => $item->description,
'quantity' => (string) $item->quantity,
'unitPrice' => (string) $item->unit_price,
'kpd' => $item->kpd_code,
];
}
}
}
$invoice->toEracunXml(); // HR CIUS UBL, ready for a provider
$invoice->validateEracun(); // all 62 rules, before sending
$invoice->storeEracun(); // into the archive, linked to the model
For anyone issuing e-invoices from their own application. If a provider's web portal or the free government app is enough for you, you do not need this - and that is fine.
You bill Croatian companies from your own Laravel application. Add e-invoicing without writing UBL or learning the HR CIUS specification.
Your clients must issue e-invoices from 2026, or 2027. The Agency licence covers an unlimited number of client projects.
The invoices already exist in your system. What is missing is the format, validation before sending, and an archive that survives 11 years of retention.
A client asks for e-invoicing and the specification runs to 200 pages. Bill for the integration, not for weeks spent reading Schematron.
The Croatian rules add fields EN 16931 does not have. Each one is a rejected invoice.
HR-BT-4 / HR-BT-5
The name and tax number of the person who issued the invoice. EN 16931 has no such field, so most applications do not record it. Solved once, in config.
HR-BR-33
Jedan <cbc:Note/>
and an otherwise perfect document is rejected. The writer never emits an empty element.
HR-BR-27 · 32 · 54 · 55
Six rules check nothing but the agreement of base, VAT and the Croatian extension. The builder derives them from your lines, so they hold by construction.
HR-BR-CL-2
Only 3,359 six-digit codes are valid on a line, not the catalogue's 5,828. Validation runs against the list inside the official validator.
ext-2025
HR CIUS is not only a restriction - it adds a parallel amount structure. Required for everyone outside the VAT system, which is the whole 2027 cohort.
HR-BR-4
let varijabla
variable thirty lines above the assertion multiplies the amount by −1. Without it every
credit note reports a false error.
Issued and received documents in one place, with a rendering, the original XML and the list of broken rules.
The original bytes are stored verbatim with their SHA-256. Retention runs eleven years and is counted from the issue date, not from the row being written - a backfilled import must not restart the clock. The pruning command refuses to touch anything inside the window.
Violations are recorded alongside the document but never block the write. A received invoice arrives whether or not it is correct, and refusing it is a decision you make through the workflow, with reason codes N, U and O. Rejecting at the door would destroy the evidence.
Duplicates are detected by the e-invoice identity - issuer tax number, document number and issue date. A watched folder rescanning returns the existing row instead of raising.
All 62 rules were diffed against the published Schematron run under Saxon: 20 documents, 0 disagreements. Messages carry the official rule identifiers, so they match what your provider sends back.
Captured from a real Filament v5 application in Croatian. Click a screenshot to enlarge it.
No keys, no activation, no server checking a licence. Access to the private repository is the licence - nothing phones home and nothing stops working.
0 €
Open source, MIT. For developers.
79 € + VAT · one-time
For your company's own projects, with no limit on installations or developers.
249 € + VAT · one-time
If you embed e-invoicing in a product you sell to clients.
Prices exclude VAT. Polar.sh is merchant of record and charges VAT for your country, so the checkout total is higher - VAT-registered businesses reclaim it as input tax. Tick "I'm purchasing as a business" at checkout and enter your VAT number so the invoice is issued to the company. Licensed to businesses only - see the licence terms.
Deliberately, and it will not change. Better to know the boundary in advance than to find it in production.
No fiscalisation, no signing. Those need a digital certificate. The package handles no certificates, stores none, and connects to no government system.
Not a transmission provider. Transport adapters call a provider's public API with your credentials under your contract. That is ordinary integration.
A business-rule validator, not a conformance validator. Passing does not guarantee acceptance. The package reports what it checks and what it does not.
Makes nobody compliant with the Croatian fiscalisation act. It processes documents; compliance is yours.
A provider transmits the document. It does not build it from your data, does not keep it in your application, and does not check it before you send. If their web portal is enough, you do not need this. If invoices originate in your application, you do.
Model mapping, the archive and validation all work without Filament, which is only needed for the interface. The free package does not even depend on Laravel.
They will - the Schematron in force since 15 March 2026 is itself a revision published after the mandate began. A licence includes a year of updates; after that the package keeps working and updates can be renewed.
There is none. After purchase you get access to a private GitHub repository and add it
as a vcs
repository in composer.json.
No key, no outbound calls, and no scenario where a deploy stops because a licence server
was unreachable.
Polar handles the sale as merchant of record and issues the invoice. If you buy
as a company, tick I'm purchasing as a business and enter your VAT
number with the country
prefix -
HR12345678901,
not just 12345678901.
Without the prefix the VIES check fails. Straight after payment you connect your
GitHub account, and the invitation to the private repository arrives within a
minute.
One licence covers one company - invite whoever you need. The Agency licence adds the right to embed it in a product you sell to clients.
Yes. Laravel 11, 12 and 13 are supported, with Filament v5 and PHP 8.3 or newer. Tests run against both the lowest and the highest supported dependency versions.
No. The package neither signs documents nor performs fiscalisation, so no certificate is needed and none is ever handled. A certificate is only required for signing and fiscalisation, which your transmission provider does.
No. Generation, validation, rendering and the archive all run entirely inside your application. There is no licence check, no outbound call, and no invoice data ever leaves your system. Internet is only needed if you use a transmission adapter.
The Pro licence covers unlimited projects and installations inside your own company. If you embed the package in products or projects you deliver to clients, you need the Agency licence.
Yes - that is precisely the case requiring the Croatian extension (ext-2025), which the package emits automatically when the seller is outside the VAT system.
Worth distinguishing who buys: a very small trader usually uses the free government application. This package is bought by whoever builds the software such taxpayers invoice with.
The free package is the whole document mechanism - reading, building, validation and rendering - and ships four official example invoices. If it does what you need, you do not need Pro.