Automation · 12 steps
Cold email reply analysis: positive reply rate and the copy behind every reply
Every campaign's numbers and every reply go in. The positive reply rate, what changed since last time, and the lines of copy behind the replies come out.
Built by Matt Cruz, Modern Code Consulting
The problem
A sending tool counts replies but it does not read them. Automatic replies inflate the count, and a reply the tool scores as negative can be the lead that books a call.
The bigger miss is the copy. When a pattern shows up in the replies (a merge field that read wrong, a question about price the email never answered) nobody ties it back to the exact line that caused it.
What I built
I built this review to read every reply in full. Two Python scripts pull the campaign numbers and the live copy from Instantly, net out automatic replies and work out what changed since the last snapshot.
A Claude Code skill classifies each reply, works out the positive reply rate against a 1% line and sets each reply pattern beside the live line of copy behind it, with a suggested tweak. It does not change the live campaign.
How it works, step by step
A Claude Code skill reads the replies and writes the review. Two Python scripts pull the numbers and the live copy.
Stage 1 · Pull from Instantly
Pull campaigns, steps, replies
SubstitutedAsks Instantly for every campaign's totals, the per-email and per-variant rows, and every email received in reply.
Instantly API
Stage 2 · Clean the numbers
Net out automatic replies
RanBuilds one row per campaign: unique replies minus automatic ones, leads actually emailed, bounce rate and status.
instantly_retro.py
Compare with the last snapshot
RanLoads the newest snapshot dated before today and works out what moved since: emails, real replies, opportunities and bounces.
instantly_retro.py
Split by variant, strip quotes
RanSplits each campaign by email and variant, drops Instantly's junk rows, cuts the quoted original out of each reply and writes the two files.
instantly_retro.py
Stage 3 · Read every reply
Read and classify every reply
RanReads all 30 messages in full and records, for each: which email it answers, any mistake that cost credibility, what it says about the offer, and its class.
cold-email-retro skill
Compute the positive reply rate
RanWorks out reply rate, positive reply rate against the 1% line, first-email sends and positives per variant, and automatic replies per 1,000 emails before and after the last snapshot.
cold-email-retro skill
Stage 4 · Check the live copy
Pull the live copy per variant
SubstitutedReads each campaign's sequence and prints every variant as plain text with its merge variables, so findings can point at the live wording.
instantly_campaign.py
Tie reply patterns to the copy
RanSets each pattern from the replies beside the live line that caused it, and writes a tweak for each without changing anything.
cold-email-retro skill
Stage 5 · Confirm, log, report
Confirm calls and closes
SubstitutedAsks the owner for the three numbers Instantly cannot know: sales calls booked, closes and revenue from cold email.
The owner
Log the snapshot to the tracker
Not runAppends one row per campaign to the tracker's ColdEmail tab, once per snapshot date.
Google Sheets
Draft the community post
Not runReads the owner's last retro post, audits the tweaks it promised, and drafts the next post in the owner's own voice for them to paste.
cold-email-retro skill
Report numbers and tweaks
RanHands the owner the numbers, the reply patterns, the recommended tweaks, the two counts that disagree, and what was not done.
cold-email-retro skill
The recorded run
This is a real run of the automation on an invented business: a payroll service for restaurant groups. Use the tabs inside it to move between the overview, how it's built, the step-by-step run and the result.
What ran for real: Invented sender, campaigns, replies, copy and earlier snapshot. Instantly and Google Sheets were never called: the pull and the live copy are invented responses read by the real, unmodified scripts, the owner's answer was written in beforehand, and the sheet log and community post were left out. The parsing, deltas and quote stripping are the real instantly_retro.py run through its own main function; the reading, the rates and the findings were done in a Claude Code session following the skill.
The run is laid out for a desktop screen.
More automations
- Verified lead list, catch-alls held backA saved people search goes in and a deduplicated, verified, import-ready lead file comes out, with every catch-all address held back.
- Personalising a cold email listA messy scraped lead list goes in and a send-ready list comes out, with a natural first name, a company name a person would say and a one-line opener on every row.
- Paid deposit to project kickoffA client pays the deposit, the deal closes, a dated project plan is built and a kickoff document is ready, with no hand on the CRM.
- Keeping a long multi-agent build on trackA project board goes in, and any fresh session can pick the build up from one file and one board read.
Want something like this running in your business?
Book a free 15-minute call. Tell me where the hours and the leads are leaking, and I'll tell you what I'd automate first and what it would cost.
Book a free automation audit