Zapier
Connect NuTalk to your other apps through Zapier, without code: campaign events start your Zaps, and Zaps add leads to your campaigns.
What it does
NuTalk sends campaign events to a Zap through a campaign's event webhooks, and a Zap adds leads to NuTalk through the API.
- Triggers
- Start a Zap when a campaign adds a lead, places or ends a call, sends a WhatsApp message, or a lead finishes.
- Actions
- Add leads to a campaign, or create contacts, from any app.
Available triggers
Each campaign can send these events to any URL, from its Integrations tab, under Event webhooks:
| Event | When it's sent |
|---|---|
enrollment.created | A lead was added by hand in the dashboard, or came from a Facebook, Instagram or Google Ads lead form. Leads added in other ways, such as through the API, don't send it. |
call.started | The campaign placed a call to a lead, or an inbound campaign call began. |
call.completed | A campaign call ended, answered or not (data.call_outcome: answered, no_answer, busy, voicemail…). |
call.failed | A campaign call failed or could not be placed. |
message.sent | A WhatsApp template step sent its message. |
message.failed | A WhatsApp template step could not send. |
enrollment.completed | A lead reached a success end of the workflow (data.lead_response, data.terminal_stage). |
enrollment.failed | A lead reached a failure end of the workflow. |
For every call of the workspace, campaign or not, register the Zap's URL as an API webhook instead: it sends call.completed (answered) and call.failed (not answered).
Set it up
NuTalk as the trigger
Catch the events in Zapier
Create a Zap with Webhooks by Zapier → Catch Hook as the trigger, and copy the URL Zapier gives you.
Add the webhook in NuTalk
Open the campaign's Integrations tab and, under Event webhooks, press Add Webhook. Paste the URL and pick the events.
Let a real event through
Test checks that the URL answers: it sends
"event": "test"without the event fields. To map real fields in Zapier, let one real event through, for example by enrolling your own number.
NuTalk as the action
Create an API key
In Settings → API keys, create a key with the
campaigns:writescope.Add a POST step in Zapier
Add an action step Webhooks by Zapier → POST, with payload type JSON.
Fill it in
Fill in the URL, data and headers as in Action: add a lead to a campaign.
Example Zaps
| Zap | Trigger | Action |
|---|---|---|
| Tell sales in Slack about interested leadsA Zapier filter keeps only data.lead_response = interested. | NuTalk: enrollment.completed | Slack: Send Message |
| Call every Typeform leadEach submission is enrolled in a campaign and called within its calling hours. | Typeform: New Entry | NuTalk: POST /v1/campaigns/:id/enrollments |
| Log campaign calls in Google SheetsOne row per call with its outcome and duration. | NuTalk: call.completed | Google Sheets: Add Row |
| Nurture interested leads by emailLeads that ended interested join a Mailchimp audience. | NuTalk: enrollment.completed | Mailchimp: Add Subscriber |
Action: add a lead to a campaign
The Zap enrolls the lead in a campaign; NuTalk creates the contact if it is new. Use the campaign id from its address in the dashboard, and your API key in the header.
{
"url": "https://www.nutalk.ai/v1/campaigns/<campaign id>/enrollments",
"payload_type": "json",
"data": {
"phone_number": "{{phone}}",
"name": "{{first_name}} {{last_name}}",
"email": "{{email}}"
},
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}Phone numbers need the + and the country code. A lead sent to a draft or paused campaign answers 409, unless API import is turned on in the campaign's Integrations tab: then it waits and is called once the campaign starts.
What Zapier receives
Unless you set a custom payload, every event has this shape. A custom payload is a template with {{field}} placeholders for these fields and those under data.
{
"event": "enrollment.completed",
"timestamp": "2026-10-02T14:41:12.000Z",
"campaign_id": "f8d1c003-b292-448d-b8d8-1dd521b94b3b",
"enrollment_id": "7593112e-56ab-4a08-858f-21035eb1bacc",
"contact_id": "9595b646-ab97-4485-b1b8-e8b58dfcdd19",
"data": {
"phone_number": "+525512345678",
"lead_response": "interested",
"terminal_stage": "Answered",
"terminal_type": "success",
"completed_at": "2026-10-02T14:41:12.000Z"
}
}{
"event": "call.completed",
"timestamp": "2026-10-02T14:33:05.120Z",
"campaign_id": "f8d1c003-b292-448d-b8d8-1dd521b94b3b",
"enrollment_id": "7593112e-56ab-4a08-858f-21035eb1bacc",
"contact_id": "9595b646-ab97-4485-b1b8-e8b58dfcdd19",
"data": {
"call_id": "1ba11348-e440-44de-a5cd-5fe62f4d9df6",
"phone_number": "+525512345678",
"call_outcome": "answered",
"duration_seconds": 185,
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"completed_at": "2026-10-02T14:33:05.120Z"
}
}For the transcript and summary, add a step that calls GET /v1/calls/{{call_id}} with an API key that has calls:read.
Best practices
- Filter in Zapier
- Use Zapier filters on data.lead_response or data.call_outcome so a Zap runs only for the results you care about.
- Keep the Catch Hook URL private
- Campaign event webhooks are not signed: anyone with the URL can post to the Zap.
- Map fields from a real event
- The Test button only checks the URL. Enroll your own number once so Zapier sees a real event, with every field, before you map the next steps.
- Watch failed tasks
- Turn on Zapier's error notifications. A lead the API refuses (an invalid phone, an opted-out contact) shows up there with the reason.