| Client | Region | Devices | Delivered · 24h | Status |
|---|---|---|---|---|
| Streaming app | IR-1 · EU-1 | 744,354 | 1,204,918 | healthy |
| Marketplace | IR-1 | 82,110 | 96,402 | healthy |
| Fintech (sandbox) | EU-1 | 1,240 | 3,088 | sandbox |
Illustrative data.
Push, in-app inbox and realtime delivery for apps that live behind filtered networks. One API, running in your region, with no dependency on Google or Apple to reach your users.
First production tenant: a streaming app with 100k monthly actives on a network where FCM stopped resolving.
Firebase Cloud Messaging and APNs are wonderful — until a national firewall, a sanctions list or a DNS blackout sits between them and your users. Then every "we miss you" campaign, every new-episode alert, every payment reminder silently drops to zero, and your dashboards say "sent".
"We had 744,000 registered push tokens and could reach 278 people."Head of product, streaming app, August 2026
Carillon puts the delivery node where your users are, speaks to your app directly, and treats Google and Apple as optional accelerators rather than the only road.
Every message is written once to a per-device outbox on a regional node. The SDK collects it over whichever rung is open — and every rung de-duplicates by message id, so a user never sees the same notification twice.
While the app is open or recently used, the SDK keeps a lightweight WebSocket to the node. Messages, presence and realtime rooms ride the same connection.
A scheduled fetch of the outbox — WorkManager on Android, background fetch on iOS, service worker on web. Works with no third party at all.
Where FCM or APNs are reachable, Carillon relays a wake-up through them for instant delivery. When they aren't, nothing breaks — the lower rungs already have the message.
Everything lands in a persistent inbox your app renders natively: read state, deep links, images, expiry. The channel your users can always open.
Build audiences from device, region, app version, custom traits and your own events. Preview the count before you send.
One-off, recurring, or triggered by an API event. Send to 10% first, then to everyone. Frequency caps per user.
Right-to-left languages rendered correctly, per-locale variants, variables from your payload, image and action buttons.
Typed targets — a screen, an item, a URL — so taps land exactly where you meant, on every platform.
Sent → delivered → opened → acted, per transport and per campaign, with real p50/p95 latency — not a "sent" counter.
Two variants, an automatic winner, and the lift measured on the action you care about.
Presence, typing, and fan-out messages over the same socket — watch parties, live chat, collaborative sessions.
Every delivery and open event streams to your warehouse. Keep your own numbers.
Run a node inside the network your users are on. Data residency by design, not by policy PDF.
Clients, projects, environments and API keys with scoped permissions. Roles for growth, engineering and support. An audit log of every send and every setting change. Usage and delivery stats per client, so one console runs a whole portfolio of apps.
| Client | Region | Devices | Delivered · 24h | Status |
|---|---|---|---|---|
| Streaming app | IR-1 · EU-1 | 744,354 | 1,204,918 | healthy |
| Marketplace | IR-1 | 82,110 | 96,402 | healthy |
| Fintech (sandbox) | EU-1 | 1,240 | 3,088 | sandbox |
Illustrative data.
A REST API for your backend, thin SDKs for your apps. Register a device, subscribe to segments, render the inbox. The SDK handles the socket, the poll schedule and de-duplication so your code never sees a transport.
# send to a segment with a typed deep link curl -X POST https://api.getcarillon.com/v1/messages \ -H "Authorization: Bearer crl_live_…" \ -H "Content-Type: application/json" \ -d '{ "to": { "segment": "lapsed_30d" }, "title": { "fa": "قسمت جدید اومد", "en": "New episode is out" }, "body": { "fa": "فصل دوم، قسمت ۳ همین الان منتشر شد" }, "action": { "type": "screen", "screen": "post", "id": "8123" }, "image": "https://cdn.example.com/ep3.jpg", "ttl": "7d", "collapse": "ep-8123" }' # 202 Accepted → { "id": "msg_9Kx…", "audience": 26570 }
Yes. The socket and the background poll are Carillon-native and need only HTTPS to your node. FCM and APNs are optional relays that make delivery instant where they're reachable; where they aren't, the lower rungs of the ladder still deliver.
On Android without a cloud relay, the background poll is bounded by the OS scheduler — 15 minutes worst case. Apps that need instant background delivery can enable a foreground service mode in the SDK, or the FCM relay. The console shows real p50/p95 per transport so you decide with numbers.
On the regional node(s) you select. Growth plans run on shared nodes in each region; Enterprise gets a dedicated node or an on-prem install. Device tokens, message content and analytics never leave the region.
Register devices with your existing FCM/APNs tokens and Carillon will use them as the relay rung immediately, while the SDK brings up the native transports on the next app open. No big-bang cutover.
The SDK gives you the data (list, read state, actions); you render it in your own design. Reference components exist for Compose, SwiftUI and React.
Carillon is onboarding a small number of teams whose apps live behind filtered or unreliable networks. Tell us about yours.