Job Advertising Attribution and Source Tracking: Three Layers, One Gap, and the Number No Ad Platform Can Give You

Last updated August 27, 2026 · Reporting and proof · The six-metric framework is on the recruiting analytics page; the single-metric deep dive on conversion is on its own page

Job advertising attribution is knowing which ad produced which applicant, and which applicant became a hire. It has three layers, and each one is owned by a different system: the ad platform counts clicks and, if the form lives inside it, applications; the ATS holds the source field that ties an application to a channel; and the hire is recorded only in the ATS or payroll, never in an ad account. The gap between the first two layers is where tracking dies — one of the largest advertisers in our behavioral-health segment ran 60,889 clicks with zero tracked applications, because every click left for an external ATS. The gap between the second and third is why no cost per hire can honestly come from ad data. Below: the layers, the gap, how to tag every source, and two tools.

Book a Demo

A note on who's writing this

Boostpoint runs the first layer — ads with a form inside the platform — and delivers applicants into the second through ATS integrations, so we benefit when employers keep the form in-platform and tag the source, which is what this page recommends. We have no access to the third layer: we see applications, not starts, and we've never computed a cost per hire from ad data and won't. The tracking-gap example is from our own campaign records and is told without the cost figure it produced, because a cost per applicant computed over zero tracked applications is an artifact, not a number. The UTM conventions are Google's, quoted from its Analytics documentation. Nothing here is a cost per hire.

The case for not tracking, made first

The honest argument against building attribution is that frontline hiring is fast, the tools are many, and the recruiter's time is the scarcest thing in the building. A manager who fills a shift by Friday doesn't care which channel the applicant came from; the applicant doesn't remember whether she saw the ad on her phone or heard about it from her cousin; and every extra field in a form or an ATS is a field somebody has to fill. That argument is right about one thing: tracking that costs effort at the moment of application doesn't get done. It's wrong about the rest, because the alternative is deciding next year's budget on the ad platforms' own reports — each of which, honestly, counts what happened inside its own walls and nothing else — and on a "how did you hear about us" dropdown that says "Indeed" for everyone who ever saw a board. The tracking that works costs nothing at the moment of application: the form lives in the ad, the source rides in on the integration, and the ATS field fills itself.

The three layers of attribution, and who owns each

Layer one: the platform. Every ad account reports impressions, clicks, and — only if the application happens inside the platform — applications. A social campaign with an in-platform form reports all three; a job board reports clicks and, if the employer uses the board's own apply flow, applications; a campaign that sends people to a career site reports clicks and then goes blind. Layer one is where cost per applicant is computed, and it's the layer our benchmark lives in: 891 campaigns, 1,334 campaign-months, applications counted by the platform, management fee inside. Layer two: the ATS. Every application that reaches the ATS carries, or should carry, a source: a field set by the integration, by a tagged URL, or by the candidate's own answer. Layer two is where the platform's count gets reconciled with reality — and where it usually doesn't, because the integration wasn't set up, the URL wasn't tagged, or the field defaults to "other." Layer three: the hire. The start date, the 90-day survivor and the cost of the seat live in the ATS and payroll, and nowhere in an ad account. Layer three is the only place a cost per hire can be computed, and only for the applications that arrived with a source. Every attribution problem is a break between two of these layers, and the two breaks have different fixes.

Three stacked layers of job advertising attribution: the ad platform, which counts impressions, clicks and — only if the form is in-platform — applications, and is where cost per applicant lives; the ATS, which holds the source field that ties an application to a channel, set by integration, tagged URL or the candidate's answer; and the hire, recorded only in the ATS or payroll, the only place a cost per hire can be computed; with the two breaks between layers marked: the tracking gap and the attribution gap
Three layers, two breaks. Cost per applicant lives in layer one; cost per hire can only live in layer three.

The tracking gap: 60,889 clicks and nothing to show for them

The clearest case in our own records is one we can't put a cost on, and that's the point. One of the largest advertisers in our behavioral-health segment ran campaigns whose ads sent every click to an external applicant tracking system rather than to a form inside the platform. The platform did what platforms do: it counted 60,889 clicks and zero applications, because the application happened somewhere it couldn't see. Every one of those clicks may have become an applicant in that employer's ATS; we have no way to know, and neither, from the ad side, did they. The number the platform would compute — media spend divided by zero tracked applications — is an artifact, and we don't publish it, for that segment or any other; the reason our benchmark suppresses the segment's cost figure is exactly this. The lesson is not "don't use an ATS." It's that the moment a click leaves the platform, the platform's count ends, and unless the landing page carries a tag and the ATS records it, the campaign's performance becomes a rumor. In the benchmark, click-to-application conversion explained 70% of cost variation; a campaign that can't see its own applications can't see the number that explains most of its cost.

Interactive

Tracking-gap finder — the platform's clicks and applications, the ATS's tagged and untagged applications; see the coverage between layer one and layer two, and which break you have

Nothing is stored or sent — this runs in your browser. Take one channel over one month: the ad account's numbers and the ATS's numbers for the same period.

Zero if the form is off-platform
"Other," blank, or "website"
Platform apply rate

platform applications ÷ clicks

ATS coverage of this source

ATS tagged ÷ platform applications

Lost between the layers

platform applications − ATS tagged

ATS source unknown

unknown ÷ all ATS applications

Coverage above 100% means the ATS tagged more applications to the source than the platform counted, which usually means the tag is catching organic or referral traffic too. The reference case — 60,889 clicks, zero platform applications — returns no apply rate and no coverage, because every application happened where the platform couldn't see it. Cost per applicant is not cost per hire.
The tracking-gap case: an ad platform counting 60,889 clicks and zero applications because every click left for an external applicant tracking system, drawn as a full bar of clicks beside an empty bar of tracked applications, with the note that the cost figure this produces is an artifact and is not published, and that click-to-application conversion explained 70 percent of cost variation in the benchmark — a campaign that cannot see its applications cannot see the number that explains most of its cost
The reference case, told without the cost figure it produced. Boostpoint campaign records; the segment's cost per applicant is not published.

How to track applicant sources: the stack, from cheapest to most honest

Five mechanisms, and most employers need three of them. The in-platform form. When the application happens inside the ad platform, the platform's count is the truth for layer one, and the integration carries the source into the ATS with no human typing anything; this is the mechanism that closes the tracking gap entirely, and it's the one the 60,889-click campaign didn't have. Tagged URLs. When a click has to leave the platform — a career site, a board's redirect — the destination URL carries parameters that the ATS or analytics reads. Google's convention is the UTM set: "you should always use utm_source, utm_medium, and utm_campaign," where utm_source is the "Referrer, for example: google, newsletter4, billboard," utm_medium the "Marketing medium, for example: cpc, banner, email," and utm_campaign the campaign name; Google also recommends utm_id and utm_source_platform to avoid "(not set)" in reports. Indeed's XML feed carries an optional tracking_url element for the same purpose, and Google's JobPosting markup has a directApply property. The builder below writes the tag. The ATS source field. Whatever arrives has to land in one field with one vocabulary — "Social — warehouse — Dayton," not "Facebook," "FB," "social media" and "Meta" as four sources — and the field has to be required at import, not optional at the recruiter's discretion. The candidate's own answer. "How did you hear about us?" is the least reliable mechanism there is (people answer "online") and the only one that catches a referral or a yard sign; keep it, make the options match the ATS vocabulary, and never let it overwrite a tag. Event-specific codes. A QR code, a short URL or a phone number that exists only on one flyer or at one open house is the cheapest attribution for offline channels, and it works because it can't be confused with anything else.

Interactive

Source tag builder — the channel, the role, the market and the campaign; get a UTM-tagged URL for off-platform landings and a matching ATS source label

Nothing is stored or sent — this runs in your browser. The parameter names are Google's; the vocabulary is yours, and the point is that the URL tag and the ATS label say the same thing.

Keep it stable for the life of the campaign
Tagged URL
ATS source label (same vocabulary)
UTM parameter names and the "always use utm_source, utm_medium, and utm_campaign" guidance are Google's (Analytics Help, "Collect campaign data with custom URLs"); the values are yours and are lower-cased with underscores because analytics tools treat "Facebook" and "facebook" as different sources. An in-platform form doesn't need a tagged URL — the integration carries the source — and this builder is for the clicks that have to leave the platform.
The source-tagging stack as five mechanisms from cheapest to most honest: the in-platform form, where the integration carries the source and no human types anything; tagged URLs using Google's utm_source, utm_medium and utm_campaign for clicks that leave the platform; the ATS source field with one required vocabulary; the candidate's own how-did-you-hear answer, least reliable but the only one that catches referrals; and event-specific QR codes, short URLs and phone numbers for offline channels
Five mechanisms; most employers need three. UTM conventions per Google Analytics Help.

First touch, last touch, and the honest version for hiring

Marketing attribution has models — first touch credits the channel that introduced the person, last touch credits the one that produced the click that became the application, multi-touch splits the credit — and most of them are more machinery than a hiring team needs. The honest version for recruiting is two questions asked of every application. What was the last thing they touched before they applied? That's the tag, and it's the number you fund next quarter. What did they say they heard first? That's the dropdown, and it's the number that tells you whether the ad is doing the introducing or the referral network is. Where the two disagree — the tag says social, the candidate says "my cousin" — both are true: the cousin mentioned it and the ad closed it, which is what a referral program and a campaign running together are supposed to do. What the honest version refuses to do is pick a channel's applicant count from the platform's own report and divide spend by it as if the report were the ATS. The platform's count is layer one. The budget decision belongs to layer two, reconciled, and the cost per hire — if you compute one — to layer three alone.

Why cost per hire can't come from ad data

This is the sentence we put on every page, and this is the page where the reason lives. An ad platform sees a click and, if the form is inside it, an application. It doesn't see the interview, the offer, the start date or the ninety-day survivor; those are in the ATS and payroll, tagged to a source only if layers two and three were built. So any cost per hire a platform or a vendor reports from ad data is media spend divided by an assumed hire ratio — an assumption presented as a measurement — and any cost per hire that compares channels is only as good as the source field's coverage for each one. Our benchmark publishes cost per applicant with the management fee inside and says explicitly that it tracks no hires; the honest cost per hire is yours, computed in the ATS from applications that arrived with a source, by channel, over a quarter, and the job board ROI page is built to hold that arithmetic. What we'll say about our own channel is what layer one supports: a median $13.88 per applicant across 891 campaigns, $8.02 volume-weighted, and a conversion rate that explains 70% of the variation. What we won't say is how many of them you hired, because we don't know, and neither does anyone else selling you ads.

The quarterly reconciliation: forty minutes that decides the budget

Once a quarter, one spreadsheet, four columns per channel: what the platform counted (clicks, applications, spend), what the ATS tagged to the channel, how many of those were hired, and how many are still there at day 90 (why that column matters). Three things fall out of it. Coverage — the ATS-tagged count divided by the platform's count — tells you whether each channel's tracking is real; a channel at 40% coverage is a channel whose cost you don't actually know, and the fix is the integration or the tag, not the budget. The unknown share — applications with no source over all applications — tells you how much of your hiring is invisible; above a third, the "how did you hear" field is defaulting and the import isn't requiring a source. And the reconciled cost per applicant by channel, with the fee inside, is the number the next quarter's budget is built on — the concentration finding from the benchmark (the top 10% of campaigns produced 57% of applicants on 22% of budget) is only visible when you can see which campaigns those were. The analytics page has the weekly version; this is the quarterly one, and it's the one the ATS vendor's dashboard usually can't do because it doesn't hold the platform's side — which is the layer argument again.

When attribution is the wrong thing to build

Three cases. If you run one channel, you don't have an attribution problem, you have a conversion problem; measure the funnel on the conversion page and skip the tagging. If your hiring is a handful a year, the source field's honest answer will be "the network" and the ATS's job is to record it, not to model it. And if the ATS can't accept a source at import — some can't, or can only through a vendor connector — the fix is the connector or a different intake, not a spreadsheet a recruiter maintains by hand, because hand-maintained attribution lasts about a month. What no employer should skip is the one line that costs nothing: keep the application where the ad is, so layer one is never blind.

Frequently asked questions

What is job advertising attribution?

Knowing which ad produced which applicant, and which applicant became a hire. It has three layers owned by three systems: the ad platform counts clicks and, if the form is in-platform, applications; the ATS holds the source field that ties each application to a channel; and the hire is recorded only in the ATS or payroll. Attribution breaks at the gap between any two layers — the tracking gap between platform and ATS, and the attribution gap between application and hire — and the two have different fixes.

How do you track where applicants come from?

Keep the form in the ad platform where you can, so the integration carries the source into the ATS with nobody typing; tag every off-platform landing URL with Google's utm_source, utm_medium and utm_campaign; make the ATS source field required at import with one vocabulary; keep the "how did you hear" question for referrals but never let it overwrite a tag; and give offline channels a code that exists nowhere else — a QR code on the flyer, a short URL at the open house. Reconcile the platform's count against the ATS's tagged count quarterly.

What is the tracking gap?

The break between what an ad platform counts and what the ATS records. One of the largest advertisers in our behavioral-health segment ran 60,889 clicks with zero tracked applications, because every click left for an external ATS the platform couldn't see. The cost figure that produces — spend divided by zero — is an artifact, and we don't publish it. The fix is the in-platform form or a tagged landing URL that the ATS reads.

Why can't cost per hire be calculated from ad data?

Because ad data ends at the application. A platform sees clicks and in-platform applications; it never sees interviews, offers, starts or 90-day survivors, which live in the ATS and payroll. A cost per hire from ad data is spend divided by an assumed hire ratio — an assumption presented as a measurement. Our benchmark publishes cost per applicant ($13.88 median across 891 campaigns, fee inside) and says explicitly that it tracks no hires. Your cost per hire is computed in your ATS, by channel, from applications that arrived with a source.

What are UTM parameters for recruiting?

Google's convention for tagging a URL so analytics and an ATS can read where a visitor came from. Google says "you should always use utm_source, utm_medium, and utm_campaign" — the referrer (for example facebook or indeed), the medium (paid_social, cpc), and the campaign name — and recommends utm_id and utm_source_platform as well. For recruiting, add the role and the market into the campaign name so the ATS label and the URL tag say the same thing. The builder on this page writes one.

Which attribution model should a hiring team use?

Two questions, not a model: what was the last thing the applicant touched before applying (the tag — the number you fund), and what do they say they heard first (the dropdown — the number that tells you whether ads or referrals are doing the introducing). Where the two disagree, both are usually true. What to avoid is taking a platform's own applicant count and dividing spend by it as if the platform's report were the ATS.

How often should you reconcile ad reports with the ATS?

Quarterly, in one spreadsheet with four columns per channel: the platform's clicks, applications and spend; the ATS's tagged applications; hires from those; and 90-day survivors. Coverage (ATS tagged ÷ platform applications) tells you whether a channel's cost is real; the unknown share tells you how much hiring is invisible; and the reconciled cost per applicant by channel is what next quarter's budget is built on.

Does Boostpoint track hires?

No. We run the first layer — ads with an in-platform form — and deliver applicants into the ATS through integrations with the source tagged, which closes the tracking gap. We don't see the hire, we've never computed a cost per hire from ad data, and we don't publish one for any role. The benchmark's figures are cost per applicant with the management fee inside; the hire is yours to count.

Close the tracking gap before the next budget

Bring one channel's ad report and the same month's ATS export. We'll show you the coverage, set up the integration so the source rides in with every applicant, and hand you the reconciliation sheet — with the management fee inside every figure and no cost per hire we didn't measure.

Book a Demo

Boostpoint figures come from the 2026 Social Job Advertising Benchmark — 891 campaigns and 1,334 campaign-months, costs inclusive of campaign management, applications counted by the platform: median $13.88 per applicant, $8.02 volume-weighted; conversion explaining 70% of cost variation; top 10% of campaigns 57% of applicants on 22% of budget. The tracking-gap example (60,889 clicks, zero tracked applications, campaigns routed to an external ATS) is from Boostpoint campaign records; no cost figure is published for it or for its segment, because a cost per applicant over zero tracked applications is an artifact. UTM parameters and guidance quoted from Google Analytics Help, "Collect campaign data with custom URLs" (read August 27, 2026); Indeed Job Sync XML tracking_url element from Indeed Partner Docs (read August 26, 2026); Google JobPosting directApply from Google Search Central (updated December 18, 2025). The gap finder and tag builder compute on the reader's inputs. Cost per applicant is not cost per hire; we do not track hires and publish no cost-per-hire figure. A sample of Boostpoint campaigns, not an industry-wide study.