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.