Twitter Analytics: What the Numbers Mean and How to Get Them Yourself

13 min readSocialAPI Engineering

Twitter Analytics: What the Numbers Mean and How to Get Them Yourself

X gives you an analytics tab. It shows impressions, engagements, a rate, and a chart that goes up and down.

Most people look at it, note that a number moved, and close the tab. Not because they're lazy — because the built-in view answers a question almost nobody is actually asking.

The question people have is comparative: is this working better than what we did last month? Better than the accounts we watch? Which of these posts is worth doing more of? The built-in analytics is structurally unable to answer any of those, and it's worth understanding why before reaching for a tool.


What you get for free, and where it stops

Go to analytics.x.com while logged in and you'll see impressions, engagements, engagement rate, profile visits, and new followers, with a per-post breakdown.

For a quick check on your own recent posts, this is fine. It's the real data, straight from the source.

Three walls you hit quickly:

It's only you. You cannot see anyone else's analytics. Not competitors, not the accounts in your space, not the person whose post format you're trying to understand. For anyone else, you only see what's public on the post itself.

The history is shallow. The interface is built around recent windows. Year-over-year comparison, or "how did we do during that campaign in March", means you needed to be exporting all along.

Export is awkward. CSV export exists but the shape is inconvenient, the column meanings shift between views, and there's no way to get it on a schedule. Anything recurring means someone remembering to click a button.

★The gap isn't that the numbers are wrong. It's that analytics is comparative by nature and the built-in view gives you exactly one subject.

Closing that gap means getting public post data for accounts other than your own — which is what our API is for, if you'd rather skip to the building part.


What the metrics actually mean

Worth being precise, because several of these are routinely misread.

Impressions — how many times the post was rendered on someone's screen. Not unique people; the same person scrolling past twice counts twice. Treat it as reach-ish, not audience size.

Engagements — total interactions of any kind. This is broader than people expect: it includes link clicks, profile clicks, hashtag clicks, media expands, and detail expands, not just likes and reposts. A high engagement count with few visible likes usually means people clicked something.

Engagement rate — engagements divided by impressions. The one number worth watching, because it's normalised. A post with 200 likes on 500,000 impressions performed worse than one with 50 likes on 5,000.

Profile visits — people who tapped through to your profile. This is the closest thing to intent in the whole set. Someone reading a post is passive; someone clicking your name wants to know who you are.

Views — the count shown publicly under every post. Roughly the same thing as impressions and, crucially, ★visible on everyone's posts, not just your own★. This is the metric that makes external analysis possible at all.

⚠️ The one people get wrong most: comparing raw engagement counts between accounts of different sizes. An account with 500 followers getting 40 likes is outperforming an account with 500,000 getting 400. Always divide by something — followers, impressions, views — before drawing a conclusion.


The analysis worth doing

If you're going to build something, these are the questions that actually change decisions.

1. Which format works for us? Group your own posts by shape — text only, single image, video, thread opener, link — and compare median engagement rate per group. Median, not mean: one viral post will drag an average until it's meaningless.

2. What time should we post? Bucket posts by hour of day and weekday, then look at engagement rate per bucket. Beware the trap: if you've historically only posted at 9am, you have no data about 3pm. You're measuring your own habit, not the audience.

3. How do we compare to the accounts we watch? Pull public posts from a set of accounts in your space, compute engagement per follower, and rank. This is the analysis the built-in tab cannot do at all, and it's usually the most useful one.

4. What's actually spreading? Sort by ratio of reposts to likes. A high repost-to-like ratio means people found it worth passing on rather than just acknowledging — a different and more valuable signal than raw likes.

5. Is the trend real or is it noise? Compare rolling windows, not adjacent days. Daily numbers on most accounts are dominated by variance; a 7-day rolling median tells you something a day-over-day comparison doesn't.


Building it

Every post that comes back from the API carries its engagement counts already attached — likes, reposts, replies, quotes, and views — so a single pass over an account's timeline gives you everything you need for the analysis above.

import requests
from collections import defaultdict
from statistics import median

BASE = "https://api.socialapi.tech"
KEY  = "your_api_key"

def fetch_posts(username, limit=100):
    r = requests.get(
        f"{BASE}/v1/user/last_tweets",
        params={"username": username, "limit": limit},
        headers={"X-API-Key": KEY},
        timeout=60,
    )
    r.raise_for_status()
    return r.json()["data"]

def engagement_rate(post):
    """Engagements over views. Views can be zero on very new posts."""
    views = post.get("view_count") or 0
    if not views:
        return None
    interactions = (
        post.get("like_count", 0)
        + post.get("retweet_count", 0)
        + post.get("reply_count", 0)
        + post.get("quote_count", 0)
    )
    return interactions / views

posts = fetch_posts("nasa", limit=100)

rated = [(p, engagement_rate(p)) for p in posts]
rated = [(p, r) for p, r in rated if r is not None]

print(f"{len(rated)} posts with view data")
print(f"median engagement rate: {median(r for _, r in rated):.2%}")

print("\ntop 5 by engagement rate:")
for post, rate in sorted(rated, key=lambda x: -x[1])[:5]:
    print(f"  {rate:.2%}  {post['like_count']:>6} likes  {post['text'][:60]}")

Why rate against views rather than followers: followers is a vanity denominator — it counts people who followed you three years ago and never opened the app again. Views counts people the post actually reached. Rate-against-views is the honest version.

The same loop works for any public account, which is what makes competitive comparison possible. Paging back further gives you a longer baseline.


Comparing accounts

The genuinely useful version — run the same measurement across a set of accounts and rank them:

def profile_summary(username):
    posts = fetch_posts(username, limit=100)
    rates = [r for r in (engagement_rate(p) for p in posts) if r is not None]
    if not rates:
        return None
    return {
        "username": username,
        "posts": len(posts),
        "median_rate": median(rates),
        "best_rate": max(rates),
    }

WATCHLIST = ["nasa", "esa", "spacex"]

rows = [s for s in (profile_summary(u) for u in WATCHLIST) if s]
for row in sorted(rows, key=lambda r: -r["median_rate"]):
    print(f"{row['username']:>12}  median {row['median_rate']:.2%}  best {row['best_rate']:.2%}")

What this tells you that the built-in tab can't: whether a weak month is you, or the whole category.★ If everyone you track is down, that's the platform or the season. If only you are down, that's you.


Two honest limitations

You can't see other people's impressions. Views are public; impressions as X defines them internally are not. For external accounts you're working with views, which is close enough for comparison but not identical to what they see in their own tab.

Historical depth is bounded. You can page back through a timeline, but not indefinitely. If you want a two-year baseline, the way to get it is to start collecting now — the same asymmetry that applies to archiving applies here. Reconstructing backwards is lossy; capturing forwards is complete.

Nobody can give you a complete multi-year engagement history for an arbitrary account, and any tool suggesting otherwise is reconstructing from a partial index.


Questions people ask

How do I see my Twitter analytics? analytics.x.com while logged in, or the analytics link on individual posts. Covers your own account only.

Is Twitter analytics free? Yes, for your own account. The paid tiers add depth, not access.

Can I see someone else's analytics? Not their private dashboard. You can see public engagement on their posts — likes, reposts, replies, quotes, views — which is enough for comparison.

What is a good engagement rate on Twitter? Depends heavily on account size and niche. Small accounts routinely see several percent; very large accounts often sit well under one. Compare against your own history and your own category, not a published benchmark.

How is engagement rate calculated? Engagements divided by impressions. Working externally you'd use interactions divided by views, which is the same idea with public numbers.

What counts as an engagement? More than people expect: likes, reposts, replies, quotes, plus link clicks, profile clicks, hashtag clicks, and media expands.

What are impressions? Times the post was rendered on a screen. Not unique people — one person can generate several.

What's the difference between impressions and views? Practically similar. Views is the public number under a post; impressions is the internal metric in your own dashboard. Views is the one you can use for other accounts.

How far back does Twitter analytics go? The interface is built around recent windows. For long-term comparison you need to have been exporting.

Can I export Twitter analytics to CSV? Yes, manually, from the analytics interface. There's no scheduled export — recurring reporting means an API or someone clicking a button every week.

What's the best free Twitter analytics tool? The built-in one, for your own account. Beyond that you're either using a hosted tool or computing from public data yourself.

How do I track competitor performance? Pull their public posts, compute engagement per view, and compare over time. Their raw follower count matters far less than their rate.

Why did my impressions drop? Usually posting frequency, format change, or timing. Check whether accounts you track dropped too — if everyone did, it isn't you.

What time should I post? Whatever your own data says. Published "best times" are averages across wildly different audiences. Bucket your posts by hour and compare rates — but only if you've actually posted at varied times.

Does the algorithm favour certain formats? Formats perform differently, and it shifts. Rather than trusting a general claim, measure it on your own account — it takes one pass over your timeline.

How do I measure a hashtag or campaign? Search for it, collect the posts, and aggregate engagement across them. That's campaign measurement rather than account measurement.

Can I get analytics for a specific post? Yes — every post carries its own like, repost, reply, quote, and view counts.

Why do my numbers differ from a third-party tool? Different denominators, usually. Some rate against followers, some against impressions, some against views. Check what's under the division line before treating a discrepancy as an error.

Should I track followers or engagement? Engagement. Follower count is a stock number that moves slowly and can be inflated; engagement is what's happening now. Tracking follower changes is worth doing separately, for a different reason.

How often should I check? Weekly for decisions, daily only if you're running something time-sensitive. Daily numbers are mostly variance.

Can I automate reporting? Yes — that's the main reason to compute this yourself rather than reading a dashboard. Pull on a schedule, store it, and the baseline builds on its own.

How do I view Twitter analytics for a single tweet? Tap the analytics icon under your own post. Tweet analytics for other people's posts isn't available — you see their public counts instead.

Is there a Twitter analytics dashboard? X's built-in one covers your account only. Anything showing you a dashboard across several accounts is computing it from public data, the same way the code above does.

How do I get Twitter follower stats over time? X doesn't store a follower history for you. You build it by recording counts on a schedule — see follower tracking.

Can I get Twitter analytics for another account? Not their private dashboard. Their public engagement is visible, and engagement per view is the comparable metric.

What are Twitter stats? The counts on each post plus the totals on a profile. ★The public ones are readable for anyone★; the private dashboard is yours alone.

How do I check tweet stats? Every post carries replies, reposts, quotes, likes, and views. ★Four of those five are public on anyone's post.★

Is there a Twitter stats tracker? Any tool polling and storing counts is one. ★The value is the history you accumulate★ — the platform keeps none for you.

How do I see account analytics? Your own at analytics.x.com. ★For any other account, compute from public post data instead.★

Is there an engagement rate calculator? It is one division: interactions ÷ views. ★No tool is needed★ — what the ratio means.

What is a good engagement rate? ★Compare against your own history, not a published benchmark★ — rates vary enormously by audience size and topic.

How do I calculate engagement rate? (replies + reposts + quotes + likes) ÷ views. ★Use views, not follower count★ — followers overstate reach.

Why do my analytics differ from a third-party tool? ★Different denominators — impressions versus views★ — the distinction.

Can I track analytics over time? Only if you record it. ★A reading is not a series★ — sample on a fixed interval.

How do I track follower analytics? Snapshot the count and list on a schedulehow tracking works.

Can I get analytics for a competitor? Their public engagement, yes; their dashboard, no. ★Engagement per view is the comparable figure.★

Are Twitter analytics accurate? They are accurate as counts. ★What they do not tell you is how many were real people★ — the bot question.

Can I do sentiment analysis on the data? You can retrieve the text and analyse it yourself. ★Automated sentiment on short posts is unreliable enough to state plainly.★

What is the single most useful metric? ★Engagement per view.★ It is comparable across account sizes; raw counts are not.

How far back do analytics go? Your dashboard favours recent windows. ★For longer history, record it yourself★ — the archive reality.


If you're building this

The analysis is straightforward. What takes the time is the collection underneath it: paging that doesn't silently truncate, storage that lets you compare against last month, and retries that distinguish a rate limit from a real failure.

That's the part our API handles — every post returns with its full engagement counts attached, cursor-based paging, flat price per call, no rate limit of your own to manage. It's read-only: it reads public data and never acts on your account.

Two things we don't bill for: requests we reject before they leave us, and errors on our side.

Related reading: monitoring keywords and accounts in real time · advanced search operators for campaign measurement · comparing every way to get X data.