Atribu
Getting Started

Step 6 — Connect Meta and Google

Link Meta and Google Ads to import campaigns, spend, and performance data

This page is the In the app track for step 6 of the golden path. The agent track is at the bottom, under With the API / an AI agent.

Connecting your ad platforms lets Atribu pull in your campaigns, ad sets (or ad groups), individual ads, and daily spend data. This is what makes it possible to calculate ROAS (Return on Ad Spend) -- the ratio of revenue earned to money spent on advertising. Without this connection, Atribu can still track visitors and conversions, but it cannot tell you which specific campaigns are profitable.

What gets synced

Once connected, Atribu automatically imports:

DataDescription
CampaignsAll campaigns in your ad account, including name, status, and objective
Ad sets / Ad groupsThe targeting groups within each campaign
AdsIndividual ad creatives, including thumbnails and video references
Daily spendHow much you spent each day, broken down by campaign, ad set, and ad
ImpressionsHow many times your ads were shown
ClicksHow many times people clicked your ads

Performance metrics like CPM (cost per thousand impressions), CPC (cost per click), and CTR (click-through rate) are calculated automatically from this data.

Connect your platforms

Open Integrations

In your Atribu dashboard, go to Settings > Integrations.

Click Connect Meta

Find the Meta card and click Connect. You will be redirected to Facebook.

Authorize in Facebook

Log in to Facebook (if not already) and review the permissions Atribu is requesting:

  • ads_read -- Read your ad account data (campaigns, spend, performance)

Click Continue to authorize.

Select ad accounts

After authorization, choose which ad accounts you want to sync. You can select multiple accounts if you manage ads for several businesses.

Done

Atribu begins syncing your data immediately. You will see campaigns and spend data in your dashboard within a few minutes.

Sync frequency

Atribu syncs your Meta ad data automatically. After the initial import (which pulls historical data), updates arrive throughout the day. Spend data for the current day may take a few hours to reflect the latest numbers, as Meta's reporting API has its own delays.

Re-authorization

If Atribu adds new features that require additional permissions, you may need to reconnect your Meta account. When this happens, you will see a banner in Settings. Facebook only shows the permissions dialog when Atribu explicitly requests it, so the reconnection process is quick -- your existing data is preserved.

Open Integrations

In your Atribu dashboard, go to Settings > Integrations.

Click Connect Google Ads

Find the Google Ads card and click Connect. You will be redirected to Google.

Sign in with Google

Sign in with the Google account that has access to your Google Ads account. Review the permissions and click Allow.

Select your customer account

If your Google account has access to multiple Google Ads customer accounts (common for agencies using a Manager Account), select the one you want to sync.

Done

Atribu begins syncing your Google Ads data. Campaigns, ad groups, ads, and spend data will appear in your dashboard within minutes.

Manager accounts

If you use a Google Ads Manager Account (MCC), you can connect individual client accounts underneath it. Each client account syncs independently.

Troubleshooting

I do not see my ad accounts

  • Meta: Make sure you are logging in with a Facebook account that has at least "Advertiser" access to the ad account. If you manage ads through a Business Manager, the ad account must be shared with your personal Facebook account.
  • Google Ads: Make sure you are signing in with the Google account that has direct access (or Manager Account access) to the Google Ads customer account.

Data is missing or incomplete

  • Recent changes: After connecting, the initial sync pulls historical data. This can take a few minutes for accounts with many campaigns. Check back in 10-15 minutes.
  • Paused campaigns: Atribu imports all campaigns regardless of status (active, paused, archived). If you do not see a specific campaign, check that you connected the correct ad account.
  • Spend shows zero: Some campaigns (especially brand awareness campaigns) may have impressions but very low or zero recorded spend on certain days. This is normal.

I need to reconnect

If your connection stops working (for example, if you changed your Facebook password or revoked access), go to Settings > Integrations, find the platform, and click Reconnect. Your historical data is preserved.

With the API / an AI agent

A connect is an OAuth consent: it needs a browser and a person who can grant it. What an agent can do is start it, hand the URL over, and detect completion.

Poll until the connection appears and is healthy
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://api.atribu.app/api/v1/connections"

Only connected and syncing are working. Anything else is a connection that exists and is not delivering — readiness reports it as degraded, never missing, because the fix is to re-connect.

When one consent exposes several ad accounts, the connect lands pending and the choice is explicit:

curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
  "https://api.atribu.app/api/v1/connections/pending/meta_ads"

curl -sX POST https://api.atribu.app/api/v1/connections/pending/meta_ads/finalize \
  -H "Authorization: Bearer atb_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"account_id": "act_1234567890"}'

Mint a session-less URL instead of sending them to the console (#1046):

Hand a Meta connect to a human
curl -sX POST https://api.atribu.app/api/v1/connections/meta_ads/handoff \
  -H "Authorization: Bearer atb_live_YOUR_KEY" \
  -H "Content-Type: application/json" -d '{}'

meta_ads · google_ads · google_search_console · gohighlevel · stripe · mercadopago. The response is a hand-off — the same shape GET /api/v1/handoffs/{id} returns, so mint and poll need one parser. Whoever holds url completes it: signed out, on a phone, with no Atribu account. Poll until status settles.

A completed connect answers one of two result shapes: connection_id when the consent resolved to exactly one account, or pending_selection when a human must choose — which is what the two pending routes above are for. A failure names its reason (provider_denied, no_candidates, connect_failed, token_exchange_failed, origin_not_allowed, handoff_unusable).

Shopify cannot have one, and that is not an omission

A Shopify install begins inside Shopify — the merchant opens the App Store listing and Shopify calls Atribu with an HMAC-signed request. There is no consent Atribu can start on the merchant's behalf, so a hand-off URL would have nowhere to go. Send them to the listing. See Connections.

Over MCP

start_connect mints the same hand-off and get_handoff polls it — both thin wrappers on the two routes above, so the MCP and REST journeys are the same journey (#1058).

Stop polling — subscribe (#1049)

Subscribe to connection.connected and connection.reconnect_required with providers: ["atribu"] and stop polling entirely. See Webhooks.

Next steps

On this page