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.
This capability needs the plan or higher.

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 have the Admin or Member role, which can create campaigns and generate 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.

Generate a key and test the call

The full key appears once, right after you generate it. Copy it before you select Done. A lost key cannot be shown again, so you would have to revoke it and generate another.
1

Open the Contract tab

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

On the API Keys tab, enter a key label and select Generate key

Keys belong to this campaign only. Store the key in your own secret manager.
3

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

A passing dry run shows the estimated cost and sends nothing.
4

Send a live call from your system

The call appears on the Activity tab.

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 the campaign has at least one key, its template, parameters, and WhatsApp number cannot be edited. This 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

Calls are rate limited per API key. Callers should honor the retry guidance in the API response. 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.