← Back to Blog
Content StrategyContentStrategyContentMarketingQuantitativeMarketing

Content hit rate: how many posts before it means anything

Half of a client's reels found distribution and half died. I turned that into a planning model, with runnable Python, that answers how many posts a month you need before the number stops being noise.

SPSantosh Paudel· September 6, 2026· 13 min read
Table of contents

Short answer: if roughly half your posts find distribution and the winners run 20 to 50 times the losers, then eight posts a month is not enough to tell a good month from a lucky one. In the model below, a month of eight posts swings 3.6x between its unlucky and lucky ends with the process held completely constant. At 30 posts it swings 1.9x. Volume is not a growth hack. Volume is the thing that makes the monthly number readable at all. Below it you are reading noise and calling it strategy.

The batch that made me build this

I run content for a B2B automation services company. Between 30 August and 3 September 2026 they published eight Instagram reels with zero ad spend. Here is every one of them.

RankViewsShare of total
120,41549.3%
28,36120.2%
36,49515.7%
44,94711.9%
54011.0%
63190.8%
73120.8%
81730.4%

Total: 41,423 views, 18,732 reach, 9 follows, no ad spend at all. The batch itself is written up separately as a case study; here I only want the shape of the numbers.

Four reels cleared 4,000 views. Four stayed under 500. There is nothing in between: the gap between fourth place and fifth place is 12x. Best to worst is 118x — 20,415 views against 173 — inside one account, one week, one topic area, one person's editing style. I am not going to quote a median, because with the values split into two clumps the midpoint lands in the empty gap and describes no reel that exists.

The top reel alone is 49% of every view the account earned that week.

The caveat first, because it matters more than the finding. Eight posts over five days is far too small to fit a distribution to. I cannot tell you the account's true hit rate from this. I cannot tell you the shape of its tail. What eight posts can do is show me a shape that I then have to model separately and test at volume. Everything below is a worked example built on assumptions I chose, not an estimate of anything.

The same shape, in a channel with nothing in common

If this were only a reels thing I would file it under algorithm quirks. It is not.

My own site, in the 85 days to 3 September 2026, took 22 clicks from 4,553 impressions. That is a 0.48% CTR across roughly 390 indexed URLs, at a US average position of 38.8. When I broke that down, 111 of 182 ranking pages had earned five or fewer impressions in the entire quarter — 61% of everything that ranked at all was doing essentially nothing. I wrote up that teardown in full in 389 pages, 22 clicks, and it is why I cut the published post count from 267 to 103 in September using the content pruning scoring model.

Different channel, different ranking system, different content, same shape: a small head, a long dead tail, and almost nothing in the middle.

Ahrefs found the same thing at a scale I will never reach. In their study of around 14 billion pages, 96.55% get zero traffic from Google and 1.94% get between one and ten monthly visits. Their own caveat is worth repeating: 14 billion is a small slice of the web and skews toward higher-quality content, so the real number is probably worse.

The model

The mechanic is a coin flip followed by a lottery. Each post either gets picked up for distribution or it does not. If it does, its result is drawn from a wide distribution. If it does not, it lands somewhere near zero.

That is two parameters you can actually reason about — hit rate and spread — plus volume, which is the only one you control directly.

Stdlib Python, no dependencies:

"""content_hit_rate.py - how many posts before a month's number means anything.

Mixture model: each post is a coin flip. Heads, the algorithm distributes it and
views come from a wide lognormal. Tails, it dies in the test pool and views come
from a narrow lognormal near zero.
"""
import math
import random
from statistics import median


def month(posts, hit_rate, hit_med, hit_sigma, miss_med, miss_sigma, rng):
    draw = lambda med, sig: rng.lognormvariate(math.log(med), sig)
    return [draw(hit_med, hit_sigma) if rng.random() < hit_rate
            else draw(miss_med, miss_sigma) for _ in range(posts)]


def run(posts, hit_rate=0.5, hit_med=8610, hit_sigma=0.62,
        miss_med=288, miss_sigma=0.31, floor=2000, trials=20000, seed=7):
    """floor = views that count as 'found distribution'. Returns one row."""
    rng = random.Random(seed)
    totals, shares, dry = [], [], 0
    for _ in range(trials):
        m = month(posts, hit_rate, hit_med, hit_sigma, miss_med, miss_sigma, rng)
        totals.append(sum(m))
        shares.append(max(m) / sum(m))
        dry += not any(v >= floor for v in m)
    totals.sort()
    pct = lambda p: totals[int(p * len(totals))]
    return {"posts": posts, "dry": dry / trials, "p10": pct(0.10),
            "p50": pct(0.50), "p90": pct(0.90), "ratio": pct(0.90) / pct(0.10),
            "top_share": median(shares)}


if __name__ == "__main__":
    rows = [run(n) for n in (4, 8, 12, 20, 30, 60)]
    header = ("posts", "dry month", "p10", "median", "p90", "p90/p10", "top post")
    print("%5s %10s %9s %9s %9s %8s %9s" % header)
    for r in rows:
        print(f"{r['posts']:>5} {r['dry']:>9.1%} {r['p10']:>9,.0f} "
              f"{r['p50']:>9,.0f} {r['p90']:>9,.0f} "
              f"{r['ratio']:>8.2f} {r['top_share']:>8.0%}")
    # self-check: more volume => fewer dry months, tighter spread
    assert all(a["dry"] >= b["dry"] for a, b in zip(rows, rows[1:]))
    assert all(a["ratio"] > b["ratio"] for a, b in zip(rows, rows[1:]))

The defaults are eyeballed off those eight reels — hit median 8,610, miss median 288, hit rate 0.5 — which is exactly the fit I just told you not to trust. Change them to your own numbers and rerun. The parameters are the interesting part; my client's are only a starting point.

What the model says about volume

Output, 20,000 simulated months per row:

Posts/monthDry monthp10 totalMedianp90 totalp90/p10Top post's share
46.5%5,37319,18440,3937.52x60%
80.4%19,17940,57669,2073.61x40%
120.0%34,65161,72696,8172.79x30%
200.0%68,284104,790149,4642.19x21%
300.0%112,448158,356211,8751.88x16%
600.0%253,184319,254393,9301.56x9%

The p90/p10 column is the whole post. It is the ratio between a lucky month and an unlucky month when nothing about your process has changed. At four posts a month, a good month is 7.5x a bad month by luck alone. Any explanation you write in that monthly report is fiction. At 30 posts it is 1.9x. That is tight enough to see a doubling, and still not tight enough to see a 40% improvement: run the model paired, same process against a 1.4x process, 30 posts each, and the better month only wins about 83% of the time. A real 40% gain needs a longer window than one month, however many posts you put in it.

How often does a month return nothing at all?

The dry-month column depends heavily on the hit rate you assume, and 50% is generous. This part is close to analytic — one minus the hit rate, raised to the post count. It does not match the simulated column exactly (6.3% against 6.5% at four posts) because the simulation counts a month dry when no post clears a 2,000-view floor, which also catches the small fraction of hits that land underneath it.

Posts/monthHit rate 50%Hit rate 25%Hit rate 10%
46.3%31.6%65.6%
80.4%10.0%43.1%
120.02%3.2%28.2%
200.0001%0.3%12.2%

At a 10% hit rate — plausible for a cold account or a new site — eight posts a month means a 43% chance the month produces nothing at all. Not a bad month. A month with zero results in it. That is the strongest argument for volume I know, and it is arithmetic rather than opinion.

Why per-post optimisation is mostly noise-chasing

Look at the top-post-share column again. At eight posts a month, the median month has one post carrying 40% of the total. That post feels like it taught you something. It did not necessarily teach you anything, because in this model every post was generated by an identical process. The winner won because it was drawn from the right-hand side of a wide distribution.

This is what makes retrospective content analysis so treacherous. You have four winners. You look for what they share. You will find something — four things always share something. With four data points you can support almost any hypothesis you walked in with.

Doing it honestly means holding the variable you think matters constant and shipping enough posts to clear the noise floor. Read the table that way: at 30 posts a month you can detect something like a 2x effect. At eight you cannot reliably detect a 3x effect. That is the same statistical wall you hit trying to attribute a small budget across channels, which I work through in marketing mix modelling on a small budget, and again on the offer side in the expected value of a promo.

The quality floor is not the same as quality optimisation

The obvious misreading of all this is "quality does not matter, just post more." That is wrong, and it is why quality enters this model as the hit rate rather than as the size of the draw. To be clear about what that is: an assumption I am importing, not something the simulation demonstrates — hit rate is a constant I set, so the model can show you the consequences of that belief but cannot test it. A post that is confusing, off-topic or badly made does not get a small draw. It gets no draw at all.

So the lever is a floor, not a ceiling. Is it about something the audience cares about, is it clear in the first three seconds or the first sentence, does it stand alone without context. Meet that floor and ship it. Past the floor, the extra four hours of polish buys you much less than the fifth post you did not make.

Write the floor down as a checklist so it is a pass/fail test rather than a mood. Then hold it, and spend everything left over on volume.

What this does not show, plainly

  • Nothing about buyers. 41,423 views produced 20 likes, 19 saves, 4 shares and 9 follows. That is reach, not resonance, and it is normal for algorithmic reel distribution rather than a defect. A lead magnet ran in the comments and produced direct-message conversations, but nobody counted them, so I will not pretend to.
  • Nothing about who saw it. The top reel's audience was 100% non-followers, 79.2% United States, and 72.4% aged 45 or over — with 29.9% of the total at 65 and above. Owners of clinics and logistics firms sit in that band. So do a great many people who will never buy B2B automation. State the composition and let the reader judge it.
  • Nothing fitted. The lognormal is a modelling convenience, not a claim about reality. The published research does not support a clean power law either: a study of YouTube video popularity reports that the view distribution "does NOT follow a Zipf distribution" and that Weibull and Gamma fits worked better, because the tail decays faster than a pure power law predicts. Use a model like this to size your sample, not to forecast a number.

The one claim I would defend is directional: when outcomes are this skewed, the number of attempts dominates the quality of any individual attempt, and a monthly report built on single-digit post counts is a report about luck.

FAQ

How many posts a month do I need before the numbers mean anything?

In this model, around 20 to 30 before month-over-month comparison stops being dominated by luck — that is where the lucky-to-unlucky ratio drops under about 2x. Below 12, do not draw conclusions from month-over-month movement at all. If 30 is not possible, lengthen the reporting window instead: a quarter of eight-post months is 24 posts and is readable, whereas any single one of those months is not.

Why did some of my posts get 100 times more views than others?

The honest answer is that I am inferring the mechanism from the shape, not reporting it. The eight reels fall into two clumps with an empty gap between them, which is what you would see if distribution were gated rather than gradual — a post either clears some threshold and keeps being shown, or it does not. Platforms do not publish how this works, so treat that as a reading of the data and not as a fact about the algorithm. In this client's batch the gap between fourth and fifth place was 12x with nothing in between, which is the signature of a threshold rather than of gradual variation.

Is a 50% hit rate good?

I have no benchmark I trust for this, so I will not invent one. What I can say is that hit rate matters most at low volume: at four posts a month, moving from a 10% to a 50% hit rate takes your chance of a completely empty month from 66% to 6%. At 20 posts a month, both hit rates produce something almost every month, and the difference shows up in size rather than in presence.

Should I post more or make better posts?

Both, but they are not competing for the same hours. Quality is a pass/fail floor that decides whether a post is eligible to win at all. Volume decides how many eligible attempts you make. Fix the floor once as a checklist, then spend the remaining time on attempts. Polishing a post that already clears the floor is the most expensive time in content.


Not sure whether your content numbers are a result or a coin flip? I will model your actual hit rate and spread, tell you what your current volume can and cannot detect, and show you the maths. Get a content audit or get in touch.

Free resource

Get the AI-SEO Content Checklist

A practical checklist for getting your own content cited by Google AI Overviews, ChatGPT, and Perplexity — not just ranked.

No spam. Unsubscribe anytime.

Browse all free guides →

Run this on your own numbers

Content ROI & Payback Calculator — free, no signup, runs in your browser.

Open the calculator →

Want to implement this with guidance?

Santosh helps founders turn insights like this into real systems.

SEO Content Strategy

External Resources

Further Reading & Tools

Related Posts

01
12 min
PaidMediaContentStrategy
TodayPaid Media

Hook Rate vs Hold Rate: What Actually Moves

Across three video creatives in one Meta ad account, hook rate spanned 1.22x. Hold rate spanned 2.65x as reported, and 2.18x once the hook stage is divided back out. The funnel arithmetic, the counterexample, and a diagnostic table.

Read article
02
11 min
ContentStrategyQuantitativeMarketing
YesterdayContent Strategy

A Content Marketing ROI Model You Can Actually Run

A full payback model for a content programme — cost inputs, ranking probability, traffic and conversion assumptions, plus a sensitivity table and runnable Python. Every input is labelled an assumption.

Read article
03
11 min
SocialMediaContentStrategy
TodayCase Study

8 Reels, 41,423 Views, $0 Spend: The Build Log

Eight reels for a B2B automation services company did 41,423 views and 18,732 reach in five days with no ad spend. Here is the full per-reel distribution, the audience data, and everything the numbers do not prove.

Read article