Skip to content

Push

Everything else in your app works for the people who already have it open. Push is the only thing that reaches the member who closed it last week.

Delivering a notification to a locked phone belongs to Apple and Google. It is built into iOS and Android, and nobody sells an alternative — so Push is not a delivery network of ours.

What it is, is everything above that:

  • Which devices belong to which member, kept current as phones change hands, get reset, or are replaced.
  • Sending, retrying a failure, and giving up sensibly.
  • Removing a phone that was wiped, so you stop paying to notify nobody.
  • Collapsing five messages from one conversation into one banner instead of five.
  • Your allowance, and a warning long before you reach it.

This is the part worth understanding before you set anything up, because it is unusual.

Your Apple push key and your Firebase service account stay on your WordPress. Your own site uses them to sign a token that lasts about an hour, and only that short-lived token is sent to the service that does the delivering.

Two consequences follow, and both are the point:

  • Deleting a key on your site actually revokes it. There is no copy of it anywhere else, and nothing to ask us to withdraw.
  • A breach on our side is bounded to about an hour, against sites that had recently refreshed — not to your credentials.

On iOS there is no Firebase in the path at all. Notifications go to Apple directly with your .p8.

For iOS, from your Apple Developer account:

You needWhere it is
Push key (.p8)Certificates, Identifiers & Profiles → Keys → a key with Apple Push Notifications service enabled
Key IDShown beside that key. Ten characters
Team IDTop right of the developer portal. Ten characters
Bundle IDYour app’s identifier, e.g. app.memberside.yourcommunity

Apple lets you download a .p8 once. Keep it somewhere safe; if you lose it you have to revoke the key and make a new one.

For Android, from your Firebase project:

You needWhere it is
Service account JSONProject settings → Service accounts → Generate new private key
google-services.jsonProject settings → Your apps → Android app → Download

The service account is what authorises a send. The google-services.json is what your build needs — four public identifiers are read out of it and compiled into your app so it can register for notifications.

You need one platform’s credentials or the other, or both. A community shipping Android only never needs a .p8.

Go to Memberside → API Keys and fill in the Apple and Firebase cards.

For the .p8, paste the whole file — including its -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY----- lines. Without them it looks like a file path rather than a key, and the panel will tell you it could not be read.

Both can instead be given as absolute paths in wp-config.php, which is the better option if your keys belong in deployment configuration:

define( 'MEMBERSIDE_APNS_KEY_PATH', '/etc/memberside/AuthKey_ABCDE12345.p8' );
define( 'MEMBERSIDE_APNS_KEY_ID', 'ABCDE12345' );
define( 'MEMBERSIDE_APNS_TEAM_ID', 'TEAM123456' );
define( 'MEMBERSIDE_APNS_BUNDLE_ID', 'app.memberside.yourcommunity' );
define( 'MEMBERSIDE_FIREBASE_CREDENTIALS_PATH', '/etc/memberside/firebase.json' );

Go to Memberside → Services, switch Push Notifications on, and choose Authorize this site. You approve the domain on memberside.app and land back in WordPress connected.

Then choose Test & install. This is the most useful button on the screen: it signs a real token with your real keys and reports exactly what Apple or Google said about it. A malformed .p8 shows up here rather than as a member who was silently never notified.

The Firebase identifiers and your bundle ID are compiled into the app, so notifications only work in a build made after you added them. The next build registers each member’s device when they open it.

Only things that already happened on your site.

SourceSendsNeeds
NotificationsReplies, reactions, mentions, friend requests — whatever raises your bellUltimate Member – Real-time Notifications
ChatDirect messages, titled with the sender’s nameBetter Messages

Both can be switched off independently in the Push panel. Chat is by far the higher volume, and is the one to switch off first if members tell you the app is noisy.

There is no broadcast tool, no composer, and no way for us to notify your members. Campaigns and audiences are not part of this.

Unlike Realtime, which carries no member content at all, a push notification carries its own title and body — it has to, because a closed app has nothing to fetch with.

Treat anything in a notification as readable on a locked phone, because it is.

This is the one place a Memberside limit does not degrade gently, and it is worth being blunt about.

Over the storage cap, an upload is refused and your site serves its own files. Over the connection cap, a member falls back to the periodic refreshes they had before. Over the send cap, a notification is not delivered — not late, not queued. The member it was for never learns it existed.

We warn you at 80% for exactly that reason. Every paid builder plan includes 25,000 notifications a month, which is enough for most communities.

An app built and installed from Xcode gets sandbox device tokens, and sending those to Apple’s production servers fails with BadDeviceToken — an error that reads exactly like a corrupt token.

If you are testing that way, switch on Apple sandbox in the Push panel. Turn it off before you ship: TestFlight and App Store builds need production.

SymptomCauseFix
Nothing arrives at allThe service is not connectedConnect it under Memberside → Services
Keys are set, nothing arrivesThe credentials were never acceptedChoose Test & install; it names what Apple or Google refused
A pasted .p8 reports as unreadableIt was pasted without its BEGIN and END linesPaste the whole file, or give an absolute path
Android works, iOS does notNo .p8, or the wrong APNs environmentAdd the key; switch on Apple sandbox for a debug build
iOS works, Android does notNo service account, or no google-services.jsonAdd both, then rebuild
One member gets nothingThey declined the notification permissionThey re-enable it in their phone’s settings
It stopped mid-monthThe allowance is spentCheck the panel — those notifications are not delivered later
“Domain mismatch” on the panelA staging copy of a production databaseCorrect: a copy that kept sending would notify your real members

It does not write your notifications. The text comes from your site.

It does not hold your credentials. See above — that is the whole design.

It cannot reach a member who declined permission, and nothing on your side can change that. They control it from their phone.