Guides
Set up outbound batch calling in Thoughtly using CSV uploads, tag-based automations, and the Call Contact step — with throttling, outcome tracking, and CRM write-back built in.
Last updated
Teams running high-volume lead conversion need a way to call hundreds or thousands of contacts without dialing each one by hand. Whether you're an insurance agency chasing open-enrollment leads, a mortgage lender following up on rate-lock requests, or a home services company re-engaging stale estimates, manual outbound doesn't scale. Thoughtly's outbound batch calling combines Automations, contact segmentation, and the Call Contact step to let your AI voiceAI voiceAn artificially generated, natural-sounding voice produced by a TTS model. Thoughtly supports a library of AI voices and brand-specific cloning. agent work through a targeted list on a schedule you control.
This guide covers two approaches: a CSV bulk upload for one-time campaigns and a tag-based automation for recurring outbound programs. By the end, you'll have a working batch calling workflowWorkflowAn automated, multi-step process — usually triggered by an event (form fill, new lead) and orchestrating one or more voice / SMS / email actions. that reaches the right contacts, at the right time, with the right agent — and writes outcomes back to your CRMCRMThe system of record for leads, contacts, deals, and activity. Thoughtly reads from and writes to your CRM continuously. or data warehouse automatically.
Before configuring batch calling, make sure you have the following:
If you don't have an agent ready, start with How to Build a Speed-to-Lead AI Agent with Thoughtly to build one in under an hour.
The simplest way to run a batch call is to upload a CSV of contacts and launch a bulk calling campaign directly from Thoughtly. This approach works well for one-off campaigns: a list of leads from a trade show, a re-engagement file from your CRM, or a batch of appointment confirmations. Thoughtly's Bulk Upload and Bulk Calls promptbook walks through the full flow inside the platform.
Your CSV should include at minimum a phone number column. You can also include name, email, tags, and any custom attributes you want the agent to reference during the call. A typical CSV for an insurance lead re-engagement campaign might look like this:
first_name,last_name,phone,email,policy_type,last_quoted
Maria,Gonzalez,+15125551234,[email protected],auto,2026-04-15
James,Chen,+14155559876,[email protected],home,2026-03-22
Aisha,Patel,+17135554321,[email protected],auto,2026-05-01Once contacts are uploaded, you can launch a bulk call against the tagged segment. Select the agent that should handle the calls, choose the outbound phone number, and set any throttling or scheduling constraints. Thoughtly handles the dialing queue, voicemail detection, retries, and outcome tracking. You can monitor progress in History as calls complete.
For ongoing outbound programs — daily lead follow-up, weekly re-engagement, monthly appointment reminders — build a recurring automation that targets contacts by tag. This approach uses Thoughtly's Automations engine to query contacts, loop through results, and call each one with your AI agent. The Outbound Automation promptbook covers this pattern in detail.
Tag contacts in Audiences before you build the automation. Your tags define the segment. Examples:
You can tag contacts manually in Audiences, include tags in your CSV during bulk upload, or set tags via the Contacts API or a CRM integration.
Select Time → Recurring Schedule as the trigger. Set the frequency (daily, weekly, or monthly), the time window, and the timezone. If you're calling consumer leads, restrict to business hours in the recipient's timezone to stay compliant and improve answer rates. For example, a mortgage lender might run the automation every weekday at 10:00 AM Central.
Add a Send Webhook step that calls the Thoughtly Contacts API to retrieve all contacts with a specific tag. Configure it as follows:
https://api.thoughtly.com/contact?tags[]=New%20Lead%20-%20Auto%20Insurance&limit=100&phone_numbers_only=trueAfter configuring, use the Output tab on the Send Webhook node and click Refresh to verify the API returns contacts with the expected tag. Confirm that status shows 200 and the response includes a data.contacts array.
Add a Loop on Items step after the Send Webhook. In the Items field, click Insert VariableVariableA named value the voice agent stores during a conversation — caller name, intent, qualifying answers — and uses to drive routing and post-call actions. and select Send Webhook → response.data.contacts. This tells the loop to iterate over each contact returned by the API call. You can optionally set a limit to cap the number of contacts per run — useful when you're testing or want to throttle volume.
Before going live, tag two or three internal contacts with the target tag and toggle the automation from Draft to Live. Monitor the History tab to confirm calls are placed, transcripts look correct, and outcomes are recorded. Only then should you expand to the full segment.
Every outbound batch call originates from a phone number assigned to the agent's outbound profile. If the number isn't configured correctly, calls will fail silently or trigger a "Outbound calling is disabled for this phone number" error. Configure this in Settings → Phone Numbers:
For high-volume outbound campaigns, consider pairing your number with branded calling and call screening bypass to improve answer rates.
Batch calling is only useful if you know what happened on each call. Thoughtly gives you several ways to track and act on outcomes:
Track these metrics after running your first batch to evaluate performance and calibrate future campaigns:
| Metric | What it tells you | Healthy benchmark |
|---|---|---|
| Answer rate | Percentage of calls picked up by a live person | 25–45% for warm lists, varies by vertical |
| Voicemail rate | Percentage of calls that reached voicemail | 40–60% is typical; pair with voicemail drops |
| Qualification rate | Percentage of answered calls where the lead met your criteria | 15–30% for re-engagement; higher for inbound follow-up |
| Appointment set rate | Percentage of qualified calls that resulted in a booked meeting | 20–40% of qualified calls |
| Callback request rate | Percentage of leads who asked to be called back at a different time | Track separately; these are warm leads for the next batch |
| CRM write-back success | Percentage of calls where outcomes were pushed to your CRM | Target 100%; failures indicate webhook or integration issues |
Monitor these in Thoughtly's History and Analytics views, and export data for deeper analysis in your BI tool or CRM.
There's no hard platform cap on batch size, but practical limits apply. The Send Webhook step defaults to limit=100 per API call. For larger campaigns, run multiple automation cycles or increase the limit parameter. Start small (50–100 contacts) and scale up as you verify answer rates and agent performance.
Yes. Create separate automations for each campaign, each targeting a different tag. Assign different agents or knowledge bases to keep conversation scripts distinct. Use different outbound numbers if you want to track pickup rates per campaign.
Thoughtly's voicemail detection identifies whether the call reached voicemail or was simply unanswered. You can configure voicemail drops to leave a pre-recorded message and build a post-call automation to re-tag no-answer contacts for a retry batch. Most teams run two to three retry cycles before moving a contact to a "could not reach" segment.
Yes. Instead of a Recurring Schedule trigger, use a Webhook trigger on the automation. Your CRM, marketing automation tool, or custom backend can send a POST request to the automation's webhook URL to kick off the batch on demand.
Use post-call automation logic to remove or change the tag after a successful call. For example, after a call completes, strip the "New Lead" tag and add a "Called — June" tag. The next automation run will only pick up contacts that still have the original tag.