← Track Recruiter Activities /Documentation Open the dashboard →
BackHome page

AI Match Follow-Through Dashboard — Requirements & Data Specification

By Firas · Phase 1 · updated Oct 17, 2026Prototype on sample data

This specification defines phase 1 of a dashboard that measures whether recruiters follow up on the candidates our AI tools surface, using one record per job order × candidate pair across a manual and an automated lane.

1. Scope

The dashboard answers one question: of the candidates our AI tools and recruiters qualify, which ones are we actually following up, how fast, and if not, why not and where?

Users: recruiters (their call list), recruiting managers (coverage and speed by recruiter and job order), and leadership (whether the AI tools translate into recruiter action).

In scope for phase 1:

Out of scope for phase 1: internal submittal to sales, client submittal, client interview, offer and placement. These are the gates for phase 2.

2. Process flow

Every job order branches into a Manual lane, an Automated lane, or both, and each lane runs straight to a recruiter follow-up.

Job ordersactive, unfilled
Manual
  1. Matched by recruiterInternal Submission
  2. Screened by recruiter
  3. Passed screening
  4. Followed up
  5. Within 24 hours
Automated
  1. Matched by Magic Matching
  2. Match score 90+
  3. Screen score 90+digital worker
  4. Followed up
  5. Within 24 hours
Done by a recruiterDone by AIFollow-up step (dashed)

In the Automated lane the first three steps are done by AI and the last two by a recruiter. That switch is the hand-off the dashboard watches.

3. Measuring points

Every count is of unique job order × candidate pairs unless the unit says otherwise. A candidate contacted four times on one job order counts once; the same candidate on two job orders counts twice. All counts apply to the selected period by the date named in the rule.

#Measuring pointDefinitionUnitCounting rule
MP1Active job ordersUnfilled job orders still active (not placed, not gone) at the end of the period. The headline number in the Job Orders boxJob orderopened_at ≤ period end, and no ended_at on or before period end
MP1aActive at startOpening balance: unfilled job orders already active when the period beginsJob orderopened_at before period start, and no ended_at before period start
MP2Created job ordersJob orders created in the periodJob orderopened_at is in the period
MP2aPlacedJob orders placed in the periodJob orderend_status = Placed and ended_at in the period
MP2bGone, not placedJob orders that left the active list without a placement, by reason and by the status they had reachedJob orderend_status is Closed, Wash, Cancelled or Filled elsewhere, and ended_at in the period
MP2cJob orders with matchesActive job orders that got at least one candidate match in the periodJob orderDistinct jo_id where matched_at is in the period
MP3Matched pairsPairs created by a recruiter (Manual) or by Magic Matching (Automated)PairDistinct pair_id where matched_at is in the period, split by lane
MP4Screened pairsMatched pairs that received a screening resultPairMP3 where screened_at is not blank
MP5Match 90+ (Automated only)AI matches scored 90 or above by Magic MatchingPairMP3 Automated where match_score ≥ 90
MP6High-value pairs duePairs that qualify for follow-up and whose 24-hour window has started closingPairRule in section 4; excludes pairs not yet due
MP7Followed-up pairsHigh-value pairs a recruiter contacted at least oncePairMP6 where contact_attempts ≥ 1; repeats never add
MP8Followed up in timeHigh-value pairs first contacted within 24 hours of screeningPairMP7 where first_contact_at − screened_at ≤ 24 hours
MP9Untouched pairsHigh-value pairs no recruiter has contactedPairMP6 where contact_attempts = 0
MP10Contact attemptsRecruiter contact activity on high-value pairsAttemptSum of contact_attempts over MP6. Activity only; never used as coverage
MP11CoverageShare of high-value pairs followed up at all%MP7 ÷ MP6
MP12In-time rateShare of high-value pairs followed up within 24 hours%MP8 ÷ MP6
MP13Time to first contactHow long followed-up pairs waitedHoursMedian of (first_contact_at − screened_at) over MP7
MP14Days waitingHow long an untouched pair has gone without contactDaysAs-of time − screened_at, for each MP9 pair
MP15Job orders with zero follow-upJob orders whose high-value pairs were all left untouchedJob orderDistinct jo_id with MP6 ≥ 1 and MP7 = 0

The job order balance always ties out: MP1a + MP2 − MP2a − MP2b = MP1, for every period.

Why MP10 is kept apart from MP11: 10 job orders with 17 contacts says little. If 3 pairs were contacted 3 times and 2 were contacted 4 times, only 5 pairs were reached. With 10 high-value pairs, coverage is 50%.

4. Business rules

These rules turn the raw record into the measuring points. Items marked Open or Assumption need a decision before live data is connected.

RuleDefinitionStatus
High-value, Automatedmatch_score ≥ 90 and screening_score ≥ 90Confirmed
High-value, ManualA manual match has no match score, so there is no high-value match. A recruiter-matched pair qualifies when the recruiter's screening result is Passed (yes/no, no score).Confirmed (Oct 16)
Manual match eventA manual match exists only when a recruiter links a candidate to a job order, marked by the Bullhorn status Internal SubmissionConfirmed (Oct 16)
Follow-upAt least one recruiter contact on the pair after screeningConfirmed
In timeFirst contact within 24 hours of screened_atConfirmed
Not yet dueA high-value pair with no contact, screened less than 24 hours before the as-of time. Excluded from MP6 and all rates until the window closesProposed
As-of timeThe latest timestamp in the data; live, it is the time of the refreshProposed
Period membershipA pair belongs to a period by matched_at; a new job order (MP2) by jo_opened_atProposed
Periods offeredLast 7, 14 and 30 days and the full data range, ending on the latest day in the data; plus each calendar month (a partial month is labelled)Built
Coverage target100% of high-value pairs followed upProposed
In-time target100% of high-value pairs within 24 hoursConfirmed (Oct 16)
Job order status pathOpen → Internal Submit → External Submit → Placed. From any status a job order can instead drop out sideways (Closed, Wash, Cancelled, Filled elsewhere) and is gone from the active listConfirmed (Oct 16); exit status names to confirm
Opening balanceThe data assumes job orders were already active before the first day of match data; the Job Orders box starts from that balanceConfirmed (Oct 16)
Who did the workEach step is marked human (recruiter) or machine (AI). Follow-up is always humanConfirmed

5. Data requirements

One record per job order × candidate pair, with the same 16 columns for both lanes. The grain is the pair, not the contact: contact activity is rolled up onto the pair as a count plus first and last times.

FieldTypeRequiredDefinitionLikely sourceExample
pair_idTextYesUnique key for the pair: jo_id + / + candidate_idDerivedJO-1047/C-01182
jo_idTextYesJob order identifierBullhorn job orderJO-1047
jo_opened_atDate-timeYesWhen the job order was openedBullhorn job order2026-08-12T09:40
recruiterTextYesRecruiter who owns the job orderBullhorn job order ownerRecruiter D
candidate_idTextYesCandidate identifierBullhorn candidateC-01182
laneManual | AutomatedYesWhich path created the matchDerived from matched_byAutomated
matched_byRecruiter | Magic Matching (AI)YesHuman or machine that made the matchBullhorn status change (Manual); Magic Matching output (Automated)Magic Matching (AI)
matched_atDate-timeYesWhen the match was madeSame as matched_by2026-08-12T14:05
match_score0–100Automated onlyMagic Matching score; blank for ManualMagic Matching94
screened_byRecruiter | Digital worker (AI) | blankYes if screenedHuman or machine that screenedRecruiter activity; digital-worker outputDigital worker (AI)
screened_atDate-timeYes if screenedWhen the screening result was recordedSame as screened_by2026-08-12T17:20
screening_score0–100Yes if screenedScreening resultSame as screened_by92
screening_resultPassed | Not passed | blankManual, if screenedRecruiter screening outcome; Manual pairs have no screening scoreRecruiter activityPassed
contact_attemptsInteger ≥ 0YesRecruiter contacts on this pair after screening (calls, emails, texts)Bullhorn activity / notes3
first_contact_atDate-timeIf attempts ≥ 1First recruiter contact after screeningBullhorn activity2026-08-13T10:15
last_contact_atDate-timeIf attempts ≥ 1Most recent recruiter contactBullhorn activity2026-08-15T16:30

Job order status record

A second file holds one row per job order with the date it reached each status. It feeds the Job Orders box: the opening balance, what was created, placed or gone, and where active job orders sit.

FieldTypeRequiredDefinitionExample
jo_idTextYesJob order identifier; joins to the pair recordJO-4210
recruiterTextYesRecruiter who owns the job orderRecruiter D
opened_atDate-timeYesStatus Open2026-08-12T09:40
internal_submit_atDate-timeIf reachedStatus Internal Submit2026-08-14T11:05
external_submit_atDate-timeIf reachedStatus External Submit2026-08-20T15:30
placed_atDate-timeIf placedStatus Placed (filled by our recruiters)2026-09-08T10:00
ended_atDate-timeIf endedWhen it left the active list; blank while active2026-09-08T10:00
end_statusPlaced | Closed | Wash | Cancelled | Filled elsewhere | blankIf endedHow it left the active listFilled elsewhere

Data quality checks to run on each load:

6. Dashboard components

The page reads top to bottom, from the overall flow, through what needs attention, to the list of people to call. Every component follows the period picker.

#ComponentWhat it showsMeasuring pointsInteraction
C1HeaderTitle, a one-sentence takeaway for the period, definitions, the date range shownMP6, MP11, MP12 by lanePeriod picker (rolling windows and months)
C2Flow: job order to follow-upJob Orders box (active balance rolled forward: at start + created − placed − gone = at end; active by status; gone by status reached; job orders with matches) branching into the Manual and Automated lanes, five steps each in a straight line, with counts, share kept from the previous step, and a bar against the lane's first step. The follow-up steps are dashed; the bigger of their two losses is redMP1, MP2, MP15, MP3–MP8Click any number in the Job Orders box for those job orders; click a step for its pairs
C3Human / AI markersA 12px muted icon in each box's top-right corner: a person outline for a recruiter, a sparkle for AI. A two-item key sits under the card's note—Hover for the label
C4Headline figuresHigh-value pairs due, coverage, in-time rate, untouched pairs, and contact attempts vs pairs reached; each with an AI and Manual splitMP6, MP7, MP9–MP12Click a figure, or its AI / Manual split, for the pairs
C5What needs attentionPlain-language findings with a severity tag and a recommended actionSection 7—
C6Activity isn't coverageHigh-value pairs by number of attempts (never, 1, 2, 3, 4+), per lane; "never" in redMP7, MP9, MP10Click a row for those pairs
C7Coverage by weekCoverage per week matched, one line per laneMP11Hover a week; click for its pairs
C8Within 24 hours by weekIn-time rate per week, one line per lane, with a 100% target lineMP12Hover a week; click for its pairs
C9Follow-through by recruiterHigh-value pairs, from AI, followed up, untouched, attempts, coverage, in-time rateMP6–MP12Sort by any column; click a row for that recruiter's pairs
C10Call listEvery untouched high-value pair in the period: job order, candidate, lane, recruiter, scores, matched date, days waiting (over 7 in red), longest firstMP9, MP14Search by job order, candidate or recruiter; click a row to open the job order

Drill-down

Every count opens a side panel listing the records behind it, for the selected period. Lists sort by any column and download as CSV. Any job order in a list opens its own view: its status path (Opened → Internal Submit → External Submit → Placed, or the status it left from) and every candidate matched to it in both lanes. Back returns to the previous list.

7. Diagnostician rules

The diagnostician runs these rules for the selected period and lists each finding that fires, in this order. It separates a coverage problem (never touched, which points to prioritization) from a speed problem (touched too late, which points to capacity or alerting).

#FindingFires whenSeverityRecommended action shown
R1Coverage leakAutomated untouched pairs > 0Red if AI coverage < 80%, else amberWork the call list, AI lane first
R2Hand-off gapManual coverage exceeds AI coverage by 10 points or moreRedRoute 90+/90+ results into the recruiter's queue with an owner and a due time
R3Activity ≠ coverageAI contact attempts > AI pairs followed upAmberMeasure recruiters on unique pairs reached, not calls; cap repeat attempts until the untouched list is cleared
R4SpeedOverall in-time rate < 100%Red if < 80%, else amberCheck recruiter capacity and whether a 90+ result triggers an alert
R5Job orders at riskMP15 > 0RedFlag the clients getting no candidates from an AI-qualified pool
R6HotspotA recruiter has untouched pairs; the one with the most is namedAmberRebalance job orders or add a second recruiter to the AI lane
R7TrendBoth halves of the period have at least 8 AI high-value pairs; compares AI coverage first half vs second halfGreen if holding, red if fallingIf falling: recruiter capacity is not keeping up with AI volume
R8Going coldAny untouched pair; the longest-waiting one is namedRed if waiting > 7 days, else amberStrong candidates are usually off the market within one to two weeks

If no high-value pairs are due in the period, a single "Quiet" finding replaces the list.

8. Assumptions, open items and later phases

The prototype runs on sample data generated for this design: 3,022 candidate pairs on 130 job orders, 8 recruiters, Jul 17 – Oct 15, 2026; plus a job order status file of 365 job orders, 187 of them already active on Jul 17 (the opening balance) and 178 created during the window. A follow-up gap was seeded on purpose. None of its numbers describe real performance.

Open items

Later phases