Cold Email With A.I. – From 7% to 30% Open Rates

My first two B2B cold email campaigns started with a lacklustre 7% open rate. That’s when I cold emailed one tenth of the legal industry in Singapore in a totally sloppy manner. Today we’re doing a 25 to 30% open rate through this cold email outreach workflow.

Wake up to emails like this!

Increased response rates lead to more leads. To get higher open rates, you need better email deliverability and personalisation.

The problem? If you’re looking at 600 email contacts, it’s going to take a while with all the manual research, analysis and crafting of emails.

Not to fret. Today, with simple agentic A.I.s launched with a basic Python code editor and free LLMs available, emailing 600 contacts in a personalised manner is no longer a mountainous task!

The Unsung Hero of Launching Agentic A.I.s

Needless to say, personalised outreach gets more conversations, but the difficult part is personalising your emails at scale.

Yet, today with A.I. and a couple of automation tools, you’re able to achieve this with greater ease.

Here’s the system I built to personalise cold email outreach for B2B lead generation at scale.

The Problem With Manual Cold Email Prospecting

Let’s take the example that you want to reach 300 small law firms that have a total firm size of fewer than 5 lawyers.

I believe this is my target market, as smaller outfits would be more amenable to lean marketing strategies such as Meta ads.

Here’s the hassle. For each data point (law firm name), you’ll need to:

  • Find the right contacts (managing partners and directors of the firm)
  • Research their individual profiles
  • Research their practice areas
  • Write a customised opening paragraph (I call this the icebreaker) and body of the email
  • Send the email
  • Follow up multiple times

Imagine doing this manually… you may be burned out before you hit 30 email contacts.

You could hire a VA to do this for you, costing you time and money. They may also not do a great job.

Today, as every other small business owner is being outreached to in their email inbox, I believe generic templated emails don’t work.

So… the sweet spot? Use A.I. to handle research, some simple decision making and personalise parts of the email crafting while maintaining some human input for quality control.

The Cold Email Tools Involved

The better part? You don’t need expensive software to get started.

Here’s my stack:

Tool Purpose Cost
Mailshake Cold email platform, sequences, deliverability Paid
Groq API LLMs for research, simple decision making and generating icebreakers Free/Paid Tier
Gemini API LLMs for research, simple decision making and generating icebreakers Free/Paid Tier
Python + IDLE Scripts for scraping and automation Free
Apify API for Google results and web scraping Free/Paid Tier
Claude Great for creating Python scripts and help with generating icebreakers Free/Paid Tier

You can interchange Claude with ChatGPT, Gemini, Grok or any of the other LLMs out there. I chose Claude because it’s the most intuitive thus far. There are also other cold email platforms like Lemlist with other features.

I figured that the first principle of deliverability isn’t the outreach sender you use, but how well you are able to avoid spam filters, use Spintax at the right places and craft custom icebreakers so that the entire sequence doesn’t look robotic or automated.

How to Set Up a Cold Email Campaign With A.I. (Step by Step)

Key Concept: You Don’t Need to Know How to Code, But You Need to Know How to Prompt

I don’t even know how to code. I use IDLE as my Python editor. Nothing fancy. The scripts? I built them by talking to Claude.

Here’s the approach:

Tell the LLM exactly what you want in plain English. Remember to be logical and descriptive:

“I have an Excel file (abc.xlsx) with Singaporean law firm names and website URLs. Write a Python script that does the following:

  1. Read the Excel file and loop through each firm’s URL.
  2. Scrape each website’s navigation menu selectors (e.g. nav, header links) to get a list of internal page URLs.
  3. Pass the list of navigation links to an LLM to identify which URL is most likely the team or lawyer profile page.
  4. Scrape that identified page and extract individual lawyer profiles including names, titles, and bios.
  5. Pass the extracted profiles to the LLM to categorise each lawyer by seniority: Partner, Director, Senior Associate, Associate, or Paralegal.
  6. Count the total number of lawyers per firm.
  7. Output everything to a new Excel file with columns for firm name, website URL, total lawyer count, lawyer names, and their seniority levels.

Use the Groq API for all LLM calls. Handle scraping errors gracefully so if a site fails or has no identifiable team page, the script logs the error and continues to the next firm.”

You may not get working code on the first try. However, with some back and forth you’ll have something functional.

There’s no one size fits all prompt. You have to communicate with the LLM iteratively. Then ask it to fix errors. Tell it what’s not working. The more you communicate with it in the same memory base (aka the same chat), the more intuitive it becomes.

Step 1: Batch Your Data

I process my data in batches. 20 rows of data at a time.

That is because when something breaks. And it will. You don’t want your entire dataset corrupted, or your entire workflow jammed. Or you don’t want your Python scripts to be too ‘bloated’ that it becomes difficult to ‘debug’ it. Hence I separate different functions for different scripts, from scraping, research, personalisation and other functions.

This way, I can continually go back and forth between my LLM to “refine the code” whenever something doesn’t work for a particular function.

It’s not that hard. I really only start with a simple Excel sheet:

  • Company name
  • Website URL
  • Some basic info of the company name

The goal here is to build your own workflows that are specific to you.

Step 2: Leverage LLMs and Python Scripts for Heavy Lifting

Here’s where A.I. does the heavy lifting.

Here’s the example flow:

  1. Scrape the company website
  2. Pass the URL data into an LLM
  3. Identify which pages to crawl deeper (like the team page or about us)
  4. Extract individual lawyer profiles
  5. Categorise contacts by seniority: Partners, Directors, Senior Associates, Associates, Paralegals
  6. Output accordingly. I want to know their practice areas and specialisations
  7. Output the total number of lawyers and categorise it into small (1 to 5), medium (6 to 30) and big (31 and above)

The data scraped gives me firm size, specialised practice areas (corporate, litigation, IP, family law) and other specialisations.

This helps me with sorting. I do not want to reach out to IP and shipping lawyers as I believe they are not in my target market. Lead generation via paid digital media is not going to help them get more clients. I am also not going to reach out to lawyers from medium or big firms.

Step 3: Generate Personalised Icebreakers With A.I.

Now, once I filter and sort through which contacts to outreach to, I use a Python script, calling an API from an LLM to write a two line personalised icebreaker for each contact based on their individual profile or law firm practice.

This will be something specific and not “I saw your company is doing great things.”

Here’s a real life output that is usable:

‘X Law Firm’s Senior Lawyers each bring 30 or more years of legal experience to the table. That kind of depth across the team is hard to find in smaller practices.’

Groq Qwen’s model does pretty okay with this function. You can use your own favourite models for generative A.I. outputs.

Step 4: Handle Exceptions Manually

Now before you sit back, celebrate, and think A.I. workflows are going to help you such that you can press a button, go drink a Mai Tai, and poof, magically everything is going to be done for you, PAUSE.

Look, not every website can be scraped. Anti scraping software exists. Not every profile can be found. Some law firm websites just do not have their lawyer profiles, or an about page. That is when manual human input is required.

For example, if a site can’t be scraped, I manually copy paste the lawyer’s page into Claude and ask:

“Write a two line email icebreaker for these lawyer profiles based on my previous inputs”

Then I update my Excel sheet manually.

This is still better than manually going through 80% of my contacts. Yes, A.I. speeds up the process, but it’s not perfect. Expect to handle 10 to 20% of data manually.

Step 5: Upload and Launch Your Cold Email Campaign

With icebreakers done, I upload everything to Mailshake:

  • First name, last name, email
  • Custom icebreaker column

The icebreaker placeholder pulls the personalised line into each email. Then combine it with Spintax variations where suitable. This helps to make every email ‘unique’, resulting in better deliverability.

Make sure you check your previews to ensure the icebreakers are matched to the contacts.

Cold Email Templates for B2B Outreach

Today most cold emails get ignored. It is after all a low cost and low difficulty activity (compared to, let’s say, cold calling) way of getting leads. Everyone has been spamming everyone’s inbox since the beginning of time.

You can rely on templates with customisation, but if you’re going to fully use a template without any personalisation, you’re better off cold calling or building a paid media acquisition funnel.

Either way here are my frameworks for my first email.

Include an icebreaker that is specific and personalised to them.

Send them a compliment that is personalised to them. This shows you have done a bit of your homework.

Have a clear value proposition

State what you do and for whom. In my emails I clearly state that I help law firms get more clients through Meta advertising. Our agency works on a we perform or you don’t pay model.

Social Proof

I also mentioned that we have the privilege of working with another recognised lawyer and we have a real life success case study.

CTA is Non Pushy

I drop a CTA for a potential online Google Meet. Or if they are interested they can email me back to explore further. This is non pushy and we never ask directly for the sale here.

Best Cold Email Subject Lines

Your subject line determines whether you get opened. Everything else is irrelevant if they don’t click.

Cold Email Subject Line Best Practices

Make it specific to them. Use their firm name. Their practice area. Or use their actual name! The goal is to create curiosity.

However, don’t be clickbait. Avoid spam trigger words like “free,” “guarantee,” and “urgent.” This is to avoid landing in junk mail.

Cold Email Subject Line Examples That Work

“Quick question about [Firm Name]”
“[First name], saw your [case/article/news]”
“Idea for [Company]’s [specific area]”

Subject Lines to Avoid

“Partnership opportunity” // this screams salesy salesman, and who are you to ask for a partnership?
“Can I pick your brain?” // this is too vague
“Quick question” alone // this is too generic, there’s no curiosity or hook

The best cold email subject lines should feel like they came from a real person with a real reason to reach out.

Email outreach software will allow you to insert placeholders in your subject line. I mean, if you’re serious enough, then you can craft a customised subject line for each email!

Best Time to Send Cold Emails

There is differing research on this; some say the best times are on specific dates and times. I don’t really pay much attention to the super minute details. Typically, I schedule my emails from 7:45am to 4:55pm.

That’s because I either want to be the first in their inbox, or I do not want to be too late in the inbox. Most people are mentally checked out after 5pm in Singapore, or they are working overtime (hence they are really busy and would be annoyed to receive an outreach email).

I avoid totally:

  • Weekends
  • Public Holidays

This is for good reason.

The key here is to track your open rates and response rates data and adjust accordingly.

I found that sending up to 25 emails a day gives me great deliverability before scaling up slowly. I told you, I once ‘spammed’ many email accounts in the legal industry. I was too impatient, not targeted, not personalised, and set it as high as 60 to 80 emails before warming up my email accounts.

That led to a dismal response rate and I had feedback that my email landed in spam.

How to Follow Up on a Cold Email

For most email outreach software, you get to automate your follow ups. It runs until they reply or opt out. I set up follow ups to be at least 5 days apart. I never want to feel like I am harassing potential clients, as I may just email them again!

I also try to keep my follow up emails on the light hearted side. This humanises the email outreach.

Cold Email Follow Up Template

I shall give you my real life follow up emails that I am currently using.

Follow Up 1 (5 days later):

I reached out a few days ago.

I get it. You’re swamped. Running a small business in Singapore is tough.

I just wanted to make sure you didn’t miss what we’re doing here. This isn’t theoretical. We’ve actually done it with a real case study to prove it.

Happy to also send over the case study if you’re interested.

Hope to hear back.

Final Follow Up 2 (5 days later):

[[Final effort to connect|One more try at reaching out|Ultimate bid to make contact|Last chance to engage]].

Third time’s the charm (or the restraining order). I won’t follow up again after this.

If this isn’t for you at this point, perhaps you may know another law firm or lawyer who could benefit.

I’ll be grateful for the referral. Our agency also pays out 100% of our first payment (we don’t do retainers) as a thank you for your referral.

Nonetheless, totally understand. Keep crushing it.

I do try create a little bit of urgency in my last email. I am also wary not to spoil the relationship.

Conclusion

The days of blasting 500 generic emails and hoping for the best are over. Your prospects are busy and their inboxes are full.

The workflow I shared here is not rocket science. It is leveraging automation concepts and LLMs to help you scrape, sort and personalize. You do not need to know how to code. I didn’t. You just need to be willing to go back and forth with an LLM, refine your scripts and fix errors along the way.

A.I. won’t do everything for you. There will be manual inputs required. But what used to take days or even weeks can be compressed into hours.

Now go send some emails!