Source Effectiveness
Which channels produce hires, not applications. The metric is only as good as the attribution behind it, and attribution is where nearly every source report quietly fails.
◆ Getting attribution honest— the taxonomy, the ladder, the first-touch rule, and the vendor-claim problem.
| Decision | What goes wrong without it |
|---|---|
| A frozen taxonomy | Source categories drift, and this quarter's labels stop matching last quarter's. Pick the list, document it, and when it changes, remap history so trends survive. dim_source is small; keeping it clean is cheap. |
| The attribution ladder | System-captured attribution, a posting link or a referral link, outranks recruiter-tagged at entry, which outranks candidate self-select. Land which rung produced each row; a source report is only as trustworthy as its worst rung, and now you can measure the mix. |
| Tag at first entry | Source filled in at offer stage is reconstructed from memory. The application's source is set when the application lands, then left alone. |
| The first-touch rule | A candidate who applied through a job board but was already in your pipeline from earlier outreach was sourced by the outreach. Decide relationship-start versus last-touch once, and state it on the report. |
| One hire, many claimants | Every vendor's database contains your hire, and every vendor claims them. Claims reconcile against your source of record; the record does not move to match the invoice. |
◆ The owned model, and the SQL— the funnel per source, from the same fact the funnel report reads.
No new fact. The stage-event fact gains a source key, and the funnel groups by it. Volume, quality, and conversion per source in one query:
-- May cohort by source: applied, reached interview, hired
WITH first_entry AS (
SELECT e.application_key, e.source_key, e.stage,
MIN(e.event_date) AS entered_on
FROM fct_application_event e
JOIN dim_requisition r ON e.requisition_key = r.requisition_key
WHERE r.requisition_type <> 'Evergreen' AND e.cohort_month = '2026-05'
GROUP BY 1, 2, 3
)
SELECT s.source_category,
COUNT(DISTINCT CASE WHEN stage = 'Applied' THEN application_key END) AS applied,
COUNT(DISTINCT CASE WHEN stage = 'Interview' THEN application_key END) AS interviewed,
COUNT(DISTINCT CASE WHEN stage = 'Offer Accepted' THEN application_key END) AS hired
FROM first_entry f
JOIN dim_source s ON f.source_key = s.source_key
GROUP BY 1
ORDER BY hired DESC, interviewed DESC
Sample output, the same May cohort as the funnel report, now split by source:
| source_category | applied | interviewed | quality | hired | conversion |
|---|---|---|---|---|---|
| Referral | 18 | 6 | 33.3% | 2 | 11.1% |
| Job boards | 95 | 6 | 6.3% | 1 | 1.1% |
| Direct outreach | 27 | 3 | 11.1% | 0 | 0.0% |
The rows sum to the funnel report's 140 applications, 15 interviews, and 3 hires; this page is that funnel, split. The reading: job boards deliver two thirds of the volume and one of the three hires; referrals deliver a third of the interviews from 18 applications. Quality, the share reaching interview, is the earlier and steadier signal; conversion swings hard at small hire counts, so read it over quarters, not months. Sample values are illustrative, never client data.
- source of record
- The one source on the application, set at first entry, never rewritten to match an invoice.
- attribution ladder
- System-captured over recruiter-tagged over self-selected. Landed per row.
- taxonomy
- The documented source category list. Frozen, and remapped when it changes.
- first-touch rule
- Relationship start versus last application. Decided once, stated on the report.
- quality
- Share of a source's candidates reaching interview. The early, steady signal.
- conversion
- Hires over applications per source. Swings at small counts; read over quarters.
- vendor claim
- A source asserting credit for a hire. Reconciled against the record, never the reverse.