The lead
nurturıng
agent
Every lead. Every touch. On schedule.
by James Rembert, Sept 2026
Most buyers and sellers act months after the first inquiry. This AI voice agent keeps calling on the calendar you set, day 1 through day 180, until each lead books, lists, or asks to stop. You keep the relationship. The agent keeps the calendar.
88%
of 2025 buyers purchased through an agent. Your lead will hire someone. Stay in touch and the someone is you.
7X
more likely to qualify a lead when a business reaches out within the first hour. Speed wins the first call. Cadence wins the rest.
<$1
per nurture call. All-in Retell setups run about $0.13 to $0.31 per minute, and a check-in lasts two to three minutes.
no. 01
Leads die between call two and call six.
Paid for. Called twice. Gone.
Zillow, Realtor.com, Facebook ads, open house sign-ins. Every source costs money or a Sunday afternoon. The first call goes out fast. The third call slips. By week five your lead is touring with someone else.
Where leads die
In the gap between inquiry and readiness. A buyer who says “next spring” in October needs a check-in every few weeks until spring. Busy weeks push those calls off your list, and nobody else owns them.
The fix
Every new row in your lead sheet starts a call schedule on day one. The voice agent works the schedule, logs each result, and steps aside the moment a lead books a showing or opts out.
Parts list
Retell AI for the voice. Google Sheets for the records. Modal for three scheduled Python jobs, which Claude Code writes and deploys for you. You feed the sheet. The system handles the dialing.
Answer rates
These leads gave you their number and asked a question. A check-in on their own inquiry reads as good service. A short text before each call tells them who is calling, so they pick up instead of sending you to voicemail.
no. 02
Eight lead types. Eight calendars.
Same script. Different clocks.
A buyer who toured an open house and a homeowner curious about value need different timing. The voice script adapts through variables. The calendar lives in the cadence column. Each dot marks one scheduled call.
Days after the lead enrolls, on a square-root scale so the busy first week stays readable.
no. 03
Five moves. Repeat until every lead resolves.
Sheet. Scheduler. Voice.
Keep the schedule out of the voice agent. The sheet stores the plan, a scheduler reads the plan, and Retell handles only the conversation. Split this way, a new lead type means editing one cell.
- 1Google Sheets
A lead becomes a row
A Zapier zap, a form webhook, or your own typing adds the lead to the sheet with a lead type, the property or question, the signup date, and a cadence.
- 2Modal cron
The scheduler checks the calendar
Twice an hour a Modal job reads every active row, counts days since signup, and compares the count to the next offset in the cadence. Dana enrolled 10 days ago on 1,4,10,21,45 with two calls logged. Her third offset is day 10, so Dana is up. Outside 8am to 8pm local time, nobody gets dialed.
- 3Retell SMS
A text lands first
“Hi Dana, Harbor Lane Realty here. Expect a quick call about the Oak Street open house in a few minutes.” The call follows five minutes later, loaded with Dana’s name, the property, and notes from the last conversation.
create-phone-call - 4Retell conversation flow
The agent has a short conversation
“Hi Dana, you toured 14 Oak Street last weekend. Is the home still on your list, or should I send a few similar ones?” Ready leads pick a showing time or get transferred to you. Everyone else hears “no rush” and stays on the calendar. A stop request ends the calls for good.
- 5Retell webhook
The sheet learns the result
When the call wraps, Retell scores the conversation against your post-call fields and sends the scores to a webhook. The webhook updates Dana’s row with outcome, notes, and status. The next scheduled day takes over from there.
Google Sheets
no. 04
Trace any call, dial to spreadsheet.
Six endings. One sheet.
Pick an ending. The path shows each step the agent takes and the exact change your sheet receives.
no. 05
One prompt into Conductor.
Paste. Review. Test. Publish.
Conductor is Retell’s built-in copilot for agent building. Open an agent, click the sparkle icon, and paste the prompt below. You get a draft flow with a node for each branch, the variables, and the post-call fields. Treat the draft as a first pass and test before going live.
Retell Conductor prompt
ROLE
Build an outbound conversation flow for {{brokerage_name}}, a real estate team. Every person on the call list contacted the team first, through a home search site, an open house sign-in, a home value request, or a past transaction. These calls follow up on those requests. The agent never sells, never pressures, and never cold calls.
SUCCESS LOOKS LIKE
- Ready buyers and sellers end the call with a showing, buyer consult, or listing consult requested.
- Undecided leads feel zero pressure and stay open to the next call.
- Anyone who wants out gets out on the first request.
INPUT VARIABLES
first_name, brokerage_name, agent_name, transfer_number, lead_type, interest, days_since_inquiry, touch_number, last_outcome
- lead_type values: portal_buyer, open_house, valuation, future_buyer, renter, relocation, listing_followup, past_client
- interest example: "the open house at 14 Oak Street"
- last_outcome example: "touring with spouse on Saturday"
DELIVERY
Warm, unhurried, neighborly. Sound like a trusted office coordinator, not a salesperson. Ask one thing at a time. Offer help once per call and drop the subject after two soft no's. Aim for 90 seconds to 3 minutes.
NODE 1: IDENTITY
Ask for {{first_name}} by name. Wrong person: apologize, end the call, outcome wrong_number.
NODE 2: DISCLOSURE
"I'm an AI assistant calling for {{agent_name}} with {{brokerage_name}}, and this call is recorded."
NODE 3: CONTEXT
Mention {{interest}} and roughly how long ago the lead reached out, based on {{days_since_inquiry}}. When {{touch_number}} is 2 or higher, bring up {{last_outcome}} in plain words.
NODE 4: CHECK-IN (varies by lead_type, swap in {{interest}} for any address)
- portal_buyer, relocation: "How's the search going? Any homes catch your eye?"
- open_house: "Is the home still on your mind, or would a few similar listings help?"
- valuation: "Want {{agent_name}} to walk through and firm up the number?"
- future_buyer, renter: "Has your timeline shifted at all?"
- listing_followup: "Have you picked a direction, or would answers help first?"
- past_client: "How's the house treating you? Anyone you know thinking about a move?"
NODE 5A: BOOK
Collect a preferred day and time for a showing or consult. Offer a live transfer to {{transfer_number}} if they prefer a person now. Recap the request before ending. Outcome booked.
NODE 5B: ANSWER
Pull answers from the attached knowledge base only. Missing answer: tell them {{agent_name}} will follow up personally. Never give a price opinion, commission figure, offer advice, or any detail absent from the knowledge base. Return to NODE 4 afterward.
NODE 5C: LATER
Respond with warmth and no pushback. Ask once about timing and the main hurdle. Skip promises about when the next call comes. Outcome not_yet.
NODE 5D: OPT OUT
Any version of "stop calling," "remove me," or "don't call again" jumps here from anywhere in the flow. Confirm removal in one sentence, apologize, and end the call. No follow-up questions. Outcome opted_out.
GLOBAL: FAIR HOUSING
In every node: never characterize a neighborhood, school, or street by its residents. Never label an area safe, dangerous, good, or bad. Never adjust tone or offers based on who the caller seems to be. For school or crime questions, direct the lead to the school district website or local police data and offer a follow-up from {{agent_name}}.
GLOBAL: OFF-LIMITS
Legal, tax, lending, or inspection advice gets a polite decline and a follow-up offer.
GLOBAL: HONESTY
If asked whether this is AI or a person, confirm AI right away and keep helping.
VOICEMAIL NODE
Detect voicemail. Leave under 15 seconds: {{first_name}}, {{brokerage_name}}, and a callback number. Leave property, price, and address out. Outcome voicemail.
POST-CALL DATA (exact field names, read by the backend)
- outcome: booked | not_yet | opted_out | voicemail | no_answer | wrong_number
- temperature: hot | warm | cold
- appointment_request: text, requested day and time
- timeline: text, move or decision timing in the lead's words
- hurdle: text, main reason for waiting
- preapproved: yes | no | unknown (buyers only)
- summary: text, two sentences max
CLOSE
Every connected call ends with a spoken goodbye before hangup.
Test before going live
- 1Call yourself once as an open house lead and once as a valuation lead. Confirm the check-in question changes.
- 2Say “take me off your list” in the middle of the call. The agent should exit on the spot.
- 3Ask “Is this a good neighborhood for families?” The agent should point you to public sources and offer a follow-up.
- 4Let a call roll to voicemail and listen back. No address, price, or property detail should come through.
- 5Open the call log and confirm all seven post-call fields populate under the exact names above.
no. 06
Every lead lives on one row.
No new CRM.
The cadence cell holds day offsets per lead, so a relocation buyer and a past client run on different calendars in the same tab. Edit the cell and the next scheduler run follows the new plan.
Tab: leads. Example rows.
| first_name | phone | lead_type | interest | signup_date | cadence | touch | last_called | last_outcome | status | notes |
|---|---|---|---|---|---|---|---|---|---|---|
| Dana | +15555550142 | open_house | 14 Oak St open house | 2026-09-02 | 1,4,10,21,45 | 2 | 2026-09-06 | not_yet | active | touring with spouse Sat |
| Marcus | +15555550187 | portal_buyer | 3BR under $450K | 2026-08-11 | 1,3,7,14,30,60,90 | 5 | 2026-09-10 | booked | booked | buyer consult Thu 6pm |
| Priya | +15555550119 | valuation | value of 22 Elm Ave | 2026-07-14 | 2,7,21,45,90,180 | 4 | 2026-08-28 | voicemail | active | |
| Tom | +15555550163 | relocation | move from Denver | 2026-08-20 | 3,14,30,60,90 | 1 | 2026-08-23 | opted_out | opted_out | do not contact |
| Alicia | +15555550128 | listing_followup | listing consult, 9 Birch Ct | 2026-08-01 | 2,7,14,30 | 4 | 2026-08-31 | not_yet | done | listed with another agent |
Active
On the calendar. The scheduler reviews this row twice an hour.
Booked
A showing or consult got requested. Dialing stops and an alert hits your inbox.
Opted out
Permanent. The phone number also lands on the do_not_call tab.
Done
Every scheduled call went out with no booking. Move these leads to a long-term drip or a personal call from you.
Feed the tab from the tools you already use: a Zapier zap from your CRM, a webhook from your website form, or a quick paste after Sunday’s open house.
no. 07
Three scheduled jobs.
Timekeeper. Caller. Record keeper.
Modal hosts all three, and a solo agent’s call volume fits inside Modal’s monthly free credits. Claude Code writes the Python in the next section. Here is what each job reads, writes, and passes along.
The Scheduler
Modal cron
Every 30 minutes
The timekeeper. Decides who needs a call right now and refuses to dial outside calling hours, twice in one day, or on any row not marked active.
- Reads
- status, signup_date, cadence, touch, last_called, do_not_call
- Writes
- status to done when a cadence runs out
- Passes to
- Due leads to the Dialer
The Dialer
One run
per due lead
The caller. Records the attempt in the sheet before dialing, so a restart mid-run never rings the same person twice. Then the heads-up text, a five-minute pause, and the Retell call with the lead’s variables attached.
- Reads
- first_name, phone, lead_type, interest, last_outcome
- Writes
- touch + 1, last_called
- Passes to
- Retell, with row number in call metadata
The Results Webhook
Modal web endpoint
Receives call_analyzed
The record keeper. Retell sends post-call data here after each conversation. The webhook matches the call to a row and applies the result, from a booking alert to a permanent opt-out.
- Reads
- call_analyzed payload, call metadata
- Writes
- last_outcome, notes, status, do_not_call
- Passes to
- Booking alert to your inbox
no. 08
Claude Code ships the backend.
You answer. Claude builds.
The prompt below turns Claude Code into a build partner. Claude interviews you for settings, scaffolds a Modal project, writes and tests each job, deploys, and proves the loop with a real call to your cell.
Have these ready
- 1Retell account with the published agent
- 2Google account for Sheets and Cloud Console
- 3Free Modal account
- 4Your cell phone for the test call
Aigent Lab build prompt for Claude Code
You are my build partner for a real estate lead nurturing system. Work in phases. Finish each phase and check in with me before starting the next.
CONTEXT
- A Retell AI voice agent already exists and is published. The agent returns these post-call fields: outcome, temperature, appointment_request, timeline, hurdle, preapproved, summary.
- Leads live in a Google Sheet. Each lead carries a cadence of day offsets.
- You will build three Modal jobs: a scheduler, a dialer, and a results webhook.
PHASE 1: INTERVIEW
Collect settings in three short rounds. Tell me where to find each value.
Round A, accounts: Retell API key, Retell agent ID, Retell outbound number in E.164 format. For Modal, check for an existing token first. If missing, guide me through "pip install modal" and "modal token new".
Round B, Google: a service account JSON key with the Google Sheets API enabled. Walk me through Google Cloud Console if I need one, and remind me to share the sheet with the service account email as Editor. Then the sheet ID from the URL.
Round C, business: brokerage name, agent name, transfer number, time zone, my cell for testing, and an optional email for booking alerts.
Store secrets in .env locally and in a Modal Secret for production. Never print a full key back to me.
PHASE 2: SHEET SETUP
Create or verify these tabs.
leads: first_name, phone, lead_type, interest, signup_date, cadence, touch, last_called, last_outcome, status, notes
do_not_call: phone, first_name, date_added
cadence_defaults: lead_type, cadence, with these rows:
portal_buyer 1,3,7,14,30,60,90
open_house 1,4,10,21,45
valuation 2,7,21,45,90,180
future_buyer 14,45,90,135,180
renter 30,60,90,120
relocation 3,14,30,60,90
listing_followup 2,7,14,30
past_client 30,90,180
When a new row has an empty cadence, fill the cell from cadence_defaults by lead_type.
Valid status values: active, booked, opted_out, done. New rows start with touch 0 and status active.
PHASE 3: SCHEDULER (Modal cron, every 30 minutes)
For each active row:
- offsets = cadence split on commas.
- If touch has reached the number of offsets, set status to done and skip.
- days_since = whole days from signup_date to today in the configured time zone.
- The row is due when days_since is at least offsets[touch].
Skip the row if any check fails: local hour from 8 up to 20, last_called not today, phone absent from do_not_call.
After downtime, a lead gets one catch-up call per run, never several.
Send due rows to the dialer.
PHASE 4: DIALER (one lead per run)
1. Write touch + 1 and last_called = now before anything else.
2. If PRECALL_TEXT is on, send through Retell's SMS API: "Hi {first_name}, {brokerage_name} here. Expect a quick call about {interest} in a few minutes." Default the flag to off until A2P 10DLC registration clears.
3. Pause 5 minutes, or 30 seconds in test mode.
4. Place the call with Retell create-phone-call. Pass retell_llm_dynamic_variables: first_name, brokerage_name, agent_name, transfer_number, lead_type, interest, days_since_inquiry, touch_number, last_outcome. Add the sheet row number to call metadata.
5. In test mode, dial my cell instead of the lead.
PHASE 5: RESULTS WEBHOOK (Modal web endpoint)
- Protect the URL with a secret path token.
- Handle call_analyzed events. Return 200 and ignore other event types.
- Locate the row from call metadata, with phone number as the fallback.
- Write last_outcome. Append "YYYY-MM-DD: summary" to notes, plus timeline and hurdle when present.
- booked: set status to booked, then email the alert address with name, phone, interest, appointment_request, and preapproved.
- opted_out: set status to opted_out and append the lead to do_not_call. No code path ever reactivates this row.
- wrong_number: set status to done and note "wrong number".
- not_yet, voicemail, no_answer: leave status alone.
- Use the Retell API to set this endpoint as the agent's webhook URL.
PHASE 6: TESTS BEFORE DEPLOY
Write unit tests for the scheduler logic and run them. Cover: due on the exact offset day, not due one day early, exhausted cadence flips to done, blocked outside calling hours, blocked when already called today, blocked when on do_not_call.
PHASE 7: DEPLOY AND LIVE TEST
Deploy all three jobs. Add a test row with my cell, cadence "0", and status active. Trigger the scheduler by hand. Confirm my phone rings, then show me the row before and after the webhook update. Run a second test where I say "please stop calling" and confirm the opt-out path.
HANDOFF
Give me a five-line summary: what runs where, how to add leads, how to pause the system, where to read logs, and how to leave test mode (set TEST_MODE to False, then redeploy).
no. 09
Four rules for clean outbound.
Consent. Fair housing. Reputation.
Your leads opted in, which puts nurture calls on the friendliest end of outbound. Your AI still speaks under your license. Treat these four rules as non-negotiable.
Consent and the TCPA
The FCC’s February 2024 ruling placed AI-generated voices under the TCPA’s “artificial voice” rules. Every AI call needs prior express consent.
- Put consent language on every capture point. “By checking this box, I consent to calls and texts from [Brokerage] about my real estate inquiry, including calls using AI-generated voice, at the number provided.” Web forms, portal integrations, and digital open house sign-ins all need the box.
- Open with the disclosure. The agent names itself as AI and mentions recording before the conversation starts.
- Treat opt-outs as instant. The FCC opt-out rule effective April 2025 sets a ceiling of 10 business days. Your webhook records the opt-out seconds after hangup.
- Dial 8am to 8pm local. The federal window runs to 9pm. Florida and a handful of other states stop earlier, so 8pm keeps you clear in more places.
Fair housing on every call
The agent talks about the property and the process. The people in an area stay off the table.
- No neighborhood descriptions based on who lives there.
- No safe, good, or bad labels on schools or areas. Point leads to the school district site or local police data.
- Same script for every caller. Variables change the property, never the treatment.
- Ask your broker to review the prompt and knowledge base before launch.
Stay off the spam label
- Register at freecallerregistry.com. Hiya, First Orion, and TNS pull business identity from the registry and drive most caller ID labels.
- Pace each number. Carriers watch for spikes. Nurture traffic stays low because each lead hears from you every few days at most. A ceiling near 100 calls per number per day keeps your reputation clean.
- Text before you dial. A lead who recognizes the number rarely taps “report spam.”
Call volume and limits
Retell’s pay-as-you-go plan allows up to 20 simultaneous calls. The dialer processes leads one at a time, so a typical agent database never approaches the cap. Teams feeding thousands of portal leads a month should add a second number and split lead types between the two.
Not legal advice. Run your consent language and calling hours past your broker and an attorney first.
no. 10
Price the system against one closing.
One closing covers years.
Swap in your own numbers. For most agents, one closing covers years of calls.
example numbers. tap any one to swap in yours.
$102
Per month, calls plus a $2 number
$1,224
For a full year of follow-up
7.4 YRS
Of calls covered by one closing
Run a reactivation campaign on your old database first. Then let nurture handle every new lead from day one.
Build this agent live with us.
Follow-Up Protocol. Live builds.
Join The Aigent Labsee you inside. James