Skip to main content

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 trackingHistory GraphQL field for email or SMS delivery events (sent, delivered, opened, clicked).
  • The stepExecutions GraphQL field for per-question progress.
This guide walks through each stage of the funnel, shows the exact query or event to use, and calls out the gaps you should plan around.
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 the interview.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 the trackingHistory 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.
The same interview may have multiple entries per channel: for example, if you send email plus SMS, or if reminder templates are sent later.
Poll this query on a cadence that makes sense for your funnel dashboard, for example every 15 minutes for interviews still in the pending stage. There is no webhook for delivery events.

Step 3: Detect per-question drop-off

Once a candidate clicks through, use stepExecutions to see exactly which question they reached. Each entry represents one step of the interview flow.
Example responses:
The candidate hasn’t submitted an answer for question 1 stepIndex: 0 and question 2 stepIndex: 1.
How to interpret it:
  • Each stepIndex maps to one question in the position, in order.
  • status: COMPLETED means the candidate submitted an answer for that step.
  • status: NOT_STARTED means they haven’t submitted an answer yet.
  • The last COMPLETED step is the furthest point the candidate reached. The next NOT_STARTED step is where they dropped off.

Deriving “started but not finished”

There is no explicit “interview started” event. The reliable proxy is:
  1. interview.create has fired (invite exists).
  2. At least one stepExecutions entry has status: COMPLETED.
  3. interview.finish has not fired yet (the interview is still pending).
When all three are true, treat the candidate as “in progress”.

Step 4: Capture completions in real time

Subscribe to the interview.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: DELIVEREDOPENEDCLICKED.
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 for postMessage events on the client:
  • interview.loaded — the candidate opened the embedded interview.
  • interview.finished — the candidate submitted their final answer.
These are useful for reacting in your own UI (for example redirecting after completion), but there are still no per-question events. For question-level tracking in an embedded flow, poll 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.
  • OPENED relies on email tracking pixels. Some email clients block them, so absence of OPENED doesn’t strictly mean the candidate didn’t read the invite.
  • VPNs and privacy tools can also suppress OPENED events.
  • Rate-limit your polling. Only poll for interviews that are still pending; stop as soon as interview.finish event 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.