OneSignal or Sendora — pick the trade-off, not the marketing.
OneSignal sends push notifications well. But the audience targeting is OneSignal-local — you sync your CDP into them. Attribution lives in AppsFlyer. Lifecycle drips live in Customer.io. Sendora keeps all four in one tenant: push targeted by Sendora audiences, attributed through Sendora Links, triggered by Sendora Workflows, ROAS reported in Sendora Analytics.
Push platform. Audiences live in their tenant. Attribution + CRM sync is on you.
Push that's already wired to your audiences, your attribution, your workflows — same user_id everywhere.
Side-by-side
| Capability | OneSignal | Sendora |
|---|---|---|
| APNs + FCM + Web Push (VAPID) | ✅ | ✅ |
| Live Activities (iOS) + Live Updates (Android) | ✅ | ✅ cross-platform via `pushLiveActivities.platform` |
| Geofences | Limited | ✅ iOS + Android — SDK reports enter/exit/dwell |
| Critical Alerts (iOS DND bypass) | Limited | ✅ |
| Per-org frequency caps + TZ-aware quiet hours | ✅ | ✅ |
| Sticky A/B variant assignment | ✅ | ✅ — `assignAbVariant(test.id, userId)` hash-bucketed |
| Automatic A/B statistical readout + winner auto-promote | ✅ | ❌ — manual winner declaration via `setPushAbTestStatus` |
| Single-call audience send (one POST sends to whole audience) | ✅ Segments + Sends API | ✅ `POST /{email,push,sms}/send-to-audience` — same shape across all 3 channels w/ batch_id for operator correlation (W44-46) |
| Attribution closes back to ROAS — automatic deep-link wrap on every push | Via Mobile SDK + 3rd-party MMP | ✅ optional `wrapLink: { destinationUrl, campaign?, source?, medium? }` on push send mints a Sendora short link before dispatch + stamps `data.url` + `data.sendoraLinkId` — click → install → ROAS closes via existing Wave 47 Play Install Referrer + Wave 37-39 S2S postback pipeline (Wave 57) |
| Anon → identified device-takeover | ❌ DIY | ✅ built-in + SDK listener + webhook |
| Workflow triggers off `push.opened` / `push.clicked` / `push.dismissed` | Limited | ✅ first-class events |
| Invalid-token pruning + hourly GC | ✅ | ✅ — 30-day grace after `isActive=false` |
| Pricing model | Free → 10K mobile MAU; Growth $19+$0.012/MAU ≈ $139/mo at 10K | Bundle, 21 other modules included |
Why teams switch to Sendora
- OneSignal Growth scales to ~$139/mo at 10K mobile MAU. If you also pair it with AppsFlyer + Customer.io's push, Sendora collapses 3 vendors.
- Device-takeover on signin is built-in — anon push tokens reassigned automatically, no duplicate-push storm post-login.
- Geofences + Live Activities + Live Updates on one SDK + one event taxonomy — no separate vendor per platform.
- Device-takeover ends the duplicate-push class of bug architecturally — OneSignal customers chase it for months.
When OneSignal is the right call
- You need OneSignal's single-call audience send (`POST /notifications` with `included_segments`) — Sendora fans out per-recipient via Automation.
- You need automatic A/B statistical readout + winner auto-promotion — Sendora has variant assignment but manual winner declaration.
- You need automatic deep-link wrap on every push for ROAS attribution — Sendora's Deep Links module is separate; the push payload doesn't auto-wrap.
- You only need push, never cross-channel, and OneSignal's free tier covers you forever.
- Your dev team is heavily invested in OneSignal-specific tooling (Journey API, templates).
Common questions
How does Sendora handle iOS Live Activities vs OneSignal?
Both support APNs `push-type=liveactivity` token rotation. Sendora SDK manages per-activity token registration + the backend rate-limits to APNs's ~30/h budget. Visual ContentState editor in dashboard.
OneSignal customers hit duplicate pushes after signin. Does Sendora fix that?
Yes, architecturally. Device-takeover (s58.111+) auto-retires the anon `user_id` + reassigns push tokens on signin. Webhook + inline SDK listener fire so your mirror tables stay clean.
Does Sendora ship geofences on both iOS + Android?
Yes. iOS via CLLocationManager (20-region Apple cap), Android via GeofencingClient (100-region cap). SDK auto-registers + reports enter/exit/dwell as events.
How does OneSignal Journey port to Sendora Automation?
Journey logic ports to Sendora Automation flows. Branching + delays + wait-for-event + holdouts all port directly. Audience targeting becomes real-time instead of OneSignal-local.
Push
APNs + FCM + Web Push + Live Activities + Geofences + Critical Alerts + per-org frequency caps + quiet hours + sticky-by-user A/B — one SDK, three transports.
OneSignal and Braze send pushes. Sendora's Push module ships the same transport surface (APNs cert + token, FCM, Web Push VAPID), plus Live Activities (iOS ActivityKit + Android ongoing notifications) + Geofences + Critical Alerts + per-org frequency caps + TZ-aware quiet hours + sticky A/B variant assignment + automatic invalid-token pruning. Device-takeover on signin retires the anon `user_id` so a single device doesn't get duplicate pushes. Honest about scope: audience fan-out is via Automation workflows (not a single-call `sendToAudience()` API), and the A/B test ships variant assignment + manual winner declaration — not automatic statistical readout or auto-promote.
Switch from OneSignal. Keep your weekend.
Free plan covers real product use, no credit card. Bulk hash import for auth, CSV import for profiles, schema-validated event import for analytics — Data Sync module handles the migration in a day.