Skip to content
Sendora Cloud
Create account
Engage

In-App Messages

Modal + banner + tooltip surfaces rendered in-app from a server-side rule engine. Trigger on event + segment + screen.

Features

  • **4 message types** — `banner` / `modal` / `slideout` / `tooltip`. Content fields: title (optional), body, ctaText, ctaUrl, imageUrl, dismissible.
  • **Trigger config** — fire by event type, audience membership, URL match, or fixed delay (0-300s). Mix as needed.
  • **Audience targeting** — pick a Customers audience; real-time membership.
  • **Appearance** — position (top / bottom / center), theme (light / dark / auto), optional background + text colour overrides.
  • **Schedule window** — `startsAt` + `endsAt` for time-boxed campaigns. Inactive flag for soft-pause.
  • **Priority** — 0-100; higher wins when multiple messages match the same render slot.
  • **Impression tracking** — every render writes to `in_app_message_impressions`. Stats endpoint returns total / active / impressions.
  • **SDK helpers** — Web `sendora.messages.*`; RN 0.18.6+ ships `messages.fetchActive()` + `recordImpression()`. Mobile + web parity.
  • **Ship without app-store re-submit** — content + targeting + appearance all server-side.

Common use cases

  • Audience-targeted modals ("active 14d + free plan → upgrade prompt") without writing custom rendering logic.
  • Empty-state nudges + onboarding tooltips driven by Analytics-built audiences.
  • Time-boxed announcements (launch banner, scheduled maintenance notice) via `startsAt` / `endsAt`.

In-app messaging

Fetch in-app messages

FREE

Returns active messages targeted to the current user. Targeting evaluated server-side against the user's profile + audience memberships.

// The best message for this user right now, or null.
const message = await sendora.messages.checkMessages();
if (message) console.log(message.content.title, message.content.body, message.content.ctaText);

Track impression / click

FREE

Fires `in_app.impression` and `in_app.clicked` events into the analytics stream. Used for conversion + frequency-cap evaluation.

await sendora.messages.recordAction(messageId, "impression");
await sendora.messages.recordAction(messageId, "click");

Author a message (dashboard)

LAUNCH+

Visual editor in the dashboard: title, body, optional CTA url, audience targeting, schedule + frequency cap. No SDK call — created server-side.

# Author in dashboard → In-app messaging → New message.
# Or POST https://api.sendoracloud.com/api/v1/orgs/<ORG_UUID>/in-app-messages with the same payload.

Related