Earlybird Admin
Testing dashboard. Low-frequency activity, bounded reads.

Admin sign in

Sign in with an account that has a matching admins/{uid} document in Firestore.

Checking access...
Never refreshed
Users
-
- active today
Online-ish
-
last 10 minutes
Discover
-
- total sampled
Posts Analysed
-
seenStats today (UTC)
Users' Posts Captured
-
- total sampled
Users' Comments Captured
-
- total sampled
Checkout Errors
-
- attempts sampled
Posts Analysed - Last 7 Days
DateTotal
Loading...
Users
On builds before the capture-stamp fix, Last seen and Version are written only when the panel is opened — a tester browsing with the panel shut reads as idle however much they capture. Analysed and Comments are the columns that tell the truth for those rows. Comments are counted by when the comment was posted, not when Earlybird captured it — a first-run import writes hundreds of old comments at once, and bucketing those as "today" would make a backfill look like a conversation. The read behind it covers the last 8 days of captures, capped at 2,000 documents; the Users' Comments Captured card above says so outright if that cap is ever reached.
UserLast seenAnalysedCommentsVersionStatus
Loading...
Extractor Health
Earlybird reads about twenty things out of LinkedIn's HTML - who posted, the text, the counts, the link. When LinkedIn changes its markup a reader returns nothing rather than failing, so nothing breaks visibly and the board just gets quieter. This is what watches for that. One row per place Earlybird reads, not per reader: a green row means every reader on that surface is behaving, and there is nothing to do. Click a row to see the individual readers and what each one is for. Anything broken is opened for you.
Loading...
Where Earlybird was readingReads yesterdayWorkedState
Loading...
Embed Poll
Most board rows hold one engagement reading for life - whatever the numbers were the moment Earlybird first saw the post - and every tier decision is made on that number however old it is. A post found in its first hour is stored at the very bottom of its growth curve and never read again. This is the fix being tested: LinkedIn publishes reaction and comment counts on a public embed page that needs no login, so one request from Google's servers can refresh the shared row for every user at once, with no user's browser, IP or LinkedIn session involved. It does now write what it reads back to the shared board, so a refreshed row corrects that post for every user at once. It still refuses to write anything it is not sure of: never a reshare (whose embed reports the original's numbers), never a page that names a different post, and never a reading it could not take - a poll that failed must not be recorded as an answer, or the row is marked fresh and nothing looks at it again. It is still also a probe, measuring whether LinkedIn throttles the endpoint when requests come from a datacenter rather than a laptop. It picks what to read rather than cycling: posts that have never had a second reading come first, newest first, then whatever is due. A post is due every 30 min under 2h and every 2h after that, until it turns 24h old and is never read again — and a post growing slower than about 1 engagement a minute, the same bar it was let in on, waits twice or four times as long, because it is unlikely to have moved. It runs hourly and steps up in rungs, and only after a full clean day at the current rung: 96 calls a day, then 504, then 2,016. Any 429 (rate limit) or 999 (bot check) stops the run on the spot and cancels the ramp, because pushing through a throttle is what turns it into a ban.
Loading...
RunCallsAnsweredNothing thereBoard rows refreshedStill unreadState
Loading...
Creator Watch
Every row on the board arrives because somebody scrolled past it, so the board is only as fresh as whoever happens to be browsing - the median post is found eleven hours after it was published, and 28% are found after a day. This is the first supply of posts that needs nobody online. A creator's signed-out profile page lists their last ten posts, and it carries a post 2.4 minutes after publishing, so how late we are is now the polling interval rather than a property of LinkedIn. It reads that page through a rotating residential proxy - the same page from Google's own servers is refused after about ten requests - and polls each creator tightly inside their own posting hours and slowly outside them, because three quarters of anyone's posts land in the same three hours of the day. It writes the post and nothing else: the embed poller reads the real engagement within seconds, so there is one definition of what a reaction count is. A found post goes straight onto the shared board and the board's own bar decides whether anyone sees it, so most of what this finds is written and never displayed - that is the design, not a fault. Anything still invisible a day later is deleted overnight.
Loading...
CreatorLast lookedTheir newest postLast lookAdded so farWhat they normally getState
Loading...
Notification Fast-Resolve
A post found via the notifications page already carries a real, resolved LinkedIn id - usually about 4 minutes after it was published - but used to sit in a user's local "found" list with nothing ever reading it, since only a manual visit or the hourly Embed Poll could reach it. This fires the instant one of those lands on the shared board instead, giving it a real reading within seconds rather than waiting up to an hour. It fires on every new board row but does nothing beyond one field check unless that row has no engagement yet - an ordinary capture already has real numbers the moment it's written, so this never spends a request on those. Capped at a persisted 100 calls/day (not per account - this fires for every user on the updated extension who finds something genuinely new), and any 429/999 pauses it for 24 hours, the same discipline as everything else on this page.
Loading...
WhenAuthorStatusWrote to boardNote
Loading...
Duplicate Audit
The same post stored twice. merge means it is safe to fold together - the green copy keeps everything both copies know (the longest engagement curve, the highest counts, whichever has text or an image) and the red one is deleted. Approve merge asks the server to do it: it re-checks the evidence itself and refuses anything it cannot independently call a duplicate, and every copy is backed up to dupeMergeBackups before the delete. CHECK means it looks like a duplicate but the evidence disagrees, so nothing will touch it until you have looked. Open both posts and compare; if they are the same post, that is a gap in the extension worth telling me about. Approve all merges does exactly that to every green row in turn, one server call each - the function still re-derives the evidence for every copy on its own and still refuses anything it cannot verify, so the sweep is the same clicks rather than a looser way in. The nightly sweep (08:00) does all of this unattended, so most mornings this table should already be empty; it re-plans on the server rather than reading the table, which lets it fold in chains this table has to split - one post living in three documents, where A matches B on its words and B matches C on its numbers, can only show here as a pair. CHECK rows are never swept.
Loading...
Loading...
VerdictWhyAuthorThe two postsAction
Loading...
LinkedIn Requests - Last 7 Days
Authenticated calls the extension makes to LinkedIn, counted where they all pass through (injected.js _auVoyagerFetch). Reading the feed costs nothing and isn't counted. A retry counts as an extra request; a call the rate cap refused isn't counted at all.
DateTotalBreakdown
Loading...
By hour, today
Loading...

Versions

Loading...

Subscription Status

Loading...

Discover Tiers

Loading...

Data Quality

Loading...

Tools

Feed Scroll Schedule

Automated LinkedIn feed browsing on Dan's Mac, so Discover keeps capturing posts on days nobody browses. Each run starts with a 0–10 min random delay and scrolls for 6–12 min. The daily Discord draft picks its 3 posts at 12:00, so keep the last morning run at 11:15 or earlier.

Days
Times
Influencer Index

The public LinkedIn influencer list on danielabrahams.xyz. New profiles are imported via the LinkedInfluencers extension's import queue (needs Chrome + your LinkedIn session). "Publish" runs the export on Dan's Mac and pushes the fresh list live — no CLI needed.

Tracked Import queue
Loading…
Free-Time Promo Codes

Codes that extend a user's free trial — redeemed inside the extension (Account tab, or the trial-ended screen). These live outside Stripe; price discounts are still Stripe promotion codes redeemed at checkout.

CodeDaysUsesExpiresStatus
Loading...