My social dashboard was reporting 0 views for my Threads account. Likes 1,200 and replies 393 came through fine. Only views were zero.
One question for you. When your dashboard shows a zero, can you tell whether the value is zero or the read failed? I could not. I was looking at a single number.
The token and the API were both fine
I suspected the token first — another bot's token had genuinely expired that same day (the post about an OAuth app in testing mode killing refresh tokens every seven days). So I checked. Account insights returned 200. The post list returned 200.
Then I hit one post's insights directly.
GET /v1.0/18455112349140435/insights?metric=views,likes,replies
200 {"data":[]}Not an error. A success with nothing in it. And the last 25 items all looked like that. Add zero 25 times and you get zero.
The app screen and the API list were different
The items returning empty had one thing in common: media_type.
Counter({'REPOST_FACADE': 95, 'TEXT_POST': 5}) # last 100 itemsREPOST_FACADE is the shell object created when I repost someone else's post. It isn't my content, so it has no views to report, and the API says so with an empty array.
The strange part was my profile. Open the app and you see only my own posts, no reposts at all. I checked, and the profile is split into four tabs — Threads / Replies / Media / Reposts. Reposts pile up only in the fourth tab.
So: the app filters by tab; the API hands you one merged list. I had written code that summed the API list, and I verified it by eyeballing the app screen. Since I didn't know the two screens disagreed, there was no way for the wrong code to signal that it was wrong.
Counting by day, the shells were growing:
| Date | Repost shells | My posts |
|---|---|---|
| 08-07 | 14 | 5 |
| 08-08 | 71 | 3 |
| 08-09 | 300 | 6 |
| 08-10 | 83 | 4 |
At 300 a day, "the last 25 items" becomes 100% shells. That is why the metric didn't degrade gradually — it fell to zero on a specific day.
Where would you have fixed it?
There was a fork here. Repost less so the list recovers, or fix the code that reads the list?
I took the second. Reposting is an account-behaviour question, not a metric question, and more importantly, papering over a wrong reader with a habit change means it breaks again later. The fix had two parts.
- Filter
media_type != REPOST_FACADE. - Cursor paging. With shells accumulating this fast, reading a single 100-item page converges back to zero within days. Page through, up to five pages, until 25 of my own posts are collected.
If I had shipped only the filter, it would be correct this week and zero again next week. That was exactly the spot pretending a cheap fix existed.
The fixed number hurt more
Recovered values: my last 25 posts (08-06 to 08-10) sum to 5,051, median 158, max 1,012.
The same row also carries the account metric: 148,448. A 29x gap. That larger number includes impressions from replies I left under other people's posts. I had been burned by this before, in the post where 53k views contained no hit of mine, so the dashboard now prints my views / account views side by side.
Then I applied the first-principles question again. Which single number here actually matters? Not views. Link clicks. So I split the 25 posts by whether they carried a link.
- Posts with a link: 5 of 25
- Views on those 5: 674 (13% of the total)
- The three highest-reach posts (1,012 · 448 · 310): none carried a link
The set of posts that earn reach and the set that have a destination were disjoint. This is the next scene after the post where I built a funnel and had nowhere to put the link. I now have somewhere to put it. The posts carrying it don't travel.
Three lines of self-diagnosis
Hold these three against your own dashboard.
- Do you distinguish zero from "couldn't read"? If your aggregator adds empty responses as zeros, print the item count next to the successful-response count.
0 across 25 items, 0 of which answeredis a different sentence from0. - Are you validating code against a UI screen? If the app already filtered, tabbed and sorted that view for you, whatever the API returns extra stays invisible forever. Start by reconciling the two counts.
- Does "last N items" still cover N days? On a channel where hundreds of noise objects land daily, "last 100" quietly becomes a half-day window. Aggregations without paging rot silently.
The honest part
I don't know exactly how long the bug lived. Counting from 08-08, when the shells spiked, roughly three days. During those days I was looking at the dashboard and concluding "Threads just doesn't report views." When your measurement is wrong, it isn't a conclusion that breaks — your model of the world breaks.
And the real prize for fixing it isn't 5,051, it's 674. That's how much exposure reached posts that actually had a destination, over five days. That number isn't a bug. That one's on me.
Is there a cell in your dashboard reading zero right now? Would you open the log once and check whether that's a value or a silence?