Docs/Retention Engine/Multi-Channel Setup

Multi-Channel Setup

Configure push notifications, email, and in-app messaging for comprehensive player communication.

12 min read

Overview

Ilara supports multiple messaging channels, each with unique strengths. Use them together for maximum reach and engagement.

ChannelBest ForTypical Open Rate
PushUrgent, time-sensitive15-30%
EmailRich content, newsletters20-40%
In-AppActive players, tutorials60-80%
SMSCritical alerts (optional)90%+

Push Notifications

Setup

Configure push providers in Settings → Integrations → Push:

  • Firebase Cloud Messaging (FCM): Android and iOS
  • Apple Push Notification Service (APNs): iOS native
  • Web Push: Browser notifications
Push Configuration
json
POST /v1/integrations/push/fcm
{
class="code-string">"provider": class="code-string">"fcm",
class="code-string">"credentials": {
class="code-string">"project_id": class="code-string">"your-firebase-project",
class="code-string">"private_key": class="code-string">"...",
class="code-string">"client_email": class="code-string">"..."
},
class="code-string">"default_channel": class="code-string">"game_notifications",
class="code-string">"default_sound": class="code-string">"notification.wav",
class="code-string">"default_icon": class="code-string">"ic_notification"
}

Sending Push

Push Notification Campaign
json
{
class="code-string">"channel": class="code-string">"push",
class="code-string">"template": {
class="code-string">"title": class="code-string">"{{player.name}}, your energy is full!",
class="code-string">"body": class="code-string">"Time to continue your adventure.",
class="code-string">"image_url": class="code-string">"https:class="code-commentclass="code-string">">//cdn.example.com/energy-full.png",
class="code-string">"action_url": class="code-string">"/game/play",
class="code-string">"data": {
class="code-string">"event_type": class="code-string">"energy_full",
class="code-string">"deep_link": class="code-string">"game:class="code-commentclass="code-string">">//play"
}
},
class="code-string">"android": {
class="code-string">"channel_id": class="code-string">"game_notifications",
class="code-string">"priority": class="code-string">"high"
},
class="code-string">"ios": {
class="code-string">"sound": class="code-string">"default",
class="code-string">"badge": 1
}
}

Email

Setup

Configure email providers in Settings → Integrations → Email:

  • SendGrid: Transactional and marketing
  • Mailgun: Developer-focused
  • Amazon SES: High volume, cost-effective
  • Postmark: Transactional focused
Email Configuration
json
POST /v1/integrations/email/sendgrid
{
class="code-string">"provider": class="code-string">"sendgrid",
class="code-string">"api_key": class="code-string">"SG.xxxx",
class="code-string">"from_email": class="code-string">"[email protected]",
class="code-string">"from_name": class="code-string">"Your Game",
class="code-string">"reply_to": class="code-string">"[email protected]"
}

Email Templates

Email Campaign
json
{
class="code-string">"channel": class="code-string">"email",
class="code-string">"template": {
class="code-string">"subject": class="code-string">"Your weekly adventure recap, {{player.name}}!",
class="code-string">"html_template_id": class="code-string">"weekly-recap-v2",
class="code-string">"template_data": {
class="code-string">"player_name": class="code-string">"{{player.name}}",
class="code-string">"games_played": class="code-string">"{{stats.games_this_week}}",
class="code-string">"achievements": class="code-string">"{{stats.achievements_earned}}",
class="code-string">"leaderboard_rank": class="code-string">"{{stats.rank}}"
},
class="code-string">"preheader": class="code-string">"You played 12 games this week!"
}
}

In-App Messages

In-app messages appear inside your game to active players. Highest engagement but only reaches players who open the game.

Message Types

TypeDescriptionUse Case
modalFull-screen overlayImportant announcements, offers
bannerTop/bottom bannerSoft promotions, tips
slideupSlide from bottomQuick notifications
carouselSwipeable cardsFeature showcases
In-App Campaign
json
{
class="code-string">"channel": class="code-string">"in_app",
class="code-string">"template": {
class="code-string">"type": class="code-string">"modal",
class="code-string">"title": class="code-string">"Special Weekend Offer!",
class="code-string">"body": class="code-string">"Get 2x gems on all purchases this weekend.",
class="code-string">"image_url": class="code-string">"https:class="code-commentclass="code-string">">//cdn.example.com/weekend-offer.png",
class="code-string">"buttons": [
{
class="code-string">"text": class="code-string">"Shop Now",
class="code-string">"action": class="code-string">"deep_link",
class="code-string">"url": class="code-string">"game:class="code-commentclass="code-string">">//shop"
},
{
class="code-string">"text": class="code-string">"Maybe Later",
class="code-string">"action": class="code-string">"dismiss"
}
],
class="code-string">"dismissible": true,
class="code-string">"display_duration": 0
},
class="code-string">"trigger": {
class="code-string">"type": class="code-string">"session_start",
class="code-string">"delay_seconds": 5
}
}

Channel Priority & Fallback

Configure channel priority to optimize delivery:

Multi-Channel Campaign
json
{
class="code-string">"name": class="code-string">"Re-engagement Campaign",
class="code-string">"segment_id": class="code-string">"lapsed-7-days",
class="code-string">"channel_strategy": {
class="code-string">"mode": class="code-string">"cascade",
class="code-string">"channels": [
{
class="code-string">"channel": class="code-string">"push",
class="code-string">"wait_hours": 0,
class="code-string">"skip_if_opened": true
},
{
class="code-string">"channel": class="code-string">"email",
class="code-string">"wait_hours": 24,
class="code-string">"skip_if_opened": true
},
{
class="code-string">"channel": class="code-string">"in_app",
class="code-string">"wait_hours": 72,
class="code-string">"skip_if_opened": false
}
]
}
}
 
class=class="code-string">"code-comment">// Cascade: Try push first, if not opened in 24h send email,
class=class="code-string">"code-comment">// if still not opened show in-app when they return

Strategy Modes

ModeDescription
singleSend to one channel only
broadcastSend to all channels simultaneously
cascadeTry channels in order with fallback
smartAI picks best channel per player

Frequency Capping

Prevent notification fatigue with frequency limits:

Frequency Caps
json
{
class="code-string">"frequency_caps": {
class="code-string">"global": {
class="code-string">"max_per_day": 3,
class="code-string">"max_per_week": 10
},
class="code-string">"per_channel": {
class="code-string">"push": { class="code-string">"max_per_day": 2 },
class="code-string">"email": { class="code-string">"max_per_week": 3 },
class="code-string">"in_app": { class="code-string">"max_per_session": 1 }
},
class="code-string">"quiet_hours": {
class="code-string">"enabled": true,
class="code-string">"start": class="code-string">"22:00",
class="code-string">"end": class="code-string">"08:00",
class="code-string">"timezone": class="code-string">"player_local"
}
}
}

SDK Integration

Unity - Register Push Token
csharp
class=class="code-string">"code-comment">// Register device for push notifications
IlaraClient.Instance.RegisterPushToken(
token: FirebaseMessaging.GetToken(),
platform: class="code-string">"fcm" class=class="code-string">"code-comment">// or class="code-string">"apns"
);
 
class=class="code-string">"code-comment">// Handle in-app message display
IlaraClient.Instance.OnInAppMessage += (message) =>
{
ShowInAppMessage(message);
};
 
class=class="code-string">"code-comment">// Check for pending in-app messages
await IlaraClient.Instance.CheckInAppMessages();

Best Practices

  • Don't over-message: Respect frequency caps strictly
  • Match channel to message: Urgent = push, Rich = email, In-game = in-app
  • Personalize: Use player data for relevance
  • Test deliverability: Monitor bounce rates and opt-outs
  • Respect preferences: Honor opt-out requests immediately

Next Steps