← Will Gaffey

Proof of work · Courted.io · Summer 2026

An agentic SDR pipeline that never sends an email

Every weekday it scores the brokerage market, finds decision‑makers at the top‑ranked offices, and drafts a three‑email sequence for each. A person still presses send, every time.

Will Gaffey · Strategy & AI Operations Intern (Office of the CEO) May – August 2026 Proptech SaaS, New York

StackPython · Databricks · Delta Lake · HubSpot API · ZoomInfo API · Google Sheets API · OpenAI + Anthropic fallback

250leads enrolled per week
~200 → 3contacts surfaced per office, contacts kept
7independent checks that can block outreach
0emails the system can send on its own
What I built

Six stages, run every weekday before the sales day starts

010203 040506 Harvestoutcomes Mapcustomers Scoreprospects Findcontacts Fill thetemplate Stagein CRM gates checkedgates re-checked SDR reviews the draftand presses send sends · replies · bounces · declines, harvested on the next run
Because sends are manual, whether an email went out is discovered afterward rather than known. That's why stage 01 runs first and throttles everything behind it.
The stages
  • 01 Harvest outcomes — recovers what happened to yesterday's drafts and sets today's volume allowance.
  • 02 Map the customer base — builds the safety roster that keeps current and churned customers out.
  • 03 Score the prospect universe — ranks every non‑customer office on propensity.
  • 04 Find a decision‑maker — ZoomInfo candidates, audited by a model on name, domain and location.
  • 05 Fill the template — the model fits one grounded observation to a sequence template.
  • 06 Stage in the CRM — re‑checks every gate, then writes three emails marked pending review.
Why this was hard
  • Four systems, no shared ID. Our market data, the customer list, the contact provider and the CRM name the same office differently, so every link is a guess — and a wrong guess can mean emailing a company we already sell to.
  • “The same office” is ambiguous. Two offices can share a brand and still be separately owned. Several agent teams often work out of one address. Some listed addresses are not offices at all.
  • People are harder to match than companies. Nicknames, married names, and someone who left eight months ago still listed as the contact.
  • Coverage and precision pull against each other. Loosen the matching and you reach more offices, and more wrong ones. Tighten it and good ones drop out. You pick which mistake to make.
Scope and credit

The design was mine: which offices qualify, which contacts we trust, what the model is allowed to write, and every rule that can stop an email before it reaches a person. So were the integrations into ZoomInfo, HubSpot and Google Sheets.

Dan Breitbach, Courted's Chief Strategy Officer, built what sits underneath it. That's the data platform, the propensity model, and the loop that measures what happened after a send.

I wrote the specifications and made the architectural calls, and used Claude Code to build it inside a single summer.