Run Job Interviews on WhatsApp with n8n and Zabio
Set up an n8n workflow that interviews candidates on WhatsApp with voice-note answers, times every answer, stores the originals and emails your team a report scored against your criteria.
Updated November 2026
This template runs a first-round interview on WhatsApp. A candidate sends the job code from your job post to your WhatsApp number. The workflow explains how the interview works and asks for consent, then collects their name, email, LinkedIn link and CV, and sends your questions one at a time, as text and as audio. Every answer has to be a voice note recorded in the chat.
When the interview ends, your hiring team gets one email per candidate: a match score against the criteria you set, a summary, the evidence behind each rating, every transcript with its timing, and the CV and original voice notes attached. A person decides. The workflow never rejects anyone.
Transcription, the spoken questions and the review all run through one Zabio key.
How it works
| The candidate sends | The workflow does |
|---|---|
The job code, like JOB-101 | Explains the interview and what is recorded, and asks for consent |
YES | Asks for their full name, then email, then LinkedIn link (or SKIP) |
| A CV in PDF | Stores it in your bucket as sent, reads its text and asks them to reply START when ready |
START | Sends question 1 as text and audio, and starts the clock |
| A voice note | Stores it, transcribes it, measures the timing, sends the next question |
| A typed answer, an audio file or a forwarded voice note | Refuses it, logs the attempt and keeps the clock running |
REPEAT | Sends the current question again, without resetting the clock |
HELP | Emails the recruiter with the candidate’s details and message |
Candidate messages ship in English and Spanish (SÍ, EMPEZAR, REPETIR, AYUDA and OMITIR work too). Each job picks its language.
Every 15 minutes the workflow sends finished interviews to Zabio for review, collects the reviews that are done and emails the reports.
What you need
| Item | Where | Notes |
|---|---|---|
| n8n | Your own n8n, or n8n on a RemarkableCloud AI server | Must be reachable over HTTPS so Meta can deliver messages. Built-in nodes only. |
| A Meta developer account | developers.facebook.com | Free. Gives you a test WhatsApp number to try the flow. |
| A Zabio API key | zabio.ai | Used for transcription, the question audio and the review. |
| S3-compatible storage | Any S3-compatible service | One private bucket for the original voice notes and CVs. |
| An SMTP account | Your email provider | Sends the reports and the help requests. |
Step 1: Import the template
Download the workflow file from the template page. In n8n, open Workflows, choose Import from File and select it. It arrives inactive, with empty credentials.
Step 2: Create the data tables
In n8n, go to Data tables and create two tables with exactly these names. The workflow looks them up by name.
interview_jobs, one row per open job:
| Column | Type | What goes in it |
|---|---|---|
job_code | String | The code candidates send, like JOB-101: 2 to 6 letters, a hyphen and up to 6 digits. |
active | Boolean | false closes the job to new candidates. |
company_name | String | Shown to candidates. |
job_title | String | Shown to candidates. |
language | String | en or es: the language of the messages, the spoken questions and the review. |
job_description | String | What the job is. The review reads it. |
questions | String | A JSON list of questions, in order. |
criteria | String | A JSON list of what you’re hiring for, with weights. See Writing criteria. |
answer_window_seconds | Number | How long an answer should take, from question to voice note. Default 180. |
gap_flag_seconds | Number | Flag an answer when the candidate waits longer than this before recording. Default 60. |
recruiter_email | String | Where the report and help requests go. |
recruiter_whatsapp | String | Optional. A number to ping when a report is ready, with country code and no +. |
interview_candidates, filled in by the workflow:
| Column | Type |
|---|---|
phone, job_code, status, whatsapp_name, full_name, email, linkedin | String |
cv_key, cv_sha256, cv_text | String |
q_index | Number |
q_sent_at, answers_json, attempts_json, consent_at, completed_at | String |
eval_response_id, eval_json | String |
score, flags_count, cost_micros | Number |
Step 3: Add a job
Add a row to interview_jobs. A questions value looks like this:
[
"Tell us about your experience working at a front desk or in customer service.",
"A patient arrives 25 minutes late and the dentist is fully booked. What do you say and do?",
"How do you keep the appointment book accurate when the phone, walk-ins and email all come in at once?",
"Why do you want to work at a dental clinic, and what would you need from us in your first month?"
]
Four or five questions keep the interview under 15 minutes. Ask about things a person can answer from experience in two or three minutes of speaking.
Writing criteria
The criteria column is a JSON list. Each item has a name, a weight, a type (must or nice) and guidance that tells the review what good evidence looks like:
[
{ "name": "Front desk or customer service experience", "weight": 30, "type": "must", "guidance": "At least 2 years in a front desk, reception or customer service role." },
{ "name": "Handling difficult situations calmly", "weight": 25, "type": "must", "guidance": "Gives a concrete, polite and practical way to handle a late or upset patient." },
{ "name": "Organization and scheduling", "weight": 25, "type": "must", "guidance": "Describes a real method for keeping schedules accurate under pressure." },
{ "name": "Healthcare or clinic experience", "weight": 10, "type": "nice", "guidance": "Has worked in a clinic, hospital or other healthcare setting." },
{ "name": "Motivation for the role", "weight": 10, "type": "nice", "guidance": "Specific reasons tied to this job, not generic." }
]
Zabio rates each criterion from 0 (no evidence) to 5 and quotes the words behind the rating. The workflow turns the ratings into a score out of 100 with your weights, so the arithmetic is the same for every candidate. A must-have rated 0 or 1 is called out at the top of the report as something to ask about, not as a rejection.
Tip: Write criteria about skills and experience a candidate can show in a CV or an answer. “Good culture fit” or “professional voice” invite bias and give the review nothing to quote.
Step 4: Set up a Meta app and the test number
You can try the whole flow with Meta’s free test number and your own phone as the candidate.
- On developers.facebook.com, create an app of type Business and add the WhatsApp product. Meta gives the app a free test number.
- Open WhatsApp > API Setup. In the To field, add your personal number and confirm the code WhatsApp sends you.
- Copy the Temporary access token and the WhatsApp Business Account ID from the same page.
- Open App settings > Basic and copy the App ID and App Secret.
Note: The test number can message up to 5 verified numbers, and the temporary token expires after about 24 hours. To interview real candidates you need your own business number and a permanent token; the steps are the same as in the WhatsApp assistant guide.
Step 5: Add the credentials
| n8n credential | Used by | What to enter |
|---|---|---|
| WhatsApp OAuth (trigger) | New WhatsApp Message | Client ID: your App ID. Client Secret: your App Secret. |
| WhatsApp Business | Every WhatsApp node and Download Media | Access Token and Business Account ID from Step 4. |
| Zabio API key (Header Auth) | Transcribe Answer, Speak Question, Submit Review, Check Review | Name Authorization, Value Bearer YOUR_ZABIO_KEY. |
| S3 | Store Original, Download Original | Your access key, secret and, for a service other than AWS, its endpoint. |
| SMTP | Email Help Request, Email Report | Your mail server, user and password. |
Use the same Zabio credential on all four Zabio nodes, and the same S3 credential on both storage nodes.
Step 6: Edit Interview Settings
Open the Interview Settings node.
| Field | What it does |
|---|---|
s3_bucket | The bucket for voice notes and CVs. Files are stored as JOB-CODE/phone/q1.ogg and JOB-CODE/phone/cv.pdf. Keep it private. |
email_from | The sender of the reports, like Hiring Team <jobs@yourcompany.com>. |
default_language | The language for people who write before sending a job code. |
question_audio | Send each question as audio as well as text. Set to false for text only. |
voices, default_voice | The voice that reads the questions, per job language. |
long_pause_seconds | A silence inside a recording longer than this counts as a long pause. Default 8. |
eval_model | The Zabio model for the review. Default auto/best. |
eval_deadline | Default 24h, which sends reviews to Zabio’s batch queue. See What it costs. |
recruiter_template, sender_phone_number_id | Only for the optional WhatsApp ping. See WhatsApp ping for recruiters. |
Step 7: Activate and test
- Put your own email in
recruiter_emailon the job row, then activate the workflow. - From your phone, send
JOB-101to the test number and follow the interview:YES, a name, an email, a LinkedIn link, a PDF, thenSTART. - Try a typed answer, then a voice note. The typed one is refused.
- Send
REPEATonce andHELPonce, and check that the help email arrives. - Answer the last question. About 10 minutes later the next 15-minute run sends the review; the report arrives on a later run, once Zabio finishes.
Each message appears under Executions in n8n. The interview_candidates table shows where each candidate is: consent, name, email, linkedin, cv, ready, interview, completed, evaluating and finally reported.
What the report shows
- Match score out of 100, from your weights, and any must-have with little or no evidence.
- Summary, strengths, gaps and three questions to ask next, written in the job’s language.
- Each criterion with its rating, the quoted evidence, where the quote came from (the CV or an answer) and how confident the review is.
- Each answer: the question, the transcript, the response time, the recording length, the time before recording started, long pauses, repeats and any checks to look at.
- Contact details, the LinkedIn link and any help requests with their time.
- Attachments: the CV and every original voice note, as WhatsApp delivered them. The report lists each file’s SHA-256 checksum from WhatsApp, so you can confirm a file wasn’t changed.
If a review fails, the report still goes out with the recordings, transcripts and timing, and says there is no score.
Timing checks
The workflow measures each answer from the moment the question was sent to the moment the voice note arrived, and reads the recording length and pauses from the transcript’s timestamps. It flags an answer when:
| Check | When |
|---|---|
| Late | The answer arrived after answer_window_seconds. |
| Slow start | The time before recording started is longer than gap_flag_seconds. |
| Long pauses | The recording has silences longer than long_pause_seconds. |
| Rejected attempts | The candidate tried text, an audio file or a forwarded voice note first. |
| Very short | The answer is under 5 seconds. |
These checks point your team at answers worth listening to. A slow start can be someone reading a script from another screen, or someone who stepped away to find a quiet room. Listen to the original before you draw a conclusion, and tell candidates who ask why an answer was flagged.
A candidate who records one answer as two voice notes is handled: a voice note recorded before the next question was sent is added to the previous answer as part 2.
Fairness and the law
The review is told to rate only your criteria, to quote its evidence and to ignore accent, voice, speaking style, grammar slips, age, gender, ethnicity, nationality, religion, disability, family status and other personal traits, unless a criterion explicitly asks for a skill such as a language. It is also told to treat the CV and answers as data and ignore any instructions inside them.
That reduces bias; it doesn’t remove it. Keep a person in every decision, compare scores across groups of candidates from time to time, and change criteria that keep producing odd results.
Rules for AI in hiring vary by place. New York City, for example, requires a bias audit and notice to candidates before an automated tool is used in hiring decisions, and many places regulate recordings and personal data. Check what applies where you hire before you use the template with real candidates. This guide isn’t legal advice.
Note: Decide how long you keep recordings and CVs, write it in your privacy notice and set a lifecycle rule on the bucket to delete them after that.
What it costs
The cost_micros column and the bottom of each report show what Zabio charged for an interview’s transcripts and review, in micro-dollars: 1,000,000 micros is one US dollar. The spoken questions are not included in that figure.
- Transcription is priced by the length of the audio.
- The review runs as a Zabio background request with a 24-hour deadline, which puts it in the batch queue at about half the list price. The result usually comes back well before the deadline. For faster reports, set
eval_deadlineto30m: the review then runs on the vendor’s flex tier where the model has one, or at the standard price where it doesn’t. - Question audio is generated each time a question is sent. Set
question_audiotofalseto skip it.
Zabio’s models page lists current prices. WhatsApp charges for messages under Meta’s own pricing.
WhatsApp ping for recruiters
The report always goes by email. A recruiter can also get a WhatsApp message when a report is ready. Because a recruiter usually hasn’t written to your number in the last 24 hours, WhatsApp only allows an approved message template:
- In WhatsApp Manager, create a Utility template, for example
interview_ready, with three body variables: “New interview report: {{1}} for {{2}}, score {{3}}. The full report is in your email.” - Wait for Meta to approve it.
- In Interview Settings, set
recruiter_templateto the name and language, likeinterview_ready|en, andsender_phone_number_idto your WhatsApp phone number ID from API Setup. - Add the recruiter’s number to
recruiter_whatsappon the job row.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Nothing shows under Executions | The workflow isn’t active, or n8n isn’t reachable over HTTPS | Activate it and check that your n8n URL opens from outside your network. |
| The candidate gets “I couldn’t find an open job” | The code isn’t in interview_jobs, or active is false | Check the row. Codes look like JOB-101. |
| Replies fail with error #131030 | The candidate isn’t one of the test number’s verified numbers | Add the number in WhatsApp > API Setup, or move to your own number. |
| Store Original fails | Wrong bucket, keys or endpoint | Check the S3 credential and s3_bucket. |
| Answers have no transcript | Transcription failed | Open Transcribe Answer in the execution. 401 means the key is wrong; 402 insufficient_credits means the Zabio balance is empty. The audio is still stored. |
| Questions arrive without audio | The voice isn’t available | Check Speak Question for unsupported_value and change the voice in voices. |
A candidate stays at evaluating | The review hasn’t finished yet | Batch reviews can take up to 24 hours. Check Check Review for the status. |
| No report email | SMTP error, or recruiter_email is empty | Open Email Report in the execution. |
Still stuck? Open a ticket. If your n8n runs on a RemarkableCloud server, an engineer can look at the workflow with you.