Five channels. Clean adapters. Zero lock-in.

Everything you need to reach a user — and the interfaces to swap any piece out when you outgrow it.

Five channels, one platform

Everything you need to reach a user

Email, push, in-app, deep links and automation — behind clean adapter interfaces so you're never locked in.

Push notifications

Your own FCM credentials

Reach Android and iOS devices through your own Firebase project — FCM relays to APNs for iOS. Retainza batches sends, prunes dead tokens automatically, and never owns your deliverability.

  • Bring-your-own FCM service account
  • sendEach batching up to 500/call
  • Automatic dead-token pruning

Transactional & campaign email

Any SMTP, provider-agnostic

Send through any SMTP provider with nodemailer. Rich HTML with plain-text fallback, throttled to your provider's rate. SPF/DKIM guidance built in.

  • Works with SendGrid, SES, Postmark, or your own SMTP
  • HTML + text multipart
  • Rate-limit aware throttling

In-app messages

Five layouts, rendered for you

Modal, banner, full-screen, bottom-sheet and custom HTML — all rendered by the SDK, styled from the dashboard. Or take the payload yourself and draw it however you like.

  • Modal, banner, full-screen, bottom-sheet & HTML
  • Self-handled rendering when you want it
  • Frequency caps, quiet hours & queueing

Conditional & automated sends

Segments, schedules & triggers

Target saved segments or inline filters, then fire on a schedule, on an event (with delay + cooldown), or manually. Caps and quiet hours are enforced for every recipient.

  • Filter operators: eq, gt, lt, contains, in, exists…
  • Event triggers with delay & cooldown
  • Daily / weekly / one-off schedules

~20 lines to integrate

One SDK. Your UI stays yours.

A TypeScript core with thin wrappers for Web, React Native and Node. You keep full control of rendering and navigation — Retainza just hands you the message and the route.

  • Public key is write-only — safe to ship in apps
  • onInApp / onNavigate mirror your existing renderer & router
  • Server SDK uses the secret key for campaigns & send-now
App.tsx
import { Retainza } from "@retainza/react-native";

const engage = Retainza.init({
  publicKey: "pk_live_…",
  userProvider: () => auth.currentUser?.uid,
});

// Identify + track
await engage.identify(uid, { trial_days_left: 3, locale: "de" });
engage.track("opened_paywall");

// Render in-app messages + handle deep links, your way
engage.onInApp((msg) => showModal(msg));
engage.onNavigate((route) => router.push(route));

Built right

Security and portability, not an afterthought

The principles that shape every line — so you can trust it in production and leave whenever you want.

Multi-tenant from day one

The Project is the isolation boundary. Every write is scoped by projectId; nothing about one tenant is ever reachable by another.

Bring your own credentials

Each project connects its own FCM and SMTP. Retainza sends on your behalf and never owns delivery cost or deliverability.

Secrets encrypted at rest

Credentials never touch the database in plaintext — only a reference, backed by Secret Manager + per-project KMS envelope encryption.

Portable by design, no lock-in

Store and Channel adapter seams mean Firestore→Postgres and Functions→Run are swaps, not rewrites.

Own your engagement stack today

Start free on the hosted dashboard. Your data, your credentials, your rules.