Skip to content

Firebase Cloud Messaging errorFCM “QUOTA_EXCEEDED” (429, RESOURCE_EXHAUSTED)

A big send, a broadcast to every user, or a chat app under load starts getting QUOTA_EXCEEDED from Firebase Cloud Messaging, with HTTP 429 and status RESOURCE_EXHAUSTED. FCM limits how many messages a project can send per minute, how fast one device can receive, and how fast one topic can fan out. Here are those limits in Firebase’s words, and how to send without hitting them, or hand it over at a fixed price.

Rather hand it over? App Fix Ticket: One reproducible bug in an existing mobile or web app, diagnosed and fixed.

Full refund if Simon can’t take it on once he sees your project, or if you cancel before work starts. Refund terms.

Short answer

You sent faster than one of FCM’s limits allows: the project’s per-minute quota, the rate to a single device, or the rate to a topic. Retry the rejected messages with exponential backoff starting at one minute, spread large sends over time, and clean dead tokens out of your list, because failed sends count toward the quota too. If you are regularly near the limit, you can ask for more.

Rather not fix it yourself? App Fix Ticket starts with a fixed-price diagnosis, then a fixed price for the fix before any fix work.

Which limit you hit, and the fix

  1. 01

    A burst over the project’s per-minute quota

    “The default quota of 600k messages per minute covers over 99% of FCM developers while protecting the stability of the system and minimizing the impact of spiky projects.” Firebase, Throttling and quotas

    Sending to your whole user list in one loop can push past the project quota in a minute. Queue the sends and release them at a steady rate. When a 429 comes back, wait and retry; the quota refills in the next minute.

  2. 02

    Retrying right away

    “Use exponential backoff with a minimum initial delay of 1 minute to retry rejected messages.” Firebase, FCM ErrorCode (QUOTA_EXCEEDED)

    Retrying a rejected message at once lands in the same full minute and fails again. Firebase asks for backoff that starts at a minute and grows each time. Note the quota minutes are not aligned to the clock, so do not wait for :00.

    import { getMessaging } from 'firebase-admin/messaging';
    
    async function sendWithBackoff(message, attempt = 0) {
      try {
        return await getMessaging().send(message);
      } catch (err) {
        const rateCodes = ['messaging/message-rate-exceeded', 'messaging/device-message-rate-exceeded', 'messaging/topics-message-rate-exceeded'];
        if (!rateCodes.includes(err.code) || attempt >= 5) throw err;
        const delay = 60_000 * 2 ** attempt + Math.random() * 5_000;
        await new Promise((r) => setTimeout(r, delay));
        return sendWithBackoff(message, attempt + 1);
      }
    }
  3. 03

    Dead tokens using up the quota

    “Client errors (HTTP status code 400-499) are counted (excluding 429s).” Firebase, Throttling and quotas

    Sends to uninstalled apps fail with 404 UNREGISTERED, and those failures still count. A list full of old tokens wastes part of every minute’s quota and raises your error ratio, which also blocks a quota increase. Delete tokens that come back UNREGISTERED.

  4. 04

    Too many messages to one device

    “For Android, you can send up to 240 messages per minute and 5,000 messages per hour to a single device.” Firebase, Throttling and quotas

    A bug that sends in a loop, or a burst of chat messages, can hit the per-device limit. On iOS the limit is Apple’s, and Firebase returns an error when you exceed it. Send fewer, more useful notifications and collapse updates into one.

Checked against the vendor’s docs on : Firebase docs: Throttling and quotas; Firebase docs: FCM HTTP v1 ErrorCode; Firebase docs: Best practices for FCM registration token management.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

“Very responsive, attentive to fixing bugs, and completed the project as needed! Thank you!”
A buyer in the United States, July 2022. Shopify on Fiverr
All 127 Fiverr reviews

Related: FCM registration token not registered · Firestore quota exceeded · Firebase auth/quota-exceeded · FCM SENDER_ID_MISMATCH

Questions

More on this error

Can I get a higher FCM quota?

Yes, with conditions. Firebase asks that your usage is regularly at 80% of quota or more for at least 5 consecutive minutes a day and your client error ratio is under 5%; then you can request up to 25% more in the Google Cloud console. For a launch or one-off event, ask Firebase Support at least 15 days ahead.

Does sending to a topic avoid the limit?

No. Topics have their own fan-out limits, and a topic send that is too fast gets the same QUOTA_EXCEEDED error. Firebase’s advice is the same: send less often to that topic and back off for at least a minute before retrying.

Where can I see how close I am?

In the Google Cloud console, open APIs and Services, select Firebase Cloud Messaging API, then Quota and system limits. Firebase notes the graphs are not exactly aligned with quota minutes, so a 429 can appear while traffic looks under the line.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.