Supported on: Android SDK
1.0.33+How It Works
- You create an in-app message in the Console with content, layout, and trigger rules.
- The message definition is synced to the SDK via the config bundle.
- On every
track()call (including auto-tracked events), the SDK evaluates all active message triggers. - If conditions match, the message is presented automatically.
In-app messages are fully server-driven. You can change the message content, trigger rules, and audience without an app update.
Message Types
Triggers
Messages trigger based on events and optional conditions, configured in the Console:- Event match — e.g., trigger on
workout_completed - Property conditions — e.g.,
duration >= 30 - Frequency —
once(the default),once_per_session,every_timeormax_times - Max displays — the cap for
max_times - Delay — wait N seconds after the trigger event before showing
Condition operators
A condition is{ field, operator, value } over the trigger event’s properties.
An operator outside this set never matches, and a
frequency outside the four above behaves as
once — on both platforms. Both are configuration errors, and the safe reading of one is that the
message does not show: a message that never appears is easier to notice than one shown to the wrong
audience. An unrecognised operator used to be read as eq on iOS, which turned a neq condition
into its exact opposite there while matching nothing on Android.Module Access
Module Methods
Suppressing Messages
Suppress messages during critical flows like checkout or onboarding to avoid interrupting the user:AppDNAInAppMessageDelegate
All 4 methods on this delegate fire fromMessageManager for every in-app message lifecycle event. Register your delegate via AppDNA.inAppMessages.setDelegate(...). You can set it before configure, and it stays set after shutdown() and applies again once configure runs; pass null to clear it.
shouldShowMessage is a true veto. The SDK calls it BEFORE constructing the view or tracking the in_app_message_shown analytics event. If you return false, the message is suppressed entirely — no view, no analytics. The interface’s default implementation returns true, so hosts that don’t implement this method continue to see all messages.
Implement the delegate to respond to message lifecycle events:
Example Implementation
Rich Media
In-app messages support rich media content configured in the Console:- Lottie animations — animated hero images or backgrounds
- Video — inline video with optional autoplay and looping
- Icon buttons — CTA buttons with icon references (Lucide, Material, or emoji)
- Haptic feedback — triggered on message display or button taps
- Particle effects — confetti, sparkles, or other effects on message actions
- Blur backdrop — glassmorphism-style blurred background for modals
Auto-Tracked Events
Full Example
In-app messages are created in the Console under Engagement > In-App Messages. Design the message, set trigger rules, and publish. The SDK handles everything else.

