A mid-market staffing firm was drowning in client emails. Five hundred-plus
inbound requirements every day, parsed by hand into a CRM that never quite fit
the shape of how requirements actually arrived. Placements were slow,
recruiters were burning out, and the bottleneck was visible to every
stakeholder. We replaced the manual intake-to-contract flow with a
multi-agent AI system — and gave 18 hours per week back to every recruiter.
85%Reduction in JD-processing time
3.2×Faster placements
₹48LAnnual cost savings
0Wrong-fit placements from JD misreads
The Challenge
Every inbound JD email was different. Some had the role in the subject line,
some buried it in a 2,000-word PDF attachment. Skill requirements ranged from
explicit ("5+ years React") to implied ("must handle fintech compliance").
Recruiters spent an average of 22 minutes per email just normalising the
data — and at 500 emails a day, that was the equivalent of seven full-time
staff doing pure intake work.
The problem wasn't just speed. It was consistency: two recruiters reading
the same email would extract different requirements, leading to mismatched
candidate shortlists and frustrated clients.
Our Approach
We diagnosed this as a multi-agent problem, not a single-LLM-call problem.
Each step in the lifecycle — classification, extraction, matching, outreach,
contracting — had different accuracy requirements, different failure modes,
and needed different human-in-the-loop checkpoints. Solving it with one big
prompt would create a black box no one could debug.
Instead, we designed a system where five specialised agents handle the
lifecycle, each with its own evals, fallbacks, and audit trail. The
orchestration layer decides which agent runs when, what data flows between
them, and where to pause for a human decision.
What We Built
- Intake Classifier — pre-processes inbound mail and routes new requirements, follow-ups, candidate queries, and noise into the right lanes.
- JD Extractor — a hybrid LLM-plus-regex system that pulls structured fields (role, level, skills, location, comp band, deadline) from unstructured email and PDF attachments. Trained on the firm's own past placements to learn its taxonomy.
- Candidate Matcher — vector search against the existing ATS with re-ranking based on past placement outcomes, not just keyword overlap. Returns a ranked top-10 with confidence scores.
- Outreach Drafter — generates personalised first-message drafts referencing each candidate's actual background. Recruiters approve or edit before send.
- Contract Router — once a candidate accepts, generates the contract from a template, routes to DocuSign, and pings the recruiter when signed.
Every step has a human checkpoint by default. The firm dialled checkpoints
down once trust grew — but the option to step back in stays.
Results (after 90 days in production)
- 85% reduction in JD-processing time (22 min → 3 min average)
- 3.2× faster average time-to-placement
- ₹48L annualised cost savings on intake operations alone
- 0 wrong-fit placements traced to JD misinterpretation, down from 8% in the prior quarter
- 30% more requirements handled the next quarter — no headcount added
"They didn't just hand us a model — they shipped a system our ops team
actually uses every day. The intake bottleneck we'd lived with for years
is just… gone."
— COO
Tech Stack
PythonFastAPILangGraph
OpenAI GPT-4oAnthropic ClaudePinecone
Gmail APIMicrosoft GraphDocuSign
PostgreSQLDatadog