CampaignsService
Campaigns target either a saved segment or an explicit list of client IDs, then execute ordered actions against reachable passes.
Lifecycle and queries
| Method | Purpose |
|---|---|
get(id) / create(data) / update(id, data) / delete(id) | Campaign lifecycle |
getByWorkspace(workspaceId) | List workspace campaigns |
getByStatus(status, options) | Filter a scoped list by status |
getStatusSummary(workspaceId) | Counts by status |
getCalendar(workspaceId, options?) | Calendar entries |
schedule(id, scheduledAt) | Schedule an ISO timestamp |
startNow(id) | Start immediately |
complete(id) / cancel(id) | End a campaign |
duplicate(id, options?) | Duplicate a campaign |
list(options) and status convenience methods require options.filter.workspace_id._eq.
Audience and reporting
Audience methods include previewAudience(), countAudience(), countAudienceDetailed(), getAudienceReachability(), getUnreachableAudience(), and getAudience().
Reporting methods include getStatistics(), getActionStats(), getEvents(), and getErrors().
Actions
| Method | Purpose |
|---|---|
getActions(campaignId) | List ordered actions |
addAction(campaignId, action) | Add any action type |
updateAction(actionId, data) | Update config or order |
deleteAction(actionId) | Delete an action |
reorderActions(campaignId, actionIds) | Set the full action order |
executeAction(actionId) | Execute one action |
executeAllActions(campaignId) | Execute all pending actions |
Action types are push_notification, template_switch, custom_field_update, give_reward, and assign_tier.
Example
typescript
const workspaceId = "workspace-uuid";
const { data: campaign } = await client.campaigns.create({
workspace_id: workspaceId,
name: "Gold member reward",
segment_id: "gold-members-segment-uuid",
});
await client.campaigns.addAction(campaign.id, {
action_type: "give_reward",
action_config: { reward_ids: ["reward-uuid"] },
});
await client.campaigns.addAction(campaign.id, {
action_type: "push_notification",
action_config: { notification_message: "A new reward is waiting for you." },
});
const preview = await client.campaigns.previewAudience(campaign.id, 25);
console.log(preview.total, preview.excluded_no_consent);
await client.campaigns.schedule(
campaign.id,
new Date("2026-09-01T09:00:00.000Z").toISOString(),
);Campaign sends require marketing consent. previewAudience() reports matching clients and excluded_no_consent separately.