Mailshake campaign scorecard with reply and bounce breakdowns

By General Input

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.

Integrations

  • Mailshake
  • Google Sheets

Type

App

Categories

  • Sales
  • Marketing

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads