Create a campaign

About 10 minutesNo code neededUpdated July 2026

After this guide, your agent will be calling, WhatsApp-ing, or emailing a whole list of contacts on its own. You'll build the campaign in a step-by-step wizard — we'll walk through every screen.

WhatsApp campaigns are coming soon:
The WhatsApp channel is pending Meta app review, so WhatsApp campaigns are not yet available in the dashboard — voice and email campaigns are. The WhatsApp parts of this page describe how it will work once it launches.
Before you start, make sure you have:
A Qalyb agent — if you don't have one yet, follow Create your first agent (5 minutes). Note its required prompt variables: each one needs a matching column in your CSV.
A sender for your channel: a phone number for voice, or a WhatsApp channel or email inbox connected on the Deploy page
Your contacts as a CSV file — a phone_number column for voice and WhatsApp, an email column for email
For WhatsApp: an approved message template in WhatsApp Business Manager
Plans & roles:
outbound campaigns are included on the Pro, Ultra, and Enterprise plans. Admins and members can create and run campaigns; only admins can delete them.

Pick the right channel first

The channel decides how the campaign runs and which steps the wizard shows. Voice campaigns dial each contact live; WhatsApp and email campaigns send a message and wait for replies.

ChannelHow it runsWizard steps
Voice CallReal-time dialer. The agent calls each contact within an operating-hours window and can retry failed or unanswered calls.5 — Channel, Sender & Agent, Recipients, Schedule, Review
WhatsAppSends an approved WhatsApp template, then optional follow-ups if there is no reply. A reply hands the conversation to the agent.6 — Channel, Sender & Agent, Message, Recipients, Send Rules, Review
EmailSends a subject + body email from your inbox, then optional follow-up emails in the same thread until the contact replies.6 — Channel, Sender & Agent, Message, Recipients, Send Rules, Review
Open the wizard and pick a channel

In the dashboard, click Campaigns in the sidebar (Workspace group), then New Campaign at the top-right. The first screen shows three cards: Voice Call, WhatsApp, and Email. Your pick sets the rest of the wizard.

app.qalyb.ai/campaigns/new
Screenshot: New Campaign wizard step 0 showing three channel cards: Voice Call, WhatsApp, and Email
The first step of the wizard — choose the channel. Your choice sets the remaining steps.
Name it and choose the sender and agent

Enter a Campaign Name (required, up to 100 characters) and an optional Description. Pick the sender — a Phone Number and Default Country for voice, a WhatsApp Channel for WhatsApp, or an Email Inbox for email. Then choose the agent that will handle the conversations. Its required and optional prompt variables appear as pills, so you know which CSV columns you'll need.

app.qalyb.ai/campaigns/new
Screenshot: Sender and Agent step with a selected agent and required and optional variable pills
The agent's required prompt variables show as pills. Each one needs a matching CSV column.
Write the message (WhatsApp and email only)

For WhatsApp, enter the Template Name and Language Code (for example en or ar), then map the template's {{1}}, {{2}} variables to CSV column names. For email, write a Subject and Body using {{column}} placeholders. Both show a live preview as you type.

Upload your contacts

Upload your CSV — the Template button downloads a starter file with the right columns. A name column is optional, and any extra columns become per-contact data your agent and messages can use:

recipients.csv · text
phone_number,name,appointment_time
0501234567,Sara,"Tuesday 3pm"
0559876543,Omar,"Wednesday 11am"
+971501112233,Layla,"Thursday 5pm"

The right-hand pane previews every parsed contact and flags each row as valid, invalid, duplicate, or assumed (a local number converted using your Default Country). You can upload up to 50,000 contacts per campaign.

app.qalyb.ai/campaigns/new
The recipient preview flags invalid, duplicate, and assumed rows before you launch.
Choose when it goes out

Voice campaigns get a Schedule step: send immediately or schedule for later, set Operating Hours for the daily call window, and optionally turn on Retry Failed Calls. WhatsApp and email get a Send Rules step: a Send Window, a Campaign Expiry, and an optional follow-up cadence. The details for both are just below.

Review and launch

The final step shows a Campaign Summary table. Check the details, then click Launch Campaign. You land back on the campaigns list with the new campaign running.

Campaign launched:
watch it live from the campaigns list — voice campaigns show a Call Log with one-click retries; WhatsApp and email campaigns show a Sent → Delivered → Read → Replied funnel. From the detail header you can Cancel an active campaign or Export its data to Reports.

Picking the sender

ChannelSender fieldNotes
VoicePhone Number + Default CountryThe number must be active and owned by your organization. GCC countries are listed first; Default Country converts local numbers (for example 05xxxxxxx +966xxxxxxx).
WhatsAppWhatsApp ChannelThe list shows your connected WhatsApp channels.
EmailEmail InboxShown as display name <address>.
Invalid contacts block the launch:
the Launch button stays disabled while any row is invalid — fix or remove the flagged rows and re-upload. Duplicates are removed automatically (the first occurrence is kept). If a required agent variable has no matching CSV column, creation fails with Contacts are missing required agent variables.

Timing for voice campaigns

  • Send immediately or Schedule for later — scheduling adds a Timezone and a Start Date & Time, which must be in the future.
  • Operating Hours — a daily call window (start and end). Set both or neither; calls outside the window are held until the next window opens.
  • Retry Failed Calls — when on, set Max Attempts (1–5) and Wait Between Retries (5 minutes to 24 hours). Only failed and no-answer calls are retried.

Send rules for WhatsApp and email

  • Send Window — quiet hours that hold messages until an allowed time.
  • Campaign Expiry — choose No expiry or 3, 7, 14, or 30 days.
  • Follow-up cadence — toggle Follow up if no reply to add up to 10 steps. Each step has a wait (minutes, hours, or days; minimum 5 minutes) and its own content: WhatsApp steps take their own approved Template Name, Language Code, and variable mapping; email steps take an optional Subject and a Body sent in the same thread.

Follow-ups stop automatically as soon as a contact replies, opts out, bounces, or fails. A reply is the goal — it hands the conversation to your agent and cancels any pending nudges. For the full guide to cadences, see Contacts & follow-ups.

WhatsApp templates & email follow-ups:
every WhatsApp message — the first send and each follow-up — must be a separately approved template in WhatsApp Business Manager, because of WhatsApp's 24-hour messaging window. Approve them all before launching. Email follow-up steps currently reuse the campaign's base subject and body, even if you set per-step values in the wizard.

For developers

The wizard posts to POST /campaigns. The request body is keyed on channel, so voice, WhatsApp, and email each require different fields — voice needs callWindowStart and callWindowEnd together, WhatsApp needs a messagingChannelId plus template config, and email needs an emailInboxId plus subject and body. The endpoint requires the campaigns:write permission, and invalid phone numbers are rejected with the offending rows listed.

curl · bash
curl -X POST https://api.qalyb.ai/campaigns \
  -H "Authorization: Bearer sk-live-..." \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "voice",
    "name": "Eid Renewal Reminders",
    "description": "Call lapsed members about Eid offers.",
    "agentId": "agt_abc123",
    "phoneNumberId": "pn_966xxxxxxxx",
    "defaultCountry": "SA",
    "callWindowStart": "09:00",
    "callWindowEnd": "18:00",
    "retry": { "maxAttempts": 3, "waitMinutes": 60 },
    "contacts": [
      { "phone_number": "0501234567", "name": "Sara" },
      { "phone_number": "0559876543", "name": "Omar" }
    ]
  }'
Was this guide helpful?