Send Smarter Push
Notifications Across iOS and Android

AppsOnAir Push is the developer-first alternative. Deep segmentation, multi-language delivery, verified metrics, and a same-day migration that keeps your subscribers.

1.04M Sent
Successfully resolved
9:41
Shopvananow
Flash sale starts now
30% off every winter jacket. Today only.
Shopvana1m ago
La vente flash commence
30% de réduction sur chaque veste d'hiver.
Shopvana5m ago
Venta flash iniciada
30% de descuento en chaquetas.
93.5% Confirmed
Reported directly by the device OS, not just accepted by APNs.
THE PROBLEM

Sending push notifications is simple.
Managing them can get complicated.

Different users, devices, languages, segments, and delivery data can make push notifications harder to manage.

Reach the right users

Not every user should get the same notification.

Send in the right language

Different users need the same message in different languages.

Know what was delivered

Sending is not enough. You need to know what actually reached the device.

Painful setup & maintenance

Managing expiring APNs certificates, FCM keys, and device tokens constantly drains your engineering time.

WHAT APPSONAIR PUSH DOES

Create, send, and track push notifications from one place.

Manage targeting, languages, delivery, and push workflows without adding another separate platform.

Choose who gets it

Target users by segment, language, platform, activity, or your own customer data.

Send the right message

Create multiple language versions in one notification and deliver the right one to each user.

See what happened

Track what was sent, delivered, and opened after every notification.

BUILT FOR BETTER PUSH DELIVERY

Why choose AppsOnAir Push?

Different users, devices, languages, segments, and delivery data can make push notifications harder to manage.

Built to stay affordable

Not every user should get the same notification.

Data tagging & segmentation

Different users need the same message in different languages.

Keep control of your setup

Sending is not enough. You need to know what actually reached the device.

Built for larger audiences

Send and manage notifications without adding more complexity as your user base grows.

USE CASES

Push for the moments that matter

Send timely, relevant notifications based on what your users need and what's happening in your app.

Order & delivery updates
Keep customers informed of shipping status and milestone updates, so they never have to guess where their package is.
Shopvana
now
Out for delivery
Your package is 2 stops away. Track your driver live on the map.
Reminders
Trigger contextual alerts for appointments, tasks, or event schedules to ensure your users never miss an important moment.
09:41
Tuesday, 14th
Calendar
15m ago
Design Sync Meeting
Starts in 15 minutes. Link attached.
Join Call
Snooze
Product & feature updates
Announce newly released features, app version updates, or bug fixes directly to keep your audience engaged and informed.
Version 2.0
App Update
now
New UI & Dark Mode
Experience the completely redesigned interface and faster load times. Tap to explore.
Promotions & offers
Drive engagement and immediate conversions with flash sales, exclusive discounts, and personalized offers sent directly to the lock screen.
Store
1m ago
Flash Sale
50% OFF
Ends in 2 hours
Your exclusive discount
Apply code VIP50 at checkout to claim your offer on all shoes.
Shop Now
Account & security alerts
Notify users immediately about new sign-in attempts, password changes, or suspicious activities to ensure account safety.
Security Alert
now
A new sign-in was detected from Chrome on Mac OS (San Francisco, CA).
Review Activity
This was me
Time-sensitive updates
Deliver critical notifications instantly when every second counts. Ideal for live sports scores, flight gate changes, and severe weather alerts.
Cab arriving
Live
2 min
Honda Civic • AB 1234
EFFORTLESS MIGRATION

Move off legacy platforms in an afternoon

Import the same APNs/FCM credentials you already use. Existing tokens keep working perfectly. A simple CSV import keeps your historical audience active instantly.

Legacy Provider

Capped Free
Active Buyers List 18,420 subscribers
Cart Abandoners 6,180 subscribers
Quick Migration

AppsOnAir Push

Active
Active Buyers List 18,420 people
Cart Abandoners 6,180 people
Head to Head

AppsOnAir vs OneSignal

Feature
AppsOnAir
OneSignal
Free plan
checked
Up to 2,000 MAU
Up to 1,000 MAU
Pricing approach
checked
Built to keep push affordable as MAU grows
MAU-based pricing increases with usage
Mobile workflow
checked
Part of AppsOnAir with OTA, CodePush, AppLink, AppSync, and AppRemark
Focused on messaging
Migration
checked
Reuse your existing Apple/Firebase credentials and import subscribers
Existing provider
iOS rich images
checked
SDK includes the required notification extension
Requires your team to configure the extension
Audience import
checked
Import existing subscribers and continue sending
Supported
TRANSPARENT PRICING

Compare push costs at your MAU

Enter your monthly active users to see how AppsOnAir Push compares with other push notification platforms.

MAU
1K10K100K1M
Provider Estimated monthly cost
AppsOnAir Push Pro Plus plan $949
OneSignal $12,019
Pushwoosh $5,000
Customer.io $9,100
Firebase (FCM) $0
Save up to $11,070/month at 1,000,000 MAU
Estimates based on published pricing for 1,000,000 active users.
Start Saving

Estimates are based on publicly available pricing and vary by plan, usage, or additional features.

DEVELOPER SDKS

Send from anywhere in a few lines

Native SDKs for iOS and Android, wrappers for React Native and Flutter, and a REST API that is safe to retry.

push-integration.dev
// Send a rich, multi-language notification with actions and platform metadata
POST https://push.dev.appsonair.com/v1/send-jobs
Authorization: Key aoa_pk_7Kd9...q2Xf

{
  "name": "Launch announcement",
  "payload": [
    {
      "languageCode": "en",
      "title": "Order shipped 📦",
      "subtitle": "Arriving tomorrow",
      "body": "Your order #12345 is on its way.",
      "imageUrl": "https://cdn.acme.com/ship.jpg",
      "url": "https://acme.com/orders/12345"
    },
    {
      "languageCode": "es",
      "title": "Pedido enviado 📦",
      "subtitle": "Llega mañana",
      "body": "Tu pedido #12345 está en camino."
    }
  ],
  "additionalData": {
    "order_id": "12345",
    "screen": "order_detail",
    "promo": {
      "code": "SHIP10",
      "expires": "2026-09-30"
    }
  },
  "actions": [
    {
      "id": "track",
      "title": "Track",
      "url": "acme://orders/12345",
      "foreground": true
    },
    {
      "id": "cancel",
      "title": "Cancel",
      "destructive": true,
      "foreground": false
    }
  ],
  "iosMetadata": {
    "sound": "default",
    "badge": 7,
    "badgeIncrement": 1,
    "mutableContent": true,
    "threadId": "order-updates",
    "category": "order-updates",
    "interruptionLevel": "active",
    "relevanceScore": 0.8,
    "attachments": [
      {
        "id": "hero",
        "url": "https://cdn.acme.com/ship.jpg"
      }
    ]
  },
  "androidMetadata": {
    "priority": "HIGH",
    "channelId": "order-updates",
    "sound": "default",
    "notificationPriority": "PRIORITY_HIGH",
    "clickAction": "OPEN_ORDER_DETAIL",
    "defaultVibrateTimings": true
  },
  "targetType": "ALL",
  "ttlSeconds": 3600,
  "collapseId": "launch-2026",
  "idempotencyKey": "launch-2026-api-attempt-1"
}
Install
npm install appsonair-react-native-apppush@0.0.1-alpha
npx pod-install          # iOS only
Quick start
import AppPushService from 'appsonair-react-native-apppush';

async function setupPush() {
  await AppPushService.initialize({ debug: __DEV__ });

  const granted = await AppPushService.requestPermission();
  if (!granted) return;

  // Resolves `null` until registration finishes, call it *after* permission.
  const token = await AppPushService.getToken();
  console.log('push token', token);

  await AppPushService.login('user-42');
}
Install – pubspec.yaml
dependencies:
  appsonair_flutter_apppush: ^0.0.1-alpha
Quick start – main.dart
import 'package:appsonair_flutter_apppush/appsonair_flutter_apppush.dart';

Future<void> setupPush() async {
  await AppPushService.initialize();

  final granted = await AppPushService.isPermissionGranted();
  if (!granted) {
    await AppPushService.Notifications.requestPermission();
  }

  AppPushService.addTokenListener((token, apnsEnvironment) {
    print('push token: $token');
  });

  await AppPushService.login('user-42');
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
  await setupPush();
}
Install – Podfile
target 'MyApp' do
  pod 'AppsOnAir-AppPush'
end
Quick start – AppDelegate.swift
// Info.plist, main app target only - required, initialize() can't
// register a device without it:
// <key>AppsonairAppId</key>
// <string>app_8f21cd90</string>

import AppsOnAir_AppPush

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        AppPushService.initialize(debug: true)
        AppPushService.setListener(self)
        AppPushService.Notifications.requestPermission()
        AppPushService.login("user_12345")
        return true
    }
}

extension AppDelegate: PushListener {
    // All four are required in Swift (empty body is fine) - ObjC's
    // AOAPushListener makes them @optional instead.
    func onAPNsTokenUpdated(token: String, environment: APNsEnvironment) {
        print("push token", token)
    }
    func onNotificationReceived(notification: PushNotification) {}
    func onNotificationOpened(notification: PushNotification) {}
    func onError(_ error: PushError) {}
}
Install – build.gradle.kts
// settings.gradle.kts - the SDK is distributed through JitPack
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven("https://jitpack.io")
    }
}

// app/build.gradle.kts
plugins {
    id("com.google.gms.google-services")
}

dependencies {
    implementation("com.github.apps-on-air:appsonair-android-push-notification:0.0.2-alpha")
}

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions { jvmTarget = "17" }
}
Quick start
// Requires google-services.json in app/ from the Firebase Console.
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        AppPushService.initialize(this)
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AppPushService.Notifications.requestPermission(this)
        AppPushService.login("user_12345")
    }
}

Get Beta Access to AppsOnAir Push Notifications

Be among the first to try AppsOnAir Push Notifications. Enter your email to join the beta and get early access.





Arrow
FAQ

Got Questions? We've Got Answers

Does AppsOnAir Push support both iOS and Android?

Can I send push notifications in multiple languages?

Can I target specific groups of users?

How much does AppsOnAir Push cost?

Can I move from OneSignal or another push provider?