Troubleshooting Push Delivery

Work through this list top to bottom — it's ordered by how often each cause turns out to be the culprit.

1. Is the device registered with Pulsate?

Open the Pulsate CMS user list and search for the alias you started the session with. If the user/device isn't there, the problem is session start, not push:

  • startPulsateSessionForAlias must have completed with onSuccess at least once — add logging to the listener's onError and check for credential or network failures.
  • Sessions can't start from Application.onCreate() — a visible Activity is required.
  • PulsateFactory.getInstance(authData) returns null for empty credentials or credentials containing spaces; PulsateAuthData throws if either value isn't exactly 64 characters. Copy both values from Settings → App Settings → SDK Connect again.

2. Is notification permission granted?

On Android 13+ (API 33) pushes silently do nothing until the user grants POST_NOTIFICATIONS — see Notification Permission. Check: system Settings → Apps → your app → Notifications (the SDK's notification channel must not be blocked either).

3. Is the user opted out — on any of the three levels?

LevelCheckFix
Pulsate push switchisPushNotificationEnabled(...)setPushNotificationEnabled(true)
Global privacygetPrivacy(...) returns UNSUBSCRIBEsetPrivacy(PulsatePrivacy.SUBSCRIBE)
Logged outlogoutCurrentAlias was calledstartPulsateSessionForAlias again

Opted-out and logged-out states are easy to hit during QA and persist across app restarts.

4. Is FCM wired up?

  • google-services.json in the app module, package name matching your applicationId, com.google.gms.google-services plugin applied (FCM Setup).
  • The service-account key uploaded to the Pulsate CMS must belong to the same Firebase project as the running app's google-services.json — a mismatch (e.g. dev vs prod Firebase project) is the classic "works in debug, dead in release" cause.
  • If your app has its own FirebaseMessagingService, both onMessageReceived and onNewToken must be forwarded to Pulsate — a missing onNewToken forward means pushes die whenever FCM rotates the token.

5. Device-side delivery obstacles

  • Battery optimization / OEM task killers (Samsung "Sleeping apps", Xiaomi/Huawei/OnePlus battery managers) delay or drop FCM messages for backgrounded apps. Exempt the app in system settings and retest.
  • No Google Play Services (Huawei without GMS, some emulator images) — FCM cannot deliver at all. Test on a GMS device or an emulator image with Google Play.
  • Doze mode — normal-priority FCM messages are batched until the next maintenance window; a delay of minutes on an idle device is expected behavior, not a bug.
  • VPNs / restrictive networks can block FCM's port 5228–5230 connections; retest on mobile data.

6. Still stuck?

  • Check whether the campaign actually sent: campaign stats in the CMS show sends/opens per user.
  • Capture the device's logcat filtered to Pulsate while sending a test campaign and share it with [email protected] along with the alias, App ID, and campaign name.
  • Ask support about enabling debug mode for your app — the SDK can collect extended delivery diagnostics remotely.