Try it — step by step
Create a login, shortlist a candidate, and watch WhatsApp fire in real time. The player below walks the whole process; do it yourself on the live app.
► Watch the full video walkthrough →
- Open the app & create your loginGo to wcapp.fcits.ae and sign up with an email and password — takes a few seconds.
- Open the CV boardYou'll see incoming candidates with name, role and an AI match score.
- Pick a candidate & click “Select CV”The button securely POSTs to the action endpoint.
- WhatsApp fires in ~2 secondsThe Cloud API sends the approved template to the recruiter — and the candidate.
- Reply & trackReplies and delivery receipts route back through the webhook into your CRM.
👤 Candidate: Sana K.
💼 Role: Sales Executive
📌 Position: Sales — Dubai
Open the dashboard to review the full profile. 9:41 ✓✓
Every screen, step by step
The full flow, screen by screen — exactly what you'll do on wcapp.fcits.ae. The complete video walkthrough lives on the WhatsApp services page.
Open the app and sign up with your email, a password and your company — takes seconds.
Sign in with the credentials you just created.
See your roles, candidate pipeline and how many WhatsApp alerts have fired.
Incoming candidates with name, role and an AI match score.
Visa Employment · transferable
Languages English, Arabic, Hindi
Experience 6 yrs · Dubai retail
Open the profile — match score, visa status, languages and fit at a glance.
The button securely calls the API and fires the WhatsApp template in ~2 seconds.
👤 Candidate: Sana K.
💼 Role: Sales Executive
📌 Position: Sales — Dubai
Open the dashboard to review the full profile.9:41 ✓✓
The recruiter's phone buzzes with the approved template instantly.
The candidate is notified automatically — replies route back through the webhook.
How it works
The four key files
api/cv-selected.js
The endpoint the button hits. Validates shared secret, calls WhatsApp, returns the message ID.
lib/whatsapp.js
Single source of truth — sendTemplateMessage() and sendTextMessage() against Meta Graph v23.0.
api/webhook.js
Receives inbound replies and delivery / read receipts. Handles Meta's verify handshake.
public/ai/cv-board.html
Drop-in UI with working Select CV buttons that POST to the action endpoint.
The core send function
// lib/whatsapp.js
const URL = `https://graph.facebook.com/v23.0/${PHONE_ID}/messages`;
async function sendTemplateMessage(to, templateName, languageCode, bodyParams = []) {
const payload = {
messaging_product: 'whatsapp',
to,
type: 'template',
template: {
name: templateName,
language: { code: languageCode },
components: [{
type: 'body',
parameters: bodyParams.map(t => ({ type: 'text', text: String(t) }))
}]
}
};
const res = await fetch(URL, {
method: 'POST',
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
return res.json();
}
The action trigger
// api/cv-selected.js — fires when "Select CV" is clicked
module.exports = async function handler(req, res) {
if (req.headers['x-api-secret'] !== process.env.API_SHARED_SECRET)
return res.status(401).json({ error: 'Unauthorized' });
const { candidateName, candidateRole, candidatePhone, jobTitle, recruiterName } = req.body;
// 1) Ping the recruiter
await sendTemplateMessage(
process.env.RECRUITER_WHATSAPP_NUMBER,
'cv_selected_alert', 'en',
[recruiterName, candidateName, candidateRole, jobTitle]
);
// 2) Optionally notify the candidate
if (candidatePhone) {
await sendTemplateMessage(
candidatePhone, 'candidate_shortlisted', 'en',
[candidateName, jobTitle]
);
}
res.status(200).json({ ok: true });
};
The approved template body
Hi {{1}}, a new CV was just shortlisted on azizsaif.com/ai.
👤 Candidate: {{2}}
💼 Role: {{3}}
📌 Position: {{4}}
Open the dashboard to review the full profile.
Submit this in Meta Business → WhatsApp Manager → Message Templates under category UTILITY. Approval typically takes under 5 minutes.
Setup in 15 minutes
- Create a Business app at developers.facebook.com and add the WhatsApp product.
- Copy the Phone Number ID, Business Account ID, and a temporary token from API Setup.
- In Business Settings → System Users, generate a permanent token with
whatsapp_business_management+whatsapp_business_messaging. - Create the two templates (
cv_selected_alert,candidate_shortlisted) and wait for approval. - Set the webhook callback to
https://azizsaif.com/api/webhookwith your verify token, subscribe tomessages. - Deploy to Vercel —
vercel --prod— and add all env vars.
The code
The complete source — Node.js, Express, front-end, templates, Meta setup guide — lives in this repo:
- GitHub: ai-cv-whatsapp-trigger
- Full README with deploy steps
- api/cv-selected.js — the trigger
- lib/whatsapp.js — the Graph API client
Where this fits in the recruitment stack
- CV intake — candidates upload via cvfast or the recruiter dashboard.
- Shortlist — recruiter clicks Select CV → this trigger fires.
- Engage — WhatsApp template lands in the candidate's phone within seconds.
- Convert — replies route back through
/api/webhookinto Supabase / Asana for follow-up.
You don't program it. You show it once.
Behind this pipeline is the engine it runs on: a Stackbirds agent learns a recruiter's job by watching it done once — then repeats it forever, on its own. Same idea as the trigger above: show the task, don't script it. stackbirds.xyz ↗
Watch
A recruiter screens one batch of CVs once — the agent records every rule, score and decision.
Learn
It self-trains on your exact criteria, tone and edge cases — visa status, languages, role fit. No prompting each time.
Run
It runs the whole pipeline 24/7 — firing the WhatsApp trigger included — and hands anything unusual back to a human.