Launch and monitor AI calling campaigns from a Google Sheet
Pick a call list, map your columns, and dispatch. Watch every call land in real time, read transcripts, and stop the whole campaign in one click.
Build me an app my operations team opens to launch and babysit outbound AI calling campaigns with Bland AI, instead of uploading a CSV to the Bland dashboard and then squinting at call logs on a separate screen. The app covers list preparation, dispatch, live progress and the kill switch. Working through the results after a campaign has ended is deliberately out of scope.
Call lists (home screen)
The home screen lists the Google Sheets call lists the team has saved in the app. Saving a list means pasting a spreadsheet URL or id and giving it a friendly name, stored in app storage, because there is no operation for browsing Drive. For each saved list show the friendly name, the spreadsheet title, its tabs, and the last campaign run from it. Use Google Sheets Get Spreadsheet to pull the spreadsheet title and tab names.
Campaign setup
Picking a list opens setup. The user chooses a tab, and the app reads the top rows of that tab with Google Sheets Get Values to get the headers and sample data. Present a column mapping panel where sheet columns are mapped to per call variables: phone is required, first name, last name and company are the common ones, and the user can add extra custom variables that get passed into the call. Guess the mapping from the header names and let the user correct it. Remember the last mapping per spreadsheet and tab so a repeat campaign is one click.
Show a preview of the first five to ten mapped rows exactly as they will be sent, so the user can confirm the variables resolve to sensible values before anything dials. Setup also collects the campaign name, the Bland call script or pathway to run, the from number, and the call settings the team changes often such as voice, max duration and whether to record.
Pre launch validation
Validate every row before the launch button is enabled, and show the result as a clear breakdown of ready, flagged and suppressed rows.
Normalise every phone number to E.164 using a default country code the user picks. Bland rejects anything that is not E.164, so this has to happen before dispatch rather than after.
Flag rows with a missing or malformed number into a Needs attention list showing the row number and the raw value. Flagged rows are excluded from dispatch and never silently dropped. Let the user fix the sheet and re-run validation.
Suppress numbers already called recently. Read recent calls with Bland AI List Calls filtered by date, build the set of numbers already dialed inside the suppression window, and hold matching rows back. Default the window to three days and make it editable. Show each suppressed row with the date it was last called.
De-duplicate numbers within the list itself so the same person is not queued twice in one campaign.
The launch button states exactly how many rows will actually be dialed and asks for confirmation before dispatching.
Dispatch
Dispatch sends the validated rows to Bland AI Create Batch as a single batch, with the shared call configuration and the per row variables from the mapping. Store the returned batch id on the campaign record along with the row mapping, so every dialed call can be traced back to its sheet row. Respect Bland's rule that outbound calls to the same number within ten seconds are rejected: pace dispatch so a repeated number is never sent twice inside that window, and keep the same pacing if a large list is split across several batches.
Live monitor
After dispatch the app switches to the monitor view for that campaign. Poll Bland AI Get Batch for progress counts and per call status, and Bland AI List Active Calls for what is on the phone right now, refreshing every few seconds while the campaign runs and backing off once it completes. The header shows completed, in flight, failed and remaining counts climbing, plus the connect rate. Below it, a row per call shows the person, number, status, duration and outcome, filterable by status.
Clicking a row opens a detail panel that calls Bland AI Get Call Details for the full transcript, metadata and analysis, so an ops person can read exactly what the agent said without leaving the app. That panel also has a stop button for the single call, using Bland AI Stop Active Call.
Kill switch
The monitor view carries a prominent kill switch, because the whole point of this screen is catching a script that is clearly going wrong. It offers two levels: stop this campaign, which runs Bland AI Stop Batch to cancel the pending calls in the batch, and stop everything, which runs Bland AI Stop All Active Calls to terminate every live call on the account. Both confirm first and spell out what will happen. Record who pulled it and when on the campaign record.
Wrap up
When a campaign finishes, or the moment someone pulls the kill switch, the app writes results back. Append one row per dialed contact to a results tab in the same spreadsheet with Google Sheets Append Values, carrying the original sheet row, the name, the number in E.164, call status, duration, outcome, and the Bland call id. Then post a short campaign summary to Slack with Slack Bot Send a Message: campaign name, list and tab, totals dialed, completed, failed and suppressed, connect rate, run time, and a note if it was stopped early and by whom.
History, persistence and behaviour
Keep a campaign history view listing past campaigns with their counts and status, held in app storage and refreshed against Bland AI List Batches, so the monitor view can be reopened for a campaign that is still running. Persist saved call lists, per tab column mappings, suppression window, default country code, results tab name and the Slack channel in app storage so the team is not re-entering settings on every run.
Guardrails matter more than speed here. Never dial a row that failed validation, never dial a suppressed number, always show the exact dial count before launch, and keep the kill switch reachable from anywhere in the monitor view.
What does this prompt do?
- Lists the call list spreadsheets your team has saved, lets you choose a tab, and matches columns like first name, company and phone to the details each call needs.
- Checks every row before you launch: phone numbers are cleaned into a standard international format, bad or missing numbers are flagged, and anyone already called in the last few days is held back.
- Shows a live campaign board where completed, in flight and failed counts climb as calls land, and lets you open any row to read the full transcript.
- Gives you a one click stop for the campaign, then writes each row's outcome back to your spreadsheet and posts a short summary to Slack.
What do I need to use this?
- A Bland AI account with calling enabled and a number you can dial from
- A Google account with your call list spreadsheets
- A Slack workspace and a channel for campaign summaries
- A call script or pathway set up in Bland AI for the campaign to run
How can I customize it?
- Change the suppression window, three days by default, so numbers called recently are not dialed again
- Choose which Slack channel gets the campaign summary and which results tab the outcomes are written to
- Adjust the required columns, the preview size, or add your own extra call variables such as renewal date or account owner
FAQs
Do I still need to upload a CSV to Bland AI?
What happens to rows with a missing or invalid phone number?
Can I stop a campaign once it has started?
Will it call the same person twice?
Where do the results end up?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Stop uploading CSVs and squinting at call logs.
Give your ops team one screen to prepare, launch, watch and stop every AI calling campaign.