Launch and monitor AI calling campaigns from a Google Sheet

By General Input

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.

Integrations

  • Bland AI
  • Google Sheets
  • Slack Bot

Type

App

Categories

  • Sales
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board