Skip to content

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'}`);
});

WalletHero Documentation