Methodology
The whole method, published: server-side events, deduplication rules, offline conversion import, and the arithmetic that decides whether your budget can learn from it.
Campaign Manager reports cost per lead. Your CRM reports closed-won. When a $12,000 month delivers cheap leads and no deals, the gap between those two records is a plumbing problem. This page is the plumbing, published in full: every layer, every rule, and the arithmetic that decides whether your budget can learn from it. Run it yourself and it works the same as when we run it.
The browser layer, and why it is not enough
Most B2B accounts on LinkedIn fire conversions from one place: the browser. The Insight Tag loads on your landing pages, watches for a thank-you page or a form submit, and reports back to Campaign Manager. Start by confirming what actually exists. In Campaign Manager, open Account Assets → Conversions and read every rule: its source, its counting method, and the pages it claims to fire on. Then open Account Assets → Insight Tag and check install status and match rate — a tag that fires on half your pages is half a tag.
What the browser layer cannot do is arrive when the visitor runs an ad blocker, when iOS privacy settings clip the request, when the cookie expired three weeks ago, or when the person who clicked the ad is not the person who filled the form. Each failure eats a share of your conversion events. The consequences cascade: you under-report conversions, the algorithm bids against a partial and biased sample, and cost per lead looks healthy while cost per opportunity climbs. Nobody can diagnose it, because the diagnosis lives in the events that never arrived.
Conversions API, server-side
Conversions API sends the same conversion events from your server instead of the visitor’s browser. The form submit hits your endpoint; your endpoint fires the event to LinkedIn with the fields you choose — hashed email for matching, conversion value, currency. An event the browser blocked still arrives, because it never depended on the browser. The build is an endpoint on your own infrastructure or a middleware function, the conversion rule it reports into, and the field mapping from your form.
Server-side does not replace the pixel. Run both, deduplicate, and you catch what either one alone would lose.
LinkedIn’s own guidance is to run both: the Insight Tag for resilience and coverage, Conversions API for the events the browser cannot see. Running both is what makes the next section mandatory.
Deduplication rules
Running both sources means the same conversion can arrive twice. LinkedIn deduplicates on an eventId: when the Insight Tag and Conversions API report the same event with the same eventId from the same account, the Conversions API event is discarded and the Insight Tag event is counted once. You create one conversion rule per data source — a browser rule and a server rule — and you generate one ID per conversion, stamped on both transports at conversion time.
Decide the rule before you send the first event, and write it down:
Deduplication worksheet — fill in before the first event
event id generated at ... form submit, stored with the lead record
insight tag carries ... window.lintrk("track", { conversion_id, event_id })
server carries ....... the same event_id in the Conversions API payload
conversion rules ..... one per source, both mapped to the same funnel step
verify in reporting .. insight-tag count > CAPI count once dedup works
The check at the bottom matters. When deduplication is working, the Insight Tag conversion count in reporting runs higher than the Conversions API count, because the duplicate server events were discarded. Two equal counts usually means two IDs — that is, no deduplication at all.
Offline conversion import, field by field
Conversions API covers the events your site generates. Offline conversion import covers what your CRM decides later: which lead became an opportunity, which opportunity closed. Pushing CRM stages — MQL → SQL → opportunity → closed-won — back into LinkedIn is the single highest-leverage and least-implemented thing in the category. Once the stages arrive, campaigns can bid toward closed-won instead of form fills, and the auction stops rewarding the audiences that fill forms and never buy.
The mechanics are one conversion rule per stage in Campaign Manager, mapped to the CRM field that sets the stage, plus a stable identifier linking the lead to the click. That identifier is li_fat_id captured at form-fill time — which is why the form must carry it back into the CRM — or a hashed-email match. A scheduled export then sends each stage change as a conversion event under the rule for that stage:
| Stage | CRM field | CM rule | What it teaches the auction |
|---|---|---|---|
| MQL | lifecycle stage = MQL | cr_mql | Which audiences produce qualified leads, not just fills |
| SQL | lifecycle stage = SQL | cr_sql | Which audiences survive sales contact |
| Opportunity | deal created | cr_opp | Which audiences produce pipeline value |
| Closed-won | deal stage = won | cr_won | What a win looks like — the signal the budget should chase |
Send the stages you actually act on. A stage nobody works is noise the auction will happily optimize toward.
Match rates and list hygiene
Matched audiences — customer lists, retargeting pools, CRM-built segments — match on hashed identifiers, and match rate is a diagnosable, fixable metric that most accounts never check. The hashing rules are strict because a hash amplifies any difference: [email protected] and [email protected] hash to different values and silently miss each other. Normalise before hashing — trim whitespace, lowercase the whole address, then SHA-256 — and apply the same discipline to every upload.
Check match rate per list under Account Assets → Matched audiences. A rate far below your other lists means hygiene, not audience quality: stale records, role accounts, or a normalization step someone skipped. Fix the hygiene first; a “smaller but cleaner” list routinely outperforms the raw export it came from.
Learning-phase math, and reporting in closed-won
LinkedIn’s learning phase needs roughly fifty conversion events per campaign per month before delivery stabilizes. At a $100 cost per lead that is about $5,000 per campaign per month. Split a $10,000 budget across six campaigns and none of them ever graduates — the account reports activity while every campaign sits in learning, bidding cautiously on a sample too small to trust.
This arithmetic is why the spend floor exists, stated plainly: We don't take campaign management below $8,000/month in LinkedIn spend. Signal Repair has no floor.
It is also why the optimization target matters more than the bid. A campaign bidding on form fills gets fifty cheap lessons a month in producing form fills. A campaign bidding on closed-won gets fewer, better lessons — if the stages actually arrive. That is the loop this method builds: server-side events feed the auction, CRM stages teach it what a win looks like, and reporting in conversion events per 1,000 clicks and cost per closed-won tells you whether it worked. Cost per lead is the number CPL theater is built to protect; those two are the ones that survive an audit.

