How to fix messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target in Firebase

FirebaseINTERMEDIATEMEDIUMUpdated Dec 12, 2025· 120 views

Firebase Cloud Messaging throws this error when too many notifications hit the same token or topic inside FCM’s per-target quota window. Spread the burst over five minutes or request a temporary quota bump before retrying.

Quick fix

Fixes messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target

try {
  await messaging.send(message);
} catch (error) {
  console.error('FCM error code:', error.code);
  console.error('Message:', error.message);
  console.error('Retry-After seconds:', error.errorInfo?.retryAfter);
}
  1. Log the QUOTA_EXCEEDED response before retrying
  2. Throttle batches so each target waits out the five-minute window
  3. Chart quota usage with Firebase console or Cloud Monitoring
  4. Request a temporary quota increase or extend the sending window
firebase — error
try {
await messaging.send(message);
} catch (error) {
console.error('FCM error code:', error.code);
console.error('Message:', error.message);
console.error('Retry-After seconds:', error.errorInfo?.retryAfter);
}
messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target

What this error means

Firebase Cloud Messaging enforces quotas to protect its infrastructure, and this error means FCM stopped processing once a registration token, topic, or condition received more traffic than the per-target window allows. The service groups sends into a five-minute burst limit, so you cannot push the same audience harder than that window without standing in line. The Firebase FAQ on FCM quotas spells this out: you must spread traffic over five minutes, scheduled events should start early, and quota increases are only granted with advance notice. When the limit is hit, FCM returns 429/QUOTA_EXCEEDED rather than retrying implicitly, so you need to throttle or wait for the quota window to reset before sending more messages.

Typical symptoms

  • Firebase Admin SDK send throws messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target
  • HTTP 429 responses from projects.messages:send with the same message in the body and a Retry-After header
  • Large campaigns fail for a subset of tokens or topics while other targets continue to succeed
  • Repeated errors appear right after a bulk send, often near scheduled events or test loops

Common causes

  1. Bursting too many pushes at one token, topic, or condition inside the five-minute window
  2. Retry loops or parallel workers hitting the same target without exponential backoff
  3. Sending an entire audience at once instead of slicing it into smaller segments over time
  4. Repeated cadence constraints (e.g., sending calendar alerts at the top of the hour) without starting the workflow early
  5. Running on the Spark plan or hitting other project-wide throttles that keep the same per-target quota lower

How to fix "messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target"

1Log the QUOTA_EXCEEDED response before retrying

Inspect the error metadata so you can confirm you hit the target quota and see the Retry-After hint before retrying:

javascript
try {
  await messaging.send(message);
} catch (error) {
  console.error('FCM error code:', error.code);
  console.error('Message:', error.message);
  console.error('Retry-After seconds:', error.errorInfo?.retryAfter);
}

The error details highlight whether the limit is per token, topic, or condition and prevent accidental immediate retries that burn the same quota window.

2Throttle batches so each target waits out the five-minute window

Split your audience and add a short delay before sending to the next slice. A simple throttle loop that waits after each chunk keeps you inside the broadcast limit:

javascript
const chunkSize = 200;
const delayMs = 30_000; // 30 seconds per chunk

for (let i = 0; i < tokens.length; i += chunkSize) {
  const batch = tokens.slice(i, i + chunkSize);
  await Promise.all(batch.map(token => messaging.send({ token, notification })));
  await new Promise(resolve => setTimeout(resolve, delayMs));
}

Adjust the delay to spread the traffic so that any individual token or topic only sees one burst within five minutes.

3Chart quota usage with Firebase console or Cloud Monitoring

Use the Firebase console quotas dashboard or Cloud Monitoring to see when you approach thresholds. In Cloud Monitoring you can filter for quota metrics such as serviceruntime.googleapis.com/quota/allocation/usage with the quota_metric label that corresponds to FCM. Create alerts for quota/exceeded errors so you know when sends are blocked before the event fires. The linked guide shows how to find quota_metric labels and build charts or alerting policies that surface usage spikes.

4Request a temporary quota increase or extend the sending window

For one-time events that still need more throughput, file a quota request at least one month early with dates and audience size. Firebase explicitly honors such requests for events up to one month long but reverts the increase afterward. If you cannot get an increase, start sending 5+ minutes before the event and throttle the rest throughout the interval so you never hit the hard limit.

Advanced notes

FCM treats each individual target (token, topic, condition) as its own quota bucket, so splitting a topic into multiple topic groups or regions can reduce the per-target pressure.

Quota windows reset automatically; hitting the error repeatedly points to sending logic that retries too aggressively or sits on stale registration tokens. Deduplicate sends per token and wait for the Retry-After before retrying.

Spark projects share the same per-target throttles as Blaze, so upgrading only helps if you also request a quota increase because quota assistance is limited by the plan and review process.

Frequently asked questions

What does "messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target" mean?
Firebase Cloud Messaging enforces quotas to protect its infrastructure, and this error means FCM stopped processing once a registration token, topic, or condition received more traffic than the per-target window allows. The service groups sends into a five-minute burst limit, so you cannot push the same audience harder than that window without standing in line. The Firebase FAQ on FCM quotas spells this out: you must spread traffic over five minutes, scheduled events should start early, and quota increases are only granted with advance notice.
How do I fix "messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target"?
Firebase Cloud Messaging throws this error when too many notifications hit the same token or topic inside FCM’s per-target quota window. Spread the burst over five minutes or request a temporary quota bump before retrying.
What causes "messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target"?
Bursting too many pushes at one token, topic, or condition inside the five-minute window Retry loops or parallel workers hitting the same target without exponential backoff Sending an entire audience at once instead of slicing it into smaller segments over time
Is the "messaging/QUOTA_EXCEEDED: Sending limit exceeded for message target" error serious?
It is a medium-severity error — more of a blocker than a risk. The steps above resolve it.

Official resources & further reading