Skip to Content
GuidesChannelsPush notifications

Set up Push notifications

Public

Push notifications reach users on their browser, Android device, or iPhone. Active Reach supports four configurations depending on your platform coverage.

Push is a property-scoped channel, not workspace-scoped. Each property = one SDK install (web app / Android app / iOS app / kiosk), and each property has its own VAPID, FCM, or APNs keys. A multi-app brand will have one push configuration per property, all rolling up under the same workspace.

Before you start

You’ll need:

  • Admin access to your Active Reach workspace
  • For FCM (Android/Web): a Firebase project with a service account JSON key
  • For APNs (iOS): an Apple Developer account ($99/year) with a .p8 key

Choose your path

PathPlatforms coveredRequiresSetup time
Managed (Web VAPID)Chrome, Firefox, Safari (web only)Nothing — Active Reach hosts VAPID keys1 business day
BYOM FCMAndroid + WebFirebase service-account.json10 minutes
BYOM APNsiOS onlyApple .p8 key10 minutes
BYOM FCM + APNsAndroid + iOS + WebBoth Firebase and Apple credentials15 minutes

Managed setup (Web Push)

Choose “Active Reach-Managed (Web Push)”

Go to Settings → Channels → Push → Setup under the property you want to enable push for. Select the managed option. Active Reach manages VAPID key rotation and delivery infrastructure for that property — no Firebase or Apple accounts needed. Repeat per property if you have multiple SDK installs (web + mobile app + kiosk).

Provide business details

Fill in company name, contact email, website, use case, and expected monthly volume.

Install the SDK

The wizard shows platform-specific code snippets with your write key and workspace ID pre-filled. For web push:

<script src="https://cdn.activereach.ai/sdk/aegis.min.js"></script> <script> Aegis.init('YOUR_WRITE_KEY', { workspace_id: 'YOUR_WORKSPACE_ID', push: { enabled: true } }); </script>

Send a test push

Enter a device token (from your browser’s push subscription) and send a test notification. Verify it arrives.

Wait for activation

Managed web push requests are reviewed within 1 business day. You’ll be notified when the channel is live.

BYOM FCM setup (Android + Web)

Choose “BYOM FCM (Firebase)” and select your platforms

Select FCM on the mode page. On the platform page, confirm you want Android, Web, or both.

Upload your Firebase service account JSON

Download the key from Firebase Console → Project Settings → Service accounts → Generate new private key.

Drag-and-drop the JSON file into the uploader. The wizard extracts:

  • Project ID
  • Client email (service account)
  • Private key

Credentials are validated live against Firebase before you can proceed. Stored AES-256-GCM encrypted.

Install the SDK

The wizard shows code snippets for each selected platform:

  • Web — HTML script tag with push: { enabled: true }
  • Android (Kotlin) — Gradle dependency + Aegis.initialize() in your Application class
  • React Native — npm install + initialization
  • Flutter — pubspec.yaml dependency + initialization

All snippets are pre-filled with your write key and workspace ID. Copy and paste.

Send a test push

Select the platform (Web or Android), enter a device token, optionally customize the title and body, and hit Send test.

You’re done

Summary shows your Firebase Project ID, platforms configured, and test result.

BYOM APNs setup (iOS)

Choose “BYOM APNs (Apple)”

Select APNs on the mode page.

Enter your Apple credentials

You’ll need these from developer.apple.com → Certificates, IDs & Profiles → Keys:

FieldWhere to find itFormat
Team IDApple Developer membership page10 characters
Key IDKeys page in Developer portal10 characters
Bundle IDYour app’s bundle identifiere.g., com.yourbrand.app
Private keyDownload the .p8 file and paste its full contentsStarts with -----BEGIN PRIVATE KEY-----
EnvironmentProduction or SandboxSelect based on your build type

Credentials are validated live — the wizard fires a JWT test against APNs.

Apple enforces a 2-key-per-account hard limit. If you’re sharing a .p8 key across multiple push providers (CleverTap, Braze, etc.), check “Skip validation” to bypass the live JWT test.

Send a test push

Enter an iOS device token and send a test. Verify the notification appears on the device.

You’re done

Summary shows your APNs Bundle ID, environment, and test result.

Full cross-platform (FCM + APNs)

Follow both the FCM and APNs steps above. The wizard walks you through Firebase first, then Apple, then the SDK install, then a combined test step where you can test each platform individually.

Final coverage: Android + iOS + Web — every platform push can reach.

Push engagement signals

Once an SDK install is active, Active Reach receives push lifecycle signals from the user’s device automatically — there is nothing extra to wire on your side beyond installing the SDK.

SignalFires whenSource
push.deliveredThe OS confirmed the notification reached the deviceFCM service / iOS NSE / web Service Worker
push.shownBanner was rendered (web push only)Service Worker
push.clickedUser tapped the notificationHost app’s notification delegate
push.dismissedUser swiped the notification awayAndroid DeleteIntent receiver shipped with the SDK / iOS UN delegate
push.permission_deniedUser declined the OS promptHost app on permission flow
push.subscribed / push.resubscribedNew or refreshed push tokenSDK push manager

The SDK posts each signal to POST /v1/push/engagement at the ingestion gateway. See Event ingestion for the full wire shape. The signals flow through to:

  • delivery_events (ClickHouse) — channel='push', status one of shown / clicked / dismissed. Powers the campaign analytics reports (delivery rate, click rate, dismiss rate per platform).
  • timeline_cards — surfaces in the contact activity feed.
  • Outbound webhooks — fan out as delivery.delivered / delivery.opened / delivery.clicked events (see Webhook event types).

Engagement reporting is best-effort — push notifications still display even if the engagement POST is dropped (network failure, OS killing the NSE before it finishes, etc.). Treat the analytics as a representative sample, not a perfect count.

iOS Notification Service Extensions only have ~30 seconds before the OS kills the process, so push.delivered is reliable but push.clicked / push.dismissed must originate from the host app’s UNUserNotificationCenterDelegate (in the main app process, not the NSE).

What’s next