# 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.

- Workflow type: code
- Services: Retell AI, Google Sheets
- Categories: Sales, Operations
- Published: 2026-07-08

## What it does

- 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 you'll need

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

## Prompt

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.

## How to customize

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

## FAQ

### 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.

Use this prompt in General Input: https://www.generalinput.com/prompts/run-daily-outbound-calls-from-google-sheets-with-retell-ai