Four outcomes split on two axes, why published is counted per account rather than per post, and the ten reasons a campaign published nothing.
Jump to module
A campaign's result is one of four states, split on two questions most tools conflate: has anything been published, and can anything still be.
| Outcome | Window | Published | Means |
|---|---|---|---|
| No results yet | Open | Nothing | Early, not empty |
| In progress | Open | Something | Working; more may follow |
| Published | Closed | Something | Terminal, and it worked |
| Published nothing | Closed | Nothing | Terminal, and it produced no reach |
"No results yet" and "published nothing" are genuinely different facts. Collapsing them into a single empty state either panics somebody on day one or quietly reassures somebody whose campaign is already over.
Every number in this section is derived on read. There is no results table, no rollup column, no cache. A campaign's figures are a projection of the same posts and publication records every other screen reports from, and the moment they are copied anywhere they begin disagreeing with the source.
This is subtler than it looks, and getting it wrong is the classic reporting bug.
A post is one record fanned out to many accounts. When one account succeeds and another fails, the post as a whole is marked partially published. Under the naive rule — "count posts whose status is Published" — that post counts as zero. A business with a single dead token gets told a campaign that genuinely went out published nothing.
So campaign results count from per-account publication records, not from the post's own status. Rows are the truth. The post's status is only a fallback for posts that have no rows at all, and it never overrides rows that exist.
The inverse mistake is guarded too: a post stamped Published whose every account record failed counts as failed, not published.
A post reaches a campaign two ways:
Results count both. Counting only one would produce a page that lists posts in the timeline above a sentence claiming nothing is attributed to the campaign — and a page that contradicts itself once is a page you stop believing entirely.
One more consequence: a post may legitimately belong to two campaigns — an evergreen explainer can serve a spring launch and an autumn one. So per-campaign numbers do not add up to the workspace total, and no screen presents their sum as one. The workspace rollup is derived over the union of the posts, not by summing the campaigns.
"Published nothing" on its own is not an explanation. Whether you never connected an account, whether every run failed, whether the quality gate held the drafts, or whether they are simply sitting unapproved are four different sentences with four different next actions.
So the cause is derived as data. The reasons are ordered by where the pipeline stopped, and the first provable blocker is the one reported — because the earliest stop is the one worth fixing.
| Reason | What actually happened | What to do |
|---|---|---|
| No accounts connected | Nothing could have published | Connect an account |
| Runs failed | Runs were attributed and every one failed | Read the last error on the campaign |
| Not started | Nothing has run yet | Activate it, or check the start date |
| Nothing generated | Runs dispatched and produced no drafts | Check the plan and the last error |
| Quality blocked | Drafts exist; the quality gate held them | Review and edit them by hand |
| Publishing failed | Every publish attempt failed | Reconnect the account — usually a dead token |
| Awaiting approval | Drafts are waiting on a person | Go to the Approve queue |
| Nothing approved | Drafts were seen and none approved | Decide on them, or fix the angle |
| Not sent yet | Approved and queued; the slot has not arrived | Wait, or check the scheduled time |
| Unknown | Posts exist in states none of the above describe | Open the timeline |
Awaiting approval is the most common answer, and it is the one you can act on immediately. A campaign that generated well and published nothing is usually a campaign whose drafts nobody read.
"Runs failed" deserves a note, because a run can fail in two quite different ways: it can fail to start at all, or it can start and then die partway through. Both are recorded, and both are reported as failures — so a run that got underway and then broke is shown as a failed run, not as a run that never happened.
The campaign detail page shows run history, and it refreshes itself while a run is in flight. What it shows is derived from the server every time rather than remembered from the message you saw when you activated the campaign — which is what lets it correct itself. A run that looks healthy at dispatch and fails two minutes later changes the page while you are on it.
The one thing held locally is a dispatch refusal: a refusal creates no run record at all, so it has nowhere else to live and stays on screen while you read it.
If steps 1 and 5 disagree with your impression of the campaign, trust the page: the numbers came from publication records, and impressions come from the two posts you happened to see.
Being clear about the limits keeps you from over-reading a small number.
It can tell you:
It cannot tell you:
Judge process before outcome. A campaign that generated everything it planned and published everything you approved worked as a campaign, even if engagement was flat. A campaign that published two of twelve pieces did not, even if those two did well.
Compare like with like. If you want to test angles, hold everything else still: same duration, similar mix, same accounts. Change the angle and nothing else. Two campaigns that differ in four ways teach you nothing about any of them.
Give an angle two runs before retiring it. The first run of any angle is also the run where your context was thinnest.
Watch the decision rate, not just the publish count. Of the drafts generated, what fraction did you actually decide on? That number predicts your next campaign better than any engagement figure — because the queue is where campaigns die.