Benchmark LinkedIn Post Engagement Across Company Pages
Compare reactions and comments per post across LinkedIn company pages, scaled by follower count, with the LinkedIn Company Posts Scraper. No login.
The actor referenced in this article. Pay only for results delivered.
Social and content teams get asked the same question every quarter: is our LinkedIn doing well compared with the companies we are measured against? Collecting a competitor’s last 50 posts by hand means scrolling, copying two numbers per post into a sheet, and then realizing the comparison is meaningless because the other page has six times your followers.
Try it live: LinkedIn Company Posts Scraper: No Login, No Cookies. Pay per result delivered. Failed and empty results are never charged.
The LinkedIn Company Posts Scraper pulls up to 70 recent posts per company page, logged out, with exact counts and the page’s follower count on every row. That last field is what turns raw numbers into a fair benchmark.
What you get and who it is for
| Field | Role in the benchmark |
|---|---|
reactions_count | All reactions on the post, the exact number LinkedIn prints |
comments_count | Exact number of comments |
company_followers | The page’s follower count at run time, on every row, for scaling |
is_repost | True when the company reposted someone else’s post |
media_type | none, image, video, document or article, to split results by format |
posted_at | Publish time, ISO 8601, to set a fair time window |
company_name, post_url | Which page, and a link back to each post for review |
Social media managers use this to report share of engagement against named competitors. Agencies use it to set realistic targets for a new client. Content leads use the media_type split to decide whether video or documents deserve more of next quarter’s budget. For a sense of scale beyond followers, a company’s employee list read off its public page gives you headcount to normalise against as well.
The input
{
"companies": [
"https://www.linkedin.com/company/stripe/",
"openai",
"nvidia",
"hubspot",
"zomato"
],
"maxPostsPerCompany": 70,
"postedWithinDays": 45,
"includeReposts": false
}
includeRepostsset to false keeps only posts each company published itself. This matters more than it looks: reposts carry the original post’s reactions. In our sample, one repost on Stripe’s feed showed 1,753 reactions, more than any post Stripe published itself in that window (its best had 1,029).postedWithinDaysputs every company on the same time window. Without it, 70 posts covered 7 weeks for NVIDIA but 11 months for Zomato in our proof run, and you would be comparing different seasons. 45 days fits inside the 70 post ceiling even for a page that posts as often as NVIDIA.maxPostsPerCompanyat 70 is the most LinkedIn shows a logged-out visitor. The ceiling counts feed items, reposts included, so a page that reposts a lot can return fewer of its own posts.
What the output looks like
[
{
"company_name": "OpenAI",
"company_followers": 11878447,
"post_url": "https://www.linkedin.com/posts/openai_were-demonstrating-how-frontier-models-have-activity-7508603626362236930-vwKd",
"is_repost": false,
"author_type": "company",
"posted_at": "2026-09-23T19:10:07Z",
"reactions_count": 1057,
"comments_count": 257,
"media_type": "image"
},
{
"company_name": "Stripe",
"company_followers": 1754153,
"post_url": "https://www.linkedin.com/posts/stripe_new-stripe-data-shows-fraudulent-actors-disproportionately-activity-7505675379710500864-iMiU",
"is_repost": false,
"author_type": "company",
"posted_at": "2026-09-15T17:14:19Z",
"reactions_count": 141,
"comments_count": 27,
"media_type": "image"
}
]
These two rows are each page’s median post by reactions in our run on Stripe and OpenAI on October 7, 2026 (20 posts per company, reposts included; we dropped the 6 Stripe and 5 OpenAI reposts before computing). Across their own posts, OpenAI’s median was 1,057 reactions and 140 comments, Stripe’s 141 reactions and 29 comments. That looks like a 7.5 times gap, but OpenAI had 11,878,447 followers against Stripe’s 1,754,153, a 6.8 times gap. Per million followers, the median post drew 89 reactions at OpenAI and 80 at Stripe, nearly level, while Stripe drew more comments relative to its audience (17 per million against 12).
Use medians, not averages. OpenAI’s mean was 2,452 reactions, pulled up by one video with 14,552. Format told a different story at each page too: OpenAI’s 6 videos had a median of 2,355 reactions against 444 for its 5 article posts, while Stripe’s videos (130) did no better than its images (141).
Run it in Apify Console
- Open https://apify.com/themineworks/linkedin-company-posts-scraper and click Try for free (or Start if you already use it).
- In Company pages, enter your own page and each competitor, one per line.
- Set Max posts per company to 70 and Posted within the last N days to 45.
- Untick Include reposts.
- Click Start and watch the Output tab.
- Use the Export button to download CSV, JSON or Excel, then build the per-follower columns in your spreadsheet, or use the script below.
Run it from Python
pip install apify-client
import csv
from collections import defaultdict
from datetime import datetime, timezone
from statistics import median
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/linkedin-company-posts-scraper").call(run_input={
"companies": ["https://www.linkedin.com/company/stripe/", "openai", "nvidia", "hubspot", "zomato"],
"maxPostsPerCompany": 70,
"postedWithinDays": 45,
"includeReposts": False,
})
now = datetime.now(timezone.utc)
posts = defaultdict(list)
followers = {}
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("_type") == "info":
continue # the run summary row, never billed
posted = datetime.fromisoformat(item["posted_at"].replace("Z", "+00:00"))
if (now-posted).days < 7:
continue # too young, still collecting reactions
name = item["company_name"]
posts[name].append(item)
followers[name] = item["company_followers"]
rows = []
for name, items in posts.items():
millions = followers[name] / 1_000_000
reactions = median(p["reactions_count"] for p in items)
comments = median(p["comments_count"] for p in items)
by_format = defaultdict(list)
for p in items:
by_format[p["media_type"]].append(p["reactions_count"])
rows.append({
"company": name,
"followers": followers[name],
"posts": len(items),
"median_reactions": reactions,
"median_comments": comments,
"reactions_per_million_followers": round(reactions / millions, 1),
"comments_per_million_followers": round(comments / millions, 1),
"median_reactions_by_format": {fmt: median(v) for fmt, v in by_format.items()},
})
rows.sort(key=lambda r: r["reactions_per_million_followers"], reverse=True)
with open("linkedin_benchmark.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=list(rows[0]))
writer.writeheader()
writer.writerows(rows)
for r in rows:
print(f"{r['company']:<12} {r['posts']:>3} posts "
f"{r['reactions_per_million_followers']:>7} reactions/M "
f"{r['comments_per_million_followers']:>6} comments/M")
The script drops posts younger than 7 days, because they are still collecting reactions. In our data, a Stripe image post went from 75 to 92 reactions in its second day. Treat a format with only one or two posts as a hint, not a finding.
Run it every month
Save the input as a task, open Schedules, create a schedule with a cron expression such as 0 7 1 * * (7:00 on the first of each month), and pick the task. Keep onlyNewPosts off for this job: a benchmark needs every post in the window with its current counts, not just the ones you have not seen. Send the dataset to a Google Sheet with Apify’s integration, or run the script from a webhook when the run finishes, and you have a monthly table to chart.
What it costs
You pay per post delivered: $1.49 per 1,000 posts on the Bronze plan, $1.29 on Silver, and $0.99 on Gold, Platinum and Diamond, plus a flat $0.005 run start fee per run. Skipped reposts and posts outside the date window are not charged.
A worked example: five companies at the full 70 posts each is 350 posts, about $0.52 on Bronze plus $0.005 to start the run, so about $0.53 a month on a monthly schedule. Quieter pages return fewer posts in 45 days and cost less.
Limits worth knowing
- About 70 recent feed items per page is the ceiling for a logged-out visitor. This method benchmarks recent activity, not a page’s whole history.
company_followersis the count at run time, not at the moment each post went out. For a fast-growing page, older posts look slightly weaker per follower than they were.- There are no impressions, views or repost counts. Reactions and comments are the only engagement numbers LinkedIn shows logged out, and reactions come as one total, not split by type.
- Counts are as of the run. Posts from the last few days are understated, which is why the script leaves them out.
Related
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Why divide by company_followers instead of comparing raw reactions? +
Raw counts mostly measure audience size. In our sample OpenAI's median post drew 7.5 times Stripe's reactions, but OpenAI also has 6.8 times the followers, so per follower the two pages were close.
Can I get impressions or LinkedIn's engagement rate? +
No. The rows carry the exact reaction and comment counts a logged-out visitor sees, and no impression or view field. LinkedIn does not show repost counts to logged-out visitors either.
Do skipped reposts cost anything? +
No. With includeReposts set to false, reposts are skipped before delivery and never charged. You pay only for the company's own posts.
Can I include showcase pages in the benchmark? +
Yes. Showcase page links such as https://www.linkedin.com/showcase/microsoft-health/ work like company pages and carry their own follower count, which matters because showcase pages are usually far smaller than the parent page.
Monitor Competitor LinkedIn Company Posts on a Schedule
Get every new post from competitor LinkedIn company pages each day or week, with only-new mode and an Apify schedule. No LinkedIn login or cookies.
See Every LinkedIn Ad a Competitor Is Running, With Impressions
List a competitor's LinkedIn ads with landing pages, run dates, impressions by country and targeting, using the LinkedIn Ad Library Scraper. No login.
Find Paid Partnership Posts on Any Instagram Profile
List the paid partnership and branded posts on any public Instagram profile, and the brands behind them, using Instagram Post Scraper and Python.
See a Competitor's TikTok Ad Targeting and Reach in the EU
Pull every TikTok ad a competitor ran in the EU, with interests, age groups, audience size and reach by country, using the TikTok Ads Library Scraper.