Push Notification API Comparison 2026

Compare 6 push notification services side-by-side. Free tiers, platform support, multi-channel capabilities, and code examples to help you choose the right notification infrastructure.

push notification api onesignal vs firebase free push notification mobile push api web push api notification infrastructure

How Push Notifications Work

From your server to the user's device in 5 steps

📱
User Opts In
🔑
Device Token
☁️
Push Service
(APNs / FCM)
📨
Notification
Delivered
📊
Analytics &
Tracking

Common Use Cases

When and why to send push notifications

🔔 Transactional Alerts

Order confirmations, shipping updates, payment receipts, password resets. High-priority, time-sensitive notifications that users expect immediately.

📢 Marketing Campaigns

Promotions, flash sales, feature announcements, re-engagement. Segment users by behavior and send targeted messages to drive conversions.

💬 Chat & Social

New message alerts, friend requests, mentions, likes. Real-time notifications that keep users engaged with social and messaging features.

💰 Fintech & Trading

Price alerts, trade confirmations, balance changes, security alerts. Critical financial notifications where delivery speed and reliability matter most.

🎮 Gaming & Live Events

Turn notifications, match invites, tournament updates, live scores. Time-sensitive alerts that bring users back to your app at the right moment.

🤖 AI Agent Actions

Agent task completions, approval requests, workflow status changes. Notify users when autonomous AI agents need attention or finish work.

Feature Comparison

Side-by-side comparison of all 6 push notification services

Feature OneSignal FCM Pusher Beams Amazon SNS Expo Push Novu
Free Tier Unlimited mobile push Completely free 1K devices/mo 1M push/mo Unlimited 10K runs/mo
Starting Price $19/mo Free forever ~$29/mo $0.50/1M Free $30/mo
iOS (APNs)
Android (FCM)
Web Push
Email ✓ (10K/mo free) ∷ Basic ✓ (multi-provider)
SMS ∷ Paid only ✓ (multi-provider)
In-App ✓ (embeddable)
Segmentation ✓ (6 free) ∷ Via Analytics ✓ (topics)
A/B Testing
Scheduling ✓ (delay steps)
Rich Push ∷ Client-side
Analytics ✓ (30-day free) ✓ (BigQuery) ∷ Basic ∷ CloudWatch ∷ Receipts ✓ (activity feed)
Open Source ∷ Client SDK ✓ (self-host)

Channel Support Matrix

Which channels each service supports natively

Channel OneSignal FCM Pusher Beams Amazon SNS Expo Push Novu
iOS Push
Android Push
Web Push
Email
SMS
In-App Inbox
Slack
Discord
WhatsApp
Live Activities (iOS)

Provider Deep Dive

Detailed breakdown of each push notification service

OneSignal

Most Popular

Full-stack customer engagement platform with unlimited free mobile push. Journey builder, A/B testing, segmentation, and multi-channel delivery including email, SMS, and in-app messaging.

Pros

  • Unlimited free mobile push notifications
  • Visual journey builder for automated flows
  • A/B testing and intelligent delivery on paid plans
  • Multi-channel: push + email + SMS + in-app
  • 30+ integrations (Mixpanel, Amplitude, Segment)
  • Live Activities support (iOS)

Cons

  • Web push limited to 10K subscribers on free tier
  • Advanced features gated behind paid plans
  • SMS requires paid plan
  • Analytics history limited to 30 days on free

Firebase Cloud Messaging

100% Free

Google's push notification infrastructure. Completely free at any scale, no caps. Supports iOS, Android, and web push. Deep integration with Firebase ecosystem (Analytics, A/B Testing, Remote Config).

Pros

  • Completely free at any volume, no limits
  • Native Android integration, excellent reliability
  • Topic messaging (pub/sub) for broadcasts
  • Firebase A/B Testing integration (free)
  • BigQuery export for analytics
  • Notifications Composer for no-code campaigns

Cons

  • No built-in segmentation (use Firebase Analytics)
  • Rich push requires client-side implementation
  • No email, SMS, or in-app messaging
  • Google account and Firebase project required
  • Rate limiting on topic subscriptions

Pusher Beams

Simplest

Developer-focused push notification service by Pusher. Dead simple API for iOS, Android, and web push with hosted token management and authenticated user support.

Pros

  • Simplest API of any push service
  • Hosted token management (auto-refresh)
  • Authenticated users for private notifications
  • Real-time debug console
  • Single API call for multi-platform delivery
  • Webhooks for delivery and open tracking

Cons

  • Only 1,000 devices on free tier
  • No A/B testing or segmentation
  • No scheduling built-in
  • Push only, no email/SMS/in-app
  • Limited analytics compared to OneSignal

Amazon SNS

Scale King

AWS infrastructure for pub/sub messaging at massive scale. 1 million free mobile push per month, then $0.50 per million. Raw building block, not a user-facing notification platform.

Pros

  • 1M push notifications/month free permanently
  • Incredibly cheap: $0.50 per million beyond free tier
  • Pub/sub topics fan out to millions of subscribers
  • Supports iOS, Android, Fire, and Windows
  • FIFO topics for ordered delivery
  • Native Lambda, SQS, EventBridge integration

Cons

  • No web push support
  • No segmentation, analytics, or scheduling
  • No dashboards or visual tools
  • AWS account required (credit card needed)
  • You build everything yourself
  • Complex IAM and AWS SDK setup

Expo Push Notifications

React Native

Free push notification relay for Expo React Native apps. Abstracts APNs and FCM complexity into a single API. Send notifications with a simple HTTP POST, no server SDK required.

Pros

  • Completely free at any volume
  • Simplest setup for React Native apps
  • Unified push token across iOS and Android
  • No complex auth, just POST with tokens
  • Receipt API for delivery confirmation
  • Works with bare React Native workflow

Cons

  • Only works with Expo/React Native apps
  • No web push support
  • No segmentation, analytics, or A/B testing
  • No scheduling or automation
  • No email, SMS, or in-app channels
  • Expo account and EAS project ID required

Novu

Open Source

Open source notification infrastructure for all channels. Orchestrate push, email, SMS, in-app, and chat (Slack, Discord, Teams) in unified workflows. Self-host for free or use the cloud.

Pros

  • Open source, self-host for free (MIT license)
  • Multi-channel: push + email + SMS + in-app + chat
  • Embeddable <Inbox /> React component
  • Visual workflow builder + code-first TypeScript
  • Digest/batch engine to reduce notification fatigue
  • Provider-agnostic: swap delivery providers easily

Cons

  • 10K workflow runs/month on free cloud tier
  • No built-in A/B testing
  • Self-hosting requires DevOps knowledge
  • Push delivery depends on configured providers
  • Newer platform, smaller community than OneSignal

Managed Platform vs Raw Infrastructure

Choosing between turnkey solutions and building your own

Aspect Managed (OneSignal, Pusher) Infrastructure (FCM, SNS) Self-Hosted (Novu OSS)
Setup TimeMinutesHoursHours (Docker)
Token ManagementHandled for youYou manageProvider-dependent
SegmentationBuilt-in dashboardBuild your ownTopic-based
AnalyticsFull dashboardCloudWatch/BigQueryActivity feed
Multi-channelOneSignal: YesPush onlyAll channels
Cost at 1M users$1,200+/moFree (FCM) / ~$5/mo (SNS)Hosting costs only
Vendor Lock-inHighMedium (Google/AWS)None
Best ForMarketing teams, fast iterationEngineering teams, AWS/GCP appsTeams wanting full control

Code Examples

Send your first push notification with each provider

Sending a Push Notification

OneSignal
FCM
Pusher
Amazon SNS
Expo
Novu

OneSignal (REST API)

# Send to all subscribers
curl -X POST https://onesignal.com/api/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Basic YOUR_REST_API_KEY" \
  -d '{
    "app_id": "YOUR_APP_ID",
    "included_segments": ["All"],
    "headings": {"en": "New Feature!"},
    "contents": {"en": "Check out our latest update."},
    "url": "https://yourapp.com/updates"
  }'

OneSignal (Node.js)

const response = await fetch('https://onesignal.com/api/v1/notifications', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Basic YOUR_REST_API_KEY'
  },
  body: JSON.stringify({
    app_id: 'YOUR_APP_ID',
    included_segments: ['All'],
    headings: { en: 'New Feature!' },
    contents: { en: 'Check out our latest update.' }
  })
});
const data = await response.json();
console.log(`Sent to ${data.recipients} devices`);

FCM HTTP v1 API (cURL)

# Send to a specific device
curl -X POST https://fcm.googleapis.com/v1/projects/YOUR_PROJECT/messages:send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -d '{
    "message": {
      "token": "DEVICE_FCM_TOKEN",
      "notification": {
        "title": "New Feature!",
        "body": "Check out our latest update."
      },
      "data": {
        "url": "https://yourapp.com/updates"
      }
    }
  }'

FCM (Node.js with Firebase Admin)

import admin from 'firebase-admin';

admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

const message = {
  notification: {
    title: 'New Feature!',
    body: 'Check out our latest update.'
  },
  token: 'DEVICE_FCM_TOKEN'
};

const response = await admin.messaging().send(message);
console.log('Message sent:', response);

Pusher Beams (cURL)

# Send to a device interest (topic)
curl -X POST "https://YOUR_INSTANCE.pushnotifications.pusher.com/publish_api/v1/instances/YOUR_INSTANCE/publishes/interests" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -d '{
    "interests": ["updates"],
    "web": {
      "notification": {
        "title": "New Feature!",
        "body": "Check out our latest update.",
        "deep_link": "https://yourapp.com/updates"
      }
    },
    "apns": {
      "aps": {
        "alert": {
          "title": "New Feature!",
          "body": "Check out our latest update."
        }
      }
    },
    "fcm": {
      "notification": {
        "title": "New Feature!",
        "body": "Check out our latest update."
      }
    }
  }'

Pusher Beams (Node.js)

import PushNotifications from '@pusher/push-notifications-server';

const beamsClient = new PushNotifications({
  instanceId: 'YOUR_INSTANCE_ID',
  secretKey: 'YOUR_SECRET_KEY'
});

await beamsClient.publishToInterests(['updates'], {
  apns: {
    aps: { alert: { title: 'New Feature!', body: 'Check out our latest update.' } }
  },
  fcm: {
    notification: { title: 'New Feature!', body: 'Check out our latest update.' }
  },
  web: {
    notification: { title: 'New Feature!', body: 'Check out our latest update.' }
  }
});

Amazon SNS (AWS CLI)

# Send to a platform endpoint (single device)
aws sns publish \
  --target-arn "arn:aws:sns:us-east-1:123456789:endpoint/GCM/MyApp/abc123" \
  --message '{"GCM": "{\"notification\": {\"title\": \"New Feature!\", \"body\": \"Check out our latest update.\"}}"}' \
  --message-structure json

Amazon SNS (Node.js with AWS SDK)

import { SNSClient, PublishCommand } from '@aws-sdk/client-sns';

const sns = new SNSClient({ region: 'us-east-1' });

// Send to a topic (broadcast)
const result = await sns.send(new PublishCommand({
  TopicArn: 'arn:aws:sns:us-east-1:123456789:app-updates',
  Message: JSON.stringify({
    GCM: JSON.stringify({
      notification: { title: 'New Feature!', body: 'Check out our latest update.' }
    }),
    APNS: JSON.stringify({
      aps: { alert: { title: 'New Feature!', body: 'Check out our latest update.' } }
    })
  }),
  MessageStructure: 'json'
}));
console.log('MessageId:', result.MessageId);

Expo Push (cURL)

# Send to Expo push tokens (no auth needed)
curl -X POST https://exp.host/--/api/v2/push/send \
  -H "Content-Type: application/json" \
  -d '[{
    "to": "ExponentPushToken[xxxxxxxx]",
    "title": "New Feature!",
    "body": "Check out our latest update.",
    "data": {"url": "/updates"},
    "sound": "default"
  }]'

Expo Push (Node.js)

import { Expo } from 'expo-server-sdk';

const expo = new Expo();

const messages = [{
  to: 'ExponentPushToken[xxxxxxxx]',
  title: 'New Feature!',
  body: 'Check out our latest update.',
  data: { url: '/updates' },
  sound: 'default'
}];

const chunks = expo.chunkPushNotifications(messages);
for (const chunk of chunks) {
  const tickets = await expo.sendPushNotificationsAsync(chunk);
  console.log('Tickets:', tickets);
}

Novu (cURL)

# Trigger a workflow for a subscriber
curl -X POST https://api.novu.co/v1/events/trigger \
  -H "Content-Type: application/json" \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -d '{
    "name": "new-feature",
    "to": {
      "subscriberId": "user_123",
      "email": "user@example.com"
    },
    "payload": {
      "title": "New Feature!",
      "body": "Check out our latest update.",
      "url": "https://yourapp.com/updates"
    }
  }'

Novu (Node.js)

import { Novu } from '@novu/node';

const novu = new Novu('YOUR_API_KEY');

await novu.trigger('new-feature', {
  to: {
    subscriberId: 'user_123',
    email: 'user@example.com'
  },
  payload: {
    title: 'New Feature!',
    body: 'Check out our latest update.',
    url: 'https://yourapp.com/updates'
  }
});
// Novu routes to push + email + in-app based on workflow config

Topic-Based Broadcasting

OneSignal
FCM
Amazon SNS

OneSignal: Send to a Segment

curl -X POST https://onesignal.com/api/v1/notifications \
  -H "Content-Type: application/json" \
  -H "Authorization: Basic YOUR_REST_API_KEY" \
  -d '{
    "app_id": "YOUR_APP_ID",
    "included_segments": ["Premium Users"],
    "headings": {"en": "Exclusive Offer"},
    "contents": {"en": "50% off premium features, today only!"},
    "chrome_web_image": "https://example.com/promo.png",
    "big_picture": "https://example.com/promo.png"
  }'

FCM: Send to a Topic

import admin from 'firebase-admin';

// Subscribe device to topic
await admin.messaging().subscribeToTopic(
  ['token1', 'token2', 'token3'],
  'premium-users'
);

// Send to all topic subscribers
const response = await admin.messaging().send({
  topic: 'premium-users',
  notification: {
    title: 'Exclusive Offer',
    body: '50% off premium features, today only!'
  },
  android: {
    notification: { imageUrl: 'https://example.com/promo.png' }
  },
  apns: {
    payload: { aps: { 'mutable-content': 1 } },
    fcm_options: { image: 'https://example.com/promo.png' }
  }
});
console.log('Sent to topic:', response);

Amazon SNS: Publish to Topic

import { SNSClient, PublishCommand } from '@aws-sdk/client-sns';

const sns = new SNSClient({ region: 'us-east-1' });

// Publish to all topic subscribers (push + email + SQS + Lambda)
await sns.send(new PublishCommand({
  TopicArn: 'arn:aws:sns:us-east-1:123456789:premium-users',
  Subject: 'Exclusive Offer',
  Message: JSON.stringify({
    default: 'Exclusive offer: 50% off premium features!',
    GCM: JSON.stringify({
      notification: {
        title: 'Exclusive Offer',
        body: '50% off premium features, today only!',
        image: 'https://example.com/promo.png'
      }
    }),
    APNS: JSON.stringify({
      aps: {
        alert: { title: 'Exclusive Offer', body: '50% off premium features!' },
        'mutable-content': 1
      }
    })
  }),
  MessageStructure: 'json'
}));

Pricing at Scale

Monthly cost by number of active users

Monthly Active Users OneSignal FCM Pusher Beams Amazon SNS* Expo Push Novu Cloud
1,000 Free Free Free Free Free Free
10,000 $19 + $120 Free ~$29 Free Free Free (10K runs)
50,000 $19 + $600 Free ~$99 Free Free $30 + usage
100,000 $19 + $1,200 Free Custom ~$2.50 Free $30 + usage
500,000 Custom Free Custom ~$125 Free $250+
1,000,000 Custom Free Custom ~$250 Free Custom

* Amazon SNS pricing is per notification sent ($0.50/million), not per user. Costs assume ~5 notifications per user per month. OneSignal prices at $0.012/MAU + $19 platform fee.

Decision Guide

Pick the right push notification service for your use case

Building a mobile app with marketing?

You need segmentation, A/B testing, journey automation, and analytics. You want a dashboard your marketing team can use without engineering.

Pick: OneSignal

Firebase app that needs push?

You're already using Firebase Auth, Firestore, or Analytics. You want free push at any scale with deep Firebase ecosystem integration.

Pick: Firebase Cloud Messaging

Simple push for a small app?

You want the fastest possible setup, a clean API, and don't need marketing features. Just reliable push delivery to your users.

Pick: Pusher Beams

AWS-native architecture at massive scale?

You're building on AWS, need pub/sub fan-out to millions, and your engineering team will build the notification logic. Cost is critical.

Pick: Amazon SNS

React Native app with Expo?

You're building with Expo's managed or bare workflow. You want zero-config push that just works across iOS and Android.

Pick: Expo Push Notifications

Multi-channel notification workflows?

You need push + email + SMS + in-app + Slack in one system with workflow orchestration, digests, and subscriber preferences. You want open source.

Pick: Novu

Need webhook infrastructure for your notifications?

Frostbyte's Webhook Inspector lets you test, debug, and monitor webhook deliveries. Create inboxes instantly, no signup required.

Explore Frostbyte Tools

Frequently Asked Questions

What is the best free push notification service?
Firebase Cloud Messaging (FCM) is completely free at any volume with no caps. OneSignal offers unlimited free mobile push notifications. Amazon SNS gives 1 million mobile push notifications per month free. Expo Push is free for React Native apps. Novu is open source and free when self-hosted. For most developers, OneSignal offers the best balance of free features and ease of use.
OneSignal vs Firebase: which should I use?
OneSignal is a full-featured notification platform with built-in segmentation, A/B testing, journey builder, and analytics. FCM is raw infrastructure that delivers messages but requires you to build everything else. Choose OneSignal if you want a dashboard-driven experience with marketing features. Choose FCM if you're already using Firebase, want zero cost at any scale, or prefer to build custom notification logic.
Can I send web push notifications without a mobile app?
Yes. OneSignal, Firebase Cloud Messaging, and Pusher Beams all support web push notifications via the Web Push API (service workers). Web push works on Chrome, Firefox, Edge, and Safari. You don't need a mobile app. OneSignal's free tier includes up to 10,000 web push subscribers. FCM web push is completely free.
What is the cheapest push notification API at scale?
Firebase Cloud Messaging is free at any scale. Amazon SNS costs only $0.50 per million push notifications beyond the free tier. Novu is free when self-hosted. OneSignal's Growth plan starts at $19/month plus $0.012 per monthly active user. At 100K users, OneSignal costs approximately $1,219/month while FCM and SNS remain essentially free.
Do I need APNs and FCM credentials?
Yes, for native mobile push you need Apple Push Notification service (APNs) credentials for iOS and Firebase Cloud Messaging (FCM) credentials for Android. Services like OneSignal, Pusher Beams, and Novu manage the connection to APNs/FCM for you. You provide your credentials once during setup. Expo abstracts this entirely for React Native apps. For web push, you generate VAPID keys instead.
Is there an open source push notification service?
Yes. Novu is the leading open source notification infrastructure platform (MIT license). It handles push, email, SMS, in-app, and chat notifications with a visual workflow builder. You can self-host it for free with Docker. For simpler needs, libraries like web-push (npm) let you send web push notifications directly without a managed service.
How do push notifications differ from webhooks?
Push notifications are sent from a server to an end user's device (phone, browser). Webhooks are server-to-server HTTP callbacks triggered by events. Push notifications require device tokens and platform services (APNs/FCM). Webhooks just need a URL endpoint. Use push for user-facing alerts, webhooks for system-to-system event delivery. Many apps use both: webhooks trigger backend logic, which then sends push notifications to users.