# Close the loop on Google Ads

The Google Ads integration closes the loop on paid traffic. It pulls what you spent out of Google Ads and puts it next to what that spend earned by Tracking's own attribution, and it can send your real conversions back so Google optimises on outcomes rather than on what its pixel happened to see.

The `Google Ads` page has four tabs: `Campaigns`, `Settings`, `Reports` and `Conversions`.

## Check the connection first

Linking a Google Ads account to your product is a platform step, done once outside Tracking. Every tab reflects the result of that link.

| State | What it means |
|---|---|
| `connected` | The account is linked and named |
| `account selection pending` | The link exists but no account has been chosen yet |
| `re-authorisation needed` | The link has expired and must be granted again |
| `not connected` | There is no link |

In any state but `connected`, spend sync stays off and `Conversions` shows a `Connect a Google Ads account first` screen instead of its settings. One product connects to one Google Ads account.

**MCP.** [`tracking_googleads_connection_status`](/reference/mcp-tools/tracking_googleads_connection_status).

## Set the URL suffix

This is the one step that is easy to get wrong and quietly breaks everything downstream. `Settings` shows a `URL suffix template` card with the exact string to copy.

1. In Google Ads, open `Settings` → `Account settings` → `Tracking`.
2. Paste the string into the `Final URL suffix` field and save. That applies it to every campaign. You can also set it per campaign, under `Settings` → `Additional settings` → `Campaign URL options`.
3. Leave Google's auto-tagging **on**.

The suffix appends the campaign, ad group and creative identifiers to every paid click. `utm_campaign` is the key the reports join on; the `_lt_*` parameters carry the ad dimensions, and `_lt_campaign` is what proves the template is actually live.

> **Auto-tagging is not optional.** The suffix carries no `utm_source` or `utm_medium` — Google's own `gclid` is what marks the click as paid. Turn auto-tagging off and attribution breaks even with the suffix set correctly.

## Sync the spend

`Settings` → `Spend sync` has a `Sync now` button, shown once an account is connected. The first successful sync enrols the account, after which it refreshes on its own once a day. `Sync now` reports how many campaigns, ad groups and ads it saw and how many daily rows it updated; a run against an account with no delivery in the window says so rather than pretending.

The first sync reaches about 30 days back. The daily refresh re-reads roughly the last 7 days, so figures Google restates after the fact are corrected. Rows are updated in place, and a campaign renamed in Google shows its new name across its whole history after the next sync.

**MCP.** [`tracking_googleads_sync_now`](/reference/mcp-tools/tracking_googleads_sync_now).

What is imported, for the connected account at campaign, ad group and ad level: the structure (names, status, the campaign's channel type and the ad's type) and daily performance for each (cost, impressions, clicks, and Google's own reported conversions and conversion value). **Nothing is written back to Google by the import; it only reads.**

Money that arrives from Google Ads is in **micros** — one unit of the account's currency is 1,000,000 micros, so a cost of `12,340,000` micros is 12.34 in the account currency. The conversion happens before anything is displayed, so everything you read is in ordinary money in the account's own currency. Currencies are never mixed and never summed across accounts.

## Read the campaigns

`Campaigns` is the default tab: your paid traffic with Google's spend on one side and Tracking's attributed revenue on the other, for the date range and attribution model you pick.

Cost, impressions and clicks come from Google. Revenue, conversions, ROAS and CPA come from Tracking's attribution. ROAS is revenue divided by spend and CPA is spend divided by conversions; both are blank when there was no spend. **Attribution is campaign-level**, so ad groups and ads show spend only.

A banner warns you when paid tracking is broken, and campaigns are flagged when their cost figures have not been refreshed for more than a day.

`Reports` puts the same data into two views — ROAS, and You vs Google — described on [Read the attribution reports](/acquire/tracking/reports). Revenue that Tracking attributed to a `utm_campaign` matching no campaign in your account is listed separately rather than dropped.

**MCP.** [`tracking_googleads_roas_report`](/reference/mcp-tools/tracking_googleads_roas_report) and [`tracking_googleads_us_vs_platform`](/reference/mcp-tools/tracking_googleads_us_vs_platform).

## Check that your tags arrive

`Settings` → `Paid tracking health` answers one question: do your tags actually arrive? It is computed from your own stored events over about 30 days, without asking Google anything.

Every Google paid click that landed — one carrying a `gclid`, or one whose `utm_medium` is a paid medium with a Google-ish `utm_source` — is checked for the `_lt_campaign` marker.

| Panel | What it means |
|---|---|
| **Verified** | Every paid click carried your labels |
| **Broken** | Some did not. It shows how many out of how many, the percentage, and a sample of the offending landing URLs so you can find the campaign missing the suffix |
| **No data** | No Google paid clicks have arrived in the window yet |

Under a very large number of paid clicks the figures become a lower bound, and the panel says so.

Clicks from visitors who declined statistics consent are counted here — a cookieless paid click is a real click — and shown as a separate note, so you can see how much of your paid traffic cannot be tied to a person. It is part of the totals above, not something to add to them.

**MCP.** [`tracking_googleads_tracking_health`](/reference/mcp-tools/tracking_googleads_tracking_health).

## Send conversions back

`Conversions` is where your attributed conversions are uploaded to Google Ads as offline conversions. **This is the one place Tracking changes how your ads learn, so set it deliberately.**

### What you configure

| Setting | What it does | Default |
|---|---|---|
| Master switch | Nothing is uploaded until it is on | Off |
| What Google learns from | `Fill gaps` adds these conversions on top of what your existing pixel counts; `Our data only` means Google learns from these alone, which suits a freshly created conversion action | `Fill gaps` |
| Match window | How far back a click may be to be matched to a conversion, and the window re-scanned on each run: 14, 30, 60 or 90 days | 90 days |
| Rules | Each maps one tracked event name to one conversion action, and says what the conversion is worth. One conversion action per event; an event may not appear in two rules | None |
| Enhanced conversions | Also sends the person's hashed email and phone alongside the click id as extra matching signals. The click id stays the primary key, and a conversion whose person has neither gains nothing — it is added help, not a replacement | Off |

The event names offered are the ones already in your event catalog, and the conversion actions are read live from the connected account. Saving a rule that names an event no longer in the catalog, or an action no longer in the account, is refused with a message naming the offending rule.

**MCP.** [`tracking_googleads_feedback_config_get`](/reference/mcp-tools/tracking_googleads_feedback_config_get) and [`tracking_googleads_feedback_config_set`](/reference/mcp-tools/tracking_googleads_feedback_config_set); [`tracking_googleads_conversion_actions`](/reference/mcp-tools/tracking_googleads_conversion_actions) lists the actions available in the account.

### What a conversion is worth

Each rule picks one of three value sources:

| Value source | What it sends | Available for |
|---|---|---|
| **Dynamic revenue** | The person's net revenue in the subscription's currency: payments minus refunds | `subscription_started` only |
| **Dynamic** | The amount carried by that occurrence itself | Events that record an amount, which today means `payment` |
| **Fixed** | An amount you type, in the connected account's currency. Zero is allowed and is uploaded as a value-less lead conversion | Events that carry no money, such as a signup |

Amounts are converted to Google's micros on the way out.

### How a click is found

A conversion is only useful to Google if it can be tied to the click that caused it. For each conversion, every anonymous id known for the person is gathered and the **most recent `gclid`** within the match window is picked. If nothing is found that way and the conversion event itself arrived on a page carrying a `gclid`, that one is used.

Conversions with no click id found are not uploaded, and their number is shown so the gap is visible rather than silent.

The visitor's marketing consent is read from **the very click being reported** — not from the person in general, and not from the conversion, which may be a later visit under a different answer. Granted and denied are passed on to Google as such; when the site runs no consent banner, nothing is claimed either way. See [What tracking does with a consent answer](/privacy/tracking-consent).

### Run it and watch the funnel

Once enabled, uploads run on their own once a day. `Run now` does one pass immediately, which is the quick way to check a new rule.

`Upload status` shows the coverage of the last run as a funnel: how many conversions were considered, how many were tied to a click, how many were uploaded, and where the rest went — no click id found, or no value yet. A conversion whose amount has not landed yet is not lost; it is picked up on a later run. Cumulative uploaded and failed counts sit underneath.

`Upload log` is the per-conversion record: when, which event, a masked click id, the conversion action, the value and whether it was uploaded or failed, with the reason on failures.

Each conversion occurrence is uploaded once per conversion action. **Re-running is safe**: an upload already made is skipped, and Google itself deduplicates on the order id that is sent.

**MCP.** [`tracking_googleads_feedback_run`](/reference/mcp-tools/tracking_googleads_feedback_run), [`tracking_googleads_feedback_status`](/reference/mcp-tools/tracking_googleads_feedback_status) and [`tracking_googleads_feedback_uploads`](/reference/mcp-tools/tracking_googleads_feedback_uploads).

### Before you turn it on

- Offline conversions are not instant. Google can take hours to reflect them.
- Enabling or changing a conversion action **resets the campaign learning phase**. Expect a re-learning period.
- Try it on a few campaigns before rolling it out account-wide.
- With `Our data only`, Google needs tens of conversions before the signal is usable for optimisation.

These warnings are shown on the page whenever the configuration is saved or read, so they are in front of you at the moment they matter.

## Next steps

- [Read the attribution reports](/acquire/tracking/reports): the model and window that drive every figure here.
- [Send revenue from your backend](/acquire/tracking/revenue): the money a dynamic-value rule uploads.
- [Fix conversions that never arrive](/acquire/tracking/troubleshooting): the funnel, the switch and auto-tagging, in order.
- [What tracking does with a consent answer](/privacy/tracking-consent): why a declining visitor's click carries no `gclid`.
