Campaign automation and workflow builder
A campaign calls your contacts with an AI agent and can follow up on WhatsApp. Its workflow decides each step: the calls, the waits and retries, the messages and how each contact ends.
What a campaign is
A campaign calls a group of contacts with your AI agent, within the calling hours and at the pace you set. Its workflow, which you build in the dashboard, decides what happens after each call.
- Calling
- Calls go out on their own, at the hours and pace you set, and can try again when nobody answers.
- Workflow
- Steps you connect on a canvas: calls, waits, WhatsApp templates, webhooks and CRM updates.
- Branches
- Conditions send each contact down a Yes or a No path: by the call's outcome, the contact's response, the agent's goals or the time.
- Results
- Each campaign's Overview shows how many contacts finished, the answer rate and how many reached the goal.
Before you start
- An agent published on a phone number: see Create your first agent and Voice channel setup.
- The people to call: a file, a contact list or leads from your CRM (see Contact management). A campaign can also start empty and call people as they're added.
- Goals on the agent, if the workflow should branch on them (see Goals and evaluation).
- For WhatsApp follow-ups, an Official WhatsApp Business number with approved templates (see WhatsApp channel setup).
Create the campaign
- In the dashboard, open Campaigns → All campaigns and click New campaign.
- Choose who it calls: A list you already have (a file, saved contact lists or leads picked in your CRM; the campaign runs once through it) or New leads, as they arrive (from Kommo, HubSpot or Odoo, Facebook and Instagram lead ads, or your website and API; the campaign keeps running).
- Name it. Only your team sees the name.
- Choose what happens to a contact who is already in the campaign: skip it, start over, or update its details.
The draft saves as you go. Nobody is called until you launch.
Choose the agent
- Pick the agent that makes the calls. It calls from its phone number and follows its own instructions and goals: change those on the agent, not in the campaign.
- Optional: Message those who don't answer on WhatsApp sends an approved template when a call isn't answered.
- Optional: with a CRM connected, After each call logs every call and its result in it.
The campaign starts with these steps: the agent calls, the AI reads each answered call and decides whether the contact is interested, and an unanswered call ends (or gets the WhatsApp template). Change them in the Workflow tab.
Set the call schedule
Set the calling hours, the pace, the longest call, the retries when nobody answers and callbacks. Each part saves on its own, and you can change it later in the campaign's Settings → Calling (see Calling hours and pace).
Review and launch
- Check who is called, the agent and its number, the call schedule, what counts as a success and the estimated cost.
- Before you launch lists anything to fix, such as a number with no published agent or limits above your plan.
- Test with my numbers runs the campaign's real steps on your verified test numbers. Nobody on your list is called.
- Launch it, or keep it as a draft with Finish later.
Once live, the campaign calls each contact within the calling hours. Pause it from its page at any time: a call in progress finishes, and nothing else goes out until you resume.
The workflow builder
Open a campaign and choose the Workflow tab. Each step is a box on the canvas: Add step adds one, a click opens its settings, and dragging from one dot to another connects two steps. To delete a connection, select it and press Backspace. Click Save when you're done, or use Configure with AI to have the Copilot set up the steps.
- Start
- Where each contact enters: Manual Start or Webhook start. A workflow has one start.
- Actions
- Call, send a WhatsApp template, wait, call a webhook, move the contact to a stage, analyze the conversation, switch the agent or update your CRM. See the steps reference.
- Branch
- Conditions with two exits, Yes and No. See the conditions reference.
- End
- Where a contact's workflow ends: Success, Failure, Do Not Contact (opts the contact out of every campaign), or End → a stage of the campaign's pipeline.
Call outcomes
A Call Outcome condition reads how the call step before it ended. The outcomes you pick go to Yes; every other outcome goes to No.
| Outcome | What happened | A typical next step |
|---|---|---|
| Answered | A person answered and talked with the agent. | Analyze the conversation, then branch on what the contact said. |
| Rejected | The contact turned the call down or asked not to be called again. | End with Failure or Do Not Contact. |
| Hung Up | The contact hung up right away. | Try again later, or end. |
| Voicemail | The call reached voicemail. | Try again later, or send a WhatsApp template. |
| No Answer | Nobody picked up. | Try again later, or send a WhatsApp template. |
| Busy | The line was busy. | Try again sooner, for example after 30 minutes. |
| Failed | The call didn't go through, for example an invalid number or a network error. | End with Failure. |
| Exhausted | The call step used up its retries and the contact never answered. | Send a WhatsApp template, or end. |
When Yes on Answered leads to Analyze Conversation and a decision on its result, a person who turned the call down or hung up goes to Yes too, so the analysis decides how they end instead of the path for people nobody reached. To route them yourself, pick Rejected or Hung Up on a condition. Someone who asked not to be called again still goes to No.
What the contact answered is a separate condition, Lead Response: Interested, Not Interested, Callback Requested, Appointment Booked or Do Not Contact. Whether the agent met its goals is another, Goal Completion.
Build your first workflow
This example qualifies leads: it calls each contact, tries again when nobody answers, has the AI read the call and ends each path. The setup's starting steps already cover part of it.
Call with retries
Click the Voice Call step. Under Retries, choose Custom for this call: retry on No answer, Voicemail and Busy, 3 attempts in total, at least 120 minutes apart, only during calling hours.
Branch on the outcome
Add a Call Outcome condition after the call and select Answered. Yes: the contact talked with the agent. No: every other outcome, including Exhausted when the retries ran out.
Read the call
On Yes, add Analyze Conversation and start with the Lead Qualification template, or list the fields the AI should extract (yes/no, text, number or list).
Decide
Add an Analysis Result condition on one of those fields, such as
is_qualifiedis true. Connect Yes to a Success end and No to a Failure end.Follow up those who never answered
On the outcome's No, add a WhatsApp step with an approved template, then a Failure end.
Save
Click Save. The builder checks the steps and lists anything to fix before it saves.
Send results to your system
A Webhook step sends the contact's data to your URL. Every request carries enrollment_id, campaign_id, contact_id, phone_number, lead_data, lead_response, final_call_outcome, analysis and the contact's fields (contact_fields). Fields you add are sent too, with their variables filled for each contact:
{
"source": "nutalk",
"name": "{{contact.name}}",
"outcome": "{{call.outcome}}",
"summary": "{{call.summary}}"
}Workflow patterns
Follow a missed call on WhatsApp
Combine calls and WhatsApp to reach more people:
- Voice Call: the first attempt.
- Call Outcome: Answered goes on to the rest of your workflow; the other outcomes continue below.
- Wait 4 hours.
- WhatsApp: an approved template.
- Wait 24 hours.
- Voice Call: the second attempt.
Route by time
Calling hours already hold every call outside them. A Time Based condition is for choosing a different path, in the time zone you pick:
- Business Hours: Yes between a start and an end time.
- Specific Time: Yes around a time, within a tolerance in minutes.
- Day of Week: Yes on the days you pick.
For example, send contacts who arrive between 12:00 and 14:00 to a 2-hour Wait before the call, or give evening calls to another agent with Switch Agent.
Prioritize leads
A Custom condition compares one field with one value, such as a score from your CRM or file. Fields: lead_data.… (a column of the imported or API data), contact_custom.… (a field of the contact list) and retry_count (calls made so far). Operators: == != > < >= <=. Each path can call with its own retries:
Custom: lead_data.score > 80
├── Yes → Voice Call (retries: 5 attempts in total)
└── No → Custom: lead_data.score > 50
├── Yes → Wait 4 hours → Voice Call (3 attempts in total)
└── No → Wait 24 hours → Voice Call (2 attempts in total)Workflow steps reference
| Step | What it does | Settings |
|---|---|---|
| Voice Call | Calls the contact. The agent published on the number talks, with its own opening and goals. | Number, an agent of its own (optional), retries |
| Sends an approved template from an Official WhatsApp Business number. | WhatsApp channel, template, header, body and button variables | |
| Wait | Pauses before the next step. | Hours and minutes (at least 1 minute) |
| Webhook | Sends the contact's data to your URL. | URL, method (GET, POST, PUT, PATCH), extra fields |
| Update Stage | Moves the contact to a stage of the campaign's pipeline. A final stage ends the workflow. | Target stage |
| Analyze Conversation | The AI reads the last call's transcript and fills the fields you ask for. | Fields to extract, instructions, sync to contact fields |
| Switch Agent | Every call after this step uses another agent. | Target agent, a summary of the last call for it |
| Kommo, HubSpot and Odoo steps | Update the lead or deal in your CRM: move its stage, add a note or a tag, log the call. | The campaign's Integrations tab |
Conditions reference
| Condition | Goes to Yes when | Use it for |
|---|---|---|
| Call Outcome | The last call ended with an outcome you picked. | Routing after a call |
| Lead Response | The contact's response is one you picked. | Routing by what the contact said |
| Call Attempts | The contact has been called fewer times than the number you set (retries count). | Limiting attempts |
| Goal Completion | The last call's evaluation met any or all of the goals you name. The number must evaluate every call. | Routing by the agent's goals |
| Analysis Result | A field from an Analyze Conversation step matches a value. | Routing by what the call revealed |
| Time Based | The time is within the hours, near the time or on the days you set. | Business hours, weekends |
| Custom | One field compared with one value is true. | Segments and scores |
| Compound (AND/OR) | All (AND) or any (OR) of several conditions are true. | Combining rules |
| Kommo, HubSpot and Odoo conditions | The lead's tag, stage, lifecycle stage or field matches. | Routing by your CRM |
Calling hours and pace
These live in a campaign's Settings → Calling. Setup shows the same controls in its call schedule step.
- Calling hours
- The days and hours calls and messages go out, in the time zone you choose. Anything due outside them waits until they open again. Holidays are days with no calls or messages.
- Pace
- Calls at a time, calls and messages per hour, optional daily caps, and the most calls one person gets in a day. Your plan's limits also apply, across all campaigns.
- Longest call
- On calls from NuTalk numbers, the call ends when it reaches this length. Leave it empty for no limit.
- If they don't answer
- Which outcomes get another try (no answer, voicemail, busy, failed), how many and how far apart. A call step set to Custom for this call uses its own rules instead.
- Scheduled callbacks
- When someone says “call me later”, the agent asks when, books it, and the campaign calls at that time. Pending retries wait for the callback.
Calling too fast can get your number flagged as spam by carriers. Start with a low pace and raise it while you watch the answer rate.
Follow a campaign
A campaign's Overview tab starts with its state (running, paused, outside calling hours) and four totals:
- Contacts
- Everyone in the campaign, with how many are waiting, in progress and scheduled for a retry or callback.
- Finished
- Contacts whose workflow ended, as a share of all contacts.
- Answer rate
- Answered calls out of all calls, over the last 7, 30 or 90 days.
- Goal reached
- Finished contacts marked interested or with an appointment booked.
Below them are the contacts in each pipeline stage, the calls by outcome, the WhatsApp messages sent, the contacts added per day and what contacts answered. The Contacts and Calls tabs list each contact and call. To compare campaigns, open Campaigns → Intelligence (see Analytics and reporting).
Use the API
Create, start, pause and fill campaigns from your own code with an API key that has the campaigns:write scope, including the steps the dashboard builds for a purpose, or a workflow of your own (PUT /v1/campaigns/:id/workflow). The A/B test, the pipeline's stages, the analytics and the number whose callers join the campaign have their endpoints too (A/B tests and stages).
Start a campaign
curl -X POST https://www.nutalk.ai/v1/campaigns/f8d1c003-b292-448d-b8d8-1dd521b94b3b/start \ -H "Authorization: Bearer $NUTALK_API_KEY"
Enroll a contact
lead_data holds whatever the agent should know about the lead (product, last purchase…). To add many contacts at once, use POST /v1/campaigns/:id/contacts/import.
curl -X POST https://www.nutalk.ai/v1/campaigns/f8d1c003-b292-448d-b8d8-1dd521b94b3b/enrollments \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+5215512345678",
"name": "Ana López",
"lead_data": {
"product": "Plan Pro"
}
}'Best practices
- Start small, then scale
- Test with your own numbers, then with 50 to 100 contacts. Review the transcripts, refine your agent, then call larger groups.
- Use goals and competencies
- Give the agent clear goals and competencies and evaluate its calls, so you see where it needs work.
- Limit retry attempts
- Three attempts are usually enough. More reach few extra people and can hurt your number's reputation with carriers.
- Respect contact preferences
- When someone on a campaign call asks not to be called again, the AI reads it from the call afterwards: the contact is marked do-not-contact and their pending attempts stop in every campaign. Calls placed by hand or through the API, and calls it can't read, mark no one: mark those people yourself with the contact's Campaign calls & messages switch, or upload their numbers in Contacts → More → Do-not-call list.