The Hiring Company.
A production-grade, referral-powered ATS built from scratch — connecting companies, recruitment partners, and candidates with commission tracking, automated payouts, and full admin operations.
Overview
An applicant tracking system for a recruitment marketplace: companies post roles, recruitment partners refer candidates, and the platform tracks every candidate from referral to placement while handling the commission and payout accounting behind it. I led development with one junior developer, owning requirements, architecture, DB schema, and API contracts end to end.
Architecture & Key Decisions
- Custom PHP MVC framework with a fluent Query Builder (ORM-like) supporting complex joins, dynamic where clauses, and prepared statements.
- 5-role RBAC — Admin, Recruiter, Partner, Candidate, Company — with geo-based data scoping by city.
- Cursor-based pagination replacing offset queries. Offset pagination degrades linearly at depth; cursor pagination stays fast across millions of rows.
- JWT-based REST API layer with API key management and standardized response formatting, enabling third-party integrations.
- OTP-based authentication chosen over OAuth for simplicity in the target market.
The Hard Part
Migrating 1.9M+ records from Ceipal ATS
The existing candidate data lived in Ceipal ATS and had to be moved into the new data model via bulk CSV — without list views grinding to a halt at scale.
- Refactored the database schema to fit the new data model.
- Added strategic indexes based on the actual query patterns the app ran.
- Replaced offset pagination with cursor-based pagination so list views stayed performant.
Result: 1.9M+ records migrated and queryable with consistent performance.
Key Features
- Referral workflow engine: referred → applied → under process → selected / rejected.
- Commission tracking and payout management (pending / paid / cancelled) with financial reporting.
- Recruiter call management and tracking module.
- Advanced job search with multi-filter support (category, location, experience, job type, date posted).
- Admin dashboard with real-time analytics, multi-criteria filtering, and bulk CSV/Excel export.
- Bulk CSV import/export with data-security controls and automated lifecycle notifications.
Trade-offs & What v2 Adds
Why a custom framework over Laravel?
Full control and a lighter footprint for the deployment environment.
Why OTP over OAuth?
Simplicity for the target user base.
What v2 would add
Redis caching, an async queue for OTP/email, API rate limiting, Elasticsearch for job search, and automated tests.
Want the full walkthrough?
Happy to walk through the architecture, trade-offs, and the migration in detail.