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 2026Proptech 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
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.