End-to-end guide to creating and launching an automated outreach campaign that qualifies leads using AI conversations.
Campaigns let you run batch AI-driven outreach across WhatsApp, Telegram, and email. Instead of cold calling, Naturalead starts personalized conversations with each lead using your configured AI agent, qualifies them based on your criteria, and reports results in real time.This guide walks you through creating a campaign from scratch, launching it, and monitoring its progress.
Before launching a campaign you need three things in place:
AI Agent
A configured agent with a system prompt, qualification stages, and optionally a knowledge base. Create one in the Bot page or via the Agent Config API.
Messaging Integration
At least one verified channel integration (Twilio for WhatsApp/SMS, Telegram bot, or Resend for email). Configure integrations in Settings > Integrations.
Leads
Leads in your account to reach out to. Import them via CSV, the Leads API, or a CRM sync webhook.
Campaigns send real messages to real people. Always test with a small lead set first by using manualLeadIds to target specific test leads before launching a broad filter-based campaign.
Your campaign needs an agent configuration that defines how the AI converses with leads. The agent includes a system prompt, conversation stages, qualification criteria, and guardrails.
3
If you already have an agent configured, note its agentConfigId. Otherwise, create one first:
4
curl
curl -X PUT "${API_URL}/api/agent-config" \ -H "X-API-Key: ${API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "name": "Sales Qualifier", "systemPrompt": "You are a friendly sales assistant qualifying inbound leads...", "goal": "Determine if the lead is a good fit for our product", "stages": [ { "name": "introduction", "description": "Greet and introduce yourself" }, { "name": "discovery", "description": "Ask about their needs and budget" }, { "name": "qualification", "description": "Evaluate fit and next steps" } ] }'
Python
import requestsresponse = requests.put( f"{API_URL}/api/agent-config", headers={ "X-API-Key": API_KEY, "Content-Type": "application/json", }, json={ "name": "Sales Qualifier", "systemPrompt": "You are a friendly sales assistant qualifying inbound leads...", "goal": "Determine if the lead is a good fit for our product", "stages": [ {"name": "introduction", "description": "Greet and introduce yourself"}, {"name": "discovery", "description": "Ask about their needs and budget"}, {"name": "qualification", "description": "Evaluate fit and next steps"}, ], },)agent_config = response.json()agent_config_id = agent_config["_id"]
Node.js
const response = await fetch(`${API_URL}/api/agent-config`, { method: "PUT", headers: { "X-API-Key": API_KEY, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Sales Qualifier", systemPrompt: "You are a friendly sales assistant qualifying inbound leads...", goal: "Determine if the lead is a good fit for our product", stages: [ { name: "introduction", description: "Greet and introduce yourself" }, { name: "discovery", description: "Ask about their needs and budget" }, { name: "qualification", description: "Evaluate fit and next steps" }, ], }),});const agentConfig = await response.json();const agentConfigId = agentConfig._id;
5
Create the campaign
6
Create a campaign by specifying your agent, target channel, lead filters, and schedule. The campaign starts in draft status so you can review it before launching.
The leadFilter matches leads dynamically at launch time. You can also use manualLeadIds to target specific leads, or combine both approaches. Use advancedFilter with custom conditions for more granular targeting.
9
Preview matched leads
10
Before launching, review the campaign to verify it is configured correctly and check the lead count. The campaign object includes a stats.totalLeads field after creation that reflects how many leads match your filter.
Once you are satisfied with the configuration, launch the campaign. This transitions it from draft to running and begins sending messages according to the schedule.
16
curl
curl -X POST "${API_URL}/api/campaigns/${CAMPAIGN_ID}/launch" \ -H "X-API-Key: ${API_KEY}"
Launching a campaign is not reversible in terms of messages already sent. You can pause the campaign to stop further outreach, but messages that have already been delivered cannot be recalled.
18
Monitor progress and stats
19
Poll the campaign endpoint to track progress. The stats object updates in real time as the AI agent converses with leads.
Campaign execution respects the schedule configuration to avoid overwhelming recipients and messaging providers.
Setting
Description
Default
schedule.rateLimit
Maximum messages sent per minute
5
schedule.activeHours
Time window for sending (requires start, end, timezone)
All hours
schedule.activeDays
Days of the week (0=Sunday through 6=Saturday)
All days
schedule.startAt
Scheduled start time (campaign waits until this time)
Immediate
The rate limit applies per campaign. If you have multiple campaigns running simultaneously, each one sends at its own rate. Plan accordingly to stay within your messaging provider’s throughput limits.
This returns only channels with verified integrations, for example ["whatsapp", "email"]. Attempting to create a campaign on an unconfigured channel will result in a validation error.