Tracking setup guide · Google Ads landing pages

Track every booked call, once, in every tool.

This guide is for the DeskTeam360 team that will build the tracking for the two new Google Ads landing pages. The pages are built as GoHighLevel funnels on open.deskteam360.com. The guide covers how to build them in GHL, plus Google Tag Manager, Google Analytics 4, Google Ads and Microsoft Clarity. Follow the parts in order. Every part ends with a "Done when" check.

From: Rodrigo Andrade (3HRV), rodrigopatria@gmail.com For: DeskTeam360 dev and ops team, Jeremy Kenerson Version: 2, October 16, 2026 (pages built in GoHighLevel)

0Read this first

What we are building

Someone searches on Google, clicks our ad, lands on one of the two pages and books a call in the calendar. When that happens:

Ad clickGoogle adds a gclid and our UTMs to the URL
→
Landing pageGTM loads GA4, the Google Ads tag and Clarity
→
CalendarThe page passes the gclid and UTMs into the GHL calendar
→
Call bookedGHL saves the contact with its source
ToolWhat it records for a booked callWhy
GoHighLevelThe appointment, the contact, the gclid, UTMs, landing page and role. Tags and an opportunity.Source of truth. This is where real calls are counted.
Google AdsDT360 - Booked Call (GHL), sent from a GHL workflow. This is the only conversion Google bids on.Google learns to find people who book, not people who visit.
Google Ads (backup)DT360 - Booked Call (browser), sent from GTM. Set as Secondary.Lets us compare counts in the first weeks. Never bids.
GA4Event booked_call (key event), plus page views, CTA clicks, calendar views and scroll.Shows which page, role and keyword brings bookings.
ClaritySession recordings and heatmaps, with a booked_call event and page tags.Shows where people stop reading or get stuck.

Rules for this setup

  1. Do not change, pause or delete any existing Google Ads conversion action, goal or campaign. Only create the two new actions in Part 4. Rodrigo sets primary and secondary on the old ones.
  2. Only the two landing pages get this setup. Do not add GTM or new tags to the main deskteam360.com site. It already has GA4, Google Ads and Meta tags in its code, and a second copy would count everything twice.
  3. Do not add Meta pixels to the landing pages yet. The main site loads three different pixels and we first need to know which one is the right one.
  4. No passwords, ever. Give Rodrigo access with his email, rodrigopatria@gmail.com. Send API tokens through a one-time secret link (for example 1Password, Bitwarden Send or onetimesecret.com), not in email, WhatsApp or a group chat.
  5. Test bookings use the name TEST DT360 and an email you own with +dt360test in it (example: yourname+dt360test1@deskteam360.com). Cancel them after the test.

Before you start

  1. Pages live in GoHighLevel. Both pages are GHL funnels on open.deskteam360.com. The BI-1 page already exists (funnel DT - Google - Ad1 - Hire, path /dt-ad-hire). Part 8 says exactly how each funnel must be set up. Do not move the pages anywhere else.
  2. Calendar. This guide creates one new GHL calendar for ad traffic (DT360 - Google Ads Call), a copy of "DeskTeam360 Demo Call 1". That keeps referral and website bookings out of the Google Ads signal. If Rodrigo prefers to keep the existing calendar, skip step 6.3 and use the existing calendar ID everywhere.

Order of work

Parts 2 to 6 create the accounts and IDs. Part 7 uses those IDs to build GTM. Part 8 puts GTM on the pages. Part 9 tests. Part 10 sends Rodrigo everything he needs.

PartWhatWhoGives you
2Create the GTM container, give Rodrigo PublishDeskTeam360Container ID GTM-XXXXXXX
3Create the Clarity project, add Rodrigo, create the API tokenDeskTeam360Clarity project ID, API token
4Create 2 Google Ads conversion actions, link GA4DeskTeam360Conversion label for the browser action
5GA4: key event, custom dimensions, filtersDeskTeam360Nothing new (uses G-ZSLFPBZD33)
6GHL: fields, form, calendar, Google Ads link, workflowDeskTeam360New calendar ID
7Build GTM: variables, triggers, tagsDeskTeam360Published container
8Build the pages in GHL funnels: content, calendar, thank-you page, SEO, tracking codeDeskTeam360Live URLs
9Test booking on both pagesDeskTeam360Screenshots
10Send everything to RodrigoDeskTeam360Rodrigo sets the bidding goal and runs the real ad-click test

1The two pages and what they carry

We start Google Search with two ideas, one ad group and one page each. The pages have the same structure on purpose, so the test compares the message, not the layout. On both pages, every button scrolls to the calendar (#book) and the calendar is the only way to convert. There are no outbound links, no other form and no checkout. The page files are set to noindex so they do not compete with the main site in Google search. (The live GHL page lost that setting; Part 8 puts it back.)

Page 1 · BI-4 · Agency owners

"Your agency's pit crew. Everyone your agency needs, in one hire."

File
bi4-white-label-pit-crew.html
URL
open.deskteam360.com/dt-ad-white-label (not built yet)
Who it is for
Agency owners who need white-label web development, design and more, under their own brand.
They searched
white label web development, white label web design, white label wordpress, white label gohighlevel, white label agency services
Main message
Say yes to the next project without a new hire. The same crew on every client. A North American point of contact who talks with you, never your clients.
Proof on page
12+ years, 400+ clients, 1-3 day turnaround, up to 3 tasks at once. Agency quotes: The Tobie Group, First Call Digital, Smash Wave, Sidekick, Duct Tape Marketing, Charisma Ink., Sidecar, Convert on Command.
Offer line
From $1,497/mo, no contracts, 30-day full refund
Button text
"Book your crew call"
Tracking value
lp_variant = bi4_white_label
Page 2 · BI-1 · Entrepreneurs and marketers

"The only hiring call you'll ever need."

File
bi1-hire-a-team.html
URL
open.deskteam360.com/dt-ad-hire?role=... (live in GHL)
Who it is for
Business owners about to hire a designer, developer or video editor.
They searched
hire graphic designer, hire video editor, hire web developer, hire wordpress developer, hire gohighlevel expert, hire clickfunnels expert, hire landing page designer
Main message
A whole team, not one employee. No job posts, no interviews, no training. One 30-minute call.
Proof on page
Same numbers as page 1. One hire vs team table (US median web developer pay $92,650, BLS). Quotes: Women In White Coats, Fit Tribe Gym, FitBodies4Life, Lemonade Legend, Convert on Command.
Offer line
From $1,497/mo, no contracts, 30-day full refund
Button text
"Book your hiring call"
Tracking value
lp_variant = bi1_hire_team, plus role from the URL

Page 2 changes its words by the ?role= in the URL

Each BI-1 ad points to the page with a role value, so the headline chip, subheadline and services grid name the role the person searched. Without role, the page shows the general version. We send role to GA4, Clarity and GHL so we can see which role books calls.

Search intentrole valueFinal URL
hire graphic designergraphic-designerhttps://open.deskteam360.com/dt-ad-hire?role=graphic-designer
hire video editorvideo-editorhttps://open.deskteam360.com/dt-ad-hire?role=video-editor
hire web developerweb-developerhttps://open.deskteam360.com/dt-ad-hire?role=web-developer
hire wordpress developerwordpress-developerhttps://open.deskteam360.com/dt-ad-hire?role=wordpress-developer
hire landing page designerlanding-page-designerhttps://open.deskteam360.com/dt-ad-hire?role=landing-page-designer
hire gohighlevel expertgohighlevel-experthttps://open.deskteam360.com/dt-ad-hire?role=gohighlevel-expert
hire clickfunnels expertclickfunnels-experthttps://open.deskteam360.com/dt-ad-hire?role=clickfunnels-expert

What Google Ads adds to every click

Rodrigo sets this in Google Ads as the account's final URL suffix. You do not need to set it, but use the same parameters when you test, so the test looks like a real ad click.

Final URL suffix (Rodrigo sets this in Google Ads)
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}&utm_term={keyword}&matchtype={matchtype}&device={device}&network={network}

Google also adds gclid (or gbraid / wbraid on some iPhone traffic) when auto-tagging is on. That ID is what lets GHL tell Google Ads "this click booked a call".

2Create the Google Tag Manager container DeskTeam360

We use a new container only for the landing pages. It keeps the ads tracking separate from the main site and from the older container Rodrigo can see today (that one is not installed on any page).

  1. Go to tagmanager.google.com and sign in with the Google account that owns DeskTeam360's Google assets.
  2. Open the existing DeskTeam360 GTM account. If there is none, click Create Account, account name DeskTeam360, country United States.
  3. Click Admin → under Container, click + (Create Container).
  4. Container name: DT360 - Ads Landing Pages. Target platform: Web. Click Create.
  5. GTM shows the install code. Close it for now (you will paste it in Part 8). Write down the container ID at the top right. It looks like GTM-XXXXXXX.
  6. Give Rodrigo access: Admin → Container → User Management → + → Add users. Email rodrigopatria@gmail.com. Container permissions: Publish. Click Invite.
  7. Add Rodrigo's DeskTeam360 reporting email with container permission Read: dt360-reporting@deskteam360-reporting.iam.gserviceaccount.com. It is a read-only robot account that only Rodrigo's DeskTeam360 reports use. It lets him check the container setup automatically and cannot change anything.

3Microsoft Clarity DeskTeam360

Clarity is free. It records how people scroll and click on the page, so we can see where they stop. One note: Clarity cannot see inside the GHL calendar, because the calendar is a separate site inside an iframe. It sees the page around it, and we send it a booked_call event so we can filter the recordings of people who booked.

3.1 Create the project

  1. Go to clarity.microsoft.com and sign in with a company account (Google or Microsoft). Use a DeskTeam360 account, not a personal one, so the project stays with the company.
  2. Click + New project. Name: DeskTeam360 - Ads Landing Pages. Website URL: https://open.deskteam360.com. Click Add new project.
  3. On the install screen, choose Install manually. Do not paste the code in the page. We install it with GTM in Part 7.
  4. Copy the project ID. It is the short code at the end of the script, in "script", "abcd1234ef". You can also find it later in Settings → Overview.

3.2 Give Rodrigo access

  1. Open the project → Settings → Team → Add team member.
  2. Email rodrigopatria@gmail.com, role Admin. Click Add.

3.3 Settings

  1. Settings → Setup → Google Analytics integration → Get started → connect GA4 property DeskTeam360.com - GA4 (property ID 398633583). This adds a Clarity recording link to GA4 data.
  2. Settings → Masking → keep Balanced (the default).
  3. Settings → IP blocking → add the public IP address(es) of the DeskTeam360 office so the team's own visits are not recorded. (Find the office IP by searching "what is my IP" on Google from an office computer.)

3.4 Create the API token for Rodrigo's reports

  1. Settings → Data Export → Generate new API token.
  2. Token name: 3HRV reporting. Click Generate.
  3. Copy the token right away. Clarity shows it only once.
  4. Send it to Rodrigo with a one-time secret link (see the rules in Part 0). Do not put it in the Part 10 form or in an email.

4Google Ads conversion actions DeskTeam360

Account: 546-353-3699. Google tag already used by DeskTeam360: AW-799375519. You will create two new actions. Leave every existing action exactly as it is.

Why only one of the two will bid

In 2023 the account told Google that page views were conversions, so Google found cheap visitors, not buyers. This time Google bids on one thing only: a real booked call recorded by GHL. The browser action is a backup we use to compare counts, so it must be Secondary. If both were Primary, every call would count twice.

4.1 Check auto-tagging

  1. In Google Ads, open Admin → Account settings → Auto-tagging.
  2. It must say Tag the URL that people click through from my ad (on). If it is off, do not change it; tell Rodrigo.

4.2 Action 1: DT360 - Booked Call (GHL) (the one Google bids on)

  1. Goals → Conversions → Summary → + Create conversion action.
  2. Choose Import → CRMs, files or other data sources → Track conversions from clicks. If Google asks for a data source, choose the option to upload from a file or API, or skip it. GHL will send the data.
  3. Settings:
    Goal and action optimizationBook appointment category · leave it as the Google default for now (Rodrigo makes it the only Primary)
    Conversion nameDT360 - Booked Call (GHL) (exact text, GHL looks for this name)
    ValueDon't use a value
    CountOne
    Click-through conversion window30 days
    AttributionData-driven
  4. Click Save and continue → Done.

4.3 Action 2: DT360 - Booked Call (browser) (backup, never bids)

  1. Goals → Conversions → Summary → + Create conversion action → Website.
  2. Enter deskteam360.com and click Scan. Then choose Add a conversion action manually.
  3. Settings:
    Goal categoryBook appointment
    Conversion nameDT360 - Booked Call (browser)
    Action optimizationSecondary action (very important)
    ValueDon't use a value
    CountOne
    Click-through window30 days
    Engaged-view and view-through windowsLeave default
    AttributionData-driven
  4. Click Done → Save and continue.
  5. On the tag setup screen, choose Use Google Tag Manager. Copy the two values Google shows:
    • Conversion ID: should be 799375519. If it is a different number, tell Rodrigo.
    • Conversion label: a code like AbC-D_efG-h12_34-567. You need it in Part 7.

4.4 Link Google Ads and GA4

Today GA4 is linked to three other Google Ads accounts but not to 546-353-3699. Add this link (do not remove the others).

  1. In GA4 (property 398633583): Admin → Product links → Google Ads links → Link.
  2. Choose Google Ads accounts → tick 546-353-3699 → Confirm → Next.
  3. Keep Enable personalized advertising on and Enable auto-tagging on. Click Next → Submit.
  4. Do not import GA4 events into Google Ads as conversions. That would count booked calls a third time.

Rodrigo does this part (not the team)

Make DT360 - Booked Call (GHL) the only Primary action in the goal the campaigns use, move the old page-view actions to Secondary, and set the final URL suffix. These change how Google bids, so Rodrigo does them himself after Part 9.

5Google Analytics 4 DeskTeam360

Use the existing property DeskTeam360.com - GA4 (property ID 398633583, measurement ID G-ZSLFPBZD33). Do not create a new property. Pages on open.deskteam360.com share the main domain, so visitors are tracked as one user across the main site and the pages.

5.1 Data stream settings

  1. Admin → Data collection and modification → Data streams → open the web stream with G-ZSLFPBZD33.
  2. Enhanced measurement: on (page views, scrolls, outbound clicks, site search, video, file downloads).
  3. Configure tag settings → Show more → List unwanted referrals → add two conditions, "Referral domain contains": leadconnectorhq.com and msgsndr.com. Save. (Stops the calendar from showing up as a traffic source.)
  4. Configure tag settings → Show more → Define internal traffic → Create → rule name DT360 office, traffic_type value internal, IP address equals the office IP(s). Save.

5.2 Filter and retention

  1. Admin → Data collection and modification → Data filters → open Internal Traffic → set it to Testing for now. Rodrigo will switch it to Active after Part 9, so your test booking is still visible.
  2. Admin → Data collection and modification → Data retention → Event data retention 14 months → Save.

5.3 Key event: booked_call

  1. Admin → Data display → Key events → New key event.
  2. Name: booked_call (lowercase, exact). Save. Counting method: Once per session.

The main site code also has an event called booked_call. That is fine. Reports separate the two by hostname and by lp_variant.

5.4 Custom dimensions

Admin → Data display → Custom definitions → Create custom dimension. Create these four, all with scope Event:

Dimension nameScopeEvent parameterExample values
LP variantEventlp_variantbi4_white_label, bi1_hire_team
RoleEventrolegraphic-designer, none
CTA textEventcta_textBook your crew call
Booking methodEventbooking_methodghl_iframe_message

6GoHighLevel DeskTeam360

GHL is where a booked call really lives. The goal of this part: every booking from the ads carries its source (gclid, UTMs, page, role) and GHL tells Google Ads about it.

6.1 Custom fields

Settings → Custom Fields → + Add Field → type Single Line, object Contact. Put them in a new folder called Ads Attribution.

Field nameUnique key GHL createsFilled from URL parameter
gclidcontact.gclidgclid
gbraidcontact.gbraidgbraid
wbraidcontact.wbraidwbraid
UTM Sourcecontact.utm_sourceutm_source
UTM Mediumcontact.utm_mediumutm_medium
UTM Campaigncontact.utm_campaignutm_campaign
UTM Termcontact.utm_termutm_term
UTM Contentcontact.utm_contentutm_content
Landing Pagecontact.landing_pagelanding_page
Rolecontact.rolerole

GHL makes the key from the field name. If the key it shows is different (for example contact.utm_source_1), write down the real key and send it in Part 10.

6.2 Booking form with hidden fields

  1. Sites → Forms → Builder. Open the form that "DeskTeam360 Demo Call 1" uses today (check in its calendar settings) and click Duplicate. If it uses the default calendar form, create a new form with the same visible fields (first name, last name, email, phone, plus any questions it asks today).
  2. Name the copy DT360 - Ads Booking Form. Do not add new visible questions. The page copy and the call process stay as they are.
  3. Drag the 10 custom fields from 6.1 into the form. For each one, open its settings: tick Hidden and set Query Key to the URL parameter in the table (for example field "UTM Source", query key utm_source).
  4. Save the form.

6.3 New calendar for ad traffic

Skip this step if Rodrigo decided to keep "DeskTeam360 Demo Call 1" (see Part 0). In that case, attach the form from 6.2 to that calendar instead.

  1. Calendars → Calendar Settings → find DeskTeam360 Demo Call 1 → three dots → Clone.
  2. Rename the clone DT360 - Google Ads Call. Keep the same team members, availability, duration (30 minutes), reminders and confirmation emails.
  3. In the calendar's Forms settings, choose custom form → DT360 - Ads Booking Form.
  4. In Confirmation, choose Redirect to URL: https://open.deskteam360.com/dt-ad-booked (the thank-you page from Part 8.5). If there is an option to add contact or appointment details to the URL, leave it off: names and emails must never go into a URL, because GA4 and Clarity would record them. This redirect is why the ads calendar must be separate from the main site's calendar.
  5. Save. Open Share / embed code and copy the calendar widget ID. It is the code after /widget/booking/ in the embed URL. Today's calendar is BvMnlvEIoMKwnPB3eQjZ; the new one will be different.

6.4 Connect Google Ads to GHL

  1. Settings → Integrations → Google → Connect. Sign in with a Google account that has Admin or Standard access to Google Ads 546-353-3699.
  2. When GHL asks which Google Ads account to use, choose 546-353-3699. If GHL only connects through Ad Manager, use Marketing → Ad Manager → Google and pick the same account.

6.5 Workflow: DT360 - Google Ads Booked Call

Automation → Workflows → + Create Workflow → Start from scratch. Name it DT360 - Google Ads Booked Call. Build it like this:

#BlockSettings
TriggerCustomer Booked AppointmentFilter: Calendar is DT360 - Google Ads Call. (If you kept the old calendar, also add a filter Contact field UTM Source is google.)
1Add Contact Tagacq:google-ads and acq-stage:booked
2If / Else on Landing PageBranch "BI-4": contact.landing_page contains bi4 → Add tag acq-lp:bi4. Branch "BI-1": contains bi1 → Add tag acq-lp:bi1. None branch: Add tag acq-lp:unknown.
3Create / Update OpportunityPipeline Sales Pipeline, stage Appointment Scheduled, opportunity name {{contact.name}} - Google Ads, source Google Ads. Allow only one opportunity per contact in this pipeline.
4If / Else on gclidBranch "Has click ID": contact.gclid is not empty. None branch: end (nothing to send).
5Google Ads conversion (in the "Has click ID" branch)GHL lists this action as Add to Google Adwords or Google Ads: offline conversion, depending on the version. Ad account 546-353-3699. Conversion action DT360 - Booked Call (GHL). Click ID: {{contact.gclid}} if the action asks for it. Conversion time: the appointment's booking time (the default).

Save, then Publish the workflow (toggle at the top right). Under Settings of the workflow, turn Allow re-entry off.

About gbraid and wbraid

Some iPhone clicks come with gbraid or wbraid instead of gclid. If GHL's Google Ads action has a field for them, add a second branch that sends those. If it does not, leave it: we save them on the contact and Rodrigo can upload those few by file.

7Build the GTM container DeskTeam360

Open the container DT360 - Ads Landing Pages. Create everything below with the exact names, then publish once at the end. You need: the Clarity project ID (Part 3) and the browser conversion label (Part 4.3).

7.1 Built-in variables

Variables → Built-In Variables → Configure → tick: Page URL, Page Path, Page Hostname, Referrer, Event, Click Element, Click Classes, Click ID, Click Text, Click URL, Scroll Depth Threshold.

7.2 User-defined variables

Variables → User-Defined Variables → New.

NameTypeSettings
const - GA4 IDConstantG-ZSLFPBZD33
const - Ads IDConstantAW-799375519
const - Ads Conversion IDConstant799375519
const - Ads Label Booked CallConstantThe label from Part 4.3
const - Clarity IDConstantThe Clarity project ID from Part 3
DLV - lp_variantData Layer VariableName lp_variant, version 2, default value unknown
DLV - roleData Layer VariableName role, version 2, default value none
DLV - booking_methodData Layer VariableName booking_method, version 2
URL - gclidURLComponent type Query, query key gclid

7.3 Triggers

Triggers → New.

NameTypeSettings
Init - All PagesInitializationAll Initialization Events
PV - All PagesPage ViewAll Page Views
DOM - All PagesPage View → DOM ReadyAll DOM Ready Events
CE - booked_callCustom EventEvent name booked_call
Click - CTA to calendarClick → Just LinksSome Link Clicks: Click URL contains #book
Click - See plansClick → Just LinksSome Link Clicks: Click URL contains #plans
Vis - Calendar sectionElement VisibilitySelection method ID, element ID book. When to fire: Once per page. Minimum percent visible: 30. Tick Observe DOM changes.
Scroll - 25 50 75 90Scroll DepthVertical, percentages 25,50,75,90, enable on Window Load

7.4 Tags

Tags → New. Create in this order.

Tag 1: Google Tag - GA4

Tag 2: Google Tag - Google Ads

Tag 3: Conversion Linker

Tag 4: Clarity - Base

Custom HTML: Clarity - Base
<script type="text/javascript">
  (function(c,l,a,r,i,t,y){
    c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
    t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
    y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
  })(window, document, "clarity", "script", "{{const - Clarity ID}}");
  window.clarity("set", "lp_variant", "{{DLV - lp_variant}}");
  window.clarity("set", "role", "{{DLV - role}}");
  window.clarity("set", "has_gclid", /[?&](gclid|gbraid|wbraid)=/.test(location.search) ? "yes" : "no");
</script>

Tag 5: GHL - Message Logger (debug)

Custom HTML: GHL - Message Logger (debug)
<script>
(function () {
  if (!/[?&]dt_debug=1/.test(location.search)) { return; }
  var GHL_ORIGIN = /(leadconnectorhq\.com|msgsndr\.com|gohighlevel\.com|deskteam360\.com)$/i;
  window.addEventListener('message', function (e) {
    var host = '';
    try { host = new URL(e.origin).hostname; } catch (err) { return; }
    if (GHL_ORIGIN.test(host)) { console.log('[DT360 GHL message]', host, e.data); }
  });
})();
</script>

Tag 6: GA4 - booked_call

Tag 7: Ads - Booked Call (browser)

Tag 8: Clarity - booked_call

Custom HTML: Clarity - booked_call
<script>
  if (window.clarity) {
    window.clarity("event", "booked_call");
    window.clarity("upgrade", "booked_call");
  }
</script>

Tag 9: GA4 - calendar_view

Tag 10: GA4 - cta_click

Tag 11: GA4 - scroll_depth

7.5 Publish

  1. Click Preview only after Part 8 (the container must be on the page). Then test as in Part 9.
  2. When the test passes: Submit → Version name v1 - Ads LP tracking → description "GA4, Ads, Clarity, GHL booking listener" → Publish.

8Build the pages in GoHighLevel DeskTeam360

Each page is its own GHL funnel on open.deskteam360.com. Pasting our HTML into Custom Code elements is fine for the page content: we checked the live BI-1 page and the design, the phone layout and the ?role= wording all work. What must be done the GHL way is everything around the content: the calendar, the thank-you page, the page settings and the tracking code.

What we found on the live BI-1 page (October 16)

  • Wrong page title and description. The browser tab and link previews say "Hire Expert PPC Specialist | Paid Ads Manager for Hire" and talk about Google and Meta ads management. They look copied from another funnel. Fix in 8.4.
  • The page can be indexed by Google (index, follow). It must be noindex. Fix in 8.4.
  • No tracking at all. No GA4, no Google Ads tag, no GTM. The funnel's tracking code is empty. Fix in 8.6.
  • The calendar is the main site's calendar (BvMnlvEIoMKwnPB3eQjZ), pasted as code. Fix in 8.3.
  • Content, design, phone layout and the ?role= switch work. Keep them.

8.1 Funnels and paths

Funnel nameStep and pathWhat it isStatus
DT - Google - Ad1 - Hire1 step: /dt-ad-hireBI-1 pageExists. Fix as below.
DT - Google - Ad4 - White Label1 step: /dt-ad-white-labelBI-4 pageCreate. Build it the same way as Ad1.
DT - Google - Booked1 step: /dt-ad-bookedThank-you page for bothCreate (8.5).

All three on the domain open.deskteam360.com (Funnel → Settings → Domain). To create the BI-4 funnel, the fastest way is Sites → Funnels → DT - Google - Ad1 - Hire → three dots → Clone, rename it, change the path, then replace the content blocks with the BI-4 HTML.

8.2 Page content: Custom Code is OK, with these rules

  1. Keep the block that holds the page's <style> CSS as the first block on the page. If it is deleted or moved below, the whole page loses its design.
  2. Keep the BI-1 block with the ?role= script. It changes the headline chip, subheadline and services by role. After any edit, open /dt-ad-hire?role=video-editor and check the chip says "Looking to hire a video editor?".
  3. Text changes are made in the HTML of the block. Do not add GHL headline or button elements between the code blocks; they will not match the design.
  4. Do not remove id="book" from the calendar section heading. Every "Book your ... call" button scrolls to it.
  5. Check the page on a phone after every change (GHL editor → mobile view, and on a real phone).

8.3 Calendar: use GHL's own Calendar element

  1. In the page editor, find the Custom Code block that contains the calendar <iframe ... widget/booking/BvMnlvEIoMKwnPB3eQjZ ...> and the form_embed.js script. Delete only the iframe and that script from the block. Keep the section heading and text above it, with id="book".
  2. Right below that block, add GHL's native element: + Add Element → Form → Calendar. Choose the calendar DT360 - Google Ads Call (Part 6.3).
  3. Set the element's width to full and background to match the section (navy #11104C), so it looks like the rest of the page.
  4. Do the same on the BI-4 page.

Why the native element and not the pasted iframe

On a GHL page, GHL's own Calendar element reads the ad's URL parameters (gclid, UTMs, role) directly into the contact and the hidden form fields, records the funnel as the contact's source, and follows the calendar's redirect to the thank-you page in the full browser tab. A pasted iframe treats the page as an outside website, so those things depend on extra scripts. If the test in Part 9 shows the hidden fields stay empty with the native element, tell Rodrigo: the fallback is the pasted iframe with the script in Part 8.7.

8.4 Page settings: title, description, noindex

Open each funnel step → gear icon / Page settings → SEO meta data. Replace what is there with:

PageTitleDescription
Ad1 HireHire a Designer, Developer or Video Editor in One Call | DeskTeam360Hire graphic designers, web developers, video editors and tech VAs in one 30-minute call. A whole managed team from $1,497/mo. No contracts. 30-day full refund.
Ad4 White LabelWhite-Label Web Development for Agencies | DeskTeam360White-label web development and design for agencies. Your agency's pit crew: developers, designers, tech VAs and video under your brand. No contracts. 30-day full refund.
BookedYou're booked | DeskTeam360(leave empty)

Remove any social image or keywords left over from the old PPC page. The noindex tag goes in the tracking code (8.6), because it must be in the page head.

8.5 Thank-you page: /dt-ad-booked

This page is where the booked call is counted. The calendar sends people here after they book (Part 6.3), and the code in 8.6 tells GTM "booked_call" once.

  1. Create the funnel DT - Google - Booked with one step, path /dt-ad-booked, domain open.deskteam360.com.
  2. Build it with normal GHL elements, same colors as the landing pages (navy #11104C, pink #e4277a). Content:
    • Headline: You're booked.
    • Text: Check your email for the calendar invite. On the call we'll look at what's on your list and show you who would work on it. Bring your backlog: the pages, funnels, designs or videos you need done.
    • No buttons, no forms, no other calendar. Do not show the person's name or email on the page.
  3. Put this funnel's tracking code from 8.6 (the "thank-you" version).

8.6 Tracking code for each funnel

In each funnel: Settings → Tracking Code. There are two boxes, Head and Body. Replace GTM-XXXXXXX with the container ID from Part 2. The only difference between the landing funnels is the LP value.

Head tracking code: DT - Google - Ad1 - Hire (for Ad4 change LP to 'bi4_white_label')
<meta name="robots" content="noindex">
<script>
(function () {
  var LP = 'bi1_hire_team';   // Ad4 funnel: 'bi4_white_label'
  var role = (new URLSearchParams(location.search).get('role') || 'none').toLowerCase();
  try { sessionStorage.setItem('dt360_lp', LP); sessionStorage.setItem('dt360_role', role); } catch (e) {}
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({ lp_variant: LP, role: role, page_type: 'ads_landing_page' });
})();
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
<!-- End Google Tag Manager -->
Head tracking code: DT - Google - Booked (thank-you page)
<meta name="robots" content="noindex">
<script>
(function () {
  var lp = 'unknown', role = 'none', seen = false;
  try {
    lp = sessionStorage.getItem('dt360_lp') || 'unknown';
    role = sessionStorage.getItem('dt360_role') || 'none';
    seen = sessionStorage.getItem('dt360_booked') === '1';
    sessionStorage.setItem('dt360_booked', '1');
  } catch (e) {}
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({ lp_variant: lp, role: role, page_type: 'ads_thank_you' });
  // Count the booking once per browser session, even if the page is refreshed.
  if (!seen) { window.dataLayer.push({ event: 'booked_call', booking_method: 'thank_you_page' }); }
})();
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
<!-- End Google Tag Manager -->
Body tracking code: all three funnels
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

Do not paste GA4, Google Ads, Clarity or Meta codes directly into GHL. They all load through GTM, so each one loads once.

8.7 Fallback only: pasted calendar with the click-data script

Use this only if Rodrigo asks for it after the Part 9 test (when the native Calendar element does not fill the hidden fields). It replaces the native element with the pasted iframe and passes the ad data into it, keeping it for 90 days for people who come back later. Replace NEW_CALENDAR_ID in three places and set LP per page.

Custom Code block: calendar iframe + click-data script
<iframe data-src="https://api.leadconnectorhq.com/widget/booking/NEW_CALENDAR_ID" style="width:100%;border:none;overflow:hidden;" scrolling="no" id="NEW_CALENDAR_ID_dt360" title="Book your call" allow="payment"></iframe>
<script>
(function () {
  var LP = 'bi1_hire_team';               // Ad4 page: 'bi4_white_label'
  var FRAME_ID = 'NEW_CALENDAR_ID_dt360';
  var KEYS = ['gclid','gbraid','wbraid','utm_source','utm_medium','utm_campaign','utm_term','utm_content','role'];
  var STORE = 'dt360_attr';
  var DAYS = 90;

  var frame = document.getElementById(FRAME_ID);
  if (!frame) { return; }
  var base = frame.getAttribute('data-src') || frame.getAttribute('src');
  var now = new URLSearchParams(location.search);
  var saved = {};
  try { saved = JSON.parse(localStorage.getItem(STORE) || '{}'); } catch (e) { saved = {}; }

  // A new ad click replaces the saved values. Without one, use saved values younger than 90 days.
  var fresh = KEYS.some(function (k) { return now.get(k); });
  var data = {};
  if (fresh) {
    KEYS.forEach(function (k) { if (now.get(k)) { data[k] = now.get(k); } });
    data._t = Date.now();
    try { localStorage.setItem(STORE, JSON.stringify(data)); } catch (e) {}
  } else if (saved._t && Date.now() - saved._t < DAYS * 864e5) {
    data = saved;
  }

  var out = new URLSearchParams();
  KEYS.forEach(function (k) { if (data[k]) { out.set(k, data[k]); } });
  out.set('landing_page', LP);
  frame.setAttribute('src', base + (base.indexOf('?') > -1 ? '&' : '?') + out.toString());
})();
</script>
<script src="https://link.msgsndr.com/js/form_embed.js" type="text/javascript"></script>

8.8 Publish

  1. Save and publish all three funnels.
  2. Open each URL in a private window. Check: the tab title is the new one, the calendar shows times, and on BI-1 ?role=video-editor changes the chip.
  3. Right-click → View page source → search for noindex and GTM-. Both must be there.

9Test everything DeskTeam360

Do this once per page. It takes about 20 minutes per page. Take a screenshot at each check; you send them in Part 10.

9.1 Test URLs

Replace the date in gclid with today's date so each test is unique.

Page 1 test URL
https://open.deskteam360.com/dt-ad-white-label?dt_debug=1&gclid=TEST_DT360_BI4_20261016&utm_source=google&utm_medium=cpc&utm_campaign=test&utm_term=white%20label%20web%20development&utm_content=test
Page 2 test URL
https://open.deskteam360.com/dt-ad-hire?role=video-editor&dt_debug=1&gclid=TEST_DT360_BI1_20261016&utm_source=google&utm_medium=cpc&utm_campaign=test&utm_term=hire%20video%20editor&utm_content=test

9.2 Run the test

  1. In GTM, click Preview, paste the test URL, click Connect. A new tab opens with the page. Keep Tag Assistant connected when the browser moves to the thank-you page.
  2. In that tab, open the browser console (F12 on Windows, Cmd + Option + J on Mac, in Chrome).
  3. In GA4, open Admin → Data display → DebugView in another tab.
  4. On the page: scroll to the bottom, click one "Book your ... call" button, then book a call in the calendar. Name TEST DT360, your +dt360test email, a real phone if the form needs one.
  5. Check each row below.
  6. Cancel the test appointment in GHL afterwards, and add the tag test to the contact.
#Where to lookWhat you should seeIf not
1GTM Tag Assistant, first eventFired: Google Tag - GA4, Google Tag - Google Ads, Conversion Linker, Clarity - BaseCheck the funnel tracking code in Part 8.6 and the GTM ID
2Tag Assistant, Variables tabDLV - lp_variant = the page value; on page 2, DLV - role = video-editorThe data layer script must be above the GTM code
3Tag Assistant after scrollingGA4 - calendar_view fired once; GA4 - scroll_depth fired; after the button click, GA4 - cta_clickCheck the trigger settings in 7.3
4The browser after bookingThe whole tab goes to open.deskteam360.com/dt-ad-booked ("You're booked."). The URL has no name or email in itIf the thank-you page opens inside the calendar box, or nothing happens: copy the [DT360 GHL message] lines from the console and send them to Rodrigo
5Tag Assistant after bookingOn the thank-you page: event booked_call appears once, with lp_variant = the page you came from. Fired: GA4 - booked_call, Ads - Booked Call (browser), Clarity - booked_call. Refresh the page: it must not fire againCheck the thank-you head code (8.6) and trigger CE - booked_call
6GA4 DebugViewbooked_call with lp_variant and role parametersDebugView can take 1 minute
7GHL → the test contact → custom fieldsgclid = TEST_DT360_..., UTM fields filled, landing_page = page value, role (page 2)Check the hidden fields' query keys (6.2). If they are still empty, tell Rodrigo (fallback 8.7)
8GHL → the test contact → tags and opportunityTags acq:google-ads, acq-stage:booked, acq-lp:bi4 or acq-lp:bi1. Opportunity in Sales Pipeline, Appointment ScheduledCheck the workflow trigger filter (6.5)
9GHL → Workflow → Execution logsThe workflow ran. The Google Ads step shows an error about an invalid click IDThis error is expected with a fake gclid. Rodrigo tests the real upload with a real ad click.
10Clarity → Recordings (can take up to 2 hours)The test session, with filter Custom tags lp_variant and Smart event booked_callWait 2 hours, then check the Clarity ID constant

10Send back to Rodrigo Required

Fill in this form, click Copy my answers and paste the text into an email to rodrigopatria@gmail.com with the subject "DT360 tracking setup done". Attach the screenshots from Part 9. Do not put the Clarity API token here; send it with a secret link.

Pages
Google Tag Manager
Microsoft Clarity
Google Ads (546-353-3699)
Google Analytics 4 (398633583)
GoHighLevel
Test results (Part 9)

AAll names in one place

ThingName or value
GTM containerDT360 - Ads Landing Pages
GA4 property / measurement ID398633583 / G-ZSLFPBZD33
Google Ads account / tag546-353-3699 / AW-799375519
Google Ads conversion (bids)DT360 - Booked Call (GHL)
Google Ads conversion (backup, Secondary)DT360 - Booked Call (browser)
Clarity projectDeskTeam360 - Ads Landing Pages
GHL funnels and pathsDT - Google - Ad1 - Hire /dt-ad-hire, DT - Google - Ad4 - White Label /dt-ad-white-label, DT - Google - Booked /dt-ad-booked (all on open.deskteam360.com)
GHL calendar / form / workflowDT360 - Google Ads Call / DT360 - Ads Booking Form / DT360 - Google Ads Booked Call
GHL tagsacq:google-ads, acq-stage:booked, acq-lp:bi4, acq-lp:bi1, acq-lp:unknown, test
GA4 eventsbooked_call (key event), calendar_view, cta_click, scroll_depth
GA4 parameterslp_variant, role, cta_text, cta_target, booking_method, percent
lp_variant valuesbi4_white_label, bi1_hire_team
role valuesgraphic-designer, video-editor, web-developer, wordpress-developer, landing-page-designer, gohighlevel-expert, clickfunnels-expert, none
Clarity tags and eventtags lp_variant, role, has_gclid; event booked_call
Test contactName TEST DT360, email with +dt360test, tag test

BLater, not now

These are planned, but they wait until the first bookings come in and Rodrigo confirms the process. Do not build them in this round.


Prepared by Rodrigo Andrade, 3HRV, for DeskTeam360. Version 2, October 16, 2026. Questions: rodrigopatria@gmail.com.