Run daily outbound calls from Google Sheets with Retell AI

Every weekday morning, Geni pulls pending leads from your Google Sheet, launches personalized Retell voice calls, and writes call IDs back.

Deterministic Code
Retell AIGoogle SheetsSalesOperationsData Sync
PromptCreate

Build a code workflow that runs my daily outbound call queue from a Google Sheet, using Retell AI to place the calls. Every step should be deterministic. This is a fixed pipeline with no LLM reasoning.

Trigger: cron, every weekday (Monday through Friday) at 9am America/New_York.

Step 1. Read the Call Queue tab from my Google Sheet using Google Sheets' Get Values operation. The columns are Name, Phone, Company, Talking Points, Status, and an optional Timezone column.

Step 2. Filter to rows where Status is exactly 'Pending'. Skip everything else so already-dialed rows never get called twice.

Step 3. Apply a configurable daily call cap (default 50) so we stay comfortably under Retell's workspace concurrency limit. Trim the pending queue to that cap.

Step 4. For each remaining row: if a Timezone column is present and set, skip the row when it is not yet 9am in that timezone (the row stays Pending and will be picked up on a later run). Otherwise, call Retell AI's Create Outbound Phone Call operation using a configured from_number and override_agent_id, passing the row's Phone as to_number and passing Name, Company, and Talking Points as dynamic variables (retell_llm_dynamic_variables) so the agent script personalizes per lead. Capture the call_id returned by the create-call response.

Step 5. Write the results back to the same row using Google Sheets' Batch Update Values operation: the returned call_id, the launch timestamp in ISO 8601, and Status set to 'In Progress'.

Configuration inputs I want to be able to tweak: the Google Sheet ID and tab name, the Retell from_number in E.164 format, the Retell override_agent_id, the daily call cap (default 50), and the cron time and timezone.

What does this prompt do?

  • Every weekday at 9am, reads the call queue tab in your Google Sheet and picks up rows marked as pending.
  • Launches a personalized voice call with your Retell agent for each lead, passing name, company, and talking points into the script.
  • Writes the call ID, launch time, and a new status back to the same row so you always know who was dialed and when.
  • Caps the run at a configurable daily volume and honors an optional timezone column so west coast leads are dialed at 9am local.

What do I need to use this?

  • A Google account with edit access to the sheet that holds your call queue.
  • A Retell AI account with a configured voice agent and an outbound phone number.
  • The tab name and column headers you use for name, phone, company, talking points, and status.

How can I customize it?

  • Change the run time or add extra runs, for example 9am and 2pm.
  • Set your own daily call cap to match your Retell plan and team capacity.
  • Add or rename columns you want the voice agent to reference during the conversation.

FAQs

Does this work with any Retell voice agent?
Yes. You supply the agent ID for the voice, script, and behavior you want to use, and every call in the run goes through that agent.
How does the voice agent know what to say for each lead?
Each row's name, company, and talking points are passed to Retell as dynamic variables. Your agent script references those variables to personalize the call for that specific lead.
Will it stop dialing before I hit my Retell concurrency limit?
The daily cap is configurable so you stay comfortably under the workspace concurrency ceiling. Leads not dialed today remain pending and get picked up on the next run.
Can I run calls at 9am local time for each lead?
Yes. Add an optional Timezone column to your sheet and calls will wait until 9am in the lead's local timezone before dialing that row.
What happens to rows that already have a status?
Only rows marked as pending are dialed. Rows already marked as in progress, completed, or anything else are skipped, so nobody gets called twice by accident.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App
LinkedIn Ads budget pacing dashboard for every client account

See every LinkedIn ad account's spend against the budget you committed to, catch overspend early, and rebalance without rebuilding a spreadsheet.

LinkedIn Ads
Google Sheets
Slack Bot
App

Stop dialing your outbound list by hand.

Connect Google Sheets and Retell AI once, and Geni runs your call queue every weekday at 9am.