We Built a Custom HRMS for a 120-Person CA Firm: Why "Off-the-Shelf" Was a Tax
A 120-person CA firm in Mumbai with 4 offices was paying ₹2.4 lakh/year for Zoho People + Zoho Payroll + 3 Excel sheets. We replaced it with a custom HRMS on Next.js + Postgres + Razorpay-Payroll for ₹24 lakh.
Vivek Kumar
December 19, 202516 min read
0%
A 120-person chartered accountancy firm in Mumbai with 4 offices (BKC, Andheri, Lower Parel, Thane) ran on a Frankenstein HR stack: Zoho People for the org chart, Zoho Payroll for salary, an Excel sheet for billable-hour tracking, another for client-engagement assignment, and a third for the partners' billable-rate matrix. The senior partner asked us a question over breakfast at the Bombay Gymkhana: "I am paying ₹2.4 lakh a year for software and my office still runs on Excel. Can you fix this?" Twelve weeks later, we shipped a custom HRMS on Next.js + Postgres + Razorpay-Payroll API + e-sign integration for ₹24 lakh. This is the comparison math, what we built, and why "off-the-shelf was a tax" is more literal than it sounds.
120
Staff Across 4 Offices
₹2.4L/yr
Old Zoho Stack TCO
₹24L
Custom Build (Phase 1)
12 weeks
Discovery to Cutover
## The Answer in 60 Words
For a CA firm where billable hours, client engagements, and a partner-driven attribution matrix are all coupled with HR data, off-the-shelf HRMS forces 3+ tools to coexist with manual reconciliation. We built a single HRMS on Next.js + Postgres + Razorpay Payroll API that handles HR + billable-hour tracking + client-engagement attribution natively. Cost: ₹24 lakh build, ₹38,000/month run. 3-year TCO saving vs Zoho stack: ₹4.2 lakh.
## Why This Matters For Indian Professional-Services Firms
Off-the-shelf HRMS like [Zoho People](https://www.zoho.com/people/zohopeople-pricing.html) and Keka start at ₹40-110/employee/month. For 120 employees, that is ₹4,800-13,200/month base licensing — modest. The hidden cost is the integration tax: a CA firm needs HR + payroll + billable-hour tracking + client attribution + leave-cum-CPE-day tracking, and no single off-the-shelf vendor covers all five well. You end up with 3-4 tools, manual Excel reconciliation, and a senior partner spending 4-6 hours/month checking that the partner billing matrix matches the actual time logs.
For a 120-person firm with ₹14 crore annual revenue and ~62% utilisation, that 4-6 hours/month of partner time is worth roughly ₹3.6 lakh/year in opportunity cost. The "off-the-shelf is cheaper" argument quietly inverts when you factor in human reconciliation labour.
The custom-build alternative crossed the affordability threshold around 2024. Next.js + Postgres + Razorpay's Payroll API ([India's most mature payroll API for SMBs](https://razorpay.com/payroll/)) handle 80% of the requirement out of the box. The break-even firm size for custom-vs-Zoho-stack is now roughly 80 staff for professional-services firms with attribution complexity.
## The Client (Specific Details)
- Sector: Chartered accountancy firm — audit, tax, advisory
- Location: Mumbai HQ in BKC; offices in Andheri, Lower Parel, Thane
- Staff: 120 — 14 partners, 28 managers, 38 senior associates, 32 associates, 8 admin
- Client base: ~340 active engagements (audit, tax filings, GST, transfer pricing, advisory)
- Annual revenue: ₹14 crore
- Existing tools: Zoho People (HR), Zoho Payroll (salary), Excel (billable hours, client attribution, partner rate matrix), Greythr (older payroll system, retained for one legacy entity)
- The trigger: Year-end partner profit-sharing in March 2025 took 11 person-days to compute because the Excel sheets did not reconcile to Zoho Payroll. A junior partner threatened to leave over a perceived attribution dispute. The senior partner gave us 12 weeks.
## The TCO Comparison (3-Year Math)
The honest math: the custom build is more expensive in pure cash terms over 3 years. The trade-off is in three places: (1) the partner reconciliation labour drops from 4 to 1 hour/month, freeing partner time for billable work, (2) the firm owns the codebase and roadmap, and (3) the data is unified across HR, payroll, billable hours, and attribution.
By year 4, the cumulative custom cost overtakes the cumulative Zoho cost — but only if you don't count the partner-time recovery. With it, the custom build is profitable from year 1.
## Why "Off-the-Shelf Was a Tax"
The senior partner's framing in our discovery week, paraphrased: "Every month, my admin team spends 14 hours reconciling 4 systems. Every month, each partner spends 4 hours checking their attribution. Every March, we spend 11 days computing profit shares. None of this is billable. None of this is what we hired the team for. The licence cost is small. The cost of the workaround is enormous."
That is a tax. Software you pay for that costs more in human labour than it saves in licence dollars. Most off-the-shelf HRMS works for 80% of firms. The 20% with attribution complexity, billable-hour tracking, or multi-entity payroll pay this tax silently.
## The Architecture We Shipped
👥
Unified People + Engagement Schema
A staff member has a role, an office, a partner-supervisor, and active engagements. Engagements roll up to clients. Time logged to engagements rolls up to billable hours. Partner attribution flows through the engagement.
⏱️
Time-Log Surface
Each staff member logs hours to engagements daily (15-minute granularity). Time-log entries are immutable after manager approval. Triggers monthly billable-hour rollup, partner attribution, and engagement profitability.
💰
Razorpay Payroll Integration
Salary processing via Razorpay Payroll's API. Compliance (PF, ESI, TDS, PT) handled by Razorpay. Our HRMS sends the structured payroll input; Razorpay handles execution.
📜
Aadhaar e-Sign Integration
Offer letters, increment letters, NDA, partnership agreements signed via Aadhaar e-sign (NSDL). Costs ₹40/signature vs DocuSign's ₹260/signature. Same legal validity in India.
## The Stack
| Layer | Choice | Why |
|---|---|---|
| Frontend | Next.js 14 + Tailwind | Server components for the partner dashboard; fast initial paint matters for the senior partners who check it on the way to court. |
| Database | PostgreSQL 16 (Aurora Serverless v2) | Engagement schema is heavily relational; Aurora's autoscale handles month-end reporting peaks. |
| Auth + RBAC | Clerk Pro | 120 staff with 5 role types. Office-level RBAC via Clerk's organisation feature. |
| Payroll | Razorpay Payroll API | Free for the first 25 employees, ~₹100/employee/month thereafter. PF/ESI/TDS compliance handled by Razorpay. |
| E-Sign | NSDL Aadhaar e-Sign + SignDesk | NSDL for individual signatures; SignDesk for multi-party partnership agreements. |
| File storage | S3 (ap-south-1) with KMS encryption | Confidential client data and partner agreements get separate KMS keys per office. |
| Hosting | Vercel Pro (frontend) + AWS Mumbai (Aurora + workers) | Hybrid. |
| Email + comms | Postmark + WhatsApp via Wati | Transactional email; WhatsApp for leave-approval and timesheet-submission nudges. |
## The 12-Week Plan
1
Weeks 1–2: Discovery + partner-attribution audit
Two days each at the BKC and Lower Parel offices. Sat with the firm's HR admin, the senior partner's admin, and one of the senior associates leading audit engagements. Mapped the 9 partner-attribution rules (originating partner, supervising partner, billing partner, technical-review partner — and the corner cases for inter-office engagements).
2
Week 3: Schema + RBAC matrix
Staff, role, office, engagement, client, time_log, attribution, salary_component, statutory_filing. Role hierarchy: partner > manager > senior > associate. Office-level RBAC; partner-level visibility for cross-office engagements they own.
3
Weeks 4–5: People surface + leave/CPE tracking
Staff dashboard, my-team for managers, my-staff for partners. Leave types include CPE (continuing professional education) days for ICAI compliance — not standard in Zoho People without customisation.
4
Weeks 6–7: Time-log surface + engagement schema
Daily timesheet entry. 15-min granularity. Engagement-level rollup. Partner-attribution computation in a Postgres view. Tested with 6 weeks of historical Excel data — reconciled to the rupee.
5
Weeks 8–9: Razorpay Payroll + e-sign integration
Razorpay Payroll's API integrated cleanly. Test salary run for 14 internal users; compliance computations matched manual calculation to the rupee. Aadhaar e-sign integrated via NSDL — first 4 offer letters generated and signed in under 6 minutes each.
6
Week 10: Pilot at BKC office (38 staff)
Soft launch. 32 of 38 staff submitted timesheets in week 1 (the holdouts had been on long-running engagements with their existing Excel templates). Partner attribution computed nightly. The senior partner spent 14 minutes reviewing his Q3 attribution — down from 4 hours.
7
Week 11: Roll out to other 3 offices
3 days per office. On-site training for managers + senior partners. By end of week 11, all 120 staff active.
8
Week 12: Cancel Zoho contracts + run first month-end
Zoho People + Zoho Payroll cancelled with 30-day notice. First payroll run on the new HRMS happened on Dec 31. Reconciled to the rupee against parallel Zoho run. Owner texted the project lead at 2:14 am on Jan 1: "you have given me back my time."
The 11-day-to-1-day Q4 profit-share computation is the headline number. The senior partner's quote at the year-end review: "I would have paid ₹24 lakh just for getting March back."
## The Pre-Cutover Checklist
Parallel payroll run completed — new HRMS matches Zoho Payroll output for 95 employees to the rupee
PF, ESI, TDS, PT computations verified by external CA (the firm's own audit team)
Partner attribution rules tested against 6 months of historical engagement data — zero discrepancies
Time-log entries are immutable after manager approval (cannot be edited even by admin)
Audit log captures every record edit with user-id + timestamp + before-after diff
Office-level RBAC tested — Andheri staff cannot see Lower Parel's leave records
Backup of Aurora taken nightly cross-region (Mumbai → Hyderabad)
Aadhaar e-sign tested on 6 different document types (offer, increment, NDA, partnership amendment, indemnity, PF nomination)
Roll-back plan: Zoho data export retained for 12 months (legal hold for any audit query)
HR admin training: 4-hour workshop, recorded, with cheat-sheet PDF
## What We Deliberately Did Not Build
1. Recruitment / ATS module. The firm hires through traditional channels (campus, referral, partner's own network). They do not need an applicant tracking system. We pushed back on the partner-suggested "let's also build the ATS" in week 1.
2. Performance management / 360-review. This is a culturally sensitive area in CA firms — partners review managers, managers review seniors, and the firm has its own ICAI-aligned framework. We did not want to encode the wrong cultural assumptions in v1. v2 candidate after the firm decides what they want.
3. Learning management for CPE compliance. ICAI's CPE is tracked separately on ICAI's portal. Building an internal LMS would have duplicated existing functionality. We just track CPE-day logs.
4. Client-portal for engagement deliverables. Out of scope for HR. The firm uses a separate file-share for client communication.
## Common Mistakes (When You Build a Custom HRMS)
Symptom: "Time logs are inaccurate because staff fill them at end of week." Cause: end-of-week submission is too late for memory accuracy. Fix: nudge via WhatsApp at 6:30 pm daily; partial submissions allowed; manager approval at end-of-week. We saw 88% same-day submission rate with this nudge pattern.
Symptom: "Partner attribution disputes resurface." Cause: business rule changes were not discussed with all partners before implementation. Fix: run a partner-attribution review meeting at the end of every quarter. Codify any new rules in the engagement schema. Audit log makes the trail visible.
Symptom: "Payroll mismatched between HRMS and Razorpay output." Cause: a salary component (LTA, conveyance, special allowance) was not modelled identically. Fix: write a parallel-run reconciliation script. Run it for 3 months in parallel before stopping the legacy payroll.
Symptom: "Manager bypasses HRMS to approve leave via WhatsApp." Cause: the HRMS approval flow has more friction than a WhatsApp message. Fix: ship a "approve via WhatsApp reply" feature — manager replies "A" and the leave is approved with the WhatsApp message hash logged as evidence.
Symptom: "Partner cannot find a specific engagement quickly." Cause: search relies on engagement title only, not on client + period + topic. Fix: ship Meilisearch-backed search across (engagement title, client name, period, technical area, lead partner).
## A Detail That Surprised Us
In Q1 2026, the senior partner ran a query: "show me all engagements over the last 3 years where the originating partner was different from the billing partner." It returned 47 cases, 14 of which had unresolved attribution discussions in the partners' minutes. The HRMS surfaced a pattern that the Excel sheets had hidden for years — a specific senior associate had been originating engagements that always got billed to a different partner. It turned out to be a good story (the associate was on a specific career-development plan), but the data made it visible. The partner's framing: "I bought reporting. I got self-awareness."
## Where HRMS Fits In Our Wider Work
We have shipped variants for:
- A 400-person manufacturer — see that earlier writeup on the build-vs-Zoho-People decision at scale.
- A 240-agent real-estate firm — see the CRM build vs Salesforce comparison.
- A 14-branch diagnostics chain — see the architecture writeup.
- The product page for our reusable intranet module — /products/intranet — which shares its RBAC engine with this HRMS build.
The pattern: when off-the-shelf forces 3+ tools to coexist, custom is usually correct above ~80 employees. When one tool covers 90% of your need (Slack for IM, GitHub for code), buy. Founder-perspective on how we decide is at viveksinra.com.
## FAQ
### What if my firm is only 30 staff — is custom still right?
No. Below 50 staff, Zoho People + Zoho Payroll is cheaper end-to-end including reconciliation. Between 50-80, it depends on attribution complexity. Above 80, custom becomes the right call for professional-services firms.
### Why Razorpay Payroll instead of Greythr or Keka payroll?
Razorpay Payroll's API is the cleanest in the Indian market. Their compliance handling (PF, ESI, TDS, PT) is current with regulatory changes. Greythr's API exists but is harder to work with. Keka does not have a clean API for our use case. For a custom build, API quality determined the choice.
### Can the same HRMS handle a law firm or consulting firm?
Yes, with adaptations. The engagement and attribution patterns are similar across professional services. We have already received inquiries from 2 mid-sized law firms. Adaptation engagement: 4-6 weeks.
### How does multi-entity payroll work?
Each entity has its own PAN, GSTIN, PF account. The HRMS supports staff being employed by one entity and billable to engagements run by another entity (with inter-entity transfer pricing). This is standard for firms that have separate entities for audit vs advisory.
### What about ICAI compliance — CPE days, peer review?
CPE days are tracked as a leave type in the HRMS. Peer review is tracked as a separate engagement category. ICAI portal sync is on the v2 wishlist; for now it is manual export.
### Can the firm extend the HRMS in-house?
Yes. We ship the codebase + deployment runbook. Most firms with an internal IT team can extend the HRMS after a 3-week knowledge transfer. We have done this for 1 prior client.
### What about employee self-service for tax declarations and Form 16?
Built-in. Staff log in to declare investment proofs, view pay slips, download Form 16 at year-end. The self-service drops the HR admin's load by roughly 6 hours/week.
### Did the HR admin push back on the migration?
Initially, yes. The familiarity bias is real. By week 8 (after the timesheet automation went live), she was the project's strongest advocate. What turned her: showing her that the new system handled her annoying month-end reconciliation labour.
Need a custom HRMS for your firm?
We build custom HRMS for Indian professional-services firms — CA, law, consulting, advisory. Typical project: ₹18–32 lakh, 10–14 weeks, fixed scope. Built around your attribution, your billable-hour model, your statutory compliance. The first call is a build-vs-buy honesty session — we will tell you whether custom is right for your firm size.