# HR and payroll software that pays people the way their contracts say

Canonical: https://erpfly.com/modules/hr-payroll/
Last updated: September 12, 2026

Category: People

Payroll is the one module where nobody forgives a rounding error. Generic HR and payroll software gets the basics right and then leaves the overtime rule, the shift allowance and the site bonus to a spreadsheet someone fixes every month. Describe those rules to erpfly and it writes them into Frappe HR or Odoo.

### Features

- **Pay rules in code, not in someone's head.** Overtime, shift allowances, attendance bonuses and deductions calculated from approved records, with the formula written down where an auditor can read it.
- **Approvals before the money moves.** Claims and adjustments go through a Workflow. Only approved, submitted records reach the payroll run, so there's no month-end chasing.
- **Employee records people keep up to date.** Custom fields for the details your country or industry needs (work permits, licence expiry, uniform size) with reminders before anything lapses.
- **Payslips your staff can read.** A Print Format or QWeb template that shows earnings, deductions and the hours behind each line, in the language your team speaks.
- **Bank files in the format your bank wants.** Salary payment exports built to your bank's upload layout, so finance stops retyping totals into a portal.

### What gets generated

**ERPNext / Frappe app:**
- Overtime Claim DocType with a supervisor Workflow
- Additional Salary records created before each Payroll Entry
- Salary Component and Salary Structure fixtures
- Salary Slip Print Format with hours per earning
- Bank payment export as a Script Report

**Odoo addon:**
- Overtime claim model linked to hr.employee
- hr.salary.rule records with Python conditions (Enterprise Payroll)
- hr.payslip.input.type data for approved overtime
- Employee fields added via _inherit on hr.employee
- QWeb payslip report

### Payroll is where close enough stops working

A sales report that's slightly off gets a shrug. A payslip that's slightly off gets a queue outside the HR office on the first of the month. That's why most companies are careful with payroll software, and also why so many of them run a clean system with a messy spreadsheet bolted to the side.

The spreadsheet holds the rules that didn't fit. Overtime at double rate after 48 hours. A night shift allowance for one site. A deduction when a uniform isn't returned. Each one is small. Together they're a full day of someone's month, every month.

### What HR and payroll software on Frappe HR or Odoo needs from you

First, a platform fact that trips people up. On the ERPNext side, HR and payroll moved out of ERPNext into **Frappe HR** (the `hrms` app) in version 14. You install it on the same bench, and it provides Employee lifecycle, Salary Component, Salary Structure, Salary Structure Assignment, Payroll Entry, Salary Slip and Additional Salary. Custom payroll work is really Frappe HR work.

On **Odoo**, the Employees app is Community, but Payroll is Enterprise. Salary structures, salary rules with Python conditions and `hr.payslip` all need an Enterprise subscription. We're happy to generate rules for it. We're less happy to rebuild statutory payroll from nothing on Community, and we'll say so.

What we need from you is less than you'd think: a copy of your salary components, one real payslip with the numbers explained, and the contract clause for anything unusual. If two people in HR explain the same rule differently, that's not a problem for the software. Settle it before we generate anything, because code will faithfully pay whichever version you pick.

### Worked example: overtime at a packaging plant

Picture a plant with around 140 hourly staff on ERPNext and Frappe HR. Supervisors already approve overtime on paper forms. Payroll types the hours into a spreadsheet, calculates the amount and adds it to each salary slip by hand.

The rule in the employment contract: overtime is paid at twice the ordinary hourly rate, and the hourly rate is monthly base divided by 26 working days and 8 hours.

Take Sunita, a machine operator with a monthly base of 31,200. Her hourly rate is 31,200 / 26 / 8 = 150. Overtime pays 300 an hour. Her supervisor approved 11 hours across September, so her Overtime line is 3,300.

What erpfly generates:

- An **Overtime Claim** DocType with employee, date and hours, and a Workflow so only the shift supervisor can approve.
- The function on this page, which runs before the Payroll Entry and creates one submitted **Additional Salary** per employee for the month.
- A link back from each claim, so the same hours can't be paid twice if someone reruns payroll.

The Salary Slip then picks up the Overtime component the normal way. The hours aren't retyped anywhere. If Sunita asks why she got 3,300, the slip's print format lists the claims behind it.

### Where we'll slow you down on purpose

**Going live without a parallel run.** Run the old payroll and the new one side by side for a month. It's tedious. It's also the only way to find the rule someone applied from memory for six years.

**Clever formulas only their author can read.** A salary component with a nested condition four levels deep is a future incident. We'd rather split it into two components with plain names.

**Payroll inside a Server Script.** Payroll logic belongs in version-controlled code with tests. Our take on [Server Scripts vs a custom app](https://erpfly.com/blog/server-scripts-vs-custom-app-erpnext/) explains why.

**Guessing at local law.** We turn rules into code. Your accountant decides what the rules are.

### What payroll depends on

Overtime and deductions are only as good as the hours behind them, so [attendance management](https://erpfly.com/modules/attendance-management/) usually comes first. Unpaid days and encashments flow in from [leave management](https://erpfly.com/modules/leave-management/), and reimbursements often run through [expense management](https://erpfly.com/modules/expense-management/) instead of payroll. Before you upgrade, read how to [keep ERPNext customizations through an upgrade](https://erpfly.com/blog/erpnext-upgrade-keep-customizations/).

### FAQ

### Is payroll part of ERPNext?

Not anymore. Since version 14, HR and payroll live in Frappe HR, a separate app (`hrms`) you install next to ERPNext on the same bench. Everything we generate for payroll depends on that app, not on ERPNext itself.

### Does Odoo Community include payroll?

No. Employees, Time Off and Attendance are in Community, but Payroll (hr.payslip, salary structures and rules) is Enterprise, as are the country payroll localisations. On Community we'd usually connect to a local payroll provider rather than rebuild statutory payroll.

### Can you handle our country's tax and social security rules?

We can generate salary components, formulas and tax slabs from rules you give us, and Frappe HR already has Income Tax Slab and Payroll Period doctypes to hold them. We don't provide legal advice, so a local accountant should confirm the rules and sign off the first parallel run.

### How do we move from our current payroll tool?

Import employees, salary structure assignments and year-to-date totals, then run both systems side by side for at least one month, ideally two. Compare every slip. Each difference you find is a rule that was never written down.

### What happens to custom payroll logic when Frappe HR updates?

It sits in your own app and hooks into standard doctypes like Additional Salary, so updates don't overwrite it. Payroll code deserves a test run on a staging site before every major upgrade, and our guide on keeping customisations through upgrades covers how.

### Who can see salary data in the generated module?

Only the roles you choose. We generate permissions so supervisors can approve overtime hours without ever seeing base salaries, which is usually the first thing HR asks about.