Starting with Firebase Cloud Messaging (FCM) is straightforward. You get a device token on the frontend, make a POST request to the Firebase API from your backend, and the notification arrives. For an MVP or an early-stage application, this architecture is enough.
The problem starts when the product grows and notifications shift from simple transactional alerts to a core retention tool.
What began as a simple 50-line script to send alerts quickly turns into a complex distributed system. Suddenly, the marketing team needs to send campaigns to inactive users. Product wants a 3-day onboarding sequence. Support needs to know if a specific user received a critical alert.
If you are building and maintaining all this logic directly against FCM, you are building an internal CRM instead of focusing on your core product.
The anatomy of a "homegrown" push system
When you use FCM directly, you take on the responsibility of building everything above the network layer. A robust notification system requires much more infrastructure than it appears on the surface:
1. The Segmentation Nightmare
In a hardcoded system, every specific campaign requires code. If the growth team wants to message "iOS users who purchased in the last 30 days but haven't opened the app in 7 days", a backend developer has to:
- Write a complex SQL query.
- Extract the thousands of associated tokens.
- Queue the payloads in a system like Redis or RabbitMQ to avoid hitting Firebase API rate limits.
- Monitor the worker to ensure it doesn't crash mid-process.
This turns your most expensive engineers into glorified data extractors.
2. Fragile Workflows and Automation
Building an automated flow (e.g., Day 1: Welcome, Day 3: Feature nudge, Day 7: Offer) requires dedicated infrastructure. You need cron jobs, state tables to track where each user is in the sequence, retry queues, and error handling.
If a user performs the desired action on Day 2, your system must pull them out of the flow before sending the Day 3 message. Programming this cancellation logic is error-prone and hard to test.
3. The Analytics Black Box
FCM is a delivery system. When you send a message, Firebase returns a message_id confirming receipt. It does not tell you whether the message reached the device, failed, stayed pending, or what happened to each user in a campaign.
To get real visibility, you have to build send-state tables, retry logic, per-device error tracking, and an internal dashboard so other teams can audit deliveries without asking you for a manual export.
When it's time to migrate
The clearest indicator to stop using FCM directly is engineering time allocation.
If your backend developers spend entire sprints tweaking cron jobs for campaigns, debugging why a user received a duplicate message, writing segmentation queries for marketing, or extracting delivery metrics for other teams, your current system is a bottleneck.
Notification infrastructure should not compete on the roadmap with your application's core features.
Concrete signals you've hit the limit:
- Every new campaign requires backend code.
- Marketing and product depend on engineering to target audiences.
- You cannot confidently answer whether a specific user received a critical message.
- You have three distinct problems mixed into one system: transactional, one-time campaigns, and automation.
Architecture: before and after
The gap between both approaches is structural, not just operational.
Hardcoded architecture
Every team requests a different send; the backend becomes the orchestrator, the database the token catalog, and the worker the fragile point where bottlenecks concentrate.

Architecture with PushFire
Your backend stops orchestrating campaigns. It sends events or identifiers; PushFire handles segmentation, queues, delivery, and observability on top of the same Firebase network.

How the architecture changes with PushFire
PushFire sits on top of your existing FCM infrastructure. You don't replace Firebase: you connect your credentials once and stop maintaining the campaign layer on top of the API.
The rate-limit, fragile-worker, and manual-retry problems from the segmentation section disappear from your codebase. PushFire manages send queues, automatic retries with backoff, and protection against Firebase API rate limits. Your backend stops being a distributed messaging system.
Instead of building the system from scratch, the architecture shifts to three clear send paths:
1. API Messages — transactional push
For critical alerts (OTPs, purchase confirmations, operational alerts), your backend makes a POST request to the PushFire API using the subscriber identifier. You don't need to look up tokens or build per-device payloads in your database.
2. Broadcasts — one-time sends
For announcements, launches, or mass communication, your team can draft and send push or email to an audience (tag, segment, or individual subscriber) from the console, without ad hoc scripts or workers.
3. Workflows — visual automation
For journeys with delays, branching, and multiple steps, you use a visual editor with nodes like Wait, Condition, Push, and Email. Triggers are segment entry or a manual event via API.
Beyond those three paths, PushFire adds the layer FCM does not solve:
- Centralized audience (SSOT): Subscribers, tags, and rule-based segments with AND/OR logic act as the Single Source of Truth for your audience state. Product, marketing, and backend consume the same consolidated data — no duplicate SQL queries or token catalogs scattered across your database.
- Multi-channel: Push via FCM and email via Resend from the same workspace.
- Delivery observability: Per-subscriber and per-device status (delivered, failed, pending, retrying) across broadcasts, API messages, and workflows.
- Unified history: A single subscriber view for messages sent via broadcast, API, or workflow.
- Team workspace: Roles, billing, and project access without building your own internal panel.
Conclusion
Hardcoding FCM makes sense for the first few weeks of a project. Maintaining it when you have thousands of users and entire teams relying on communication with them is technical debt.
PushFire lets you keep the reliability of the Firebase network while giving your team three clear ways to send messages — transactional, broadcast, and automation — with audience management, observable delivery, and email in one place. The net result: marketing moves faster, and your developers get back to building your product.
If your team is ready to stop maintaining send scripts and refocus on the product, review the documentation.
