Compared on their posts from that stage, not from now. Free, 30 seconds.
We read your real post history and compute the same trailing 90-day median every creator in the archive is measured on — instead of asking you to estimate it.
.csv of your own posts.Three numbers off your own X analytics screen. These are self-reported estimates, so the report labels them as a ceiling wherever they are used.
Matching you against creators who were at your exact baseline.
we scrape by hand · usually 2–3 days
Opens a pre-filled email so the request actually reaches us — we scrape by hand, so nothing is automatic.
median impressions · trailing 90 calendar days · per account
Posting schedules are uneven. "Your last 20 posts" might span three weeks for one creator and eight months for another — which makes the two numbers meaningless to compare. A fixed 90-day window measures the same amount of time for everyone, so a creator who posts daily and one who posts weekly are both judged against their own recent reality.
One post that unexpectedly escapes the follower graph can be 100× your normal reach. That single spike drags an average up so far that every ordinary post afterwards looks like a failure against it. The median — the literal middle value — ignores that outlier, and equally refuses to be dragged down by one dead post during a dry spell. It answers "what does a normal post of mine actually do?"
Open X → Analytics and list every post you published in the last 90 days. Sort them by impressions, low to high. Take the number in the exact middle — if you have an even count, average the middle two. That figure should match the baseline shown here. If it doesn't, the window is wrong and we want to know.
Fewer than one prior post in the window? We fall back to 250 rather than invent a number, and label it.
An account joins your cohort for the stretch its own 90-day median sat inside your band — not for its whole history. We measure it as it was then, not as it is now.
A 90-day median drifts across a band edge without the account having actually changed stage — it dips under 300 impressions for a fortnight, then comes back. Treating that as two separate stints would chop one continuous period into fragments. So if an account drops out of your band and returns within 30 days, we count it as one unbroken stretch, including the posts it made during that dip. Longer than 30 days and we treat it as a genuine stage change, and the stretch ends.
We ignore any stretch shorter than 14 days. A fast-growing account can cross an entire band in a day or two — it posts a handful of times on the way through and never really sits at that stage. Counting those few posts as "what this stage looks like" would let the briefest visitors speak loudest. Two weeks is the floor for having been somewhere rather than passed through it.
Within those stretches we count every post the account made, not only the ones whose own baseline we could verify. The band decides when to measure; it must not also decide what counts as a post. Doing both understated one account in this archive by 15× — 0.4 posts a week against a real 6.1 — because most of its posts in that period had been filtered out for unrelated baseline-quality reasons.
Every comparison needs at least 3 creators, counted per comparison rather than per cohort — a metric that can only be computed for some members reports the number it actually used. Below that we suppress the row and say why. We would rather show you nothing than a median drawn from one person.
goes to a person, not a form queue
What is wrong, confusing, or missing? Anything at all — this is read by hand.
…
era-matched comparison · trailing 90-day medians · rule-based content tags
A post is not judged against the archive. It is judged against the median of what that same account did in the 90 calendar days before it went out. A 4,000-impression post from an account that normally does 300 is a different event from the same post out of an account that normally does 8,000, and only the first one is a breakout.
Median, not average: one post that escapes the follower graph can be 100× normal reach, and an average never recovers from it. Ninety days, not a post count: posting schedules are uneven, so "your last 20 posts" spans three weeks for one creator and eight months for another.
Each post is sorted into one of ten formats by a rule-based classifier reading the post text and its media/quote flags. No model, no embeddings, nothing that can change its mind between runs. The same classifier tags the archive and your imported posts, so the format comparison is one taxonomy rather than two.
Your cohort is selected on reach: these are the creators whose own baseline sat in your band. Measuring you against them on reach would not be a finding, it would restate how they were picked. Two stand-ins for it existed and both were removed once it was clear neither had a cohort side that was actually measured. Reach is what everything else is measured in; it is not itself the comparison.
…
Where a comparison has fewer than three creators behind it, the row is suppressed and says so. We would rather show you nothing than a median drawn from one person.
everything that leaves this page, named below · no cookies · no cross-site tracking
The analytics export you drop in is parsed here, in this page, by JavaScript running on your own machine. There is no upload endpoint and no user action that can create one. Close the tab and the file is gone. Your post text never leaves either.
What can leave are numbers derived from it — your baseline, your posting rate. Those are listed below, and there are exactly two ways they go anywhere.
Four moments are recorded: arriving on the page, starting to fill in your numbers, a report being generated, and how long the report stayed open. Across them we send … — and nothing else. No post text, no CSV, no email address, no IP address stored. This is how we see which stages people actually arrive at, so the archive gets collected where it is thin.
Not every field applies to every moment: a field with no value at the time is left out rather than sent empty.
One of those fields is a random ID we generate the first time you arrive and keep in this browser. It lets us tell that one person ran several reports, rather than counting several people who each ran one. That is the whole of what it does.
It is not tied to any identity — not your handle, not an email, not an account, and nothing we could use to find you. It is not a cookie and is not sent to any other site. It is stored under earlysignal.vid and is gone the moment you clear this browser's site data, after which you are a new visitor to us. It is never attached to the email or feedback forms below.
These go to our own server, over HTTPS, and nowhere else — no third-party analytics service ever sees them. If the request fails it is dropped silently and your report is unaffected. Events under the maintainer's own handle are excluded.
Nothing here is sent unless you type an email address into the capture block and press it. At that point we send … — and nothing else. The block states the same list at the point of sending.
It is stored on our own server and forwarded to us by email through Resend, an email delivery service, which sees your address in order to deliver it.
…
Your answers and a copy of anything you submitted are kept in this browser's localStorage under earlysignal.*. That never reaches us. Clearing your browser data removes it.
Cloudflare Web Analytics — a page-view counter. It records that a page was viewed, which site you came from, and roughly how long you stayed. It is cookieless, sets no cross-site identifier, and cannot follow you to other sites. It never sees your handle, your numbers or the random ID above. It is added by our host to the page as it is served, not by the page itself, which is why you will not find it in this page's source.
Resend (email delivery — it carries the two messages above to us, and sees your address when you send one) · Google Fonts and cdnjs (the typeface and the charting library) · unavatar.io (profile pictures — it receives the handle you type, so it can return that account's avatar). These receive your IP address as any asset request does. The usage log goes to our own server and touches none of them.
We set no cookies. We run no advertising, no cross-site tracking and nothing that follows you off this site — the analytics above is a page counter, and the random ID is local to this browser. An earlier version of this note claimed "no analytics or tracking scripts of any kind"; that stopped being true when the page counter was added, and this paragraph replaces it.
Email the address on the capture block with your handle and we will delete the rows. There is no account to close.