Skip to content

Campaign Example

Build a consent-aware campaign for a saved audience, add ordered actions, preview it, and schedule it.

typescript
import { WalletHero } from "@wallethero/sdk";

const walletHero = new WalletHero({
  apiToken: process.env.WALLETHERO_API_TOKEN!,
});

const workspaceId = "workspace-uuid";

const { data: segment } = await walletHero.segments.create({
  workspace_id: workspaceId,
  name: "High-balance members",
  filters: [
    {
      filter_type: "wallet_balance",
      filter_config: {
        wallet_type_code: "points",
        operator: "_gte",
        value: 1_000,
      },
    },
  ],
});

const { data: campaign } = await walletHero.campaigns.create({
  workspace_id: workspaceId,
  name: "High-balance reward",
  segment_id: segment.id,
});

const rewardAction = await walletHero.campaigns.addAction(campaign.id, {
  action_type: "give_reward",
  action_config: { reward_ids: ["reward-uuid"] },
});

const notificationAction = await walletHero.campaigns.addAction(campaign.id, {
  action_type: "push_notification",
  action_config: {
    notification_message: "A new reward is waiting for you.",
  },
});

await walletHero.campaigns.reorderActions(campaign.id, [
  rewardAction.id,
  notificationAction.id,
]);

Preview and schedule

typescript
const audience = await walletHero.campaigns.previewAudience(campaign.id, 50);
const reachability = await walletHero.campaigns.countAudienceDetailed(
  campaign.id,
);

console.log({
  total: audience.total,
  excludedNoConsent: audience.excluded_no_consent,
  recipients: reachability.total,
});

await walletHero.campaigns.schedule(
  campaign.id,
  new Date("2026-09-01T09:00:00.000Z").toISOString(),
);

Campaign audiences exclude clients without marketing consent. The preview and detailed count expose excluded_no_consent so an empty send is distinguishable from an empty segment.

Manual audience

Use manual_client_ids instead of segment_id for an ad-hoc audience:

typescript
const { data: manualCampaign } = await walletHero.campaigns.create({
  workspace_id: workspaceId,
  name: "Selected customers",
  manual_client_ids: ["client-1", "client-2"],
});

const reachability = await walletHero.campaigns.getAudienceReachability(
  workspaceId,
  manualCampaign.manual_client_ids ?? [],
);

Manual and segment audiences are mutually exclusive. getUnreachableAudience() reports selected clients who do not have a pass.

WalletHero Documentation