# LinkedIn conversion tracking, Insight Tag or Conversions API

Both setups step by step, with working code for sending events and for keeping a conversion from counting twice.

*By Stan Rymkiewicz, maintainer of adwarp. Updated November 7, 2026.*

The LinkedIn Insight Tag is JavaScript on your site that records visits and conversions from the visitor's browser. The Conversions API sends conversions from your server, Salesforce or HubSpot, including ones that happen offline, like a qualified lead or a closed deal. Run both on the same events with a shared event ID so LinkedIn counts each conversion once, and attach every conversion rule to the ad sets it should measure.

## Insight Tag or Conversions API, the short answer

Start with the Insight Tag. LinkedIn's [conversion tracking page](https://business.linkedin.com/marketing-solutions/conversion-tracking) says it's free, and website retargeting runs on the same tag anyway. Add the Conversions API, often shortened to CAPI, when the conversion you care about happens after the form, like a lead your sales team qualifies or a deal signed on the third call. The tag never sees those, because they happen in your sales tools long after the visitor left the site.

*Fig. 01: Each source sees part of the journey, and a demo form sits in the overlap, so it goes out from both with 1 shared event ID.*

|  | Insight Tag | Conversions API |
| --- | --- | --- |
| Data source | JavaScript in the visitor's browser | Your server, Salesforce, HubSpot or a partner tool |
| Tracks | Page loads and on-site actions, such as a button click or a form submit | Anything you record, online or offline, such as a qualified lead or a closed deal |
| Who builds it | Whoever edits the site or the tag manager | A partner integration, or a developer: 2 to 4 weeks on average for a direct build |
| How it matches people | LinkedIn cookies and the `li_fat_id` click ID, plus hashed emails with enhanced matching | Emails hashed with SHA-256, the `li_fat_id` click ID, IP address, name and company |
| Longest conversion window | 90 days | 365 days for lead, purchase and a few other types |
| Data retention | Direct identifiers removed within 7 days, the rest deleted within 180 days | Deleted after 180 days, with only aggregate reporting kept |
| Role in deduplication | Its event is kept | Its copy is dropped when the event IDs match |

Sources, checked 2026-11-07: LinkedIn's [Insight Tag FAQs](https://www.linkedin.com/help/lms/answer/a427660), [Conversions API overview](https://www.linkedin.com/help/lms/answer/a1655394) and [conversion window page](https://www.linkedin.com/help/lms/answer/a426359), plus Microsoft Learn's [Conversions API schema](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api-schema) and [deduplication guide](https://learn.microsoft.com/en-us/linkedin/marketing/conversions/deduplication).

LinkedIn's case for adding the API comes from its own beta. Across 829 campaigns run from July 1 to August 26, 2023, it reported 31% more attributed conversions and a 20% lower cost per action ([LinkedIn Ads growth page](https://business.linkedin.com/advertise/cx/24/05/linkedin-ads-growth)). The page says nothing about method beyond a footnote with the sample and the dates.

## Set up the Insight Tag

You need 1 tag for the whole site, and every Insight Tag conversion you create later reads from it, so put it in the template every page shares.

*Fig. 02: The tag goes in the global footer, so every page carries it, and Signals manager reports it as active, no recent activity or unverified.*

### Install it by hand or with Google Tag Manager

In Campaign Manager, go to Measure > Signals manager > Insight Tag ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a418880)). You can install it yourself, send it to a developer or use a tag manager. By hand, paste the code right before the closing `</body>` tag in your global footer. In Google Tag Manager, LinkedIn's Insight Tag 2.0 template asks for the partner ID shown with your tag.

Paste the code exactly as Campaign Manager gives it, with straight quotation marks. Some editors swap in curly ones on paste, and the tag then never verifies. Keep it off pages that collect or show sensitive data: pages that offer health or financial products to consumers, or where people manage medical appointments or financial accounts.

This is LinkedIn's base code with 1 line added on top, the event ID used later for [deduplication](#run-both-without-double-counting). Use the partner ID from your own account.

`footer.html`:
```html
<script>
  // A new ID per page view, rendered by your server before the tag loads.
  window._linkedin_event_id = "{{ eventId }}";
</script>
<script type="text/javascript">
  _linkedin_partner_id = "12345";
  window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
  window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
  (function(l) {
  if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
  window.lintrk.q=[]}
  var s = document.getElementsByTagName("script")[0];
  var b = document.createElement("script");
  b.type = "text/javascript";b.async = true;
  b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
  s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
<noscript>
  <img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=12345&fmt=gif" />
</noscript>
```

### Check it's firing

LinkedIn checks the tag once a page that carries it gets a visit, which takes anywhere from a few minutes to 24 hours. The status sits under Measure > Signals manager > Insight Tag ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a488323)). Active means LinkedIn got a signal in the past 7 days. No recent activity means the last 1 is older than that, and Unverified means the tag has never sent anything.

For a quicker check, open your browser's developer tools, filter the Network tab for `ads.linkedin.com` and reload. LinkedIn's [troubleshooting page](https://www.linkedin.com/help/lms/answer/a425696) says that request should return status 302.

*Fig. 03: Filtered for ads.linkedin.com after a reload, the Network tab should list the tag's request with status 302.*

### Create an Insight Tag conversion

Go to Measure > Conversion tracking > Create conversion > Insight Tag conversion ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a425606)). Name the rule and set its category, value, click and view windows and attribution model. Then pick how it counts:

- Page load counts a visit to pages you name by address, such as `/demo/thank-you`. Use it when a form ends on its own thank-you page.
- Event-specific counts an action, such as a button click, through a line of code Campaign Manager generates. It's a `window.lintrk("track", { conversion_id: ... })` call.

*Fig. 04: Page load counts anyone who reaches /demo/thank-you, while an event-specific rule waits for the button click that runs its lintrk call.*

If your forms collect emails, turn on enhanced matching. The tag then hashes the email on your site and sends it with the visit, and LinkedIn says it only matches information it already has ([Insight Tag FAQs](https://www.linkedin.com/help/lms/answer/a427660)). Check enhanced conversion tracking too. It adds the `li_fat_id` click ID to ad clicks and keeps it in a first-party cookie for 30 days, and it's on by default for recently created tags ([Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies)). The Conversions API uses that ID to match people.

## Set up the Conversions API

The API needs 3 things in order: a conversion rule, the ad sets attached to it, and a stream of events ([Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api)). With a partner tool you mostly fill in forms. A direct build makes those requests from your own code, shown below with curl and Node.

*Fig. 05: A direct build reads your records, hashes each email with SHA-256 on your server and posts the events to LinkedIn in batches of up to 5,000.*

### Partner or direct

LinkedIn lists 14 partners on its [Conversions API page](https://www.linkedin.com/help/lms/answer/a1655394) and calls them typically fast to set up, though some may charge. Its estimate for a direct build is 2 to 4 weeks on average, plus developer time to maintain it afterward.

| Route | Options LinkedIn lists | Pick it when |
| --- | --- | --- |
| Partner: the app that holds the record | HubSpot, Salesforce Data 360, Zoho Recruit | The stage or hire you want to send already lives there |
| Partner: data pipelines | Adobe, Hightouch, Segment, Tealium | Your events already flow through 1 of them |
| Partner: automation | Zapier, Make | A handful of events and no developer |
| Partner: tag management | Google Tag Manager | Your site's tags already live there |
| Partner: attribution and reporting | Dreamdata, Factors.ai, Funnel, Supermetrics | You already pay for 1 of them |
| Direct build | Your own code against the API | You need custom events, your own matching logic or no extra vendor |

### Create the conversion rule

In Campaign Manager, go to Measure > Conversion tracking > Create conversion > Conversions API ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a1657171)). The dialog asks for a name, a category such as Lead, a value, click and view windows and an attribution model, then for the ad sets to attach.

Through the API, it's 1 request to `POST /rest/conversions` with `conversionMethod` set to `CONVERSIONS_API`. Set the windows yourself. Leave them out and the API applies 30 days after a click and 7 after a view ([schema](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api-schema)), shorter than Campaign Manager's 90 and 90. The optional `autoAssociationType` parameter attaches ad sets while the rule is created, covered [below](#attach-every-conversion-to-its-ad-sets).

*Fig. 06: An API rule created without the 2 windows gets 30 days after a click and 7 after a view, where Campaign Manager would have set 90 and 90.*

`create-rule.sh`:
```bash
curl -X POST 'https://api.linkedin.com/rest/conversions?autoAssociationType=OBJECTIVE_BASED' \
  -H "Authorization: Bearer $LINKEDIN_TOKEN" \
  -H 'Linkedin-Version: 202610' \
  -H 'X-Restli-Protocol-Version: 2.0.0' \
  -H 'Content-Type: application/json' \
  --data '{
    "name": "Demo request - Conversions API",
    "account": "urn:li:sponsoredAccount:5123456",
    "conversionMethod": "CONVERSIONS_API",
    "type": "LEAD",
    "postClickAttributionWindowSize": 90,
    "viewThroughAttributionWindowSize": 90,
    "attributionType": "LAST_TOUCH_BY_CAMPAIGN"
  }'
```

The new rule's ID comes back in the `x-restli-id` header, and events point at it as `urn:lla:llaPartnerConversion:<id>`. The token needs the `rw_conversions` and `r_ads` scopes from someone with a role on the ad account above viewer. Getting a LinkedIn app and token in the first place is covered in [the LinkedIn Ads API guide](https://adwarp.dev/blog/linkedin-ads-api).

### Send events

Each event goes to `POST /rest/conversionEvents` with the rule, a timestamp in milliseconds from the past 90 days, and at least 1 way to recognize the person. That can be a SHA-256 hashed email, the `li_fat_id` click ID (as `LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID`), an IP address, a LiveRamp ID or a Google advertising ID. `userInfo` adds name, title, company and country for looser matching. Only matched events count toward attribution and optimization, so LinkedIn asks for every identifier you have.

`event.json`:
```json
{
  "conversion": "urn:lla:llaPartnerConversion:104012",
  "conversionHappenedAt": 1793889120000,
  "eventId": "7b1e4c2a-5d2f-4a8e-9c61-3f0d2e8a9b47",
  "user": {
    "userIds": [
      { "idType": "SHA256_EMAIL", "idValue": "f5430f1e66e14ec2682cf1685392753f8609a9042eba435b3711294b0655d09d" },
      { "idType": "LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID", "idValue": "df5gf5-gh6t7-ph4j7h-fgf6n1" }
    ],
    "userInfo": {
      "firstName": "Ana",
      "lastName": "Ruiz",
      "title": "Head of Operations",
      "companyName": "Northwind Analytics",
      "countryCode": "US"
    }
  }
}
```

For volume, batch the events. Add the `X-RestLi-Method: BATCH_CREATE` header and wrap the events in an `elements` array, up to 5,000 per request. A member token gets 600 requests a minute and 500,000 a day before LinkedIn throttles it, and batches keep a big sync well inside both.

`send-events.mjs`:
```js
const URL = "https://api.linkedin.com/rest/conversionEvents";

export async function sendEvents(token, events) {
  for (let i = 0; i < events.length; i += 5000) {
    const res = await fetch(URL, {
      method: "POST",
      headers: {
        Authorization: `Bearer ${token}`,
        "Content-Type": "application/json",
        "Linkedin-Version": "202610",
        "X-Restli-Protocol-Version": "2.0.0",
        "X-RestLi-Method": "BATCH_CREATE",
      },
      body: JSON.stringify({ elements: events.slice(i, i + 5000) }),
    });
    if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  }
}
```

1 malformed event fails the whole batch. The error names it by `batchIndex`, and you resend everything after fixing it ([Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api)).

### Hash emails with SHA-256

LinkedIn wants the email lowercased and stripped of spaces, then hashed with SHA-256 into a 64-character hex string. Hash it on your server, before it leaves. Both snippets turn `" Ana.Ruiz@Northwind-Analytics.example "` into the hash in the event above.

`hash.mjs`:
```js
import { createHash } from "node:crypto";

export const sha256Email = (email) =>
  createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
```

`hash.py`:
```python
import hashlib

def sha256_email(email: str) -> str:
    return hashlib.sha256(email.strip().lower().encode("utf-8")).hexdigest()
```

## Run both without double counting

LinkedIn recommends sending the same events through both the tag and the API, a setup it calls redundant. Left alone, each demo request would then count twice. Deduplication needs 2 things ([Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/conversions/deduplication)):

1. A separate conversion rule for each source, such as "Demo request - Insight Tag" and "Demo request - Conversions API".
2. 1 ID per event, sent from both sides: `window._linkedin_event_id` (or `event_id` in a `lintrk` call) in the browser, `eventId` from the server.

When an Insight Tag event and a Conversions API event arrive from the same account with the same ID, LinkedIn keeps the Insight Tag event and takes the duplicate off the API rule's count. Both rules show in the conversion breakdown. If deduplication works, the Insight Tag rule usually has the higher count, and the API rule holds what the browser missed.

*Fig. 07: When the browser and the server send a demo request with the same event ID, LinkedIn counts the Insight Tag event and drops the API copy.*

Creating the ID on the server keeps both sides in step. When the form posts, make the ID, send the API event with it, and render it into the thank-you page above the tag so the page load conversion carries the same value.

*Fig. 08: The ID starts on the server when the form posts, and the API event and the thank-you page both get it from there, so the tag sends the same value.*

`demo-route.mjs`:
```js
import { randomUUID } from "node:crypto";
import { sha256Email } from "./hash.mjs";
import { sendEvents } from "./send-events.mjs";

app.post("/demo", async (req, res) => {
  const eventId = randomUUID();
  const userIds = [{ idType: "SHA256_EMAIL", idValue: sha256Email(req.body.email) }];
  const clickId = req.cookies.li_fat_id; // first-party cookie from enhanced conversion tracking
  if (clickId) userIds.push({ idType: "LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID", idValue: clickId });

  await sendEvents(process.env.LINKEDIN_TOKEN, [{
    conversion: "urn:lla:llaPartnerConversion:104012", // the Conversions API rule
    conversionHappenedAt: Date.now(),
    eventId,
    user: { userIds },
  }]);

  res.render("thank-you", { eventId }); // sets window._linkedin_event_id above the tag
});
```

With Google Tag Manager, push the ID to the data layer before the container loads and map it to the Event ID field in LinkedIn's template.

## Send pipeline stages from Salesforce or HubSpot

The tag stops at the thank-you page. Whether that demo request turned into a sales qualified lead or a signed contract is recorded in Salesforce or HubSpot, and the API is how LinkedIn hears about it.

*Fig. 09: A deal that closes 150 days after the ad click falls outside the 90-day limit for Insight Tag rules, and a Conversions API rule with a 180 or 365-day window still counts it.*

From API version 202608, conversion rules can use 2 pipeline types, `MARKETING_QUALIFIED_LEAD` and `SALES_QUALIFIED_LEAD`, next to the older `QUALIFIED_LEAD` ([schema](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api-schema)). Qualified leads also work as an optimization goal for Lead Generation and Website Conversion ad sets. LinkedIn recommends setting up the Conversions API before you pick that goal ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a1655394)).

3 details decide whether stage events count:

- **The window.** Conversions API and CSV rules for lead, qualified lead, marketing qualified lead, sales qualified lead, purchase, add to cart and submit application can use 180 or 365-day windows. Insight Tag rules stop at 90 ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a426359)).
- **The timestamp.** The event itself must have happened in the past 90 days when you send it. Sync stage changes daily. The long window is about how far back the ad click can be.
- **The identity.** A stage change in Salesforce has no browser attached, so send the hashed email, and for a Lead Gen Form lead, its form response URN in `lead`. Once an `externalIds` value, such as the Salesforce lead ID, matches a member alongside other identifiers, LinkedIn keeps that mapping for 1 year across ad accounts in the same Business Manager. Later stage events can carry the external ID alone.

*Fig. 10: When a Lead Gen Form lead reaches a later stage in Salesforce or HubSpot, its event carries the form response URN along with the hashed email and the external ID.*

Before anyone builds or buys a sync, Campaign Manager also takes conversions as a CSV upload. LinkedIn says uploaded data usually shows in reporting within 24 to 48 hours and sometimes takes a week ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a422513)).

Adwarp's [Salesforce](https://adwarp.dev/integrations/salesforce) and [HubSpot](https://adwarp.dev/integrations/hubspot) integrations run the other way. They turn a query or a list into a LinkedIn matched audience, hashing emails on your machine, and don't send conversion events.

## Attach every conversion to its ad sets

"Conversions will only be tracked when attached to an ad set," LinkedIn's [help page](https://www.linkedin.com/help/lms/answer/a1657171) says. A rule with a clean stream of events and no ad sets reports 0. The API calls ad sets campaigns, so its attachment settings say campaign.

*Fig. 11: 2 rules feed the ad sets they're attached to, and the third, attached to nothing, counts 0 no matter how many events it receives.*

You can attach a rule in 3 places:

- In Campaign Manager, on the rule under Conversion tracking, or while you build an ad set, where LinkedIn preselects conversions that fit its objective.
- When you create the rule through the API, with `autoAssociationType`. `ALL_CAMPAIGNS` attaches up to 200 ad sets in the account, `OBJECTIVE_BASED` attaches every ad set whose objective fits the rule's type with no cap, and both include active, paused and draft ad sets. Leave it out and nothing is attached.
- Afterward through the API, 1 ad set at a time or in a batch, with `PUT /rest/campaignConversions`.

Then check the 2 settings that shape the count. Campaign Manager's default window is 90 days after a click and 90 after a view, and a change applies only to conversions from then on ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a426359)). Under "Last Touch - Each ad set", every ad set the person interacted with in the window gets the conversion. "Last Touch - Last ad set" gives it to the most recent 1 only ([LinkedIn Help](https://www.linkedin.com/help/lms/answer/a426349)). With Each ad set, adding conversions across ad sets overstates the total.

*Fig. 12: Under Each ad set, 1 person who interacted with 3 ad sets before converting adds a conversion to all 3, so summing them shows 3 where Last ad set shows 1.*

Adwarp only touches this step. [`list_conversions`](https://adwarp.dev/docs/tools/conversions) (`adwarp conversions list` in the CLI) shows the rules on the account with ID, on or off, type and name. `create_campaign` takes `conversionIds`, and `launch_from_brief` also takes a `conversionName`. With neither, Adwarp attaches the rules named in `defaultConversionNames` in your [config](https://adwarp.dev/docs/config). It adds the new ad set to each rule's existing list without dropping the ones already there, and every ad set it [creates](https://adwarp.dev/linkedin-ads/campaigns) starts as a draft.

```text
> Which conversion rules can the new ops leaders ad set track?
adwarp.list_conversions default account  4 rules
9100201  on  LEAD                  Demo request - thank you page
9100202  on  KEY_PAGE_VIEW         All site page views
9100203  on  LEAD                  Demo request (old site)
9100204  on  SALES_QUALIFIED_LEAD  Sales qualified lead - Salesforce
All site page views counts every page load. Keep it off a demo ad set.
> Draft the ad set with the demo request and sales qualified lead rules.
adwarp.create_campaign conversionIds 9100201, 9100204  DRAFT
2 conversion rules attached to the draft ad set.
```

## Troubleshooting

When conversions go missing, check the tag first, then the rule, the attachment and the event payload, in that order.

*Fig. 13: Each check depends on the 1 above it, so a rule that isn't attached reports 0 even when the tag is active and the events are clean.*

| Symptom | Likely cause | Fix | Source |
| --- | --- | --- | --- |
| Tag shows Unverified | No visit yet, a partial copy, curly quotes, or blocked LinkedIn domains such as `snap.licdn.com` | Recopy the code, visit a tagged page, wait up to 24 hours, check the Network tab | [a425696](https://www.linkedin.com/help/lms/answer/a425696) |
| Tag shows No recent activity | No signal for more than 7 days, for example after a site rebuild dropped the footer code | Reinstall the tag in the shared template | [a488323](https://www.linkedin.com/help/lms/answer/a488323) |
| Conversions stay at 0 | The rule isn't attached to the ad set, or it's turned off | Attach it under Conversion tracking and turn it on | [a1657171](https://www.linkedin.com/help/lms/answer/a1657171) |
| API error "Conversion time should be within 90 days" | An old event, or a timestamp in seconds | Send within 90 days and add 3 zeros to second timestamps | [Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api) |
| API error "The request must contain one of these fields" | No user identifier in the event | Add a hashed email, `li_fat_id` or another ID type | [Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api) |
| API error about a conversion "marked as deleted" | The rule was deleted | Create a new rule and point events at its ID | [Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api) |
| API rule outcounts the tag rule | Event IDs differ between browser and server, or both sources share 1 rule | Log the ID on both sides, keep 1 rule per source | [Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/marketing/conversions/deduplication) |
| Clicks but no conversions | Conversion page untagged, or a redirect or single-page app strips `li_fat_id` from the address | Tag the page, keep `li_fat_id` through redirects and routing | [a476761](https://www.linkedin.com/help/lms/answer/a476761) |
| Recent days look low | Reporting lag, 24 to 48 hours for CSV uploads | Leave the last 2 to 3 days out of judgments | [a422513](https://www.linkedin.com/help/lms/answer/a422513) |

*Fig. 14: A redirect that drops li_fat_id between the ad click and the landing page is 1 reason an ad set shows clicks and no conversions.*

Watch for the opposite problem too. A rule that counts every page view, attached next to demo requests, blends both into 1 cost per conversion. Adwarp's [performance review skill](https://adwarp.dev/docs/skills/linkedin-ads-performance-review) asks which conversion actions the Conversions column counts before it judges an ad set on cost per conversion, and the [audit skill](https://adwarp.dev/docs/skills/linkedin-ads-audit) checks tag status and which rules each ad set carries.

### What Adwarp does here

Adwarp lists the conversion rules already on the ad account and attaches the chosen 1 to every ad set it creates. It doesn't create rules, install the tag or send events, so the setup in this post happens in Campaign Manager, a partner tool or your own server.

Put it to work: [LinkedIn Ads reporting](https://adwarp.dev/linkedin-ads/reporting). Pull spend, click-through rate and cost per conversion by campaign, ad set or ad from your terminal.

## Questions

### What is the LinkedIn Insight Tag?

It's a short piece of JavaScript you add to every page of your site. It records visits and conversions from the browser for LinkedIn's conversion tracking, website retargeting and audience insights, and LinkedIn says it's free.

### How do I set up the Insight Tag?

In Campaign Manager, go to Measure, then Signals manager, then Insight Tag, and choose to install it yourself, send it to a developer or use a tag manager. Paste the code right before the closing body tag in your global footer, with straight quotation marks. Then visit a tagged page and give LinkedIn up to 24 hours to verify it.

### How do I test the Insight Tag?

Open Measure, Signals manager, Insight Tag and read the status: Active means a signal in the past 7 days, and Unverified means LinkedIn has never received one. For a live check, filter your browser's Network tab for ads.linkedin.com and reload a tagged page. LinkedIn's troubleshooting page says the request should return status 302.

### Do I still need the Insight Tag if I use the Conversions API?

For most sites, yes. LinkedIn recommends sending events through both, and the tag's first-party cookie carries the li_fat_id click ID that helps the API match people. Give each source its own conversion rule and share 1 event ID so nothing counts twice.

### What is the purpose of the Conversions API?

It sends conversions from your server instead of the browser, so LinkedIn can count events the tag never sees, such as a sales qualified lead in Salesforce or a deal closed on a call. LinkedIn uses those events for reporting, attribution and optimization, including the qualified leads goal.

### Is the LinkedIn Conversions API free?

LinkedIn's help pages and API docs list no price for sending events, and the API needs a token with the rw_conversions and r_ads scopes. LinkedIn notes that partner integrations might have fees. A direct build costs developer time instead, 2 to 4 weeks on average by LinkedIn's estimate.

### Why am I getting clicks but no conversions?

Check the rule first: LinkedIn only tracks a conversion that's attached to an ad set, and the rule has to be turned on. Then check that the conversion page carries the tag and that redirects or a single-page app don't strip li_fat_id from the address. CSV uploads can also take 24 to 48 hours to show.

### Is LinkedIn's conversion tracking any good?

Browsers that block LinkedIn's tracking domains are missed, and LinkedIn models some conversions it can't tie to a member. Under Last Touch, Each ad set, every ad set a person touched gets the credit, so ad set totals overlap. In LinkedIn's own 2023 beta of 829 campaigns, adding the Conversions API raised attributed conversions by 31%.

### Which attribution window should I use?

LinkedIn recommends its default of 90 days after a click and 90 days after a view for most conversions. For long sales cycles, Conversions API and CSV rules for leads, qualified leads, purchases and a few other types can use 180 or 365 days. A change applies only to conversions from then on, so set it before launch.

### How long does LinkedIn keep the data?

For the Insight Tag, LinkedIn removes members' direct identifiers within 7 days and deletes the remaining pseudonymized data within 180 days. Conversions API data is deleted after 180 days, and only the aggregate reporting in Campaign Manager stays.

## Related

- [Conversion tools](https://adwarp.dev/docs/tools/conversions): How Adwarp lists conversion rules and attaches them to the ad sets it creates.
- [LinkedIn Ads API guide](https://adwarp.dev/blog/linkedin-ads-api): Apps, scopes, headers and the requests behind every Campaign Manager object.
- [Do LinkedIn ads work?](https://adwarp.dev/blog/do-linkedin-ads-work): What public data says about returns, and how to test the channel in 90 days.

Canonical page: https://adwarp.dev/blog/linkedin-conversion-tracking
Last updated: 2026-11-07
