This beta contract is pending release. Access is unavailable until the beta is offered to your team.
403 feature_unavailable. Withdrawing pauses running drips before
their next send. Results remain readable. You can close continuous enrollment, pause or stop without beta access.
A drip sends up to 10 composed messages from linked-device or test numbers.
Every later step uses the number that sent the first. Templates, A/B variants,
weighted alternatives and receipt-timed followUp cannot be combined with a drip.
A drip can use a saved audience segment.
Selecting or launching that audience requires a team API key or signed-in
Dashboard session and access to both audience betas as well as the drip beta.
Launch freezes the matching profiles and their variables once. Later steps use
that snapshot; editing the segment does not change an active drip’s recipients.
The same drip content and sending-number checks still apply.
Build a drip in the Console
After your team joins the beta, open Campaigns, create a campaign and choose Drip. On the Steps page:- Write each step’s message. Add up to 10 steps and reorder them with Move up and Move down.
- Set each later step’s wait in days, hours and minutes, up to 30 days.
- Optionally turn on Step send window to choose that step’s days and hours. The step keeps the campaign time zone.
- Choose Launch audience or Continuous enrollment and set the exit rules.
Create and launch with the API
UsePOST /platform/campaigns with a team API key and campaigns:manage.
Project tokens derive the project from the credential; team keys supply projectId.
Replace the example IDs with your project and sending number IDs.
POST /platform/campaigns/{campaignId}/launch. Ordinary Campaigns
sender eligibility, approval, pacing, opt-out and safety checks still apply.
A drip with a Cloud API sending pool is refused at launch or paused before sending.
delayAfterSec is the minimum wait after the previous step was accepted, from 0
to 2,592,000 whole seconds (30 days). The first step has no delay. delayUnit is
optional display information: minutes, hours or days. Seconds must be a
whole multiple of that unit. Pacing, pauses and send windows can extend the wait.
The first step uses the campaign sendWindow. A later step’s window replaces
its weekdays and hours, retaining the campaign time zone and recipient time-zone
settings. Without a campaign window, step windows use the team time zone saved
when drip settings were configured. Each step window accepts one to four non-overlapping hour ranges. Omit a step window to use the campaign window.
Enroll contacts
enrollment: "audience" sends to contacts present at launch.
enrollment: "continuous" also accepts contacts while running or paused:
data contains campaignId, recipientId, normalized phone,
created, status and enrolledAt (Unix milliseconds). Repeating a phone returns
created: false without changing its variables or restarting its steps, even if
the contact already completed or exited. An opted-out phone is stored as skipped
and receives nothing. A drip not accepting new enrollments returns 409 state_conflict.
The same enrollment is available through
POST /messaging/projects/{projectSlug}/campaigns/{id}/enrollments.
Continuous drips stay open after all enrolled contacts finish. Close enrollment
with PATCH /platform/campaigns/{campaignId}, supplying projectId and
drip: { enrollment: "audience" }. Omitted exit flags keep their stored values. Once every
contact finishes, the campaign completes. You cannot reopen enrollment or change
step content after launch; duplicate the campaign for a new series.
Closing remains available after beta withdrawal. Send only drip and the project
selector in that PATCH. Omit the exit flags to preserve them, or send their
unchanged values. Bundled edits still require
beta access. Closing prevents new enrollments; it does not resume a paused drip
or send its remaining steps while beta access is unavailable.
Campaign list and detail reads return enrollmentOpen: true for continuous
enrollment, false for audience enrollment (including a closed drip), and null
for a non-drip. A continuous draft also returns true; enrolling still requires
running or paused status and beta access. pauseReason contains the current stored
pause reason while paused, or null for a manual pause without a reason, when
the current reason is unavailable, and for other statuses. A reason from an
earlier pause is not carried across a resume.
Exits and results
Opt-outs always stop remaining steps. Replies to the sending number stop them unlessexitOnReply is false. With exitOnLinkClick: true, a GET request to any
of the campaign’s tracked links also stops them when it records an open. HEAD
requests, known link previews, crawlers, security scanners and requests marked
as prefetch still redirect but do not record an open or stop remaining steps.
Detection is best effort: unknown or disguised automated fetches can still
count and trigger an exit. An open does not prove a person clicked. Configure tracked links
through the separate link tracking beta.
An already dispatched message can finish after an exit is recorded. A reply or
tracked-link request during the first send still stops all later steps, even
when the first send has not yet returned its result.
GET /platform/campaigns/{campaignId}/analytics?projectId=... returns data.drip:
enrollment,enrolled,enrolledByApi,active,completedandexited.steps, ordered by zero-basedstep, withentered,waiting,sent,delivered,read,replied,exitedandfailedcounts.
entered counts contacts who reached the step’s delay, including every enrolled
contact for step 0. waiting includes queued and in-flight sends. Replies are
attributed to the latest sent step within seven days, before the next step.
Receipt counts depend on WhatsApp returning receipts. First-message campaign
counts retain their meaning; later sends appear in step results and recipient
logs with their message position. Each step is a separate send and follows the
same usage and billing rules as other campaign messages. No separate drip fee
is introduced.
A paused continuous drip keeps checking progress at least once a minute. Closing
its enrollment lets it complete once every contact is settled, even while paused.
Closing never resumes sending. If contacts still have steps waiting, resume or
stop the campaign explicitly.
A drip must contain at least one sendable composed message before launch. An
empty draft can be saved, but launch returns 400 invalid_parameter on
messagesArray until content is ready. When no sending numbers are selected,
a drip uses eligible linked-device or test numbers from the project; Cloud API
numbers do not displace a supported test sender. Explicit selections still
must use a supported sending type.