Mailshake campaign scorecard with reply and bounce breakdowns

Rank every cold email campaign side by side, see which follow up step actually earns replies, and pause bad sends before they burn your list.

App
MailshakeGoogle SheetsSalesMarketingAI ReportsResearch & Monitoring
PromptCreate

Build me an app that gives me the cold email campaign reporting Mailshake itself does not, so I can see which outreach actually works before I put more money and list behind it. I run outbound and I open this app to compare campaigns, find the weak step in a sequence, and catch a send that is going badly.

Landing view. A table of every campaign from Mailshake List Campaigns, one row per campaign. Columns: campaign name, status, total sends, opens, open rate, clicks, click rate, genuine replies, reply rate, bounce share, and auto reply share. Compute these by pulling List Sent Activity, List Opens Activity, List Clicks Activity, and List Replies Activity and grouping the events by campaign. Every column must be sortable so I can rank campaigns against each other, which is the whole point of the view. Default the sort to genuine reply rate descending, and make the deliverability flag visible right in the table so a bad campaign stands out without me clicking in.

Critical data rule, get this right or every number in the app is wrong. List Replies Activity returns bounces and auto replies in the same feed as real human replies. Classify every reply event into one of three buckets before computing anything: genuine reply, bounce, or auto reply. Use whatever type or category field the API returns on the event first, and fall back to subject and body heuristics for the rest, such as out of office, automatic reply, autoreply, undeliverable, delivery status notification, mailer-daemon, and returning on a date. Reply rate must always be genuine replies over sends. Never show a reply rate computed from the raw feed. Keep bounces and auto replies as their own visible columns, because those are exactly what the deliverability panel is watching.

History and trends. The Mailshake API exposes no historical aggregates, so do not try to fetch history from it. Instead, snapshot totals into the app's own storage: once per day, write a dated row per campaign and per sequence step capturing sends, opens, clicks, genuine replies, bounces, and auto replies. Draw trend lines from those accumulated snapshots. Make clear in the UI that trend history begins when the app starts running rather than being backfilled, so an empty trend chart on day one does not read as a bug.

Fetching and caching. The activity endpoints paginate with a nextToken and a perPage that maxes at 100, so handlers must follow nextToken until it comes back null or they will silently report partial numbers. Mailshake meters an hourly unit quota per endpoint, so cache computed aggregates in app storage and refresh on an explicit user action or the daily snapshot rather than refetching the full activity history on every render. Show the user when the data was last refreshed.

Campaign detail view. Clicking a campaign row opens a detail view. Call Get Campaign to pull the full message sequence, then break results down step by step. For each message in the sequence show sends, opens, clicks, genuine replies, reply rate, and that step's share of the campaign's total replies, by mapping each activity event back to its sequence step using the message identifier carried on the event. The job of this view is to answer one question: which follow up in the sequence is actually earning replies versus just burning list. Make that visually obvious, for example by calling out a step that carries a large share of sends while producing almost no replies. Show the actual subject line and copy of each step alongside its numbers so I can read the message and its performance together.

Deliverability panel. On the detail view, a panel showing bounce share and auto reply share against a threshold I set myself, stored per user in app storage, defaulting to three percent bounce share. Flag the campaign when it crosses the threshold and say plainly what crossed and by how much. Put a Pause Campaign button right there in the panel, wired to Mailshake Pause Campaign, with a confirmation step since it stops sending immediately. After pausing, reflect the new paused status in both the detail view and the landing table. This matters because email accounts can disconnect mid campaign and sequences stall without notification, so I need to catch a bad send and stop it in one place.

Diagnose this campaign. A button on the detail view that kicks off a background agent embedded in the app. The agent receives the sequence copy from Get Campaign together with the per step numbers the app already computed, reads the two against each other, and writes a plain language recommendations brief back into the app. The brief should say which step to rewrite or cut and why, point at what the copy is doing wrong in concrete terms rather than generic advice, and give a short read on deliverability risk. Store each brief in app storage against the campaign with a timestamp and render it in the detail view. Keep prior briefs so I can see how a campaign changed after I acted on advice. Show a clear running state while the agent works and a completed state when the brief lands.

Add to scorecard. An action on the campaign detail view that appends the campaign's current numbers as a single row to a Google Sheet using Google Sheets Append Values, so the team keeps its weekly and quarterly reporting history in one place. The row should carry the date, campaign name, status, sends, opens, open rate, clicks, click rate, genuine replies, reply rate, bounces, bounce share, and auto reply share. Let me configure the target spreadsheet and tab name in an app settings area, stored in app storage, and confirm visibly when the row has been appended.

Design notes. The audience is a founder or outbound lead reviewing campaigns before scaling spend, so the landing table should be dense and scannable rather than airy. Right align numbers, show rates as percentages with one decimal, and use semantic colors for deliverability flags so red genuinely means stop. Everything in the app is read only against Mailshake except the pause action and the scorecard append, so those two should be the only places with a confirmation step.

What does this prompt do?

  • Puts every cold email campaign in one sortable table with sends, opens, clicks, real replies, and bounce share, so you can rank campaigns against each other instead of opening them one at a time.
  • Breaks each campaign down step by step so you can see which follow up in the sequence is earning replies and which one is just burning through your list.
  • Separates genuine human replies from bounces and auto responders before any reply rate is shown, so the numbers you act on are the real ones.
  • Flags campaigns whose bounce and auto reply share crosses your threshold and gives you a pause button right there, plus a one click agent that reads your sequence copy against the numbers and writes back plain language advice on what to rewrite or cut.

What do I need to use this?

  • A Mailshake account you can create an API key in, found under Extensions and API in your account settings
  • At least one campaign with some sending history, since the app reports on activity that has already happened
  • A Google account and a spreadsheet, only if you want to use the scorecard export for weekly and quarterly reporting

How can I customize it?

  • Set your own bounce and auto reply thresholds for when a campaign gets flagged as a deliverability risk, the default is a three percent bounce share
  • Change the default sort on the landing table, for example rank by reply rate to find winners or by bounce share to find problems first
  • Point the scorecard export at whichever spreadsheet and tab your team already uses for reporting, and adjust which numbers get written into each row
  • Tell the diagnose agent what to weight most, such as subject lines, sequence length, or send volume per step

FAQs

How is this different from the reporting already inside Mailshake?
Mailshake shows you campaign totals with fairly basic filters. This app ranks all your campaigns side by side in one sortable table, then breaks each one down by individual sequence step so you can see which specific follow up email is producing replies. It also computes a real reply rate by removing bounces and auto responders, keeps its own history so you get trend lines, and adds a pause control and an AI recommendations brief.
How does it tell a real reply from a bounce or an out of office?
Mailshake returns bounces, auto responders, and genuine human replies together in the same activity feed. The app sorts each one into its own bucket before it calculates anything, so your reply rate reflects actual humans writing back. Bounces and auto replies still get their own columns, since those are exactly what the deliverability panel watches.
Can I see how a campaign is trending over time?
Yes. Mailshake does not hand out historical totals, so the app takes a daily snapshot of every campaign's numbers and stores them itself. Trend lines build up from the day you start using the app rather than being backfilled, so give it a week or two before the trends get interesting.
Can I actually stop a campaign from inside the app?
Yes. Every campaign detail view has a pause button next to the deliverability panel, so when you spot a campaign bouncing hard you can stop the send immediately without switching over to Mailshake. This matters because email accounts can quietly disconnect mid campaign and you want to catch a bad send fast.
Do I need a Google Sheet to use this?
No, the sheet is optional. The app works fully on its own. If your team already keeps weekly or quarterly reporting in a spreadsheet, the add to scorecard button appends a campaign's current numbers as a new row so that history lives where everyone already looks.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App
LinkedIn Ads budget pacing dashboard for every client account

See every LinkedIn ad account's spend against the budget you committed to, catch overspend early, and rebalance without rebuilding a spreadsheet.

LinkedIn Ads
Google Sheets
Slack Bot
App

Stop scaling cold email you cannot actually measure.

Get campaign and step level reporting Mailshake does not give you, with real reply rates and a pause button for bad sends.