LinkedIn offline conversions and the Conversions API: how to send closed deals back
B2B sales cycles are long. The ad click happens in spring. The deal closes in autumn. And LinkedIn, of all the platforms, is the hardest one to close the loop on, for a reason that's mostly arithmetic.
Here's how it actually works. There are two routes. You can upload a CSV in Campaign Manager, and rows older than 90 days are dropped. Or you can send events through the Conversions API as they happen.
What does LinkedIn match on? A hashed email, the li_fat_id (LinkedIn's click identifier), or a name together with company or job title. It does not match on phone number. So a lead with only a phone number can still reach Meta, Google Ads and TikTok, but LinkedIn can't match it. That single fact changes how you should design your forms: for LinkedIn, a work email matters more than a phone.
Now the arithmetic. LinkedIn accepts conversions up to 90 days old. Suppose your sales cycle is 180 days. The click happens on 1 January and the deal closes on 1 July. By the time the deal is won, the click is far outside the window. It doesn't matter how tidy your data is. The conversion can't be attributed, and you'll never know why the campaign "doesn't work".
The fix is to stop waiting for the closed deal. Send the stages that happen inside the window: a sales-qualified lead at day 30, a demo held at day 60, a proposal sent at day 90. Each one arrives while the click is still in range, and each is a far better signal than a form fill. You can still send the closed deal for the cases that close quickly.
Also worth clearing up, because it confuses people: the Insight Tag and the Conversions API are not the same thing. The Insight Tag is a browser script. It sees page views and form fills on your site, and it misses visitors who block it. The Conversions API is server to server, so it can send what the tag never sees, like a qualified lead or a won deal from your CRM. LinkedIn counts an event sent both ways once, so running both doesn't double count.
A final practical point. If you have an old list of customers and want to warm up an account, a CSV upload in Campaign Manager works, as long as the rows are under 90 days old. For anything ongoing, the API is the better shape, because it sends each result as it happens instead of waiting for a file.
Two design decisions follow from all this.
First, ask for a work email on forms fed by LinkedIn campaigns, and treat a personal email as a signal to follow up differently. A phone number alone can't be matched on LinkedIn at all.
Second, record the date of every stage in the CRM, not just the current stage. If you only store "Closed Won" with today's date, you can't tell which leads reached "Demo held" inside the 90-day window. With a date on every stage, you can send each one on time, even for a deal that eventually takes 200 days.
How do you handle long cycles? Do you send an earlier stage, or wait for the closed deal and hope the window holds?
More on this: LinkedIn Conversions API, and the complete guide to offline conversion tracking.