| name | linkedin-competitor-benchmark |
| description | Build a side-by-side LinkedIn content benchmark across 2–4 competitors — cadence, followers, engagement, top posts, exec voices, and the strategic whitespace the prospect could own. Use whenever the user pastes 2+ LinkedIn company URLs and asks to "benchmark", "compare", "stack up", "side-by-side", or build a "competitive brief" on LinkedIn; or mentions a deal name plus competitor names ("competitive brief for Lative vs Anaplan/Pigment/Fullcast"). Trigger proactively when prepping a sales call with an obvious competitive set, building a pitch deck that needs a competitive-landscape slide, or when the user shares competitor URLs in a context that implies comparison. Outputs a Virio-branded PDF + HTML with a hero headline-observations card, per-competitor sections, and a closing whitespace synthesis. Do not use this for a single company — that's `linkedin-content-analyzer`.
|
LinkedIn Competitor Benchmark
You're building a side-by-side competitive benchmark of 2–4 companies' LinkedIn content strategies. The output is a Virio-branded PDF + HTML brief delivered into the workspace outputs folder.
This is the multi-company sibling to linkedin-content-analyzer. Use that skill for a single company. Use this skill when the user wants triangulation: who owns what, who's missing what, where the whitespace is.
What "good" looks like
The reference is the Lative competitive brief (Anaplan vs. Pigment vs. Fullcast). The headline punchline read:
Anaplan owns reach. Pigment owns voice. Fullcast owns the buyer.
Three companies, three crisp claims, one strategic whitespace ("AI-native sales capacity planning for the RevOps buyer") that nobody owns. That's the format target. If you can't write a sentence like that for each competitor by the end, the analysis isn't done.
Step 1: Parse the input
The user will give you 2–4 LinkedIn company URLs. Examples:
- "benchmark these for the Lative deal: linkedin.com/company/anaplan, linkedin.com/company/pigment, linkedin.com/company/fullcast"
- "compare HubSpot, Salesforce, and Pipedrive on LinkedIn"
- A list of URLs with no other context
Extract:
- The list of company slugs (e.g.,
anaplan, pigment, fullcast-ai)
- The "for whom" — which prospect/deal is this for? If named, the whitespace synthesis frames that prospect's opportunity. If not named, frame the whitespace as a generic category opportunity.
- Whether the user wants a specific angle (e.g., "we're pitching them for RevOps" vs. "compare their founder voices specifically").
If fewer than 2 URLs are given, push back: this skill requires comparison. Send them to linkedin-content-analyzer for a single company.
Step 2: Analyze each company in parallel
For each company, run the same per-company analysis the linkedin-content-analyzer skill defines. Read that skill's SKILL.md for the data-gathering methodology — web search is primary, Claude in Chrome is supplementary, LinkedIn renders mostly empty without auth.
Run all companies in parallel using subagents. This is a lot of work serially (4 companies × 5 web searches × 2–3 chrome navigations). Spawn one subagent per company with the same prompt:
Analyze [company]'s LinkedIn content strategy for a competitive benchmark. Follow the methodology in the linkedin-content-analyzer skill. Return structured data covering: (1) cadence + follower count + average engagement, (2) top 5–10 posts with what worked, (3) founder/exec voice audit, (4) themes and gaps. Return as a JSON-ish structured object I can compare against other companies.
When the subagents return, you'll have N parallel structured analyses. Now you compose, not analyze.
If you don't have subagents available, run the analyses serially — but warn the user this will take longer.
Step 3: Compose the comparison + the whitespace
The benchmark is not N analyses concatenated. It's a synthesis. The unique value of this skill is the cross-cutting view.
3a. Headline Observations card (hero)
Write three to four punchlines, one per company, in the same grammatical pattern. The pattern is [Company] owns [thing] or [Company] is the [archetype]. Examples:
Anaplan owns reach. Pigment owns voice. Fullcast owns the buyer.
HubSpot is the textbook. Salesforce is the institution. Pipedrive is the underdog.
Clay leads on category. Apollo leads on volume. Outreach leads on enterprise trust.
This is the hardest part of the brief and the most valuable. If you can't make a confident claim like this, your per-company analysis isn't deep enough yet — go back and dig more.
3b. Per-competitor sections (4 required)
For each company, render all four sections:
- Cadence + follower count + engagement — posts/week, follower count, average reactions/comments per post. Compare against the others' numbers explicitly.
- Top 5–10 posts (what worked) — highest-engagement posts from the past 90 days with a one-sentence note on why each worked. Cite the post URL where possible.
- Founder/exec voice audit — for each named founder/exec on the company page, their personal LinkedIn followers, their cadence, their topical voice, and whether they're the company's primary voice or supplementary.
- Themes — primary, secondary, occasional, and whitespace (what they're notably not covering).
Format these as hairline-separated rows in the brief, not as full prose sections. The reader is comparing — they need scannable structure.
3c. Closing whitespace synthesis (the punchline)
The final section names the strategic whitespace — the territory none of these companies own that the prospect could claim. Write it as:
Category whitespace nobody owns: "[crisp category claim]". [One sentence per competitor explaining why each isn't there.] [One sentence on what this means for the prospect.]
Example from the Lative brief:
Category whitespace nobody owns: "AI-native sales capacity planning for the RevOps buyer." Anaplan = enterprise FP&A. Pigment = AI-native FP&A. Fullcast = RevOps territory/quota. That single sentence is Lative's alone if claimed publicly and repeatedly.
Don't soften this. The whitespace claim is what makes the brief useful. If the brief just compares without naming the whitespace, you've delivered raw data, not a strategic argument.
Step 4: Render the brief
The output is a Virio-branded PDF + HTML matching the look of the Lative competitive brief and the linkedin-content-analyzer one-pager. Read sections 5a–5g of the linkedin-content-analyzer SKILL.md for the full brand system — colors, fonts, hairlines-over-cards philosophy, print CSS. Don't reinvent it; reuse it.
Structural differences from the single-company analyzer:
- Header:
Competitive Brief — [Prospect/Category] as the doc label. No client logo (unless the user explicitly asks for one), since this is internal-facing or being delivered to a prospect about their competitors. Virio logo top-left.
- Hero takeaway card: Instead of three observations about ONE company, this is three-to-four punchlines, one per competitor. Same dark
#1B1B1B card, same mono 01/02/03/04 markers, same single Red dot in the upper right.
- Per-competitor sections: Each company gets a section block with kicker
COMPANY 01 — [NAME] (mono, 9pt, letter-spacing 0.16em) and an H2 of the company name. Inside: the four required sub-sections as hairline-separated row lists.
- Closing synthesis: A second hero block at the very end — but use the closing pattern from the analyzer (top hairline + kicker + prose, not a second dark card). The whitespace claim is the one big statement; keep it visually quiet so it lands as conclusion, not as another headline.
Footer: Prepared by [Virio logo] · [date]. The Virio logo here is the small "prepared by" attribution at ~16–18px height.
Render command
Use the same WeasyPrint pattern as the analyzer skill:
mkdir -p outputs/assets
cp [path-to]/virio_black.svg outputs/assets/
cp [path-to]/virio_white.svg outputs/assets/
pip install weasyprint --break-system-packages --quiet
python3 -c "
from weasyprint import HTML
HTML('[slug]-competitor-brief.html', base_url='.').write_pdf('[slug]-competitor-brief.pdf')
"
Where [slug] is the prospect name if given (lative-competitor-brief.pdf), otherwise a category slug (revops-platforms-competitor-brief.pdf).
Step 5: Deliver
Lead with the PDF. Offer the HTML for edits. The chat summary is short:
- The three-to-four headline punchlines (one per competitor).
- The whitespace claim.
computer:// links to both files.
- Sources used (LinkedIn URLs, any specific posts cited).
Don't restate the per-competitor sections in chat. The brief is the deliverable.
Quality bar
- The whitespace claim must be specific. "Better content" isn't a whitespace. "AI-native sales capacity planning for the RevOps buyer" is.
- Every engagement number has a source. If you cite "Pigment averages 80–100 comments per founder post," that has to come from observed posts. Don't fabricate.
- The companies should feel different from each other. If your per-company sections read like the same paragraph with names swapped, your analysis missed the actual differentiation. Go back.
- Length: 5–8 pages is normal. Cut content before cutting whitespace. If you find yourself shrinking type below 10pt to fit, the brief is too long — drop a competitor down to its top 3 posts instead of top 10, or cut the secondary themes row.
When to push back on the user
- Fewer than 2 URLs → use
linkedin-content-analyzer instead.
- More than 4 URLs → this format breaks down. Suggest picking the top 4 most strategically relevant.
- "Compare them on [non-LinkedIn dimension]" (e.g., pricing, product features) → this skill is LinkedIn-content-only. Send them to
competitive-intelligence or competitive-brief for product/pricing comparisons.
Reference files
references/composition.md — detailed guidance on writing the headline observations and the whitespace claim. Read when stuck on the synthesis.
references/template.html — the HTML skeleton for the brief. Start here when rendering.
scripts/render_brief.py — WeasyPrint render script that takes the HTML and emits the PDF. Use this rather than re-typing the WeasyPrint invocation each run.