know.2nth.ai Technology tech frappe hr
tech/frappe · HR · Skill Leaf

HR that runs on
doctypes, not modules.

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.

Live Frappe Framework app AGPL v3 Spun out 2023

ERPNext's HR module, liberated.

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.

The standalone pitch

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.

The data model at a glance.

Every object below is a standard Frappe doctype — queryable via REST, hookable via hooks.py, introspectable via frappe.get_meta().

Doctype Purpose Key fields
EmployeeThe master record for a person in the orgemployee_name, department, designation, status, company
Salary StructureTemplate defining earnings and deductionspayroll_frequency, earnings (child table), deductions (child table)
Salary SlipOne payroll run for one employeeemployee, gross_pay, total_deduction, net_pay, posting_date
Leave ApplicationEmployee request for time offemployee, leave_type, from_date, to_date, status
AttendanceDaily presence recordemployee, attendance_date, status (Present/Absent/Half Day/On Leave)
Expense ClaimEmployee reimbursement requestemployee, expenses (child table), total_claimed_amount, approval_status
AppraisalPerformance review cycleemployee, appraisal_template, goals (child table), total_score

REST calls against HR doctypes.

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"
}

Things that bite in production.

Payroll accounting needs ERPNext

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.

Leave allocation is not automatic

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.

Salary Structure Assignment is required

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.

Attendance and Leave overlap logic

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.

Young as standalone — docs lag

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.

Use it for, skip it for.

Use Frappe HR when

  • You already run Frappe Framework or ERPNext and want HR on the same stack.
  • You need a self-hosted, open-source HRMS and don't want to pay per-seat SaaS fees.
  • Your HR team needs leave, attendance, and payroll — not talent management or advanced workforce planning.
  • You want to extend HR with custom doctypes (training records, fleet management, custom approval flows) using the same Frappe patterns.
  • You need an HR backend an AI agent can query via REST without a proprietary integration layer.

Where this leaf links.

Go deeper.