DEV Community

UNO Leo
UNO Leo

Posted on AI-assisted

I sent 1,027 cold emails with my own AI sales agent. 7 replied. The problem was not the emails.

Last week I wrote about our Product Hunt launch. 2 upvotes, 0 signups. This is the other half of the story.

Before that launch I was already using our own product to sell it. It has been running every day since June. Here is what 1,027 cold emails looked like. The numbers come from our production database on August 29. I show all time and the last 30 days separately, because the early months were not the same product.

We are a small software company in Tokyo. LeadAce is an outbound sales agent that runs as a Claude Code plugin. It builds a prospect list, reads each company's website, writes one email per company, sends it from my own Gmail, and records every reply and every rejection reason. I run it on a cron to sell LeadAce itself.

The numbers

All time, June 11 to August 28:

  • Emails sent: 1,027. One email per company, no bulk sending
  • Replies from a human: 7. 1 was interested, 5 were a no, 1 was an unsubscribe
  • Signups I can trace to these emails: 0
  • Paying customers from this: 0
  • Bounced: 75, which is 7.3%

One thing about what I asked for. These emails never asked for a meeting. The ask was "if this sounds useful, try LeadAce". So a meeting count would be 0 by design, and I am not using it as a result. The result that matters for this ask is a signup, and that is the 0 above.

Last 30 days, July 30 to August 28:

  • Emails sent: 246, about 8 a day
  • Replies from a human: 5, which is 2.0%. 0 interested, 4 a no, 1 unsubscribe
  • Bounced: 17, which is 6.9%

The all time number hides a bad start. Most of the total went out in June, at a much faster pace than now, and a lot of the targeting that month was wrong. June got almost nothing back. I am not taking it out of the total. But the last 30 days is the better picture of what the agent does now, and the reply rate there is several times what it was before.

Both rates are still low. And every reply in the last 30 days was a no.

The first answer I found was email deliverability

I spent two weeks here. It was a real problem.

  1. We had no DMARC record until August 13. The emails went out. A lot of them most likely went to spam.
  2. After adding DMARC I checked Google Postmaster Tools. Direct sends passed alignment 16 out of 16.
  3. There was a second problem. Many prospects use a generic info@ address that forwards to a founder's personal Gmail. Forwarding rewrites the message, so the DKIM signature breaks. On August 17, 15 of 33 forwarded copies failed DMARC.
  4. I kept the policy at quarantine anyway. The fix for forwarding is on the receiving side, not on mine.

Since then, our seed tests show no spam reports. So the sending is healthy now. The bounce rate went down after the fix, and every reply in the last 30 days came after it.

I thought that explained everything. Then I compared it with a second product we run.

The number that broke that explanation

We run a second product with the same agent and the same research step. It is a speaking practice app for students, and it sells to schools and prep schools in Japan, in Japanese. So the market, the language and the ask are all different from the LeadAce run. I will write that run up on its own. Here I only use it as a control, because the code that finds a company, reads its site and writes the email is the same.

All time:

  • Emails sent: 238
  • Replies from a human: 13, which is 5.5%. 6 of them were interested
  • Bounced: 1

That product asks for a conversation, so the ask is different too. I am only comparing replies here.

It is the same code. One list gets a reply from fewer than one email in a hundred, and none of those replies are interested. The other list gets a reply from about one in twenty, and half of those are interested.

Part of that gap is the market. Japanese schools answer email more often than US startup founders do. I cannot separate that from the list itself with this data. But it does not change the point. The same agent wrote both sets of emails. If the writing were the problem, both lists would be bad.

What was wrong

Our agent picks who to contact using discovery strategies. We had 8 of them running: YC and HN launch pages, accelerator rosters, Product Hunt, tech news, Techstars, GitHub trending, Crunchbase, Wellfound.

Every one of them selects companies by "this company exists and is doing something". Not one of them checks the thing that decides whether the reader can use my product.

To use LeadAce you need a Mac, a Claude Code Pro or Max plan, and a Gmail account. That is a narrow group. None of my 8 strategies tested for it. So the chance that any given recipient could install the product was about the same as picking a company at random.

There is a worse part. The one population that was closest to my real users, founders who post their launches on HN, had the best reply rate of the eight. My own bandit archived it in mid August for low yield, because the rate was still low in absolute terms. The system did what I told it to do. I told it to optimize reply rate across strategies. I never told it that only some strategies contain people who can run the software at all.

What the replies said

Seven human replies is not data. But the content lines up with the above.

  • One said they already have agents doing this, and asked about per user pricing. That was the only positive one.
  • One said they built their own agent to do the same thing.
  • One said they are not looking for outbound sales support or new partnerships.
  • One said they are not looking for digital marketing or outbound services.
  • One was an automated reply quoting their blog.

Read them together and two things show up. The people closest to my target are technical enough to have already built a small version of this themselves. And the people who are not technical read my email as an offer of outsourced sales work, because that is what a cold email about "outbound" sounds like if you are not the buyer I imagined.

There was also nowhere to go

The ask in the email was "try LeadAce". We do not put links in the email body. That was on purpose, because of domain reputation, and I still think the reasoning was right. But it means the only way to act on the email was to remember the name and search for it.

  • Searching "LeadAce" put our site in eighth place, under a different company with a similar name. Most people do not scroll that far for a name from a cold email.
  • The sending domain, getleadace.com, had MX, SPF and DMARC records, and no A record. If a reader typed the domain from the From line into a browser, they got a connection error.
  • The closing line of most emails was some version of "might be worth a look", with no place named to look.

So the path I was asking a reader to take was: read the email, keep the name in mind, search for it, not find it. Even in the case where the email arrived, and the reader could use the product, and they were interested, that path ends before the signup page. I built a funnel with the last step missing and then measured the reply rate.

What our own product told me

LeadAce has a detector that watches the reply rate over a 90 day window and estimates whether an outbound setup is dead, meaning more sending will not produce more replies. It warns at 0.99.

The last reading I have for my own account is 0.979, from August 18.

So my own product was about to tell me that my own outbound does not work, using a feature I built for customers. I am leaving it on. If it fires, the feature is doing its job. I would rather have the number than not have it.

What I am changing

I am not changing the copy. I read a lot of the sent emails and they are fine. They are specific and researched, and there is one per company. The copy was not what was holding this back.

  1. Change who gets contacted. The people who can use this are the people already publishing Claude Code plugins, skills and MCP servers on GitHub. That is a list you can build from public data, and it tests the hard requirement directly instead of guessing at it.
  2. Give the email a destination. Our own guidelines already recommend aged domains like github.com. The repo is a better landing place than a marketing page for this audience anyway. Asking someone to search for a name that does not rank is not a call to action.
  3. Point the sending domain at something. A redirect is a ten minute job that I did not do for three months.
  4. Stop treating cold email as our acquisition channel. It is a good product demo and a good source of data about our own product. It is not where our first users are. Our users are in Claude Code, and I should meet them there.

What it cost

  • Claude Code: my normal Max plan. No per email AI cost.
  • Cloudflare Workers and Supabase for the backend. If you self-host it, you need the Cloudflare Workers Paid plan, which starts at $5 per month. The Supabase free tier is enough to evaluate it.
  • My time: about 10 minutes a day to read the cycle summary, plus two weeks on deliverability that fixed a real problem but not the main one.

What I take from this

The lesson I expected to write was about DMARC. The real one is smaller and more embarrassing. I built a targeting system with eight ways to find companies and zero ways to check whether a company could install my software. Then I ran it for three months and read the reply rate as if it were telling me something about my writing.

A reply rate can only tell you about the list you sent to. I had no number at all for how many people on that list could install the product. So there was nothing in the reply rate for me to read.

The agent, the prompts and the detector are all in the open source repo. If you run outbound from your own inbox, I would like to know how you check that your list can buy what you sell, before you send.

Top comments (0)