Skip to main content

Guide to UTMSimple's Google Offline Conversion Uploader

Google Ads only sees the conversions that happen on your website. But most real revenue happens later and somewhere else — a lead books a call three days after clicking your ad, a sales rep closes the deal a week after that. Google never hears about any of it, so it keeps optimizing your campaigns against form fills instead of customers.

UTMSimple's Google Offline Conversion Uploader closes that loop. When a deal progresses in your CRM, we send that conversion back to Google Ads and tie it to the original ad click — so Smart Bidding learns from what actually made you money.

This guide walks through the full setup.

Before You Start: Prepare Your Google Ads Account

Three things need to be in place on the Google Ads side first. Skipping these is the most common reason a setup doesn't work.

1. Accept the customer data terms. In Google Ads, go to Tools → Conversions → Settings and accept the customer data processing terms. This is required before Google will accept conversions matched on email or phone number.

2. Create your conversion actions. Go to Goals → Conversions → New conversion action → Import → Manual import using API or clicks. Create one for each stage you want to track — for example Lead, Booked Call, and Purchase. Open each one and copy its conversion action ID; you'll need it in Step 2.

3. Create them in the right account. Conversion actions live inside a single Google Ads account. Create them in the same account you're going to connect in Step 1 — one created in a different or parent account won't be visible to your uploads.

You'll also need standard or admin access to the Google Ads account. Read-only access is enough to view reports, but not to upload conversions.

Step 1: Connect Your Google Ads Account

Once you've subscribed to the Google Offline Conversion Uploader, open the product page in your UTMSimple dashboard and click Connect Google Ads. You'll be taken to Google's standard authorization screen — sign in with an account that has access to your Google Ads account and approve the request.

You'll then be asked to choose which Google Ads account the conversions should be uploaded to. Pick the account that contains the conversion actions you created above.

Once connected, you'll be assigned a unique webhook URL. This is your personal endpoint for sending conversions. Treat this URL as a secure credential — anyone who has it can send conversions into your account.

Step 2: Send Your Conversion Events

With the webhook URL in hand, configure your CRM to call it whenever a conversion happens.

Sending from GoHighLevel

In GoHighLevel, build a workflow for each conversion you want to track:

  1. Set the trigger — a form submission for a Lead, a pipeline stage change for a Booked Call or Purchase.
  2. Add a Webhook action, set the method to POST, and paste your UTMSimple webhook URL.
  3. Add the fields below under Custom Data.

Required fields

  • conversion_action_id — the conversion action ID you copied from Google Ads. This is what tells us which conversion you're reporting, so it changes per workflow.
  • A way to match the conversion back to an ad click. You need at least one of:
    • gclid — the Google click ID (or gbraid / wbraid for app and iOS web traffic)
    • email or phone — used for enhanced conversions, which match on hashed customer data instead of a click ID

Optional fields

  • conversion_value — the monetary value of the conversion.
  • currency_code — defaults to USD if you leave it out.
  • event_time — when the conversion happened. Defaults to the time we receive it, which is correct for almost all setups.

What we fill in for you

If you're running the UTMSimple tracking script on your funnel, the click ID is already captured on the contact record and we'll read it automatically — you don't have to map it by hand.

The same goes for identity. Standard GoHighLevel contact fields — email, phone, first name, last name, city, state, postal code, and country — are read straight off the webhook. Passing more of these improves your match rate, and sending both a click ID and customer data gives you the best coverage of all. Anything you do pass explicitly as Custom Data takes priority.

Sending from another CRM or a custom app

If you're not on GoHighLevel, send a POST request to your webhook URL with a JSON body. Put the conversion details inside a customData object:

{
  "customData": {
    "conversion_action_id": "1234567890",
    "conversion_value": "250",
    "currency_code": "USD",
    "gclid": "Cj0KCQjw...",
    "email": "customer@example.com",
    "phone": "+15551234567"
  }
}

We'll accept the event and confirm it's been queued for upload.

Step 3: Understand the Upload Delay

Your conversions won't appear in Google Ads immediately, and that's by design.

Unlike Facebook, Google validates the click ID at the moment you upload. If Google hasn't finished processing the original ad click yet, it rejects the conversion outright rather than holding onto it — and that conversion is lost. Since a lead can submit a form within minutes of clicking your ad, uploading straight away would throw away your fastest-converting leads.

So we hold every conversion for a few hours, then upload it once Google has certainly registered the click. There's nothing for you to configure. Conversions that happen days or weeks after the click, like a pipeline stage change, are unaffected either way.

After we upload, Google itself can take up to another few hours before the conversion shows in your reports.

Step 4: Monitor Your Conversions

Your dashboard shows the most recent conversions we've received, so you can confirm your workflows are firing correctly. Each one shows a status:

  • Pending — received and queued. It'll upload automatically once the delay window has passed.
  • Uploaded — successfully sent to Google Ads.
  • Failed — Google rejected it. The reason is shown alongside the event.

The list refreshes on its own, so you can fire a test conversion from your CRM and watch it arrive.

Troubleshooting

Nothing shows up in the dashboard at all. The webhook isn't reaching us. Check that the workflow actually ran in your CRM, that the method is POST, and that the URL was pasted in full.

Events are rejected as soon as they arrive. Almost always a missing conversion_action_id — it's the one field with no fallback, and it has to be set on every workflow.

Events arrive but are silently dropped. The conversion had no click ID and no email or phone, so there was nothing for Google to match against. Check that your tracking script is capturing click IDs on the funnel, and that the contact has an email or phone number.

Uploads fail mentioning customer data terms. The customer data processing terms haven't been accepted on the Google Ads account. See the Before You Start section.

Uploads fail saying the conversion action wasn't found. The conversion action was created in a different Google Ads account from the one you connected. Recreate it in the connected account and update the ID in your workflow.

Uploads succeed but nothing appears in Google Ads. Give it a few hours — Google's own reporting lag applies after we upload. If it's still missing the next day, the click ID may have been older than the conversion window on that conversion action.


That's the full setup. Once it's running, it runs on its own — every deal that progresses in your CRM finds its way back to Google Ads, and your campaigns start optimizing against real outcomes instead of form fills.

If you have any questions you can reach out to us via our chat support or email us at support@utmsimple.com.