← The Machine Room · Case file 008: Recruitment Workflow & AI Candidate Intake In use since September 2025 · Sheet 1 of 9
Case file: Recruitment Workflow & AI Candidate Intake, hiring in three business units Drawing no. AH-CS-008

Before each management review, HR rebuilt the hiring status by hand. Now the system tracks every request from approval to joining as the hiring happens.

A recruitment workflow for a UAE engineering company of about 2,000 employees, built on the Microsoft 365 tools its staff already used. It went from the first meeting with HR to rollout in three business units in 101 days. An AI step turns each CV into a candidate record, and people make every hiring decision.

Request → approval → recruiter → CVs → shortlist
→ interview → feedback → offer → joining

Rolled out on 19 September 2025
with onboarding and training in three business units
331
Hiring requests processed
through the workflow Verified
Drawn byAbu Huraira Mukhtar
RoleLead, sole developer
Build window2025-06 to rollout, 2025-09
How long101 days, first HR meeting to rollout
Can raise requests49 hiring managers
OrganisationWithheld; UAE engineering firm
StatusIn use in three business units
SourceProject records and source code
Sheet 2 of 9: In briefThe case in four parts

01 · The short version

The problem
Hiring requests went to a vice president by email, and each business unit approved them its own way. Recruiters kept candidates in their own spreadsheets and CVs sat in inboxes, so managers had to ask HR for every update. Before each management review, HR rebuilt the status by hand.
What I built
One workflow from request to joining. A request reaches HR only once the required approvals are in; it then has an owner, a folder for CVs and a deadline at each key stage. An AI step turns each CV into a candidate record, and hiring managers shortlist or reject from a card in Microsoft Teams.
How it went
101 days from the first meeting with HR to rollout in three business units in September 2025. The workflow has processed 331 hiring requests, and creating a candidate record from a CV takes about 1 to 2 minutes of a recruiter’s time, down from about 10 Estimate.
What you’d get
The same method in your company: follow one hiring request from approval to joining, and give each step an owner and a deadline, with AI doing the data entry. The first version goes on the tools your team already uses.
Sheet 3 of 9: Field notesThe before-state

02 · Delays hid between the hand-offs

The executive vice president wanted to see where hiring stood and why it was slow. The answer was spread across inboxes and recruiters’ own files, so I started by mapping the process with the HR manager.

A request began as an email to a vice president, and each business unit ran its approvals its own way. Once that email was sent, a manager could expect HR to start sourcing while approvals were still open, so nobody could say when the hiring clock had started.

After approval, each recruiter tracked candidates, dates and remarks in a personal spreadsheet. CVs travelled as email attachments, and interview feedback forms were emailed out and chased by hand. When a hire ran late, the delay was argued in meetings from email chains, because no record showed which stage had taken the time.

Management saw a snapshot that HR assembled before each monthly review.

General notes
1. Three business units in one company of about 2,000 employees
2. 49 hiring managers can raise a request; three recruiters and an HR manager run hiring
3. Two of the units depend on site staff, so a late hire can hold up work for customers
4. Organisation withheld: detail available in interview
REQUEST · BY EMAIL APPROVAL · PER UNIT RECRUITER · OWN SHEET HIRE · JOINS SOURCING BEFORE APPROVAL CVS IN INBOXES FEEDBACK CHASED STATUS REBUILT BY HAND FOR EACH REVIEW A HIRE RUNS LATE · WHICH STAGE TOOK THE TIME? NO RECORD SAYS REQUEST · BY EMAIL APPROVAL · PER UNIT RECRUITER · OWN SHEET HIRE · JOINS SOURCING BEFORE APPROVAL CVS IN INBOXES FEEDBACK CHASED STATUS REBUILT BY HAND FOR EACH REVIEW A HIRE RUNS LATE · WHICH STAGE TOOK THE TIME? NO RECORD SAYS
Fig. 1: Where a hiring request lost time, as mapped with HRBefore the system
Sheet 4 of 9: Before and afterIn the workflow

03 · A rule at each hand-off

Each hand-off got a rule that the workflow enforces, and the decisions about candidates stayed with people.

Hand-offBeforeWith the system
Request → approvalAn email to a vice president, approved in each unit’s own wayA form creates the request with its own ID and sends it to the unit’s vice president; senior grades go on to the executive vice president
Approval → HRHR could be asked to start sourcing before approvalHR gets access only after the required approvals. The request is then assigned to the unit’s recruiter, with a folder for CVs and a sourcing deadline
CV → recordA recruiter read each CV and typed the record, about 10 minutes eachThe recruiter drops the CV in the request’s folder and an AI step creates the record, about 1 to 2 minutes of the recruiter’s time Estimate
Candidate → managerCVs went to managers by email, and answers came back the same wayEach manager gets one card in Teams listing everyone waiting for review, and shortlists or rejects there, with a reason for a rejection
Interview → feedbackFeedback forms were emailed out and chased by handAfter an interview, each panel member gets a feedback link tied to that interview, and HR is told when all of it is in
Key stage → deadlineDelays surfaced at the monthly reviewEach key stage has a deadline counted in weekdays. The workflow warns before it, and a missed deadline is escalated with the vice president copied
What managers and HR sawMessages the workflow sends, redrawn in outline with fictional details
Approval requestedFacsimile

A new hiring request needs your approval. Open the request to see it in full.

RequestMPR-OPS-031
PositionSite supervisor
Grade12
Positions2
RequesterOperations manager
JustificationTwo new sites
ApproveReject
1. The approval. The unit’s vice president approves, or rejects with a comment. A senior grade goes on to the executive vice president, and the recruiter gets access only once the approvals are done. IDs such as MPR-OPS-031 name the hiring request.
Candidates for your review · 3Facsimile

MPR-OPS-031 · Site supervisor

C04 · 9 yrs · site leadConfidence 82
ShortlistRejectView CV
C05 · 6 yrs · supervisorConfidence 74
ShortlistRejectView CV
C06 · 3 yrs · foremanConfidence 58
ShortlistRejectView CV
2. The daily review card. Each hiring manager gets one card in Teams listing everyone waiting. The score is advice; rejecting asks for a reason, and only the first answer for a candidate is recorded.
Deadline missedFacsimile

Interview feedback for MPR-OPS-031-C04 is past its deadline.

StageInterview feedback
StatusBreached
CopiedVice president, Operations
3. The escalation. A warning goes out before a deadline. Once it is missed, the people responsible are emailed with their vice president copied.
Sheet 5 of 9: Approval plateWhat the case rests on

04 · In use across three business units

331 requestsHiring requests processed through the workflowVerified
101 daysCalendar days from the first meeting with HR on 10 June 2025 to rollout in three business units on 19 September 2025Verified
10 → 1–2 minRecruiter time to create a candidate record from a CV, before and after the AI step. About 300 CVs have gone through itEstimate
People decideThe AI prepares the record and an advisory score; people make every hiring decisionVerified

How I’d start in your company

I’d start by following one hiring request from the manager’s first ask to the new hire’s first day.

That shows who has to approve it, when HR takes ownership, what each reviewer must do and where the delays hide. Those answers set the workflow and its deadlines. The first version runs on the tools your team already has, and AI takes on the data entry your recruiters should not be doing by hand.

Discuss a system like this
Sheet 6 of 9: General arrangement, version 2.0Drawing 008-A

05 · Built on the tools staff already had

The sponsor set the goal, visibility into hiring, and first pictured a shared tracker. After mapping the process with HR, I proposed building it into Microsoft 365, so approvals and notices would run on the accounts and Teams chats staff already used, with Python on Azure for the CV work.

In version 2.0, eleven Power Automate flows run the process over six SharePoint lists: requests, candidates, interviews, feedback, an AI log and a configuration list. Each flow does one job, and most hand over by changing a record’s status, so the process behaves like a state machine. Four kinds of event move it: a status change, a new file in a CV folder, a person’s action (a form, a card answer or a recruiter’s command in a Next action field), and a schedule for deadlines and review cards.

Confidentiality is set on each request and candidate record. When one is created, the flow stops it inheriting the site’s permissions and grants access to the people on it: the requester, the hiring manager and the approver, then the recruiter once the request is approved. A filtered view only hides rows on screen; these permissions decide who can open the record at all.

Deadlines count working days, weekends excluded, from the moment a stage starts. Deadline lengths, the grade that needs the executive vice president and each unit’s approver sit in the configuration list, so an administrator can change them without editing a flow.

Version 2.0
11 Power Automate flows, one job each
6 SharePoint lists; flows update records by internal ID, and people search by readable IDs such as MPR-OPS-031-C04
Permissions set per record on every request and candidate Verified
Forms for requests and feedback; Teams cards for review; Outlook for notices and invites
HR team: three recruiters and an HR manager
Version 2.0, as documented October 2025
NEED TO KNOW · REQUEST AND CANDIDATE RECORDS OPEN ONLY TO THE PEOPLE ON THEM MS FORMS REQUESTS, FEEDBACK POWER AUTOMATE · 11 FLOWS ONE JOB PER FLOW SHAREPOINT · 6 LISTS REQUESTS CANDIDATES INTERVIEWS FEEDBACK AI LOG CONFIGURATION AZURE FUNCTION PYTHON PDF · WORD CALLED WITH EACH NEW CV AZURE OPENAI 1 EXTRACT 2 FIND PII 3 ASSESS TEAMS · REVIEW CARD SHORTLIST / REJECT OUTLOOK · DEADLINES WARNING, THEN ESCALATION JSON BACK TO THE FLOW: CANDIDATE + 3 AI LOG ROWS FOUR TRIGGERS · STATUS CHANGE · NEW FILE · A PERSON'S ACTION · SCHEDULE NEED TO KNOW · REQUEST AND CANDIDATE RECORDS OPEN ONLY TO THE PEOPLE ON THEM MS FORMS REQUESTS, FEEDBACK POWER AUTOMATE · 11 FLOWS ONE JOB PER FLOW SHAREPOINT · 6 LISTS REQUESTS CANDIDATES INTERVIEWS FEEDBACK AI LOG CONFIGURATION AZURE FUNCTION PYTHON PDF · WORD CALLED WITH EACH NEW CV AZURE OPENAI 1 EXTRACT 2 FIND PII 3 ASSESS JSON BACK TO THE FLOW: CANDIDATE + 3 AI LOG ROWS TEAMS · REVIEW CARD SHORTLIST / REJECT OUTLOOK · DEADLINES WARNING, THEN ESCALATION FOUR TRIGGERS · STATUS CHANGE · NEW FILE · A PERSON'S ACTION · SCHEDULE
Fig. 2: The workflow’s general arrangementRequest path: form → flows → lists → CV function
Detail A, see fig. 2, where the work splits

Low code for the process, Python for the documents

Power Automate handles what Microsoft 365 does well: approvals, SharePoint events, Teams cards, email and calendar invites. Reading CVs needs real parsing and model calls, so that work sits in one Python function on Azure that the ingestion flow calls with the file.

Chose to split the work at the document, because files and personal data need more control than a low-code flow gives. Cost: two platforms, with one contract between them kept in step. Gained: the process stays in the Microsoft 365 tools the company already runs, and the CV code has its own tests.
Sheet 7 of 9: Section A-A, the CV pipelineDrawing 008-B: cut through one CV

06 · Personal details are replaced before the scoring

A recruiter drops a CV into the request’s folder. A Python function on Azure then makes three separate model calls, and code replaces the candidate’s personal details before the call that assesses them.

This three-call version was committed the week after rollout, on 24 September 2025, with its tests the next day. The ingestion flow wraps the call in try, catch and finally. A file the function rejects or cannot read is moved to a failed folder and logged, so a bad file cannot trigger the flow again and again; a CV that goes through moves on to the hiring manager’s review. The section below follows one fictional CV.

CV · DROP READ · TEXT 1 · EXTRACT 2 · REDACT 3 · ASSESS PDF OR WORD → TEXT (OCR FOR SCANS) → THREE MODEL CALLS ONE CV · WHAT EACH STEP RETURNS AND WHAT IT READS DETAILS REPLACED IN CODE BEFORE STEP 3 STEP RETURNS READS AI LOG READ 2 PAGES OF TEXT · SPECIMEN CV, FICTIONAL THE FILE · EXTRACT NAME · EMAIL · PHONE · SITE SUPERVISOR · 9 YRS ORIGINAL ROW 1 FIND PII NAME ×2 · EMPLOYER ×2 · SCHOOL · ADDRESS ORIGINAL ROW 2 REPLACE [CANDIDATE_NAME] · [COMPANY_1] · [UNIVERSITY_1] CODE, NO MODEL · ASSESS SKILLS · EXPERIENCE · FIT SCORE · ADVICE ONLY REDACTED TEXT ROW 3 AI LOG ROWS FOR THIS CV · STAGE, MODEL, PROMPT, TOKENS, TIME, OUTCOME 0 1 2 3 THE SCORE IS ADVICE · THE HIRING MANAGER SHORTLISTS OR REJECTS IN TEAMS ONE CV'S PATH · DROP → RECORD · EVERY MODEL CALL LOGGED WITH ITS STAGE, TOKENS AND TIME CV · DROP READ · TEXT 1 · EXTRACT 2 · REDACT 3 · ASSESS PDF OR WORD → TEXT (OCR FOR SCANS) → THREE MODEL CALLS ONE CV · WHAT EACH STEP RETURNS AND WHAT IT READS DETAILS REPLACED IN CODE BEFORE STEP 3 STEP READS AI LOG RETURNS READ THE FILE · 2 PAGES OF TEXT · SPECIMEN CV, FICTIONAL EXTRACT ORIGINAL ROW 1 NAME · EMAIL · PHONE · SITE SUPERVISOR · 9 YRS FIND PII ORIGINAL ROW 2 NAME ×2 · EMPLOYER ×2 · SCHOOL · ADDRESS REPLACE CODE, NO MODEL · [CANDIDATE_NAME] · [COMPANY_1] · [UNIVERSITY_1] ASSESS REDACTED TEXT ROW 3 SKILLS · EXPERIENCE · FIT SCORE · ADVICE ONLY AI LOG ROWS FOR THIS CV · STAGE, MODEL, PROMPT, TOKENS, TIME, OUTCOME 0 1 2 3 THE SCORE IS ADVICE · THE HIRING MANAGER SHORTLISTS OR REJECTS IN TEAMS ONE CV'S PATH · DROP → RECORD · EVERY MODEL CALL LOGGED WITH ITS STAGE, TOKENS AND TIME
Fig. 3: Section A-A, one CV through the pipelineSpecimen CV is fictional; the stages and placeholders are the code’s
Beat 1: the recruiter’s whole part

1Drop

The recruiter saves the CV in the request’s New CVs folder. The flow checks for new files every minute, reads which request the file belongs to from its folder, and sends the file to the function with the job title.

Beat 2: text first

2Read

PDFs are converted page by page, and a page whose opening text is missing from the conversion gets its raw text added back. Since December 2025, a PDF averaging under 50 characters a page is treated as a scan and read with OCR. Word files are read directly; other file types, and files over the size limit, are refused.

Beat 3: the profile

3Extract

The first call returns the candidate’s profile as JSON that has to match a strict schema: name, contact details, current title, experience and qualifications. Pattern matching fills in any email address, phone number or profile link the model misses.

Beat 4: find, then replace in code

4Redact

The second call only lists the personal details it finds, such as names, employers, schools, addresses and ID numbers, with every spelling of each. Code then replaces them, longest first, with placeholders such as [CANDIDATE_NAME] and [COMPANY_1]. The model points at the text; code does the replacing, the same way every time.

Beat 5: advice, then a person

5Assess

The third call reads only the redacted text and returns skills, experience and a fit score against the job. Each call writes a row to the AI log with its stage, model, prompt, tokens, time and outcome, and the candidate record is created under the request with its own ID. The score is advice. The hiring manager shortlists or rejects.

Detail B, one decision per candidate

The first answer wins

A review card stays in the manager’s chat, so it can be answered twice. The flow that receives the answer checks whether a decision is already recorded before it writes one, then confirms back to the manager.

Chose to record only the first decision for a candidate, because a double click must not send one candidate two outcomes. Cost: the check depends on one field staying empty until a decision, a rule every flow has to keep. Gained: one decision per candidate, whoever answers first.
Detail C, two keys per record

Readable IDs for people, internal IDs for flows

People work with IDs such as MPR-OPS-031 and MPR-OPS-031-C04, which show the unit, the request and the candidate at a glance. Every flow updates records by SharePoint’s internal item ID.

Chose to update records only by the internal ID, because a readable ID is text that can be typed wrong or duplicated, and an update must reach exactly one record. Cost: each record carries two keys. Gained: every update addresses one record, whatever people type.
Sheet 8 of 9: Revision historyBefore and after rollout

07 · What changed once real CVs arrived

The workflow lost one manual step on the way to version 2.0, and the CV pipeline learned from the CVs people actually send.

Real CVs arrive as scans and two-column layouts, and each change below taught the pipeline to read them. Each row traces to a commit or to the project’s own documents.

Rev.
Part, date
What we found
What changed
Trace
A
Workflow
v2.0
AssignmentThe first version had the HR manager assign each approved request to a recruiter from a Teams card, a manual step between approval and sourcing.
Assign by ruleEach unit’s approved requests now go straight to its recruiter, and the sourcing deadline starts at approval.
Flow notes, Jul 2025; changelog 2.0.0
B
CV pipeline
2025-11
One failure lost all; lost headersIf one model call failed, the whole CV failed with it. The PDF-to-Markdown conversion could also drop a CV’s header or sidebar, where the name and contact details often sit.
Fail by stage; check the textThe error is now logged against the stage that failed, and the fields returned before it are kept. Each page’s converted text is checked against its raw text, which is added back when its opening is missing.
Commit 19775a6
C
CV pipeline
2025-12
ScansA scanned PDF has no text layer, so there was nothing to extract.
OCR as a fallbackA PDF averaging under 50 characters a page is read with Azure Document Intelligence instead, with a paid tier behind the free one when its quota runs out.
Commits 894254c, b485f11
D
CV pipeline
2025-12
Header checkAdding OCR in row C dropped row B’s page-by-page check for missing headers and sidebars.
RestoredThe check against raw text runs on every page again.
Commits 894254c, 3fd23d3
Engineering recordChecked in the repository and its documentation
3Model calls per CV, each with its own instructions and a strict JSON schema: extract, find personal details, assessVerified
11Power Automate flows in the version 2.0 design, each doing one job, most handing over through a record’s statusVerified
54Test functions written with the September 2025 pipeline, 16 of them in its personal-data suiteVerified
Sheet 9 of 9: Close-outFor your company

08 · What a version for your company adds

The workflow runs in three business units and records each request’s stages and deadlines as the hiring happens.

Every request carries live counts from its candidates, and integrity checks flag records that need a second look, such as a candidate marked as joined with no joining date. A version for your company starts from the same method, an owner and a deadline at every step, and adds what your hiring needs.

Scope
Units: three, in a company of about 2,000
Requests: 331 processed
CVs: about 300 through the AI step
Decisions: people make every one
Row
Part
In use
Your version adds
A
Requests
Tracked to joiningEvery request followed from approval to joining, with a deadline at each key stage
Hiring speedTime to hire and approval time, reported by unit from the first month
B
Management view
Live counts and checksCounts on each request, and checks that flag records for review
One dashboardOpen requests, their stages and missed deadlines across every unit
C
CV intake
Details replaced in codeThree model calls per CV, with personal details replaced before the assessment
Your privacy rulesWhich details are replaced, and how long the AI log keeps CV text, set by your policy
D
Decisions
People decideThe AI score is advice; managers shortlist or reject in Teams
Calibrated scoresScores reviewed with HR against real hiring outcomes
E
Deadlines
Working daysEvery deadline counted in working days, weekends excluded
Your calendarYour public holidays and working week in every deadline
Discuss a system like this
Drawn & built by
Abu Huraira Mukhtar, sole developer, 2025
A. H. M.
Sheet 9 of 9
End of case file 008
The Drawing Office: after hours

When hiring runs on email, give each request one record and an owner at every step.

If your managers ask HR for every update and your reviews start by rebuilding the status, the fix starts with one request traced from approval to joining. Bring one.

Contact me Back to the Machine Room