How in-app messages work
Messages are materialized per customer when a template is scheduled to an audience, sent as a test, or delivered through a journey. Each row ininapp_messages stores the rendered content, display rules, and delivery metadata.
Your mobile app:
- Calls
GET /inapp/capabilitiesto know whether in-app is enabled and which journey event types support real-time delivery. - Calls
GET /customers/{id}/inapp-messagesafter app open or when a trigger event fires. - Renders the message using the
typeandcontentfields. - Calls
POST /customers/{id}/inapp-messages/{messageId}/eventsfor each impression action.
Message lifecycle
| Status | Description |
|---|---|
pending | Eligible for display; may still accept more shown events if under max_impressions |
shown | Last action was shown and impression cap was reached |
clicked | Customer tapped a button or primary action |
dismissed | Customer closed the message |
expired | expires_at is in the past |
Message types
| Type | Use case |
|---|---|
modal | Centered dialog over the current screen |
fullscreen | Full-screen takeover |
slideup | Bottom sheet style panel |
banner | Top or bottom banner |
Template configuration
| Field | Type | Description |
|---|---|---|
name | string | Unique template name per account |
message_type | enum | One of the message types above |
content.title | string | Headline text |
content.body | string | Main copy (required in dashboard) |
content.image_url | string | Optional hero image URL |
content.buttons | array | Primary, dismiss, and deeplink buttons |
display_rules.max_impressions | number | Max times a customer can see the message (default 1) |
display_rules.min_interval_seconds | number | Minimum gap between shown events |
display_rules.priority | number | Higher values win when multiple messages are eligible |
team_ids | string[] | Restrict analytics visibility to assigned teams |
Delivery sources
| Source | Trigger |
|---|---|
scheduled | Audience schedule from the dashboard |
test | Test send to a selected audience |
journey | Journey node with an in-app action |
GET /customers/{id}/inapp-messages. Use GET /inapp/capabilities to read the supported eventTypes.
Tracking events
Each impression action emits a resolved tracking event:| Action | Event type |
|---|---|
shown | INAPP_SHOWN |
clicked | INAPP_CLICKED |
dismissed | INAPP_DISMISSED |
metadata (for example button_id) on click events for button-level analytics.
Comparison with push notifications
| In-app messages | Push notifications | |
|---|---|---|
| Surface | Inside the app UI | OS notification tray |
| Requires device token | Only for real-time silent push (journeys); not for on-open fetch | Yes |
| Rich layout | Full templates (modal, banner, slideup, fullscreen) | Title, body, image, deeplink |
| Real-time trigger | Journey events + silent push refresh | FCM/APNs delivery |
| Impression tracking | Explicit API events | Open/delivery analytics |
Related documentation
- In-app messages — dashboard setup
- Integrate in-app messages — end-to-end app integration
- Integrate in-app messages — Storefront API reference guide