Skip to main content

What in-app messages do

Two automation types for non-email touchpoints inside your product:
TypeWhat it does
In-App MessageModal or inline message rendered by the SDK
BannerBanner-style alert at the top of the page
Both are activated the same way as broadcasts and series — pick the type when creating a new automation.

How they’re delivered

When you activate an in-app message or banner:
  1. The first content step is upserted into the active_messages table with active: true
  2. The SDK polls (or receives via realtime) for active messages for the current user
  3. The SDK renders the message in the product
Targeted by audience filters the same way emails are — any user matching the audience receives the message when they next load your app.

Inside a series

In-app messages and banners can also appear as steps inside a series (channel in_app or banner):
  • They’re enqueued like email steps
  • The cron currently marks them as delivered immediately and advances the user
Use this when you want a sequence that mixes email + in-app touches (e.g. “Email Day 1, In-app on Day 2 if they returned, Email Day 5”).
Halo’s runtime for in-app/banner steps inside a series is simpler than the standalone activation path. Standalone in-app/banner automations are the more battle-tested path for surface-level rendering.

Common use cases

Use caseType
New feature announcementBanner
Dunning notice (“Your card is expired”)Banner
Onboarding prompt (“Connect your first integration”)In-App
Re-engagement modal (“It’s been a while”)In-App
Maintenance window noticeBanner

Audience targeting

In-app and banner automations support the same audience targeting as broadcasts:
  • All users with email (or with the SDK loaded)
  • Filter by segment — user/company traits, custom fields, Stripe data
  • Subscription list (less common for in-app)
The recipient count updates in real time as you change filters.

Designing the content

Content uses the same editor as series in-app steps. You can include:
  • Rich text
  • Merge tags ({{first_name}}, {{company_name}}, custom fields)
  • Links
  • Images
The SDK renders the content with your widget styling so it feels native to your product.

Activating and pausing

ActionEffect
ActivateInsert into active_messages, becomes visible to matching users
PauseSet active: false, hides the message from new users
ArchivePermanently disable
Active messages are evicted from a user’s view once they dismiss them (the SDK tracks dismissals locally).

Where to go next

Broadcasts

Email equivalent — one-shot to a targeted audience.

Series

Combine in-app steps with email steps in a sequence.