We Built a Custom HRMS for a 240-Person Logistics Firm: Why Zoho People Was Not Enough
A 240-staff Indore logistics firm replaced Zoho People with a custom HRMS in 14 weeks. 8 modules, biometric attendance, statutory reporting, leave forecasting. Build cost Rs 19L. The cost-payback math vs Zoho.
Vivek Kumar
July 28, 202514 min read
0%
An Indore-based logistics firm — 240 staff across a 4-warehouse footprint, a 60-truck fleet, and a 38-person back office — moved off Zoho People after 22 months of patching around its limits. We shipped a custom HRMS in 14 weeks: 8 modules covering attendance, leave, payroll prep, statutory reporting, expense, document management, performance, and a leave-demand-forecasting view the founder asked for after seeing diesel-cost-forecasting in another tool. Build cost: ₹19 lakh. Year-1 saving vs Zoho People Premium for 240 users: ₹6.4 lakh. Year-3 saving including avoided customisation: ₹38 lakh. Here is what we built and the math.
240
Employees Across 4 Warehouses + Fleet
8
HRMS Modules Shipped in Phase 1
14 weeks
Discovery to Cutover
Rs 19L
Fixed-Price Build (Phase 1)
## The Answer in 60 Words
We replaced Zoho People Premium ($4.50/user/month listed) with a custom Next.js + PostgreSQL HRMS shipped in 14 weeks for ₹19 lakh. 8 modules. Biometric ZKTeco attendance integration via TCP polling. PF + ESIC + PT statutory reports auto-generated for ESIC portal upload. Leave forecasting using a 3-year rolling baseline. Year-1 cash saving vs Zoho: ₹6.4 lakh. Year-3 saving (incl. avoided customisation): ₹38 lakh.
## Why This Matters Now
Indian logistics firms have peculiar HR shapes that off-the-shelf HRMS products do not handle well. The driver workforce works night shifts, sleeps at warehouses, and clocks attendance on biometric devices that do not speak Zoho's API natively. Statutory reporting requires PF (Provident Fund), ESIC (Employees' State Insurance), and state-specific Professional Tax — three different government portals, three different file formats. Zoho People supports the basics but custom statutory exports cost extra and the integration with sub-₹1-lakh biometric devices is unreliable.
[Zoho People pricing](https://www.zoho.com/people/zohopeople-pricing.html) lists from $1.50/user/month for the Essential tier through $5.41/month for People Plus. For 240 users on the Premium plan ($4.50/user/month at May 2026 INR rate ~₹375/user/month), that is ₹10.8 lakh/year. Add their Payroll module (extra ₹120/employee/month for India) and you are at ₹13.5 lakh/year. The 22-month patching had cost the firm an extra ₹4.8 lakh in custom Deluge consulting on top.
## The Client (Specific Details)
- Sector: Logistics + warehousing (full truckload + 3PL)
- Location: HQ in Indore, warehouses in Pithampur, Dewas, Ujjain, Pithampur-2
- Headcount: 240 — 86 drivers, 64 warehouse staff, 38 back-office, 32 sales/account, 20 management/admin
- Shift pattern: 24/7 across warehouses; drivers on flexible-shift with sleep-on-site allowance
- Statutory load: EPF for 240, ESIC for 178 (under wage threshold), PT for all (Madhya Pradesh)
- Biometric fleet: 11 ZKTeme K40 + 4 ZKTeco MB360 across warehouses
- The trigger: A April 2025 PF audit raised 14 mismatches between Zoho People records and the EPFO portal because Zoho did not capture loss-of-pay (LOP) consistently for shift workers. Owner wanted out.
## The 8 Modules (And What Each Does)
1
Attendance + Biometric Sync
TCP poll to ZKTeco devices every 60 seconds. In/out punches mapped to shifts. Handles missed-punch correction with manager approval. Driver sleep-on-site detection via 3 consecutive null-punch days.
2
Leave + Compensatory Off
Earned, casual, sick, maternity, paternity, bereavement, comp-off. Carry-forward and encashment rules per role. Approval flow respects warehouse-shift coverage minimums.
3
Payroll Prep
Computes gross, deductions, LOP, allowances per employee per month. Outputs a Tally-compatible JSON the firm's accountant imports. We do not run payroll directly — that stays with the CA.
4
Statutory Reporting
ECR (Electronic Challan-cum-Return) file for EPFO upload. ESIC contribution Excel for ESIC portal. PT challan PDF for state portal. All three generated nightly; reviewed by HR before submission.
5
Expense Claims
Driver fuel + toll claims with photo receipt. Sales-team travel claims with GPS-based km calculation (the firm's biggest expense category). Approval flow via WhatsApp link for managers in the field.
6
Document Management
Aadhaar, PAN, driving licence, medical fitness, training certs. Auto-flag for expiry (driving licences are big). PDF stored encrypted; sensitive PII fields masked at the API layer.
7
Performance + Goals
Quarterly goal-setting + review cycle. Manager + employee + skip-level signoff. Output feeds the appraisal cycle the founder runs in October.
8
Leave Forecasting (The Killer Feature)
Predicts daily leave demand 30 days out using a 3-year rolling baseline + festival calendar + school-holiday overlay. Helps the warehouse manager pre-arrange casual labour for Holi, Diwali, Eid weeks.
## The ROI Math (Vs Zoho People)
The board paper had this exact comparison. We did not soften either side; the founder wanted to know "should we build, or should we keep paying Zoho and live with the cracks."
The Year-1 savings number alone (₹6.4 lakh) does not justify a build. The Year-3 figure (₹38 lakh including avoided customisation) is what tipped the founder. The deeper unlock was that the firm now owns the HRMS — they can extend it to add a sales-team field-tracker module in Q2 without paying Zoho's per-user, per-feature ramp.
## The Biometric Integration (Where Zoho Failed Hardest)
ZKTeco devices speak a TCP protocol called Standalone. The standard pattern is a poll — your server connects to the device's IP, requests new attendance records, parses the response, stores them. There is no webhook; if the network is flaky the device queues records locally for up to 30 days.
Zoho People relies on a third-party connector for biometric integration. We had four issues with the Zoho approach:
- Sync interval limited to 15 minutes. A driver arriving at 6:42 am for a 7 am shift would not show "in" until 7 am, breaking the late-mark rule.
- No retry on TCP timeout. Warehouse-3 has flaky internet; 4-6 hours of attendance records would silently disappear once a week.
- Cannot handle the K40 firmware quirk. Older K40 devices return punch records with timestamps in device-local time without a zone marker. The connector assumed UTC. Madhya Pradesh is +5:30. So every punch was off by 5.5 hours and shift detection was nonsense.
Our solution: a small Node.js poller running on a Hetzner CX22 (₹740/month) per warehouse, polling every 60 seconds, with exponential backoff and a local SQLite cache for 30 days. Polls converge to the central API once the network recovers. Total dev time: 2.4 weeks. Total avoided pain: every audit since.
## The DIY Walkthrough: Build a Working HRMS Skeleton in 2 Weeks
Below is the trimmed reference build we ship as a starter to firms in the 80-150 employee band. Not the full 240-employee system — the minimum runnable version.
1
Stand up Next.js + Prisma + PostgreSQL
Use Next.js 14 App Router. Prisma for the ORM. Postgres on Hetzner or Supabase. Schema: employees, shifts, attendance_punches, leaves, statutory_records. About 14 tables for the core.
2
Wire biometric polling
Use the node-zklib npm package for ZKTeco devices. One worker per device IP, polls every 60s, dedupes by (employee_id, timestamp), forwards new records to the API. Set TCP timeout aggressively (4 seconds) so a flaky network does not block the loop.
3
Shift + leave engine
Define shifts as (start_time, end_time, grace_in_minutes, late_threshold_minutes). Pair each punch with the closest matching shift. Compute LOP per day. Leave applications check against shift-coverage minimums before approving.
4
Statutory exports
Build the EPFO ECR generator first — it is the most complex format. Read the [EPFO ECR Format guide](https://www.epfindia.gov.in/) before you start. ESIC contribution file is simpler. PT is state-specific; for Madhya Pradesh, generate the challan PDF directly from a template.
5
Manager approval flow via WhatsApp
For leave + expense approvals, send a WhatsApp template message via Gupshup with two buttons: Approve / Reject. Link clicks hit a signed URL on your API. No app install needed for managers in the field.
6
Leave forecasting
Pull 3 years of leave data. Compute average leave demand by (day_of_year, role_group). Overlay festival calendar (use the [Government of India holiday list](https://india.gov.in/calendar)). Adjust for school-holiday weeks. Output a 30-day-ahead heatmap. Simple but effective.
## Common Mistakes (Each One Hurts)
Symptom: "PF audit shows mismatched LOP." Cause: shift-detection logic differs between the HRMS and the manual register. Fix: lock the LOP calculation in writing with the firm's CA before go-live. Run a 30-day parallel period. Reconcile every difference.
Symptom: "Attendance disappears after a power cut." Cause: biometric device lost its records, or the poll missed a window. Fix: configure the device for 30-day local retention. Run the poller in a process supervisor (PM2 or systemd) that auto-restarts. Maintain a per-device watermark of last-seen punch.
Symptom: "The driver is marked absent but he was sleeping at the warehouse." Cause: no punch when sleeping on-site. Fix: special "sleep-on-site" shift code. Warehouse manager marks at end-of-shift via WhatsApp; the system pairs it with the missed-punch.
Symptom: "Leave balance shows negative." Cause: leave-application form did not validate balance at submit. Fix: validate at submit AND at approve (state may have changed in between). Throw a hard error, not a warning.
Symptom: "Year-end appraisal cycle melts the server." Cause: 240 employees + 4 manager-employee combinations + 16 KPIs = 15,360 records loaded in one page. Fix: paginate, lazy-load, and bulk-load into Excel for the actual review session. Do not try to render everything in HTML.
## When NOT to Build a Custom HRMS
Skip the build if (a) you are under 80 employees and your processes are still in flux — Zoho People free tier (up to 5 users) or a low-tier Premium plan is fine, (b) your statutory load is light (no PF, no shift workers, urban office only) — KekaHR or Darwinbox handle this well off-the-shelf, or (c) you do not have an internal HR lead who can own the system. A custom HRMS without an internal owner becomes shelf-ware in 9 months.
For a CA-firm comparison case, see our earlier post: [Custom HRMS for a 120-Person CA Firm](/blog/custom-hrms-120-person-ca-firm-build-vs-zoho-people). Different shape — knowledge workers, no shift complexity, no biometric — and the trade-off math came out differently.
The honest caveat on building HRMS: statutory rules change. EPFO and ESIC issue notifications every quarter; some affect file formats. Budget 0.2 FTE/month for ongoing statutory maintenance. If your firm cannot fund this, either stay on Zoho (which handles updates centrally) or accept that you will need to keep your CA on retainer to flag changes.
## Real Outcome (12 Months Post-Launch)
0
PF Audit Mismatches in 12 Months
14 min
Monthly Statutory Filing Time (was 4.5 hr)
Rs 6.4L
Year-1 Cash Saving Vs Zoho
94%
Manager Approval Cycle Time Reduction
The 14-minute statutory filing number is the one HR loves. Their previous routine was a 4.5-hour Friday-evening grind compiling files from Zoho exports and Excel sheets. Now the file is generated overnight, HR reviews on Friday morning, uploads by 11 am.
## A Detail That Saved Us On Day 89
On day 89, our PF ECR generator started outputting a slightly different file format — a missing trailing pipe in the trailer record. EPFO had updated their ECR validator silently. The HR head noticed when the upload bounced. We had a 4-line fix in 22 minutes because we had isolated the format generator behind a single file with a snapshot test of the expected output.
The lesson: statutory file formats are externally controlled. Test the bytes you produce, not just the data you compute.
## The Stack Cost Per Month (Real Numbers)
| Component | Monthly cost | Notes |
|---|---|---|
| Hetzner CCX23 (app + Postgres) | Rs 3,800 | Right-sized for 240 users |
| Hetzner CX22 ×4 (warehouse pollers) | Rs 2,960 | One per warehouse |
| Backup S3 (Cloudflare R2) | Rs 800 | 6 GB hot + 7 years archive (compliance) |
| Gupshup WhatsApp | Rs 8,400 | ~3,800 conversations/month |
| MSG91 SMS | Rs 2,200 | Statutory reminders |
| Sentry (errors) | Rs 2,800 | Team plan |
| Engineering retainer (0.4 FTE) | Rs 28,000 | Includes statutory updates |
| Total | ~Rs 49,000 | vs Rs 1.13 lakh/month for Zoho People + Payroll |
## A Note on Disclosure
The firm asked us to anonymise their name. The numbers in this post are exact; the city and industry are real. We have permission to publish the architecture pattern but not the brand. Standard for our [CRM development practice](/services/crm-development) and our HRMS work.
## FAQ
### What is the actual Zoho People price for India?
[Zoho People pricing](https://www.zoho.com/people/zohopeople-pricing.html) lists from $1.50/user/month (Essential) to $5.41/user/month (People Plus). For India-specific Payroll, an additional fee applies. The exact INR price depends on FX at the time of subscription. At ~₹83/USD May 2026, Premium for 240 users is ~₹10.8 lakh/year before Payroll add-on.
### Why not KekaHR or Darwinbox?
We evaluated both. Keka is the strongest off-the-shelf for Indian SMBs and we recommend it for firms with 80-200 standard-shift employees. Darwinbox is enterprise-grade and over-specified for this firm. For a logistics firm with 24/7 shifts, custom statutory edge cases, and a flaky-warehouse-network biometric problem, the build economics tipped to custom.
### How did you handle the biometric devices going offline?
Local 30-day buffer on the device + local SQLite cache on the warehouse poller + central reconciliation on the server. We have had two warehouse internet outages of 8+ hours; both auto-reconciled within an hour of network recovery.
### Can the firm extend the HRMS themselves?
In year 2, yes. We pair-program with an in-house developer if they hire one (~₹14 lakh CTC for a mid-level full-stack hire in Indore). For now they pay our retainer.
### What about employee self-service?
Phase 1 included an employee self-service portal: payslip download, leave application, document upload, profile edit. Mobile-friendly PWA — no app install. ~78% of employees use it monthly.
### How did you handle the migration from Zoho People?
Zoho's CSV exports for employees, leave balances, attendance history (last 12 months), and document index. Re-imported with deduplication and a 30-day parallel period where both systems received attendance data. Cutover on a Saturday with the HR head onsite.
### What was your team composition?
Two full-stack engineers (one senior, one mid), one engineer focused on statutory + biometric integration, [Manvi](/team/manvi) at 0.4 FTE for QA on statutory file formats (this is a high-blast-radius area), and our founder [Vivek](/team/vivek-kumar) at 0.2 FTE for client direction. Total: 3.6 FTE for 14 weeks.
### Are statutory file formats really that finicky?
Yes. EPFO ECR has 26 fields per row, strict pipe-delimited format, specific date formats, and the validator rejects entire files for a single bad row. Test your generator against the EPFO sample files and run the validator before submission. We caught two format drift issues this way.
## Related Reading
For the founder's own perspective on building India SMB software, see Vivek Singh
Need a Custom HRMS Scoping Call?
We ship custom HRMS solutions for Indian SMBs (80-500 employees) in 12-16 weeks, fixed price, with biometric integration, EPFO/ESIC/PT statutory exports, and a leave-forecasting view. Typical project: ₹16-32 lakh. First call is technical, with the engineer who would lead your build. Suitable for firms with shift workers or non-standard statutory load.