How Outbound Calls Work
When you send an outbound call through RevRing:- You specify the agent, from number (caller ID), to number (recipient), and optional variables
- RevRing initiates the call through your SIP trunk
- When the recipient answers, the agent begins speaking based on its first message and prompt
- The conversation proceeds according to your agent’s configuration
- After the call ends, RevRing sends complete call details to your post-call webhook (if configured)
Sending Test Calls via Dashboard
Using the Make a Call Page
The Make a Call page is the primary way to test outbound calls from the dashboard.- Navigate to Make a Call
- Select your Agent from the dropdown
- Enter the From Number (must be a number on your SIP trunk, E.164 format)
- Enter the To Number (the recipient’s phone number, E.164 format)
- Optionally set a Caller ID Name (up to 15 characters)
- Add Variables if your prompt uses dynamic content
- Click Send Test Call
Using the Test Panel
The test panel on the right side of the agent page lets you call your agent directly from the browser via WebRTC. This is useful for quick iteration — you can tweak the prompt and immediately test without needing a phone. Use Test Variables to setdirection, customer_name, or any other variables your prompt expects.
To test outbound calling over the phone network (with real caller ID and SIP routing), use the Make a Call page instead.
Sending Calls via API
For production outbound calling at scale, use the RevRing API.Basic Outbound Call
With Caller ID Name
You can set a custom caller ID name (up to 15 characters) that is displayed to the recipient when the call arrives:Caller ID name support depends on your SIP trunk provider and the recipient’s carrier. Not all carriers display the caller ID name.
With Custom Variables
id that you can use to track the call’s status.
See the API Reference for complete documentation.
Per-Call Content and Your Own Data
A single call can change what the agent says without editing the agent, and carry your own data:firstMessage: the opening line for this call (variables work as in the agent’s opening).promptAppend: added to the end of the agent’s prompt for this call only.maxDurationSeconds: the longest this call may run (10 to 7200).voicemailMessage: the message left if this call reaches voicemail.metadata: your own data, up to 16 KB. It is stored on the call, returned byGET /v1/calls/{id}and included in the call’s webhooks. The agent never sees it: usevariablesfor anything the agent should know.
Retrying Safely
Send anIdempotency-Key header (or idempotencyKey in the body) with a value unique to the call you mean to place. If the request is retried with the same key within 24 hours, for example after a timeout, the API returns the call already placed instead of dialing the number again. Two identical requests sent at the same moment also produce a single call.
Respecting Your Do-Not-Call List
Campaigns never dial a number on your do-not-call list. For single calls, set"honorDoNotCall": true and a number on the list is refused with 409 and "error": "number_on_do_not_call_list" instead of being dialed.
Steer or End a Call in Progress
Your system can talk to the agent while a call is live, for inbound and outbound calls alike. Send an instruction with the call’sid:
"speak": true(Say this now in the dashboard): the agent says it right away, in its own words. If it is in the middle of a sentence, it finishes first. If the caller talks over it before it is out, the agent brings it up again in its next reply, so the line is never lost."speak": false(default; Keep in mind in the dashboard): nothing is said out loud. The agent follows the note from its next reply for the rest of the call, like a whisper from a supervisor. Use it for context such as “the caller is a returning customer” or “offer the Thursday slot instead”.
instruction items, so you can see what was sent and when. To hang up a call from your system, use End Call. Both are also available as tools in the MCP server.
Watching Calls Live in the Dashboard
The dashboard’s Live page shows every call in progress, with its running time and what the caller and the agent are saying as they say it. From each call you can:- Listen to the call without anyone on it hearing you or knowing you are there.
- Tell the agent something: Say this now or Keep in mind (the same as
/instructionsabove). - End the call after a confirmation.
Configuring Outbound Agent Behavior
First Message
For outbound calls, the first message is critical since you’re initiating contact. Configure it in the Overview tab:Unlike inbound calls where leaving first message empty makes sense, outbound calls should almost always include a first message to properly introduce the purpose of the call.
When the Phone Is Still Ringing
Some carrier routes report a call as answered before the person has actually picked up, occasionally by 15 seconds or more. Anything the agent says in that window is spoken into a ringing phone, and the person hears nothing or only the tail of the opening. Two settings control this, and both default to current behavior so existing agents are unchanged. Pause before speaking. SetfirstMessageDelayMs to wait that many milliseconds after the call is reported answered before the opening is spoken. Tune it to the route: start around 2000 to 3000 and adjust. If the person speaks during the pause, the opening is skipped and the agent simply replies to them, so the two never talk over each other.
startSpeaker to "user" and the agent stays silent until the person says something, then opens the conversation from its prompt. Nothing is spoken during ringing at all. The re-engagement prompt is held as well, so the silence is genuine rather than a short delay.
beginAfterUserSilenceMs and the agent opens the call itself once the person has said nothing for that many milliseconds (500 to 60000). If they speak first, the agent replies to them as usual. With a static first message the agent speaks it; otherwise it generates its opening from the prompt. Leave it unset to keep waiting. Keep it shorter than the silence end call timeout, otherwise a silent call ends before the agent speaks.
startSpeaker when you would rather the person open it. A third option needs no settings at all: keep the opening to a short line such as “Hi, is this Alex?” so that little is lost if part of it is missed.
Different Opening Settings for Outbound Calls
An agent that handles both directions can open each one differently: greet inbound callers straight away, but wait for the person to say “Hello?” on calls it places.startSpeakerOutbound and firstMessageDelayMsOutbound apply to outbound calls only. Left unset, outbound calls use startSpeaker and firstMessageDelayMs like every other call, so existing agents are unchanged. In the dashboard, tick Use different opening settings for outbound calls on the Overview tab.
Per-Call Opening Overrides
POST /v1/calls accepts startSpeaker, firstMessageDelayMs and beginAfterUserSilenceMs to change how a single call opens, for example a longer pause for a list known to answer late, without editing the agent. For each setting, a value sent with the call takes precedence over the agent’s outbound setting, which takes precedence over its general setting. The agent’s saved settings are unchanged.
Separate Inbound and Outbound Openings
Agents that handle both directions often need different openings: “Thank you for calling…” inbound versus “Hi, this is … calling from …” outbound. Set the Outbound First Message field (API:firstMessageOutbound) with the outbound text, and keep First Message as the inbound text. On outbound calls the agent speaks the outbound text; on inbound calls (or when the outbound field is empty) it speaks First Message, so existing agents are unaffected until you set it.
Both fields support {{variables}} with the same substitution as the prompt, so per-call personalization works in either direction. This applies to static first messages; in dynamic mode the opening is generated from the prompt, which can branch on the {{direction}} variable instead.
Outbound-Specific Prompts
Tailor your prompt for outbound scenarios:Using Variables for Personalization
Variables allow you to customize each call without changing the agent configuration:- Reference variables in your prompt and first message using
{{variable_name}}syntax - Pass variable values when sending the call via API or dashboard
- The agent will replace placeholders with the actual values during the conversation
- Customer name, account number, order ID
- Appointment dates and times
- Custom messages or offers
- Callback reasons or context
Voicemail Detection
Voicemail detection is particularly useful for outbound calling to avoid wasting resources on unanswered calls.Enable Voicemail Detection
- Navigate to the Tools tab
- Locate Voicemail Detection under System Tools
- Click Configure
- Choose your action:
- Hangup: End the call immediately when voicemail is detected (saves costs)
- Leave Message: Speak a pre-recorded message before hanging up
- If leaving a message, configure the voicemail message:
The voicemail message supports
{{variables}}, just like your prompt and first message. Variables are filled in from the call’s variables (for example,first_name). If a variable has no value, the placeholder is left as-is. - Click Save
When Nobody Speaks
Some voicemail systems answer without any greeting the agent can hear, so there is nothing for voicemail detection to key on. The platform closes these calls automatically: if nobody has spoken by the third re-engagement attempt (and the call is at least 20 seconds old), the agent says a short sign-off and ends the call with hangup causeSILENCE_TIMEOUT. This applies only while the other side has said nothing at all. Once a person has spoken, the agent stays patient through quiet stretches and keeps re-engaging normally.
Call Pacing and Concurrency
Understanding Concurrency Limits
RevRing enforces a concurrency limit on the maximum number of simultaneous calls per organization. You can view your current limit and usage on the Billing page.Call Queuing
When you send an outbound call and all concurrent call slots are in use, RevRing automatically queues the call. Queued calls are dispatched in approximate order as slots become available. While a call is waiting, its status isQUEUED. Once a slot opens and the call is dispatched, the status transitions to INITIATED and then ONGOING when the recipient answers.
Queued calls have a maximum wait time of approximately 4 hours. If a slot does not open within that window, or if the call fails to dispatch for another reason, the call transitions to
FAILED rather than remaining QUEUED indefinitely. Inspect the errorMessage field to see why.Only calls with status
QUEUED can be cancelled. Once a call moves to INITIATED or ONGOING, it cannot be cancelled through this endpoint.Keeping Lines Free for Inbound Callers
If the same organization makes outbound calls and also takes inbound calls or website calls, a busy dialer can use every line. An inbound reserve keeps a number of lines that outbound calls (API calls, campaigns and tests) never take, so callers and website visitors always get through. Inbound and website calls can still use every line. Contact support to set the reserve for your organization;GET /v1/analytics/active reports it as concurrency.inboundReserve, and concurrency.limit is what outbound calls may use.
Opting Out of Queuing
If you prefer to handle queuing in your own system, passskipQueue: true when creating the call. This tells RevRing to return an immediate 429 error instead of queuing when the concurrency limit is reached:
Best Practices for High Volume
- Leverage built-in queuing: Let RevRing queue calls automatically rather than managing pacing yourself
- Monitor active calls: Track concurrent calls via the Analytics API
- Cancel unnecessary queued calls: If priorities change, cancel queued calls that are no longer needed
- Handle errors gracefully: Implement retry logic with exponential backoff for non-queued calls
- Respect time zones: Schedule calls during appropriate hours for the recipient’s location
Monitoring Outbound Calls
Why a Call Failed
When a call ends with statusFAILED, its errorMessage (in the API, the dashboard and the post-call webhook) says why. Reasons that come from your carrier or the person you called are plain sentences; the others are short codes.
Real-Time Monitoring
View active outbound calls on the Overview page:- Active Calls: See current ongoing outbound calls
- Filter by agent to monitor specific campaigns
Calls
Track all outbound calls in Calls:- Filter by Direction: Select “Outbound”
- Filter by Status: View completed, failed, ongoing, or canceled calls
- Filter by Agent: Focus on specific agents or campaigns
- Click any call to view:
- Complete transcript
- Call recording
- Duration and timestamps
- Variables used
- Hangup cause and error messages (if applicable)
GET /v1/calls?hangupCause=VOICEMAIL_DETECTED (several, comma-separated). The CSV export (GET /v1/calls/export) takes the same filter. The dashboard Overview shows your Voicemail Rate: the share of answered outbound calls that reached a voicemail box.
Success Metrics
Monitor key metrics to optimize your outbound campaigns:- Connection rate: Percentage of calls that connect vs. no answer/busy
- Average duration: Typical call length for successful connections
- Completion rate: Calls that reach the intended outcome
- Cost per call: Track expenses across campaigns
Advanced Features
Post-Call Webhooks
Receive call results immediately after each call ends:- Configure Post-call Webhook URL in the Advanced tab:
- RevRing will POST complete call details including:
- Transcript
- Recording URL
- Call duration and timestamps
- Variables used
- AI-generated summary
- Update your CRM with call outcomes
- Trigger follow-up actions
- Track campaign performance
- Schedule callbacks for unsuccessful attempts
Call Transfer
Enable transfers to allow the agent to escalate to a human representative:- Navigate to the Tools tab
- Click Configure on the Transfer tool
- Add transfer routes:
- To number:
+12025559999(your sales team) - Condition:
When the customer wants to speak with a human or has complex questions
- To number:
- Click Save
End Call Control
Configure when the agent should end calls:- Navigate to the Tools tab
- Click Configure on the End Call tool
- Set custom end call rules:
- Click Save
Compliance and Best Practices
Legal Requirements
When making outbound calls, ensure compliance with:- TCPA (US): Obtain prior express written consent for marketing calls
- TSR (US): Maintain do-not-call lists and honor opt-out requests (RevRing can add callers who ask automatically)
- GDPR (EU): Respect data protection and privacy regulations
- Local regulations: Follow country-specific telemarketing laws
Best Practices
- Respect time zones: Call during appropriate hours (typically 9 AM - 9 PM local time)
- Honor opt-outs: Immediately stop calling anyone who requests removal
- Clear identification: Always identify your company and purpose clearly
- Keep it brief: Respect the recipient’s time with concise, focused calls
- Professional tone: Use appropriate language and maintain a professional demeanor
- Quality over quantity: Focus on successful conversations, not just call volume
Common Use Cases
Appointment Reminders
Sales Follow-Up
Survey and Feedback
Payment Reminders
Troubleshooting
Calls fail to connect
Calls fail to connect
- Verify the from number is assigned to your SIP trunk
- Ensure the to number is in valid E.164 format
- Check your SIP trunk has sufficient capacity and balance
- Review your telephony provider’s outbound restrictions
- Confirm the destination country is allowed by your provider
Voicemail detection not working
Voicemail detection not working
- Ensure voicemail detection is enabled in the Tools tab
- Verify the action (hangup or leave message) is configured
- Check the call recording to confirm voicemail was actually reached
- Some voicemail systems may not be detectable - this is a known limitation
Variables not populating
Variables not populating
- Verify variable names match exactly between API call and prompt (case-sensitive)
- Check that variables are passed in the API request body
- Ensure variable syntax in prompt uses double curly braces:
{{variable}} - Review the call transcript to see what was actually spoken
High failure rate
High failure rate
- Check if you’re calling valid, reachable numbers
- Verify caller ID (from number) is not flagged as spam
- Consider time of day - avoid early morning or late evening
- Review hangup causes in call logs to identify patterns
- Ensure your first message clearly identifies the caller
Hit concurrency limit (429 error)
Hit concurrency limit (429 error)
- Implement exponential backoff and retry logic
- Reduce call pacing or batch size
- Check your current limit and usage at Billing
- Monitor active calls before sending new batches
- Contact support to discuss increasing your organization’s limit
Next Steps
Tools
Configure transfer, voicemail, and custom tools
Webhooks
Implement post-call webhooks to capture results
API Reference
View complete API documentation for sending calls
Calls
Query and analyze call history via API