FollowerOwl

[00] METHODOLOGY

How we get the number. And what it cannot tell you.

We open three files out of an archive that holds hundreds, run four set operations over them, and show you the result. That is the whole method. Below is each file we read, the arithmetic in full, the ceilings that make us refuse an archive, and the questions your export cannot answer however carefully it is processed. No engagement score. No proprietary index. Nothing you could not recompute yourself.

[01] WHO BUILDS THIS

A Turkish company, running on somebody else’s computers. Worth knowing before you decide how much to trust the rest.

FollowerOwl is built by Next Yazılım Teknoloji Anonim Şirketi, registered at Üniversiteler Mahallesi, 1606. Cadde, 4A Blok No: 304, Ankara, Türkiye. It is an independent project and is not affiliated with, sponsored by, or endorsed by Meta.

The service runs on Cloudflare. When you save a snapshot, the three lists live in a Durable Object dedicated to your profile. Leave the EU-storage toggle on at save time and that object is created in Cloudflare’s EU jurisdiction and stays there — it cannot be moved afterwards, which is why the choice is offered before the save rather than after.

That claim is deliberately narrow. The control plane, request logs, anonymous analytics, transactional email and payments are not pinned to the EU. The privacy policy lists each one by name, because a scoped claim you can check is worth more than a broad one you cannot.

Questions about the method go to hello@followerowl.com. Anything about your own data goes to privacy@followerowl.com.

If a number on this site disagrees with a number you counted yourself, that is a bug and we want to hear about it. The arithmetic is in section 03 precisely so that the comparison is possible.

[02] WHAT WE READ

Three files. We never open the rest. Which is why a 1.3 GB export finishes as fast as an empty one.

A ZIP file keeps an index of its own contents at the end of the archive. We read that index, find the three paths below, and inflate only those. Your photos, your messages and your viewing history are not skipped after being read — they are never read at all. That is a property of how the archive is opened, not a promise about what we do afterwards.

  1. [01]

    follower

    connections/followers_and_following/followers_1.json

    Numbered followers_1 … followers_N on large accounts, plus legacy followers.json. Read in numeric order so the result is deterministic.

  2. [02]

    following

    connections/followers_and_following/following.json

    The list you are compared against. Without it we can tell you who your fans are but not who fails to follow back.

  3. [03]

    pending

    connections/followers_and_following/pending_follow_requests.json

    Requests you sent that were never accepted. Optional; its absence costs you one tab and nothing else.

Matching is by filename, case-insensitive, so a renamed folder or a set of loose files still works; where the same name appears twice, the copy under connections/followers_and_following/ wins.

Instagram has shipped at least three different JSON shapes for these lists — the username sits in string_list_data[].value in one, in title in another, and behind a label_values list in a third. We read all three and fall back to the last segment of the profile URL. Display names, numeric ids and every other field are dropped at the point of reading and never travel further.

Your handle comes from the archive’s filename, which is the only place Instagram records it outside the one file this product exists in order not to open. Rename the archive and the export still parses; it simply arrives without a handle and starts its own history.

[03] HOW THE NUMBER IS MADE

Four set operations, and no model. You can reproduce every figure with a spreadsheet and an afternoon.

Each list becomes a set of usernames. Everything the product reports is one of four operations over those sets. There is no scoring, no weighting and no estimation anywhere in it — given the same export, the answer is always identical.

Doesn’t follow you back

following - followers

Everyone you follow who is absent from your followers list.

You don’t follow back

followers - following

The mirror image, and usually the larger number.

Mutual

following & followers

Present in both lists.

Unfollowed you

followers(A) - followers(B)

Needs two exports from different days. This is the only one that does.

Results are ordered by how long the relationship has lasted, oldest first, because “I have followed them for two years and they have never followed back” is the fact people actually act on. Where an export carries no timestamps the order falls back to alphabetical and the screen tells you so.

Rows are de-duplicated, and a timestamp outside a plausible range is discarded rather than trusted. Anything we could not read as a username is counted and reported back to you as a caveat on the result — never silently dropped to make the totals look tidier.

[04] WHAT IT CANNOT TELL YOU

The questions this data does not answer. Every product in this category sells at least one of them anyway.

  • Who unfollowed you, from one export

    A single export is a photograph. Two photographs are what make a difference visible, which is why the product asks you back rather than inventing the number.

  • Why somebody left

    A deactivated account, a deleted account, a block and a deliberate unfollow are the same event in this data: a username present in the older list and absent from the newer one. We report the disappearance and refuse to name a cause.

  • Who viewed your story or profile

    Instagram does not put it in the export, so nobody working from an export can know it. Any product claiming otherwise is either guessing or asking for your password.

  • Anything about an account you cannot see

    The export contains your relationships and nothing about anyone else’s. There is no global index here; usernames are not searchable across profiles, by design.

  • When a follow began, in an HTML export

    Only the JSON format carries timestamps. Ask for JSON and the lists sort by how long the follow has lasted; ask for HTML and they fall back to alphabetical, and we say so on the screen rather than implying an order that is not there.

None of these is a roadmap item. They are properties of what Instagram puts in an export, and no amount of processing turns an absent fact into a present one.

[05] WHEN WE REFUSE A FILE

The ceilings, and why they exist. Reading a stranger’s archive is a hostile-input problem.

250,000

rows per snapshot

followers, following and pending combined

10,000

entries per archive

an export with more is not an export

64 MB

per file

256 MB across everything we open

1000:1

compression ratio

deflate tops out near 1032:1

An archive that claims to hold far more than it can, or that is password-protected, or compressed by something that is not Instagram, is refused before it is read rather than after. A file that trips one of these gets a specific sentence naming what went wrong and what to do next — never “something went wrong”.

These are ceilings on what we will open, not estimates of what you have. An account with a quarter of a million relationships parses fine; the ceiling exists so that a deliberately malformed file cannot make your own browser hang.

[06] WHERE THE MONEY COMES FROM

The question you arrived with is free. You pay for history, and only if you want it.

$0

The instant check

Who doesn’t follow you back, who you don’t follow back, and what is still pending. No account, no email, no upload. It stays free because it costs us nothing: the work happens on your machine.

$29

Per year, or $4.99 monthly

Saving snapshots so two exports can be compared. That is the part with a running cost — storage, and a server to hold the lists between visits — so that is the part with a price.

We do not sell your data. That is easy to promise and usually worth little, so here is the version that can be checked: we do not hold it. Run the free check and no username reaches us at all. Save a snapshot and we hold three lists of usernames and their dates for your profile alone, not searchable from any other account.

There is no ad network on this site, no affiliate link, and no third party paying for placement. Usage analytics are first-party and anonymous, and follower counts leave your browser bucketed into ranges rather than as exact numbers, because “1,847 followers” is close to a name. Full pricing.

[07] CHECK IT YOURSELF

Don’t take any of this on trust. The point of writing it down is that it can be disproved.

Open your own export, count the usernames in following.json that do not appear in followers_1.json, and compare it with the number we show. They should match exactly. If they do not, we have a bug, and we would rather hear about it than not.

The claim that your archive is never uploaded is checkable too, and it does not require taking our word either — your browser’s own network panel settles it in about a minute.

For what protects a snapshot once you save one, and for the things we have not built yet, see the trust centre. For who is writing all this, about us.

How to check every claim

[ THE WHOLE METHOD ]

followers = set(followers_1.json ... followers_N.json)
following = set(following.json)

non_followers = following - followers
fans          = followers - following
mutuals       = following & followers

# two exports, A older than B
unfollowers = followers(A) - followers(B)
gained      = followers(B) - followers(A)

That is the entire method. - is set difference and & is intersection, so those lines run as written in Python once the two lists are sets. Everything else on this page explains why each line is safe to believe.