Skip to content

Source Group Mix by Fiscal Year

The share of persons whose first engagement touch came from each source group, broken out by fiscal year. Shows whether the mix of channels reaching new prospects is shifting over time.

This page answers the question raised by the cohort conversion curve page: why is FY2025 a weaker cohort?

The no-engagement-touch share tells the story. FY2024 was an unusually well-tracked year — only 41.8% of the cohort had no recorded engagement, vs. 62.9% in FY2023. FY2025 reverted to 59.6%, and the total funnel grew from 38K to 55K persons. The growth came almost entirely from the no-engagement-touch population, which more than doubled in absolute terms (16K → 33K). High-quality channels grew only modestly. The FY2025 application rate dropped because the denominator was inflated by low-quality, untracked prospects — most likely name buys or imported lists.

Among touched persons only, organic search share has grown every year — 27.7% in FY2023, 35.3% in FY2024, 41.0% in FY2025 — which is the brand strength signal discussed on the organic search page.

Source GroupFY2023FY2024FY2025
no engagement touch25,530 (62.9%)16,013 (41.8%)33,205 (59.6%)
direct / unknown9,246 (22.8%)12,696 (33.2%)10,843 (19.5%)
organic search4,157 (10.2%)7,864 (20.5%)9,252 (16.6%)
paid / carnegie1,061 (2.6%)401 (1.0%)510 (0.9%)
email276 (0.7%)305 (0.8%)395 (0.7%)
organic social116 (0.3%)473 (1.2%)329 (0.6%)
paid display51 (0.1%)205 (0.5%)543 (1.0%)
paid social152 (0.4%)411 (0.7%)
paid search9 (0.0%)101 (0.3%)189 (0.3%)
other / small groups118 (0.3%)67 (0.2%)71 (0.1%)
Total40,56438,27755,748

FY2025’s lower application rate is explained by funnel composition, not a collapse in high-quality demand. The no-engagement-touch population more than doubled year over year, inflating the denominator without adding applicants. Among persons with recorded engagement, organic search share grew to 41% — the highest on record. The FY2025 cohort has a quality problem concentrated in the untracked segment, not a brand or channel performance problem.

An application rate can hold steady even as the underlying channel mix shifts dramatically — and that shift has real implications. If organic search share is growing, that reflects increasing brand strength and lower cost-per-acquisition. If paid share is growing, application volume is becoming more dependent on continued spend.

This view also surfaces whether the composition of the funnel is changing in ways that explain application rate trends. A cohort that arrived primarily through organic search will likely convert differently than one that arrived primarily through paid display — even if their total volumes are similar.

Source group classification uses the same CASE logic as the first-touch application rate page. Persons with no recorded engagement touch are counted separately as no engagement touch. Share is calculated as a percentage of total persons in each fiscal year cohort.

Only FY2023–2025 are included as complete-year cohorts with reliable pipeline data.

WITH first_touch AS (
SELECT
person_id,
utm_source,
utm_medium,
ROW_NUMBER() OVER (
PARTITION BY person_id
ORDER BY touched_at ASC
) AS rn
FROM person_touches
WHERE touch_category = 'engagement'
),
source_groups AS (
SELECT
person_id,
CASE
WHEN lower(utm_source) IN ('google', 'bing', 'yahoo', 'yahoo!', 'duckduckgo', 'ecosia', 'yandex', '360.cn', 'baidu')
AND lower(utm_medium) IN ('organic', 'organic_search', 'search')
THEN 'organic search'
WHEN lower(utm_source) IN ('google', 'bing')
AND lower(utm_medium) IN ('cpc', 'paid', 'paid_search', 'ppc')
THEN 'paid search'
WHEN lower(utm_source) IN ('googlead', 'mediately')
OR lower(utm_medium) IN ('mediately', 'display', 'lightbox', 'banner')
THEN 'paid display'
WHEN lower(utm_source) IN ('carnegie-digital', 'carnegie', 'carnegie_digital')
AND lower(utm_medium) IN ('ppc', 'paid-social', 'paid_social', 'cpc', 'display', 'lightbox', 'discovery', 'custom-content', 'video')
THEN 'paid / carnegie'
WHEN lower(utm_source) IN ('facebook', 'instagram', 'linkedin', 'youtube', 'tiktok', 'snapchat', 'twitter', 'reddit', 'meta')
AND lower(utm_medium) IN ('paid', 'paid-social', 'paid_social', 'cpc')
THEN 'paid social'
WHEN lower(utm_source) IN ('facebook', 'instagram', 'linkedin', 'youtube', 'tiktok', 'snapchat', 'twitter', 'reddit')
OR lower(utm_medium) IN ('social')
THEN 'organic social'
WHEN lower(utm_source) IN ('slate', 'gmail', 'miami-matters', 'mass_mailer', 'inbound-email', 'notifier', 'email', 'newsletter')
OR lower(utm_medium) IN ('email')
THEN 'email'
WHEN lower(utm_source) IN ('nrccua', 'encoura', 'collegeboard', 'cappex', 'niche', 'niche.com', 'qs', 'usnews_studentconnect', 'hotcoursesinternational', 'idp', 'ziprecruiter')
THEN 'vendor / purchased list'
WHEN lower(utm_source) IN ('chatgpt.com', 'perplexity', 'claude', 'gemini', 'copilot.com')
THEN 'ai referral'
WHEN utm_source IS NULL OR utm_source = '' OR utm_source = '(none)'
THEN 'direct / unknown'
ELSE 'other'
END AS source_group
FROM first_touch
WHERE rn = 1
),
labeled AS (
SELECT
pd.person_id,
pd.fiscal_year,
COALESCE(sg.source_group, 'no engagement touch') AS source_group
FROM persons_dashboard pd
LEFT JOIN source_groups sg ON pd.person_id = sg.person_id
WHERE pd.fiscal_year IN ('2023', '2024', '2025')
),
totals AS (
SELECT fiscal_year, COUNT(*) AS total_persons
FROM labeled
GROUP BY fiscal_year
)
SELECT
l.fiscal_year,
l.source_group,
COUNT(*) AS people,
t.total_persons,
ROUND(COUNT(*) * 100.0 / t.total_persons, 1) AS pct_of_cohort
FROM labeled l
JOIN totals t ON l.fiscal_year = t.fiscal_year
GROUP BY l.fiscal_year, l.source_group, t.total_persons
ORDER BY l.fiscal_year, people DESC;