Softechinfra
Business

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 every year for Zoho People + Zoho Payroll + 3 Excel sheets. We replaced it with a custom HRMS on Next.js + Postgres + Razorpay-Payroll.

Vivek KumarVivek Kumar
December 19, 202516 min read
We Built a Custom HRMS for a 120-Person CA Firm: Why "Off-the-Shelf" Was a Tax

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 for software every year 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. 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
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.

Why This Matters For Indian Professional-Services Firms

Off-the-shelf HRMS like Zoho People and Keka charge per employee per month, and for 120 employees the base licensing is 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 a real 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) 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)

    Zoho People + Payroll + Excel (Current) Custom HRMS (Our Build)
    Initial setup / build None (already deployed) One-time build (us)
    Year 1 software licences Annual licences (Zoho People + Payroll + Greythr) None
    Year 1 run cost (hosting) Bundled in licence Monthly hosting
    Year 1 partner reconciliation labour 4 hours/month × 14 partners 1 hour/month × 14 partners residual
    Year 1 admin time on integrations HR admin spending 14 hours/month reconciling Minimal
    Years 2-3 licences (with 8% YoY hike) Annual licences None
    Years 2-3 run + ongoing dev retainer Zoho admin labour Hosting + dev retainer
    Years 2-3 reconciliation + admin labour High Low
    3-year TCO Lower in cash terms Higher in cash terms

    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 a fraction of DocuSign's per-signature price. Same legal validity in India.

    The Stack

    LayerChoiceWhy
    FrontendNext.js 14 + TailwindServer components for the partner dashboard; fast initial paint matters for the senior partners who check it on the way to court.
    DatabasePostgreSQL 16 (Aurora Serverless v2)Engagement schema is heavily relational; Aurora's autoscale handles month-end reporting peaks.
    Auth + RBACClerk Pro120 staff with 5 role types. Office-level RBAC via Clerk's organisation feature.
    PayrollRazorpay Payroll APIFree for the first 25 employees, charged per employee thereafter. PF/ESI/TDS compliance handled by Razorpay.
    E-SignNSDL Aadhaar e-Sign + SignDeskNSDL for individual signatures; SignDesk for multi-party partnership agreements.
    File storageS3 (ap-south-1) with KMS encryptionConfidential client data and partner agreements get separate KMS keys per office.
    HostingVercel Pro (frontend) + AWS Mumbai (Aurora + workers)Hybrid.
    Email + commsPostmark + WhatsApp via WatiTransactional 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 Outcome (Q1 2026 Numbers)

    11d → 1d
    Q4 Profit-Share Computation Time
    4h → 1h
    Partner Reconciliation Time/Month
    14 mo
    Build Payback (Inc Partner 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 for the build 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 Teamstead, our reusable intranet module — /products/teamstead — 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: 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.

    Book a Build-vs-Buy Call

    Tags:
    Custom HRMSCA FirmZoho AlternativeBuild vs BuyRazorpay PayrollCase StudyProfessional Services
    Share this post:
    Vivek Kumar

    Vivek Kumar

    Founder and CEO at Softechinfra with 10+ years of experience in software development and system architecture.