A textile manufacturer in Coimbatore — 400 employees, 3 rotating shifts, 80 contract labourers, biometric attendance across 4 plant gates — spent 11 months trying to make Zoho People work. Their HR manager kept a 4-tab Excel file in parallel "because the HRMS gets payroll wrong every month." We built them a custom HRMS in 14 weeks for ₹19.2 lakh. This post is the build-vs-buy framing that got the CFO to say yes, plus the three Zoho People limitations that broke them.
3
Rotating Shifts (A/B/C + Gen)
14 weeks
Build to Cutover
## The Answer in 60 Words
We built a Node.js + PostgreSQL + Next.js HRMS with shift-aware attendance, contract-labour CLRA compliance, biometric integration to four ESSL turnstiles, payroll with EPF/ESI/PT/TDS computation, and a leave engine that handles "shift week" reset rules. Cost: ₹19.2 lakh build + ₹26,000/month ops. Replaces Zoho People (₹6.4 lakh/year, but breaking on shift payroll). Saved the HR manager 11 hours per week.
## Why This Matters Now
Indian manufacturing SMBs are stuck buying SaaS HRMS designed for IT services companies. Off-the-shelf products optimise for the 9-to-6 white-collar worker with one shift, paid leave, no biometric, no contract workforce, no PF challan complications. Manufacturing has none of that. The [Contract Labour (Regulation and Abolition) Act, 1970](https://labour.gov.in/sites/default/files/the_contract_labour_act_1970.pdf) plus the [2024 amendments to the Industrial Relations Code](https://labour.gov.in/labour-codes) require capabilities that Zoho People, Keka, GreytHR all under-build: contractor licence tracking, principal-employer reporting, separate wage registers per contractor. We have now built HRMS for 3 manufacturers in 18 months — each time, the build cost was less than 2 years of "patched SaaS plus a part-time HR consultant fixing Excel."
## The Client (Specific Details)
-
Sector: Cotton spinning + weaving
-
Location: Coimbatore, Tamil Nadu
-
Size: 400 permanent + 80 contract, ₹220 cr revenue, 4 plants
-
Day 0 stack: Zoho People (paid plan, ₹6.4 lakh/year), 1 ESSL biometric system per gate, an Excel + Tally combination for payroll, an HR manager who works Saturdays
-
The trigger: May 2025 PF audit flagged 14 contract-worker wages that had been mis-coded in Zoho. Penalty ₹2.4 lakh + interest. CFO asked "is the SaaS saving us money or costing us money?"
## The 3 Off-the-Shelf Breakers (Why Zoho People Did Not Fit)
We are not piling on Zoho People — it is genuinely good software for the 60-person IT services firm. It is the wrong tool for this specific job. The three breakers we documented for the CFO:
### Breaker 1: Shift management for 24×7 rotating shifts
[Zoho People supports shifts](https://www.zoho.com/people/features/shift-management.html) — but the mental model is "an employee has one or two shifts that rotate weekly." This client runs 3 shifts (A: 6 am–2 pm, B: 2 pm–10 pm, C: 10 pm–6 am) plus a "Gen" general shift, and individual workers rotate on a 21-day cycle that is set per-team, not per-individual. Saturdays are sometimes overtime, sometimes a 4th shift swap. Zoho's shift rotation could not encode the cycle without daily manual override — which the HR manager was doing in Excel.
Concrete failure we observed in Zoho: night-shift differential (the extra ₹35/hour the company pays for the C shift) was not auto-applied if the worker had picked up a shift swap. The HR manager had to manually flag 40–60 entries a month.
### Breaker 2: Contract labour management
Zoho People has an "Employee Type: Contract" flag but no model for:
- The
contractor (the agency, with their CLRA licence number, expiry, principal-employer linkage)
- The contractor's
wage register (a separate ledger per contractor — required by Section 29 of CLRA)
- The contractor's
PF/ESI compliance (which is the contractor's responsibility but the principal employer is liable if the contractor lapses)
Off-the-shelf HRMS treats contract workers as a sub-class of employees. Compliance treats them as workers of a separate entity (the contractor) who happen to work at your premises. The data model is fundamentally different. The custom system has a
contractors table, a
contract_workers table linked to it, and a quarterly compliance dashboard that flags contractors with expiring licences.
### Breaker 3: Biometric integration with shift-aware logic
ESSL biometric devices push punches over a serial protocol to a Windows machine, which Zoho People can ingest via a connector. Two problems we hit:
- The connector polled every 10 minutes, losing 20–40 punches per day in network glitches that the device buffer survived but the connector did not.
- More importantly: an employee punching IN at 5:55 am for the 6 am A shift versus punching IN at 5:55 am for an OT shift on a C-shift week is two completely different payroll entries. Zoho's shift inference defaulted to "the shift this employee was scheduled for today" — which broke during real swaps and OTs.
The custom system reads punches directly from each ESSL device (TCP, not the polled connector), buffers locally, and the shift-inference engine considers (a) the schedule, (b) the previous 7 days of patterns, (c) the supervisor's manual swap log, and (d) the device location (Gate 1 versus Gate 4 distinguishes plant assignments).
## The Build-vs-Buy Framing That Worked
The CFO did not say yes to "custom is better." He said yes when he saw this comparison.
| Cost Bucket |
Zoho People (Status Quo) |
Custom HRMS (5-Year View) |
| Licence / build (yr 1) |
₹6,40,000 |
₹19,20,000 build + ₹3,12,000 ops |
| HR manager Excel time (yr 1) |
₹4,80,000 (11 hrs/wk × ₹840/hr) |
₹35,000 (manual exception handling) |
| PF / ESI / CLRA penalty risk (yr 1) |
₹2,40,000 (actual penalty in 2024) |
₹0 (modelled) |
| Year 1 total |
₹13,60,000 |
₹22,67,000 |
| Year 2 total |
₹13,60,000 |
₹3,47,000 |
| 5-year total |
₹68,00,000 |
₹36,08,000 |
| Break-even |
Month 18 |
The CFO's exact words: "I keep paying for Zoho whether it works or not. The custom thing, I pay once." He approved the build the same afternoon.
## The Stack
⚙️
Node.js + Express API
A monolith service on a single Hetzner CCX23 (₹4,400/mo). Right-sized for a 400-employee scale.
🐘
PostgreSQL 16 + TimescaleDB
Standard Postgres for HR data; Timescale hypertable for biometric punches (10–15M rows/year). Self-hosted on the same Hetzner box.
🖥️
Next.js Admin + Mobile-Friendly Worker Portal
HR admin desktop view; worker self-service via mobile web (no app — workers do not all have smartphones). Tamil + Hindi + English UI.
📡
ESSL Direct TCP Bridge
A Go service on a tiny on-prem Intel NUC reads each ESSL device every 60 seconds, buffers locally, syncs to the cloud. Survives 4-hour internet outages.
## What We Built (And Did Not)
Phase 1 (the 14-week build) shipped:
- Employee + contractor + contract-worker master
- Shift-aware attendance with biometric ingestion from 4 ESSL gates
- Leave engine: 8 leave types, accrual policies per band, shift-week reset for C-shift workers
- Payroll computation: basic + DA + HRA + night-shift differential + OT + statutory deductions
- PF + ESI + PT + TDS challan generation (EPFO ECR file, ESIC ESI file)
- CLRA contractor licence tracking + alerts at 60/30/7 days to expiry
- Wage register per contractor (Form XX under CLRA, downloadable)
- Worker self-service: punches log, payslip, leave balance, leave application
Phase 1 did NOT ship:
- Performance management (PMS) — Phase 2
- Recruitment / ATS — they use a referral-based recruitment model, not a fit for ATS
- Training records — Phase 3
- Mobile app — web is enough for now
- AI anything — we deliberately omitted "AI-powered insights" because the HR manager wanted reliability, not predictions
The principle we follow on manufacturing builds: ship the compliance-critical and payroll-critical first. Everything else waits. PMS, training, and ATS are valuable, but a payroll miscalculation hurts more than a missing 360-review feature.
## The Compliance Layer (Where the HR Manager Stopped Working Saturdays)
The wins were not "fancy reports." They were "the right calculation, every time, without an Excel spreadsheet."
### Night-shift differential
Three rules layered: (a) ₹35/hour for hours worked between 10 pm and 6 am, (b) only if scheduled C-shift OR approved OT, (c) caps at 8 hours per shift. The engine handles all three. The HR manager checks the exception report on the 2nd of each month — usually 3–5 entries to validate, takes 20 minutes. Down from 11 hours of Excel reconciliation.
### CLRA wage register
Section 29 of CLRA requires a separate wage register per contractor. The system auto-generates Form XX with the workers, days worked, basic, OT, deductions, net paid. Auditor in Feb 2026 asked for it; we exported in 90 seconds. Previous audit took the manager 3 days.
### EPFO ECR
The Electronic Challan-cum-Return file is a fixed-width text file (UAN, name, EPF wages, EPS wages, EE share, ER share, NCP days, refund). The system generates it on the 5th of every month, the manager reviews and uploads. Penalty risk modelled at ₹0/year now — the system enforces the rules the manager used to remember.
### ESIC contribution
ESI threshold of ₹21,000 means workers above the threshold are excluded. The system handles transitions (worker crosses threshold mid-year) via a "contribution period" model — not "calendar year" — that mirrors the [ESIC regulations](https://www.esic.in/web/esic/employer).
## The Build (14 Weeks)
1
Weeks 1–3: Discovery + the matrix
We sat with the HR manager for 6 sessions. Catalogued every Excel column she maintained. Mapped to a 47-table data model. Locked the shift-rotation rules per team.
2
Weeks 4–6: Core master + attendance
Employee, contractor, contract_worker tables. ESSL TCP bridge. Punch ingestion. Shift-inference engine v1.
3
Weeks 7–9: Payroll + statutory
Salary computation. EPF/ESI/PT/TDS modules. ECR + ESI file generation. Three test payroll runs against the previous Zoho output, reconciled to the rupee.
4
Weeks 10–11: Worker portal + leave engine
Mobile-friendly web for workers (Tamil + Hindi + English). Leave application + approval workflow. The HR manager trained 12 supervisors to use the approval flow on their phones.
5
Weeks 12–13: Parallel run
Ran the new system in shadow alongside Zoho. The June payroll was generated by both systems and reconciled. 4 mismatches — all 4 were Zoho being wrong. CFO signed off.
6
Week 14: Cutover
July 1, 2026 effective date. Zoho subscription cancelled at month-end. HR manager's first Saturday off in 3 years.
## The QA Angle
The QA work on this build was the most painful part. Indian payroll has hundreds of edge cases — half-day worked on a holiday under contract for a separate contractor whose licence expired mid-month. As QA lead, Manvi ran 187 distinct test cases against the payroll engine, including 41 cases derived from the [EPFO compliance manual](https://www.epfindia.gov.in) and 23 from the [ESIC employer FAQ](https://www.esic.in). The reconciliation against the previous 4 months of Zoho output exposed 12 historical mistakes in Zoho's output — including 2 PF challan under-payments we then helped the company correct retrospectively.
## When You Should Not Custom-Build an HRMS
Skip the custom build if (a) you have under 80 employees and one shift — Keka or Zoho People is genuinely cheaper and good enough, (b) you do not have contract labour and the night-shift differential question, (c) you have no in-house IT to own the system after handover, or (d) you want a fancy PMS or ATS as the primary feature — those are not where custom shines; SaaS is more economical.
Custom is the right answer when compliance is the hard part. Manufacturing, healthcare, NBFCs, mining — these all have compliance shapes that off-the-shelf cannot encode without 6 months of consultancy.
## Outcome
-
HR manager's Saturday work: 0 hours (down from 11).
-
Payroll calculation error rate: 0 in 8 months (down from 3–6 per month).
-
PF / ESI audit time: 3 hours (down from 3 days).
-
The CFO's comment: "Best ₹19 lakh I have spent in 4 years."
We benchmarked our cost case study against [r/IndianStartups discussions](https://www.reddit.com/r/IndianStartups/) where founders shared HRMS pain points. The most consistent theme: "SaaS works until you have shift work, then it does not."
## Common Mistakes
Symptom: "Custom HRMS is over budget." Cause: scope creep into PMS, ATS, training. Fix: ship attendance + payroll + statutory in Phase 1 only. Hold the line.
Symptom: "Biometric punches keep going missing." Cause: polling architecture. Fix: TCP push from devices to an on-prem bridge.
Symptom: "Payroll wrong by ₹120 per worker." Cause: rounding rule mismatch. Fix: match the previous system's rounding exactly during parallel run. Then change after cutover only with CFO sign-off.
Symptom: "EPFO ECR upload rejects the file." Cause: fixed-width format off by one character somewhere. Fix: validate against the EPFO sample file character-by-character.
Symptom: "Workers cannot log in." Cause: SMS-OTP fallback for workers without smartphones. We use a 6-digit PIN issued to the worker on a paper slip that they can reset via supervisor.
## FAQ
### How much does a custom manufacturing HRMS cost?
For a 200–600 employee single-plant or multi-plant operation: ₹15–28 lakh build, 12–18 weeks, plus ₹20,000–₹40,000/month ops. Above 1,000 employees the build is larger.
### What stack do you recommend for an HRMS?
PostgreSQL is non-negotiable for payroll. We use Node.js + Next.js because the team is fluent. Java / Spring Boot + React works equally well — pick the stack your in-house team will own.
### How do you handle the labour codes that keep getting amended?
We modelled statutory deductions as configurable per "effective from" date. When the rule changes (e.g., revised PF wage ceiling), the HR manager updates one config row with the effective date — the engine recomputes correctly for any period.
### Can the system handle multiple plants?
Yes. We have 4 plant locations, each with its own ESSL biometric devices and gate setup. Plant is a first-class entity in the data model — payroll, attendance, and reporting can be filtered or scoped per plant.
### What about NABH or NABL audits?
Manufacturing audits care most about CLRA, EPFO, ESIC, and the Factories Act. We built reports for each. NABH/NABL would not typically apply unless you have on-site healthcare staff.
### Is there an alternative to building from scratch?
[Pocket HRMS](https://www.pockethrms.com/), [farsightHRM](https://www.farsightHRM.com/), and [HROne](https://hrone.cloud/) are India-specific HRMS that handle manufacturing better than Zoho People. For ₹150–₹400/employee/month, they ship 70–80% of what a custom build provides. For 400 employees, that is ₹7.2–₹19.2 lakh/year — meaningfully higher than our ₹3.5 lakh/year ops cost, but no build budget. Worth a serious look if your compliance pattern fits theirs.
### Does the worker portal work in Tamil?
Yes. Tamil, Hindi, and English. Localisation files maintained in the codebase. New languages are a 2-day add.
Need a Custom HRMS Scoping Call?
We build HRMS for Indian manufacturers, factories, and shift-based operations in the 200–1,500 employee range. The first call is a 90-minute scoping session with our QA lead and a senior engineer — we tell you honestly whether you should build or buy. No slides, just your situation.
Book the Scoping Call