Reading Results Honestly

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

Lesson 1: Four Outcomes, Two Axes

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.

OutcomeWindowPublishedMeans
No results yetOpenNothingEarly, not empty
In progressOpenSomethingWorking; more may follow
PublishedClosedSomethingTerminal, and it worked
Published nothingClosedNothingTerminal, 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.

Lesson 2: What Counts as Published

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.

Both membership edges, always

A post reaches a campaign two ways:

  1. Attached by a person — you added an existing post to the campaign.
  2. Produced by a run — the run stamps its artifacts when it creates them.

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.

Lesson 3: The Ten Empty Reasons

"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.

ReasonWhat actually happenedWhat to do
No accounts connectedNothing could have publishedConnect an account
Runs failedRuns were attributed and every one failedRead the last error on the campaign
Not startedNothing has run yetActivate it, or check the start date
Nothing generatedRuns dispatched and produced no draftsCheck the plan and the last error
Quality blockedDrafts exist; the quality gate held themReview and edit them by hand
Publishing failedEvery publish attempt failedReconnect the account — usually a dead token
Awaiting approvalDrafts are waiting on a personGo to the Approve queue
Nothing approvedDrafts were seen and none approvedDecide on them, or fix the angle
Not sent yetApproved and queued; the slot has not arrivedWait, or check the scheduled time
UnknownPosts exist in states none of the above describeOpen 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.

Lesson 4: Reading the Run History

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.

How to read a campaign in thirty seconds

  1. The outcome line. One sentence, at the top, before you scroll. If a page makes you scroll to find out whether it worked, the page has failed at its only job.
  2. The phase badge. What it is doing right now, as distinct from what you set it to.
  3. The run block. How many runs, how many failed, and the last error if there is one.
  4. The timeline. Posts oldest first — a plan unfolding, not a feed. This is where you see whether the content actually matches the angle.
  5. Results. The counts, and the empty reason if there is one.

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.

Lesson 5: What a Campaign Can and Cannot Tell You

Being clear about the limits keeps you from over-reading a small number.

It can tell you:

  • How many pieces were planned, generated, approved and published.
  • Which accounts they went to, and which failed.
  • Where the pipeline stopped, if it stopped.
  • Which runs succeeded and which failed.
  • How the campaign's posts performed, using the same engagement data every other analytics surface reads.

It cannot tell you:

  • Whether the angle was the reason something worked. One campaign is one sample, and everything else about your account was also changing.
  • Attribution to revenue, unless you are tracking your CTA link yourself.
  • What would have happened with a different angle.

Reading a result like an adult

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.

What to take away

  • Four outcomes, because "early" and "over and empty" are different facts.
  • Published is counted per account, so partial publishes are counted honestly.
  • Ten empty reasons, ordered by where the pipeline stopped; the earliest provable blocker is reported.
  • Awaiting approval is the modal answer. The bottleneck is usually review, not generation.