Last Dispatch
Quick Test ?Dispatches one real call to a phone number you type. Uses the first campaign's pathway and Bland's default caller ID. Bypasses all source filters — you are explicitly opting in by typing the number. A confirmation screen appears before the call.
Send a test call using the Bland default number. Uses the first configured campaign's pathway.
Recent Activity
Bland API Key ?The org-level key used for every campaign. Get it from app.bland.ai → Settings. Saving validates the key against Bland's API — invalid keys are rejected before they overwrite a working one.
Shared across all campaigns. Paste the full key to replace the stored one. Never displayed once saved.
Invite User
Users
First-time setup
- Go to Settings and paste your Bland API key. The value is validated against Bland before it saves. If it says rejected, copy the key again from app.bland.ai → Settings.
- Click + New Campaign in the sidebar. Name it something descriptive (e.g. "Smoke test", "Week 1 — 500/week").
- Pick a Source (CSV / GHL / HubSpot / API). Fill in the credentials for that source.
- Pick a Pathway (from your Bland account) and a Voice.
- For your first run: add a Phone allowlist with only your own number(s). Any contact returned by the source that is NOT in this allowlist will be dropped before dispatch.
- Click Dry Run first, then Test (1). Both show a confirmation screen. Click Go Live only after dry-run + test pass.
Campaign fields
Source
Where contacts are pulled from when you dispatch. Changing source does not clear CSV rows you already uploaded; use Clear in the CSV panel to wipe them.
Pathway
Bland conversation pathway. Pulled live from your Bland account. Changing the pathway takes effect on the next dispatch; in-flight calls are not affected.
Voice
Bland voice ID. Free-tier voices (ryan, maya, mason, tina) work on every account; custom/cloned voices appear only if your Bland org has them.
From Number
Outbound caller ID. Must be a number your Bland org owns (inbound number). Leave blank to use Bland's default pool. If Bland returns "you might not own this number," the value is wrong.
Max Duration
Hard cap in minutes. The call is force-ended at this limit. 15 is a sane default for outreach.
Record
When on, Bland saves the audio recording. Always on is recommended for QA.
Dispatched tag
Tag applied to the contact in GHL after dispatch. Also used as the dedup marker — contacts with this tag are skipped next time. Recommended: bland - called.
Batch size
How many calls the Go Live button dispatches in one click. For scheduled runs, see the separate "Batch per run" on the Schedule section.
Safety rails
Three gates, applied in this order:
- Exclude tags — any contact whose tag list contains one of these is dropped.
- Include tags (optional) — if set, a contact must carry at least one of these to be eligible. Leave empty to skip this gate.
- Phone allowlist (optional) — if set, the final contact list is filtered to only numbers you list. Bulletproof guard for first-time tests.
The worker also:
- Normalizes every phone to E.164 (
+15551234567) before dispatch. Invalid numbers are dropped with a warning. - Tags in GHL before calling Bland, so a tagging failure stops the call instead of causing a duplicate on the next run.
- Shows a full confirmation screen before every Test / Go Live / Quick Test — nothing dispatches without an explicit Continue click.
- Disabled campaigns (toggle off at top of the page) cannot be Go-Live dispatched manually.
- Non-admin users can view everything but cannot dispatch.
GHL (GoHighLevel) source
GHL API Key
Location-level API key from GHL (pit-... format). Agency / company-level keys will not authenticate against the contacts endpoint.
Location ID
GHL sub-account ID. Found in GHL under Settings → Business Info or the URL when viewing the sub-account.
User ID (assigned-to)
The worker queries POST /contacts/search filtered by assignedTo = <this user>. Every contact assigned to that user is returned (paged). Pick a user that has only the contacts you want called, or combine with Include Tags / Allowlist to narrow further.
HubSpot source
Access Token is a private-app token. Filter "all" returns every contact; "by owner" requires a HubSpot user ID and narrows to contacts owned by that user.
Deduped locally against a contacts table — once a phone has been dispatched via this source, it won't be re-fetched.
CSV source
Paste CSV, click Preview to see columns and map them to Name / Phone / Email. Click Upload to store them. Each phone is normalized to E.164 at upload time — rows with numbers that can't be normalized are reported in the skipped count.
Max 5 MB per upload (~50k rows). Split large files. Clear deletes every CSV contact attached to this campaign (does not affect GHL/HubSpot).
Custom API source
Any JSON endpoint that returns an array (or an object with an array at some path). Configure:
- URL — full https URL.
- Method — GET or POST.
- Headers — JSON object for auth headers, e.g.
{"Authorization":"Bearer ..."}. - Contacts path — JSONPath-lite to the array. Examples:
$(the response itself is the array),$.data,$.results.contacts. - Name / Phone / Email field — property names on each contact object.
Scheduling
When schedule_enabled is on and the campaign enabled toggle is on, the worker fires at the top of every hour listed in Dispatch times on the selected days, in the selected timezone. Each fire dispatches up to Batch per run contacts.
Two dedups protect against double-firing: the worker skips a campaign if it already dispatched within the last 50 minutes, and contacts that were tagged with the Dispatched tag are dropped on refetch.
Dispatch modes
Preview
Fetches contacts from the source and shows them in-line. No calls, no tagging. Safe and free.
Dry Run
Same fetch as a real dispatch (applies exclude / include / allowlist / phone validation), but stops before any Bland call. Best "does my filter work?" check.
Test (1)
Dispatches a single call to the first eligible contact. Uses Bland's single-call endpoint. Shows confirmation screen first.
Go Live
Dispatches up to Batch size calls via Bland batch endpoint. Shows confirmation screen first. Requires campaign enabled and admin role.
Quick Test (Dashboard)
Dispatches a single call to a typed phone number using the first campaign's pathway and Bland's default caller ID. Bypasses source filters — you explicitly typed the number.
Tags (exclude / include)
Exclude tags: drop any contact that has one of these tags. Add your usual DNC / landline / no-voice tags here. A "Suggested" row shows common picks.
Include tags: when set, only contacts that have at least one of these tags are eligible. Leaving empty means "every tag is allowed."
Tag matching is case-sensitive and exact. DNC does not match dnc. Copy tag spellings from GHL directly.
Phone allowlist
A list of E.164 numbers. When non-empty, only these numbers can be called by this campaign. Applied after source fetch and tag filtering. Intended for first-run safety — add your own numbers here, verify the confirmation screen, then clear the allowlist and go live.
Accepted formats (all normalized to E.164 at save):
+15551234567(ideal)5551234567→+15551234567(assumes NANP)(555) 123-4567→+15551234567+44 20 7946 0958→+442079460958
Confirmation screen
Test and Go Live show a confirmation dialog before any call is placed. The dialog shows:
- Mode (test vs live) and contact source.
- Counts at each gate: fetched → valid phone → passed allowlist → would dispatch.
- Pathway name, voice name, from number, max duration.
- A list of every contact that will be called. Click the tags chip on any row to expand the full tag list for that contact.
Cancel stops the action. Continue places the calls.
Troubleshooting
"Bland rejected the key"
Wrong value in Settings. Copy fresh from app.bland.ai → Settings.
"Invalid 'from' — you might not own this number"
The From Number is not provisioned on your Bland org. Leave it blank, or pick one from the dropdown (which lists inbound numbers only).
Dry Run shows 0 contacts
Usually one of: GHL assigned-to filter returned nothing, all contacts had the dispatched tag already, or include_tags filtered them all out. Use Preview (which skips filters) to see the raw pull.
"All GHL tag attempts failed"
Your GHL key is read-only or the location_id is wrong. Permissions for the tag endpoint are separate from read; generate a key with write permission on Contacts / Tags.
"Campaign is disabled"
Flip the toggle at the top of the campaign page. Disabled campaigns can still be Test-dispatched (admin + confirmation), but Go Live is blocked.
Scheduled dispatch didn't fire
Check: campaign enabled + schedule_enabled both on, current day is in Days, current hour in campaign's timezone matches one of Dispatch times, and it hasn't fired within the last 50 minutes. Scheduled runs also email all admins.
Confirm dispatch
Review every contact that will be called. Nothing has been dispatched yet.