Documents
Payroll
Updated 30/09/2026
The Payroll module (Kancelarija plan) calculates employees’ salaries, produces payslips and a payroll summary, and generates the PPP-PD payroll tax return as an XML file for the ePorezi portal (the Tax Administration e-portal). duplo does not connect directly to ePorezi — the return is signed with a qualified certificate, so the XML is uploaded by you or your accountant.
The module is visible only to the Super admin, Administrator and Accountant — a Member does not see payroll (other people’s salaries are the most sensitive data in a company).
Employees
In Payroll → Employees you enter the details of your employees:
- Type of employment: employee (employment contract), owner/founder in an employment relationship, employed pensioner. For a person insured 100% with another employer only the pension (PIO) contribution is calculated.
- Calculation basis: the agreed monthly gross, the agreed monthly net (the net basic salary; the length-of-service increment, meal allowance and holiday allowance come on top), total net to the account (what the employee actually receives, with all allowances; every month the programme finds the basic salary itself, so it adjusts by itself when length of service grows or the rates change) or minimum wage per hour. Below the amount field you immediately see the other direction (enter net → see gross and the total cost to the company, and vice versa), so you do not have to call your accountant for the conversion.
- Basic salary under the contract (with total net, optional): copy it from the employment contract, gross or net as written there. When it is entered, the payslip shows separately the basic salary, the line „Stimulacija (radni učinak)“ (performance bonus) that tops it up to the target net (it may also be negative) and the length-of-service increment on the basic salary — as the Rulebook on the Content of the Salary Calculation (Pravilnik o sadržaju obračuna zarade) requires. If you do not have that figure, leave it empty: the payslip then has a single combined line.
- JMBG (personal ID number) and the municipality code of residence — mandatory for the tax return (the municipality code comes from the Tax Administration catalogue, 3 digits; your accountant knows it).
- Length of service before this employment (for the length-of-service increment — minuli rad), weekly hours (full/part time), commuting allowance, meal allowance and holiday allowance (with a flag for whether they are already included in the agreed salary), job title (for the payslip).
- Deductions (loan, garnishment order): a fixed monthly instalment or a percentage of net; with the total debt entered, the deduction stops by itself when it is repaid (the last instalment is shortened).
Payroll run
- New payroll run: you choose the month, the payment date and the monthly hours fund (the programme suggests working days × 8, you enter the public-holiday hours). If you pay tax and contributions on a different day from the salary, enter that date too — the statutory parameters are chosen by it and it goes into the return. All active employees enter automatically, with suggested lines: regular work, public holiday, length-of-service increment, commuting allowance, deductions…
- Review per employee: clicking an employee opens the lines of the run — you can change hours (annual leave, sick leave, unpaid leave), add bonuses and deductions. Salary increments (uvećanja zarade) under the Labour Law (Zakon o radu) have their own lines: overtime (prekovremeni rad, 126% — the full hourly rate with the increment), night work (noćni rad, +26%), work on a public holiday (rad na praznik, +110%) and shift work (smenski rad, per contract) — the percentage is preset to the statutory minimum, and you can enter a higher one. Salary compensation (naknade zarade — annual leave, public holiday, paid leave, sick leave up to 30 days) is calculated at the average salary of the previous 12 months from your closed payroll runs — when you add a line and leave the hourly rate empty, the programme fills it with the average; while there is no history, it takes the current hourly rate and says so in the line description. Sick leave up to 30 days is 65% of the average (100% for an injury at work) and is borne by the employer; from the 31st day the compensation is borne by RFZO (the National Health Insurance Fund) — for those days you choose the line “Sick leave over 30 days, 65% (RFZO)” (care of a child under 3 and organ donation: “Sick leave 100% borne by RFZO”, from the first day). The employer pays the compensation and then files a claim for calculation or reimbursement with RFZO through the eBolovanje – Poslodavac portal (the sick-leave portal); the payslip, the payroll summary and the return show separately how much of the compensation is borne by RFZO. Every change is recalculated immediately on the server, with the same calculation for everyone. “Change for this month” on an employee changes the salary only for that run (a bonus month, a different arrangement — gross, net or total net), without touching the employee list.
- Closing: the run is closed, the payslips and the summary become final. A closed run can be reverted to a draft (with a warning if the return has already been filed).
Employee settings are frozen in the run: a later change in the employee list does not alter existing runs — in a draft, remove the employee and add them again to pull in the fresh settings.
Statutory parameters (tax rate, tax-free allowance, contribution rates, minimum and maximum contribution base, minimum wage) live in the programme with validity periods and are updated centrally — you do not enter them yourself.
Payslip and payroll summary
- Platni listić (payslip, PDF) per employee — the salary calculation within the meaning of Article 121 of the Labour Law: company and employee details, period, every line with hours and hourly rate, contributions and tax with rate and base, total payable to the state, the employer’s cost and a place for the signatures of the employer and the employee. The “Send by email” button sends it to the employee at the email from the employee list (the reply comes to you, not to the platform).
- Rekapitulacija (payroll summary, PDF) of the whole run — a table by employee + totals of tax and contributions payable to the state; that is the document you send to your accountant together with the XML of the return.
PPP-PD payroll tax return
The municipality code of the company’s registered office and the payer type (legal entity / sole trader) are entered once in Company settings — the return suggests them from there, and whatever you confirm on the return is written back to the settings. On a closed run you click “Create the return (XML)”:
- The programme checks the data (JMBG and municipality of every employee, the company’s PIB (tax ID) and email) and builds the XML following the official structure of the Tax Administration. Every employee gets one row per income type code: salary (101) and, if they were on sick leave, separate rows for the compensation — up to 30 days (202), injury at work (201), over 30 days borne by RFZO (204, or 205 for the care of a child under 3). By the rules of the Tax Administration every row carries its own hours, calendar days and hours fund, the tax-free allowance and the minimum contribution base are split in proportion to the hours of the row (for compensation borne by RFZO the minimum base is not applied), and an employee with several rows gets the marks MFP.10 and MFP.12. The calendar days per row are taken from the sick-leave records (Payroll → Sick leave) when they exist, otherwise they are distributed in proportion to the hours — check them against the sick notes.
- Download the XML and send it to your accountant for checking, or upload it to ePorezi yourself (the portal validates the file before signing — nothing is filed until it is signed).
- After filing, enter the BOP (payment approval number) you received — the programme shows the payment details: the consolidated collection payment account, model 97 and the payment reference, one payment order for all taxes and contributions.
Recommended flow for the first run: send the payroll summary and the XML to your accountant to review before filing.
Sick leave from the eBolovanje portal
Sick notes no longer arrive on paper: the doctor opens sick leave electronically, and the employer sees it on the eBolovanje – Poslodavac portal (the sick-leave portal; mandatory for all employers with employees from 1.1.2026, for sole traders with employees from 1.1.2027). The portal has no programmatic access, so sick leave reaches duplo by importing the export: on the portal you choose a period and click „Izvezi podatke“ (Export data) (XML), and then in Payroll → Sick leave → “Import the export from eUprava” you choose that file. The programme matches the sick leave with employees by JMBG, shows what is new, what has changed (extension, closure, cancellation) and who is not in the employee list, and imports only the matched records. You may import the same file several times — existing sick-leave records are updated, not duplicated.
What is kept and what is not: the period, status, cause (code and name), number of days and the history of actions from the portal. The diagnosis, the LBO (health insurance number) and the health card number are neither read nor stored — the accountant does not need them, and they are a special category of data. The export file itself is not kept.
The list shows for every sick leave who bears the compensation: up to the 30th day the employer, from the 31st day RFZO (care of a child under 3 and injury at work have their own rules) — the allocation by cause is the programme’s suggestion, which your accountant confirms. Cancelled sick leave stays visible but does not enter the payroll run.
In the payroll run the programme suggests the sick-leave lines itself. When you add an employee to a run (or create a new run), for every calendar day of sick leave in that month it determines whether it is up to the 30th day (borne by the employer) or from the 31st day (RFZO) by cause, adds up the working days (Monday–Friday) and converts them into hours (the employee’s weekly hours fund / 5), then reduces the regular-work line by the same hours — as for a public holiday. The hourly rate is the average of the previous 12 months (without history — the current one, and the description says so), the percentage is 65 or 100 by cause, and the line description carries the sick-leave number from the portal and the period, e.g. „Bolovanje #476 — 1–30. dan (10.9.–30.9.)“ (sick leave #476 — days 1–30). Sick leave that passes the 30th day in the middle of the month gives two lines: up to the 30th day and „od 31. dana, na teret RFZO“ (from the 31st day, borne by RFZO). You edit the lines like any others; if you have imported an extension in the meantime, remove the employee from the run and add them again so the suggestion is refreshed. Cancelled sick leave and a cause the programme does not recognise give no lines, and the employee’s page in the run lists what was suggested and what to pay attention to (a sick note that expires before the end of the month, a public holiday within the sick-leave days — it is not paid separately, so reduce the public-holiday hours by hand). In the PPP-PD return the number of calendar days per row (field 3.7) is taken from the records; without them the programme splits the days in proportion to the hours. On the sick-leave page you see the payroll runs for the months it covers; if the sick leave was cancelled after the run was closed, the page says so clearly.
Sick leave over 30 days — certificate of earnings for RFZO (eBolovanje)
From the 31st day of sick leave the salary compensation is borne by RFZO. The employer pays it out (the line “Sick leave over 30 days, 65% (RFZO)” in the run) and then files a claim for calculation or reimbursement on the eBolovanje – Poslodavac portal — within 15 days of the salary payment. With the first payment for that sick leave the portal asks for a certificate of earnings for the 12 months before the month in which the sick leave began and payslips per month. duplo produces them on the employee card (Payroll → Employees → employee → “Certificate of earnings for RFZO”):
- Choose the month in which the sick leave began and click “Load from payroll runs” — the programme fills in the paid hours, net, gross and payment date from your closed payroll runs for the previous 12 months.
- Fill in by hand the months before you started with duplo (or with another employer); an empty row is left out — RFZO takes the minimum wage for it.
- “Download the certificate (XML)” gives a file exactly following the official structure of the portal (section „Potvrda o ostvarenoj zaradi“ — certificate of earnings), and “Download the payslips (ZIP)” the payslips for the same months — on the portal they are attached separately per month, under „Prilaganje dokumenata“ (attaching documents).
The portal has no programmatic access (API), so you upload the files yourself, signed in with an eID; the claim is signed with a qualified certificate. The final amount of the compensation is determined by RFZO (calculation OZ-10).
Deadline and claim status. The claim is filed within 15 days of the salary payment for the month in which the compensation borne by RFZO began. The programme counts that deadline itself: as soon as the sick leave passes the 30th day (or from the first day for the care of a child under 3), the sick-leave page and the list say “to be filed”, and once you close the run for that month, also the exact deadline date (payment date + 15 days; a missed deadline is red). The Payroll page carries a reminder of how many sick-leave records await a claim and which deadline is nearest; the filter “Claim to RFZO” in the sick-leave list singles those out. When you file the claim, click “Claim to RFZO…” on the sick-leave page and enter the status (filed, decided, paid, rejected) with a date and a note — the programme sends nothing to the portal, this is your own record. There is one status per sick leave (the first claim); for sick leave that lasts several months every month has its own claim — record them in the note.
The first payroll run — step by step
This order covers everything needed for the first run to go to your accountant for checking before the salaries are paid.
- Company settings (left menu → Settings): check the company name, address, PIB, company registration number (MB) and email — they are printed on the payslip and go into the return. In the same section enter the municipality code of the registered office (3 digits, Tax Administration catalogue) and the payer type (legal entity or sole trader). If you do not know the municipality code, ask your accountant.
- Employees (Payroll → Employees → + New employee): for every employee enter the first and last name, JMBG, municipality code of residence, type of employment, employment date (without it the employee does not enter the run and has no length-of-service increment), length of service before this employment if it counts towards the increment, and the current account for payment. In the section “Salary and allowances” choose the basis you know from the contract — gross, net or total net to the account — and enter the amount; the other direction is shown below immediately. Enter the meal allowance, holiday allowance and commuting allowance if you pay them, and untick “Already included in the agreed salary” if they are added on top of the salary.
- New payroll run (Payroll → Payroll runs → + New payroll run): month, payment date, hours fund (the programme suggests it), public-holiday hours if there were any, length-of-service increment 0,4% (the statutory minimum — leave it unless the contract says more). All active employees enter by themselves.
- Go through the employees one by one: clicking a name opens the lines. Check the hours; add annual leave, sick leave, overtime or a bonus (“Other allowances”) if there were any. The summary below is recalculated after every save. If someone gets a different salary this month, use “Change for this month”.
- Close payroll run when all employees are correct. Closing freezes the run and only then are the final documents produced.
- Download the PDFs: the payroll summary (for the accountant) and the payslips (for the employees — they can be sent by email).
- Create the PPP-PD return (button on the closed run) and download the XML.
- Send the payroll summary and the XML to your accountant for checking — before payment and before filing. If the accountant has objections, revert the run to a draft, correct it and close it again.
- When the accountant files the return on ePorezi, enter the BOP you received — the programme shows the exact payment account, model and payment reference for a single payment of all taxes and contributions, and the net per employee.
For the first run it is normal for compensation (public holiday, leave) to go at the current hourly rate — the 12-month average is built from your closed payroll runs and the programme says so in the line description.
What the module does not do (yet)
- Maternity leave, subsidised employment and runs with accelerated length of service (beneficirani staž) — with your accountant for now. Sick leave borne by RFZO is posted as a salary cost (520); the receivable from RFZO is posted by the accountant with a manual journal entry.
- Service contracts and author’s fees have their own section: Payroll → Other personal income (a separate chapter). Rent from a natural person, dividends, supplementary work and the OD-O form — planned.
- Tax on the commuting allowance above the tax-free amount is calculated on the payslip, but that row in the PPP-PD is added by the accountant (a separate income type code) — the programme warns you about it.
- Payment orders to the bank are not generated — the payment details are shown, you pay through e-banking.
- With the Accounting add-on a closed run is posted automatically (gross, contributions, commuting allowance / net, tax, contributions, deductions); salary payments and tax payments from the bank statement are allocated by the accountant from the suspense account.