Short answer: collect the same results for every post in the campaign, compare each account with its own baseline instead of comparing platforms with each other, mark missing numbers as unknown, act only on patterns that repeat across enough posts, and write down one or two changes for the next campaign. Automate the collection and the first read. Keep the decision about what to change with the person who owns the campaign.
The rest of this guide walks through each step, then shows how to run it in Daoco.
Start with the question the report has to answer
A campaign report exists to change the next campaign. If nobody will do anything differently after reading it, you have a scoreboard.
Before you pull a single number, write down what the campaign was for and what you would change depending on how it went. For a small team the levers are usually channels, formats, hooks, post length, and timing. Your report should say something about at least one of them.
Also write down the dates, accounts, and posts that count as the campaign. Reports drift when the scope moves between runs. If last month's report covered six weeks and two accounts and this month's covers four weeks and three accounts, the comparison means very little.
Step 1: Gather the results
For each published post in the campaign, collect:
- Platform and account
- Publish date and time
- Format, such as single image, carousel, video, thread, or text post
- Hook, meaning the opening line or first frame
- Length
- Views or reach, whichever the platform shares
- Likes, comments, and shares
- Engagement rate, with a note on how it was calculated
Then add the context the numbers will not show you: the brief, the objective, decisions made mid-campaign, and anything that changed partway through, such as a moved launch date or a dropped channel. Without those notes, you will read a schedule change as a performance change.
Keep imported posts in their own group. Posts imported from a platform can carry different metric coverage than posts published through your own workflow, and mixing the two hides the gap.
Step 2: Handle missing and differently defined metrics
Each platform counts views and interactions by its own rules, and some share views while others share less. Engagement rate inherits all of that, so a raw rate from one platform does not line up with a raw rate from another. Three rules keep the report honest.
Compare each account with itself. Work out each account's median engagement rate for the campaign, then judge every post against its own account's median. A post far above its account's median is a strong post on that platform. You cannot say the same about a LinkedIn post that "beat" an Instagram post on raw rate.
Treat a missing number as unknown. If a platform did not return views for a post, that post's engagement rate is unknown. It is not zero. Leave it out of the median and say in the report how many posts had no visibility data.
State the basis for every rate. Write next to each account how its rate was calculated, for example interactions divided by views. Use views where the platform shares them. This guide does not use follower count, because it does not tell you how many people saw a given post.
Before you call a number missing, check timing and permissions. Some metrics arrive late or refresh on a delay, and some need extra account permissions. In Daoco, Threads insights and expanded YouTube analytics are two examples. Refresh the data, reconnect older connections if needed, and only then record the gap.
Step 3: Find a pattern worth acting on
A single standout post is an event. A pattern is the same difference showing up again and again.
Group the posts by one variable at a time: format, hook style, length, or publishing time. For each group, look at how its posts did against their own account medians. Then test anything that looks interesting:
- Sample size. Treat fewer than three measured posts as a small sample and label it that way. Three is a floor, not proof.
- Account coverage. A pattern that holds on two accounts, each judged against its own median, is stronger than one that shows up on a single account.
- Context. If the strong group all went out in launch week, the launch may explain it better than the format does. Check your notes.
Label each finding by evidence strength in the report. A finding drawn from many posts on two accounts can shape the next brief. A finding from three posts on one account is a lead for the next test.
When you compare with an earlier report, compare like with like: same platform, same account, same lookback window, and the same number of posts. Otherwise the change you see may come from the scope and not from the work.
Step 4: Write the report
Keep it short enough to read before the next planning meeting. This order works:
- What the campaign was for, its dates, and which accounts it covered
- Coverage: posts read per account, and which numbers were missing and why
- Each account's median engagement rate, how it was calculated, and the top and bottom posts against it
- Patterns, each with the number of posts behind it and an evidence label
- One or two proposed changes for the next campaign, each tied to a finding
- Open questions the data could not answer
Leave the why as a proposal. A report can say short hooks did better on two accounts. It cannot know that the audience prefers short hooks. Whoever owns the campaign decides which explanation to believe.
Step 5: Decide what to change, and keep that decision human
Collecting, calculating, grouping, and drafting the first read follow rules you write down once. Hand those to software.
The decision to change the next campaign stays with a person. That covers dropping or adding a channel, changing the brief or objective, moving the posting schedule, and anything that reaches customers or spends money. Software can rank the options and show the evidence behind each. The campaign owner picks one, writes it into the next brief, and says why.
Change one or two things per campaign. If you change the format, the hooks, the channel mix, and the timing at once, next month's report cannot tell you which change mattered.
How to run this in Daoco
Daoco keeps the campaign, its posts, and their results in one workspace, so each step above maps to something you can open.
Set up the campaign so the report has a scope. Open Campaigns from the sidebar, or type /campaigns in brand chat. In the campaign's Overview, add the brief and objective and set the dates. Link every post that belongs to the campaign. Campaign analytics combine the performance of linked posts, so an unlinked post will not show up in the campaign view. The Campaigns docs cover each view.
Record context in campaign Notes. Each campaign has one shared Markdown document that you and Daoco both read and write. Put the decisions that matter near the top, since specialists working on the campaign receive the start of the notes rather than the whole document. If you ask Daoco to update the notes, tell it to read them first, because an update replaces the whole document.
Open the results. For one post, open the calendar on Home, hover the published post, and open its analytics. You will see the metrics the platform shares, such as likes, comments, shares, reach, views, engagement rate, and per-platform breakdowns. For the whole campaign, open the campaign's Analytics view. Use Refresh when you want Daoco to request the latest available metrics from each platform.
Ask for the first read. In brand chat, ask "What's working in my recent posts?" Daoco builds a content analysis report with platform coverage, top and bottom posts, and patterns by format, hook, length, and publishing time. You can narrow it to one platform, one connected account, or a lookback window. The report uses the visibility metric each platform provides, treats missing visibility as an unknown rate rather than zero, labels findings from fewer than three measured posts as small samples, and compares against the previous report with the same platform, account, lookback window, and post limit. The post analytics docs list what each connection can read.
Check for gaps. Without the extra permissions mentioned in Step 2, the report names the missing data or uses what the existing connection can read. If a platform returns an error, Daoco keeps the last successful snapshot when it has one.
Write the decision into the next campaign. Ask follow-up questions in brand chat or the analytics panel, such as what underperformed and what to try next. Then you decide. Record the change you chose and the finding behind it near the top of the next campaign's Notes and in its Overview. Activating a campaign, scheduling, and publishing keep their existing approvals, including when you ask for them in chat.
To try the comparison before you set up a workspace, the free social account report connects up to three accounts, one per platform, compares each with its own median, and lists the patterns that hold on more than one account with the sample size behind each. For the planning and production side of the same loop, see the guide to an AI content workflow.
Checklist
- Campaign scope written down: purpose, dates, accounts, posts
- Every post has platform, date, format, hook, length, and its numbers
- Each account judged against its own median, with the rate basis stated
- Missing numbers marked unknown and counted
- Each pattern shows its sample size, account coverage, and evidence label
- Comparisons to past reports use the same scope
- One or two changes chosen by the campaign owner and written into the next brief