Skip to content

CampaignsService

Campaigns target either a saved segment or an explicit list of client IDs, then execute ordered actions against reachable passes.

Lifecycle and queries

MethodPurpose
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

MethodPurpose
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.

WalletHero Documentation