Why did my post get zero or very low impressions?
In the open-source X algorithm, a post reaches a viewer only by surviving three stages: it must be retrieved as a candidate (from followers via Thunder, or globally via Phoenix retrieval), survive ten named pre-scoring filters, and then score well enough in a ranking that explicitly subtracts for predicted blocks, mutes, and reports. Near-zero impressions means the post is dying at one of those three stages — and they have different causes.
Stage 1 — your post has to be retrieved at all
For You candidates come from exactly two sources in the released pipeline: Thunder serves recent posts from accounts a viewer follows, and Phoenix retrieval discovers posts from the global corpus by ML similarity to the viewer's engagement history. If you have few followers, Thunder can only carry you to those few; everything beyond them depends on Phoenix retrieval finding your post relevant to strangers' engagement patterns. A post that is never retrieved is never even ranked — the most common shape of true zero.
For You candidates come from two sources: Thunder (in-network — posts from accounts you follow) and Phoenix Retrieval (out-of-network — ML-based similarity search across a global corpus). Both are ranked together by Phoenix.
Stage 2 — ten named filters run before scoring
Retrieved candidates are then removed for any of ten documented reasons: duplicates, failed metadata hydration, posts older than a threshold, the viewer's own posts, repost duplicates, paywalled content the viewer can't access, posts the viewer has already seen or been served, posts containing the viewer's muted keywords, and posts from authors the viewer has blocked or muted. Two of those are worth staring at: the already-seen/already-served filters mean reach is consumed per viewer — a post doesn't get shown to the same person indefinitely — and the muted-keyword filter means vocabulary choices can silently subtract whole audiences.
Before scoring, Home Mixer removes: duplicates, posts that failed metadata hydration, posts older than a threshold, your own posts, repost duplicates, paywalled content you can't access, posts you've already seen or been served, posts containing your muted keywords, and posts from authors you've blocked or muted.
Stage 3 — the score, including the negative side
What survives is ranked by Phoenix, which predicts the probability of many engagement types per viewer, combined by a weighted sum.
Phoenix, a Grok-based transformer, predicts per-post probabilities for many engagement types; the final ranking score is a weighted combination of those predicted engagements.
The subtraction is explicit: predictions for "not interested," block, mute, and report carry negative weights. A post can be interesting to some audiences and still rank poorly overall because the model expects enough viewers to react negatively — low impressions with no policy violation anywhere in sight.
The model explicitly predicts negative actions — not interested, block author, mute author, report — and these carry negative weights in the final score, pushing down content a user would likely dislike.
What this means for you
Diagnose in stage order. If brand-new posts get literally nothing even from followers, look at stage 1 and 2 mechanics — posting cadence against the age filter, whether your audience has functionally muted your vocabulary, accumulated blocks. If posts get a small burst then flatline, that's consistent with per-viewer consumption: your follower pool has been served, and out-of-network retrieval isn't picking you up. If reach is steady but low, stage 3 is the likeliest culprit — the model's negative-action predictions are taxing you. Each stage shows up differently in your own data, which is exactly what an archive-level audit is for.