Custom app connections are available on the Team plan. See White-label Connections for the overview.
What Every Google Channel Needs
Three values from your own Google Cloud project:
Google no longer requires a developer token for Google Ads, so these three values are everything any Google connection needs.
Already have your own OAuth flow? If your systems already authorize users against your Google Cloud app, skip to the channel page and paste the refresh token you already hold. Make sure it was minted with
access_type=offline, prompt=consent, and the scope for that channel.Scopes and APIs per Channel
Enable the APIs for every channel you plan to connect, and request the matching scope when you mint the token. You can request several scopes in one go and reuse that single refresh token across channels.Setting Up Your Google Cloud App
1
Enable the APIs
- Open Google Cloud Console and select (or create) the project you want to use
- Go to APIs & Services > Library
- Search for each API from the table above and click Enable
2
Configure the OAuth Consent Screen
- Go to APIs & Services > OAuth consent screen
- Choose External (or Internal if everyone who will authorize is in your Google Workspace organization)
- Enter your app name, support email, and logo. This is the branding your users see when they authorize
- Under Scopes, add the scopes for the channels you plan to connect
- Publish the app (Publishing status: In production)
3
Create an OAuth Client
- Go to APIs & Services > Credentials
- Click Create credentials > OAuth client ID
- Application type: Web application
- Under Authorized redirect URIs, add:
- Click Create and copy the Client ID and Client secret
4
Mint a Refresh Token
- Open the OAuth 2.0 Playground
- Click the gear icon (top right), tick Use your own OAuth credentials, and paste your Client ID and Client secret
- In Step 1, enter the scope(s) for your channel in the input box (separate several scopes with a space) and click Authorize APIs
- Sign in with the Google account that has access to the assets you want to manage
- In Step 2, click Exchange authorization code for tokens
- Copy the Refresh token
Important: Keep this token secure. Anyone holding it, together with your client ID and secret, can act on everything the Google account can access within the granted scopes.
5
Connect in Markifact
Open the channel’s setup page from the table above, or go straight to Connections, click Connect on the channel, select the Custom App (White-label) tab, name the connection and paste the three values. Markifact verifies them with one API call before saving anything.
Rotating or Replacing a Token
Add the connection again with the same connection name and the new refresh token. Markifact replaces the stored credentials in place, so workflows and agents bound to the connection keep working.Troubleshooting
Google rejected the client ID or client secret (invalid_client)
Google rejected the client ID or client secret (invalid_client)
Check both values under APIs & Services > Credentials. A client secret that was reset in Google Cloud invalidates the old one.
Google rejected the refresh token (invalid_grant)
Google rejected the refresh token (invalid_grant)
The most common causes:
- The token was minted with a different client ID than the one you pasted
- The OAuth consent screen is still in Testing status, so the token expired after 7 days
- The user revoked access under Google account permissions
- The token was minted without
prompt=consent, so Google returned no refresh token at all
The refresh token does not include the scope
The refresh token does not include the scope
Repeat the Playground step with the channel’s scope entered in Step 1 before clicking Authorize APIs. Several scopes can be entered at once, separated by a space.
The API is not enabled on the Cloud project
The API is not enabled on the Cloud project
Enable the APIs listed for the channel under APIs & Services > Library in the project that owns your client ID, then try again. It can take a minute to propagate.
Related
White-label Connections
Overview of custom app connections across channels
Connections
How connections, sharing, and privacy work

