Introducing App Inbox
A persistent, in-app message store — now available in the Zeta iOS and Android SDKs.
Published: June 9, 2026
App Inbox is a new messaging surface in the Zeta Marketing Platform. Unlike push notifications (which are transient) or in-app messages (which appear once in the foreground), App Inbox delivers messages to a persistent store inside your app that users can browse, revisit, and act on at their own pace.
Think of it as a notification center built into your app — powered by your ZMP campaigns.
What App Inbox enables
- Persistent messages — inbox messages stay available until the user reads, dismisses, or they expire. No more missed one-time notifications.
- Rich content — each message supports a title, body, optional media (images, GIFs), and one or more call-to-action buttons with deep links or web URLs.
- Full lifecycle control — your app can fetch messages, query by read/unread status, mark messages as read or deleted, track CTA clicks, and clear the inbox on logout.
- Campaign-driven — messages are created and targeted in ZMP using the same segmentation, scheduling, and personalization tools you already use for push and in-app.
- Your UI, your rules — the SDK provides the data layer. Your app owns the view — list rows, detail screens, unread badges, and swipe-to-dismiss are all yours to design.
Available now in 1.0.0
App Inbox ships as part of the 1.0.0 release for both native SDKs:
| Platform | SDK | Version | Status |
|---|---|---|---|
| iOS | ZetaCore | 1.0.0 | Available |
| Android | core | 1.0.0 | Available |
| React Native | zeta-reactnative-sdk | 1.0.0 | Coming soon |
| Flutter | zeta-flutter-sdk | 1.0.0 | Coming soon |
React Native and Flutter SDKs are actively in development and will include App Inbox in their upcoming 1.0.0 releases.
Quick look at the API
The API follows the same callback pattern (Android) and async/throws pattern (iOS) used across the rest of the SDK.
iOS (Swift)
let messages = try await ZetaClient.shared.inbox?.fetchMessages() ?? []
for message in messages where message.status == .UNREAD {
// Render in your UI
}
try await ZetaClient.shared.inbox?.markMessageAsRead(messageId: message.messageId)
Android (Kotlin)
ZetaClient.inbox.fetchMessages(
onSuccess = { messages ->
val unread = messages.filter { it.status == ZTAppInboxMessageStatus.UNREAD }
// Render in your UI
},
onError = { error -> /* handle error */ }
)
ZetaClient.inbox.markMessageAsRead(
messageId = message.messageId,
onSuccess = { /* updated */ },
onError = { /* handle error */ }
)
Get started
- iOS: App Inbox guide — fetch, query, update, and handle CTA buttons.
- Android: App Inbox guide — the same, with Kotlin and Java examples.
- ZMP: User Guide: App Inbox — create and target App Inbox campaigns.
What else shipped in 1.0.0
App Inbox is the headline feature, but 1.0.0 also includes:
ZTLogger— runtime log-level control, replacing the oldisLoggingEnabledboolean. See the iOS changelog and Android changelog for the full list.
For the complete API-level record, see the platform changelogs linked above.
