The people liking your LinkedIn posts are a lead list. Nobody is working it.

A spreadsheet method for turning LinkedIn post engagement into a graded, scored lead list your sales team can work every week.

Take a 70-person company that sells maintenance software to regional trucking fleets. On a Tuesday its company page publishes a breakdown of what a day of unplanned downtime costs per truck. By Friday the post has 84 reactions, 11 comments and 6 reposts. Marketing pastes the numbers into the weekly update with a green arrow next to them. Sales never hears about it.

Now open the reaction list and go through it name by name, which almost nobody does. In this example, 19 of the 84 are employees and former employees. Nine are agencies and vendors who sell to the company. Six are recruiters or people looking for a job. Four work for competitors. Fourteen are peers of whoever runs marketing: other marketers, founders, people who follow the CEO and have never seen a truck up close. Three are related to the founder. Eight are existing customers.

That leaves 21 people who could plausibly buy. Nine of them turn out to be a maintenance director, a VP of operations or a fleet manager at a trucking company of the right size in the right country. Two of those nine have now reacted to three different posts in a month.

Your proportions will be different, and you should count them once so you know what they are. But the shape of the problem doesn't depend on the proportions: the post "did well", the 84 is a number on a slide, and the nine names inside it are sitting in a list nobody on the revenue team has opened. Those nine people know who you are and have shown an interest in the exact problem you solve. An SDR would give a lot for that on a cold list, and here it's free, and it expires.

This article is the method for working that list. It runs in a spreadsheet, it takes about an hour a week once it's set up, and it needs no software. (We make software that automates it, and we'll get to that near the end, including where the manual version falls over. The method stands without us.)

What LinkedIn shows you, and what it keeps in aggregate

The reason this pipeline goes unworked is mostly mechanical. The information exists, but it's spread across places that don't add up.

Notifications are built for the author, not for a sales team. "Priya and 23 others reacted to your post" is one line, per post, in the feed of the one person who posted. If your CEO, two AEs and the company page all post in the same week, that's four separate notification feeds belonging to four logins. No one sees the union. The person who liked the CEO's post on Monday and commented on the page's post on Thursday looks like two unrelated events to two different people, and like nothing at all to the rep who owns that account.

Page analytics go the other way and lose the names. A Page admin can export visitor, content, follower and competitor reports as XLS files, and they're useful for what they are: impressions, clicks, reaction counts and engagement rate per post. Post analytics on a personal profile add viewer demographics, but as aggregates, and LinkedIn keeps the demographic breakdown for 180 days. "32% of viewers were in operations" is a fine thing for marketing to know, and there's nobody in it a rep can call.

To be fair to LinkedIn, the names aren't hidden. Click the reaction count on any post and you get the full list: name, headline, connection degree. There's also a Pages Data Portability API through which a Page's owners and their authorised developers can export data that may include members who interacted with the Page, subject to each member's own privacy setting. That's a developer project, though, not a button in the admin screen, and it covers the Page only, not your employees' posts.

So in practice, the list is a thing you click into, one post at a time, and it has two annoying properties. The headline is whatever the person wrote about themselves ("Helping fleets run leaner | Speaker | Dad of 3"), which often isn't a job title. And reactions carry no date. Comments show "2d" or "3w"; a like shows nothing. Hold on to that second point, because it shapes how you have to log things.

Build the raw list first: one row per touch

The most common mistake in a first attempt is making a list of people. Make a list of touches instead. One row for every reaction, comment or repost, even when it's the same person for the fifth time. The repetition is the signal you're after, and a people list throws it away on day one.

Create a sheet with two tabs. The first is called touches and has these columns:

ColumnHeaderWhat goes in it
Adate_loggedThe day you captured it (see below)
BpersonFull name
Cprofile_urlTheir LinkedIn profile URL, which is your unique key
Dtypelike, comment or repost
EpostA short label you'll recognise: downtime-cost, ceo-hiring-mechanics
Fposted_bypage, or the name of the employee who posted
GweightFormula, below
Hdays_agoFormula, below
IpointsFormula, below

Key everything on the profile URL, not the name. You will meet two David Millers within a month.

On dates: since likes aren't timestamped, the honest date for a like is the day you logged it. If you log every Tuesday, a like is at most a week older than your sheet says. With the scoring below, a week of error shifts a touch's value by about 15%, which is tolerable. If you log once a month, the error swallows the signal, and this is the first reason the weekly rhythm matters more than the formula.

Treat every LinkedIn reaction type (Like, Celebrate, Insightful and the rest) as like. It's tempting to weight "Insightful" above "Like". Don't. The extra column costs you time and tells you nothing a comment wouldn't tell you better.

Which posts to log: every post from the company page, plus every post from an employee that touches your market or your product. Skip the CEO's marathon photo. It will have the most reactions of the quarter and none of them mean anything commercially.

Most of the list is not buyers, and that's fine

The second tab is people, one row per profile URL. Before any scoring, every new person gets sorted into a bucket in a column called who. It takes about ten seconds per person from the headline alone, and it's where the 84 names in the opening example became 21.

The buckets we'd use:

  • buyer: could plausibly buy, or influence a purchase, at a company that could be a customer
  • customer: already pays you
  • team: employees, former employees, investors, the founder's mum
  • peer: people in your own function at unrelated companies, who like the post because it's a good post
  • vendor: agencies, consultants and tools that want to sell to you
  • talent: recruiters and job seekers
  • competitor: works for one
  • unknown: you can't tell in ten seconds

Only buyer rows go on to grading. But don't delete the rest, because three of those buckets are worth something to somebody else. A customer who starts engaging heavily after months of silence is something the account manager wants to know before the renewal call. Competitor employees who react to everything you post are telling you which of your messages they're watching. And a peer with a large following in your market who keeps reposting you might be worth a conversation that has nothing to do with selling.

The peer bucket deserves a warning because it's the one that flatters you. A post about B2B marketing written by a marketer gets liked by marketers. If you sell to fleet managers, a thousand reactions from marketers is applause from the wrong room, and a post with 30 reactions of which 12 are fleet managers is the better post. Once this column exists you can work out the buyer share per post, and it will change what your team thinks a good post is. That's a marketing conversation we'll leave there, but the sheet gives you the number for free.

Be strict with unknown. Give each one a single profile visit, then either rebucket it or leave it. Don't spend four minutes working out what a "Growth Catalyst" does.

Grade against a written ICP, not a feeling

Ask three reps who the ideal customer is and you'll get three answers that differ in precisely the cases that matter. So write it down, as four lists:

  1. Titles, as keywords you'd accept: fleet manager, maintenance director, VP operations, director of operations, head of fleet
  2. Industries: trucking, logistics, freight, transportation
  3. Company size, as headcount bands: 51-200, 201-500, 501-1000
  4. Geography: United States, Canada

Then add four yes/no columns to the people tab, next to a title and a company column you fill in from the profile (title_ok, industry_ok, size_ok, geo_ok) and one grade column. Four out of four is an A, three is a B, two is a C, and one or none is off. If you mark the checks y or n in columns F to I, the grade is one formula: =CHOOSE(COUNTIF(F2:I2,"y")+1,"off","off","C","B","A").

We're deliberate about equal weights. The temptation is to say title matters more than geography and build a points table, and within a month nobody can explain why someone is a 71. With four equal checks, anyone can glance at a row and see why it's a B: right title, right industry, right country, company too small. A B with a named gap is more useful to a rep than a precise score, because the gap tells them what to check. Maybe the company is small and growing fast. That's a judgment a person should make, with the reason in front of them.

Two practical notes. First, grade on the current job title, not the headline. That means opening the profile and reading the top entry under Experience, and it's the slowest part of the whole method, around a minute or two per person. It's also why you bucket first: you only pay that cost for the buyer rows. Second, if you sell to more than one kind of buyer, write more than one ICP. The fleet company above probably has an operations buyer and a finance buyer (a CFO who cares about cost per mile). Name them, grade each person against both, and keep the better grade. Forcing two buyers into one blended ICP produces a profile that describes no actual human.

And when four people from the same company show up on this tab within a quarter, stop treating them as four leads. That's an account-level signal and it needs different handling, which we cover in a separate article on buying committees.

One like means almost nothing. Four touches mean something.

A like costs half a second and zero commitment. People like posts while waiting for a meeting to start. The standard social selling advice, which is to reach out quickly to everyone who engages, treats that half second as a raised hand. We think that advice is wrong for likes, and the reason is simple arithmetic about what each action costs the person doing it.

A comment costs a thought, and it puts their name and opinion under your post in front of their own colleagues. A repost puts your content in front of their whole network with their reputation attached. So weight them differently: like = 1, comment = 3, repost = 5. You can argue for 1, 2 and 4 instead. It won't change who ends up at the top of the list, so pick one and stop tuning.

Then make every touch fade. We use a 30-day half-life, which gives you a rule you can say out loud: a touch is worth full value today, half after a month, a quarter after two months, an eighth after three. Anything older than 180 days counts as zero.

In the touches tab, that's three formulas:

  • weight (G2): =IF(D2="repost",5,IF(D2="comment",3,1))
  • days_ago (H2): =TODAY()-A2
  • points (I2): =IF(H2>180,0,G2*0.5^(H2/30))

And in the people tab, per person:

  • heat: =SUMIF(touches!C:C,B2,touches!I:I)
  • touches: =COUNTIF(touches!C:C,B2)
  • posts: =COUNTA(UNIQUE(FILTER(touches!E:E,touches!C:C=B2)))
  • last_touch: =MAXIFS(touches!A:A,touches!C:C,B2)

(These work in Google Sheets and in current Excel. B2 is the person's profile URL.)

By this point the people tab has grown to seventeen columns, and the formulas later in this article assume this order:

ABCDEF to IJKLMNOPQ
personprofile_urlwhotitlecompanytitle_ok, industry_ok, size_ok, geo_okgradeheattoucheslast_touchpostsbandownernotes

It's wide, but only C to I need your judgment. Everything from J to O is a formula.

Here is what that does to three people from the trucking example, all graded A.

The first liked one post 85 days ago. Her heat is 1 × 0.5^(85/30), which is 0.14. The second liked a post three days ago: 0.93. On a people list these two look identical (one like each), and the sheet says one is nearly seven times warmer than the other, though neither is warm.

The third commented two days ago (2.86), reposted six days ago (4.35), commented on a different post 13 days ago (2.22) and liked a third post 21 days ago (0.62). Four touches across three posts, heat of 10.05.

We treat 10 as the line for "warm". The reasoning: you can't get to 10 by accident. It takes something like a fresh repost plus a fresh comment plus a like, or four recent comments. Ten fresh likes would also do it, and a person who has liked ten of your posts in a few weeks is paying attention by any definition. Below about 4, a person has done one or two light things and the right move is nothing. Between 4 and 10 they go on a watch list.

Why 30 days and not 14 or 90? With a 14-day half-life the list is just last week's reactors and you're back to pouncing. With 90, someone who was active in the spring still looks warm in autumn, and reps learn to distrust the sheet after the third stale conversation. Thirty days fits a sales cycle measured in weeks to a few months. If yours is measured in days, shorten it.

The decay is the part people skip and it matters most, because it makes the list maintain itself. Nobody has to remember to remove stale leads. They cool off on their own, and the person who came back this week rises without anyone deciding anything.

Deciding who gets worked this week

Sort the people tab by grade, then by heat, and read it against this grid:

Heat 10+Heat 4 to 10Heat under 4
AMessage this weekWatch; engage back in publicLeave alone
BMessage this week, check the gap firstWatchLeave alone
CA rep decides, case by caseIgnoreIgnore
offFind out who they are; don't sellIgnoreIgnore

"Engage back in public" means what it says: reply to their comment, react to something they've posted themselves. It costs a minute and means your name is familiar when a message eventually arrives.

Fill in the owner column before anyone sends anything. The failure this prevents is ugly: three reps each spot the same warm VP on three different posts and all message her in one week.

Expect the top-left cell to be small. For the 70-person company above, five to ten names in a normal week would be a healthy result. It feels like a poor return on 84 reactions until you compare it with what the same rep gets from the 50 cold emails they'd otherwise send with that hour.

The first message

One number should set your expectations here. LinkedIn's B2B Institute, drawing on work with the Ehrenberg-Bass Institute, argues that 95% of your potential buyers aren't ready to buy today. The figure is a rule of thumb inferred from how rarely companies switch suppliers, not a census, and you can quibble with it. The direction is hard to argue with. Most of the people on your warm list, including the A-grade ones at heat 12, are interested in the topic and not shopping for a vendor.

So the first message shouldn't try to book a demo. Its job is to start a conversation that a reasonable person would want to be in, so that you're the one they think of when the truck breaks down.

The opener to avoid

Hi Dana, I saw you liked our post about downtime costs! We help fleets like yours cut unplanned maintenance. Do you have 15 minutes this week for a quick demo?

Everything is wrong with it, and in a specific order. It opens by announcing that you watch who likes your posts, which everyone half knows and nobody enjoys being told. It treats a half-second gesture as a buying signal. It asks for fifteen minutes before offering anything. And apart from the first name it could have gone to all 84 people, which Dana can tell.

A better one

Say Dana is the four-touch person from the scoring example, and her most recent comment said that the repair bill is never the real cost of a roadside breakdown, the missed delivery is. First, reply to that comment in public, with substance. Then, a day or so later:

Dana, your point that the missed delivery costs more than the repair is the part most downtime math leaves out, including ours until recently. We built the per-truck worksheet behind that post and it now has a line for missed loads. Happy to send it if it's useful. Either way, I'd like to hear how you put a number on a missed load, because nobody we've asked does it the same way.

It references something she said out loud, which is different from something she clicked. A comment is a public statement made in the hope of a reply, and answering it is normal behaviour. It offers a thing of value with no meeting attached, and it asks a question she's qualified to answer and probably has opinions about.

For someone who has only ever liked (say, three likes on three posts in five weeks, grade A, never commented), don't mention the likes at all. Write about the subject they keep showing up for:

Tom, you run maintenance for a fleet spread across several depots, so you live the downtime problem more than we do. One question, because we're about to publish on it and I'd rather be corrected before than after: do you track the cost of a missed load next to the repair bill, or only the repair?

He knows perfectly well why you're writing, and you don't need to say it.

One constraint: if you're not connected, the message rides on a connection request, and on a free account LinkedIn caps that note at 200 characters and only lets you add one to a few requests a month (the help page currently says three). So the note is one sentence about their point and a plain "would like to connect". The longer message waits until they accept.

Timing changes the message

Add a band column driven by last_touch:

=IFS(TODAY()-M2<=7,"hot",TODAY()-M2<=30,"warming",TODAY()-M2<=90,"cooling",TRUE,"cold")

Hot means a last touch within 7 days. The engagement is fair game as a reference, if it was a comment or a repost. They remember it. Write now, because in ten days they won't.

Warming is 8 to 30 days. They remember the topic and probably not the post. Lead with the subject, keep the ask small, and don't be in a hurry.

Cooling is 31 to 90 days. Referencing the engagement now reads as a rep working through a stale list. Bring something new (a fresh piece of data, a change in their industry, a relevant hire at their company) and let the old engagement be the private reason you chose them.

Cold is anything over 90 days. Treat them as a cold lead who happens to have heard of you, because that's what they are. "I noticed you engaged with our content" about something from the spring is worse than no personalisation.

Heat and band answer different questions. Heat tells you how much someone has done, and the band tells you whether it's recent enough to mention.

What not to do

Some of this is covered above, so briefly.

Don't pounce on a single like. There is one exception worth making: a lone like from the exact person you've been trying to reach at a named target account is worth a row on the watch list and perhaps a connection request with no pitch in it. It still doesn't justify a sales message.

The counter-argument is speed to lead, and it deserves a straight answer. Speed matters enormously when someone fills in a demo form, because they've asked to be contacted. Nobody who likes a post has asked for anything, and a sales message inside the hour mostly tells them you were watching.

Don't automate the first message. A templated DM fired at every reactor is the quickest way to teach your market that engaging with your posts gets them spammed, and then they stop engaging and you've burned the channel that made the list.

Don't sell to the customer bucket from this sheet. Pass those names to whoever owns the account.

Don't grade from the headline, and don't let a rep quietly override a grade without writing why in the notes column. In three months you'll want to know whether your ICP was wrong or the rep was hopeful.

What a Tuesday looks like

Once the sheet exists, the weekly run is about an hour for one person, usually someone in RevOps or a sales manager who cares, at a company putting out two or three relevant posts a week.

Twenty-five minutes logging: open each post from the last seven days, click into reactions, comments and reposts, add the rows. Fifteen minutes on new names: bucket everyone, open profiles for the buyer rows, fill in the four ICP checks. Ten minutes sorting by grade and heat, reading the top 20 rows, and looking for who moved since last week. Ten minutes assigning owners and posting the five to ten names in the sales channel with a one-line reason for each: "Dana R., A, heat 10, four touches on three posts, last one a comment on Sunday."

The first week is not an hour. Backfilling a month of posts to give the scores some history takes closer to three hours. Do it anyway, because a sheet with one week of data can't tell repetition from coincidence.

Where the hand method breaks

We'd rather you try this by hand before buying anything, ours included, because a month of doing it teaches you what your engagement is made of. But it does break, and in predictable places.

Volume is the first. The example above was one post. Suppose five people post twice a week and each post draws around 60 reactions: that's 600 touches a week. At ten seconds a row, logging alone is 100 minutes, before anyone has opened a single profile to check a title.

The second is that the people posting aren't the people logging. Each employee sees reactions only on their own posts, in their own notifications. Whoever keeps the sheet has to visit every colleague's posts by hand, and will miss the one the VP of Sales put up on Saturday morning that turned out to be the best-performing post of the month.

The dates stay fuzzy, for the reason given earlier. A weekly capture keeps the error tolerable, but skip one week and everything from those 14 days lands on the same date.

And the real killer is week three. The first two weeks are interesting because you're discovering things. By the third, it's data entry, it's quarter-end, and the person doing it has a forecast due. A decay-weighted list that isn't updated doesn't hold its value. It drifts toward zero and takes the team's trust with it. Run by hand, this either becomes someone's actual job or it's dead within two months, and we'd bet on the second.

There are also things no version of this method can see, manual or not. Most of the people who read your posts never react, and they're invisible here. And neither heat nor grade can tell you whether someone is in the market. They tell you who is paying attention and whether they fit. Those are the two best reasons to start a conversation, and neither one makes that person a forecastable opportunity.

What Resonue does with the same method

Resonue is the product we build, and its revenue side is this method, run continuously.

You tell it which voices to track: the company page, the employees who post, and if you want, outside people who talk about you. Every person who engages with a tracked post lands in one engagers list, across all of those voices at once. The person who liked the CEO's post on Monday and commented on the page's post on Thursday is one row with two touches, which is the thing no individual notification feed will ever show you.

Each engager gets a heat score that will look familiar. Likes count 1, comments 3, reposts 5, each touch halves every 30 days, anything older than 180 days drops out, and 10 is where a lead starts reading as warm. We didn't simplify the product for this article; the spreadsheet above is the same arithmetic. The difference is that touches carry their actual dates, the score recomputes without anyone opening a sheet, and every score opens into a breakdown of which touch contributed how many points, so a rep can see why someone is a 12 and not take it on faith.

ICP grading works the way we described too. You define one or more named ICP profiles in the workspace (titles, industries, company sizes, geographies), and each engager is graded A, B, C or off against the best-matching profile, on their current job title as well as their headline. Any dimension you leave empty is skipped, not counted against people. The grade badge shows which dimensions matched and which didn't, so "B because the company is too small" is visible at a glance.

For the first message, a rep can ask Rosa, the assistant inside Resonue, for an outreach draft on any engager. It's generated on demand from that person's own activity: which themes they keep engaging with, which voices, what they actually wrote in a comment, and when. The timing bands above (hot within 7 days, warming to 30, cooling to 90, cold after) are built into how the draft is written, so a cold engager doesn't get an "I noticed you" opener. It comes with a suggested angle and the reasoning behind it, the draft stays under 700 characters, and it's a draft. Nothing is sent by Resonue. The rep edits it and sends it from their own account, and we'd still nudge a hot-band draft toward the topic and away from the action when the action was a bare like.

Sales reps get a home view built around this: a warm leads table with heat and ICP grade on each row, which leaves out existing customers, your own voices and anyone the workspace has blacklisted, and a filter for "Engaged with my posts" so a rep who posts can start with the people who responded to them personally. A rep can discard a lead they've judged not worth it, and it disappears from their view only.

If you'd like to see what your own list looks like, talk to sales. We prepare the demo on your company's own recent posts before the call, so the first thing you look at is the names already sitting under them.

Stop guessing whether your presence is working

See your voices, your warmest engagers, and your influenced pipeline in one place, with Rosa explaining every score along the way.