If you are spending money with Google Ads it’s essential to know what results you are getting. Otherwise you won’t know what’s successful and what’s not.
And If you can get the “final” conversion back to Google Ads you are in a much better position than if you can only send an intermediate conversion – like a lead or a click.
You can link Google Ads and GA4 (and you should) and send conversions to GA4 using Measurement Protocol. But the most direct and reliable method is to send the conversions straight to Google Ads using their API.
I’ve used Make.com to connect to the Google offline conversion API – it’s a bit fiddly to do yourself using a few POSTS/GETs etc. (especially oauth authorization).
With Make.com it’s very easy. You need to authorize access to the API and then fill in a few values.

I get the conversion details from a webhook (sent from n8n) and the notification is just for my entertainment. The only parameter that needs special attention in Make is the “Conversion Date Time”. You need to format it as Google wants – in make that’s:
{{formatDate(parseDate(1.json.trans_timestamp; "X"); "YYYY-MM-DD HH:mm:ssZ")}}The parses the date into a UNIX timestamp and then formats that to what Google wants. eg “2023-08-02 19:32:45-05:00” you can see the formatting tokens explained at make: https://www.make.com/en/help/functions/tokens-for-date-time-formatting.
Make sure that this time is a “real” one. If you send two conversions with the same date time with the same click ID then Google doesn’t like it and rejects the conversion.
In order to match the conversion to a click to your site (or something similar with Apple IOS 14+) you’ll need to send a click ID back to Google along with the conversion details.
This ID is normally “gclid”, however there’s now also “wbraid” and “gbraid”. The latter associated with app conversions, which I don’t need in this example.
Getting “gclid”, “wbraid” or “gbraid”
For sending these offline conversions to Google you need to have saved and associated with your visitor these ID values.
If you don’t have these IDs saved then your option is to use “Enhanced Conversions” which uses a anonymized version of the personal information you collect in the conversion to attempt to match to Google’s (vast) set of data. But having an ID is better.
The IDs are available as URL parameters when a visitor comes from Google Ads to your website. Like:
 yoursite.com/landing-page/?gclid=xyz123abc987Saving gclid and other URL Parameters in Google Analytics 4
If you are using Google Tag Manager (GTM) then you can easily setup a variable that gives you access to gclid (and any other URL parameters you want).

You can then add to the GA4 setup to send back to Google Analytics.

To be able to access and see this value in GA4 reports you’ll need to set up an “event scoped” Custom Dimension to match.

Note: Just an example for the Custom Dimension name and Parameter name. I would generally use CDgclid (for the custom dimension in GA4) and CPgclid (for the parameter defined in the GTM tag)
You’ll also be able to access this variable in BigQuery in the GA4 export. (after you link GA4 to BigQuery).
As an alternative I send all this type of information to BigQuery using Jitsu.
Another way to save gclid, etc. is to save them into a hidden field in forms – lead, checkout, etc. Most CRMs (HubSpot, Active Campaign, etc.) and Lead forms have the capability to add these sort of hidden fields.
You’ll need to grab the URL parameter using (most likely) GTM as above (or using some JavaScript code). Then, on the page where your form is, you can use a JavaScript Tag to copy the gclid value into the hidden field. When setup correctly this method can be very effective.
This way the click ID is directly associated with a lead or purchase, which is mainly the conversions we are dealing with.
You also need to be able to connect the conversion to the saved click IDs. This could be via a saved user_id in GA4 or by saving the IDs in the form as I mentioned above.
But when that conversion comes in you have to be able to get the IDs to send to Google.
In my case using an affiliate network I use a unique “subid” per click to the affiliate network. If a conversion occurs I can get this subid along with the conversion.
Then I’m able to query BigQuery using n8n to obtain any gclid, wbraid or gbraid that’s connected to that subid.
I feed to those to Make.com and it sends the offline conversion to Google.
So far it’s been working well.