Lead tracking: which ad channel brings the lead
You can tell which ad channel brings the lead only after lead tracking is in place. A click, a form fill, and a job you actually booked are three different events, and a channel gets credit only for the events you connect back to an ad. Google describes enhanced conversions for leads as a way to match hashed form data, and a later offline result, to the ad that started the visit [1]. Microsoft Advertising and ChatGPT ads each publish their own conversion count and their own rule for dividing spend by that count [4][6]. No channel wins in general.
A click report is not a lead report
Google Ads, Microsoft Advertising, and ChatGPT ads will each show clicks and a conversion number once you have told the account what to count. A click is not a request to be contacted. If the form is not tied to the click, the cheapest click can be the channel missing from the lead file.
Lead tracking is that join. You name the lead, record it with each platform's own tools, and divide that account's spend by that count. You get your cost per lead, for your definition, on the dates you chose. You do not get a universal winner.
ChatGPT ads are new. OpenAI's docs describe how to count actions after an ad interaction, and they mark conversion-optimized campaigns as an open beta [5][7].
What enhanced conversions for leads does, and what it requires
Google's setup guide calls enhanced conversions for leads an upgraded version of offline conversion import. It uses user-provided data, such as an email address, to supplement the offline conversions you import [1].
Someone clicks the ad, fills out the form, and the tag sends Google a hashed version of the detail you chose. You keep the lead in your own records. When that person reaches the later step you care about, you import the same hashed detail, plus a Google click identifier if you stored one. Google attributes that offline result to the campaign by matching the hashed data to the lead form data collected on the site and to signed-in customers who engaged with the ad [1]. Hashed first-party data is compared with hashed data from signed-in Google accounts and attributed to ad events [1]. That match is not a forecast that the account will record more leads.
Google tells you to identify the lead forms and pick a field that uniquely identifies the lead and that will also be in the offline import. Email is the field they recommend. A phone number must include a country code. The tag strips symbols and dashes, and collecting both fields is what the guide suggests when you can [1]. First-party data has to be on the form, auto-tagging has to be on, and someone with access has to accept the customer data terms for the account, or for the manager account if a manager tracks conversions [1].
A Google click ID is required if you are not using a tag to collect user-provided data. If you are using the tag, it collects click IDs itself, and Google still tells you to keep importing click IDs you already store [1]. Send at least one of email, phone, or address. The offline record needs a conversion name, a conversion time, and, for lead generation, a qualified lead or converted lead goal [1]. An order ID helps avoid counting the same lead twice, and leaving consent empty can leave conversions that cannot be attributed [1].
If you hash the values yourself, normalize them first: trim spaces, use lowercase, format phone numbers to the E.164 standard, and for gmail.com and googlemail.com addresses remove periods in front of the domain. Then hash with hexadecimal SHA-256 [1]. You can instead send the values unhashed and let Google normalize and hash them [1]. Then do the two setup steps: configure the Google tag, or Google Tag Manager, to capture that data from the form, and import the offline conversions through Google Ads Data Manager or the Google Ads API [1]. Google's diagnostics report is where missing or badly formatted user-provided data shows up [1].
Check the dates on that page before you follow an older tutorial. Starting June 15, 2026, Google says offline conversion import and enhanced conversions for leads uploads move to the Data Manager API and are blocked in the Google Ads API, except for developer tokens allowlisted because they sent a request from January 2026 through June 2026 [1]. Starting in April 2026, enhanced conversions for web and for leads share one on or off setting, and Google Ads accepts user-provided data from website tags, Data Manager, and API connections [1].
Read the cost column that matches the lead
Google's reporting help says cost per conversion is total cost divided by the number in the Conversions column. The math uses eligible interactions, such as clicks or video ad views, and leaves out clicks that cannot be tracked for conversions [2]. That column is your primary actions, and it can include modeled conversions when not every conversion can be recorded directly [2]. View-through conversions, people who saw an ad and later converted without interacting, sit in the view-through column and in All conversions. They are not in cost per conversion [2].
Google says to use a count of One for leads, so a refreshed thank-you page does not turn one click into several conversions. Every is the setting they point to for sales [2]. Primary columns, including cost per conversion, use the time of the click, not the time of the conversion. A click last week and a form this week are both reported on last week, which keeps spend and conversions on the same dates [2]. Pull the other channels on that same date basis.
Microsoft Advertising counts the goal you name
Microsoft Advertising will not invent the lead. Tracking works only if Microsoft can collect data from the site, and that requires the Universal Event Tracking tag on your website [3]. You then create conversion goals. Generating leads is one of the goals the page lists. When someone completes the activity you defined, that completion is the conversion [3]. You can assign a monetary value to that action [3]. The number you type in is your estimate, not cash the ads have produced.
Microsoft's report glossary defines cost per acquisition as total spend divided by the conversions attributable to the ad [4]. A conversion, in that glossary, is a click that results in a sale or another measure of success [4]. View-through conversions are separate: people who converted after seeing the ad without clicking. View-through conversions CPA, under last-click attribution, is spend divided by those view-through conversions [4]. All-conversions cost per acquisition for last-click attribution is total spend divided by the conversions that attribution reports [4]. Against Google's cost per conversion, use the click cost per acquisition, and leave the view-through column out unless your written definition says a view counts. The glossary defines columns. It does not publish a cost per lead every business should expect.
ChatGPT ads: divide spend only after you fix the window
OpenAI's conversion tracking guide says you use it to record actions after people interact with your ads, including lead submissions [5]. A data source receives the events, a conversion event setting names which event counts, and the campaign has to have that setting attached [5]. Sending an event and creating the setting are separate steps [5]. For a lead, the standard event is lead_created. A custom event is allowed when nothing standard fits, but it cannot be the optimization goal on a conversion-optimized campaign [5][7]. The browser tool is the Measurement Pixel and the server tool is the Conversions API. A server-only setup still needs a Pixel ID. If you send the same lead both ways, reuse the event name and the event ID so the duplicate can be dropped [5].
On a conversion-optimized campaign you still pay per valid click, not per conversion. You choose one event at creation, and you cannot change it later [7]. The CPA bid is how the campaign competes. OpenAI charges you when a valid click occurs, and the auction sets the cost per click. Treat that bid as an optimization input, not as the cost per lead [7].
The comparable figure is the one you calculate. In Ads Manager, divide spend by conversions [7]. The reporting docs define cost per action the same way: spend divided by conversions [6]. In Insights, those conversions are goal conversions from clicks plus views, inside the windows you select. If you omit the windows, the default is 30 days after a click and 1 day after an impression [6]. Those windows change cost per action. They do not change impressions, clicks, or spend [6]. Set the view window to 0 to leave view-through out. If one outcome could be credited to both a click and a view, the click takes precedence [6]. The default date is the ad event, and you can switch to the conversion date. Compare an export with Ads Manager on the same date range, time basis, and windows. A null cost is not zero, and OpenAI says to allow at least one day for conversion data to appear [6].
Line the three costs up
None of these pages publishes one cost per lead for every business. Your cost per lead is that channel's spend divided by the leads you defined. Write that lead in one sentence, and use the same sentence in all three accounts. A click is not that sentence.
On Google, make that action a primary conversion, set the count to One if you mean one lead per click, and read cost per conversion on the click date [2]. If the result happens after the form, import it with enhanced conversions for leads as a qualified lead or a converted lead [1]. On Microsoft Advertising, install Universal Event Tracking, define the same goal, and read cost per acquisition for conversions attributable to the ad [3][4]. On ChatGPT ads, send lead_created, attach it, and if the other accounts are click-only, set the view window to 0 before you divide [5][6][7].
Use one date range. A channel with no tracked leads stays blank. These pages do not give you a typical cost to fill that blank. No channel wins in general. A low cost per lead can mean relevant clicks or a looser definition. A high cost can mean waste, or a stricter definition than the account next to it.
We are in Charlotte, and we keep seeing the same gap: spend is on, and the lead file is not tied to the clicks.
Our Paid Ads add-on is month to month. It is not included in the base site plan. It includes side-by-side reporting. Ad spend itself is separate, and the platforms bill that spend on their own. We are not stating a cost per lead here, and we are not saying any channel will pay for itself. The scope is on our paid search page: https://ideaforgestudios.com/internet-marketing-idea-forge-charlotte-nc/search-engine-marketing-sem-adwords/
Practical takeaways
- Do not pick a channel from clicks. Pick it from leads you defined, after lead tracking is recording them.
- On Google, use enhanced conversions for leads when the result happens after the form, count one lead per click, and read cost per conversion by click date [1][2].
- On Microsoft Advertising, install Universal Event Tracking, define the same goal, and use click cost per acquisition unless views are part of your definition [3][4].
- On ChatGPT ads, treat the channel as new. Send the lead event, attach it, and set the click and view windows before you divide spend by conversions [5][6][7].
- Match the dates. Ignore any universal cost per lead. Keep ad spend separate from any management fee.
How we can help
Have more questions or want to get in touch? Visit https://ideaforgestudios.com/contact-us-idea-forge-studios/ , call (980) 322-4500, or email [email protected].
Citations
- Google Ads Help, "Configure the Google tag for enhanced conversions for leads" (2026)
- Google Ads Help, "Understand your conversion tracking data" (2026)
- Microsoft Learn, "What is conversion tracking?" (2026-07-27)
- Microsoft Learn, "What do the report columns mean?" (2026-07-27)
- OpenAI, "Conversion Tracking" (2026)
- OpenAI, "Reporting" (2026)
- OpenAI, "Conversion-Optimized Campaigns" (2026)