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 2025 Reference
Google Apps Script enforces hard daily caps on UrlFetch calls, Gmail sends, trigger runtime, and concurrent executions. Consumer Google accounts see lower limits than Workspace Business and Enterprise tiers, so the same script can succeed in a test account yet fail in production.
Quotas reset on a Pacific Time clock, not your local timezone. When a script throws "Service invoked too many times" or "Exceeded maximum execution time," the fix is architectural—smaller batches, fewer polls, and caching—not simply re-running the job.
This reference maps the quotas that break automations most often and points to mitigation patterns. For execution timeouts specifically, see /blog/google-apps-script-execution-time-limit; for trigger failures, see /blog/google-apps-script-trigger-not-working-fix.
UrlFetchApp daily and per-run limits
UrlFetchApp.fetch consumes quota per request. High-frequency Shopify or CRM syncs can exhaust the daily cap before lunch if you poll every minute. Batch external reads, use ETags where APIs support them, and store last-sync timestamps in Script Properties.
Per-execution limits also apply: chaining hundreds of fetches in one run risks both timeout and burst errors. Process a fixed page size per trigger fire and persist the cursor for the next run.
MailApp and GmailApp send quotas
MailApp.sendEmail and GmailApp.send share recipient limits that differ by account type. Approval workflows that email fifty managers on each edit will hit caps quickly.
Prefer one digest email per run, Gmail drafts for review queues, or Chat/Slack for high-volume alerts. Always catch send failures and write the error to a Status sheet.
Six-minute execution ceiling
Custom functions and most triggers may run at most six minutes (30 seconds for simple triggers). Long loops over entire sheets without batching are the usual culprit.
Use getValues/setValues on ranges, avoid SpreadsheetApp.flush in loops, and split work with continuation triggers or time-driven schedules. Document chunk size in Script Properties so ops can tune without reading code.
Trigger count and clock-driven limits
Each script project has a maximum number of installable triggers. Duplicate installs from redeploying without deleteTrigger cause double runs and mysterious quota burn.
Audit triggers under Project Settings, name them in code comments, and delete orphans. For spreadsheet edits that call external APIs, you must use installable onEdit triggers—not simple ones.
Quota mitigation checklist
Log quota-related errors with timestamp and function name. Add exponential backoff for 429 responses from third-party APIs, separate from Google's own limits.
When limits are structural, move heavy ETL to BigQuery or Cloud Run while keeping Sheets as the control plane. Our /services/google-apps-script-consulting team scopes migrations when DIY hits walls.
Example code
function logUrlFetchQuotaHint() {
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();
}| Approach | Best for | Tradeoff |
|---|---|---|
| Apps Script native | Google Workspace-centric workflows | 6-min limit, quotas |
| Zapier / Make | No-code, many connectors | Per-task cost, vendor lock-in |
| Python + Cloud | Heavy data / ML | Hosting cost, separate auth |
| Google Apps Script consulting | Production custom logic | Build cost, you own code |
FAQ
Do Workspace accounts get higher Apps Script quotas?
Yes. Business and Enterprise editions typically receive higher UrlFetch, email, and trigger limits than consumer @gmail.com accounts. Always test automations on the same account type you use in production.
What error message indicates a UrlFetch quota problem?
You may see "Service invoked too many times for one day: urlfetch" or similar wording in the execution transcript. Reduce fetch frequency, cache responses, or paginate work across multiple scheduled runs.
Can I pay Google to raise Apps Script quotas?
There is no self-serve quota purchase for Apps Script. For mission-critical volume, architects split workloads across projects, use fewer polls, or move heavy processing to Google Cloud while keeping Sheets as the UI.
How do I see how long a script ran?
Open Executions in the Apps Script editor or add Logger.log timestamps at start and end. Compare duration to the six-minute cap documented in /blog/google-apps-script-execution-time-limit.
Do triggers share the same six-minute limit?
Installable and time-driven triggers use the standard six-minute maximum unless you deploy a separate long-running pattern on Google Cloud. Simple onEdit triggers are limited to 30 seconds and cannot call UrlFetchApp.
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 →