Campaign Automation Example
Automate pass updates, notifications, and tier management with campaigns.
Setup
typescript
import { WalletHero } from '@wallethero/sdk';
const client = new WalletHero({
apiToken: process.env.WALLETHERO_API_TOKEN!
});
const WORKSPACE_ID = 'your-workspace-id';Example 1: Welcome Campaign
Send a welcome message to new members after sign-up.
typescript
// Create segment for new members (joined in last 24 hours)
const newMembers = await client.segments.create({
workspace_id: WORKSPACE_ID,
name: 'New Members (24h)',
filters: [
{
filter_type: 'custom_field',
filter_config: {
custom_field_filters: {
member_since: {
operator: '_gte',
value: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0]
}
}
}
}
]
});
// Create welcome campaign
const welcomeCampaign = await client.campaigns.create({
workspace_id: WORKSPACE_ID,
name: 'New Member Welcome',
segment_id: newMembers.id
});
// Add welcome bonus
await client.campaigns.addAction(welcomeCampaign.id, {
action_type: 'custom_field_update',
action_config: {
custom_field_updates: {
welcome_bonus: 50,
welcome_bonus_claimed: false
}
}
});
// Send welcome notification
await client.campaigns.addAction(welcomeCampaign.id, {
action_type: 'push_notification',
action_config: {
notification_message: '🎉 Welcome! You\'ve received 50 bonus points!'
}
});
// Schedule to run daily at 9 AM
await client.campaigns.schedule(welcomeCampaign.id, {
scheduled_at: getTomorrowAt9AM()
});
function getTomorrowAt9AM() {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
tomorrow.setHours(9, 0, 0, 0);
return tomorrow.toISOString();
}Example 2: Tier Upgrade Campaign
Automatically upgrade members who reach point thresholds.
typescript
// Create segment for Silver-eligible members
const silverEligible = await client.segments.create({
workspace_id: WORKSPACE_ID,
name: 'Silver Eligible',
filters: [
{
filter_type: 'custom_field',
filter_config: {
custom_field_filters: {
tier: { operator: '_eq', value: 'Bronze' },
points: { operator: '_gte', value: 1000 }
}
}
}
]
});
// Create upgrade campaign
const upgradeCampaign = await client.campaigns.create({
workspace_id: WORKSPACE_ID,
name: 'Silver Tier Upgrade',
segment_id: silverEligible.id
});
// Switch to Silver template
await client.campaigns.addAction(upgradeCampaign.id, {
action_type: 'template_switch',
action_config: {
target_template_id: 'silver-template-uuid',
preserve_custom_fields: true
}
});
// Update tier field
await client.campaigns.addAction(upgradeCampaign.id, {
action_type: 'custom_field_update',
action_config: {
custom_field_updates: {
tier: 'Silver',
upgraded_at: new Date().toISOString()
}
}
});
// Notify the member
await client.campaigns.addAction(upgradeCampaign.id, {
action_type: 'push_notification',
action_config: {
notification_message: '🥈 You\'ve been upgraded to Silver! Enjoy your new benefits.'
}
});
// Preview before running
const preview = await client.campaigns.preview(upgradeCampaign.id);
console.log(`Will upgrade ${preview.total} members to Silver`);
// Run immediately
await client.campaigns.startNow(upgradeCampaign.id);Example 3: Birthday Campaign
Send birthday rewards to members.
typescript
// Note: This assumes you have a birth_month field on passes
const birthdayMembers = await client.segments.create({
workspace_id: WORKSPACE_ID,
name: 'Birthday This Month',
filters: [
{
filter_type: 'custom_field',
filter_config: {
custom_field_filters: {
birth_month: {
operator: '_eq',
value: new Date().getMonth() + 1 // 1-12
}
}
}
}
]
});
const birthdayCampaign = await client.campaigns.create({
workspace_id: WORKSPACE_ID,
name: 'Birthday Rewards',
segment_id: birthdayMembers.id
});
await client.campaigns.addAction(birthdayCampaign.id, {
action_type: 'custom_field_update',
action_config: {
custom_field_updates: {
birthday_bonus: 100,
birthday_bonus_expires: getEndOfMonth()
}
}
});
await client.campaigns.addAction(birthdayCampaign.id, {
action_type: 'push_notification',
action_config: {
notification_message: '🎂 Happy Birthday! Enjoy 100 bonus points this month!'
}
});
// Schedule for 1st of each month
await client.campaigns.schedule(birthdayCampaign.id, {
scheduled_at: getFirstOfNextMonth()
});Example 4: Re-engagement Campaign
Win back members who haven't visited recently.
typescript
// Members who haven't had activity in 60 days
const lapsedMembers = await client.segments.create({
workspace_id: WORKSPACE_ID,
name: 'Lapsed 60 Days',
filters: [
{
filter_type: 'event_recency',
filter_config: {
event_category: 'activity',
operator: 'not_within_days',
days: 60
}
}
]
});
const winBackCampaign = await client.campaigns.create({
workspace_id: WORKSPACE_ID,
name: 'Win Back Campaign',
segment_id: lapsedMembers.id
});
// Double points offer
await client.campaigns.addAction(winBackCampaign.id, {
action_type: 'custom_field_update',
action_config: {
custom_field_updates: {
double_points_active: true,
double_points_expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()
}
}
});
await client.campaigns.addAction(winBackCampaign.id, {
action_type: 'push_notification',
action_config: {
notification_message: '💫 We miss you! Earn DOUBLE points this week only!'
}
});
await client.campaigns.startNow(winBackCampaign.id);Monitoring Campaigns
typescript
// Get campaign statistics
const stats = await client.campaigns.getStatistics(winBackCampaign.id);
console.log(`Campaign: ${stats.status}`);
console.log(`Targeted: ${stats.total_targeted}`);
console.log(`Completed: ${stats.passes_completed}`);
console.log(`Failed: ${stats.passes_failed}`);
console.log(`Actions: ${stats.actions_completed}/${stats.actions_total}`);
// Get calendar view of all campaigns
const calendar = await client.campaigns.getCalendar({
workspace_id: WORKSPACE_ID,
start: '2024-01-01',
end: '2024-01-31'
});
console.log('January Campaigns:');
calendar.forEach(c => {
console.log(`- ${c.name} (${c.status}): ${c.scheduled_at || 'not scheduled'}`);
});