Read Aloud
Text Size
Automatization • Workflow • HR • .NET Core • Azure • React

Behavioral health organizations in the US operate in one of the most demanding hiring environments in healthcare. Demand for qualified practitioners consistently outpaces supply, which means the speed and quality of a recruitment pipeline isn't just an HR concern, it's a direct factor in how many patients get care. Our client, a large US-based behavioral health services provider, understood this better than most. But understanding the problem and having the infrastructure to solve it are two different things.
When we came on board, their pre-hire process was essentially manual. Recruiters were managing applicant communications by email and phone, scheduling interviews by hand, and tracking candidate status through a patchwork of spreadsheets and disconnected tools. The system worked, barely, when volumes were modest. But it had a hard ceiling. On a good day, the team could process about three applicants. Over a full month, they might get through a hundred.
That ceiling wasn't just inconvenient. It was causing real operational strain and, more importantly, slowing the path from interested applicant to hired employee in a sector where unfilled positions have direct consequences. They came to us with a clear goal: remove the manual bottlenecks entirely and build something that could scale.
The core problem was not any single broken step, it was that every step in the pipeline required a human to manually push it forward. An applicant would complete one stage and then wait, sometimes for days, for a recruiter to notice, follow up, and move things along. Multiply that lag by hundreds of candidates and the math gets ugly fast.
On top of that, there was a communication fragmentation problem. Recruiters were reaching out through different channels at different times, applicants had no reliable way to know where they stood, and there was no single view of the pipeline that HR leadership could actually trust. Real-time visibility didn't exist.
We also needed to handle video interviews natively inside the platform. Tacking on a third-party video call link and hoping applicants could navigate it wasn't going to cut it for an experience that needed to feel seamless and professional. That meant building WebRTC-based video and audio capability directly into the product, not trivial, but necessary if we wanted the whole journey to live in one place.
Finally, whatever we built had to work equally well on a desktop browser and a mobile phone. Applicants are not sitting at a desk waiting to hear back. Recruiters are often moving between locations. A solution that only worked well in one environment would quietly undermine everything else we were trying to do.
We built a cloud-native pre-hire automation platform on Microsoft Azure and .NET Core, designed from the ground up around the idea that every status change in an applicant's journey should trigger the next step automatically, no recruiter intervention required.
The workflow engine sits on Azure Functions with cron-triggered jobs that handle the daily heavy lifting: syncing applicant data, pushing status updates, firing off task assignments, and escalating anything that needs human attention. The moment an applicant completes a stage, the system knows, and the next step begins. What used to require someone to check their inbox and send a follow-up now just happens.
For real-time communication, we used Socket.IO backed by Redis to power the messaging layer across web and mobile. Applicants get push notifications and in-app updates at every stage. Recruiters get a live dashboard that shows exactly where every candidate stands, with automated alerts when action is actually needed rather than a constant stream of noise. The result is that HR teams spend their attention on genuine decision points, not administrative chasing.
The interview piece was handled with WebRTC and Kurento for the media server layer. This gave us browser-native video and audio interviews without routing candidates to an external tool. Scheduling, joining, and completing an interview all happen inside the platform, which keeps the experience clean and keeps the data centralized.
On the frontend we used React with Ant Design for the web application and Flutter for mobile, which let us share a good chunk of logic while delivering genuinely native-feeling experiences on each platform. The backend runs on Azure App Services with a containerized architecture using Docker and Kubernetes, so the system scales horizontally when hiring surges without anyone having to manually provision capacity. For monitoring we wired in PM2, Sentry, and custom analytics dashboards so we could catch issues early and give the client real visibility into system health as well as pipeline performance.
The numbers are hard to argue with. Daily throughput went from roughly three applicants to over a hundred. Monthly completions went from around a hundred to more than three thousand. The time it takes to move an individual applicant through the process dropped from five to seven business days down to one or two. And around 80% of the communication that recruiters used to handle manually is now fully automated.
What that means in practice is that the client can now scale hiring to meet demand rather than to meet the capacity of their HR team. They are processing in a single day what previously took an entire month, without adding headcount. The platform is running in production, the engagement is ongoing, and the architecture is built to grow alongside them.
