Case Files
Case #001: Designing an ATS Candidate Pipeline From First Principles
A practical system design breakdown of an applicant tracking candidate pipeline, from actors and states to audit logs and AI-first workflows.
A candidate applied. HR says the profile was screened. The hiring manager says they never received it. The database says everyone is telling the truth.
Welcome to Case #001: the candidate pipeline mystery.
Direct answer: how should an ATS candidate pipeline be designed?
An ATS candidate pipeline should be modeled as an auditable workflow, not as one editable status field.
At minimum, it needs:
- Actors with clear permissions
- Valid state transitions
- Ownership rules
- Status history
- Reason capture
- Notifications
- Audit logs
- Human review for AI-assisted decisions
The current status matters, but the history explains what actually happened.
The common culprit: one status column
The naive design starts like this:
applications.status = "screened"
That looks fine until the product needs to answer practical questions:
- Who changed the status?
- Why was it changed?
- Was the hiring manager notified?
- Did the candidate apply to multiple jobs?
- Did HR reject the candidate or move them back for review?
- Can a manager override an HR decision?
A single status field stores the conclusion. It does not store the case notes.
The actors in the workflow
A basic ATS workflow usually includes:
- Candidate
- Recruiter or HR user
- Hiring manager
- Interviewer
- Organization admin
- System automation
Each actor can perform different actions at different stages. That means permissions are part of the workflow, not an afterthought.
The first-principles model
A hiring pipeline is a coordination system between people. It has data, but it is not only data storage.
The design needs to represent:
- State: where the application is now
- Event: what happened
- Actor: who or what caused it
- Reason: why it happened
- Time: when it happened
- Visibility: who can see it
- Obligation: who must act next
This turns the pipeline from a dropdown into a system of record.
Practical states for version one
A simple pipeline can start with these states:
- Applied
- HR Screening
- Sent to Manager
- Manager Review
- Interview
- Offer
- Hired
- Rejected
- Withdrawn
Do not add twenty stages because enterprise tools have twenty stages. Add a stage when it changes ownership, permissions, reporting, or user expectations.
A zero-cost implementation path
For an early SaaS product, start with:
applicationstable with the current stateapplication_eventstable for history- Application-level transition validation
- Basic role checks
- Email notifications for important handoffs
- Admin-visible audit trail
This keeps the architecture understandable while preserving the information needed to debug disputes later.
AI-first extensions
AI can help the pipeline without replacing accountability:
- Summarize resumes for recruiters
- Draft screening notes
- Suggest interview questions
- Highlight missing candidate information
- Explain why a candidate moved stages
- Detect stale applications that need follow-up
AI should not silently reject candidates. The product should keep a human in the loop, record AI-generated suggestions, and distinguish suggestions from decisions.
Metrics worth tracking
Useful analytics include:
- Time in each stage
- Drop-off by stage
- Manager response time
- Source quality by job
- Offer acceptance rate
- Rejection reasons
- AI suggestion acceptance rate
These metrics are only trustworthy if the workflow history is trustworthy.
Useful summary
The culprit was not the status field. The culprit was treating a human workflow like a simple dropdown.
Case closed: store the current state for speed, store events for truth, and design AI as an assistant with a paper trail.