---
title: "Reading Results Honestly — Campaigns & Strategy"
description: "Four outcomes split on two axes, why published is counted per account rather than per post, and the ten reasons a campaign published nothing."
canonical_url: "https://bolta.ai/university/courses/campaigns-and-strategy/reading-results-honestly"
markdown_url: "https://bolta.ai/university/courses/campaigns-and-strategy/reading-results-honestly.md"
last_updated: "2026-09-10"
content_type: "feature"
publisher: "Bolta"
---

# Reading Results Honestly — Campaigns & Strategy

Source: https://bolta.ai/university/courses/campaigns-and-strategy/reading-results-honestly
Last updated: 2026-09-10

Four outcomes split on two axes, why published is counted per account rather than per post, and the ten reasons a campaign published nothing.

## Summary

Lesson from the Bolta University course "Campaigns & Strategy". The full lesson text follows.

## Who this is for

- Founders
- Creators
- Marketing teams
- Agencies

## Limitations and boundaries

- Course material describes the product and the platforms at the time of writing; verify current behaviour in the app.
- Social network features, limits, and algorithms change independently of Bolta.
- Current prices and plan limits must be verified on the Bolta pricing page.

## 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**.

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

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

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

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

## Relevant links

- [Bolta University](https://bolta.ai/university)
- [Campaigns & Strategy](https://bolta.ai/university/courses/campaigns-and-strategy)
- [Bolta pricing](https://bolta.ai/pricing)
