Your FCM project and tokens
Keep the same Firebase project. Every registration token already in your user table keeps working. No app update, no token refresh, no user-side change.
Migration
Stop writing Cloud Functions to schedule pushes. Keep your FCM project, keep every registration token, swap the server-side send code for one ReachBell API call — and get segments, email, and automations as the bonus.
ReachBell sends through your existing Firebase Cloud Messaging project — not around it. That means every registration token in your user database keeps working unchanged, no app update ships, no users get re-prompted, and your Android, iOS, and web push paths continue to route exactly as they always did. You just stop writing the send code.
Three steps
Server-side switch only. Your mobile clients don’t need to know the cutover happened.
You don't migrate the FCM project — you keep it. In Firebase Console → Project Settings → Service Accounts, generate a private key JSON. Upload it to ReachBell when you create the project, and we send through your existing FCM (and APNs, if you've registered iOS) without touching the registration tokens already in your app.
Your client app stays exactly as it is — same firebase-messaging SDK, same VAPID key for web, same FCM registration tokens. On the send side, swap your custom Firebase Admin code (or curl-against-FCM-REST scripts) for a single call to ReachBell's /v1/messages endpoint. Same tokens, friendlier API.
Open ReachBell → Project → Verification → Send Test. Paste a known FCM token from your user table and fire a test push. The notification should arrive on the device within seconds. If it doesn't, our diagnostics tell you exactly which credential is misconfigured.
The send swap
The change is purely server-side. Your firebase-messaging client SDK doesn’t change.
- import * as admin from "firebase-admin";
- admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
-
- await admin.messaging().send({
- token: user.fcmToken,
- notification: { title: "Order shipped", body: "Tracking #..." },
- android: { priority: "high" },
- apns: { headers: { "apns-priority": "10" } },
- });
+ import { ReachBell } from "@reachbell/sdk";
+ const rb = new ReachBell({ apiKey: process.env.REACHBELL_KEY });
+
+ await rb.messages.send({
+ channel: "push",
+ to: { fcmToken: user.fcmToken }, // same token, no migration
+ title: "Order shipped",
+ body: "Tracking #...",
+ priority: "high",
+ });ReachBell signs and forwards to FCM under the hood — your token formats, batching, and TTLs all stay valid.
What you keep
The project, the tokens, the certificates, the analytics — untouched.
Keep the same Firebase project. Every registration token already in your user table keeps working. No app update, no token refresh, no user-side change.
iOS routes through the same APNs auth key (.p8) and team ID you already configured for FCM. Upload the .p8 to ReachBell once; we sign each request server-side.
firebase-messaging on Android, iOS, and web stays exactly where it is. ReachBell only replaces the server-side send code — your client never knows the swap happened.
FCM topics (/topics/all, /topics/news_en) keep routing because ReachBell sends through your FCM project. We add real segments on top — no more "topic per language per geo" sprawl.
What you gain
FCM is the transport. ReachBell adds the engagement layer you were going to build anyway.
FCM gives you topics and condition strings. ReachBell adds saved segments, behavioral filters, and user-property targeting on the same token pool — no schema migrations.
Layer transactional and campaign email on AWS SES into the same automations as your FCM pushes. Trigger a push, fall back to email if it doesn't open in an hour — built in.
FCM is "free" until you pay for the Firebase Blaze plan tier underneath. ReachBell bills predictably in rupees with a GST invoice — no surprise Cloud Functions overage at month end.
Median time to retire your first Cloud Function: under 30 minutes. Talk to sales@reachbell.com
FAQ
Everything teams usually ask before switching. Something missing? Email us — a human replies.
No. That's the whole point of this path. ReachBell sits on top of your existing Firebase Cloud Messaging project — we send through your FCM credentials rather than asking you to rebuild on a new push channel. Every registration token in your user database keeps working; you don't ship an app update; users notice nothing. You only change the server-side code that calls the FCM HTTP v1 API or Firebase Admin SDK.
In Firebase Console → Project Settings → Service Accounts, click "Generate new private key" — it downloads a JSON file. Upload that JSON to ReachBell when you create the project (Project → Channels → Mobile Push). We use it to mint short-lived OAuth tokens against the FCM HTTP v1 API. The key never leaves your Google Cloud project boundary — it's only used to sign requests on your behalf.
If you were already routing iOS through FCM (the standard pattern), it keeps working unchanged — your APNs auth key is configured in Firebase Console and we send through that path. If you want to talk to APNs directly without FCM in the middle, upload the .p8 auth key, team ID, and bundle ID to ReachBell separately and we'll route iOS through APNs while keeping Android on FCM.
No — Firebase Analytics and Remote Config keep running. ReachBell replaces the messaging layer, not the analytics SDK. If you were using Firebase In-App Messaging or FCM's built-in A/B test, you'll rebuild those flows in ReachBell's automation designer instead — and you get push + email A/B testing on the same segments.
Replace the admin.messaging().send() call (or the raw FCM REST POST) with a POST to https://api.reachbell.com/v1/messages — same FCM token in the payload, friendlier response format. Most teams collapse a few hundred lines of Cloud Function code into a single API call. We provide a thin Node, Python, and Go client. Email sales@reachbell.com for help mapping your existing send logic.
Free forever for your first 1,000 subscribers. Set up in five minutes — no credit card needed.
Start free today