I calculate Bluesky engagement rate when I want to compare posts without staring at raw counts.
Raw counts are useful, but they are unfair by default. A post with 80 likes from an account with 800 followers is doing a different job from a post with 80 likes from an account with 80,000 followers.
Use TheBlue.social's Bluesky Engagement Rate Calculator when you want the quick follower-based version:
(likes + reposts + replies + quotes) / followers * 100
Use it as a comparison tool, not a reach metric.
Start with the counts Bluesky exposes
Bluesky's official app.bsky.feed.defs lexicon defines the public post view fields that matter here: likeCount, repostCount, replyCount, and quoteCount.
I use those four counts for a practical engagement total:
- likes show lightweight approval
- reposts show distribution
- replies show conversation
- quotes show people adding their own framing
I usually keep all four in the formula because each one is a real action on the post.
I do not add them because they are equal. A reply is usually more work than a like, and a quote can change the meaning of the original post. For a fast calculator, one combined engagement count is useful enough.
If I need a deeper analysis later, I split the counts back out.
Use followers as the denominator
The calculator uses follower count because it is easy to find and consistent enough for quick comparisons.
The official app.bsky.actor.getProfile API returns detailed profile data for an actor. The profile definition includes public count fields such as followersCount, followsCount, and postsCount.
Follower count differs from reach and impressions. It does not tell you how many people saw the post.
The denominator matters.
Follower-based engagement rate answers a narrower question: compared with the size of the account, how much visible action did this post get?
I still use it when I am comparing:
- two posts from the same account
- a recent post against that account's usual posts
- a small account against a larger account
- a test post against a previous version of the same idea
It is less useful when I am comparing posts from accounts with different audiences, different posting habits, or one-off viral distribution.
Use one formula and stick to it
The formula I use for a quick pass:
engagements = likes + reposts + replies + quotes
rate = engagements / followers * 100
So if a post has:
- 18 likes
- 5 reposts
- 7 replies
- 2 quotes
- 1,200 followers
The math is:
engagements = 18 + 5 + 7 + 2 = 32
rate = 32 / 1200 * 100 = 2.67%
Use that number as a comparison point, not a grade.
I care more about consistency than the exact benchmark. If I change the formula every time, I am not measuring posts. I am making the numbers fit whatever I already wanted to believe.
Compare posts from the same context first
The cleanest comparison is one account against itself.
I look at a small group of posts from the same account, usually from the same month. Then I compare rates and read the posts.
I want to know:
- did questions get more replies?
- did practical examples get more reposts?
- did image posts get more likes but fewer replies?
- did posts with links underperform?
- did one topic bring a different kind of interaction?
The rate points me to the posts worth reading. It does not explain them by itself.
For example, a post with a 6% rate might look strong. But if most of that came from one quote by a large account, I treat it differently from a post that got steady replies from my actual audience.
Same number. Different meaning.
Separate total engagement from engagement mix
I keep the total rate small and fast, then I check the mix.
A post with 40 likes and no replies is different from a post with 15 likes and 20 replies.
For a creator, both can be useful. A support or product account may care more about replies because they expose confusion, objections, and feature requests. A public resource may care more about reposts because they carry the post into adjacent communities.
The engagement-rate calculator gives me the top-level number. Then I read the breakdown:
- mostly likes: the post was easy to agree with
- many reposts: the post was useful to share
- many replies: the post opened a conversation
- many quotes: the post gave people something to frame or debate
I do not treat one mix as always better. I match the mix to the job of the post.
Pull counts from current posts when possible
Bluesky counts change over time, especially soon after posting.
The official app.bsky.feed.getPosts API gets hydrated post views for specified post AT-URIs. The official app.bsky.feed.getAuthorFeed API gets an actor's author feed and does not require auth.
For manual checks, I usually just open the post and read the visible counts. For tool-backed checks, those endpoints explain the shape of the data: post views with count fields, plus profile data for the follower denominator.
Either way, I avoid mixing old screenshots with current follower counts. The rate gets weird when the numerator and denominator come from different moments.
If I am comparing an old post, I use the current counts for both the post and the account, or I write down that the comparison is rough.
Keep a small comparison sheet
I keep this simple.
For each post, I save:
- post URL
- date posted
- likes
- reposts
- replies
- quotes
- follower count
- engagement rate
- one note about the post
I come back to the note. Numbers tell me which posts to inspect. The note tells me what I learned.
For example:
Post: short list cleanup tip
Rate: 4.8%
Mix: many replies, few reposts
Note: people asked about edge cases, so this should become a checklist
A small note is more useful than a leaderboard.
I also keep the sample small. Five to ten posts from one account is enough for a quick read. If I pull 50 posts, I start sorting and filtering instead of reading. At that point I should use the analytics dashboard, not a manual calculator.
Avoid comparing everything
Engagement rate gets messy when I use it for the wrong job.
I skip this calculator when the question is whether an account is "good" or "bad." I use it to make a small decision:
- should I write more posts like this?
- should I stop using this format?
- should I reply more often on this topic?
- should I turn this post into an article?
- should I test the same idea with a clearer hook?
Small decisions are where the number helps.
For bigger decisions, I want more context: follower growth, clicks, replies, profile visits if available, saved posts, list adds, starter-pack adds, and what people said.
Engagement rate is one signal. Useful, but not enough by itself.
My default pass
Here is the pass I use:
- Pick 5 to 10 posts from the same account.
- Enter likes, reposts, replies, quotes, and followers into the calculator.
- Sort the posts by engagement rate.
- Read the top posts and the bottom posts.
- Check the engagement mix.
- Save one lesson for the next batch of posts.
The point is the last step.
If the rate does not change what I post next, it was just spreadsheet entertainment.
Check the same post twice
I usually check a post once after the early burst and once later.
Early counts tell me whether the post caught attention quickly. Later counts tell me whether it kept moving through replies, reposts, search, lists, or starter packs.
For a normal post, I might check:
- after a few hours
- the next day
- a week later if it kept getting replies
I do not need a perfect schedule. I just want to avoid comparing a 20-minute-old post against a post that had a week to circulate.
The timing note can be tiny:
Checked: 3 hours after posting
Checked again: next morning
Timing explains a lot of weird comparisons. A post can look weak at first and still become useful after someone quotes it. Another post can get a fast burst from mutuals and then stop.
The calculator does not know any of that. I have to keep the timing context next to the rate.
For quick checks, the follower-based formula is enough. Count the visible actions, divide by followers, and compare posts from the same context before drawing conclusions.
Last updated: June 16, 2026