# Linkedin Content Audit

> LinkedIn Content Audit

- Skill: `matteotitta/linkedin-content-audit` (Agent Skill)
- Install (CLI): `npx skillmds@latest add matteotitta/linkedin-content-audit`
- Raw SKILL.md: https://api.skillmd.com/api/skills/matteotitta/linkedin-content-audit/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: matteotitta (https://skillmd.com/u/matteotitta)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/matteotitta/linkedin-content-audit

---


# LinkedIn Content Audit

Audit LinkedIn creator profiles by scraping posts (Apify) and classifying them across 6 dimensions: hook patterns, post types, media types, media content, CTAs, engagement. Diagnostic only — does not write posts or check algo compliance. Over-fetches ~100 posts/profile (6-month window), deep-analyzes the top 25 by engagement.

## When to run

Run when: auditing a creator's LinkedIn, benchmarking 2+ profiles, extracting hook/CTA patterns, or sourcing competitive intel for content strategy. Skip when writing posts (`linkedin-content`), checking a single post's algo fit (`linkedin-algo-audit`), building an ICP guide (`linkedin-content-guide`), or running a multi-channel audit (`content-audit`). Full trigger/anti-trigger list → the premium reference.

## Inputs

**Required:** 1-10 LinkedIn profile URLs (`linkedin.com/in/...` format).

**Optional (defaults):** scrape depth `100`, time window `6months` (alt: month/3months/year), top-N for analysis `25`, include quote posts `true`, focus areas `all 6`, client context `none`. Validate URLs before scraping; confirm parameters with user. Full input table → the premium reference.

## Steps

1. **Validate inputs** — All URLs are `linkedin.com/in/...`; 1-10 profiles; confirm depth + window with user.
2. **Phase 1.1 — Apify scrape (single batch).** Call `mcp__apify__call-actor` with actor `harvestapi/linkedin-profile-posts`, input: `targetUrls: [all]`, `maxPosts: 100`, `postedLimit: "6months"`, `includeReposts: false`, `includeQuotePosts: true`, `scrapeReactions: false`, `scrapeComments: false`. One run = one start fee + per-post cost (cheaper than N runs). Reposts excluded so patterns reflect creator's own voice.
3. **Phase 1.2 — Retrieve + validate.** Use `mcp__apify__get-actor-output` with returned `datasetId`. Confirm 50-100 posts/profile, text + engagement + timestamps present. Flag profiles with <10 posts as "insufficient data." Fallback if Apify fails: ask user for manual posts (copy-paste, Shield/Taplio/AuthoredUp CSV, or screenshots).
4. **Phase 2.1 — Group by author** (URL or name).
5. **Phase 2.2-2.4 — Engagement filter.** Compute `total_engagement = likes + comments + shares` per post. Sort each profile descending. Take top 25 for deep analysis. Retain full dataset for volume/cadence metrics (total posts, posts/week, consistency stdev).
6. **Phase 3.1 — Hook classification.** Read first line / first sentence. Map to 14-category taxonomy in the premium reference. Output: count, %, avg engagement per hook type.
7. **Phase 3.2 — Post type (pillars).** Map to Educational / Personal / Promotional / Organizational / Engagement. Compare mix to 40/25/25/10 target. Definitions → the premium reference.
8. **Phase 3.3 — Media type.** Classify from Apify attachment data: text-only, carousel/document, single image, multi-image, video, poll, article/newsletter, external link. Output: format mix + avg engagement per format.
9. **Phase 3.4 — Media content.** For posts with visuals, classify what media depicts using post-text context only (screenshots, charts, selfies, memes, infographics, text-on-image, BTS, professional photo, AI-generated, undetermined). NEVER guess from URL.
10. **Phase 3.5 — CTA classification.** Analyze final 1-3 lines. Bucket into 8 types: comment prompt, DM invite, link/resource, follow/connect, save, repost, no CTA, multiple CTAs. Output: distribution + avg engagement per type. Pattern examples → the premium reference.
11. **Phase 3.6 — Engagement analysis.** Per-post likes/comments/shares; aggregated avg/median/max; top 5 with excerpts; cross-tabs (engagement × hook, × media, × pillar, × CTA); volume metrics from full dataset.
12. **Phase 3 checkpoint** — All 6 dimensions classified; percentages sum to 100% within each category; cross-tabs computed; volume metrics from full dataset.
13. **Phase 4 — Cross-profile comparison** (only if 2+ profiles). Build profile overview matrix; format mix table; hook style heat map; engagement benchmarks; CTA distribution; top patterns to emulate (evidence-cited); anti-patterns to avoid (evidence-cited). Detail → the premium reference.
14. **Self-evaluation.** Completeness (all phases + profiles + comparison if applicable); accuracy (3 random hook spot-checks, engagement avg sanity, format consistency vs attachments); honesty (zero invented numbers, no guessed media content, gaps marked). Full protocol → the premium reference.
15. **Write outputs.** Per-profile: `linkedin-audit-{username}.md`. Cross-profile: `linkedin-audit-comparison.md`. Templates → the premium reference.

## What good looks like

**Examples:** None on file — first run will seed `examples/`.

**Evaluations:** Quality gate passes when (a) data: every profile has 10+ posts, engagement + timestamps present; (b) analysis: all 6 dimensions classified, percentages sum to 100%, cross-tabs use consistent metrics; (c) output: per-profile reports stand alone, comparison includes actionable takeaways with evidence citations, all findings traceable to specific posts.

**Anti-hallucination (load-bearing):** Only analyze Apify-returned data. Never invent engagement counts, post text, or follower counts. Mark <10 posts as insufficient data. Source every finding `(Apify, harvestapi/linkedin-profile-posts, YYYY-MM-DD)`. When hook/CTA classification is ambiguous, mark as "ambiguous" and note the two closest matches. Use precise language ("23 of 25 posts (92%)" not "almost all"). Full guardrails → the premium reference.


