Vendor · engineers · marketers · PMs
Insight Tag plus CAPI in milliseconds
B2B funnels convert in Salesforce days later. That is offline CAPI, milliseconds, hashed email. The image pixel on /thanks still helps for the fast leads.
Insight Tag (browser / image)
Image pixels hit px.ads.linkedin.com/collect. vendor/linkedin is ecosystem_reference: LinkedIn documents the Campaign Manager workflow more than the query string. pid is the numeric Partner ID (required). conversionId is expected; without it the fire lands on the Insight Tag rather than a specific conversion. fmt is gif, img, or js. The generated image uses fmt=gif.
URL length still applies. Raw email in the query is still a bad idea. An image cannot hash an email. li_fat_id on the landing URL is the click id you should store for CAPI userIds. Network filter: px.ads.linkedin.com. Pack page /packs/linkedin/. Do not treat this GET as the CAPI JSON.
https://px.ads.linkedin.com/collect?pid=123456&conversionId=78910&fmt=gif
pixellint validate url @insight.txt --rulepack vendor/linkedin
CAPI: URN plus milliseconds
Stream to api.linkedin.com/rest/conversionEvents, single event or batch under elements. conversion is required in the form urn:lla:llaPartnerConversion:ID. conversionHappenedAt is required, exactly 13 digits (milliseconds). A 10-digit seconds value is vendor.linkedin-conversions-api.body.conversionHappenedAt.invalid and reads as 1970, which is older than LinkedIn's 90-day window. Date.now() is correct here. Dividing by 1000 because Meta needed seconds is wrong here.
user.userIds is required even when you match on lead, externalIds, or userInfo, in which case it is sent as an empty list. LinkedIn returns a 422 when the field is absent. idType unrecognized values warn rather than error (the list is taken from LinkedIn's validation error and may not be exhaustive). SHA256_EMAIL with hashed idValue. conversionValue needs a currencyCode if you send an amount. Unhashed email on an identifier is flagged. Pack page: /packs/linkedin-conversions-api/.
{
"conversion": "urn:lla:llaPartnerConversion:123456",
"conversionHappenedAt": 1770000000000,
"conversionValue": { "amount": "19.99", "currencyCode": "USD" },
"user": {
"userIds": [{ "idType": "SHA256_EMAIL", "idValue": "64CHARHEXDIGEST" }]
}
}
Dedup, URN, and CRM
LinkedIn CAPI is keyed by the conversion URN, not by Meta's event_id field name. The Insight Tag conversionId and the CAPI URN have to refer to the same conversion rule you created with conversionMethod CONVERSIONS_API. Fast leads on /thanks still fire the image. Slow CRM wins upload later with conversionHappenedAt at the Salesforce time, milliseconds, hashed email.
A thank-you image pixel and a closed-won upload can be two events or one, depending on whether you optimize for leads or revenue. Decide before Zapier. Dedup is weaker than Meta's event_id story: do not fire CAPI on every Insight conversion and again on every Salesforce stage without a written rule. Mint a stable identity for retries. A new timestamp on replay is how a lead counts twice.
Clock and hashing
Milliseconds, like Amplitude, unlike Meta and Pinterest. CRM uploads must send the time the lead converted, not the time of the nightly job. Events older than 90 days drop. A seconds clock looks expired immediately because it reads as 1970.
SHA-256 email in userIds. Do not put a raw address in idValue. PLAINTEXT_IP_ADDRESS is plaintext by name. Do not SHA-256 it because a Meta helper hashed every string. Lead gen forms on LinkedIn plus a CRM upload is a third path. Do not mix that clock with the Insight Tag's fire time unless they are the same instant.
pixellint validate json @li-capi.json --rulepack vendor/linkedin-conversions-api
Independence
Pixellint is not affiliated with LinkedIn. Campaign Manager conversion ids are yours to keep straight; the pack will not invent them. The Insight Tag pack is ecosystem evidence. The CAPI pack is official_vendor on the published Conversions API. Both pipes: image plus JSON, milliseconds on the server, URN on conversion, hashed email, not Meta's seconds.
Pack pages under /packs/linkedin/ and /packs/linkedin-conversions-api/ are complementary to this playbook. Open the actual POST. pixellint validate url on the collect pixel and pixellint validate json on the CAPI body.
Check the artifact
Paste the pixel URL or JSON body into the
playground. Same engine as
pixellint validate. Nothing leaves the tab.