Methodology · Benchmark Dashboard
How the numbers are made
Every figure on the Benchmark Dashboard is measured the same way, documented here. Data comes from tracked LinkedIn company pages and their employees' profiles, scraped continuously and classified with a multimodal LLM (categories assigned once per post, temperature 0.1). All times are bucketed in Pacific Time.
Updated July 31, 2026
Engagement #
Engagement = likes + comments + shares for a LinkedIn post (for X: likes + retweets + replies + quotes). “Total engagement” sums this over every post in scope. The Original/Reposts toggle scopes which posts count; original mode excludes reposts everywhere.
Why medians (and the lognormal shape of engagement) #
Post engagement is lognormally distributed: take logs and the histogram becomes a normal curve. Measured against ~24.5K original posts, the normal-probability-plot correlation is r = 0.999 for reactions and total engagement — about as lognormal as real data gets. The mean of such a distribution sits far above its median (here the market mean is ~2.6× the median), so a handful of viral posts dominate any average. Benchmarks you can act on therefore lead with medians and outlier-robust averages, never raw means.
Deeper-funnel actions degrade in a specific way: comments (27.5% zeros, r = 0.968) and shares (37.8% zeros, r = 0.947) behave as hurdle models — a coin flip for “did this post produce anything at all,” times a lognormal for “how much, given at least one.” Full write-up: notes/lognormal-findings.md (reproduce with node scripts/analyze-lognormal.mjs).
| Metric | Zero rate | Q–Q fit r | Verdict |
|---|---|---|---|
| Reactions | 0.4% | 0.9989 | Lognormal |
| Total engagement | 0.4% | 0.9990 | Lognormal |
| Comments | 27.5% | 0.968 | Approximately lognormal |
| Shares | 37.8% | 0.947 | Departs (hurdle model) |
Smart average #
The Smart mode is an outlier-robust average: per-post values are winsorized at the 5th and 95th percentiles (values beyond those bounds are clipped to them), then averaged; groups with fewer than 5 posts shrink toward the reference mean. It answers “what does a typical post earn” without letting one viral post — or one dud — carry the number. Implementation: src/lib/utils/robust-stats.ts.
Momentum #
Momentum = (late − early) / early, where early and late are the average engagement per post in the first and second halves of the selected time window. It requires at least 3 posts in each half — below that the cell shows “—” rather than a noisy number. A company at +50% is earning half again as much per post in the recent half of the window as in the earlier half.
Engagement per follower #
Eng / 1K followers (Companies tab) = average engagement per post ÷ (company-page followers / 1,000) — the audience equalizer that lets a 30K-follower company outrank a 900K one. Eng / 10k reach (Competitor tab) = median post engagement ÷ (page followers + every employee's followers, summed) × 10,000 — the denominator matches the channels the posts are actually counted from.
Sample floors and low-n handling #
Best-day / best-hour picks require a bucket to hold at least max(8, 5% of the corpus) posts — otherwise a quiet Saturday wins on three lucky posts. Category verdicts are withheld below 8 posts on either side. Low-sample cells are faded or tagged low n rather than hidden.
The 500-post scrape cap #
Profile scraping caps at 500 posts per person, so all-time volume rankings are unreliable for prolific posters. The Top Posters board therefore always uses the trailing 12 months, ranks by engagement first, and marks capped profiles with a “+” (their true totals are higher).
Rankings exclusions #
A small operator-maintained list of companies is excluded from every ranked surface (leaderboards, top posts, top posters, movers, default cohorts) because their numbers reflect something other than a company content program — e.g. a single auto-discovered influencer producing ~90% of the engagement. Excluded companies remain fully visible in tables, search, selection and the Competitor tab. The list and rationale live in notes/rankings-exclusions.md.
Time windows and timezones #
The global time-window pills bound every chart by post date (a lower bound: “90d” = posts in the last 90 days). Days and hours are bucketed in America/Los_Angeles. Trend points in the category comparison are monthly samples of a trailing window (default 180 days) ending at the data's last post.
Category verdict taxonomy #
In the Competitor category comparison, each category's index is its median engagement divided by that side's overall median (“vs own median”). Verdicts: Strength (≥1.15× and you lean into it), Do more (≥1.15× but competitors publish proportionally more), Over-invested (≤0.85× yet overweight in your mix), Underperforms (≤0.85×), Untested (works for competitors; you have under 8 posts), Neutral (within ±15% of baseline), Low n (under 8 posts on either side — withheld).
Questions about a number not covered here? Every figure's ⓘ links back to its section — if one is missing, that's a bug worth reporting.