Author: By Raj
Part of our Google Apps Script Consulting guides. Need this built for your team? Hire a Google Apps Script developer.
Estimated reading time: 10 minutes
Google Apps Script Quotas & Limits: Complete 2026 Reference
Google Apps Script enforces published daily quotas and hard per-run limits. Consumer accounts (@gmail.com) get lower caps than Google Workspace accounts, so a script that works on a personal test account can fail under a Workspace production user — or the reverse if you load-test on Workspace and ship to Gmail.
Official numbers (Google's Quotas for Google Services docs): UrlFetch is 20,000 calls/day on consumer vs 100,000/day on Workspace; email recipients are 100/day vs 1,500/day (2,000/day within-domain on Workspace); trigger total runtime is 90 minutes/day vs 6 hours/day. Quotas are per user and reset 24 hours after the first request in the period — not at a fixed Pacific midnight.
When a script throws "Service invoked too many times" or "Exceeded maximum execution time," fix the architecture: smaller batches, fewer polls, caching, and continuation triggers. For execution timeouts, see /blog/google-apps-script-execution-time-limit; for trigger failures, see /blog/google-apps-script-trigger-not-working-fix. Source: https://developers.google.com/apps-script/guides/services/quotas.
UrlFetchApp daily and per-run limits
UrlFetchApp.fetch and UrlFetchApp.fetchAll count every HTTP request against the daily URL Fetch quota: 20,000/day for consumer accounts and 100,000/day for Google Workspace. Each URL inside fetchAll counts separately — parallelism does not reduce daily usage. Google also caps response size and POST body at 50 MB per call, URL length at 2 KB, and headers at 100 per call (8 KB header size).
A one-minute poll that does one fetch burns about 1,440 calls/day; ten endpoints at that cadence is ~14,400/day — fine on Workspace, already most of a consumer account's 20,000 budget before any retries. Each request also has a practical ~60-second hard timeout (separate from the 6-minute script runtime). Batch reads, use ETags or last-sync cursors in Script Properties, and process a fixed page size per trigger fire so you never chain unbounded fetches in one run.
MailApp and GmailApp send quotas
MailApp and GmailApp share email recipient quotas: 100 recipients/day on consumer accounts vs 1,500/day on Google Workspace (2,000/day when all recipients are inside the Workspace domain). Quota is per recipient, not per message — one email to 50 people costs 50. Per message: max 50 recipients, 250 attachments, 25 MB total attachment size; body size is 200 KB (consumer) or 400 KB (Workspace).
Email read/write (excluding send) is 20,000/day consumer vs 50,000/day Workspace. Prefer one digest email per run, drafts for review queues, or Chat/Slack for high-volume alerts. Check remaining send capacity with MailApp.getRemainingDailyQuota() and write send failures to a Status sheet.
Six-minute execution ceiling
Every account type shares the same per-execution ceilings: 6 minutes for normal script runs (including installable and time-driven triggers), 30 seconds for custom functions and Google Workspace add-ons. Simultaneous executions are capped at 30 per user and 1,000 per script. Long cell-by-cell loops are the usual timeout cause.
Separately, triggers share a daily total runtime pool: 90 minutes/day on consumer accounts vs 6 hours/day on Workspace. Hitting that pool yields "Service using too much computer time for one day." Use getValues/setValues on ranges, avoid SpreadsheetApp.flush in loops, and split work with continuation triggers. See /blog/google-apps-script-execution-time-limit.
Trigger count and clock-driven limits
Installable triggers are limited to 20 per user per script on both consumer and Workspace accounts. Duplicate installs from redeploying without ScriptApp.deleteTrigger() cause double runs and burn the daily trigger-runtime pool (90 min vs 6 hr) twice as fast.
Audit triggers in the editor (Triggers / clock icon), name them in code comments, and delete orphans. Simple onEdit / onOpen / onFormSubmit triggers cannot call UrlFetchApp or other services that need authorization — use an installable trigger for spreadsheet edits that hit external APIs.
Quota mitigation checklist
Log quota-related errors with timestamp and function name. Use MailApp.getRemainingDailyQuota() before bulk sends. Track UrlFetch call counts in Script Properties (there is no official remaining-UrlFetch API). Add exponential backoff for third-party 429s — that is separate from Google's "Service invoked too many times" daily caps.
Trial Workspace domains may stay on lower limits until the domain has paid at least USD $100 and 60 days have passed since that threshold. When volume is structural, move heavy ETL to BigQuery or Cloud Run and keep Sheets as the control plane. Our /services/google-apps-script-consulting team scopes those migrations.
Example code
function checkEmailQuotaAndFetch() {
const remaining = MailApp.getRemainingDailyQuota();
Logger.log('Email recipients remaining today: ' + remaining);
if (remaining < 10) {
throw new Error('Email quota nearly exhausted (' + remaining + ' left)');
}
const props = PropertiesService.getScriptProperties();
const count = parseInt(props.getProperty('urlFetchCount') || '0', 10) + 1;
props.setProperty('urlFetchCount', String(count));
const res = UrlFetchApp.fetch('https://httpbin.org/get', { muteHttpExceptions: true });
if (res.getResponseCode() === 429) {
throw new Error('External API rate limit — backoff required');
}
return res.getContentText();
}| Quota / limit | Consumer (gmail.com) | Google Workspace |
|---|---|---|
| URL Fetch calls | 20,000 / day | 100,000 / day |
| Email recipients (MailApp / GmailApp) | 100 / day | 1,500 / day (2,000 within domain) |
| Triggers total runtime | 90 min / day | 6 hr / day |
| Script runtime per execution | 6 min | 6 min |
| Custom function / add-on runtime | 30 sec | 30 sec |
| Installable triggers | 20 / user / script | 20 / user / script |
| Properties read/write | 50,000 / day | 500,000 / day |
| URL Fetch response / POST size | 50 MB / call | 50 MB / call |
FAQ
Do Workspace accounts get higher Apps Script quotas?
Yes. Per Google's published table, Workspace users get 100,000 UrlFetch calls/day (vs 20,000), 1,500 email recipients/day (vs 100; 2,000 within-domain), 6 hours of trigger runtime/day (vs 90 minutes), and 500,000 Properties read/writes/day (vs 50,000). Per-execution limits (6 minutes, 30-second custom functions, 20 triggers per script) are the same. Always test on the same account type you use in production.
What error message indicates a UrlFetch quota problem?
You typically see "Service invoked too many times for one day: urlfetch" (or similar) in the execution transcript after exceeding 20,000 (consumer) or 100,000 (Workspace) calls. Reduce fetch frequency, cache responses, or paginate work across scheduled runs. A third-party HTTP 429 is that API's rate limit, not Google's daily UrlFetch quota.
Can I pay Google to raise Apps Script quotas?
There is no self-serve Apps Script quota purchase. Moving from consumer to Workspace raises the published daily caps. For mission-critical volume beyond that, split workloads across users/projects, poll less, or move heavy processing to Google Cloud while keeping Sheets as the UI.
When do Apps Script quotas reset?
Daily quotas are per user and reset 24 hours after the first request in the current period — not at a fixed calendar midnight. Plan bulk jobs with headroom rather than assuming a clean slate at 12:00 AM local or Pacific time.
Do triggers share the same six-minute limit?
Yes: each installable or time-driven run may use up to 6 minutes, and all triggers together share the daily runtime pool (90 minutes consumer / 6 hours Workspace). Simple triggers and custom functions are limited to 30 seconds and cannot call UrlFetchApp. See /blog/google-apps-script-execution-time-limit.
Need this done for you? I handle this as part of my consulting work, fixed-price quote within 24 hours.
Book a call with Raj →Get the full Google Apps Script Quotas & Limits script template
I'll email you a production-ready, commented version you can deploy in 10 minutes.
Continue reading
Apps Script Core
How to Automate Google Sheets with Apps Script (Beginner Guide)
Apps Script Core
Master Google Apps Script: A Step-by-Step Roadmap for Non-Coders
Apps Script Core
Google Apps Script Trigger Not Working? Here's the Fix
From another topic
Google Sheets CRM Automation: Triggers, Pipelines, and Follow-Ups →Need help with this? I handle this as part of my Google Apps Script Consulting service.
Workflow automation, script audits, triggers, quotas, and production best practices.
See how it works →