
Backlink outreach is not hard. It is tedious. Find sites, check they are worth it, find an email, write, send, follow up, answer every reply, track who agreed to what, and finally check the link actually went up. Most founders know they should do it and keep not doing it, because it is forty small jobs that never feel urgent.
At Careerkit, a resume and career tool, our outreach on October 17 stood at 12 emails and 0 links. A week later it was 220 emails, 35 replies and 8 live links. The difference was not more willpower. It was a pipeline in Claude Code, with a human only where a human matters.
Below: the six steps of that pipeline, what each one does, the design choice behind it, and how to build your own version this week. The results are in here too, including the uncomfortable one: half the replies wanted money, and every link that came back was a swap.
Step 1: Find the sites that already link to your competitors
The cheapest prospect list is the one your competitors already built. A site that has linked to one resume builder is far more likely to link to another than a random blog is.
We gave Claude Code the Ahrefs MCP and 11 competitors: Canva, Enhancv, FlowCV, Kickresume, Novoresume, Resume.com, Resume Genius, Resume.io, Rezi, Teal and Zety. For each one, the agent pulls every backlink with one filter:
- Domain Rating 10 to 40. Big enough to matter, small enough that a person actually answers email.
- English, dofollow, inside the article. No footers, no sidebars, no sitewide links.
- One link per domain, from sites with at least 200 organic visits a month.
Ahrefs returns at most 100 rows per call in CSV output, so large pulls page through results. The skill hands each batch of competitors to a small helper agent (Haiku at low effort) whose only job is to write the CSV word for word. That keeps the expensive model out of a mechanical job. The 11 pulls produced 955 raw rows, and one merge step deduplicated them into 502 sites. A second pull against 8 Swiss competitors added 189 more.
Step 2: Vet with code, not with a model
This is the most important design choice in the pipeline, and it is not AI at all. The yes/no decision on every site is made by plain rules in a script:
- Does the site sell links? The script scans for seller pages.
- Does it get fewer than 1,000 visits a month?
- Does its traffic show a spike that looks bought?
- Are its top pages toxic or off-topic?
The agent gathers the Ahrefs facts through the MCP and writes them to a file. The script reads the file and makes the call. No model decides who is "worth it".
Why code? Because you can test it. When the first 31 replies came back, we back-tested the rules against all of them. The rules passed the 5 sites we actually kept talking to and failed 21 others, including all 17 link sellers we had turned down. A model judgment would have been impossible to back-test that cleanly, and it would drift between runs. Now the vet runs before anything is drafted, and sites that fail never receive a follow-up.
Step 3: Find contact emails for free first
Paid email finders are useful and expensive. So the script goes free first: it reads each site's contact page, about page, write-for-us page and, for European sites, the Impressum and Kontakt pages.
Only after that does it offer a paid finder (we use Mindcase), and only with a cost estimate shown first and an explicit yes from the founder. That one rule, written into the skill, means the agent can never quietly spend money on a lookup. If you build anything that calls a paid API in a loop, put the same gate in: no paid call without an estimate and a yes.
Step 4: Fill a template with a script, and keep the send button human
The first email is a template from Prafull at Outsmartt, the SEO agency we partner with, used word for word. A script fills in the first name and company. There is no AI rewriting of the email, so every recipient gets the same tested message. Its core is one question: "Are you currently accepting guest posts or link exchanges?"
On October 19 the pipeline created 168 drafts in Gmail. The founder then sent them by hand. That split is enforced, not just intended: in the project's Claude Code settings, Gmail's send, reply and forward tools are set to "ask", while creating drafts is allowed. The agent can prepare everything. A person decides what leaves the building.
The numbers from that send: 175 first emails and 45 follow-ups, 220 in total. 35 replies, a 20% reply rate on first emails. 7 bounces.
Step 5: A ledger that answers every reply
Replies are where outreach usually falls apart: they arrive at random times, each needs a slightly different answer, and nobody remembers what was promised to whom. So every reply is logged to one ledger file with what the site said, any price quoted, a verdict (accept, counter, decline or wait), the next step and the Gmail thread.
The answer comes from a decision table, not from mood:
- A price, and the site passed the vet: counter with a free, original article and one link.
- A price, and the site failed the vet: a polite thank-you and no.
- A swap offer: accept, and give back one natural link from a relevant blog post. Never the homepage, a footer or a badge.
- A question: answer it. An auto-reply on a good site gets one tailored follow-up.
Every answer is created as a draft in the same Gmail thread, and the rule is to answer every reply the same day. A cloud routine runs every Monday at 08:30 Zurich time and emails the founder what is pending: drafts left, emails sent in the last week, replies, follow-ups due. The founder answers with one sentence and the agent logs the sends and drafts the follow-ups. Nobody types a command. That was the point of the whole build.
Half the replies, 18, were price quotes. They ranged from $25 to "$2,500/post, or 25 for $500 upfront". We paid none of them. Two of those sellers, who first quoted $150 and $160, ended up agreeing to free swaps after the counter.
Step 6: Check that the link actually exists
The last step is the one most people skip, and it is where we made a mistake worth sharing. A checker script opens every partner page and confirms the link is really there: the right page, the right target, the right anchor, no nofollow, sponsored or ugc attribute, and a page that is not noindex. Anything that fails is flipped to "missing" in the ledger.
On October 24 a reply went out telling a partner that our side of a swap was live. It was not; it went live two days later. The fix was a new rule in the skill: never draft a claim (a link is live, an article is up, a fix is done) until the checker has passed in the same session. If you let an agent write status emails, give it the same rule. "It's done" should be something it proves, not something it says.
The twist: every link that came back is a swap
Eight links to Careerkit are live: five from one company that runs five architecture sites, two from an AI resume-screening blog and one from a jobs site. Every one is a trade, and we link back from relevant blog posts. Two more partners have agreed and are not live yet. Nobody wrote back "great site, here is a free link".
That is the honest shape of competitor-backlink outreach. The pool of sites that already link to your competitors is mostly sellers and swappers, which is exactly why the vet and the price table exist. It also comes with a caveat: Google's spam policies call out excessive link exchanges. Our rule is one natural link from a relevant post per partner, never sitewide, and we keep the exchanges small and topical.
What we would do differently
- Run the vet before the very first batch, not after the first replies. We built it after the sellers showed up.
- Start with fewer, better-fit sites. 220 emails produced 8 links; a tighter first list would have produced most of them with half the follow-ups.
- Add the link checker on day one. It costs nothing and it prevents the one mistake that damages trust with a partner.
Build your own this week
- Give your agent a backlink data source (the Ahrefs MCP or any backlink API) and your 5 to 10 closest competitors. Pull their backlinks: DR 10 to 40, dofollow, in-content, one per domain.
- Write the vetting as rules in a script: seller pages, a traffic floor, traffic spikes, off-topic pages. Back-test it on your first replies and adjust.
- Scrape contact pages for emails before paying for any finder, and require a cost estimate and a yes for paid lookups.
- Fill one tested template with a script. Have the agent create drafts, never send them, and set the send tools to ask in your settings.
- Log every reply in one ledger with a verdict and answer from a decision table the same day.
- Run a link checker before anyone says a link is live.
Practical takeaways
- Your competitors' backlinks are the cheapest prospect list you will ever get.
- Let the AI gather facts and let code make the yes/no calls. Code can be tested; vibes cannot.
- Put money and sending behind explicit human gates in the tool settings, not just in the prompt.
- Expect half the replies to be price quotes. Decide your no-paid-links rule before the first one arrives.
- Swaps are what usually comes back. Keep them few, relevant and never sitewide.
- Never let an agent claim something is done until a check has proven it.
Conclusion
The pipeline did not make outreach clever. It made it boring in the right way: the same vetted list, the same tested email, the same answer to the same reply, and a check at the end. That is what turned 12 emails and 0 links into 220 emails and 8 links in one week, with one person.
The founder-side story of this build ran in the HelloBuilder newsletter. If you are building your own outreach agent, Needle is the buy-it version of the same idea.


