Pricing

What Happens When Your Google Sheets Data Sync Breaks: A Troubleshooting Guide

ALERT!!Alert triggeredRevenue dropped 12% WoW→ Slack #finance-alerts
JW
James Whitfield

Google Sheets data sync not working? This guide covers every common failure mode, expired credentials, rate limits, schema changes, cell limits, add-on deauthorization, with diagnosis steps and fixes for each.

Data syncs break silently. You do not get an error notification. You get a dashboard that shows last week's numbers, a report someone says looks wrong, or a database that stopped updating three days ago and nobody noticed.

This guide covers every common reason a Google Sheets sync stops working, how to diagnose each one, and how to fix it. It applies to any sync method: Apps Script, add-ons, Zapier, Make.com, or third-party connectors.

How to Know Your Sync Is Broken

The first problem with broken syncs is that most of them fail quietly. Your spreadsheet does not turn red. Your dashboard does not show an error banner. The data just stops updating, and you find out when a stakeholder asks why the numbers look off.

Signs your sync has stopped:

  • The "Last Updated" timestamp in your spreadsheet has not changed in longer than your sync interval
  • Data that should change regularly (e.g., daily sales totals) has not changed
  • A row or column that usually grows is frozen at the same count it was yesterday
  • An email alert you set up has not arrived

Before diagnosing the failure mode, check where the sync runs and where it logs its activity. For Apps Script: Extensions > Apps Script > Executions. For add-ons: the add-on's sidebar or settings panel usually has a sync history. For Zapier: Task History. For Make.com: Execution History.

Failure Mode 1: Credentials Expired Silently

What happens: OAuth 2.0 access tokens expire. Refresh tokens expire or get revoked. Service account keys are deleted or rotated. The sync was working fine, and then one day it stops, often with no error logged anywhere obvious.

Common triggers:

  • The Google account that authorized the connection changed its password
  • Two-factor authentication was enforced on the account and the OAuth session was invalidated
  • A service account key was deleted during a security audit
  • The QBO, Salesforce, or other connected platform revoked the OAuth token after 60–90 days of token inactivity
  • The user who set up the sync left the organization and their account was suspended

Diagnosis:

  • Run the sync manually (trigger it, do not wait for the schedule). If you get an auth error, this is the cause.
  • Check the execution log for messages like "401 Unauthorized," "invalid_grant," "token expired," or "access denied."
  • In Apps Script: look at the execution log for the trigger. In Zapier: look at the task detail for the failed run.

Fix:

  • Re-authorize the connection. For Apps Script: delete the stored OAuth tokens (in Project Properties or the token store you used), run the script again, and go through the authorization flow.
  • For add-ons: the add-on sidebar usually has a "Reconnect" or "Re-authenticate" option.
  • For Zapier/Make.com: go to the connected account settings and click "Reconnect."
  • If the original authorizing account is gone, create a new service account or use a shared team OAuth account that won't be deleted when an employee leaves.

Prevention: Use service accounts where possible. Service account credentials do not expire unless explicitly rotated. For OAuth flows, authorize using a shared team account or a dedicated integration account, not a personal employee account.

Failure Mode 2: API Rate Limit Hit

What happens: Your sync pulls or pushes data too frequently, hits the source or destination API's rate limit, and the request is rejected with a 429 error. If your script does not handle this gracefully, it fails, and if you have a retry mechanism, the retries also get rate-limited, compounding the problem.

Common rate limits you will hit:

PlatformLimit
Google Sheets API300 read/write requests per minute per project
QuickBooks Online API500 requests per minute per company
Salesforce API1,000 API calls per hour (varies by edition)
HubSpot API100 requests per 10 seconds
GA4 Data API10 concurrent requests; daily quotas by property

Diagnosis: Look for 429 status codes or error messages containing "rate limit," "quota exceeded," or "too many requests" in your execution logs.

Fix:

  • Add Utilities.sleep(1000) (Apps Script) or time.sleep(1) (Python) between API calls to throttle the request rate.
  • Implement exponential backoff: if you get a 429, wait 2 seconds, retry; if you get another, wait 4 seconds, retry; and so on.
  • Reduce sync frequency. If you are syncing every 5 minutes and hitting rate limits, try every 15 or 30 minutes.
  • Request a quota increase from the API provider if your legitimate use case exceeds the default limit.

Prevention: Design syncs to request only the data that changed since the last sync (delta sync) rather than pulling full datasets every run.

Failure Mode 3: Source Data Schema Changed

What happens: Someone renamed a column in the source system, added a required field, changed a data type, or restructured the table your sync reads from. Your sync either errors out or silently writes incorrect data to the wrong columns.

This is more dangerous than an outright failure. A schema mismatch that produces wrong data without an error is harder to catch than a sync that simply stops running.

Common triggers:

  • A database column was renamed in a production deployment
  • A Salesforce admin renamed a field label (or the API name changed)
  • A QBO account was restructured and chart of accounts names changed
  • The source spreadsheet had columns reordered or renamed

Diagnosis:

  • Compare your integration's field mapping configuration against the current schema of the source system. Look for mismatches in column names, positions, or data types.
  • Check the data in your destination sheet or database. Are values landing in the wrong columns? Are some columns blank that were populated before?

Fix:

  • Update the field mapping in your integration tool to match the new schema.
  • If you rely on column position (e.g., data[0][3] for column D), switch to column name lookups. Position-based references break whenever a column is added or moved.

Prevention: Map by field name, not position. Add a schema validation step at the start of your sync that compares expected column names against actual ones and alerts you if they differ.

Failure Mode 4: Google Sheets Cell Limit Reached

What happens: Google Sheets has a hard limit of 10 million cells per spreadsheet. When your sync tries to append data and the sheet is full, the write fails. Depending on how the failure is handled, the sync may log an error, silently skip rows, or stop entirely.

Diagnosis:

  • Open the spreadsheet and scroll to the bottom. If you have millions of rows of historical data accumulating, you may be near the limit.
  • The error message in Apps Script is typically: "This action would increase the number of cells in the workbook above the limit of 10000000 cells."

Fix:

  • Archive old data. Move data older than a certain date to a separate "archive" spreadsheet, reducing the row count in the active sheet.
  • Delete empty rows. Sheets counts empty rows within your used range toward the cell limit if they fall between used rows.
  • Aggregate rather than accumulate. If you are appending daily rows indefinitely, consider switching to a model where your sync overwrites a rolling window (e.g., the last 90 days) rather than appending forever.

Prevention: Add a cell count check at the start of your sync script. If the sheet is within 20% of the limit, send an alert. Review your data retention policy before the sync has been running for a year.

Failure Mode 5: Add-On Deauthorized

What happens: Google Workspace administrators can revoke third-party app access at the domain level. Individual users can also revoke add-on permissions from their Google Account settings. When this happens, add-ons lose access to the spreadsheet and to the connected external services.

Common triggers:

  • A Google Workspace admin ran a security audit and removed untrusted apps
  • The add-on's OAuth scope was flagged by Google's automated review
  • The add-on was uninstalled by another admin or the original installer
  • The connected account's permissions changed (e.g., a Salesforce profile change revoked API access)

Diagnosis:

  • Try to open the add-on from the Extensions menu. If it asks you to re-authorize or re-install, it has been deauthorized.
  • In Google Admin Console: Security > API Controls > App Access Control. Check if the add-on appears in the blocked or restricted list.

Fix:

  • Re-install and re-authorize the add-on. Re-configure the connection to the external service.
  • If blocked at the domain level, an admin must allow the add-on's client ID in the Admin Console before individual users can re-authorize it.

Prevention: Use add-ons from Google Workspace Marketplace with verified publisher status. Document which add-ons are installed and who authorized them. Communicate with your Google Workspace admin before they run security audits.

Failure Mode 6: Time Trigger Quota Exceeded

What happens: Apps Script has a daily quota for time-based trigger runtime: 90 minutes per day for personal Google accounts, 6 hours per day for Google Workspace accounts. If your syncs run frequently and take a long time, you can exhaust this quota, causing triggers to simply not fire for the rest of the day.

Diagnosis:

  • In Apps Script: View > Executions. If triggers are listed as "Did not start" or you see gaps in the execution history that align with your trigger schedule, quota exhaustion is likely.
  • Google does not send a notification when trigger quota is exhausted.

Fix:

  • Reduce sync frequency (run every 30 minutes instead of every 5 minutes).
  • Optimize script performance: reduce the number of API calls per run, use batch reads instead of cell-by-cell reads, cache results you need multiple times.
  • Upgrade the Google account to Workspace if you are on a personal account.

Prevention: Monitor trigger execution time per run. If a single run takes more than a few minutes, it will consume quota quickly at high frequency. Set a target of under 2 minutes per execution.

Failure Mode 7: Network or Firewall Change

What happens: Your sync connects to a database or API hosted inside a private network. A firewall rule changes: perhaps after a security review, a cloud infrastructure update, or a network reconfiguration, and outbound connections from your script's IP range are blocked.

Diagnosis:

  • Test the connection manually. For Apps Script: add a test function that attempts the connection and logs the result. For Python scripts: run the connection test from your server.
  • Check for error messages containing "connection refused," "connection timed out," "host unreachable," or "ECONNREFUSED."
  • Compare the current firewall rules to what they were before the sync stopped working.

Fix:

  • Add the integration's IP range back to the allowlist. For Apps Script, the egress IP ranges are published by Google (they change periodically and are wide CIDR blocks. This is a genuine operational challenge).
  • For database connections: use a VPN, bastion host, or SSH tunnel rather than exposing the database port directly. This makes firewall changes easier to manage.

Prevention: Use connection methods that are not sensitive to specific IP allowlists (VPN, private link, SSH tunnel). Document all firewall rules that exist specifically for data integration so they are not removed during unrelated security reviews.

Comparison: Failure Modes by Symptom

SymptomMost likely causeWhere to check
Sync ran fine, now 401/403 errorCredentials expiredOAuth token store, add-on auth settings
Sync runs but data unchangedRate limit, cell limit, or schema mismatchAPI error logs, cell count, field mapping
Sync trigger not firing at allTrigger quota exhausted, trigger deletedApps Script Executions log
Sync succeeds but wrong data in columnsSchema changed, column reorderingField mapping configuration
Sync errors started after IT changeFirewall/network changeIT change log, connection test
Add-on opens but can't connectDeauthorized or token expiredAdd-on reconnect flow, Admin Console

Monitoring Checklist

A broken sync you catch in 5 minutes causes far less damage than one you catch in 5 days. Build these monitoring practices into every sync you set up.

1. Add a "Last Synced" timestamp cell. At the end of every successful sync run, write the current timestamp to a dedicated cell (e.g., cell A1 of a "Sync Status" sheet). Set up a conditional format that turns this cell red if the timestamp is more than 2x your expected sync interval in the past. Anyone opening the sheet can see at a glance whether the sync is current.

Apps Script example:

javascript
function updateLastSynced() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('Sync Status');
  sheet.getRange('A1').setValue(new Date());
  sheet.getRange('A2').setValue('SUCCESS');
}

2. Set up email alerts for script failures. In Apps Script: in the trigger settings for your time-based trigger, there is a "Notify me of failures" setting. Enable it and point it to an email address that is monitored. This sends an email when the script throws an uncaught exception.

3. Check the execution log weekly. Even a healthy sync should be reviewed periodically. A pattern of occasional rate limit errors or slow execution times is a warning sign before a full failure.

4. Log sync outcomes to a dedicated sheet. Append a row to a "Sync Log" sheet after every run with: timestamp, rows processed, rows failed, and any error message. This creates a history that makes diagnosis much faster when something goes wrong.

5. Set a calendar reminder to re-authorize OAuth connections. Most OAuth refresh tokens expire after 60–180 days. Set a recurring calendar reminder every 60 days to open each add-on or automation and verify the connection is still active.

Troubleshooting

Sync appears to run (no errors) but data is not updating. Check whether the sync is actually writing to the sheet you expect. Add a Logger.log statement before and after the write to confirm it executes. Also verify the target sheet name has not changed.

Script execution log shows "Exception: Service invoked too many times." This is the Apps Script rate limit for Spreadsheet service calls. Batch your reads and writes: use getValues() on a range once rather than reading cells in a loop.

"Exceeded maximum execution time." The script hit the 6-minute Apps Script execution limit. Break the task into smaller chunks, process a subset of rows per run, and store progress (last processed row) in Script Properties to pick up where you left off.

Trigger fires but nothing happens. The trigger may be calling a function that exits early due to a condition check. Add Logger.log at the very first line of the function to confirm it is actually executing.

Bottom Line

Most Google Sheets sync failures come down to seven root causes: expired credentials, rate limits, schema changes, cell limits, add-on deauthorization, trigger quota exhaustion, and network changes. Each has a distinct symptom pattern and a specific fix.

The single most valuable thing you can do is add a "last synced" timestamp and a sync log to every integration you build. A sync that fails loudly is infinitely easier to manage than one that fails silently for three days before anyone notices.

Get Started With brooked.io

brooked.io handles token refresh, rate limit backoff, schema change detection, and sync logging automatically, so you spend less time diagnosing broken syncs and more time using the data.

Set up a monitored Google Sheets sync with brooked.io →

Related guides:

Troubleshooting quick reference

Frequently asked questions

How do I get notified when a Google Sheets sync breaks?

The most reliable method is to write a "last synced" timestamp after each successful run and use a separate monitoring script (on its own trigger) that checks this timestamp and sends an email via MailApp.sendEmail() if it is stale.

Can I set up automatic retries when a sync fails?

Apps Script does not have built-in retry logic. You need to implement it: catch the exception, check the error type (rate limit vs. auth failure vs. network), and call Utilities.sleep() before retrying. For authentication failures, retrying immediately will not help. You need to re-authorize first.

How often do Google OAuth tokens expire?

Google access tokens expire after 1 hour. Refresh tokens do not have a fixed expiry but are revoked when: the user revokes access, the account password changes, the account is inactive for 6 months (consumer accounts), or Google revokes them for security reasons. Google Workspace service accounts use key files that do not expire unless deleted.

What is the Apps Script execution time limit?

6 minutes per execution. If your sync needs to process more data than fits in 6 minutes, you need to break it into multiple runs and track progress between runs using Script Properties.

Do third-party connectors like brooked.io handle these failure modes automatically?

A well-built connector will handle token refresh automatically, implement rate limit backoff, and alert you when syncs fail. This is one of the main advantages of using a managed connector over a hand-rolled Apps Script solution: failure handling is built into the platform.

Ready to connect your data to Google Sheets?

Brooked's free tier covers 100 imports per month with AI Analyst included, no credit card required.

Install Brooked free →

Also in Google Sheets

More Google Sheets guides

Get your spreadsheet hours back

Brooked sets up in seconds. Your team is querying live data before lunch.

Get started free