Get in touch
  • OpenCart
  • Payments
  • v1.0.0

Fiskalizacija HR for OpenCart — fiscal receipts to the Croatian Tax Administration CIS (ZKI, JIR, QR)

Croatian receipt fiscalisation for OpenCart 4, 3 and 2.3: the ZKI protection code, a request signed with your own certificate sent to the CIS service of the Tax Administration (Porezna uprava), the JIR and QR code on the order, on the printable receipt and in the customer account. Gapless numbering, VAT by rate, late delivery when CIS is down, a receipt register. Pro adds storno receipts, buyer OIB at checkout, the receipt by e-mail, other currencies, CSV and alerts. One-time payment, perpetual licence.

Download Free
Pro · lifetime licence The more sites, the less each one costs
Compatibility
OpenCart 4.0.2 – 4.1.x (tested on 4.1.0.3 and 4.0.2.3 with the pdo driver) · OpenCart 3.0.x (tested on 3.0.5.0) · OpenCart 2.3.0.2 · PHP 7.0+ with OpenSSL and DOM · CIS: specification v2.7, WSDL/XSD 1.10
Version
v1.0.0 (OpenCart 4)
v1.0.0 (OpenCart 3.x)
v1.0.0 (OpenCart 2.3)
Licence
one site, lifetime
Trial
7 days, no card, one per site
Updated
October 2026
Or all 173 Pro modules with All Access — 4 990 ₴ / year

What Free has,
and what Pro adds

The free version works with no time limit. Pro adds the rest of the features in the table.

Feature Free Pro
Fiscal receipt when an order gets the chosen status (by default the shop's complete statuses) ✔ ✔
ZKI protection code per section 12 of the CIS specification (RSA-SHA256 signature + MD5) ✔ ✔
RacunZahtjev request signed with your certificate (XMLDSig, Exclusive C14N, RSA-SHA256) — straight to CIS, no intermediary ✔ ✔
Numbering 1…n each year per premises (P) or device (N), gapless, a first number of the year to continue a series ✔ ✔
VAT at 0, 5, 13 and 25 % from the order's tax rows; coupons spread over the rates, shipping by its own tax ✔ ✔
Payment method per payment module: G cash, K card, T bank transfer, O other ✔ ✔
JIR saved with the order, the CIS answer signature verified against the FINA chain ✔ ✔
CIS unreachable — the receipt stays valid with its ZKI, automatic late delivery (NakDost) with a new message ID ✔ ✔
QR code, printable receipt behind a keyed link and the receipt block in the customer account ✔ ✔
Receipt register, receipt page with the signed request and the answer, panel on the order page, Send again after a fix ✔ ✔
Test (DEMO certificate) and production environments with separate numbering, echo connection check, provjera in test ✔ ✔
.p12 or .pem certificate, private key stored encrypted, warnings about expiry and OIB ✔ ✔
English and Croatian interface, builds for OpenCart 4.x, 3.x and 2.3 ✔ ✔
Storno receipts for refunds — by status or button — ✔
Buyer OIB (B2B): checkout field with a check-digit check and manual OIB on the order — ✔
Receipt e-mailed to the customer after the JIR — ✔
Orders in other currencies — receipt in euro at the shop's rate — ✔
Receipts for past orders in bulk, CSV register and alerts to the owner — ✔

What it looks like

Printable fiscal receipt with ZKI, JIR and QR code
Receipt 1/WEB1/1 in the test environment: items at 25 % and 13 %, shipping, VAT breakdown, ZKI, JIR and QR code. The JIR comes from the CIS model.
Fiscal receipt block in the customer account on a phone
Customer account on a phone: the “Fiscal receipt” block with QR code, number, total, ZKI and JIR.
Fiscal receipt register in the OpenCart admin
The “Receipts” tab: receipts with a JIR, a storno of −243.00, late-delivery receipts and a buyer OIB, payments T, K and O. Test environment with the CIS model.

The trial starts when you ask

A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site

Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. For studios — keys for 5 or 25 sites, or unlimited.

Technical requirements

  • OpenCart 4.0.2 – 4.1.x (tested on 4.1.0.3 and 4.0.2.3, with the mysqli and pdo database drivers), 3.0.x (tested on 3.0.5.0) or 2.3.0.2 (tested on PHP 7.0).
  • PHP 7.0+ with OpenSSL and DOM, outgoing connections to port 8449 (TLS 1.2+).
  • A fiscalisation certificate for your OIB: DEMO for testing, production for live receipts. PHP with OpenSSL 3 cannot open old .p12 files encrypted with RC2 — the module shows the command to repack the file into .pem once.
  • Business premises of the web shop registered in ePorezna; OpenCart tax classes with the Croatian rates (25/13/5/0 %).
  • Cron: in OpenCart 4 retries run from the OpenCart scheduler; in 3.x and 2.3 add the address from the “Tools” tab to your hosting cron (every 5 minutes). Without cron, retries happen only on page views.
  • Does not do: eRačun and Fiskalizacija 2.0 between businesses, eIzvještavanje, registration of business premises, PNP, and changing the payment method with promijeniPodatkeRacuna (use storno and a new receipt instead).
  • Module languages: English and Croatian.

Version history

v1.0.0 Current October 2026

For OpenCart 4.x, 3.x and 2.3: receipt fiscalisation in CIS per specification v2.7 and WSDL/XSD 1.10.

Frequently bought with Fiskalizacija HR for OpenCart

4 modules in one order — 40% cheaper than separately

“Store starter” bundle Fiskalizacija HR Nova Poshta Premium LiqPay Telegram notifications and Viber/SMS for customers Need more — all 173 modules in All Access for 4 990 ₴.
3 790 ₴ lifetime instead of 6 260 UAH bought separately
Buy the bundle →

Full module description

Fiskalizacija HR for OpenCart is a module for web shops in Croatia running OpenCart 4, 3 or 2.3. In Croatia every receipt to an end customer must be fiscalised, whatever the payment method. The shop computes the ZKI protection code, sends the signed receipt to the CIS fiscalisation service of the Tax Administration (Porezna uprava) and prints the JIR identifier and a QR code on the receipt. The module does this for OpenCart orders straight to CIS with your own certificate, with no third-party service in between and no monthly subscription.

Running WooCommerce? There is a separate version for it — Fiskalizacija HR for WooCommerce, with the same signature, ZKI and request format.

What you need. The OIB of your company or obrt; the web shop registered as business premises in ePorezna (the module does not do this — it only needs the premises code, e.g. WEB1); a fiscalisation certificate issued for your OIB, e.g. FINA “Fiskal”. The CIS test environment accepts only DEMO certificates, production only production ones.

Honestly about testing. The module was built and checked against the official CIS technical specification “Tehnička specifikacija za korisnike” v2.7 and the FiskalizacijaSchema / WSDL 1.10: every generated request — regular receipts, late delivery, storno with negative amounts, receipts with a buyer OIB — passed the official XSD and an independent signature check, and every ZKI was recomputed separately. The full run was done on local shops with OpenCart 4.1.0.3, 4.0.2.3 (pdo driver), 3.0.5.0 and 2.3.0.2 on PHP 7.0 against a model of the CIS answers: success, refusals, outages. The real CIS test server answered us only without a DEMO certificate, which requires a Croatian OIB that CatCode does not have. So you get the live JIR in your own 7-day Pro trial with a FINA DEMO certificate. If CIS answers differently from the specification, we will fix it promptly.

Responsibility for the receipt data stays with the shop. The module takes amounts and taxes from the OpenCart order, and the VAT system, premises and device codes, operator, payment methods and the category of lines without VAT from your settings. Review these settings with your accountant before switching to production.

What the customer sees

The customer gets a receipt: shop details and OIB, the number in the broj/prostor/uređaj format, date and time in Croatian time, operator, payment method, items with VAT rates, the VAT breakdown, ZKI, JIR and a QR code linking to the receipt check on porezna.gov.hr. The receipt page opens only through a keyed link and prints with the “Print” button.

In the customer account, in the order history, a “Fiscal receipt” block appears with the QR code, number, total, ZKI, JIR and a link to the receipt. Customers never see other people’s receipts; on a phone the block has no horizontal scroll.

Pro. A company paying by card or in cash can enter its OIB in the “Company OIB” field at checkout — the default one and CatCode One Page Checkout. The module checks the check digit: a wrong OIB stops the checkout next to the field. After the JIR the customer gets the receipt by e-mail.

What the admin gets

  • Extensions → Modules → CatCode Fiskalizacija HR with the “Receipts”, “Settings”, “Tools” and “Licence” tabs (in Croatian when the admin is in Croatian).
  • Receipt register: number and time, order, buyer and buyer OIB, total, payment method, status (Fiscalised, waiting for JIR, refused, late delivery), JIR and ZKI; a status filter and search by number, JIR, ZKI, OIB or order.
  • “Send receipts without a JIR now” sends the queue at once, “Send again” re-sends a refused receipt after the settings are fixed.
  • The top of the page shows the environment (TEST or PRODUCTION) and warnings: the certificate has expired or is about to, the OIB in the certificate differs from the settings, a DEMO certificate in production, receipts without a JIR for more than 30 minutes.

The receipt page shows everything that went to CIS and came back: number, status, ZKI, JIR, whether the answer signature was verified, the number of attempts, the receipt lines and VAT breakdown, all receipts of the order, and below them the signed request and the answer XML. In the test environment there is the provjera check — CIS compares the receipt without fiscalising it.

The order page gets a “Fiscal receipt” panel with the receipts and storno receipts of the order, the “Issue and fiscalise the receipt” button and the buyer OIB field for the next receipt (Pro). Each step is written to the order history.

How it works — step by step

  1. Certificate. Upload a .p12 with its password or a .pem. The module shows the subject, issuer, OIB and validity, stores the private key encrypted (the encryption key lives in system/storage, not in the database) and takes the OIB from the certificate into the settings. “Check the connection” tests the link to CIS with an echo message.
  2. Issuer and numbering. OIB, whether you are in the VAT system, name and address for the receipt, premises code, device number, sequence (per premises P or per device N), the first number of the year if you continue a series from another program, operator OIB and label (empty means the issuer OIB and “WEB”).
  3. Payments and taxes. A G, K, T or O code for each payment module; the category of lines without VAT; codes of order totals that are payments rather than sales (voucher and credit by default).
  4. Order. When an order gets the chosen status, the module checks totals and rates locally, only then takes the next number, computes the ZKI, builds and signs the RacunZahtjev and sends it to CIS. Setting the status again does not create a second receipt.
  5. Answer. CIS returns the JIR — the module verifies the answer signature and stores the JIR. An s001–s005 or s013 error marks the receipt “Refused”, the reason is shown in the register, “Send again” after the fix.
  6. Outage. CIS did not answer — the receipt is already valid with its ZKI, and the module delivers it later with the NakDost flag and a new message ID, with a growing pause from 1 to 360 minutes.

VAT is taken from the order’s tax rows and grouped by rate — 25 %, 13 %, 5 % or 0 %. A rate CIS does not accept is stopped before sending with an explanation, and no number is used. Coupons are spread over the rates, shipping goes by its own tax, and rounding cents are reconciled so the receipt total matches the order total. Lines without tax go as VAT-exempt by default, a product with a real 0 % rate as VAT at 0 %; other categories can be forced.

Pro. A refund produces a storno receipt with negative amounts at the same rates — automatically on the “Refunded” and “Reversed” statuses (configurable) or with a button. The buyer OIB goes to CIS only with payment G or K, as the specification requires. An order in another currency gets a receipt in euro at the shop’s rate, past orders can be fiscalised in bulk by ID, the register exports to CSV, and the owner gets an e-mail when a receipt is refused or still has no JIR after 5 attempts.

Under the hood

  • CIS: RacunZahtjev (fiscalisation), ProvjeraZahtjev (check, test only), echo (connection); cistest.apis-it.hr:8449 and cis.porezna-uprava.hr:8449, SOAP 1.1.
  • ZKI — MD5 of the RSA-SHA256 signature of OIB + date and time + number + premises + device + total, as in section 12 of specification v2.7.
  • Request signature — enveloped XMLDSig: Exclusive C14N, RSA-SHA256. RSA-SHA1 is not used: test CIS refuses it since 1 July 2026, production from 1 January 2027.
  • TLS and the answer: the connection is verified with the bundled FINA certificates (Fina RDC 2020, Fina Demo CA 2020), the answer signature with the service certificate.
  • Locked numbering: concurrent orders never get the same number and leave no gaps; separate counters for test and production. Tested with 40 concurrent orders and a register of 3,000 receipts.
  • OpenCart events: the module does not modify core files — it works through events, so it works with CatCode One Page Checkout (tested on 4.1 and 3.0).
  • Uninstalling: OpenCart removes the settings and the certificate, while the register and counters stay as tax records; the “Delete data on uninstall” option removes them too.

How to install

  1. OpenCart 4: Extensions → Installer → upload cc_fiskalhr.ocmod.zip (do not rename the archive) and press Install. OpenCart 3: Extensions → Installer → cc_fiskalhr-oc3.ocmod.zip. OpenCart 2.3: upload the contents of the upload/ folder from cc_fiskalhr-oc2.ocmod.zip to the shop root (FTP or the hosting file manager).
  2. Extensions → Modules → CatCode Fiskalizacija HR → Install → Edit.
  3. Settings: upload the DEMO certificate, press “Check the connection”, fill in the OIB, premises code, device, operator and payment methods, switch fiscalisation on in the TEST environment.
  4. Place test orders, check the receipts in the register and with the provjera check.
  5. Show the settings to your accountant, switch the environment to PRODUCTION and upload the production certificate.
  6. For Pro: paste the licence key from the e-mail after payment or start the 7-day trial on the “Licence” tab.

Questions
about the module

Didn't find the answer? Message us on Telegram and we'll reply within a business day.

@catcode_support Setup, compatibility, activation
What do I need to start?

The OIB of your company or obrt, the web shop registered as business premises in ePorezna, and a fiscalisation certificate for your OIB (for example FINA). The CIS test environment takes a DEMO certificate, production takes a production one. Receipts are issued in EUR.

What has the module been tested on?

Against the official CIS technical specification v2.7 and the XSD/WSDL 1.10: generated requests passed the official XSD and an independent signature check, the ZKI was recomputed separately. CIS answers were modelled in the tests. You get a live JIR in your own 7-day Pro trial with a FINA DEMO certificate — without a Croatian OIB it is not available to us.

Is the licence yearly?

No. For OpenCart it is a one-time payment and a perpetual licence, one for all three builds: 4.x, 3.x and 2.3. The Pro trial starts only with your button; after it receipts keep being fiscalised.

Who is responsible for the receipt data?

The shop. The module takes amounts and taxes from the order and the VAT system, premises and device codes, operator, payment methods and the category of lines without VAT from your settings. Check them with your accountant before switching to production.

Not quite what you are looking for?

We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.

Order a custom module