MANUAL · B2B PAID SEARCH

Google Ads conversion tracking, start to finish

Written for marketers rather than developers. Every click is numbered, and every step carries the reasoning behind it.

Worked example A contact form on a B2B site Tools Google Ads · Tag Manager · GA4 Current as of September 2026

HOW LONG THIS TAKES

Chapter 2 — Decide and check what exists20–30 min
Chapter 3 — Request the website change your part only15 min
Chapter 3 — Waiting on the developer the real variable1 hour – 2 weeks
Chapter 4 — Create the conversion action20–30 min
Chapter 5 — Wire it up in Tag Manager20 min
Chapter 6 — Publish and verify15 min
Chapter 7 — Enhanced conversions optional25 min
Your hands-on time, required path~1.5–2 hours

Then you wait, twice.

A few hours before your first test conversion appears in Google Ads reporting. Do not conclude anything is broken before this.

Two to four weeks before you have enough conversion volume to make decisions from. Do not change bidding strategy, judge keyword performance, or draw conclusions about campaign quality until the account has accumulated real data. Building the tracking is the fast part; earning the right to act on it is not.

These are estimates from a live build, not measured averages. Chapter 3 is the one that varies most, because it depends on somebody else's queue.

CHAPTER 0

Before you begin

What this manual covers, who it is for, and what you need in place before step one.

0.1 What you are trying to achieve

Get Google Ads to record a conversion every time someone completes a meaningful action on your website, so you can see which keywords and ads produced real leads, and so automated bidding has something worth optimizing toward.

Without it you can see clicks and cost, but not results. Every optimization decision becomes a guess, and Smart Bidding has nothing to learn from.

0.2 Why this takes six chapters and not one setting

Google Ads does not watch your website. It sits and waits for a signal to arrive. Everything in this manual exists to build that signal, label it correctly, and deliver it to the right address.

Three consequences follow, and they explain most of the difficulty:

One symptom, many possible causes. That is why each chapter ends with a verification gate, and why Appendix A is organized by symptom rather than by cause.

0.3 Two paths through this manual

Chapters 2 through 6 are the required path. Complete them and you have working conversion tracking.

Chapter 7 adds enhanced conversions, which improves how reliably Google matches your conversions but does not create conversions that would not otherwise exist. It is genuinely optional and it adds a website requirement, so it lives in its own chapter rather than being scattered through the others.

The only place the two paths touch before Chapter 7 is the request in step 3.1, which contains two extra points you include only if you intend to do Chapter 7. Decide now so you request the change once.

0.4 Scope

0.5 Prerequisites

Confirm all four before starting, rather than discovering a gap in Chapter 4.

CHAPTER 1

How the system works

Read this before touching anything. Every chapter that follows assumes you know these terms and how they connect. Skipping it is the main reason people find the steps confusing.

1.1 The three places work happens

You will move between three environments, and knowing which one you are in at any moment removes most of the confusion.

1.2 Google Tag Manager's own furniture

GTM has four concepts of its own that are easy to mix up. Understanding them now makes Chapters 5 and 6 straightforward.

Container

One per website. ID looks like GTM-XXXXXXX.

The container is a box of tracking code that sits on every page of your site. A developer installs it once, and from then on you can add, change, and remove tracking inside it without touching the website's code again.

My dream is for this part to be automated or for AI to be able to install it and QA it.

Everything you build in this manual lives inside your container: the triggers, the variables, the tags. When someone says "is GTM installed," they mean "is the container on the site."

Think of it as a plug socket your developer wires into the wall once. After that, you can plug things in and unplug them yourself without calling an electrician.

Workspace

Your editing area inside the container.

When you add a tag or change a trigger, you are editing a draft. That draft is your workspace. Nothing you do there affects your live website.

This is why a change can look perfectly configured in GTM and do nothing at all on the site. It is still a draft.

Version

A saved snapshot of the container.

When you finish editing, you submit your workspace, which creates a numbered version with a name and description. Versions are a history you can look back through, and roll back to if a change causes a problem.

Write a real description each time. Six months later, "Version 12" tells you nothing and "Added Google Ads conversion tag for contact form" tells you everything.

Publishing

The act of making a version live.

Publishing takes a version and pushes it to your website. Until you publish, your visitors are running whatever was published last, no matter what your workspace contains.

Preview mode runs your draft. The live site runs the last published version. "It worked in Preview but not live" almost always means the container was never published.

1.3 The five moving parts

These are the pieces you will build. Four of them live in GTM; one lives in Google Ads.

Data layer

On your website — built in Chapter 3

A message board that sits on the page. Your website posts short messages to it, and GTM reads them. Neither side needs to know how the other works, which is the point.

Nothing appears there automatically. If your website never posts a message, GTM has nothing to react to. This is the piece most often missing.

Trigger

In GTM, answers when — built in step 5.1

A condition GTM watches for. When the condition is met, anything attached to that trigger runs. A trigger does nothing by itself; it only decides the moment.

Types include: a page loads, a link is clicked, or, as here, a specific named message appears on the data layer.

Variable

In GTM, answers what — built in Chapter 7

A named container holding a value that GTM looks up at the moment a tag fires. You build one whenever a tag needs information that changes from visit to visit.

Variables can read from the data layer, from the page's own HTML, from the URL, or from a value you type in. The required path does not need one; enhanced conversions does.

Tag

In GTM, answers send it, and to whom — built in steps 5.2 and 5.3

The thing that actually sends data somewhere. A tag can send to Google Ads, GA4, LinkedIn, anywhere. The tag type determines the destination and which fields it expects.

Every tag needs at least one trigger, or it never runs.

Conversion action

In Google Ads — built in Chapter 4

The record on Google's side that receives the signal and counts it. It defines what kind of action this is, how many to count per click, and how long after a click you will still credit it.

Creating one produces a Conversion ID and a Conversion Label. Together they are the address the tag sends to. Without both, the signal goes nowhere.

The distinction people get wrong. A trigger is when. A variable is what. A tag is send it. A conversion action is receive it. Four separate objects across two products. Building three of the four gets you nothing at all.

1.4 The whole chain, with chapter references

Every box carries the step that builds it. When a later step is confusing, come back here to see where it sits in the chain.

YOUR WEBSITE Someone fills in your form Your site checks it Is it spam? Are the fields valid? Did the email send? Any "no" = nothing fires You get the lead only if everything passed STEP 3.1 · CH 7 ONLY FIRST: store the email in a hidden element optional, for enhanced conversions STEP 3.1 · REQUIRED THEN: post it to the data layer contact_form_submit If you are doing Chapter 7, order matters. Get it backwards and the conversion still records, but with no email attached. Nothing looks broken. Verified in step 7.3. GOOGLE TAG MANAGER STEP 5.1 TRIGGER: the "when" Waits for that exact message CHAPTER 7 · OPTIONAL VARIABLES: the "what" 7.1 Reads the email out of the hidden element 7.2 Hashes it before it leaves the browser 7.4 Added to the tag as a user_data parameter sets off STEP 5.3 TAG: the "send it" Conversion ID + Label from step 4.7 + user_data if you did Chapter 7 STEP 5.2 A second tag: the Conversion Linker Runs on every page. Remembers which ad brought them, so the lead gets credited to it. STEP 6.1: PUBLISH Nothing above is live until you do this GOOGLE ADS CHAPTER 4 CONVERSION ACTION Receives the signal and counts it Built before the tag, because step 4.7 hands you the ID and Label. GA4: a separate destination The same trigger can feed GA4 too. Different system, different numbers. Do not import GA4 events into Ads. See step 4.1.

Solid arrows are data moving. Dashed grey arrows are one thing reading another. Purple is the optional enhanced conversions path from Chapter 7. A break anywhere gives the same symptom: zero conversions, no error message.

CHAPTER 2 REQUIRED

Decide what counts, and check what exists

Three decisions before any tool is opened: what action you are calling a conversion, whether the plumbing exists, and whether you have a consent obligation.

Where you work: Your website, Tag Manager, GA4Time: 20–30 minutes

2.1 Choose the action worth counting

  1. 2.1.1List every action a visitor can complete on your site. Form submissions, demo requests, trial signups, gated downloads, phone clicks.
  2. 2.1.2For each one, ask: does completing this require genuine intent, or would a casual browser do it by accident?
  3. 2.1.3Select one action to build first.
  4. 2.1.4Complete that action yourself and watch the address bar the whole way through. Write down every domain you pass through, including the page you land on at the end.If any part of it leaves your own domain, read the section below before going further.

WHY

A page view is not a conversion. Neither is a scroll, a session, or a click on your nav. Google will happily let you count any of them, and the moment you do, automated bidding starts optimizing toward people who browse rather than people who buy.

Start with one action rather than three. You can add more later, but the primary versus secondary decision in step 4.4 is what makes multiple actions safe, and you need to understand that first.

Where the action completes matters more than what it is

Step 2.1.4 exists because in B2B the conversion frequently finishes somewhere you do not control. Three versions of this, in increasing order of difficulty:

  • A third-party form host. Gated assets and newsletter signups that hand off to a vendor's page. The submission completes on their domain, so nothing on your site can see it. Either embed the form properly and redirect to a thank-you page you own, or choose a different action.
  • A trial or signup that completes inside the product. This one catches people out most often. Free trials, product-led signups, and self-serve onboarding usually finish inside the app, at something like app.yourcompany.com or on a different domain entirely. That surface is owned by engineering, not marketing, and getting the GTM container installed on it is a different conversation from getting a change to your marketing site.
  • A checkout or booking tool on a separate domain. Same problem, same fix.

There is a useful distinction inside that second case. If your app sits on a subdomain of the same domain as your marketing site, this is not technically cross-domain tracking, and the handoff is handled automatically provided the same measurement setup is installed on both. The barrier is access and cooperation, not configuration.

If the app sits on a genuinely different domain, you have a cross-domain tracking problem as well, which requires explicit configuration so the visitor is not counted as two separate people. Be aware that the standard cross-domain mechanism works by appending an identifier to links a visitor clicks. Signup flows that navigate by form submission or by a server-side redirect can drop that identifier, which means a working cross-domain setup on your marketing pages does not guarantee a working one through your signup flow.

Practical advice. If your primary action lives inside the product, do not start there. Pick a marketing-site action you fully control, get the whole chain working end to end, and open the engineering conversation about the app separately. Learning conversion tracking and negotiating access to the product codebase at the same time is how this stalls for months.

2.2 Confirm the GTM container is live on your site

  1. 2.2.1Go to tagmanager.google.com and sign in.
  2. 2.2.2Find the container for your website. Note its ID at the top right of the workspace, in the form GTM-XXXXXXX.
  3. 2.2.3Click Preview at the top right.
  4. 2.2.4Enter your website's URL and click Connect.
  5. 2.2.5Your site opens in a new window. Confirm a "Tag Assistant Connected" panel appears.If it does not connect, the container is not installed, and that is a prerequisite you must resolve first.

WHY

This confirms the container from section 1.2 is actually on the site. Everything in Chapters 5, 6, and 7 lives inside it, so a container that is not installed makes the rest of the manual unusable.

Preview mode is also the tool you will use to verify every later step, so getting familiar with connecting it now is worth the two minutes.

2.3 Verify your GA4 Measurement ID

  1. 2.3.1Open GA4 and click Admin in the left navigation.
  2. 2.3.2Click Data Streams.
  3. 2.3.3Click the stream for your website.
  4. 2.3.4Read the Measurement ID off the panel. It looks like G-XXXXXXXXXX. Write it down.
  5. 2.3.5Return to GTM, open Tags, and click your Google tag.
  6. 2.3.6Compare the ID in that tag against the one you wrote down. They must match character for character.

WHY

GA4 and Google Ads are separate systems that happen to share a tag manager. GA4 answers "what are people doing on my site." Google Ads answers "which ads produced results." They will not agree on numbers, and they are not supposed to.

Your CRM and BI tool will not agree either

Expect three or four numbers for the same thing, and expect the ad platforms to sit at the top. Directional guidance from published tracking audits puts Google Ads roughly 10 to 30 percent above GA4 on form-fill conversions. Against a CRM the gap is often wider still.

The reasons are structural, not faults:

  • Modeled conversions. Google estimates conversions it cannot directly observe, where consent was declined or cookies were blocked. GA4 models separately, with its own thresholds. Your CRM models nothing.
  • View-through and engaged-view credit. Google Ads can credit conversions where an ad was seen rather than clicked. GA4's default reporting does not.
  • Different attribution rules. Data-driven attribution assigns fractional credit across touchpoints, and those fractions are summed in reporting. Your CRM typically attributes to one source.
  • Different definitions. A form submission is one conversion to Google Ads. To your CRM it may be a duplicate of an existing contact, a rejected submission, spam, or a record that never arrived because an integration failed.

The useful framing: your CRM is the source of truth for how many real leads you got. The ad platforms are the source of truth for which channel produced them. Neither is trying to answer the other's question.

That said, do not assume the CRM is automatically the clean one. Failed integrations, deduplication rules, and lead-routing logic all remove records that were genuine conversions. A large unexplained gap is worth investigating on both sides.

Read the Measurement ID off the Data Streams panel, not from a document or your memory. A wrong Measurement ID produces a site that looks perfectly tagged and reports nothing. It is the most common tracking bug there is, and it can go unnoticed for months. The whole point of the check is that your records may be wrong.

2.4 Establish whether you need consent mode

  1. 2.4.1Open your Google Ads or GA4 geographic report and check whether any traffic comes from the EEA, the UK, or Switzerland.
  2. 2.4.2If yes, confirm whether your site already runs a Google-certified consent management platform.
  3. 2.4.3If it does, open its settings and confirm consent mode is enabled.
  4. 2.4.4If it does not, note this as required work before your tracking will measure correctly in those regions.

WHY

Consent mode passes each visitor's cookie-banner choice to Google, so Google tags adjust their behavior according to what that person agreed to. This is a compliance question, not an optimization one, and it has to be settled before you build rather than after.

To keep using Google tags for measurement, ad personalization, and remarketing, you must collect consent from end users based in the EEA and share those consent signals with Google. Since March 2024, Google has required websites and apps serving visitors in the EEA and UK to use Consent Mode v2 through a Google-certified consent management platform, regardless of where your company is based.

Consent Mode v2 added two signals to the original set: ad_user_data, governing whether data can be sent to Google for advertising measurement, and ad_personalization, governing remarketing. Google requires implementation for users in the EEA, UK, and Switzerland, though implementing globally simplifies your setup and prepares you for regulation elsewhere.

Implementing consent mode is a substantial piece of work in its own right and sits outside this manual. What matters here is that you decide whether you need it before building, not after.

Gate — before Chapter 3: one action chosen, confirmed it completes on your own domain, GTM container confirmed live, GA4 ID verified, consent question settled, and a decision made on whether you are doing Chapter 7.

CHAPTER 3 REQUIRED

Make your website announce the action

The only chapter you cannot complete in a settings screen. Your website has to say "this just happened." It is a small job, but it has to be specified precisely, and it is the step most likely to be done subtly wrong.

Where you work: A request to a developer or an AI coding toolYour time: 15 minTheir turnaround: hours to weeks

3.1 Request the change

  1. 3.1.1Choose a name for the event, in lowercase with underscores. For example contact_form_submit.Write it down. You will type it again in step 5.1.5, and it must match exactly.
  2. 3.1.2Decide whether you are doing Chapter 7. If not, delete points 2 and 4, and the two references to the hidden element in WHAT I NEED BACK FROM YOU.
  3. 3.1.3Copy the request and replace the example event name and the landing page name with yours.
  4. 3.1.4Send it to your developer, or paste it into your AI coding tool.
  5. 3.1.5When the work comes back, collect two things from them: the exact ID used on the hidden element, and their written confirmation on the ordering question.You need the ID in step 7.1.6.

Most developers have wired up a conversion event before and will only need points 2 and 3. The remaining points exist so the three failure modes are written down rather than discovered later.

Request: fire a conversion event when the form submits successfully

WHAT WE ARE SOLVING FOR

Right now we cannot see which ads and keywords produce real leads on [landing page], because nothing tells Google Ads when someone actually submits the form. This adds that signal. Nothing changes for the visitor.

THE REQUEST

Fire a conversion event when the form on [landing page] submits successfully, and not at any other point. Adjust anything below that does not match how the form is built.

  1. I am after one signal: something that fires when the form submits successfully, and not at any other point. The two steps below need to happen in the order listed, for the reason in point 4.
  2. Could you write the submitter's email address into a hidden element on the page, using a stable ID you are happy to keep? Something like <span id="conversion-email" hidden> works. Whichever ID you choose, send it to me. I need to reference it later.
  3. Then push an event to the data layer:
    dataLayer.push({ event: 'contact_form_submit', form_type: '...' })
  4. If it works with how the form is built, the hidden element needs to exist before the push runs. If the push goes first, the email cannot be read, and the tracking captures nothing without any error showing up, which is hard to catch later.
  5. Could you keep the email address and name out of the push object itself. The hidden element is enough, and anything inside the push is readable by every tag in the container.
  6. It would help if the event does not fire on validation failure, spam rejection, or a failed send. Otherwise, the conversion count ends up higher than the number of leads that actually arrived.
  7. Once the event name is set, could we keep it identical going forward, lowercase with underscores. My side matches on the exact string, so a change will break it and I won't have visibility into the issue either.
WHAT I NEED BACK FROM YOU

Which files you changed, the exact element ID you used, and whether the element ends up written before the push. Also anything here that did not fit the setup, or that you would do differently.

WHY

You are asking for two things to happen the moment a submission genuinely succeeds. Not when the button is clicked. Not when validation fails. Only when the lead actually landed.

The reason behind each point sits inside the request itself, so the developer reads it in context rather than taking your word for it. If you trim the request for your own situation, keep the reasons attached to the points you keep. A bare instruction is the one most likely to get implemented in a way that technically complies and silently fails.

If you are using an AI coding tool, ask it to QA itself

AI coding tools are fast, and they are also confidently wrong more often than you would like. The closing section asks the tool to report anything that did not fit, which most will answer honestly when asked directly. Then ask it these three follow-ups, which cost nothing and catch the common errors:

  • "Show me the exact lines where the hidden element is written and where the dataLayer push happens, so I can see the order."
  • "Confirm the event does not fire on validation failure or a failed send, and tell me which code path prevents it."
  • "Confirm no email address or name appears inside the dataLayer push object."

3.2 Verify what you can verify yourself

This step confirms the event exists and is clean. It cannot confirm the ordering requirement from point 4 of the request. That check comes in step 7.3, and if you are not doing Chapter 7 you do not need it.

  1. 3.2.1In GTM, click Preview.
  2. 3.2.2Enter the URL of the page containing your form, and click Connect.
  3. 3.2.3Wait until the Tag Assistant panel says Connected.Do not reload or navigate after connecting. That drops the session and you will have to start again.
  4. 3.2.4Go to your website and fill in the form the way a real visitor would, then submit it.
  5. 3.2.5Switch to the Tag Assistant browser tab, which is a separate tab from your website.
  6. 3.2.6Look down the left-hand column of events for your event name.If it is not there, nothing downstream will work. Stop and go back to step 3.1.
  7. 3.2.7Click that event, then click the Data Layer tab.
  8. 3.2.8Read the payload. Confirm the fields you expected are present and spelled as you expect.
  9. 3.2.9Press Ctrl+F or Cmd+F and search for @. It should return no results.

WHY

Everything in Chapters 4 through 7 assumes this event exists and is visible to GTM. Building a trigger, two tags, and a conversion action on top of an event that never fires is the most expensive mistake available in this process.

The search for @ in 3.2.9 confirms no email address is sitting in the data layer message itself. It should only ever be in the hidden element, where a single variable reads it deliberately, rather than in a message every tag in the container can see.

The one thing you cannot check yourself, and what to ask for

Point 4 of the request asks for the hidden element to be written before the data layer push. Verifying that means reading the page's source code as it executes, which is a developer task, not a marketing one. This manual is not going to pretend otherwise.

You have two ways to close the gap. Do the first now, and the second in Chapter 7 if you are doing it.

Ask for this in writing

Send to whoever made the change

"Can you confirm in writing that the hidden element containing the email is written into the page before the dataLayer.push runs, not after? And can you paste the two lines of code so I have them on record?"

If they answer "after" or "at the same time," or cannot say, the change needs revisiting. If they answer "before" and show you two lines where the element write comes first, you are covered.

The second and stronger check is step 7.3, which observes the result in Tag Assistant rather than trusting a written answer. It requires the variable from step 7.1 to exist, which is why it lives in Chapter 7 rather than here.

Gate — before Chapter 4:

☐ Your event name appears in the Tag Assistant event list
☐ The expected fields are in the payload
☐ Searching for @ returns nothing
☐ If doing Chapter 7: you have written confirmation of the element ordering

CHAPTER 4 REQUIRED

Create the conversion action in Google Ads

This comes before any tag work, because creating it produces the two values GTM needs. It also contains the two settings most likely to quietly damage an account: primary versus secondary, and conversion value.

Where you work: Google Ads → GoalsTime: 20–30 minutes

4.1 Start the conversion action and set the data source

  1. 4.1.1In Google Ads, click Goals in the left navigation.
  2. 4.1.2Click Summary.
  3. 4.1.3Click New conversion action.
  4. 4.1.4Tick Conversions on a website.
  5. 4.1.5Untick Conversions from phone calls, Conversions on an app, and Conversions offline.
  6. 4.1.6Under "Conversions on a website," click Edit data sources.
  7. 4.1.7Tick Google tag.
  8. 4.1.8Untick the Google Analytics property, listed with a long number beside it.This is the step most people miss.
  9. 4.1.9Click Done, then Save and continue.

WHY

While the Analytics property remains attached as a data source, every route to creating a conversion loops you back into a list of GA4 events. That list is usually page_view, scroll, session_start, and user_engagement, none of which are conversions. Importing them makes your conversion count roughly equal your click count, which is worse than having no data at all.

There is a second reason to avoid the GA4 import path. Conversions measured by importing Google Analytics goals are not supported for enhanced conversions. Choosing that route closes off Chapter 7 entirely.

You may see a warning that no Google tag was found. This is expected. Nothing has fired yet because you have not built the tag. Continue past it.

4.2 Choose the category and name it

  1. 4.2.1From the category list, click the one matching your action. For a contact form, click Submit lead form.
  2. 4.2.2Ignore the "Create multiple conversion actions from a linked account" option at the bottom.That is the GA4 import path again.
  3. 4.2.3In the Conversion name field, delete the default text.
  4. 4.2.4Type a descriptive name. For example Contact Form Submit.

WHY

The category groups similar conversions together and helps Google's reporting make sense of what you are measuring. Pick the closest match; if none fits well, choose the next best rather than forcing an inappropriate one.

The name is what you will see in reports. "Contact Form Submit" beats "Conversion 1" when you return to this account in six months, or when someone else inherits it.

4.3 Set the count

  1. 4.3.1Find the Count section.
  2. 4.3.2Click the radio button next to One.

WHY

"Every" counts each submission separately. "One" counts a maximum of one conversion per ad click, no matter how many times the person submits.

For lead generation, One is correct. Somebody who fills in your form twice from the same click is still one lead, and counting them twice inflates your numbers and misleads bidding. "Every" is for ecommerce, where two purchases genuinely are two purchases.

4.4 Set primary or secondary

  1. 4.4.1Find the Action optimization section, usually at the top of the settings.
  2. 4.4.2For your single main action, select Primary action used for bidding optimization.
  3. 4.4.3For any additional, lower-value action you add later, select Secondary action not used for bidding optimization instead.
  4. 4.4.4If you inherit an existing account, go to Goals → Summary and audit every conversion action's setting before changing anything else.

WHY

This is the setting that decides what your budget chases, and it is routinely set wrong.

Primary actions are reported in the "Conversions" column and are used for bidding, as long as the standard goal they belong to is being used for bidding. Secondary actions are for observation only: they appear in the "All conversions" column, but are not used for bidding, even if the goal they sit in is used for bidding.

When you run Target CPA, Maximize Conversions, or Target ROAS, the algorithm needs a single north star. If your campaign optimizes toward a low-intent action, the algorithm will drive more of that behavior, even where it does not equate to revenue. Marking everything as primary means Google treats newsletter signups, contact form views, and ebook downloads with equal importance.

Why this bites harder in B2B

A demo request, a gated PDF download, and a newsletter signup are separated by an order of magnitude in value. Set all three primary and Smart Bidding will chase whichever is cheapest and most abundant, which is almost never the demo request. Your conversion count rises, your pipeline does not, and the reporting looks healthy throughout.

How to decide
  • Primary: the action closest to revenue that still has enough volume for the algorithm to learn from. Usually a demo request or a qualified contact form.
  • Secondary: everything upstream. Content downloads, webinar registrations, pricing page visits. Worth measuring, not worth bidding on.

The exception people are caught by. Conversion actions included in a custom goal are used for both reporting and bidding regardless of whether they are set as primary or secondary. A secondary action placed inside a custom goal will influence bidding.

Be deliberate about keeping only one primary action per goal. Multiple primary conversions can cause double or triple counting for campaign optimization.

4.5 Set the conversion value

  1. 4.5.1Find the Value section.
  2. 4.5.2Click the radio button next to Use the same value for each conversion.Not "use different values for each conversion," which is preselected by default.
  3. 4.5.3A currency dropdown and a value field appear. Leave the currency as your account currency.
  4. 4.5.4Click into the value field and enter your figure. If this is your only conversion action, enter 1 and treat it as a placeholder.

WHY

Most guides tell you which button to click and move on. The choice determines whether value-based bidding is available to you later, so it is worth understanding.

Value-based bidding means strategies that optimize for total conversion value rather than conversion count. Target ROAS and Maximize Conversion Value are the two you will meet. They only work if your conversions carry meaningful, differentiated values.

If every conversion carries the same value, or no value, you are optimizing for volume. Maximize Conversions and Target CPA treat every lead identically. For a business where all leads genuinely are equivalent, that is fine. For most B2B, it is not.

Staggered conversion values

This is how B2B marketers approximate revenue before revenue exists. Your CRM knows which leads became pipeline, but Google Ads does not, and the sales cycle is too long to wait. So you assign each conversion action a value reflecting its historical worth, and let the algorithm optimize for the weighted total rather than the raw count.

A worked example. Suppose historically your demo requests close at 12% with an average contract value of $40,000, your trial signups close at 4%, and your gated downloads close at 0.5%. Expected values are roughly $4,800, $1,600, and $200. You do not need those exact figures in the platform. What matters is the ratio, so you might set demo requests at 100, trials at 33, and downloads at 4. The algorithm now knows a demo is worth roughly twenty-five downloads, and bids accordingly.

Refinements once you have volume: value enterprise-segment leads above commercial, weight by firmographic fit if you can pass that at submission, or move to importing actual closed-won values from your CRM, which is the highest-leverage version and a separate build.

Why not to leave the default. "Use different values for each conversion" expects your tag to pass a value with every conversion. If it does not, Google records everything at the default of 1 unit of currency, and that fabricated figure will appear in your reports and can feed value-based bidding.

The close rates and contract value above are illustrative arithmetic, not benchmarks. Derive your own ratios from your CRM, and note the date you derived them, because close rates move.

4.6 Set the conversion window

  1. 4.6.1Find the Click-through conversion window row and click the chevron on its right to expand it.
  2. 4.6.2Open the dropdown and choose your window.
  3. 4.6.3Leave Engaged-view and View-through windows at their defaults.
  4. 4.6.4Leave Attribution on Data-driven.
  5. 4.6.5Write down the window you chose and the date.

WHY

The click-through conversion window is how long after an ad click you are still willing to credit a conversion to that click.

  • Longer windows suit B2B, where a lead may return weeks after first clicking. Thirty to ninety days is common.
  • Shorter windows suit short tests, where a long window would credit clicks after you stopped spending and give you a misleading read.

Record your choice. A change here shifts your reported numbers with no other cause, and it is a frequent source of "why did the data move" confusion months later.

The attribution model on the same screen controls how credit is divided when someone interacts with several ads before converting. Data-driven is the default and is right for most accounts. Attribution is a large topic in its own right and sits outside this manual, but you should know the setting exists.

4.7 Copy the Conversion ID and Label

  1. 4.7.1Click Done, then Save and continue.
  2. 4.7.2On the finish screen, find the tab strip with three options. Click Use Google Tag Manager.Not "Set up with a Google tag," which is selected by default.
  3. 4.7.3A small table appears with three columns: Conversion name, Conversion label, Conversion ID.
  4. 4.7.4Copy the Conversion ID, a number roughly eleven digits long, into a scratch file.
  5. 4.7.5Copy the Conversion Label, a string of mixed characters, into the same file.Label both clearly. You will paste them in steps 5.3.3 and 5.3.4.

WHY

These two values together are the address the tag sends to. The ID identifies your account; the label identifies which conversion action within it. Without both, the signal goes nowhere and Google Ads reports zero.

This is why Chapter 4 comes before Chapter 5. You cannot configure the tag until this address exists.

4.8 Turn on enhanced conversions optional

Skip this step if you are not doing Chapter 7.

  1. 4.8.1Click Goals in the left navigation, then Settings.
  2. 4.8.2Find the Enhanced conversions row and click the chevron on its right to expand it.
  3. 4.8.3Tick Turn on enhanced conversions.
  4. 4.8.4A method dropdown appears, showing "Google Tag" by default. Click it.
  5. 4.8.5Select Google Tag Manager.
  6. 4.8.6Click Save.

WHY

Enhanced conversions sends a hashed version of the person's email alongside the conversion, so Google can still match it to a signed-in user when cookies fail. It improves match rates; it does not create conversions that would not otherwise exist. The email is hashed in the browser before it leaves, so Google never receives the real address.

This is an account-level setting, not a per-conversion one, which is why there is no toggle on the conversion action screen itself. Setting the method to Google Tag Manager is what tells Google to expect the data from your container rather than from a directly installed tag.

Gate — before Chapter 5: Conversion ID and Label written down, and deliberate choices made on primary versus secondary, count, value, and window.

CHAPTER 5 REQUIRED

Wire it up in Google Tag Manager

Connect the announcement from Chapter 3 to the address from Chapter 4. Three things to build, in this order, because the last one references the first.

Where you work: Google Tag ManagerTime: 20 minutes

5.1 Build the trigger

  1. 5.1.1In GTM, click Triggers in the left navigation.
  2. 5.1.2Click New.
  3. 5.1.3Name it after the action. For example Contact Form Submit.
  4. 5.1.4Click the Trigger Configuration box and select Custom Event.
  5. 5.1.5In the Event name field, type the event name from step 3.1.1 exactly, character for character.contact_form_submit is not the same as Contact Form Submit. Capitalization and underscores matter.
  6. 5.1.6Leave Use regex matching unticked.
  7. 5.1.7Leave All Custom Events selected.
  8. 5.1.8Click Save.

WHY

A Custom Event trigger means "watch the data layer message board for a specific message." When that exact message appears, anything attached to this trigger runs.

The exact-match requirement in 5.1.5 causes more failures than any other single thing in GTM. A trigger that does not match produces no error; the tag simply never fires, and you get zero conversions with nothing to diagnose.

When to use "Some Custom Events" instead

"All Custom Events" means the trigger fires every time that event name appears, anywhere on the site, under any circumstances. That is correct here, because the event name is already specific to one action and your site only fires it in one place.

"Some Custom Events" adds further conditions on top of the event name. You reach for it when the same event name fires in more than one situation and you only want some of them. Common cases:

  • One event name, several forms. If your site fires form_submit for the contact form, the newsletter form, and a support request, you would use Some Custom Events with a condition on a field in the payload, such as form_type equals Contact, so each form can feed a different conversion action.
  • Restricting by page. Firing only when the event happens on a specific landing page, using a condition on Page Path.
  • Filtering out internal or test traffic before the tag fires.
  • Value thresholds. Firing only when a value carried in the payload exceeds some amount.

The general rule: if your event name uniquely identifies the thing you care about, use All Custom Events. If the event name is generic and you need to narrow it, use Some Custom Events and add a condition on a field the event carries. That is also a good argument for naming events specifically in the first place, since a precise name in Chapter 3 saves you conditions here.

5.2 Build the Conversion Linker tag

  1. 5.2.1Click Tags in the left navigation.
  2. 5.2.2Click New.
  3. 5.2.3Name it Conversion Linker.
  4. 5.2.4Click the Tag Configuration box and select Conversion Linker.
  5. 5.2.5Leave all its settings at their defaults.
  6. 5.2.6Click the Triggering box and select All Pages.
  7. 5.2.7Click Save.

WHY

When someone clicks your ad, Google appends an identifier to the landing page URL. The Conversion Linker's job is to capture that identifier and store it, so that when the person converts later, possibly on a different page, the conversion can be credited back to the click that produced it.

It fires on All Pages because you cannot know in advance which page a visitor will land on. Without it, attribution degrades and conversions may go uncredited.

5.3 Build the conversion tag

  1. 5.3.1In Tags, click New. Name it Google Ads - Contact Form Submit.
  2. 5.3.2Click the Tag Configuration box and select Google Ads Conversion Tracking.
  3. 5.3.3Paste your Conversion ID from step 4.7.4 into the Conversion ID field.
  4. 5.3.4Paste your Conversion Label from step 4.7.5 into the Conversion Label field.
  5. 5.3.5Leave Conversion Value, Transaction ID, and Currency Code blank.
  6. 5.3.6Leave the three checkboxes for product-level, new customer, and shipping data unticked.
  7. 5.3.7Scroll to the Triggering box, click it, and select the trigger from step 5.1.
  8. 5.3.8Click Save.

WHY

This is the tag that actually sends the conversion to Google Ads. The ID and Label are the address. The trigger decides the moment.

You may see a warning reading "No Google tag found in this container." Ignore it and do not click "Create tag." It refers to a separate Google Ads base tag you do not need, because the Conversion Linker from step 5.2 covers the linking requirement.

Gate — before Chapter 6: both tags appear in your Tags list, each showing its correct trigger in the Firing Triggers column. The Conversion Linker should show All Pages; the conversion tag should show your custom event trigger.

CHAPTER 6 REQUIRED

Publish and verify

Everything so far exists only in your workspace. Publishing makes it live, and then you test the whole chain end to end on the version real visitors see.

Where you work: GTM, your live site, Google AdsTime: 15 min, then a wait

6.1 Publish the container

  1. 6.1.1In GTM, click Submit at the top right.
  2. 6.1.2In the Version Name field, type something descriptive. For example Contact form conversion tracking.
  3. 6.1.3In Version Description, write what you added and why, in a sentence or two.
  4. 6.1.4Click Continue.
  5. 6.1.5Click Publish.
  6. 6.1.6On the version summary screen that follows, confirm every item you built is listed under Version Changes.Anything missing was never saved.

WHY

This is where the workspace, version, and publishing concepts from section 1.2 become concrete. Submitting turns your draft workspace into a numbered version. Publishing pushes that version to your live website.

Until you publish, your visitors are running whatever was published last, no matter how correct your workspace looks. "It worked in Preview but not live" almost always means this step was skipped.

Write a real description. Six months from now, when a number moves and you are looking for what changed, "Version 12" tells you nothing.

6.2 Test the whole chain

  1. 6.2.1In GTM, click Preview.
  2. 6.2.2Enter your live production URL, not a staging or preview address.
  3. 6.2.3Wait for Tag Assistant to say Connected.
  4. 6.2.4Go to your site and fill in the form the way a real visitor would, then submit it.
  5. 6.2.5Switch to the Tag Assistant tab and click your event in the left-hand list.
  6. 6.2.6Click the Tags tab and confirm both tags appear under Tags Fired.If either is under "Tags Not Fired," the trigger does not match. Go back to step 5.1.5.
  7. 6.2.7Check the real-world outcome actually happened. The lead notification email should have arrived.
  8. 6.2.8Wait several hours, then open Google Ads and go to Goals → Summary.
  9. 6.2.9Confirm your conversion action shows recorded activity.

WHY

Each earlier verification tested a single link. This one tests all of them together, on the version real visitors are running.

Step 6.2.7 matters more than it looks. A conversion that records without the lead actually arriving means you are counting something that did not happen, which is worse than counting nothing.

Always test on your production address. Spam protection services and some tag configurations check the page's hostname against a fixed list, and staging environments that generate a new URL on every deployment will be rejected every time. Chasing those addresses is a losing game.

Gate — conversion tracking is complete when:

☐ Both tags fired on your event
☐ The lead notification actually arrived
☐ The conversion is visible in Google Ads → Goals

CHAPTER 7 OPTIONAL

Add enhanced conversions

Improves how reliably Google matches your conversions when cookies fail. It does not create conversions that would not otherwise exist, which is why it is optional. It also contains the strongest check on the ordering requirement from Chapter 3.

Where you work: Google Ads, then Tag ManagerTime: 25 minutesRequires: points 2 and 4 of the step 3.1 request

7.0 Understand what this does before you build it

Enhanced conversions sends a hashed version of the person's email alongside the conversion, so Google can still match it to a signed-in user when cookies are blocked or consent limits tracking. The email is hashed in the browser before it leaves, so Google never receives the real address.

What it improves: match rates, and therefore the completeness of your reported conversions. What it does not do: create conversions, change what a conversion means, or make bidding smarter on its own.

Skip this chapter if: your conversion volume is very low, in which case the measurable difference will be close to nothing; or your website change from Chapter 3 did not include the hidden element; or your conversion action was created by importing a GA4 event, in which case enhanced conversions is unavailable regardless of what you configure here.

7.1 Build the variable that reads the email

This step assumes you completed step 4.8, which turns enhanced conversions on at account level. If you skipped it, go back and do it first.

  1. 7.1.1In GTM, click Variables in the left navigation.
  2. 7.1.2Scroll to the User-Defined Variables panel and click New.
  3. 7.1.3Name it DOM - Conversion Email.
  4. 7.1.4Click the Variable Configuration box and select DOM Element.
  5. 7.1.5Open the Selection Method dropdown and choose CSS Selector.
  6. 7.1.6In Element Selector, type the ID from step 3.1.5, prefixed with #. For example #conversion-email.
  7. 7.1.7Leave Attribute Name blank, then click Save.

WHY

This variable's job is to reach into the page, find the hidden element your developer created, and read the email out of it.

A CSS selector is an address for a specific piece of a web page. The # means "the element with this ID." Leaving Attribute Name blank tells GTM to read the element's text content rather than one of its HTML attributes, which is what you want here.

7.2 Build the variable that hashes it

  1. 7.2.1In the same User-Defined Variables panel, click New again.
  2. 7.2.2Name it UPD - Contact Form.
  3. 7.2.3Click the Variable Configuration box and select User-Provided Data. You may need to scroll.
  4. 7.2.4Under Type, click the radio button for Manual configuration.Not "Automatic collection."
  5. 7.2.5Click the Email dropdown, which reads "Not set."
  6. 7.2.6Select DOM - Conversion Email from the list.
  7. 7.2.7Leave Phone and everything under Name and Address as "Not set."
  8. 7.2.8Click Save.

WHY

The variable from 7.1 produces a plain email address. This one wraps it in the structure Google expects, and handles the hashing before anything leaves the browser.

Choose Manual over Automatic deliberately. Automatic collection scans the whole page for anything resembling contact details, which can pick up your own address from the footer and send that instead of the visitor's.

7.3 Confirm the variable actually finds the email

This is the check that closes the gap left open in step 3.2. It observes the result rather than trusting a written answer, and it is the only marketer-accessible way to prove the ordering requirement was met.

  1. 7.3.1In GTM, click Preview.
  2. 7.3.2Enter the URL of the page containing your form, and click Connect.
  3. 7.3.3Wait for Tag Assistant to say Connected. Do not reload after connecting.
  4. 7.3.4Fill in the form using a real email address you can recognize, and submit it.
  5. 7.3.5Switch to the Tag Assistant tab and click your event in the left-hand list.
  6. 7.3.6Click the Variables tab, next to Tags, Data Layer, and Consent.
  7. 7.3.7Find DOM - Conversion Email in the list. It is alphabetical, so look under D.
  8. 7.3.8Read its Value column.

HOW TO READ THE RESULT

  • You see the email address you typed. Everything is correct. The element exists, it is written before the event fires, and your selector matches. Continue to step 7.4.
  • You see undefined or an empty value. The variable found nothing. Either the hidden element does not exist, the element is written after the event fires, or the selector in step 7.1.9 does not match the actual ID. Work through those three in that order.
  • You see a different email, such as your own company address. The selector is matching the wrong element on the page. Go back to step 7.1.9 and confirm the ID with whoever made the change.
If the value is undefined, send this

To whoever made the website change

"In GTM Preview, my DOM Element variable pointed at #your-element-id is returning undefined at the moment the your_event_name event fires. Can you confirm the element exists in the DOM at that point, and that it is written before the dataLayer.push rather than after? Paste the two lines so I can see the order."

That message is specific enough that a developer can act on it immediately, and it names the exact symptom rather than asking them to guess what is wrong.

Gate — before step 7.4: the variable resolves to the email you typed, not to undefined.

7.4 Attach it to the conversion tag and republish

  1. 7.4.1In GTM, click Tags and open Google Ads - Contact Form Submit from step 5.3.
  2. 7.4.2Scroll down and click Event Parameters to expand it.
  3. 7.4.3Click Add parameter.
  4. 7.4.4In the parameter name field, type user_data.
  5. 7.4.5Click the block icon beside the Value field and select UPD - Contact Form from step 7.2.
  6. 7.4.6Click Save.
  7. 7.4.7Click Submit, name the version, and click Publish.Same as step 6.1. Nothing you built in this chapter is live until you do this.
  8. 7.4.8Run one final test on the live URL, confirming in the Tags tab that your conversion tag still fires.

WHY

The user_data parameter is what carries the hashed email to Google alongside the conversion. Without it, the two variables you built do nothing.

If you are following an older tutorial. Many describe an "Include user-provided data from your website" checkbox on this tag. That checkbox is no longer available for new setups in Google Tag Manager for individual events; you now add user_data manually to Event Parameters using a custom user data variable. That is what steps 7.4.2 to 7.4.5 do.

Gate — enhanced conversions is complete when: the variable resolves to a real email in Preview, user_data is on the tag, the container is published, and the tag still fires on the live site.

Appendix A — Troubleshooting by symptom

Work down each list in order. Stop at the first thing that is wrong, rather than checking everything at once, or you will not know what fixed it.

"Google Ads shows zero conversions"

  1. Has enough time passed? Conversion reporting is not real-time. Allow several hours before treating this as a fault.
  2. Did you publish the container? The most common cause by a wide margin. Check the Versions tab in GTM. See step 6.1.
  3. Does the event fire on the live site? Run Preview against production, complete the action, and look for your event name. If it is absent, the problem is on your website. Return to Chapter 3.
  4. Does the tag fire on that event? Click the event in Tag Assistant, check the Tags tab. If your tag is under "Tags Not Fired," the trigger does not match. Compare the trigger's event name to the actual event name, character for character. See step 5.1.5.
  5. Are the ID and Label correct? Open the tag and compare both against Google Ads. A single transposed character produces exactly this symptom.
  6. Is the conversion action still active? Check it has not been paused or removed.
  7. Are you looking at the right column? A secondary action reports in "All conversions," not "Conversions." If it is set to secondary, the main column will read zero by design. See step 4.4.

"Conversions are recording, but the number looks too high"

  1. Is Count set to One? Set to Every, a single click producing two submissions records two conversions. See step 4.3.
  2. Is the event firing on failure paths? Submit deliberately invalid data and check whether the event appears. This is step 3.2.10, and it is the check most often skipped.
  3. Is the tag firing more than once per event? Check the tag's firing options are set to once per event, and that you have not attached two triggers that both match.
  4. Do you have duplicate conversion actions? A GA4-imported action and a manually created one measuring the same thing will both count.
  5. Is spam getting through? A public form with no protection produces bot submissions that count as conversions. Check whether the leads are real people.

"Enhanced conversions shows a zero or very low match rate"

  1. Run step 7.3 first. If the DOM variable returns undefined in Preview, that is your answer and everything below is downstream of it.
  2. Does the hidden element exist before the event fires? The most common cause. Use the message in step 7.3 to ask.
  3. Does the CSS selector match? Compare the selector in step 7.1.9 against the actual ID on the page, exactly.
  4. Is the variable attached to the tag? Confirm the user_data event parameter is present and points at the User-Provided Data variable. See step 7.4.5.
  5. Did you republish after adding it? Step 7.4.7. Adding the parameter without publishing changes nothing.
  6. Is enhanced conversions on at account level, with the method set to Google Tag Manager? Both must be true. See step 7.1.4.
  7. Is the conversion action GA4-imported? If so, enhanced conversions is unavailable regardless of configuration. Rebuild it manually per Chapter 4.

"It worked in Preview but not on the live site"

  1. Publish the container. This is almost always the answer. Preview runs your workspace; the live site runs the last published version.
  2. Did you test on the production hostname? Staging URLs can be blocked by spam protection and hostname-restricted tags.
  3. Is a consent banner holding tags back? If consent mode is implemented and the visitor declined, tags may be withheld by design. Test as a consenting visitor.
  4. Are ad blockers interfering? Browser extensions can block Google tags. Test in a clean browser profile.

"Google Ads, GA4, and my CRM all disagree"

  1. Expect disagreement, and expect the ad platforms to be highest. Modeled conversions, view-through credit, and fractional attribution all push Google Ads above GA4, and both above a CRM. See step 2.3.
  2. Compare like with like. Check the conversion window and attribution model on both Google sides before concluding anything is broken.
  3. Check what your CRM is discarding. Deduplication against existing contacts, lead-routing rules, and validation on the receiving end all remove records that were genuine conversions.
  4. Check whether the integration is dropping records. A form submission that never reached the CRM is a real gap, not a measurement difference. Compare raw form-notification emails against CRM records for a single day.
  5. Check for double counting in one system. A GA4 key event and a Google Ads conversion measuring the same action are each correct in their own terms.
  6. Check the GA4 Measurement ID. If GA4 is materially lower across the board, verify it against the Data Streams panel. See step 2.3.

Appendix B — Glossary, in chapter order

Terms appear in the order the manual introduces them, so you can read this alongside the chapters rather than hunting alphabetically.

CHAPTER 1 — TAG MANAGER'S OWN FURNITURE

ContainerGTM
The box of tracking code installed once on every page of your site. Everything you build lives inside it. ID looks like GTM-XXXXXXX.
WorkspaceGTM
Your editing area inside the container. A draft. Changes here do not affect the live site.
VersionGTM
A saved, numbered snapshot of the container. Your history, and what you roll back to.
PublishingGTM
Making a version live on your website. Until you publish, visitors run whatever was published last.

CHAPTER 1 — THE FIVE MOVING PARTS

Data layerYour website
A message board on the page. Your site posts messages to it, GTM reads them. Nothing appears there unless your site puts it there.
TriggerGTM
A condition GTM watches for. Answers when. Does nothing on its own.
VariableGTM
A named container holding a value GTM looks up when it needs it. Answers what.
TagGTM
The thing that sends data somewhere. Answers send it, and to whom. Needs a trigger or it never runs.
Conversion actionGoogle Ads
The record that receives the signal and counts it. Produces the Conversion ID and Label.

CHAPTER 2 — DECIDING AND CHECKING

Cross-domain trackingGA4 / GTM
Configuration that keeps a visitor identified as one person when they move between two different domains you own. Not needed between subdomains of the same domain.
Measurement IDGA4
The identifier that connects your website to a GA4 data stream. Looks like G-XXXXXXXXXX. A wrong one silently reports nothing.
Modeled conversionsGoogle Ads / GA4
Conversions Google estimates rather than directly observes, where consent was declined or cookies blocked. A major reason platform numbers exceed CRM numbers.
Consent modeYour website
Passes each visitor's cookie-banner choice to Google so tags adjust accordingly. Required for EEA, UK, and Swiss traffic.

CHAPTER 4 — THE CONVERSION ACTION

Primary actionGoogle Ads
A conversion action that steers bidding and reports in the "Conversions" column.
Secondary actionGoogle Ads
Measured for observation only, reported in "All conversions," not used for bidding unless placed in a custom goal.
Value-based biddingGoogle Ads
Bidding that optimizes for total conversion value rather than count. Requires differentiated values to be worth using.
Click-through conversion windowGoogle Ads
How long after an ad click you are still willing to credit a conversion to it.
Attribution modelGoogle Ads
How credit is divided when someone interacts with several ads before converting. Data-driven is the default.
Conversion ID and LabelGoogle Ads
The two values that together form the address your tag sends to. Produced when you create a conversion action.

CHAPTER 5 — WIRING IT UP

Custom Event triggerGTM
A trigger that watches the data layer for one specific named message. The event name must match character for character.
Conversion LinkerGTM
A tag that runs on every page and stores which ad click brought a visitor, so a later conversion can be credited to it.

CHAPTER 7 — ENHANCED CONVERSIONS

Enhanced conversionsBoth
Sends a hashed email alongside the conversion so Google can match it more reliably. Improves match rate; does not create conversions.
CSS selectorGTM
An address for a specific piece of a web page. #conversion-email means "the element with the ID conversion-email."
DOM Element variableGTM
A variable that reads a value directly out of the page's HTML using a selector.
User-Provided Data variableGTM
A variable that formats and hashes customer data before it is sent, so the raw value never leaves the browser.
Event parameterGTM
An extra field attached to a tag. user_data is the one that carries the hashed email.

Appendix C — Sources and further reading

Platform behavior changes. Verify anything that does not match your screen. Checked September 2026.

Sources for the claims in this manual

If you are enjoying the GTM work

I highly recommend checking out AnalyticsMania.com and/or lovesdata.com.

Analytics Mania, run by Julius Fedorovicius, is the most thorough free resource on Google Tag Manager specifically, with step-by-step guides that go well past what this manual covers. Loves Data, run by Benjamin Mangold, covers Google Analytics, Tag Manager, and Google Ads together, which is useful once you start caring how the three fit into one measurement picture.

The time estimates at the top are from a live build, not measured averages. The conversion value example in step 4.5 is illustrative arithmetic, not a benchmark; derive your own ratios from your CRM. The platform-versus-CRM percentage range in step 2.3 is directional guidance from published tracking audits, not a universal figure. The troubleshooting entries are drawn from a live implementation rather than from documentation.