Calculating Reach in the Fediverse: Methods, Formula, Limits

How followers, boosts and reactions turn into a reach figure, and how FediSuite and FediWings calculate it

By Christin Löhner (opens in a new tab) 11 min read

The Fediverse has no impression counter for other people's posts. No instance tells you how often a post was shown, and there is no shared statistic like the ones commercial platforms keep. Reach can still be calculated, from what is publicly visible: the followers of the account that published the post, the followers of every account that boosted it, and the reactions under it. FediSuite and its sister project FediWings calculate it exactly this way. The model returns two numbers: gross reach as the upper limit and net reach as the value you work with. This article explains the calculation precisely enough that you can redo it by hand.

What reach means in the Fediverse

Reach is the number of accounts that probably saw a post. A commercial platform knows this number because it delivers every impression itself and counts it. In the Fediverse a post travels across many servers. It appears on the instance of the account that published it, on the instances of its followers and, once someone boosts it, on the booster's instance and on those of the booster's followers. Each of these servers counts for itself, and the ActivityPub protocol has no way to report views back, as the W3C specification shows. A true impression number for someone else's post does not exist, and nobody can fetch it from outside.

Visible from outside are the counters on the post for favourites, boosts and replies, the list of accounts that boosted it, and the follower counts of those accounts. The Mastodon API hands out the booster list of public posts without a login, as the documentation on statuses describes. That is enough for a model.

Simple approaches and their gaps

The most obvious approach takes the follower count of the publishing account. The number is the same for every post and says nothing about which post travelled further than another.

The second approach is the interaction rate: favourites, boosts and replies divided by followers. It compares posts of one account but misses the mechanism that decides reach in the Fediverse. For an account with 2,000 followers, a boost from an account with 20,000 followers opens a circle ten times larger. In the rate it counts as one unit, like any favourite from the account's own circle.

The third approach asks who passed the post on and adds their followers. From here on the numbers become usable.

Gross reach: the known distribution circle

Gross reach adds the current follower count of the publishing account and the follower counts of all accounts that boosted the post publicly.

text
G = followers of the account + followers of all boosters

The booster list comes from GET /api/v1/statuses/:id/reblogged_by. Every entry is an account with its follower count, the list is split into pages of at most 80 accounts, and the Link header of the response names the next page. G is an upper limit. Anyone who follows both the account and a booster is counted twice, because FediSuite does not compare follower lists, for reasons of privacy and effort. In a thread every booster counts once, even if they boosted several parts. Otherwise a thread would show more reach through its length alone while reaching the same people.

Net reach: the calculation

Net reach estimates how many accounts in the distribution circle probably saw the post. It is the value FediSuite and FediWings put at the centre. The model estimates, and it does so with an open origin and a calculation you can check for every post. That is why it works for comparing posts.

text
Net = min(G, max(0.0165 × G × (1 + 2 × B + 2 × Q)^0.7314 × (1 + F + R)^0.2214, F + B + Q))

G is gross reach, B the boosts, Q the quotes, F the favourites and R the replies. The formula has five building blocks.

The base rate is 0.0165. A post without any reaction reaches 1.65 percent of the distribution circle. For an account with 1,000 followers that is 17 accounts.

Boosts and quotes enter with double weight and are raised to the power of 0.7314. The first boosts lift the number sharply, each further boost lifts it a little less. FediWings justifies the double weight with the assumption that a boost stays visible longer in a chronological timeline than a share in an algorithmic feed. Quotes are Mastodon's quote posts, available since version 4.5, and count like boosts. The API does not deliver the follower counts of the accounts that quote, so quotes raise net reach but not gross reach.

Favourites and replies are raised to the smaller power of 0.2214. They show that someone saw the post but do not carry it further, so they weigh less than boosts.

The lower bound is the sum of favourites, boosts and quotes. Whoever reacted has seen the post, and the formula must never leave those accounts out. The upper bound is G, because according to this model the post cannot have reached more accounts than the known distribution circle.

Where 0.0165, 0.7314 and 0.2214 come from

Ralf Stockmann (@rstockm@chaos.social), the developer of FediWings, derived the constants from 510 Instagram stories of the account of the Zentral- und Landesbibliothek Berlin. Instagram delivers measured reach for the same signals the Fediverse shows publicly: likes, replies and shares. He compared four models, a simple mean estimate, a linear regression, a Huber regression and a logarithmic regression. The logarithmic one fitted the data best, and the two exponents come from it. The library account was chosen because, in Ralf's view, it behaves unusually like a Mastodon account: organically grown, without paid advertising and with high interaction rates. The formula is therefore a transfer from Instagram and was not calibrated on Fediverse impressions. Both projects say so openly, and the methodology is published verbatim on the FediWings page.

FediSuite adopts the formula unchanged. Ralf and I agreed on this because two tools with two formulas would print two different numbers for the same post, and nobody would know which one to believe. When Ralf extended the formula with quotes in September 2026, I adopted the change immediately.

Worked examples

An account with 500 followers publishes a post. Three accounts boost it, and their followers add up to 300, so G is 800. The post gets 10 favourites and 2 replies. The calculation is 0.0165 × 800 × (1 + 2 × 3)^0.7314 × (1 + 12)^0.2214 and gives 97. If two more accounts quote the post, it becomes 0.0165 × 800 × (1 + 2 × 3 + 2 × 2)^0.7314 × 13^0.2214, which is 135, while G stays at 800. The value is above the lower bound of 15 and far below the upper bound of 800.

The same 1,000 followers give very different values depending on the post:

Post Gross Boosts Favourites and replies Net
no reaction at all 1,000 0 0 17
5 favourites, 1 reply 1,000 0 6 25
3 boosts from accounts with 900 followers in total 1,900 3 14 237
12 boosts from accounts with 5,200 followers in total 6,200 12 46 2,527

The third row has 12 favourites and 2 replies, the fourth 40 favourites and 6 replies. Between row two and row three lies the difference that the interaction rate cannot see: three boosts open the post to the followers of the boosters.

The lower bound matters for small accounts. If an account with 100 followers gets 50 favourites on a post, the formula alone would give 4. Net reach still stands at 50, because 50 accounts demonstrably reacted.

How FediSuite collects the data

FediSuite reads the booster list through the Mastodon API, in pages of 80 accounts and by default up to five pages per post. Each booster is recognised by its account identifier and stored once, together with its follower count. There is a practical reason: instances delete the individual boost entries of old posts after some time, while the boost counter stays. FediSuite therefore keeps every booster it has seen once and never lowers a stored follower count. The reach of a post can only grow. It does not shrink because a server somewhere tidied up.

If fewer boosters are known than the counter counts boosts, FediSuite marks the post as partially calculated. This also happens when the instance does not hand out the list. Pixelfed, for example, delivers no booster list, so there gross reach consists of the followers of the account alone. FediSuite merges threads into one unit and counts every booster in them once.

FediSuite recalculates posts of the last 90 days continuously. A recent post is picked up again when its counters change or after 24 hours, older posts as soon as they receive new boosts, favourites, replies or quotes. It treats other instances with consideration: only a few requests per instance run at the same time, and an instance that reports limits is left alone for between one and fifteen minutes.

FediWings: the single analysis without an account

FediWings is the sister project by Ralf. You enter a handle, and the page calculates gross and net reach of that account's posts, without a login and without any result being stored anywhere. All requests go straight from your browser to the home instance of the account. FediWings first identifies the instance through NodeInfo, loads the account and its public posts anonymously and asks for the booster list only for posts that have boosts at all. It holds back while doing so: at most two parallel requests, a budget of 120 booster requests per analysis, at most ten booster pages per thread and no automatic background updates. An analysis of 80 threads with one booster page each costs about 85 requests. FediWings is meant for social media teams that run at least one free, federated channel next to their commercial ones and have to show management what that channel achieves.

Both projects calculate with the same formula and differ in how they are used:

Aspect FediWings FediSuite
Access enter a handle, no account needed account on a FediSuite instance, own Fediverse accounts connected
Data loaded during the analysis, nothing is stored stored and updated continuously
Time frame snapshot history over weeks and months
Use check an account or post quickly evaluate your own accounts continuously, plan and compare

Reading reach and using it for the next posts

Compare posts of the same account, not accounts with each other. All posts are calculated with the same yardstick, so the comparison shows which topics, formats and times of day carry beyond your own circle. The distance between net and gross says more than the single number: if net reach is close to gross reach, the post has almost exhausted the known distribution circle. If it is far below, only a small part of that circle noticed it.

FediSuite turns this into evaluations. The top posts are sorted by net reach, and the tips are based on it: best time of day and best weekdays for reach, whether media or text posts travel further for you, a warning when your reach almost entirely consists of your own follower circle, and an alert when reach falls. Campaigns get reach goals, and the federation view shows which instances the reactions come from. More on this is on the pages about reach analysis, the best time to post and Mastodon analytics.

Limits of the model

The limits are stated openly in the FediWings methodology and in the app. Follower circles overlap, and the overlap is not removed. Follower counts come from the time of the analysis, not from the time of publication. Private or deleted boosts, and boosts that federation does not make visible, can be missing. Mutes, word filters, domain blocks and what people actually read are unknown to anyone outside. Favourites and replies are both a result and a signal of the same visibility, and the net formula is derived from Instagram stories. These limits apply to every post equally, so the comparison within one account stays meaningful.

Evaluate your own accounts in FediSuite

FediSuite shows you gross and net reach for every post of your connected accounts, plus the individual building blocks of the calculation and a note when boosters are missing. The methodology badge next to every reach value leads to the full explanation in the app. The instance at app.fedisuite.com is free, FediSuite is released under the GPL-3.0 and can be run with Docker on your own server.

Connect your Mastodon account, or an account on Pixelfed, Pleroma, GoToSocial, Friendica or another compatible platform, to FediSuite and look at how far your latest posts travelled. If you want to check the calculation from the outside first, enter a handle at FediWings. The formula itself is in the FediSuite source code, and the Docker installation guide describes running it on your own server.

Tags

Share this post

Title, teaser, link and tags as hashtags are prepared for you. Nothing is sent until you press post in your own network.

Share on Bluesky (opens in a new tab)

All posts