Learn · Setup guides
Connect Google Merchant Center to Outloop
Last updated:
In short
Connecting Google Merchant Center to Outloop means signing in to Google once from Outloop in your browser, then mapping each client's Merchant account to its own workspace.
Outloop mints and stores the refresh token host-side in the macOS Keychain — there is no token to copy. Agents then work only the Merchant account mapped to their workspace; a request naming another account is denied before any call reaches Google, account-administration calls stay blocked, and every request is audited with secret_exposed:false.
What this setup gives you
One agency Google identity across many client Merchant accounts, with the account boundary decided by configuration rather than by whatever the prompt happens to say.
- ✓Each client workspace is pinned to its own Merchant account ID.
- ✓A request naming a different Merchant account is refused before any call reaches Google.
- ✓Account-administration calls are blocked outright, not left to the agent's judgement.
- ✓The refresh token is minted host-side and never appears on your clipboard or in a prompt.
What you need before starting
- ✓Access to a Google Cloud project with the OAuth consent screen configured.
- ✓A Client ID and Client Secret for your first Google connector. After that, Outloop reuses the saved Google OAuth app and never asks for the secret again.
- ✓The Google account with access to the client's Merchant Center — you will sign in as it in your browser.
- ✓The Merchant account ID this workspace should be allowed to use.
- ✓Outloop installed and activated, with a workspace selected.
Which Google account connects what
Three separate identities — keep them apart
Most failed Google Merchant Center setups are one confusion: assuming the Google account that manages the Cloud project is also the account that can open the client's Merchant Center account. It does not have to be, and often should not be.
- 1
The Google Cloud project and OAuth app
This owns the Client ID and Client Secret. It can belong to your agency or to your client — Outloop does not care which, and cannot tell the difference.
cloud-admin@agency.example— manages the Google Cloud project - 2
The connected Google account
This is the account you pick in Google's own chooser during the browser sign-in. It is the account that must actually own or be able to open the client's Merchant Center account.
data-owner@client.example— is chosen at sign-in because it owns the client's Merchant Center account - 3
Outloop workspace access
This decides which workspace may use the stored credential, which resources it may reach, and which capabilities agents get. It is set in the Access Profile, after the sign-in succeeds.
In that example, cloud-admin@agency.example
created the OAuth app once, and every connector after it reuses that app — but the account you
actually sign in as is data-owner@client.example,
because that is the identity Google Merchant Center will check when an agent asks for a file.
- →If the app's audience is External and it is still in Testing, the account must be added as a Test user first.
- →If the audience is Internal, only accounts inside that Google Workspace organisation can sign in at all.
- →The Merchant API must be enabled in the Google Cloud project the app belongs to.
- →The account must genuinely have access to the client's Merchant Center account. A successful sign-in proves identity, not reach.
1. Enable the Merchant API
In Google Cloud Console, open APIs & Services → Library, search
Merchant API, and click
Enable. Outloop calls it at
merchantapi.googleapis.com.
2. Create the OAuth client (once, for all Google connectors)
In Google Auth Platform → Clients, create a
Web application OAuth client and copy the
Client ID and Client Secret.
Under
Authorized redirect URIs add Outloop's local callback — without it
the browser connect below fails with redirect_uri_mismatch:
http://127.0.0.1:44317/oauth2/callback
The full one-time Google Cloud walkthrough — project, APIs, the whole scope set in one paste, and the publishing-status step that stops a working connection expiring after about a week — is in Set up one reusable Google Cloud OAuth app. If you already have a saved Google OAuth app, there is nothing to create here. The scopes this connector requests are:
https://www.googleapis.com/auth/content openid email
content scope and the restriction happens
inside Outloop instead — through the capabilities you approve, the
workspace account pin, and the actions Outloop blocks outright. If a guide tells you to pick a read-only
Merchant scope, it is describing something that does not exist.
The openid and
email scopes are how Outloop verifies which Google
account you actually connected. That identity check is Google OIDC and involves no Drive scope.
You only enter the Google OAuth app once
The first Google connector you set up asks for the Client ID and Client Secret from your Google Cloud OAuth client. Tick Save this Google OAuth app so other Google connectors can reuse it and every later Google connector — Google Ads, Gmail, Drive, Sheets and Analytics GA4 — picks it from the Google OAuth app dropdown with no Client Secret to re-enter. The saved app is then listed under Authentication Profiles. When a saved profile supplies the app, Outloop shows “Using <client-id>. Its Client Secret comes from the saved app — nothing to paste. This connector still signs in separately and gets its own access.”
Reusing the app does not mean sharing one login. Each connector still opens its own browser sign-in and gets its own refresh token, its own scopes and its own connected account — so you can revoke or re-authenticate one connector without touching the others.
Shared agency app or workspace-dedicated?
Which setup should I choose?
There are two reasonable answers for Google Merchant Center, and the right one depends on who owns the Google Cloud infrastructure — not on how many clients you have.
Agency-global (shared OAuth app)
One OAuth app your agency owns, reused by every Google connector you add. This is the default and the right choice for most agencies.
- ✓Client ID and Client Secret entered once, then picked from a dropdown.
- ✓Every connector still runs its own Google sign-in.
- ✓Each one gets its own scopes, its own refresh token, its own connected account and its own revocation.
- ✓Reusing the app grants no data access by itself — workspace grants and Access Profiles stay explicit.
Workspace-dedicated
A separate OAuth client — or a separate Google Cloud project — for one workspace or one client.
- →The client owns the Google Cloud infrastructure and wants to keep owning it.
- →They need stronger administrative separation, or their own consent branding and audience rules.
- →They want separate quotas and their own lifecycle control.
- →The client's Merchant account carries live product and pricing data and their team wants the OAuth app inside their own Google Cloud project.
A separate Google Cloud project is the strongest operational separation. A separate OAuth client inside the same project is lighter separation — useful, but the project is still shared.
3. Add Merchant Center in Outloop
In Outloop, open API Keys & Access → Add an API key and choose Google Merchant Center. The panel opens on Connect in your browser, with the Cloud Console detail in the collapsed Setup details — Google Cloud OAuth client, scopes and caveats and Before you connect disclosures. Check the Google OAuth app dropdown — a saved profile supplies the app with no Client Secret to re-enter.
4. Connect the account in your browser
Click Connect Google Merchant Center in your browser. Google's own sign-in opens, you sign in as the account with Merchant Center access, and you approve the consent screen there. Outloop mints and stores the refresh token host-side.
.env file.
5. Confirm the account and capabilities
Outloop shows Connected as the Google account you just used — check it before an agent touches live product data. Under Agents will be able to (change any time in the Access profile), practical capabilities are pre-checked and destructive ones are prefixed ⚠ and left unchecked. Then click Confirm — this is the approved account.
6. Save the Access Profile and map the Merchant account
OAuth is not the finish line — the Access Profile is
When Google Merchant Center hands you back to Outloop, the connector is authenticated but not yet authorized. Agents cannot use it until you make the authorization decision yourself:
- OAuth connected
- Confirm the account
- Open the Access Profile
- Approve the Merchant account ID
- Choose capabilities
- Save the Access Profile
- Copy the proof prompt
In the Access Profile you set two things. Reach — the one approved entry under Approved Merchant account that this workspace may use. And capabilities — what agents may actually do inside it, with anything destructive left off unless you turn it on.
This is the step that separates clients. Enter the Merchant account ID this workspace is allowed to use:
workspace_001 → allowed merchant_id: <MERCHANT_ID>
A request naming a different Merchant account is denied before the credential is read. That is what makes one agency Google identity safe to use across a roster of client Merchant accounts.
7. Run the first proof
Ask the agent for a safe read of the approved account:
{
"tenant": "<WORKSPACE_ID>",
"service": "google_merchant_center",
"verb": "api_bridge.request",
"method": "GET",
"path": "/accounts/v1/accounts/<MERCHANT_ID>"
} Success criteria:
decision: allow HTTP 200 the account returned is this workspace's approved Merchant account secret_exposed: false audit entry exists
/accounts/v1/accounts is resource discovery
only — it is never the identity check, which is done separately through Google OIDC. An empty list is
still a valid connection; sub-accounts under an advanced account need their own call to enumerate.
What stays blocked
- →A different Merchant account — refused before the credential is read; no Google call is made.
- →Account administration — blocked by runtime policy with
ACCOUNT_ADMIN_BLOCKED. This is a hard block, not a capability you can enable from the agent side.
Changing the account or the credential later
Changing the account or the credential later
Three controls on the Google Merchant Center connector look similar and do different things. Picking the wrong one is the most common way a working connector gets broken on purpose.
Re-authenticate
Reuses the OAuth app you already selected and refreshes the authorization for the account that is already connected.
When: Use it when the refresh token expired or was revoked and you want the same account back.
Safety: It must not quietly become an account switch. If Outloop finds a different account at the other end, it reports the mismatch and keeps the previous token.
Connect as a different Google account
Keeps the same Client ID and Client Secret and opens Google's account chooser so you can pick another identity.
When: Use it when the wrong account was connected, or when the client moved the data to a different Google account.
Safety: The stored token is replaced only after Outloop positively verifies that the newly connected identity is the one you intended. A mismatch, a missing identity, a failed verification or a cancelled sign-in all leave the previous credential exactly as it was.
Replace the full credential
Swaps the OAuth app itself — a different Google Cloud project, Client ID or Client Secret.
When: Use it when the OAuth app is changing hands, or a client is moving the connector onto their own Cloud project.
Safety: This is not the same as choosing another Google data account. Confirm with "Sign in and replace" only when you actually mean to change the app.
Verified vs not claimed yet
"Verified" here means a real proof passed through Outloop in a workspace — it is never a product-level claim about the connector.
- Verified A read-only proof through Outloop against a live Merchant account:
decision: allow, HTTP 200,secret_exposed: false. - Supported, not verified yet Write operations — feed and product changes. Supported by the API and permitted through bridge policy when authorized, but not runtime-verified. Only a read proof was run, deliberately, because the account was a real production account with live product data.
- Not claimed Account administration. Blocked by runtime policy — this guide makes no claim that agents can perform it.
- Not claimed Anything on a machine other than the Mac this was proven on. Outloop is at controlled design-partner stage.
- Not claimed That a successful OAuth callback means the connector is ready. It means Google accepted the sign-in — nothing more until a provider request succeeds.
Troubleshooting
Google shows an account chooser
Expected. Outloop asks Google for the chooser on purpose, so a sign-in can never silently reuse whichever account your browser happened to be logged into. Pick the account that owns or can open the client's Merchant Center account — which is often not the account that manages the Google Cloud project.
“Google hasn’t verified this app”
This appears because the OAuth app is your own and has not been through Google's verification. If it is your app and you trust it, expand Advanced and continue. If you do not know who owns the app, stop — that warning is doing its job, and clicking past an unknown app is not a routine step.
Which audience the app uses decides who can get that far at all. An External app in Testing only admits accounts added as Test users. An Internal app only admits accounts inside its Google Workspace organisation. For customer-facing production use, complete Google's verification rather than living in Testing.
The wrong Google account got connected
Use Connect as a different Google account on the connector. It keeps the same Client ID and Client Secret and reopens Google's chooser. The stored token is only replaced once Outloop verifies the new identity is the intended one — if it does not match, Outloop reports the mismatch and keeps the previous credential. Nothing is lost by trying.
A credential that works but sits on the wrong account is deliberately not marked runtime-verified for that workspace. Working and correct are different things.
BACKEND_AUTH_FAILED during connect
Google rejected the sign-in, so the new credential failed Outloop's safe verification. The important part: the previous credential is unchanged. Do not delete the connector, the OAuth app or the workspace as a first move. Check, in this order — that you signed in as the account that can reach the client's Merchant Center account; that the account is admitted by the app's audience (a Test user on an External+Testing app); and that the API is enabled in the right Cloud project. Then try the connect again.
Reconnecting never asked for the Client ID and Secret
Expected. Disconnecting a Google Merchant Center credential does not delete your saved Google OAuth app profile — that is a separate object, kept on purpose so later connectors do not re-enter a Client Secret. Outloop reused it. If you specifically want a different app, pick another saved profile from the Google OAuth app dropdown, or create a new one and save it alongside. This is reuse working, not a stale credential silently retained.
“Copy workspace run prompt” is not available
The Access Profile has not been saved yet. Open the Access Profile, choose the reach and the capabilities, and click Save Access Profile — the run prompt becomes available once the authorization is recorded. OAuth succeeding is not the same as the workspace being authorized, and this is the step that closes the gap.
The connection stops working after about a week
If the OAuth app's audience is External and its publishing status is still Testing, Google expires refresh tokens for that app after roughly seven days. Two honest options: publish the app to In production, or use an Internal audience if everyone signing in is inside your Google Workspace organisation. Publishing may require Google's verification review depending on the scopes the app requests — that is Google's process and its outcome and timing are not ours to promise.
The account list came back empty
Expected in some setups, and not a broken connection — see the note in step 7. Sub-accounts under an advanced account need their own call to enumerate.
A call returns ACCOUNT_ADMIN_BLOCKED
The agent attempted account administration, which is blocked by runtime policy. This is not a configuration problem and cannot be enabled from the agent side.
The sign-in worked but no Merchant account is reachable
The account you chose in Google's chooser signed in successfully but has no access to the client's Merchant Center account. Sign-in proves identity, not reach. Have the client grant that exact address access in Merchant Center, or use Connect as a different Google account to connect as one that already has it.
Rotate or revoke access
- →Move a workspace off an account — change the mapped Merchant account ID and save. The workspace's reach changes immediately; the credential is untouched.
- →Rotate the token — use Re-authenticate on the connector. Same account, fresh authorization.
- →Revoke everything for this connector — remove the Merchant Center credential in Outloop, then revoke Outloop's access for that account at myaccount.google.com/permissions. Do both: removing the local credential does not revoke the grant at Google.
- →Off-boarding a client — also ask them to remove the connected address from their Merchant Center users list. Revoking on your side does not remove the account's standing access on theirs.
Official Google documentation
- →Merchant API reference — the current sub-API surface and request shapes.
- →Merchant API quickstart — enabling the API and the OAuth scope it requires.
- →OAuth app audience and publishing status — Internal vs External, Testing, and Test users.
- →Using OAuth 2.0 to access Google APIs — refresh-token behaviour, including the Testing-status expiry.
Outloop is an independent tool and is not affiliated with or endorsed by Google. See the security model, the Google Ads setup guide, the full guide index, or running agents across client marketing accounts.
One agency identity. Many client Merchant accounts. No crossover.
Outloop is available with guided onboarding for AI agencies, operators, and dev shops.