Skip to content
Pushix Pushix
Features Developers Guides Pricing Questions
Sign in Start free
Menu
Features Developers Guides Pricing Questions
Sign in Create a free account
  1. Home
  2. Guides
  3. React Native

React Native push notifications

React Native and Expo push notifications on Android and iOS with Firebase Cloud Messaging: install the Pushix SDK, handle taps, tags and in-app messages.

Updated 31 October 2026 15 min read Mobile apps

Mobile apps

  • Flutter
  • Android
  • iOS
  • React Native

Websites

  • Web push
  • WordPress

Your backend

  • REST API
  • PHP, Node.js, Python

Switching

  • Switching to Pushix
  • All guides
On this page 18 sections
  1. Requirements
  2. 1. Add the package
  3. 2. Add Firebase to the app
  4. 3. Android setup
  5. 4. iOS setup
  6. 5. Register the background handlers (index.js)
  7. 6. Initialize
  8. API overview
  9. Handling taps
  10. While the app is open
  11. In-app messages
  12. Tags
  13. Data-only messages
  14. Consent
  15. Expo
  16. How notifications are drawn
  17. Testing
  18. Troubleshooting

The pushix-react-native package registers Android phones and iPhones with Pushix, shows notifications, tells your app when one is tapped, and shows in-app messages. It works with plain React Native and with Expo development builds.

Under the hood it uses React Native Firebase for the push token and messages, Notifee to draw notifications (buttons, pictures, channels, notifications while the app is open) and AsyncStorage to remember the device.

Requirements#

  • React Native 0.76 or newer (old or new architecture), React 18.2+
  • @react-native-firebase/app and @react-native-firebase/messaging 22 or newer. Version 27 needs dynamic frameworks on iOS (see iOS setup).
  • @notifee/react-native 9
  • @react-native-async-storage/async-storage 1.19 or newer (2.x and 3.x work)
  • Android minSdk 24 and compileSdk 34 or newer
  • iOS 15.0 or newer, Xcode 16, and a paid Apple Developer account (push needs an APNs key)
  • One Firebase project with your Android app and your iOS app in it.
  • Expo: a development build (npx expo run:android, EAS Build). Expo Go doesn't contain these native modules.

1. Add the package#

Copy the sdks/react-native folder from your Pushix download next to your app (or into a private Git repository) and install it with its peer dependencies:

Shell
npm install --install-links ../pushix/sdks/react-native
npm install @react-native-firebase/app @react-native-firebase/messaging \
  @notifee/react-native @react-native-async-storage/async-storage
cd ios && pod install

--install-links makes npm copy the package into node_modules. Without it npm makes a symlink to a folder outside your project, which Metro refuses ("Unable to resolve module pushix-react-native … could not be found within the project"). A later plain npm install turns the copy back into a symlink, so also add this line to your app's .npmrc:

Code
install-links=true

You can instead run npm pack in the SDK folder and npm install the .tgz file. With Yarn 1: yarn add file:../pushix/sdks/react-native (Yarn copies it).

If the app already uses another push SDK, remove it (and its Expo config plugin, if any): two push SDKs in one app fight over Firebase messaging and the iOS notification delegate.

2. Add Firebase to the app#

Follow the React Native Firebase getting started guide for @react-native-firebase/app. In short:

  • Android: download google-services.json from Firebase into android/app/, add classpath("com.google.gms:google-services:4.5.0") to the dependencies of android/build.gradle and apply plugin: "com.google.gms.google-services" to android/app/build.gradle.
  • iOS: add GoogleService-Info.plist to the app target in Xcode, call FirebaseApp.configure() (with import FirebaseCore) at the start of application(_:didFinishLaunchingWithOptions:) in AppDelegate.swift, and use dynamic frameworks in ios/Podfile (React Native Firebase 27 gets Firebase through Swift Package Manager):
Ruby
platform :ios, '15.0'
use_frameworks! :linkage => :dynamic

Use the Firebase project whose service account you upload to Pushix. A different project makes every send fail with SENDER_ID_MISMATCH.

Then create firebase.json in the project root (next to package.json):

JSON
{
  "react-native": {
    "messaging_android_notification_channel_id": "pushix_default"
  }
}

That points notifications Android shows while the app is closed at the SDK's high-importance channel. Leave messaging_ios_foreground_presentation_options out (or []): the SDK shows foreground notifications itself, and iOS would otherwise show them twice. Leave messaging_installation_id_enabled off; Pushix sends to FCM tokens.

3. Android setup#

Notification icon — Android draws the small icon as a white silhouette, so a full-colour launcher icon shows up as a white square. Create a white-on-transparent icon (Android Studio → New → Image Asset → Notification Icons), name it ic_stat_notification, and use it in two places:

XML
<!-- android/app/src/main/AndroidManifest.xml, inside <application>: for notifications Android shows while the app is closed -->
<meta-data android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_notification" />

and defaultSmallIcon: 'ic_stat_notification' in Pushix.initialize (for notifications the SDK draws). You can also set it once for all sends in the dashboard (App settings → Android defaults). Don't add default_notification_channel_id or default_notification_color to the manifest: React Native Firebase already declares them (from firebase.json), and a second copy breaks the build. Set the colour with "messaging_android_notification_color": "@color/your_colour" in firebase.json.

Permission — Android 13+ asks before showing notifications. Firebase declares the permission; if the dialog never appears, add it to AndroidManifest.xml yourself:

XML
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

Keep icons and sounds in release builds — icons and sounds named only in messages (small_icon, android_sound) look unused to the build and get removed by resource shrinking. Create android/app/src/main/res/raw/keep.xml:

XML
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@drawable/ic_stat_*,@raw/*" />

If a message names an icon, sound or channel that doesn't exist in the app, the SDK falls back to the default icon, sound and channel instead of dropping the notification. Notification buttons need no manifest entries; Notifee handles them.

4. iOS setup#

iPhone notifications travel from Pushix through Firebase to Apple (APNs). Three one-time steps:

APNs key in Firebase. In the Apple Developer site create a key with Apple Push Notifications service (APNs) and download the .p8 file. In Firebase → Project settings → Cloud Messaging → Apple app configuration, upload it with its Key ID and your Team ID. One key works for all your apps.

Capabilities. Open ios/YourApp.xcworkspace in Xcode, select the app target → Signing & Capabilities, and add Push Notifications and Background Modes with Remote notifications ticked.

Deployment target. iOS 15.0 or newer, in the Podfile (above) and under the target → General → Minimum Deployments.

Unlike the Flutter SDK there is no UNUserNotificationCenter line to add to the AppDelegate: React Native Firebase and Notifee install the notification delegate themselves.

Pictures and buttons on iPhone (optional)#

While the app is open the SDK shows pictures and buttons itself. When the app is in the background, iOS only shows a picture (big_picture or ios_attachments) and buttons when the app has a Notification Service Extension. Pushix has one ready:

  1. Open ios/YourApp.xcworkspace in Xcode: File → New → Target → Notification Service Extension, name it NotificationService and click Finish (choose "Cancel" if Xcode offers to activate the scheme).
  2. Add Pushix's extension library to it in ios/Podfile, then run cd ios && pod install:
Ruby
target 'NotificationService' do
  use_frameworks!
  pod 'Pushix/Extension', :path => '../../pushix/sdks/ios'   # the sdks/ios folder from your Pushix download
end
  1. Replace the generated NotificationService.swift with:
Swift
import Pushix

class NotificationService: PushixNotificationServiceExtension {}

The extension downloads the picture and adds the message's buttons (it registers a category for them); it needs no Firebase code. Deployment target 13.0 or later.

Your own button categories (optional)#

With the extension above, buttons need nothing else. To use a category of your own instead, register it at start-up:

TypeScript
import notifee from '@notifee/react-native';

notifee.setNotificationCategories([
  { id: 'OFFER_ACTIONS', actions: [{ id: 'claim', title: 'Claim', foreground: true }, { id: 'later', title: 'Later' }] },
]);

and send "ios_category": "OFFER_ACTIONS" (composer → iOS options → Category). The tapped button's id arrives as event.result.actionId for notifications shown while the app is open. For notifications iOS drew itself while the app was in the background, Firebase reports taps on the notification but not which button, so such a tap may arrive without actionId.

Badges#

Send ios_badgeType Increase or SetTo with ios_badgeCount. Pushix keeps each iPhone's count and resets it to zero on the server whenever the app opens. To clear the number on the icon itself when the app opens, call notifee.setBadgeCount(0).

5. Register the background handlers (index.js)#

Android starts your app's JavaScript without any screens to handle a push that arrives while the app is closed. Only code at the top level of the entry file runs then, so register the SDK's two handlers in index.js, before AppRegistry:

JavaScript
// index.js
import notifee from '@notifee/react-native';
import { getMessaging, setBackgroundMessageHandler } from '@react-native-firebase/messaging';
import { pushixBackgroundHandler, pushixNotifeeBackgroundHandler } from 'pushix-react-native';
import { AppRegistry } from 'react-native';
import App from './App';
import { name as appName } from './app.json';

// Draws Android notifications with buttons, a large icon or grouping while the app is closed.
setBackgroundMessageHandler(getMessaging(), pushixBackgroundHandler);
// Reports taps on those notifications and their buttons.
notifee.onBackgroundEvent(pushixNotifeeBackgroundHandler);

AppRegistry.registerComponent(appName, () => App);

Plain notifications (title, text, picture) are shown by Android and iOS without the handlers, but buttons and large icons need them. Firebase and Notifee each allow only one background handler; if your app already has one, call Pushix from it:

JavaScript
setBackgroundMessageHandler(getMessaging(), async (message) => {
  await pushixBackgroundHandler(message);
  // ...your own code
});

notifee.onBackgroundEvent(async (event) => {
  await pushixNotifeeBackgroundHandler(event);
  // ...your own code
});

6. Initialize#

Call initialize once from your root component. Not at the top of index.js: that also runs when Android handles a push in the background.

TSX
// App.tsx
import { useEffect } from 'react';
import { LogLevel, Pushix, PushixInAppMessageHost } from 'pushix-react-native';

export default function App() {
  useEffect(() => {
    Pushix.Debug.setLogLevel(LogLevel.Warn); // Verbose while setting up
    Pushix.initialize('YOUR_APP_ID', {
      serverUrl: 'https://pushix.in',
      defaultSmallIcon: 'ic_stat_notification', // Android
    });

    Pushix.Notifications.addEventListener('click', (event) => {
      const data = event.notification.additionalData ?? {};
      // route to a screen, e.g. data.screen === 'orders'
    });
  }, []);

  return (
    <>
      <RootNavigator />
      <PushixInAppMessageHost />
    </>
  );
}

initialize options:

OptionDefault
serverUrlrequiredhttps://pushix.in
defaultSmallIconic_launcherAndroid drawable for notifications the SDK draws
autoOpenWebUrlstrueOpen http(s) launch and button URLs in the browser when tapped
inAppMessagestrueTurn in-app messages off
appVersiondetectedApp version for the "App version" filter. Found automatically when the app has expo-application or react-native-device-info; otherwise pass it (e.g. from package.json)

Then ask for permission at a sensible moment (iPhone and Android 13+ show the system dialog):

TypeScript
await Pushix.Notifications.requestPermission(true);

With true, when the dialog can no longer appear because the user said no before, the app's notification settings open instead.

When the user logs in to your app, link the device to your user id so your backend can target them:

TypeScript
Pushix.login(String(user.id)); // on login
Pushix.logout();               // on logout (also clears tags)

Calls made before initialize wait for it. That's it. Open the app once and the device appears in the dashboard under Subscribers, marked Android or iOS.

API overview#

CallWhat it does
Pushix.initialize(appId, { serverUrl, ... })Starts the SDK (options above)
Pushix.Debug.setLogLevel(LogLevel.Verbose)How much the SDK logs (None … Verbose)
Pushix.login(id) / Pushix.logout()Links the device to your user id / unlinks it (also clears tags)
Pushix.setConsentRequired(true) / Pushix.setConsentGiven(true)Registers only after the user agrees
Pushix.Notifications.requestPermission(true) / getPermissionAsync() / hasPermission() / canRequestPermission()Notification permission
Pushix.Notifications.addEventListener('click' | 'foregroundWillDisplay' | 'permissionChange' | 'silentData', fn) / removeEventListenerTaps, notifications arriving while the app is open, permission changes, data-only messages
event.preventDefault(), event.getNotification().display()Hides or delays a notification in foregroundWillDisplay
Pushix.Notifications.clearAll()Removes the app's notifications
Pushix.User.addTag / addTags / removeTag / removeTags / getTags / setLanguage / getExternalIdTags, message language, your user id
Pushix.User.pushSubscription.getIdAsync() / getTokenAsync() / getOptedInAsync() / optIn() / optOut() / addEventListener('change')Player id, FCM token and opt-in state of this device
Pushix.InAppMessages.addTrigger / addTriggers / removeTrigger / removeTriggers / clearTriggers / setPaused / getPausedIn-app message triggers, and holding messages back
Pushix.InAppMessages.addEventListener('click' | 'willDisplay' | 'didDisplay' | 'willDismiss' | 'didDismiss', fn)In-app message events
<PushixInAppMessageHost />Draws in-app messages; mount it once
pushixBackgroundHandler, pushixNotifeeBackgroundHandlerBackground handlers for index.js (step 5)

Exported types include PushixNotification (notificationId, title, body, additionalData, launchURL, actionButtons, bigPicture, …), NotificationClickEvent, NotificationWillDisplayEvent, InAppMessageClickEvent and LogLevel.

Handling taps#

TypeScript
Pushix.Notifications.addEventListener('click', (event) => {
  const n = event.notification;
  console.log(n.notificationId);      // id from the REST API
  console.log(n.additionalData);      // your "data" object
  console.log(n.launchURL);           // your "url"
  console.log(event.result.actionId); // button id, or undefined for the notification itself
  console.log(event.result.url);      // the button's url, or the launch url
});
  • Taps that open the app from closed are delivered as soon as you add the first click listener (on the next tick), so add it early.
  • http:// and https:// URLs open in the browser automatically. Turn that off with autoOpenWebUrls: false.
  • Each tap is reported to the server and shows up as “Clicked” in the dashboard.

Deep links (myshop://orders) are not opened automatically; route them yourself. With React Navigation, use a navigation ref:

TSX
import { createNavigationContainerRef, NavigationContainer } from '@react-navigation/native';

export const navigationRef = createNavigationContainerRef<RootStackParamList>();

Pushix.Notifications.addEventListener('click', ({ notification, result }) => {
  const open = () => {
    if (result.url === 'myshop://orders' || notification.additionalData?.screen === 'orders') {
      navigationRef.navigate('Orders');
    }
  };
  navigationRef.isReady() ? open() : setTimeout(open, 300);
});

// <NavigationContainer ref={navigationRef}>…</NavigationContainer>

If you already have a React Navigation linking config, Linking.openURL(result.url) hands the link to it.

While the app is open#

Notifications are shown even when the app is in the foreground, on Android and iPhone (drawn by Notifee). To hide or delay one:

TypeScript
Pushix.Notifications.addEventListener('foregroundWillDisplay', (event) => {
  if (currentScreen === 'orders') {
    event.preventDefault();               // don't show it
    // event.getNotification().display(); // or show it later
  }
});

Call preventDefault() synchronously inside the listener. On iOS, React Native Firebase's own foreground banners stay off (the default), so a message isn't shown twice; pushes from other senders in your app aren't shown while it is open either, unless you draw them.

In-app messages#

Create them in the dashboard under In-app messages: a pop-up, card, top or bottom banner, or full screen, with your colours, picture and up to three buttons. The SDK downloads the ones meant for this device each time a session starts and shows them by their trigger:

TriggerShows
When the app opensOn each new session (launch, or back after 30+ seconds)
From the Nth sessionWhen the app opens and the device has had at least N sessions
After some time in the appN seconds into the session
When my code sets a triggerWhen your code calls addTrigger with a matching key and value

Mount the host once, as the last child of your root component, so it draws above your screens:

TSX
import { useSafeAreaInsets } from 'react-native-safe-area-context';

function Root() {
  const insets = useSafeAreaInsets(); // optional; estimated from the status bar without it
  return (
    <>
      <NavigationContainer>…</NavigationContainer>
      <PushixInAppMessageHost insets={insets} />
    </>
  );
}

Pop-ups and full-screen messages open in a React Native Modal; cards and banners are drawn over your app without blocking it. The host keeps clear of the notch, status bar and home indicator; pass insets (most apps already have react-native-safe-area-context) for exact spacing.

TypeScript
Pushix.InAppMessages.addTrigger('cart_value', 1200);
Pushix.InAppMessages.setPaused(true);  // e.g. during a game round
Pushix.InAppMessages.setPaused(false);

Pushix.InAppMessages.addEventListener('click', (event) => {
  // event.result.actionId is the button id; event.result.url its link
  if (event.result.action === 'deep_link' && event.result.url === 'myshop://account') {
    navigationRef.navigate('Kyc');
  }
});

Frequency rules (show at most N times, wait between showings) are kept on the device. "Open a link" buttons open the browser; "Deep link" buttons are handed to your click listener (or opened with Linking if you have none). Seen, clicked and closed counts appear in the dashboard and in Analytics. Messages wait while the app is in the background or paused, and show when it comes back.

iOS can't show a pop-up on top of another Modal: if your app has one open, pause in-app messages until it closes.

Tags#

Tags are key–value strings used for segments, filters and {{ personalisation }}.

TypeScript
Pushix.User.addTags({ level: 7, plan: 'gold', last_bonus: Math.floor(Date.now() / 1000) });
Pushix.User.removeTag('plan');
const tags = await Pushix.User.getTags();

Your backend can also set tags by user id without the app: PUT /api/v1/apps/{app_id}/users/{external_user_id}.

Changes made while offline are saved on the phone and sent when the server can be reached again.

Data-only messages#

Messages sent with content_available: true and no contents don't show anything. While the app is open you get them here:

TypeScript
Pushix.Notifications.addEventListener('silentData', (n) => {
  if (n.additionalData?.refresh === 'balance') reloadBalance();
});

When the app is in the background they arrive in Firebase's background handler; read them in your own handler (see step 5) with message.data. iOS limits how often background messages wake an app.

Consent#

TypeScript
Pushix.setConsentRequired(true); // before initialize
// later, when the user agrees:
Pushix.setConsentGiven(true);

Until consent is given the device isn't registered and nothing is sent to Pushix.

Expo#

The SDK works in Expo apps built with development builds or EAS Build (not Expo Go). In app.json:

JSON
{
  "expo": {
    "android": {
      "package": "com.yourcompany.app",
      "googleServicesFile": "./google-services.json"
    },
    "ios": {
      "bundleIdentifier": "com.yourcompany.app",
      "googleServicesFile": "./GoogleService-Info.plist",
      "entitlements": { "aps-environment": "production" },
      "infoPlist": { "UIBackgroundModes": ["remote-notification"] }
    },
    "plugins": [
      "@react-native-firebase/app",
      ["@react-native-firebase/messaging", { "android": { "notificationIcon": "./assets/notification_icon.png" } }],
      ["expo-build-properties", { "ios": { "useFrameworks": "dynamic" } }],
      ["./plugins/withNotificationIcon", { "icon": "./assets/notification_icon.png" }]
    ]
  }
}

Install expo-build-properties with npx expo install expo-build-properties. Notifee and AsyncStorage need no plugin. Put firebase.json (step 2) in the project root as well.

Notification icon. The Firebase plugin points Android at @drawable/notification_icon but doesn't create it. This small local plugin copies your white-on-transparent PNG into the Android project; save it as plugins/withNotificationIcon.js:

JavaScript
const fs = require('fs');
const path = require('path');
const { withDangerousMod } = require('expo/config-plugins');

module.exports = function withNotificationIcon(config, { icon }) {
  return withDangerousMod(config, [
    'android',
    async (cfg) => {
      const dir = path.join(cfg.modRequest.platformProjectRoot, 'app/src/main/res/drawable');
      fs.mkdirSync(dir, { recursive: true });
      fs.copyFileSync(path.join(cfg.modRequest.projectRoot, icon), path.join(dir, 'notification_icon.png'));
      return cfg;
    },
  ]);
};

and pass defaultSmallIcon: 'notification_icon' to Pushix.initialize.

Entry file. The background handlers must run before the app registers, so set "main": "index.js" in package.json and create index.js. With a classic App.tsx:

JavaScript
// index.js
import notifee from '@notifee/react-native';
import { getMessaging, setBackgroundMessageHandler } from '@react-native-firebase/messaging';
import { registerRootComponent } from 'expo';
import { pushixBackgroundHandler, pushixNotifeeBackgroundHandler } from 'pushix-react-native';
import App from './App';

setBackgroundMessageHandler(getMessaging(), pushixBackgroundHandler);
notifee.onBackgroundEvent(pushixNotifeeBackgroundHandler);

registerRootComponent(App);

With Expo Router, drop the App and registerRootComponent lines and end the file with import 'expo-router/entry'; instead, then put initialize and <PushixInAppMessageHost /> in app/_layout.tsx.

Then npx expo prebuild --clean (or let EAS Build do it). Pictures and buttons on iPhone while the app is in the background need a Notification Service Extension, which in Expo needs a config plugin for app extensions; everything else works without one.

How notifications are drawn#

  • Plain messages (title, text, picture) are sent as normal notifications. Android and iOS show them even if the app was swiped away.
  • On Android, messages with buttons, a large icon or android_group are sent as data messages and drawn by the SDK through pushixBackgroundHandler. These need the app process to start, which some phone makers (Xiaomi, Oppo, Vivo, Realme) block when battery saving is aggressive. Prefer plain messages for anything important.
  • While the app is open, every Pushix notification is drawn by the SDK so foregroundWillDisplay can hide it.

Testing#

  1. Run the app on your phone (npx react-native run-android / run-ios, or a development build) and allow notifications. On iPhone use a real device; the simulator only receives pushes on recent Xcode with Apple silicon.
  2. In the dashboard, open Subscribers, click your device and tick Test device.
  3. New message → Send to test devices.

Troubleshooting#

ProblemFix
Metro: "Unable to resolve module pushix-react-native … could not be found within the project"npm installed the package as a symlink. Add install-links=true to .npmrc and run npm install again, or install the .tgz from npm pack.
Device never appears in SubscribersCheck serverUrl (must be reachable from the phone over HTTPS) and the App ID. Turn on Pushix.Debug.setLogLevel(LogLevel.Verbose) and read the Metro / Logcat / Xcode console.
"Firebase is not set up" in the loggoogle-services.json / GoogleService-Info.plist is missing, or on iOS FirebaseApp.configure() isn't called. Rebuild the app after adding them.
Every send fails with SENDER_ID_MISMATCHThe service account in the dashboard is from a different Firebase project than google-services.json / GoogleService-Info.plist.
iPhone never registers ("No APNs token yet" in the log)Add the Push Notifications capability, check the bundle id matches the iOS app in Firebase, and test on a real device.
iPhone registers but nothing arrivesUpload the APNs key in Firebase → Cloud Messaging. Firebase reports this as an authentication error in the message's error.
iPhone: notifications appear twice while the app is openRemove messaging_ios_foreground_presentation_options from firebase.json, and make sure expo-notifications or another notification library isn't also showing them.
iPhone: no picture or buttons when the app is in the backgroundAdd the Pushix Notification Service Extension (see iOS setup).
pod install fails about Firebase or frameworksReact Native Firebase 27 needs use_frameworks! :linkage => :dynamic (Expo: expo-build-properties → ios.useFrameworks: "dynamic").
Android build: "Attribute meta-data … default_notification_channel_id … is also present"Remove that meta-data from your manifest and set the channel in firebase.json instead.
Notification shows as a white square (Android)Use a white-on-transparent small icon (see Android setup).
No pop-up, only an icon in the status bar (Android)The channel isn't high importance. Use the default pushix_default channel, or create your own with Notifee and AndroidImportance.HIGH. If the user lowered it in system settings, only they can raise it again.
Buttons or large icon missing while the app is closed (Android)Register pushixBackgroundHandler in index.js (step 5). On Xiaomi etc. ask users to allow Autostart / disable battery optimisation, and send plain messages for anything important.
Taps on notifications with buttons aren't reported after the app was closedRegister pushixNotifeeBackgroundHandler with notifee.onBackgroundEvent in index.js.
Custom sound doesn't play (Android)On Android 8+ the channel decides the sound. Create a separate channel with that sound in your app (Notifee createChannel) and send its id as android_channel_id.
Permission dialog never appears (Android 13+)Add POST_NOTIFICATIONS to the manifest. After two "Don't allow" answers Android stops asking; requestPermission(true) then opens the settings.
In-app message never showsCheck <PushixInAppMessageHost /> is mounted, its status is Live, the platform is ticked, and its frequency hasn't been used up on this device. Messages are fetched when a session starts.
In-app pop-up doesn't appear on iPhone while my own modal is openiOS shows one Modal at a time. Call Pushix.InAppMessages.setPaused(true) while yours is open.
"App version" is empty in the dashboardPass appVersion to initialize, or add expo-application / react-native-device-info.
Jest: "Cannot use import statement outside a module"The SDK is published as ES modules. Add pushix-react-native to transformIgnorePatterns, e.g. node_modules/(?!(react-native|@react-native|pushix-react-native)/), and mock the native packages as you would without Pushix.
Previous guideiOS push notifications Next guideWeb push notifications

Send your first notification

Create an app in Pushix to get your App ID and REST API key, then follow this guide. The free plan needs no card.

Create a free account See pricing

On this page

  1. Requirements
  2. 1. Add the package
  3. 2. Add Firebase to the app
  4. 3. Android setup
  5. 4. iOS setup
  6. Pictures and buttons on iPhone (optional)
  7. Your own button categories (optional)
  8. Badges
  9. 5. Register the background handlers (index.js)
  10. 6. Initialize
  11. API overview
  12. Handling taps
  13. While the app is open
  14. In-app messages
  15. Tags
  16. Data-only messages
  17. Consent
  18. Expo
  19. How notifications are drawn
  20. Testing
  21. Troubleshooting
Back to top
Pushix Pushix

Push notification service for Android, iPhone and websites, from one dashboard or one API call. Built in West Bengal, India.

info@pushix.in

Product

Features Developers Pricing Questions Sign in Create an account

Guides

Flutter guide Android guide iOS guide React Native guide Web push guide WordPress guide REST API guide PHP, Node.js, Python guide Switching to Pushix guide All guides

Legal

Terms of Service Privacy Policy Cookie Policy Acceptable Use Policy Data Processing Addendum Refund & Cancellation Policy Service Delivery Policy

Company

Contact us All legal pages Support

© 2026 Pushix. All rights reserved.

Pushix · Powered by Pynix