Sending conversions to Google Ads
The two ways to report a conversion to Google Ads — a pixel from the browser and an upload from our server — what each one needs, field by field, and the one combination that doubles your reported sales.
Google's bidding optimises on the conversions Google knows about. A lead that arrives by WhatsApp two days later, or a sale on an affiliate network three pages after the click, is one it never sees — so it bids as though those campaigns earned nothing.
There are two ways to tell it, and this page is mostly about keeping them apart:
- The pixel. Fires from the visitor's browser, the moment the goal happens.
- The upload. Posted from our server, matched on the gclid — the id Google puts on the click.
They are not two settings you turn on for safety. Point both at the same conversion action and Google counts every sale twice.
#Which one you need
| What you are measuring | Use | Why |
|---|---|---|
| A sale on an affiliate network | The upload | There is no page of yours to put a pixel on. |
| A WhatsApp or phone tap | Either | The pixel is less setup; the upload survives a refused cookie. |
| A lead form on your own site | Either | Same. |
| A sale that can be refused or refunded | The upload | Only the upload knows the status later. |
| A shop checkout | The pixel, usually | The value is on the page already. |
| Traffic where many visitors block scripts | The upload | A blocked pixel reports nothing and says nothing. |
If you want both running, they have to report to two different conversion actions, and only one of them should be marked primary. See the double-count trap.
#Part 1 — the pixel
#What actually happens
Step by step, with the detail that matters:
- The visitor does something you defined as a goal — submits the form, taps WhatsApp, taps the phone number, reaches a thank-you page.
- The UTMCAP tag records the goal against that visitor's click. This part happens whether a pixel exists or not, and it is what your own reports use.
- The tag looks at which pixels are attached to that goal. A pixel is attached to one goal, so a site with three goals and three pixels fires exactly one of them.
- The tag loads Google's
gtag.js— then, not before. It queues the conversion first and sends it the instant the script arrives, so a slow script does not lose the conversion. - Google counts it against the conversion action the label belongs to, and shows it in reporting some hours later. Not immediately.
#There is no Google tag on your page
This surprises people, so it is worth saying plainly. You do not add
gtag.js to your HTML. You do not add Google Tag Manager. The only script on
your page is the UTMCAP tag, and it fetches Google's script on demand, once,
the first time a Google pixel actually fires.
Three things follow from that:
- A visitor who never converts never loads anything of Google's. Fewer requests on every page, and one less third-party script on the ones that do nothing.
- The pixel cannot fire before the goal is recorded. The order is fixed, so there is no case where Google has a conversion and your own reports do not.
- A refused advertising cookie means no pixel at all. If your site gates the tag behind consent, the tag never runs and neither does the pixel. That is correct behaviour and it is also lost data — which is the argument for the upload.
#Setting it up in Google Ads
You need a conversion action that expects a call from your own page rather than from a Google tag.
- Go to Goals → Conversions → Summary and create a new conversion action.
- Choose Website as the source.
- When Google offers to scan your site or install its tag, take the option that lets you add the action manually instead.
- Fill in the name, the goal category, and a value (see Value below).
- Save it, then open it again and look at its data source. It should read Manual event.
That last check is the one that matters. An action set up to be fired by the Google tag automatically will never receive anything from UTMCAP — it will sit at zero conversions and report no error.
Then open the action's tag setup. Google shows you a send_to value that looks
like this:
AW-123456789/AbC-D_efGhIjKlMn
#The two fields are one string, split at the slash
| Part | Goes in | Shape |
|---|---|---|
| Before the slash | Conversion ID | AW- then 8–12 digits |
| After the slash | Conversion label | Letters, digits, dashes and underscores |
The Conversion ID is the same for every action in your account. The Conversion label is what makes one action different from another — so three goals reporting separately means one ID and three labels.
Pasting the whole string into the Conversion ID box is the usual mistake. It looks right, fires nothing, and reports no error anywhere. UTMCAP refuses it on save for exactly that reason, so if the box turns red, check for a slash.
#Setting it up in UTMCAP
Open Tag Manager, pick the site, go to the Pixels tab, and press Pixel.
| Field | What to choose |
|---|---|
| What to fire | A network pixel |
| When | The goal, as "Lead form fires" — or Every page view |
| Network | Google Ads |
| Tell it this happened | conversion — Google has only this one |
| Conversion ID | AW-123456789 |
| Conversion label | AbC-D_efGhIjKlMn |
Then press Publish to my site. Nothing fires until you do, and the pages pick the change up within five minutes — so a test straight after saving tests the old version.
#What the browser sends
This is the whole of it:
gtag('event', 'conversion', {
send_to: 'AW-123456789/AbC-D_efGhIjKlMn',
value: 2500,
currency: 'INR'
});
Nothing else. No visitor details, no page content, no click id.
That last absence is the important one. There is no field in Google's browser
conversion that an uploaded conversion could be matched against, so Google
cannot tell that a pixel and an upload are the same sale. (Meta is different —
UTMCAP sends Meta an eventID precisely so it can deduplicate the browser
event against the server one. Google has no equivalent to send.)
#Where the value comes from
Three sources, in this order. The first one that has a number wins:
- The goal call itself, if your site passes one:
utmcap.goal('purchase', { value: 2500, currency: 'INR' }). - Values from the page — a CSS selector you configure on the site, pointing
at the element holding the total. The tag reads it and strips the currency
symbol and the commas, so
₹2,500.00arrives as2500. - Nothing. The pixel is sent with no value.
Currency defaults to USD when a value is found but no currency is.
A number read off a page is a number a visitor with developer tools can change, so page values are used for the pixel only. What UTMCAP records as revenue comes from the goal call or the signed lane. See Goals on your own site.
#Value, and why it matters
A pixel with no value sends no amount. Google then falls back to the default value on the conversion action, so every conversion is worth the same — often ₹1 or $1, whatever was typed when the action was made. Smart Bidding then treats a junk enquiry and a ₹90,000 order as identical.
A primary action feeds bidding. Google's Primary action setting decides whether Smart Bidding optimises toward it. Three goals all marked primary with the same value tells Google that a phone tap and a completed lead form are worth the same thing. Give them different values, or mark the weaker ones secondary.
#A worked example
One site, three goals, three conversion actions. One ID, three labels:
| Goal | Conversion ID | Conversion label | Value | In Google Ads |
|---|---|---|---|---|
| Lead form | AW-123456789 |
Q5_lCIbz… |
500 | Primary |
| WhatsApp click | AW-123456789 |
WQk3CInz… |
150 | Primary |
| Phone click | AW-123456789 |
KBcuCIzz… |
150 | Secondary |
Three pixels in UTMCAP, each attached to its own goal. Three conversion actions in Google Ads, each with its own label. The reporting then separates lead forms from taps, which is the point of doing it this way rather than firing one conversion for everything.
#Part 2 — the upload
The other direction entirely: no browser, no script, no cookie. Every conversion UTMCAP records for a Google click is posted to the Google Ads API and matched on the gclid.
This is the one that keeps working for visitors who block scripts, refuse cookies, or tap a WhatsApp button and never come back to the page at all. It is also the only one that can take a sale back.
#What has to be in place
Four things, and the upload is silent if any one of them is missing.
| Where | What | Why |
|---|---|---|
| Google Ads | Auto-tagging on | Puts gclid on the URL. Without it there is nothing to match a conversion to. |
| Google Ads | A conversion action that accepts imports | The upload targets it by id. |
| UTMCAP | The traffic source is connected to Google Ads | The upload uses the same login the cost sync uses. |
| UTMCAP | The source's External ID names the parameter holding the gclid | This is where UTMCAP reads it from. |
The last one is the one people miss. A source can be connected, a conversion action chosen, and everything look configured — and nothing is ever sent, because no click carries a gclid UTMCAP can find.
To check: open the clicks log and look at the External ID column. If it is empty on your Google clicks, the upload has nothing to send and has been sending nothing.
#Setting up the upload
On the traffic source, open Integration:
| Field | What it does |
|---|---|
| Send conversions to Google Ads | The switch. Off means nothing is sent. |
| Conversion action | Which action they are counted under. The list fills with your account's import-from-clicks actions once a login is chosen and saved. "Create one for me" makes a suitable one, so you need not touch Google Ads at all. |
| Which conversions | Approved only, or Approved and pending. |
| External ID | The URL parameter holding the gclid — on the source's main settings, not here. |
The Integration tab saves with its own small Save button. The teal Save changes at the bottom of the dialog says "Saved" and does not keep these fields.
#What gets sent, and when
Which conversions. Only the statuses you chose — approved unless you also
asked for pending. A rejected conversion or a chargeback is never uploaded.
This is the quiet advantage over a pixel: a lead that turns out to be junk is
not reported to Google as a sale.
Which clicks. Only those carrying a gclid. Google refuses a click older than its own window, so a conversion that arrives months later is not accepted.
How quickly. Two paths, one result:
- Instantly, as soon as a postback or a goal is recorded — after the response has gone, so the network never waits on Google;
- Hourly, as a safety net, picking up anything the instant send missed, failed on, or never saw, such as conversions imported from a network's API.
Neither can send the same conversion twice. Each claims a conversion before sending it, and a claim only succeeds for one nobody has sent and nobody is sending.
What the upload carries. The gclid, the time, the value and currency, and an order id. The order id is what makes a retry safe — it matches an upload against other uploads, which is why it does nothing at all about a pixel.
#Never both at one conversion action
This is the mistake that costs money rather than data.
If a pixel and the upload point at the same conversion action, Google counts one sale twice:
- once from the browser, when the visitor reaches your thank-you page;
- once from the upload, a few seconds later, against the same click.
Nothing deduplicates them. Smart Bidding then sees twice the conversions, decides the campaign is twice as profitable as it is, and bids up accordingly. The figures look wonderful and the money goes.
The check, in UTMCAP: open the traffic source's Integration tab and read the Conversion action it names. Then open your pixels and check that none of their labels belongs to that same action. Different actions, and both can run.
Choose one per conversion action:
| The upload | The pixel | |
|---|---|---|
| Survives ad blockers and consent refusals | Yes | No |
| Counts a lead that never returns to the page | Yes | No |
| Knows whether the sale was approved or refunded | Yes | No |
| Works with no code on the page | Yes | No |
| Needs a gclid on the click | Yes | No |
| Reports the instant the visitor converts | Within seconds | Immediately |
For affiliate sales and for WhatsApp or phone leads, the upload is the right one and the pixel should be left out. If you want both — an in-browser signal for something else — point them at different conversion actions and mark one as secondary in Google Ads, so only one feeds bidding.
#Testing it, in order
Do these in order. Each one rules out everything above it.
- Wait five minutes after publishing. Pages cache the published tag for that long. Testing sooner tests the old version.
- Trigger the goal for real, in a browser where you have accepted cookies if your site asks.
- Check Live events in UTMCAP. The goal should appear, with a click id. If it does not, the problem is the goal, not Google — see Goals on your own site.
- For a pixel: open DevTools → Network and filter for
google. You should seegtag/js?id=AW-…load and then a request to/collector/pagead/…/conversion. Ifgtag.jsloads and no conversion follows, the label is wrong. - For the upload: check the clicks log for an External ID on that click. No External ID, no upload.
- Look in Google Ads a few hours later, not immediately. Google batches conversions into its own reporting.
The first real conversion is also the first test of the whole chain, so it is worth triggering one yourself rather than waiting to find out.
#When nothing arrives in Google Ads
#If you are using the pixel
- Did you press "Publish to my site"? An unpublished pixel does not exist on the page.
- Is the whole
send_tostring in the Conversion ID box? It must be split at the slash. - Is the conversion action's data source "Manual event"? An action waiting for Google's own tag will never hear from UTMCAP.
- Did the goal fire at all? Check Live events first. A pixel attached to a goal that never fires looks identical to a broken pixel.
- Is the tag loading? If your site gates it behind consent and you clicked Reject, nothing runs — correctly.
#If you are using the upload
- Is the External ID set on the traffic source? Empty means no gclid, which means nothing is sent, silently.
- Is auto-tagging on in Google Ads? Without it the gclid never reaches your landing page.
- Do your clicks show an External ID? Check the clicks log. If the column is empty, the problem is upstream of UTMCAP.
- Is the conversion the right status? Only
approvedis sent unless you chose otherwise. - Is the click too old? Google refuses conversions against clicks beyond its window.
- Is the conversion action one that accepts imports? A web conversion action will not take an upload.
#See also
- Goals on your own site — recording the conversion in the first place
- Postbacks — the same thing from an affiliate network
- Google and Microsoft parallel tracking — getting the click in, which is the other half of this
- The tag — what the one script on your page actually does
Tracking tips by email
Practical tips on tracking, attribution and ad costs, from the people who build UTMCAP.
Unsubscribe any time. Privacy policy