Analytics for a personal LinkedIn account: post performance, follower growth and which topics land, gathered without the platform offering an API for it.
Build me the analytics I actually need instead of Shield — and read the first paragraph, because it decides everything. **The data is not exposed.** Shield works by having a relationship with the platform, or by reading what the platform shows a signed-in user. Neither is available to you: scraping a social platform breaks its terms, gets accounts restricted, and breaks the week they change their markup. So the honest build is the half that is yours — your own posting record, your own link clicks, and whatever the platform's official API does give you. That is genuinely useful, and it is less than the product. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - The platform's official API, whatever it offers - Caddy in front WHAT YOU CAN HAVE, HONESTLY - **Everything you posted**: content, time, format, length, whether it had a link, an image or a video, and any tags. That is your own record and nobody can take it away - **Whatever metrics the official API returns** for your own posts — usually impressions, reactions and comments, sometimes only some of those, sometimes with a delay - **Link clicks**, in full, if every link goes through your own short domain. This is the one metric that is entirely yours and often the most meaningful - **Follower count over time**, sampled from the API - What you cannot have: per-viewer detail, demographics the platform does not expose, and other people's posts. Say so in the interface rather than presenting an estimate as a fact THE DATA MODEL - accounts: id, platform, handle, credentials_encrypted, token_expires_at, is_active - posts: id, account_id, external_id, published_at, body, format, has_link, has_image, has_video, word_count, tags_json, campaign - metric_snapshots: id, post_id, kind, value, collected_at — append-only, one row per collection. Never overwritten, because a post's numbers move for days and the curve is the interesting part - follower_snapshots: id, account_id, count, at - links: id, post_id, url, token; clicks: id, link_id, at, referrer_host, country, device, ip_hash, bot - Every figure computed at query time from snapshots, so a total can never disagree with the rows under it COLLECTING - Poll the API on a schedule after publishing — an hour, six hours, a day, three days, a week — because engagement accrues over days and a single reading is meaningless - Respect rate limits with backoff, and record every collection attempt whether or not it succeeded - A metric the API stops returning is recorded as absent, never as zero. That distinction matters when you look back in a year - Tokens refreshed under a lock, and a connection that fails to refresh alerts rather than silently stopping WHAT TO ACTUALLY MEASURE - Engagement rate with its denominator stated — impressions if you have them, followers if you do not, and never mixed between posts - Performance by format, by length, by time of day and day of week, over enough posts to mean something. Show the sample size next to every comparison, because forty posts is not a finding - The distribution rather than the average: social performance is heavily skewed, and a mean is dominated by one post - Click-through from your own short domain, which is the number that survives every platform change - Growth over time, and posts ranked by clicks rather than by reactions — reactions are cheap and clicks are intent THE HONEST FRAMING - Put the sample size and the definition next to every number, and mark clearly which come from the platform and which are yours - Best-time-to-post from your own history is a weak signal from a small sample. Label it as such rather than presenting it as a science - No estimated reach, no invented demographics, no scraped competitor data OPERATIONS - .env: DATABASE_PATH, BASE_URL, ENCRYPTION_KEY, HASH_SALT, SESSION_SECRET, platform credentials - Migrations on boot, each once; nightly backup off the machine - Health endpoint reporting token expiry and the age of the last successful collection WHAT MATTERS MOST Your own short domain and snapshots over time. Those two are entirely under your control, they survive any platform decision, and together they answer the only question that matters: which posts actually sent somebody somewhere.
What you lose
- Access to personal-account analytics that LinkedIn does not publish through an API
- History from before you started measuring, which you cannot backfill
- Somebody keeping the collection working when the platform changes
If you would rather not build
- The platform's own data export, imported on a schedule
- A spreadsheet updated weekly, which is what this replaces
- Buffer, for cross-platform basics
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $29/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Metabase
$0Point it at the imported table and build the charts without code.
metabase/metabasefree · open source
Umami
$0For the traffic those posts send to your own site, which you do control.
umami-software/umamifree · open source
Why this verdict
our own opinion · changed only by a person
60/100
Verdict kinda at 60. The analysis is easy; the data is not offered, and the history you already have there does not come with you.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Shield
answered from the record above
Is Shield free?
No — the plan we track is $29 a month. Starter at around $29/month billed monthly, cheaper annually.
Can you replace Shield by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 60 out of 100, build time a weekend. Read what you lose before you decide.
How much does Shield cost?
$29 a month on Starter — $348 a year. Recorded 10 Aug 2026.
What do you lose by replacing Shield?
Access to personal-account analytics that LinkedIn does not publish through an API; History from before you started measuring, which you cannot backfill; Somebody keeping the collection working when the platform changes. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Shield?
Yes: Metabase, Umami. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

