Google Ads refresh token expired

Google Ads Refresh Token Expired: Fix and Prevent

4 min read • install

Admaxxer is a DTC analytics platform with built-in Meta + Google ad ops. When a Google Ads refresh token expires, Admaxxer can no longer sync spend, campaigns, or conversions for that account and your dashboards start showing stale numbers. TL;DR: reconnect Google Ads from the connection card in Admaxxer to mint a new refresh token, then make sure the daily token-heartbeat job is running so the next expiry is caught 7 days in advance instead of after the fact.

Symptoms

Root cause

Google OAuth refresh tokens do not last forever. The two most common reasons they stop working:

  1. Inactivity: if the refresh token is unused for 6 months, Google revokes it.
  2. Unverified app: if your Google Cloud OAuth consent screen is still in "Testing" status (not verified), refresh tokens are capped to about 7 days for any user who is not on the test-users list.

Other revocation triggers: the user changed their Google password, manually revoked Admaxxer from their Google account, or exceeded Google's active refresh-token limit per user per client ID (older tokens get evicted). A secondary gotcha is storage corruption — refresh tokens are stored AES-256-GCM encrypted, so a broken ENCRYPTION_KEY rotation can make a valid token decrypt incorrectly and look invalid.

Fix

Step 1: Open the Google Ads connection card

Go to Admaxxer -> Connections -> Google Ads. You should see the broken connection flagged with a red badge.

Step 2: Click Reconnect

This sends you through Google's OAuth consent flow. Make sure you sign in with the same Google account that owns the Google Ads manager (MCC) you want to pull data from, otherwise Admaxxer will attach a token that cannot read the target customer id.

Step 3: Request offline access

The OAuth flow Admaxxer initiates already includes access_type=offline and prompt=consent. Do not remove the consent prompt — without it Google will not re-issue a refresh token for users who previously consented.

Step 4: Verify the scopes

You must grant the https://www.googleapis.com/auth/adwords scope. Declining this scope means the OAuth token will be minted but every GAQL query will return 403.

Step 5: Confirm the new token is stored

After the callback, Admaxxer will show the connection as green and trigger a backfill sync. The refresh token is encrypted at rest with AES-256-GCM before being written to ad_platform_connections.

Verify the fix

Prevent it next time

Related guides

FAQs

Q: How long do Google Ads refresh tokens last? A: Indefinitely for verified OAuth apps as long as they are used at least every 6 months. For unverified / testing apps, refresh tokens for non-test users expire after about 7 days.

Q: Do I lose historical data when I reconnect? A: No. Admaxxer re-hydrates historical data on the next sync. Your previously ingested campaign and spend rows stay in place.

Q: Can I use a service account instead of OAuth? A: The Google Ads API supports service accounts, but only when your Google Workspace admin delegates domain-wide access. Admaxxer's default flow uses user-level OAuth because most DTC brands do not manage Google Ads inside a Workspace with delegated admin.

Frequently Asked Questions

How long do Google Ads refresh tokens last?

Indefinitely for verified OAuth apps as long as they are used at least every 6 months. For unverified/testing apps, refresh tokens for non-test users expire after about 7 days.

Do I lose historical data when I reconnect?

No. Admaxxer re-hydrates historical data on the next sync. Your previously ingested campaign and spend rows stay in place.

Can I use a service account instead of OAuth?

The Google Ads API supports service accounts, but only when your Google Workspace admin delegates domain-wide access. Admaxxer's default flow is user-level OAuth.

Put This Knowledge Into Action

Bring Meta and Google ads into one self-hosted workspace.

Get Started Free