AI companion
1. Dataset name
ai_companion_adoption_and_profile_feedback_dataset
2. Description
Every human interview slot scheduled, with whether the AI Companion was turned on for it and the interview feedback raised against it.
3. Source tables
- customer_views.user_calendar_events (interview slots, unnested)
- customer_views.companion_session (whether the Companion joined)
- customer_views.profile_feedback (interview feedback)
- customer_views.positions (business unit, country, title, recruiter)
- customer_views.employee (recruiter display name)
4. Grain
One row per interview slot per interview feedback. A slot with no Companion session, no feedback or no position still produces a row, with NULLs in those columns, because every join below the slot is a LEFT JOIN; a slot with two feedbacks or two interviewers produces two rows. Slot-level counts therefore have to be COUNT(DISTINCT slot_key).
5. Dashboards supported
- AI Companion Dashboard
6. Metrics supported
| Metric | Supported breakdowns |
| Total Interviews Scheduled | Business Unit Bucket, Geography Bucket, Position Bucket |
| Companion Interviews Scheduled | Business Unit Bucket, Geography Bucket, Position Bucket |
| Companion Adoption Rate % | Business Unit Bucket, Geography Bucket, Position Bucket |
| Weekly Trend in Companion Interviews Scheduled | Business Unit Bucket, Geography Bucket, Position Bucket |
| Feedbacks Generated by Companion | Business Unit Bucket, Geography Bucket, Position Bucket |
| Feedback Generation Rate | Business Unit Bucket, Geography Bucket, Position Bucket |
| Companion Bot Admissions | Business Unit Bucket, Geography Bucket, Position Bucket |
| Candidate Opt Outs | Business Unit Bucket, Geography Bucket, Position Bucket |
| Feedback Outcomes by Companion Usage | Cohort |
| Weekly Trend in Feedback Submission % | Business Unit Bucket, Geography Bucket, Position Bucket, Cohort |
| Weekly Trend in Time to Submit Feedback | Business Unit Bucket, Geography Bucket, Position Bucket, Cohort |
7. Known exclusions and filters applied
- AI-led interviews are excluded: any slot where an interviewer on it is flagged as an AI interviewer is dropped before anything else is joined.
- Slot-level widgets exclude cancelled, deleted and declined slots and slots with no video conference, through
is_excluded_slot; the dataset keeps those rows so the exclusion stays visible. - Feedback is restricted to interview feedback; other feedback types never enter the dataset.
- A slot repeats once per feedback and once per interviewer on it, so every slot-level count must be
COUNT(DISTINCT slot_key), never a row count. -
slot_keyis uce_id plus slot_id, because slot_id alone is only unique inside one calendar event. - Companion session, feedback, position and employee are all LEFT JOINed: a slot with no Companion session, no feedback or no position survives with NULLs.
- recruiter falls back from the employee display name to the position's recruiter name, then the recruiter email, then 'Unassigned'.
- business_unit_bucket, geography_bucket and position_bucket default to '(no position)' so interviews with no position stay countable in breakdowns.
- Denormalised: companion_status, has_companion_recorded, latest_bot_status and every position column repeat on every row of a slot. Aggregate them with MAX or a DISTINCT count, never SUM.
8. Schema
| Column name | Data type | Notes |
| uce_id | BIGINT | Calendar event the slot belongs to; sourced from user_calendar_events |
| group_id | VARCHAR | Tenant; sourced from user_calendar_events |
| profile_id | BIGINT | Candidate on the interview; sourced from user_calendar_events |
| position_id | BIGINT | Position the interview is for; sourced from user_calendar_events |
| meeting_time | DATETIME | When the interview is scheduled; the date filter for every adoption widget |
| uce_status | VARCHAR | Status of the calendar event; sourced from user_calendar_events |
| slot_id | VARCHAR | Slot hash inside the calendar event; unique only within that event |
| slot_key | VARCHAR | Derived: uce_id + '.' + slot_id, the globally unique slot identifier every slot count uses |
| add_ai_bot | BOOLEAN | Derived: the slot's Companion toggle, defaulted to false when absent |
| slot_status | VARCHAR | Derived: status read from the slot JSON |
| video_conference_type | VARCHAR | Derived: conferencing provider read from the slot JSON; NULL means the slot cannot carry a Companion |
| is_excluded_slot | TINYINT | Derived: 1 when the slot is cancelled, deleted or declined, or has no video conference |
| companion_session_id | BIGINT | Companion session on the slot; NULL when the Companion was never scheduled |
| companion_status | VARCHAR | Lifecycle status of the Companion session; sourced from companion_session |
| feedback_form_template_id | BIGINT | Feedback form the Companion was told to fill; NULL means the default form |
| companion_scheduled_to_join_at | DATETIME | When the Companion was due to join; the date filter for the Companion-session widgets |
| latest_bot_status | VARCHAR | Last status reported by the bot; sourced from companion_session |
| has_companion_recorded | BOOLEAN | Whether the bot was admitted and recorded the interview |
| used_default_feedback_form | TINYINT | Derived: 1 when a Companion session ran with no feedback form template |
| is_candidate_opt_out | TINYINT | Derived: 1 when the latest bot status is candidate opted out |
| companion_generated_feedback | TINYINT | Derived: 1 when the session reached feedback generated |
| is_post_interview_session | TINYINT | Derived: 1 once the session has passed the interview itself |
| profile_feedback_id | BIGINT | Interview feedback on the slot; NULL when none was raised |
| reviewer_email | VARCHAR | Interviewer the feedback belongs to; sourced from profile_feedback |
| requester_email | VARCHAR | Who requested the feedback; sourced from profile_feedback |
| feedback_status | VARCHAR | Feedback status, e.g. SUBMITTED; sourced from profile_feedback |
| requested_timestamp | DATETIME | When the feedback was requested |
| submitted_timestamp | DATETIME | When the feedback was submitted; NULL while outstanding |
| feedback_tat_seconds | BIGINT | Derived: seconds between request and submission; NULL while outstanding |
| feedback_created_at | DATETIME | When the feedback row was created; the date filter for every feedback widget |
| companion_session_rds_id | BIGINT | Derived: the Companion session the feedback was drafted from, read from the feedback payload |
| feedback_has_companion_link | TINYINT | Derived: 1 when the feedback carries a Companion session id |
| cohort | VARCHAR | Derived: 'Companion' or 'No Companion', from feedback_has_companion_link |
| is_submitted | TINYINT | Derived: 1 when the feedback status is SUBMITTED |
| llm_answer_quality_score_overall | DOUBLE | Derived: the Companion's own quality score for the draft, read from the feedback payload |
| is_direct_ship | TINYINT | Derived: 1 when a Companion-drafted feedback was submitted with a perfect quality score |
| has_llm_score | TINYINT | Derived: 1 when a quality score is present |
| recruiter_email | VARCHAR | Recruiter on the position; sourced from positions |
| recruiter | VARCHAR | Derived: recruiter display name, falling back to the position's recruiter name, the email, then 'Unassigned'. Dashboard filter column |
| business_unit | VARCHAR | Business unit of the position; sourced from positions |
| location_country | VARCHAR | Country of the position; sourced from positions |
| position_title | VARCHAR | Title of the position; sourced from positions |
| business_unit_bucket | VARCHAR | Derived: business_unit, or '(no position)' when the slot has no position |
| geography_bucket | VARCHAR | Derived: location_country, or '(no position)' |
| position_bucket | VARCHAR | Derived: position_title, or '(no position)' |