Use when someone wants to understand their own LinkedIn numbers — which posts worked, why reach dropped, whether a pattern is real, or how to test a hypothesis. Triggers on "why did my reach drop", "what's working on my LinkedIn", "analyze my posts", "do carousels do better for me", "should I test this", "LinkedIn analytics". Reads your own exported post data, reports medians and outlier bands, tests candidate patterns against a permutation null, and sizes a real experiment — refusing to conclude anything below 10 posts.
The characteristic sentence of LinkedIn analytics is "carousels do 3x better for me", built on four posts. With engagement as heavy-tailed as it is, four posts will show a 3x difference between almost any two groups you care to define. These three scripts stop that sentence becoming a strategy.
Your own data only. Nothing is fetched; scraping post or profile data is prohibited by User Agreement §8.2 and none of this analysis needs it.
1. Get the export. LinkedIn Analytics → Post impressions → Export, or Settings → Data privacy → Get a copy of your data. CSV and JSON both work.
2. Describe it. Exit 0 analysed / 2 below the 10-post floor, descriptive only / 3 unusable. Reports median and MAD rather than mean and standard deviation — one breakout post makes a mean describe a distribution none of your posts belong to — plus Tukey percentile bands and a 1.5×IQR breakout threshold, so "this did well" has a number behind it.
python3 scripts/post_performance_analyzer.py --input posts.csv --csv --output human
3. Test the pattern they think they see.
python3 scripts/pattern_miner.py --input posts.json --output human
Exit 0 something survived / 2 nothing survived / 3 under 10 posts. Four gates: 5 posts in and 5 out; a 15% relative difference in medians; beating 90% of 2,000 seeded label shuffles; and a multiple-comparisons accounting of how many candidates would pass on noise alone.
"Nothing survived" is the most common honest answer and it is a real finding. Report it as one. Do not soften it into a hedge that reads like a conclusion.
4. Turn a survivor into a test.
python3 scripts/experiment_planner.py --hypothesis "..." --variable "..." \
--cv 0.45 --effect 0.30 --posts-per-week 2 --max-weeks 12 --output human
CV comes from step 2: 1.4826 * MAD / median. Exit 0 feasible / 2 too long, with the minimum
detectable effect in their window / 3 refused. It will frequently say the test needs more
posts than a quarter allows — that is the honest answer, and more useful than a confident
conclusion from retrospective data.
| Script | Role |
|---|---|
| scripts/post_performance_analyzer.py | Median/MAD, percentile bands, IQR outlier fence, per-post BREAKOUT→DUD classification; refuses conclusions below 10 posts. |
| scripts/pattern_miner.py | Four-gate permutation test with multiple-comparisons accounting; reports why every rejected candidate failed. |
| scripts/experiment_planner.py | Sizes a two-arm posting experiment, names the confounds to hold constant, and writes the falsification condition before the first post. |
references/linkedin_metrics_canon.md — what each number is, what it is not, and which three tiers to track (7 sources)
references/evidence_thresholds.md — the four gates, forking paths, and the uncomfortable arithmetic of LinkedIn A/B tests (7 sources)
assets/example_post_export.csv — a 12-post export in the expected shape
assets/measurement_log_template.md — the Tier 1 outcome log you keep by hand
marketing-skill/social-media-analyzer — cross-platform brand campaign reporting. This
is one person's own LinkedIn export, with refusals attached.linkedin-strategy — decides what to do next. This says what happened.product-team/experiment-designer — product A/B tests with real traffic; here n is
posts, and usually too small.Version: 1.0.0
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/linkedin-analytics · pinned to the source commit
# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/linkedin-analytics" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/alirezarezvani/claude-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 19392f7a08264ed00486a251f5b2098321771f94
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/.gemini/skills/linkedin-analytics" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/linkedin-analytics
Scanner static-checks@0.1.0 · commit 19392f7a0826. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.