← All case studies

AI Sales Doctor · Apr 2026 – Present

A B2B lead engine for a Singapore agency, built from nothing

Twelve campaigns and 445 contacted leads became 55 campaigns and 4,034. The work was a pipeline, a staged enrichment pass, and a CRM the sales team trusted.

The numbers that moved

  • grew lead output from about 100 a month to 300+ a week
  • contacted over 4,000 leads, against 445 before the role existed
  • ran 55 outbound campaigns, up from 12
  • three automated pipeline reports a day where there were none
  • over the 2 million companies in the ACRA registry

The situation

AI Sales Doctor sells B2B insurance to Singapore SMEs. When I joined, the company had a sales team, a spreadsheet of companies to call, and no data function at all. The sheet was the pipeline. Someone opened it in the morning, picked the next fifty rows, and the day ran on whatever those calls produced.

That works at twenty leads a day. It stops working when the managing director asks why last week was better than this one and nobody can answer without guessing.

Replacing the sheet

I built the sourcing step first. A scheduled job assembles a working list from public company records, removes the companies already contacted, and writes the result where the sales team already looked. Lead volume went from about 100 a month to more than 300 a week.

The volume was not the point. The list had memory. Every contacted company stayed contacted, so nobody dialled the same number twice, and the weekly number stopped depending on who remembered what.

Enrichment, in stages

The ACRA registry holds over 2 million Singapore companies. Matching a lead against it sounds simple until the first pass misses because a name carries "Pte Ltd" in one source and "Private Limited" in another.

I designed the enrichment as a waterfall. Try the strict match, then the normalised match, then a fuzzy match on trading name, and keep whatever evidence each stage found. A miss at one stage falls through instead of dropping the lead. Every field records the stage that produced it, so a wrong phone number can be traced to the source that supplied it.

Not every lead survived the waterfall. The ones that did arrived with a registration date, a status and a sector, which is enough to decide whether a company is worth a call.

Campaigns, CRM and routing

Outbound ran on HubSpot and Creatio, wired together in n8n. Campaigns went from 12 to 55, and contacted leads from 445 to just over 4,000.

Most of that work was not analysis. It was configuration. Pipeline stages that matched what the funnel actually did, field structures the sales team would fill in, and handoffs automated so a lead captured in one tool appeared in the calling list without a person moving it.

Reporting that runs without me

Status used to come from someone scrolling a sheet and typing a message. It now runs three times a day: one report to the managing director, one to the sales group chat, and an internal check that flags leads which have gone quiet.

What I would do differently

I would instrument the qualification step earlier. The pipeline could tell me how many leads were contacted long before it could tell me how many were worth contacting, and that gap made the first three months look better than they were.

What this proves

I can take an outbound motion from a spreadsheet to a measured system, and I know the difference between a lead count and a lead. If your team has demand data sitting in a CRM nobody trusts, this is the work I do.

RevOpsGTM analyticsAutomationLead scoring

Discuss a similar problem More case studies