Cold email campaign reporting: find what actually books meetings
WORKSHOP

On one real account, the campaign list showed nine campaigns and the reporting data showed 14. Archived campaigns keep their history in reporting and vanish from the list, so a report built from the list quietly loses them, along with their bounces.
That is the problem with most cold email reporting. The numbers are easy to pull and easy to get wrong. One-off emails inflate reply rates, summary bounce counts disagree with the contacts, and a campaign that looks dead is often waiting for someone to approve it. Each mistake leads to the wrong call on a campaign: scaling one that is hurting your domain, or killing one that never sent.
What it does
The prompt builds the report in one pass. It groups sends by campaign, breaks each live campaign down by step and variant, checks the mailboxes, looks at who replies, counts meetings and opportunities, cross-checks the totals, and sorts replies by category. You get one table with a scale, fix, or stop call per campaign, then the step where replies stop, the variant ahead, the worst mailbox, and one action for each live campaign. Connected to your platform it pulls the numbers itself, read-only. Without a connection it tells you exactly what to export.
What it catches
One-off emails in your reply rate. Grouped by month, one account showed 30 sent and 19 replied, because replies to emails sent outside any campaign were counted. Filter to campaigns or you will eventually report a reply rate above 100%.
Bounce counts that are not bounces. One archived campaign showed 40 sent, 34 delivered, and six bounced in reporting, while its contacts showed zero bounced. The six was sent minus delivered.
Mailbox limits read from the wrong place. Reporting showed a daily limit of 775 for a mailbox set to 25. Read limits from the mailbox settings.
One bad metric wiping the report. Asking for opportunities grouped by campaign returned a warning and no table at all. Outcome metrics go in a separate request.
Opens as a result. Cold campaigns should run with open tracking off, so open counts mean nothing.
Small samples called as winners. One reply to zero on one send each has told you nothing, so every rate carries its send count.
Replies mistaken for positive replies. The reply rate includes unsubscribes and "not interested".
A quiet campaign that is really an account problem. Contacts enrolled and nothing scheduled usually means emails waiting for approval, not poor performance.
How to use it
Pick whichever route fits your setup.
Paste it into a chat. Copy the prompt below into ChatGPT, Claude, or any other assistant and bring the exports it asks for.
Add it to a Claude Project. Upload it as a Project file. Connect Apollo and it pulls the reporting data and builds the report itself: the Claude setup guide.
The prompt
Copy the whole prompt below, from the first line to the last.
You are building a report on my cold email campaigns that tells me which campaign, which step, which variant, and which mailbox is actually producing replies and meetings, laid out so I can decide for each one: scale it, fix it, or stop it. Do it in one pass and hand me the report.
If my sending platform is connected as a tool, pull the numbers yourself. The report is read-only: count meetings and opportunities, never create, move, or edit anything. If nothing is connected, tell me exactly which numbers to export and how to group them, and build the report from what I bring back.
You advise and I decide. If a number points to a deliverability problem, say so plainly.
Build it in this order.
Start from the reporting data, not the campaign list. Group sends by campaign over the reporting window. On one real account the campaign list showed nine campaigns while reporting showed 14, one with 40 sends. Archived campaigns keep their history in reporting and disappear from the list, so a report built from the list silently loses them. For each campaign get sent, delivered, replied, bounced, unsubscribed, contacts emailed, and contacts replied.
Break each live campaign down by step and by variant. By step shows where the thread goes quiet. By variant shows which version is ahead. Use readable labels ("Step 1a", "Step 1b") for anything a person reads, not ids.
Check the mailboxes. Sent and bounced per mailbox. Read each mailbox's allowed daily limit from its settings, not from a reporting metric: on one platform, reporting showed a limit of 775 for a mailbox set to 25. A mailbox carrying the bounces is a deliverability problem that looks like a copy problem.
See who responds. Replies by seniority or title. Filter to the campaigns in question, or one-off emails get counted (see below).
Count outcomes. Meetings booked and opportunities created, grouped by month or by user. One platform could not group opportunities by campaign at all.
Cross-check before anyone sees a number. Take the busiest campaign and compare the reporting totals with the counts shown on the campaign itself. They should match. On one real account they matched exactly: 2 sent, 2 delivered, 2 opened, 1 replied. If they do not, say so in the report rather than picking one.
Read reply quality. Count replies by category if the platform classifies them (willing to meet, follow-up question, referral to someone else, not interested, unsubscribe). On one account the largest group had no category at all. Use it to sort, then judge which replies are positive.
Traps, all hit on a real account. - An incompatible metric can wipe the whole report. Asking for opportunities grouped by campaign returned a warning and no table at all, not a table with one column missing. Request outcome metrics in a separate call. - One-off emails inflate replies when you group by time or by person. Grouped by month, one account showed 30 sent and 19 replied, because replies to individual emails sent outside any campaign were counted. Grouped by campaign they dropped out. Filter to campaigns whenever the question is about campaigns, or you will eventually report a reply rate above 100%. - A summary bounce count may not be the real bounce count. On one archived campaign, reporting showed 40 sent, 34 delivered, and 6 bounced, while the contacts in the campaign showed 0 bounced. The six was simply sent minus delivered. Take bounces from the contact-level statuses, and say which source you used. - Report data may come back as text, not structured data. One platform returned its report as a table inside a text field. Parse the rows; do not assume a data array. - Opens are not a signal. Cold campaigns should run with open tracking off, so open counts are empty or meaningless. Do not report them as a result. - Small numbers are not results. A variant that won one reply to zero on one send each has told you nothing. Put the send count next to every rate, and do not call a winner on a handful of sends. - Replies are not positive replies. The reply rate includes unsubscribes and "not interested". Never present it as the outcome. - A quiet report is not always a quiet campaign. If a live campaign has contacts enrolled and nothing scheduled, that is an account problem, often emails waiting for approval, not a performance result. Flag it separately.
What to hand me at the end:
A table with one row per campaign: campaign, sent, bounce %, reply %, positive reply %, meetings this month, and your call (scale, fix, or stop). Put the send count beside every rate.
Then, for each live campaign: the step where replies stop, the variant ahead with its send count, the mailbox bouncing most, and one recommended action.
End with anything that did not reconcile in the cross-check, and which source you used for bounces.
Method adapted from the campaign reporting guide in Apollo Operator, a free, open-source headless GTM toolkit by Creatop: github.com/creatop-gtm/apollo-operator
Part of the Apollo Operator prompt pack
This is one of 19 free prompts from Apollo Operator, the open-source headless GTM toolkit Creatop builds and runs on its own campaigns. Get the full pack here: the Apollo Operator prompt pack.






