Google Ads conversions

Google's automated bidding only works when it sees conversions inside Google Ads. That is the one reason sites keep a Google tag next to Clickport. This integration closes it: Clickport serves your converted ad clicks as a file that Google Ads fetches on a daily schedule. Smart Bidding gets fed, and the Google tag, the GA4 import, and the consent wiring around them can go.

What we store, and why. When someone lands from a Google ad, the URL carries a click ID (gclid). Clickport keeps that ID on the session for one purpose: returning it to Google when the session converts on a goal you explicitly marked. It is never used for profiling, never shared across sites, and without a marked goal the feed serves nothing. Fathom and Plausible refuse to store click IDs at all, which is a legitimate stance. Ours is different: the ID goes back only to the platform that minted it, and you opt in per goal.

Why feed conversions back

Campaigns bid with strategies like Maximize Conversions or Target CPA. Those learn from conversion signals. Without them, Google optimizes for clicks, and clicks are what junk traffic is best at producing. With real conversions flowing back, the bidding learns which searches, audiences, and placements produce signups or sales, and moves your budget there. Sites fighting click fraud usually fight it manually with country and IP rules. Conversion feedback attacks the same problem at the root: Google stops bidding on traffic that never converts.

If your goals carry values, it gets better. A goal with a fixed value (say a lead worth 80) or a goal backed by tracked revenue reports that value per conversion, and value-based bidding can optimize for money instead of counts. With Stripe or Paddle connected, the value Google bids on is the amount that actually reached your payment provider, not what a browser script claimed before an ad blocker ate it.

Five typical ways to use it

1. Drop the cookie banner without losing your campaigns

Many sites keep a Google tag for exactly one reason: the ads need conversion data. That tag is also why the cookie banner exists. With the feed, conversions reach Google Ads from the server instead. The tag goes, the banner goes, and every visitor who used to click "reject" or ignore the banner is measured again. Sites switching from a consent-gated setup often see more recorded conversions, not fewer, because nothing is lost to consent anymore.

2. Bid on real revenue, not browser estimates

An e-commerce or SaaS site with Stripe or Paddle connected reports the amount that actually reached the payment provider, per order, with its order ID. Switch the campaign to value-based bidding (Maximize Conversion Value or Target ROAS) and Google optimizes for money instead of counting every sale the same. A browser-side purchase event can be blocked, doubled, or wrong; a payment webhook is none of those.

3. Teach Google's bidding away from junk clicks

If your campaigns attract bot traffic or low-quality clicks, blocking countries and IPs by hand is a treadmill. Conversion feedback fixes the incentive instead: Smart Bidding learns which searches, placements, and audiences produce real signups, and stops spending on the ones that never convert. You do nothing beyond keeping the feed running. The junk starves.

4. Report leads when they become customers

Lead-gen sites rarely know a lead's worth on day one. The deal closes in your CRM days or weeks later. Store the gclid with the lead, and when the deal closes, push the conversion with its real value through the Revenue API. Google accepts conversions up to 90 days after the click, so the bidding learns from closed deals, not form fills. The same flow covers signups confirmed by email: the verification click lands in a new session, but the stored click ID bridges it.

5. Run client campaigns without touching client sites

Agencies keep the moving parts small: one Clickport script on the client's site, one feed URL pasted into the client's Google Ads account, done. No tag manager container to maintain, no consent-mode wiring to break silently, and the feed health line shows the last fetch and row count when a client asks whether tracking works. Each site has its own URL, revocable on its own, so offboarding a client never touches another account.

Turn it on per goal

Open Settings → Goals & Funnels, edit a goal, and switch on Report to Google Ads. The conversion name defaults to the goal name; set it explicitly if your conversion action in Google Ads is named differently. The goal's value and currency flow through unchanged.

Settings · Goals · Edit goal
One switch per goal
Only goals with this switch on ever reach the feed.
Report to Google Ads
Conversions of this goal are listed in the site's Google Ads conversions feed, matched by the ad click that started the session. Conversion name: Demo booked · 80 GBP

Get the feed URL

Then open Settings → Integrations → Google Ads and generate the feed URL. It is a private, tokened address serving a CSV of recent converted clicks. Treat it like a credential: anyone with the URL can read conversion times and values (never visitor data). You can replace it at any moment; the old URL dies instantly.

Settings · Integrations · Google Ads
Google Ads conversions feed
Copy the URL once into Google Ads. Google fetches it daily.
Feed URL
https://clickport.io/api/ads-conversions/gaf_9c2e41d7b0a8….csv
Copy Replace URL
Last fetched 4 hours ago · 23 conversions served · by Google

The health line shows every fetch. If Google stops eating, you see it here first.

Schedule it in Google Ads

  1. In Google Ads, create a conversion action of type Import for each reported goal. The action's name must match the conversion name exactly.
  2. Go to Goals → Conversions → Uploads → Schedules and add a schedule with source HTTPS.
  3. Paste the feed URL. If the form requires a username and password, any values work: the URL itself is the key.
  4. Set the frequency to daily.

For the first import, you can backfill up to 30 days by running one manual upload with ?window=30d appended to the URL. The scheduled feed then serves a rolling window with overlap; Google removes duplicate rows itself, so overlapping fetches are safe by design.

What the file contains

The feed follows Google's click-conversion import template exactly: a timezone header, then one row per converted click with the click ID, conversion name, conversion time (in your site's timezone), value, currency, and order ID where one exists. Nothing else. No pages, no visitor attributes, no identifiers of any kind beyond Google's own click ID.

The consent columns are your assertion. Since March 2024, Google requires two columns in every conversion upload: Ad User Data and Ad Personalization, set to Granted or Denied. They state the advertiser's consent position for EEA/UK traffic under Google's EU User Consent Policy. Clickport fills them from a per-site setting (default Granted) but cannot make this call for you: whether you may assert consent is between you, your visitors, and Google. If you serve EEA or UK traffic, read Google's policy and set the columns accordingly.

Timing

  • Google needs about 6 hours to index a click before it accepts the conversion. Conversions from sessions younger than that are held automatically and ship with the next fetch. Nothing is lost.
  • Imported conversions appear in Google Ads reporting a few hours after the fetch.
  • Click IDs are valid for 90 days on Google's side. Conversions older than that cannot be imported, by Google's rule.

Conversions that happen later

Some conversions fire in a different session than the ad click. A signup confirmed by email lands on your site from the verification link, in a fresh session without the click ID. Clickport is cookie-free and does not recognize returning visitors, so it cannot bridge those sessions. You can, because the visitor is your user now.

The pattern: store the gclid from the landing URL in a hidden form field or alongside the new account, and send it with the conversion through the Revenue API:

POST /api/revenue
{
  "order_id": "signup-3481",
  "amount": 80,
  "currency": "GBP",
  "click_id": "EAIaIQobChMI..."
}

A conversion sent with its own click_id lands in the feed regardless of which session it happened in. The same mechanism serves CRM workflows: push a conversion when a lead becomes a customer weeks later, as long as it is within Google's 90-day click window.

Limits, honestly

  • Parts of iOS traffic are not attributable this way. On iOS, Google often replaces gclid with wbraid/gbraid, and Google's file import does not accept those. Clickport already captures them, so this improves without any change on your side if Google opens the door.
  • Remarketing is not replaced. Audience lists need visitor identity, which cookie-free analytics does not have. Reach past customers with Customer Match (your own customer emails, uploaded by you to Google Ads), and let clean conversion signals steer Performance Max targeting.
  • No modeled conversions. Google's tag estimates conversions it could not observe. Clickport reports only observed ones: fewer, and true. Expect Google Ads to show somewhat lower conversion counts than a tag with modeling turned on would.