The plugin connects a WooCommerce shop to BokaPOS, the cloud ESIR for distance commerce in Serbia. Every paid order receives a fiscal receipt through the Tax Administration's virtual fiscal processor (V-PFR): the PFR number, the verification link, the QR code and the PDF, all on the order screen and delivered to the customer. BokaPOS 1.0.0 is approved by the Tax Administration as ESIR IB 1656 (decision 000-092-00-00171/2026-0000 of 2 September 2026).
Requirements
- WordPress 6.5+, WooCommerce 8.9+, PHP 8.1+.
- BokaPOS access: write to office@bokagroup.rs or use the contact page on bokapos.rs. BokaPOS opens the organization, assigns a sandbox certificate and issues a client id and secret. The sandbox is free and never blocked.
Setup in five steps
- Connection. WooCommerce, BokaPOS, Connection tab. Enter the sandbox client id and secret, click "Test connection", choose the taxpayer and the business premise, save.
- Taxes. Taxes tab. The plugin reads the tax labels live from the V-PFR (the sandbox has a test set, production the official Serbian labels). Map every WooCommerce tax class to a label, plus the shipping and fees rows. A taxpayer outside the VAT system maps everything to the non-VAT label.
- Payments. Payments tab. The plugin proposes a payment type per gateway (cash on delivery is cash, bank transfer is wire transfer, card gateways are payment card). Adjust as needed.
- Fiscalization. Fiscalization tab. By default you fiscalize manually from the order screen or with the bulk action. If you switch automatic fiscalization on, Completed (goods delivered or service performed) is the recommended status. Watch for the warning there: if a payment method takes the money before you deliver, a receipt due at Completed arrives later than the law wants, and the tab tells you which methods and how to settle it. Cashier, default unit, shipping line name, footer text, advances and proforma live here too.
- Receipt delivery. Receipt delivery tab. WooCommerce e-mail with the PDF, BokaPOS platform e-mail (E-mail module), the receipt block on the thank-you page and in My Account, and the PIB field at checkout.
Place a test order. The order screen shows the "BokaPOS fiscalization" box with the status, PFR number, verification link and PDF.
Order lifecycle
- Automatic (when switched on). A few seconds after the status change the plugin sends the order in the background. A receipt exists only when BokaPOS answers "fiscalized". The order note and the "Fiscal receipt" column show the result.
- Manual. "Fiscalize now" on the order, or the bulk action "Fiscalize with BokaPOS" on the orders list.
- Old orders. Orders created before activation are never fiscalized: the receipt would carry today's time.
When something stops
| Status | Meaning | What to do |
|---|---|---|
| Retry scheduled | BokaPOS or the V-PFR is temporarily unavailable. Nothing was issued. | Nothing. The same request is repeated with the same key (5 s, 30 s, 2 min, 10 min, 30 min, 60 min). |
| Outcome being checked | The request may have reached the V-PFR; the answer did not. | Nothing. The plugin never resends; it checks with BokaPOS until resolved. Do not fiscalize again. |
| Rejected | The V-PFR or BokaPOS rejected the request (label not current, three decimals in a price). Nothing was issued. | Read the note, fix the data, then "Fiscalize again (new request)". |
| Needs attention | The plugin stopped and needs a person. | The order note and the admin e-mail say why. After fixing, use the matching button, then "Clear flag". |
The "BokaPOS: needs attention" filter on the orders list and the BokaPOS journal page list every such order.
Refunds
Create the refund as usual. The refund panel gains "Fiscalize this refund at BokaPOS", the buyer identification (required on every refund: identity card number, company PIB, passport and the other official kinds) and the returned payment type. Refund whole units at the receipt price; an amount without lines cannot be fiscalized. The fiscal refund is sent in the background a few seconds after you click "Refund"; reload the order to see the result in the Refunds section, which also holds the retry buttons. When cash is returned, BokaPOS also issues the copy for the customer's signature; print it from the order screen.
The receipt prints the buyer identification only. BokaPOS still resolves the company from the NBS register at issuance and returns it with the receipt; the order screen shows that name next to the identification, and the plugin does not query the register itself.
The optional buyer field (tax-exemption forms, corporate card) is a sale-receipt field. Fill it in on the order before the sale is fiscalized; it never goes on a refund, an advance receipt, a proforma or a training document, and in an advance chain it appears on the final receipt.
Advances
Mark prepaid gateways as advances in the Fiscalization tab. The chain has two statuses of its own, because the law wants the advance receipt at the moment the money arrives rather than at delivery: at the opening status (Processing by default) the plugin opens the case and issues the advance receipt, and at the closing status (Completed by default) BokaPOS issues the advance refund and the final receipt. Both run only if automatic fiscalization is on; otherwise you use the buttons on the order screen. Production needs the Advance module.
Proforma, training, copies
From the order screen: proforma (an offer without tax effect) and training document (for testing, no tax effect) while the order has no receipt yet, and a copy once it has one. Proforma can be issued automatically for selected gateways when the order is placed.
Every fiscalized receipt can be copied, the final receipt of an advance chain included. A copy is itself a document in the journal, marked ОВО НИЈЕ ФИСКАЛНИ РАЧУН, so issue one when the customer asks rather than out of habit.
Advances in instalments and older deposits
The order screen takes an amount, so a chain can start with a deposit and take further instalments, each with its own advance receipt; leaving the amount empty fiscalizes the whole order at once as before. Under "A deposit was taken before eFiscalization" you can declare money received on a paper document before this shop had eFiscalization at all: BokaPOS then references that document in the chain and adds the amount to the closing refund. Fill it in before the first advance receipt, because after that the chain is already open. The document number is digits only; the Tax Administration refuses any other form.
Advanced settings
The Advanced tab holds the things you set once and forget: how much the plugin writes to the WooCommerce log (errors only by default), the interface language, and whether uninstalling the plugin also deletes its journal table. That last one is off on purpose, because the local journal is part of your records; deleting it removes only this site's copy, never the documents at BokaPOS or at the Tax Administration. The tab also shows the plugin version, when it was activated (orders older than that are never fiscalized by it) and a link to its background jobs. Changing anything here needs an administrator, not just a shop manager.
Finding a chain that got lost
BokaPOS journal, "Advance chains at BokaPOS", lists every chain your organization has open, whichever system opened it, with the WooCommerce order beside it where this site knows one. That is where a chain turns up after a restored database or a deleted order, so it can be closed instead of staying open for ever.
Going to production
- The taxpayer's authorized person requests the security element for the premise on the Tax Administration portal and downloads the ZIP.
- The Owner uploads it in the BokaPOS portal (cloud.bokapos.rs, Security elements). BokaPOS verifies and activates it and issues the licence.
- BokaPOS issues the production client id and secret. Enter them in the Connection tab, choose the taxpayer and premise, switch the environment to Production, save.
- Map the tax classes again in the Taxes tab (production has different labels).
- Verify the first production receipt at suf.purs.gov.rs through the link on the order.
The sandbox stays available for further testing.
Who can do what
A Shop manager (manage_woocommerce) runs every order action and edits the Fiscalization, Taxes, Payments, Receipt delivery and Catalogue tabs. The credential, the environment (sandbox or production) and data deletion are administrator-only (manage_options).
Support
BokaPOS Administration: office@bokagroup.rs, +381 69 558 55 88. Send the order number and the document id from the technical details on the order; never the secret or the certificate. Plugin logs: WooCommerce, Status, Logs, source "bokapos".
Constants and hooks for developers
Constants (wp-config.php): BOKAPOS_ENVIRONMENT, BOKAPOS_SANDBOX_CLIENT_ID, BOKAPOS_SANDBOX_CLIENT_SECRET, BOKAPOS_PRODUCTION_CLIENT_ID, BOKAPOS_PRODUCTION_CLIENT_SECRET, BOKAPOS_UPDATE_MANIFEST_URL.
Filters: bokapos_order_items (line items before sending; do not reorder), bokapos_order_buyer (buyer object), bokapos_client_reference (reference string), bokapos_order_eligibility_problem (exclude orders), bokapos_validate_pib_checksum.
Actions: bokapos_order_fiscalized( $order, $operation, $document ), bokapos_refund_fiscalized( $refund, $operation, $document ), bokapos_advance_fiscalized( $order, $operation, $document ).
Templates overridable in the theme under bokapos-for-woocommerce/: order-receipt.php, emails/bokapos-receipt.php, emails/plain/bokapos-receipt.php.