Skip to main content
At the end of this page, you have a webhook campaign your own systems trigger through the API, one end user per call. A webhook campaign is a reusable API-triggered integration, not a one-time send. It has no audience and no schedule. It stays active until you cancel it, and each API call produces one delivery.
One API call to an active webhook campaign produces exactly one delivery with its own per call activity, while a paused campaign rejects the call with a retryable error.

Before you start

Before you start, sign in to the dashboard and select the organization you want to work in.
  • Your campaign wallet is funded. See Fund your campaign wallet.
  • A WhatsApp number is connected and an approved template exists.
  • You can create campaigns. An admin creates API keys.
  • For request formats, error codes, and rate-limit headers, see Webhook campaigns API.

Create the campaign

A webhook campaign is live the moment you create it. It has no draft, so check the number and template before you select Create Webhook Campaign.
1

Open Campaigns and select Create campaign

The campaign builder opens.
2

Name the campaign and choose Webhook under Campaign Mode

The mode cannot be changed after creation. The audience and schedule pickers give way to a note, because a webhook campaign has neither.
3

Select the WhatsApp number and an approved template

The template’s variables become the parameters each API call must send.
4

Select Create Webhook Campaign

The campaign opens on its own page with the Contract, API keys, Validate, and Activity tabs.

Create a key and test the call

The full key appears once, right after you create it. Copy it before you close the dialog. A lost key cannot be shown again, so you would have to revoke it and create another.
1

Open the Contract tab

The API Contract card has Postman, OpenAPI, and cURL tabs with the request for this campaign.
2

Open the API keys tab

Keys that can send this campaign shows the Endpoint and lists every key that can call it.
3

Select Create key

Settings → Integrations opens with a key for this campaign and the Send campaign messages permission chosen. Select Create key, then store the key in your secret manager.
4

On the Validate tab, fill in the recipient and parameters, then select Validate

A passing dry run shows pricing and sends nothing. It checks neither consent nor wallet balance.
5

Send a live call from your system

The call appears on the Activity tab.
Only Admins see Create key and Manage keys. Other members see Only admins can create and manage keys.

Contract locking

Tars pins the template version when you create the campaign. If the template changes after that, calls fail with 409 template_version_drift. While a key made for this campaign is active, its template, parameters and WhatsApp number cannot be edited. The API keys tab shows a notice while this lock applies. The lock prevents an edit in the dashboard from silently breaking callers in production. To change them, revoke every key, or clone the campaign and move your callers to the copy. A clone is named Copy of the original, is active at once, and has no keys.
The contract locks when the first key is generated so matching calls keep delivering, and a template change after the version was pinned at creation makes the call fail with 409 template_version_drift.

Lifecycle

Webhook campaign states from creation straight into Active, then Paused and Cancelled, each labelled with the error a caller sees.
Use Pause and Resume on the campaign page as often as needed. While the campaign is paused, calls fail with a retryable error, so well-behaved callers can retry later.
Cancelling a webhook campaign is permanent. Future API calls stop at once and receive a terminal error. Pause instead if the stop is temporary.
To cancel, select Cancel, then Cancel campaign in the Cancel webhook campaign? dialog. Calls already accepted may still complete. A cancelled or failed campaign can be archived from the campaign list, which hides it there.

Limits and activity

Send and validate calls share the campaign-send rate limit per API key. Honor Retry-After on retryable responses. The Activity tab shows Total calls, Sent, Failed, Credits used, and Last called. Below them, the Calls table lists each call with its recipient, number, status, request ID, time, and cost. A call with the Unconfirmed status timed out on the Tars side before the result arrived. It is not charged and its outcome is unknown, so resend if the message matters.

Verify

Send a live call with a test recipient. The Activity tab shows the call with its status and cost.