Outbound
CoStar CSV in, verified Smartlead out
Drive drop. Drop anything older than 45 days. LeadMagic, then Icy Peas. NeverBounce is the gate.
The loop
- 01Drop the CoStar CSV, fire the boxClient drops the export in Google Drive. Make.com hits a Flask app.py on Railway. The run starts on demand, not on a nightly guess.
- 02Cut old rows. Dedupe the property.process_sales.py drops anything older than 45 days and dedupes at property level. Stale listings never reach enrichment.
- 03Find the owner, not the LLCenrich.py: LeadMagic first, Icy Peas fallback. If the owner is an LLC, keep going until you have an individual.
- 04Verify every email. Then write the first line.NeverBounce on every address. Zero unverified contacts reach Smartlead. Claude writes the opener from property address, tenant type, and sale context.
- 05HubSpot the contact. Smartlead the campaign.Dedup and create in HubSpot, auto call task. Push verified rows to the Smartlead campaign named by the CSV filename. Railway dashboard every 60 seconds, with a kill switch.
Most CRE outbound starts as a spreadsheet and dies as a spreadsheet. Wyatt’s version is a box: a CoStar export lands in Drive, Make kicks Railway, and the only rows that leave are verified owners of recent sales. Clay is not in this loop.
The interesting constraint is the gate, not the model. Older than 45 days: drop. LLC with no person: keep looking. Unverified email: never enqueue. The dashboard refresh and the kill switch exist because a bad run should be stoppable without SSH.



