← All work
Recruitment · B2B SaaSSole developer and product ownerIn production

Recrou

AI-native applicant tracking system

Next.js 15
React 19
TypeScript
PostgreSQL / Prisma
Google Gemini
BullMQ
Chrome extension
KVKK / GDPR
Template-driven pipelines, where adding a note advances a candidate and marking one unreachable returns them to pre-screening instead of dropping them.
Template-driven pipelines, where adding a note advances a candidate and marking one unreachable returns them to pre-screening instead of dropping them.

A recruitment operation running on spreadsheets and a shared inbox now runs on one system that parses every CV, tracks every candidate through a configurable pipeline, and proves KVKK consent on demand.

Client context

The client is a Turkish technology and staffing company that recruits on behalf of enterprise employers across industrial, energy, and technology sectors. They run dozens of concurrent hiring projects, each with its own approval chain, and each producing hundreds of inbound CVs in mixed Turkish and English.

The client and their end customers are anonymised throughout this case study. Screenshots use pseudonymised candidate and project data.

The operational challenge

Recruitment agencies fail at the seams, not at the sourcing. This operation had five specific ones:

  1. Candidate data arrived from everywhere and settled nowhere. LinkedIn Recruiter, Kariyer.net, emailed CVs, and referrals each landed in a different place, with no shared record of who had already been contacted.
  2. Manual data entry was the bottleneck. Reading a CV and retyping it into a tracking system cost minutes per candidate — a cost that scales linearly with volume and introduces transcription errors.
  3. Pipeline state lived in spreadsheets. Nobody could answer "where is this candidate right now" without asking the recruiter who owned them.
  4. KVKK compliance was informal. Turkey's data protection law requires explicit, evidenced consent. It was being collected over email, with no timestamped record tying a consent text to a candidate.
  5. Reporting was reconstructed by hand at the end of each search, from memory and message history.

Product strategy

The product did not begin as an ATS. It began as a narrower CV-parsing tool that turned resumes into structured data — a single job, done reliably, already in production use.

The strategic decision was to treat that parser as infrastructure rather than the product. Parsing a CV is only valuable if something happens next. Extending the existing authentication, multi-tenancy, credit-metering, and file-storage layers into a full applicant tracking system meant the recruitment features could be built on proven foundations instead of rebuilt alongside them.

That reframing — from "CV parser" to "the system the hiring process runs in" — turned a utility into a platform.

The core solution

Recrou is a multi-tenant, bilingual (Turkish/English) applicant tracking system with AI embedded at four distinct points, not bolted on as a chat window:

Around that sit the parts that make it an operating system rather than a demo: configurable pipeline templates, stage-entry email automation, interview scorecards, offer and scheduling links, SLA monitoring, webhooks, audit logging, and a credit ledger that meters AI spend per tenant.

Primary workflows

Sourcing to structured record. A recruiter clicks a button on a LinkedIn Recruiter or Kariyer.net profile using the companion Chrome extension, or uploads a CV, or imports a CSV. The system checks whether that person is already active in another pipeline before creating a duplicate, queues the parse job, debits a credit, and produces a structured candidate.

Pipeline movement that automates itself. Stages come from templates — a short default pipeline or a full one with technical interviews, case studies, and reference checks. Two automations encode how recruiters actually behave: adding a note advances the candidate to Interview (forward-only, so it never drags someone backwards from a later stage), and marking a candidate unreachable emails them and returns them to Pre-Screening rather than dropping them out of the funnel.

Compliance as a first-class object. KVKK consent is requested through a tokenised public page, with the disclosure text, consent text, IP address, and timestamp stored as evidence. Consent status is a column in the candidate pool, not a note in someone's inbox.

My role

Sole developer and product owner. All 409 commits on the repository are mine, across a nine-month build. That covered product definition and specification, data modelling, backend and frontend implementation, the Chrome extension, AI prompt design and evaluation, KVKK compliance design, infrastructure and deployment, and direct customer feedback cycles.

Technical approach

Next.js 15 (App Router) and React 19 on TypeScript; PostgreSQL via Prisma with 48 models and 36 migrations; BullMQ and Redis for parsing and email queues; MinIO and Cloudflare R2 for documents; Resend for mail; full Turkish/English localisation.

Two decisions are worth a buyer's attention.

Authorisation is resolved per request, not baked into the session token. Permissions are two orthogonal axes — what a user may do (18 discrete permission keys, either from a system role or a fully custom role) and where they may do it (all company projects, or only projects they belong to). Resolving this from the database on each request costs one cached query and means a permission change takes effect immediately rather than after a token expires. In a system where an admin revokes access because someone left, that difference matters.

The natural-language query feature generates SQL behind a guardrail layer. Mutation keywords, statement chaining, comments, catalog tables, and dangerous functions are all rejected before execution; queries must target an allow-listed set of tables, must carry a LIMIT, and the tenant filter is bound as a parameter rather than interpolated by the model — so a prompt-injected query cannot cross a company boundary. Personal columns are excluded unless a user explicitly asks for names.

Outcomes

The system is the operational system of record for the client's recruitment: thousands of candidate records across dozens of concurrently active hiring projects, each carrying pipeline history, consent evidence, and an activity trail. Concretely:

No time-saved or revenue percentages are claimed here. The client has not published measured before/after figures, and inventing them would be worse than omitting them.


Need a similar product or workflow? I build AI-native internal systems — document extraction, multi-role B2B workflows, and compliance-evidenced data handling — from specification through production. Let's talk about what your operation still runs in spreadsheets.

Screens

Ask Recrou — recruiters query their own pipeline in Turkish or English; the model emits SQL that passes a guardrail layer before execution.
Ask Recrou — recruiters query their own pipeline in Turkish or English; the model emits SQL that passes a guardrail layer before execution.
A candidate record parsed from a CV, with pipeline history, consent evidence and activity trail.
A candidate record parsed from a CV, with pipeline history, consent evidence and activity trail.
One searchable candidate pool replacing per-recruiter spreadsheets — consent status is a column, not a note in someone's inbox.
One searchable candidate pool replacing per-recruiter spreadsheets — consent status is a column, not a note in someone's inbox.
Operations dashboard across dozens of concurrently active hiring projects.
Operations dashboard across dozens of concurrently active hiring projects.
18 discrete permissions resolvable into fully custom roles, on two orthogonal axes — what you may do and where you may do it.
18 discrete permissions resolvable into fully custom roles, on two orthogonal axes — what you may do and where you may do it.
Pipeline templates, from a short default to a full chain with technical interviews, case studies and reference checks.
Pipeline templates, from a short default to a full chain with technical interviews, case studies and reference checks.
Reporting and SLA monitoring that surface stalled candidates without anyone asking.
Reporting and SLA monitoring that surface stalled candidates without anyone asking.

Captured against a non-production environment. Candidate names, contact details, photographs and customer identifiers were replaced before capture.

Architecture

System contextscroll to explore
Sourcing to hirescroll to explore
← Back to all work