Frappe HR (formerly the ERPNext HRMS module) was spun out as a standalone app in 2023. Same doctype engine, same REST + RPC surface, but without requiring the full ERPNext manufacturing and accounting stack. It covers employees, payroll, leave, attendance, expense claims, performance reviews, and recruitment — all as standard Frappe doctypes you can query, extend, and hook into.
For years, HR management in the Frappe ecosystem meant installing all of ERPNext — accounting, manufacturing, stock, CRM, and the HR module bundled together. In 2023, the Frappe team extracted the HR doctypes into their own app: Frappe HR (also called HRMS). You can now install it alongside ERPNext or standalone with just the Frappe Framework.
The app is still young as a standalone product. The extraction was clean — the doctypes are the same ones that ran inside ERPNext for years — but the independent release means some edges are rough. Documentation assumes ERPNext context in places, and a few features (like payroll accounting entries) still need ERPNext installed to work fully. Be honest with yourself about whether you need the standalone or the full stack.
If your organisation needs HR but not manufacturing, stock, or purchasing, Frappe HR lets you skip the ERPNext overhead. You get the same employee records, leave management, payroll engine, and attendance tracking — without the 400+ doctypes that come with the full ERP. Install it on a clean Frappe bench, or alongside ERPNext if you already run it.
Every object below is a standard Frappe doctype — queryable via REST, hookable via hooks.py, introspectable via frappe.get_meta().
| Doctype | Purpose | Key fields |
|---|---|---|
Employee | The master record for a person in the org | employee_name, department, designation, status, company |
Salary Structure | Template defining earnings and deductions | payroll_frequency, earnings (child table), deductions (child table) |
Salary Slip | One payroll run for one employee | employee, gross_pay, total_deduction, net_pay, posting_date |
Leave Application | Employee request for time off | employee, leave_type, from_date, to_date, status |
Attendance | Daily presence record | employee, attendance_date, status (Present/Absent/Half Day/On Leave) |
Expense Claim | Employee reimbursement request | employee, expenses (child table), total_claimed_amount, approval_status |
Appraisal | Performance review cycle | employee, appraisal_template, goals (child table), total_score |
Same Frappe API surface as every other app. Authenticate with an API key, hit /api/resource/ for CRUD, hit /api/method/ for RPC.
# List active employees in a department GET /api/resource/Employee ?filters=[["status","=","Active"],["department","=","Engineering"]] &fields=["name","employee_name","designation","date_of_joining"] &order_by=employee_name asc &limit_page_length=50
# Fetch a single salary slip with all child-table rows GET /api/resource/Salary Slip/HR-SAL-2026-00042 # Create a leave application POST /api/resource/Leave Application { "employee": "HR-EMP-00012", "leave_type": "Annual Leave", "from_date": "2026-05-01", "to_date": "2026-05-05", "reason": "Family holiday" }
# RPC: get leave balance for an employee POST /api/method/hrms.hr.doctype.leave_application.leave_application.get_leave_balance_on { "employee": "HR-EMP-00012", "date": "2026-04-16", "leave_type": "Annual Leave" } # RPC: mark attendance in bulk POST /api/method/hrms.hr.doctype.attendance.attendance.mark_attendance { "employee": "HR-EMP-00012", "attendance_date": "2026-04-16", "status": "Present" }
Salary Slips can be created standalone, but the accounting journal entries (GL entries) that post payroll to the ledger require ERPNext's accounting module. Without it, payroll runs but doesn't hit the books.
Employees don't get leave balances just because a Leave Type exists. You need to create Leave Allocation records — either manually, via Leave Policy Assignment, or through the leave allocation scheduler. Miss this step and every leave application will fail validation.
A Salary Structure alone does nothing. You must create a Salary Structure Assignment linking the structure to a specific employee with an effective date. No assignment means the payroll entry won't pick up that employee.
If an employee has an approved Leave Application for a date, the system expects no Attendance record for that day (status is implicitly "On Leave"). Creating an Attendance record for the same day can cause validation errors or inconsistent reports depending on the order of operations.
The HRMS app was extracted in 2023. Some documentation still references ERPNext paths, and community answers often assume the full ERPNext stack. When searching for help, try both "frappe hrms" and "erpnext hr" as search terms.