The day-to-day side of payroll: tracking who worked which days, managing leave balances, disbursing loans with auto-EMI, and processing expense reimbursements.
Time to read: ~12 minutes. You’ll need: the Payroll add-on active, employees set up — see Payroll Employees & Pay Heads.
What you get when this is done
- Per-employee attendance records that feed Loss-of-Pay (LOP) into pay runs automatically.
- Leave balances per leave type with monthly accrual.
- Loans with hybrid auto-EMI — Booksmor deducts the EMI every pay run, you override per-payslip if needed.
- Reimbursement workflow: employee submits, owner/HR approves, bulk pay-out via journal voucher.
Part A — Attendance and Leave
Leave types
Booksmor seeds four leave types on first use:
| Code | Name | Monthly accrual | Paid? |
|---|---|---|---|
| CL | Casual Leave | 1.5 / month | Yes |
| SL | Sick Leave | 1.0 / month | Yes |
| PL | Privilege / Earned Leave | 1.75 / month | Yes |
| LWP | Leave Without Pay | — | No |
Owners can extend or rename via Payroll → Attendance → Leave types (add a custom “Bereavement” type, change accrual rates, set max_carry_forward caps, etc.).
Monthly leave accrual
Per-employee leave balances grow each month based on each leave type’s accrual rate.
To run accrual:
- Payroll → Attendance → click Accrue (top of the page).
- Pick the period.
- Click Run accrual.
Accrual is idempotent per tenant × period — clicking twice for the same month doesn’t double up.
Most SMBs run accrual on the 1st of each month as part of payroll prep.
Recording attendance
The Payroll → Attendance page is a grid: rows are employees, columns are leave types + worked days.
For each employee, for the period:
- Paid leave usage — number of CL/SL/PL days taken.
- Unpaid leave — LWP days (and any other unpaid type you’ve defined).
- Explicit LOP days — additional Loss-of-Pay days you want to record separately (e.g. employee absent without leave).
The page shows a live preview of paid days and LOP days that will feed the next pay run.
Click Save to persist. Re-saving the same period reverses prior impact before re-applying — safe to edit and re-save.
How leave-vs-LOP works
- A paid leave (CL/SL/PL) within the employee’s available balance reduces the balance and doesn’t affect pay.
- A paid leave beyond the available balance spills into LOP automatically — employee’s pay is reduced by that day.
- An unpaid leave (LWP or a custom unpaid type) lands directly on LOP.
- Explicit
lop_daysentered on attendance adds on top of all of the above.
LOP cascade in the pay run
When you create a pay run, Booksmor decides each employee’s LOP via a 4-level cascade:
- body.lop_by_employee (advanced API override) — wins if set.
- attendance_records — what you saved on the Attendance page.
- preserved payslip.lop_days — if recomputing a payslip that already had LOP set.
- body.lop_days_default — the run-level default you set when creating the pay run.
For most owners, level 2 (attendance records) is the answer.
Sub-day LOP (e.g. 0.5 days) can be recorded on Attendance, but the pay engine currently rounds to integer days. Half-day prorate is a planned enhancement.
Part B — Loans
Disbursing a loan
- Payroll → Loans → click + Disburse loan.
- Fill in:
- Employee — pick from the dropdown.
- Loan number — optional internal reference (e.g. LOAN-001).
- Principal ₹ — amount disbursed.
- Interest rate % — for documentation; doesn’t auto-compute interest in EMIs.
- EMI amount ₹ — per-payslip deduction.
- EMI count — total number of EMIs.
- Start period — first pay run that should include this EMI.
- Click Disburse.
Booksmor posts a journal voucher: Dr Loan Receivable / Cr [Cash/Bank account] for the principal. A new account role loan_receivable (1700) is lazy-created on first loan.
Auto-EMI on every pay run
Once a loan is active, its EMI is auto-injected into the LOAN deduction on every pay run for that employee. The EMI is capped at the remaining loan balance (so the last installment may be smaller than the standard EMI).
Overriding per payslip
On the pay-run detail, expand the employee’s payslip and click Override EMI. Set the EMI to:
- 0 — skip this month (e.g. employee on leave).
- Lower value — partial recovery.
- Higher value — accelerated recovery (e.g. employee paying off early).
The remaining balance recomputes correctly.
Loan lifecycle
- Active — EMI deducting every run.
- Paused — paused via the Loans page (no auto-injection until resumed).
- Closed — balance reached zero; auto-injection stops. Closes automatically; no manual action needed.
Loan reports
The Loans page lists each loan with its principal, EMIs paid, remaining balance, and status — for verifying against employee queries.
Part C — Reimbursements
For expense claims that employees submit (travel, meals, phone bills, work-from-home setup, etc.).
Submitting a claim (owner / HR enters on behalf)
- Payroll → Reimbursements → click + New claim.
- Fill in:
- Employee — pick from the dropdown.
- Claim number — optional internal reference.
- Category — one of 8 pre-seeded: Travel / Meals / Phone / Internet / WFH setup / Stationery / Training / Other.
- Description — free text.
- Amount ₹ — claim amount.
- Claim date — when the expense was incurred.
- Bill ref — optional reference to a physical bill.
- Click Submit.
The claim is in submitted status.
Currently, owner/HR enters claims on behalf of employees. A true employee self-service portal (where the employee logs in and submits themselves) is on the roadmap.
Approving
In the Reimbursements list, click a submitted claim → Approve.
The claim moves to approved status. You can also Reject a submitted claim with a reason.
Paying out (single or bulk)
Approved claims sit in the Approved filter, ready to pay.
- Single pay — click an approved claim → Pay out. Pick the bank account. Booksmor posts a journal voucher (Dr Reimbursement Expense / Cr Bank) for the amount.
- Bulk pay — tick multiple approved claims, click Bulk pay out. One journal voucher is posted for the total (Dr Reimbursement Expense / Cr Bank), with all selected claims listed in the narration.
The claim status flips to paid with a timestamp and the voucher reference.
A new account role reimbursement_expense (5510) is lazy-created on first reimbursement.
Workflow recap
submitted → approved → paid
↘ rejected
You can reject any pre-paid claim; a paid claim is locked (reverse via the voucher edit if truly needed).
Common questions
Why is paid leave (CL/SL/PL) spilling into LOP for one employee? They’ve used more than their accrued balance. Check their balance on the Attendance page — if zero, the leave is over-the-limit and (by design) reduces pay.
Can I run leave accrual mid-month? Yes — accrual is just a one-button operation. But run it once per month per leave type; double-accrual is blocked.
What if I forgot to run accrual for several past months? Run them in sequence (oldest first), one period at a time. Each run is idempotent so re-running an already-accrued month is safe.
My employees take half-day leave often. Why doesn’t the engine prorate? Sub-day is stored (you can enter 0.5 on Attendance) but rounded to int by the engine today. For now, accumulate half-days across the month — two half-days become one full LOP day. Half-day prorate is a planned engine update.
Can the loan EMI carry interest? The current EMI is principal-only. For interest-bearing loans, post a separate journal voucher each month for the interest expense (or amortise upfront). Native interest amortisation is on the roadmap.
Can an employee submit reimbursements themselves? Not yet — the workflow is owner/HR-driven. Employee self-service portal is the roadmap fast-follow once Employee↔User link exists. Workaround: have the employee email the bill + description; HR enters it.
Can I attach a photo of the bill to a reimbursement? Not currently. Reference the bill via the Bill ref field. Upload-with-claim is on the roadmap.
My business has a flat-allowance system (not actual-bill reimbursement). Should I still use Reimbursements? No — for flat allowances, add them as pay heads on the salary structure (or as variable pay on the pay run). The Reimbursements module is for actual-expense claim flows.
Troubleshooting
Attendance saves but the next pay run doesn’t pick it up. The pay run reads attendance at creation time. If you saved attendance after creating the run, click Recompute on the run to re-read.
Loan EMI shows as 0 on the payslip. Either the loan is paused/closed, the start period is in the future, or someone overrode the EMI to 0 on this specific payslip. Check the Loans page for status, and the payslip’s override panel.
Reimbursement bulk pay fails with “no account_id”. You didn’t pick the bank account in the bulk-pay dialog. Re-open, select, confirm.
Need more help? Email support@booksmor.com with the employee code, the period, and what’s misbehaving.