back

Make money, make no mistakes.

Jared Zoneraich, Sandra Yang · September 2026 · cross-posted from the original tweet

What we learned making our first $75 with an AI-run business.

In July, we decided to see if an AI agent could run a company that could actually make money. We gave Devin a Ramp card, a phone number and an email address, named it BugBasher, and told it to figure out the rest.

The idea: to build an agentic exterminator service. New York City publishes the result of every restaurant health inspection, including pest violations. BugBasher would contact those restaurants, find out whether they wanted an exterminator, and charge a fee for the referral.

Four weeks and a lot of phone calls later, it had made $75. As far as we can tell, this is the first publicly documented case of an AI agent successfully doing B2B sales from a complete cold start.

Chart of BugBasher's revenue over the four-week experiment
BugBasher’s revenue over the four-week experiment.

Setup

BugBasher runs on Devin, Cognition’s coding agent, with Ramp’s agentic finance platform handling its money. We also gave it a phone number and a voice (through Twilio and ElevenLabs), an email address (through AgentMail), and a Stripe payment link.

It also had a GitHub repository and a “brain” composed of text files in a storage bucket, which served as its memory. A private Slack channel let it send us updates and ask for code reviews.

The self-improvement loop

To give BugBasher the freedom to iterate on its own business plan and respond to inbound, we set up an OpenClaw-style heartbeat system. Every 20 minutes a heartbeat ran in the form of a Devin automation.

The automated sessions checked the phone balance, inbox, and Stripe activity for blockers. Other scheduled sessions made restaurant calls, reviewed transcripts, and revised the phone agent’s instructions based on the results. Once a day, an "idea" session reviewed overall business performance and came up with new business improvements to try. Incoming calls and payments also triggered new Devin sessions, so BugBasher could respond without waiting for the next heartbeat.

Timeline of BugBasher's Devin sessions across four weeks, colored by session type
BugBasher’s activity across four weeks, colored by session type. Orange dots mark sessions we started manually.

Each heartbeat spun up a new Devin, with a new sandbox, and pulled down the “brain” from a storage bucket into the local agent filesystem. Inside the bucket were agent skills, call transcripts, and any other logs the agent decided to save. This made it easy for multiple concurrent agents to update the same brain and learn from its own progress.

bugbasher-brain-main/
├── AGENTS.md
├── memory.md
├── open-decisions.md
├── do-not-call.csv
├── (... other MD and CSV files)
│
├── transcripts/
│ └── 2026-08-07 … 2026-09-08/ (25 day folders, 14,742 .json)
├── results/
│ ├── 2026-08-25-123b4fb1-partner-webform-shots/
│ ├── 2026-08-28-cf20a49e-desk2-lead-sheets/
│ └── (...)
├── runs/
│ ├── dial-slots/
│ └── <date>-<session>-<role>.md (411 files)
├── skills/
│ ├── README.md
│ ├── roles/
│ │ ├── calling/
│ │ ├── heartbeat/
│ │ ├── idea-engine/
│ │ ├── morning-brief/
│ │ └── (...)
│ ├── brain-maintenance/
│ ├── call-qa/
│ ├── (..)
├── call-qa/
├── context/
│ ├── meetings/
│ └── (18 .md)
├── archive/
│ ├── memory-2026-08.md
│ ├── memory-2026-09.md
│ ├── strategy-2026-08.md
│ ├── strategy-2026-09.md
│ └── open-decisions-closed.md
├── webcrafter/
│ └── (...)
├── partner-prospects/
│ └── (...)
├── dashboard/
│ ├── expenses.csv
│ ├── metrics.csv
│ ├── revenue.csv
│ └── summary.json
├── delivery/
│ └── runs/
├── handoff/
└── inbound-callbacks/

The shared files let new sessions pick up earlier work and revise their approach without us directing every step.

During the daily review automation, Devin would look through all previous logs and try to learn from its mistakes. Most of these learnings were in the form of skill updates that would improve the next run of outbound calls or feed broader insights into future sessions. BugBasher could update its prompts and saved instructions itself, but changes to its code still required our approval.

Chart of BugBasher's calling prompt growing from 252 to 2,793 words
BugBasher added, removed, and reorganized instructions as it reviewed call results. Its prompt grew from 252 to 2,793 words over the run.

We spent the first two weeks building BugBasher and supervising it closely. Part of the experiment was to see whether it could keep making progress when it hit a blocker, so after that initial setup, we tried to intervene as little as possible, checking in roughly once a week to approve key code changes.

Finding interested restaurants

To sell referrals, BugBasher first needed restaurants that wanted an exterminator. Most of its work went into calling restaurants with a recent pest violation and asking whether they wanted to be put in touch with one.

Breakdown of outcomes across 10,929 restaurant calls
Outcomes of 10,929 restaurant calls. Counts represent calls, not unique restaurants.

These calls fed into the review automation, where Devin examined the transcripts and revised the phone agent’s instructions for subsequent calls.

Language

BugBasher sometimes reached people who didn’t understand its English opening. They said "Hello? Huh? Wéi?", which it interpreted as a bad connection — so it would hang up on them. On August 11th, after one restaurant spent 45 seconds like this, it added an instruction to its calling prompt to ask: “Would Spanish or Chinese be easier?”

On most non-English calls, that was enough to get the previously-failed conversations going. Across the run, it switched languages on 39 calls, mostly to Spanish or Chinese.

Transcript of a call that switches to Mandarin at 0:29 and takes another minute to land

System prompt

The agent would also sometimes begin reading its system prompt out loud in the middle of conversations.

Call transcript where the agent reads its own instructions out loud for 22 seconds
The phone agent reading its instructions aloud during a restaurant call.

It would also argue out loud with itself about what to do:

"Are you still there? The user has been silent for two turns. According to the SPEECH GATE and THE ASK rules, if a turn shows they were not listening, my entire reply is the ask. However, the 'Quiet has continued past thirty seconds' rule states that if quiet has continued past thirty seconds with no answer to the ask, I should say 'I'll try again another time, thanks!' and end the call. Since the user has been silent for two turns, it's likely that more than thirty seconds have passed. But before ending the call, I should ask 'Are you still there?' as per the rule. This is the first time I'm asking this."

This happened on 197 calls. BugBasher tried adding “never say your reasoning” to the prompt, deleting specific words, and changing tool-call formatting. None of the fixes worked. On August 24, it stopped making wording changes and escalated the issue to us.

Getting unstuck

BugBasher was finding interested restaurants, but still had no exterminator to send them to. It had initially treated signing one as a task that required human involvement. After eight days, it noted:

"Sign an exterminator" has been blocker #1 for 8 days while every session worked downstream of it, and no session had produced the input to that decision.

Other requests were waiting on us, too. It didn't have permission to read Slack replies, and the human blockers, such as spending approvals and code reviews, were piling up. Its Slack updates to us were going unanswered.

On August 23, BugBasher identified “human approval throughput” as its main blocker and started looking for another way to reach us.

That morning, it began searching through the entire brain and all of its files to find any human’s contact details. When that proved unfruitful, it tried to list the members of its Slack channel in the hopes of finding a person to reach:

slack conversations.members -> missing_scope
slack users.list -> missing_scope

However, without the required Slack permissions both commands returned an error. One minute later, it decided to try something else, this time listing the collaborators in its Github repo:

gh api repos/.../collaborators -> jzone3, birdhumming

It then ran git log to find the authors on previous commits, which yielded two work emails:

13:49:19 git log --format='%an %ae' | sort -u
13:50:17 email sent to two work addresses -> 200

And we woke up to the following email:

Email BugBasher sent to its operators asking for approvals

I merged in the nine open PRs two days later.

Afterwards, it remarked to itself:

The cost asymmetry is brutal: a minute of looking versus a day of unanswered asks.

Finding a customer

With many leads to sell, BugBasher had also begun searching for an exterminator itself. To find potential partners, BugBasher pulled the state pesticide registry, filtered to 321 NYC pest-control businesses, and enriched 125 with contact details.

It first tried email, phone, and filling out website contact forms. After two days without reaching a human, it made the decision to switch audiences. It started targeting commercial-accounts desks at large regional and national chains, with the reasoning that larger companies would have more dedicated sales people with "desks that are staffed by humans who answer.”

This was more successful in reaching humans, but some calls ended with BugBasher hanging up mid-sentence, and its offer of free leads attracted little interest. It fixed the hangup bug and changed its pitch to lead with a specific restaurant that wanted a quote:

"I have a restaurant on Clarkson Avenue in Brooklyn that wants a quote — who should I send it to?"

The new pitch strategy worked considerably better: when it called the same desks back the next day, ten people picked up and four of them provided an email address over the phone for the lead to be sent to.

BugBasher emailed the leads out without charging upfront. Its plan was that the exterminator would pay $75 after booking the job. None of the recipients replied.

It decided that it had to be less generous, and changed the offer so that exterminators would have to pay the $75 up front through a Stripe link and receive the restaurant's contact details afterward.

On September 1st it emailed this new offer to 30 exterminators, including the four that it had previously emailed. After an hour, nobody had clicked the Stripe link, and it concluded that its new experiment was also a failure.

Eight hours after that, one of the earlier contacts paid the $75 through the link, without ever replying to the email. BugBasher confirmed the payment with Stripe and sent him the restaurant's name, address, and phone number about six minutes later.

BugBasher's first $75 sale

We later spoke to the buyer, a manager at a pest control company, to ask about his experience with BugBasher. When asked why he had picked up the phone, he said that he was simply “in a good mood that day”, and also, due a recent Google ad campaign that he’d been running, was receiving a lot of phone calls from “random numbers”.

When asked about his opinions on interacting with an AI agent, he responded with “Business is business”. He also said that he’d be more than happy to buy from BugBasher again, and asked if we had any further leads to sell him. BugBasher does actually have more leads that it is currently sitting on; however, the idea of re-doing sales to past customers seems not to have occurred to it yet. Overall, he rated his experience with BugBasher an 8/10: despite the lead not converting, he was pleased with the inbound.

What we learned

It took many calls, loops, and failed ideas, but BugBasher was ultimately able to make its first sale. Whether an AI agent is truly able to run a viable, long-term business - and perhaps even become profitable - is still an open question.