Campaigns & messaging
Campaigns send a message to an audience across one or more channels.
Channels
Email, SMS, Telegram, WhatsApp, push, and in-app. Each has a dedicated editor:
- Email — a GrapesJS builder with merge-tags, device preview, starter layouts, and styled blocks.
- Telegram — formatting, inline buttons, photo, character counter.
- SMS — a segment counter and opt-out handling.
- WhatsApp — template components.
- Push / In-app — title, body, image, and a CTA.
Channel-specific content lives in the template’s config.
Building & sending a campaign
- Campaigns → New. Choose the channel(s) and pick or create a template.
- Target a segment. Optionally hold out a control group to measure lift.
- Schedule — send now, at a time, or on a recurring cadence.
- Send. The worker drains the notification queue per channel and performs real delivery (SMTP for email, Bot API for Telegram, VAPID for push, inbox writes fanned out over Realtime for in-app).
Merge tags & personalization
Templates support merge-tags that resolve per recipient (name, brand, custom fields), so one template personalizes to each player.
Guardrails
- Consent — recipients without the relevant consent are suppressed.
- Frequency caps — global caps (and per-player overrides) prevent over-messaging.
- Suppression — a suppression list excludes addresses from delivery.
- Send-time optimization — where enabled, sends align to each player’s best window.
Idempotency & recurring sends
A campaign send claims a run atomically (draft|scheduled → running) to avoid
double-sends. Recurring campaigns legitimately re-send the same player each run,
so dedupe is keyed per run rather than per player.
Measuring results
Campaign analytics show delivery, engagement, and lift vs the control group. For multi-variant campaigns, the A/B experiments dashboard reports significance. See Analytics.
For multi-step, triggered flows rather than one-off sends, use Journeys.