When to use this
After you invite candidates, you often want to know where they drop off in the funnel: did they even open the email? Click the link? Start recording? Answer question 1 but not question 2? Hireflix doesn’t expose a single “funnel” endpoint, but you can reconstruct the full journey by combining:- Webhooks for invite creation and interview completion.
- The
trackingHistoryGraphQL field for email or SMS delivery events (sent, delivered, opened, clicked). - The
stepExecutionsGraphQL field for per-question progress.
There are no webhooks for individual question submissions. Per-question progress requires polling the API on a schedule you choose (for example, every few minutes for active interviews).
The funnel at a glance
Step 1: Capture invites in real time
Subscribe to theinterview.create webhook. It fires the moment an invite is sent, giving you the interview.id you’ll use for every follow-up query.
See Receiving Webhooks from Hireflix for the full setup and payload example. Store the returned id (and optionally the candidate.email and position.id) in your own database so you can look up the interview later.
Step 2: Track email and SMS delivery events
Query thetrackingHistory field on an interview to see how the candidate is engaging with the invitation itself: sent, delivered, opened, and clicked.
How to interpret the events:
SENT→ Hireflix has queued the invite for the provider.DELIVERED→ The provider confirmed delivery to the candidate.OPENED→ The candidate opened the invitation (email tracking pixel).CLICKED→ The candidate clicked the interview link.BOUNCED→ The invitation could not be delivered.
Step 3: Detect per-question drop-off
Once a candidate clicks through, usestepExecutions to see exactly which question they reached. Each entry represents one step of the interview flow.
Example responses:
- Not started
- Started (Q1 completed)
- Completed all questions
The candidate hasn’t submitted an answer for question 1
stepIndex: 0 and question 2 stepIndex: 1.- Each
stepIndexmaps to one question in the position, in order. status: COMPLETEDmeans the candidate submitted an answer for that step.status: NOT_STARTEDmeans they haven’t submitted an answer yet.- The last
COMPLETEDstep is the furthest point the candidate reached. The nextNOT_STARTEDstep is where they dropped off.
Deriving “started but not finished”
There is no explicit “interview started” event. The reliable proxy is:interview.createhas fired (invite exists).- At least one
stepExecutionsentry hasstatus: COMPLETED. interview.finishhas not fired yet (the interview is stillpending).
Step 4: Capture completions in real time
Subscribe to theinterview.finish webhook. It fires when the candidate submits their final answer. This is the terminal event of the funnel; when you receive it, mark the interview as fully converted and stop polling stepExecutions for it.
Putting it together
A typical implementation looks like this:1
Store invites as they're created
On every
interview.create webhook, upsert a record in your database with the interview.id, candidate.email, and position.id. Mark its funnel stage as Invited.2
Poll delivery events for pending interviews
On a schedule (for example every 15 minutes), query
trackingHistory for every interview still in the pending stage. Update your record with the highest-fidelity event you’ve seen: DELIVERED → OPENED → CLICKED.3
Poll question progress for clicked interviews
Once you observe a
CLICKED event, start polling stepExecutions for that interview. Store the highest stepIndex with status: COMPLETED as “reached question N”.4
Mark completions from the webhook
On
interview.finish, mark the record as Completed and stop polling. You can also use interview.status-change to track downstream stages like shortlisted or discarded.Embedded (iframe) interviews
If you embed the interview in your own app via iframe, you can also listen forpostMessage events on the client:
interview.loaded— the candidate opened the embedded interview.interview.finished— the candidate submitted their final answer.
stepExecutions from your backend just like the standard flow.
See Can I embed a Hireflix Interview in my app? for the full embedding guide.
Caveats
- Polling is required for anything between click and completion. There are no webhooks for delivery, opens, clicks, or individual question submissions.
OPENEDrelies on email tracking pixels. Some email clients block them, so absence ofOPENEDdoesn’t strictly mean the candidate didn’t read the invite.- VPNs and privacy tools can also suppress
OPENEDevents. - Rate-limit your polling. Only poll for interviews that are still
pending; stop as soon asinterview.finishevent arrives.
What’s next?
Validate Webhook Events
Verify that incoming
interview.create and interview.finish events genuinely originate from Hireflix.Fetch Interview Results
Once an interview is completed, retrieve the answers, videos, and metadata.

