AI Interview funnel
1. Dataset Name
ai_interview_funnel
2. Description
A stage-level funnel dataset that follows each candidate's journey through the AI Interviewer process, from invite through to hire. Each row represents one candidate at one funnel stage for a given interview session, including the timestamp of that stage, the next stage reached, and the time spent transitioning between them. The funnel covers eight stages: Invite Sent, Call Started, Interview Completed, Feedback Generated, Feedback Reviewed, Requested Human Assistance, Offer Extended, and Hired. This dataset powers the AI Recruitment Funnel visualization on the AI Interviewer dashboard.
3. Source Tables
- customer_views.user_analytics (event log — source of the first six funnel stages)
- customer_views.interview_session (joined to resolve interview_type per session)
- customer_views.applications (source of the Offer Extended and Hired stages, via offer_ts and hired_ts)
4. Grain
One row per entity_id (interview session) per funnel stage reached. A candidate who has progressed through five stages will have five rows in this dataset, one per stage, each carrying its own stage_ts and the next stage's name/timestamp.
5. Dashboards Supported
- AI Interviewer (AII) Dashboard
6. Metrics Supported
| Metric | Supported Breakdowns |
| AI Interview Funnel | No drilldowns |
| AI Recruitment Funnel | No drilldowns |
7. Known Exclusions / Filters Applied
- Only the six interview_session_* events listed in the WHERE clause are pivoted from user_analytics; any other event types on the same entity_id are ignored.
- A row is only included in the final output when stage_order = 1 (the first stage), OR the previous stage in sequence was actually reached (prev_stage_order = stage_order - 1), OR stage_order = 7 (Offer Extended is always included regardless of sequence gaps).
- This sequencing rule means a candidate cannot appear at, say, Feedback Generated without a recorded Interview Completed immediately before it — it prevents out-of-order or orphaned stage entries from appearing in the funnel, ensuring strict step-by-step progression.
- Offer Extended and Hired stages are joined from applications via matching profile_id and position_id to the candidate's interview session — only applications with a non-null offer_ts or hired_ts contribute these stages.
- invited_at is computed as a window function (MAX over entity_id) so every stage row for a given candidate carries the same invitation timestamp, regardless of which stage that row represents.
- interview_type_label is derived through a CASE waterfall over interview_type (profile_screening → Screening, coding_interview → Coding, behavioural_interview → Functional/Behavioural, modular_interview → Modular); any unmapped value falls to 'Other'.
- minutes_in_stage is only meaningful when next_stage_ts is populated; for a candidate's most recent (current) stage, this value will be null since there is no next stage yet.
8. Schema
| Column Name | Data Type | Notes |
| entity_id | bigint | Interview session identifier; sourced from user_analytics event entity_id, joined to interview_session.id |
| profile_id | bigint | Candidate's profile identifier; sourced from user_analytics |
| position_id | bigint | Position identifier; sourced from user_analytics |
| interview_type_label | varchar | Derived: mapped label (Screening, Coding, Functional/Behavioural, Modular, Other) via CASE WHEN waterfall over interview_type, sourced from interview_session |
| event_name | varchar | Raw event name driving the stage (e.g. interview_session_candidate_contacted, offer_extended, hired) |
| stage_name | varchar | Derived: display label for the funnel stage — Invite Sent, Call Started, Interview Completed, Feedback Generated, Feedback Reviewed, Requested Human Assistance, Offer Extended, Hired |
| stage_ts | datetime | Timestamp of the stage event — MIN/MAX(timestamp) per event type, sourced from user_analytics or applications.offer_ts/hired_ts |
| invited_at | datetime | Derived: MAX(timestamp) WHERE event_name = interview_session_candidate_contacted, windowed per entity_id |
| next_stage_name | varchar | Derived: LEAD(stage_display_name) windowed per entity_id ordered by stage_order — the candidate's next funnel stage |
| next_stage_ts | datetime | Derived: LEAD(stage_ts) windowed per entity_id ordered by stage_order |
| minutes_in_stage | bigint | Derived: TIMESTAMPDIFF(MINUTE, stage_ts, next_stage_ts) — time spent in the current stage before advancing |
| stage_order | bigint | Derived: numeric funnel sequence — 1 Invite Sent, 2 Call Started, 3 Interview Completed, 4 Feedback Generated, 5 Feedback Reviewed, 6 Requested Human Assistance, 7 Offer Extended, 8 Hired |