What Weβre Building 
A fully automated outbound voice agent that
- dials prospects, greets them by name and delivers a scripted offer
- converses in real time through an Ultravox WebSocket session
- is orchestrated by an n8n workflow (free trial β affiliate link) that glues together
- Google Sheets β lead list (
FirstName
,PhoneE164
,Status
) - Ultravox β AI voice agent (free sign-up)
- Twilio β telephony with dynamic TwiML (free sign-up)
- Google Sheets β lead list (
The same workflow can run a single test call or fan out to batch campaigns with no human intervention.
How It Works 
- Trigger β manual click, schedule or webhook starts the workflow.
- Fetch Lead β Google Sheets node pulls the next row.
- Spin Up Voice Session β HTTP node opens an Ultravox WebSocket and returns a
session_url
. - Assemble TwiML β n8n builds a
<Dial><Number>
block that bridges Twilio to the Ultravox session. - Place Call β Twilio dials the prospect and hands over the TwiML.
- Post-Call Actions β update the sheet, log transcripts or branch to follow-ups.
What This Unlocks 
- Hyper-scalable outreach β queue hundreds of concurrent calls
- Consistent compliance β every sentence comes from your approved system prompt
- Instant iteration β tweak Belleβs voice or script in seconds
- Rich analytics β capture recordings, transcripts and outcomes for A/B tests
Typical Use Cases
Scenario | Example |
---|---|
Sales blitz | Solar rebate campaign (Belle) |
Collections | Friendly payment-due reminders |
Customer research | Automated NPS surveys |
On-boarding | βWelcomeβ walkthrough calls for new app users |
Prerequisites 
- n8n cloud or self-hosted instance with credential manager β get a free trial via this affiliate link: Powerful Workflow Automation Software & Tools - n8n
- Google Cloud service account with Sheets API access
- Ultravox account, API key and one agent (voice + prompt)
- Twilio account with an Australian voice-enabled number
- Basic JSON skills and a text editor
Step-by-Step Guide 
1 β Prepare the Lead Sheet
- Create a sheet called OutboundCalls.
- Add columns:
FirstName
,PhoneE164
(e.g.+61212345678
),Status
. - Share the sheet with your service-account email (Editor access).
2 β Create the Ultravox Agent
- Ultravox console β Agents β New Agent.
- Name: AI Belle.
- Voice: any neural French-accent voice.
- System prompt:
You are Belle, a friendly professional solar-energy outreach agent.
Greet the user by first name, ask two qualifying questions,
then end politely if uninterested.
- Save and copy the Agent ID for n8n.
3 β Configure Twilio
- Buy or verify a voice-capable AU number.
- Note your Account SID, Auth Token and Phone Number.
- Voice β Settings: allow HTTP POST from your n8n URL.
4 β Import the n8n Workflow
- In n8n: File β Import from File β outbound.json (save the JSON from this guide as
outbound.json
).
5 β Set Up Credentials in n8n
Node | Credential Type | Fields |
---|---|---|
Google Sheets | OAuth2 Service Account | Client Email, Private Key |
Ultravox HTTP | Generic API Key | Authorization: Bearer <token> |
Twilio | OAuth | Account SID, Auth Token |
6 β Node-by-Node Customisation
Trigger β start with Manual, switch to Cron later.
Retrieve Call Details β operation Lookup where Status
is blank, return first row.
Create Ultravox Session β HTTP POST
POST https://api.ultravox.ai/v1/agents/{{ ULTRAVOX_AGENT_ID }}/websocket
{
"sessionParameters": {
"agentPromptOverride": "Hi {{ $json.FirstName }} β¦",
"audio": { "sampleRate": 8000 }
}
}
Set Variables
firstName β {{$json.FirstName}}
targetPhone β {{$json.PhoneE164}}
sessionUrl β response.session_url
Prepare TwiML
<Response>
<Dial>
<Number url="{{ $json.sessionUrl }}">{{ $json.targetPhone }}</Number>
</Dial>
</Response>
Make Call (Twilio node)
- From: your Twilio number
- To:
={{$node["Set Variables"].json["targetPhone"]}}
- TwiML: output of the previous node
7 β Testing
- Click Execute Workflow.
- Your phone rings β Belle greets you by name.
- End the call and mark the sheet row
Completed
.
8 β Batch Campaign (Optional) π
- Change Trigger to Cron (e.g. every 5 minutes).
- Add Split In Batches (size 5) before the Ultravox session to limit concurrency.
9 β Post-Processing Ideas
- Append call result and timestamp back to the sheet
- Store transcripts from the Ultravox webhook for sentiment analysis
- Send a Slack alert with the outcome
Next Steps 
- Track connection rate, talk time and conversion against human callers
- Swap Google Sheets for Airtable or Postgres by changing the βFetch Leadβ node
- Add a do-not-call scrub and time-of-day guardrails for AU compliance
Download the full n8n workflow here:
Outbound Call Prompt Template:
## 1. Role Overview
**You are** `[Agent Name]`, the outbound call agent for `[Company Name]`.
**Objective**: Reach out to prospects, qualify interest, and arrange next steps on behalf of `[Company Name]`.
## 2. Key Responsibilities
- **Initiate Calls**
- Use Twilio (or your chosen platform) to place outbound voice calls
- Open with the approved script
- **Qualify & Capture Information**
- Confirm contactβs name via `{{$json.Name}}` (or equivalent)
- Assess interest in the offer or topic at hand
- **Schedule Next Steps**
- Propose meeting slots only when pre-approved
- Send calendar invites with correct time zone and link
- **Log Outcomes**
- Record call notes, urgency, and follow-up actions in CRM
## 3. Persona & Communication Style
- **Tone**: Polite / Friendly / Professional (choose per brand)
- **Style**: Clear and efficient β state purpose within 30 seconds
- **Approach**:
- Personalise with the prospectβs name
- Respect their time and confirm agreed next steps
## 4. Core Call Flow
1. **Greeting & Introduction**
> βHi `{{$json.Name}}`! This is `[Agent Name]` from `[Company Name]`. Iβm calling to share `[brief purpose]`. May I ask you a few quick questions?β
2. **Qualify & Record**
- **Name** (already personalised)
- **Company / Context** (if known)
- **Contact Info** (phone / email)
- **Reason for Call** (brief summary)
- **Urgency** (ASAP / By date / Low)
3. **Next Steps**
- **If Pre-approved to Book**
> βI have two slots on `[Date]` at `[Time1]` and `[Time2]` in `[Time Zone]`. Which works best?β
- **If Approval Needed**
> βIβll check availability and get back to you within `[timeframe]`.β
4. **Confirmation & Close**
> βThanks for your time, `{{$json.Name}}`. Iβll send over a calendar invite and follow up with any details.β
## 5. Call Note Format
```yaml
Message for [Executive/Team]:
- Name: {{$json.Name}}
- Company/Role: [If known]
- Contact: [Phone/Email]
- Reason: [Brief summary]
- Urgency: [E.g., Wants reply by Friday]
- Next Steps: [Meeting confirmed / Approval pending]