# Landing Pages

Course: [Google Ads for B2B Teams](https://www.devtutorials.ai/learn/google-ads) · Section: Build the Campaign
Source: https://www.devtutorials.ai/learn/google-ads/build-the-campaign/landing-pages

> One page, one job: what makes a good B2B landing page, how to keep it consistent with the ad, and how to build it in Astro.

<aside className="gads-glance" aria-label="At a glance">
<p className="gads-glance-title">At a glance</p>
<ul data-astro-cid-rkuv35jc="">
<li data-astro-cid-rkuv35jc="">Send ad clicks to a dedicated landing page, not your homepage. One page per campaign theme, one offer, one form.</li>
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Message match:</strong> the page headline repeats the ad's promise in the same words. A visitor should know in three seconds they're in the right place.</li>
<li data-astro-cid-rkuv35jc="">Above the fold: headline, one-line explanation, proof, and the form or button. Below: how it works, a customer quote, answers to objections.</li>
<li data-astro-cid-rkuv35jc="">Keep the form short and collect the GCLID and UTMs in hidden fields. That's what lets you track leads to revenue later.</li>
<li data-astro-cid-rkuv35jc="">Build it in Astro with your LLM in an hour. Mark it noindex, keep it fast, test it on a phone.</li>
</ul>
</aside>

## What a good B2B landing page has

<p data-astro-cid-rkuv35jc="">A landing page has one job: get the right visitor to take the one next step, and discourage the wrong visitor. Everything that doesn't help with that comes off the page.</p>
<p data-astro-cid-rkuv35jc="">Full site navigation is the most common distraction; replace it with a logo that links home.</p>

<figure className="gads-fig">
<svg className="gads-lp-wire" viewBox="0 0 640 380" role="img" aria-label="Wireframe of a landing page: logo bar, hero with headline, subhead, proof points and form on the right, then logos, how it works, quote and FAQ sections." data-astro-cid-rkuv35jc="">
<rect x="10" y="10" width="620" height="360" rx="8" className="gads-svg-panel gads-svg-line" stroke="currentColor" fillOpacity="1" style={{ stroke: "var(--line-2)" }} data-astro-cid-rkuv35jc="" />
<rect x="10" y="10" width="620" height="30" rx="8" className="gads-svg-bg" data-astro-cid-rkuv35jc="" />
<rect x="24" y="19" width="60" height="12" rx="3" className="gads-svg-muted" data-astro-cid-rkuv35jc="" />
<text x="96" y="30" className="gads-svg-text gads-svg-muted" fontSize="11" data-astro-cid-rkuv35jc="">Logo only, no menu</text>
<rect x="24" y="54" width="360" height="22" rx="3" className="gads-svg-accent" data-astro-cid-rkuv35jc="" />
<text x="30" y="70" className="gads-svg-text" fontSize="12" fontWeight="700" style={{ fill: "var(--accent-ink)" }} data-astro-cid-rkuv35jc="">Headline = the ad's promise</text>
<rect x="24" y="84" width="320" height="10" rx="3" className="gads-svg-muted" data-astro-cid-rkuv35jc="" />
<rect x="24" y="100" width="280" height="10" rx="3" className="gads-svg-muted" data-astro-cid-rkuv35jc="" />
<text x="24" y="132" className="gads-svg-text gads-svg-good" fontSize="12" fontWeight="700" data-astro-cid-rkuv35jc="">✓ Proof ✓ Proof ✓ Proof</text>
<rect x="24" y="144" width="360" height="72" rx="6" className="gads-svg-bg" data-astro-cid-rkuv35jc="" />
<text x="150" y="185" className="gads-svg-text gads-svg-muted" fontSize="11" data-astro-cid-rkuv35jc="">Product screenshot</text>
<rect x="410" y="54" width="206" height="162" rx="8" className="gads-svg-accent-soft gads-hi" style={{ stroke: "var(--accent)" }} data-astro-cid-rkuv35jc="" />
<text x="424" y="76" className="gads-svg-text gads-svg-ink" fontSize="12" fontWeight="700" data-astro-cid-rkuv35jc="">Short form</text>
<rect x="424" y="88" width="178" height="16" rx="3" className="gads-svg-panel" data-astro-cid-rkuv35jc="" />
<rect x="424" y="110" width="178" height="16" rx="3" className="gads-svg-panel" data-astro-cid-rkuv35jc="" />
<rect x="424" y="132" width="178" height="16" rx="3" className="gads-svg-panel" data-astro-cid-rkuv35jc="" />
<text x="424" y="166" className="gads-svg-text gads-svg-muted" fontSize="10" data-astro-cid-rkuv35jc="">+ hidden gclid / utm fields</text>
<rect x="424" y="178" width="178" height="24" rx="4" className="gads-svg-accent" data-astro-cid-rkuv35jc="" />
<text x="513" y="194" textAnchor="middle" className="gads-svg-text" fontSize="11" fontWeight="700" style={{ fill: "var(--accent-ink)" }} data-astro-cid-rkuv35jc="">One clear button</text>
<line x1="10" y1="232" x2="630" y2="232" style={{ stroke: "var(--line-2)" }} data-astro-cid-rkuv35jc="" />
<text x="24" y="256" className="gads-svg-text gads-svg-ink2" fontSize="12" data-astro-cid-rkuv35jc="">Customer logos from the visitor's segment</text>
<text x="24" y="284" className="gads-svg-text gads-svg-ink2" fontSize="12" data-astro-cid-rkuv35jc="">How it works / what happens next (3 steps)</text>
<text x="24" y="312" className="gads-svg-text gads-svg-ink2" fontSize="12" data-astro-cid-rkuv35jc="">One customer quote with name, role and company</text>
<text x="24" y="340" className="gads-svg-text gads-svg-ink2" fontSize="12" data-astro-cid-rkuv35jc="">FAQ: pricing signal, security, setup time, integrations</text>
</svg>
<figcaption>A landing page that works. The top section does most of the work; the rest answers the questions that stop people converting.</figcaption>
</figure>

### Message match

<p data-astro-cid-rkuv35jc="">The visitor just read your ad. If the ad said "Never Miss a Renewal Again" and the page says "The Intelligent Legal Operations Platform", they have to work out whether they're in the right place, and many won't bother.</p>
<p data-astro-cid-rkuv35jc="">Copy the ad's main promise into the page headline, use the same offer wording ("30-minute demo", "14-day free trial"), and show the thing the keyword named.</p>
<p data-astro-cid-rkuv35jc="">If you have several ad groups with different promises, either give each its own page or make the headline reflect the shared promise.</p>

### Form length for your goal

<div className="gads-var" data-goal="trial">
<p data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Free trial:</strong> work email and password, or single sign-on (Google, Microsoft, GitHub). Ask for company size or role inside the product after sign-up, not on the form. Every extra field costs sign-ups.</p>
<p data-astro-cid-rkuv35jc="">If you get many personal-email sign-ups that never activate, block free email domains or ask for a work email explicitly.</p>
<p data-astro-cid-rkuv35jc="">Then make sure the conversion you track is the completed sign-up, not the form view, and plan to track activation later.</p>
</div>

<div className="gads-var" data-goal="demo">
<p data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Demo request:</strong> work email, name, company and company size is a good default. Four fields filter well without scaring people off.</p>
<p data-astro-cid-rkuv35jc="">Add a calendar booking step right after the form so serious buyers can pick a slot immediately; it improves show rates. Don't ask for phone number unless sales really calls; it lowers conversion and invites fake numbers.</p>
<p data-astro-cid-rkuv35jc="">Use the company size answer to route small companies to a self-serve path.</p>
</div>

## Build it in Astro

<p data-astro-cid-rkuv35jc="">Your site is in Astro, so a landing page is one file in <code data-astro-cid-rkuv35jc="">src/pages/lp/</code> plus a small reusable component for the hidden tracking fields.</p>
<p data-astro-cid-rkuv35jc="">The example below assumes an existing <code data-astro-cid-rkuv35jc="">BaseLayout</code>; your LLM can adapt it to whatever layout your site uses.</p>

### The page

```html readonly title="src/pages/lp/contract-management-demo.astro"
---
// src/pages/lp/contract-management-demo.astro
// Ad landing page: one offer, one form, no site navigation, not indexed.
import BaseLayout from '../../layouts/BaseLayout.astro';
import TrackingFields from '../../components/TrackingFields.astro';

const page = {
  headline: 'Never miss a contract renewal again',
  sub: 'Every contract searchable, every renewal flagged. See it with your own contract types in a 30-minute demo.',
  proof: ['Used by 600 legal teams', 'Live in 6 weeks on average', 'SOC 2 Type II'],
};
---
<BaseLayout title="Contract management software demo" noindex={true} minimalNav={true}>
  <section class="hero">
    <div>
      <h1>{page.headline}</h1>
      <p class="sub">{page.sub}</p>
      <ul class="proof">{page.proof.map((p) => <li>{p}</li>)}</ul>
      <img src="/images/lp/renewals-dashboard.webp" width="720" height="450"
           alt="Renewals dashboard showing upcoming contract deadlines" loading="eager" />
    </div>

    <form id="lead-form" method="post" action="https://YOUR-CRM-FORM-ENDPOINT">
      <h2>Book your demo</h2>
      <label>Work email <input type="email" name="email" required autocomplete="email" /></label>
      <label>Full name <input name="name" required autocomplete="name" /></label>
      <label>Company <input name="company" required autocomplete="organization" /></label>
      <label>Company size
        <select name="company_size" required>
          <option value="">Choose…</option>
          <option>1-49</option><option>50-199</option><option>200-999</option><option>1000+</option>
        </select>
      </label>
      <TrackingFields />
      <button type="submit">Book a demo</button>
      <p class="small">We'll reply within one business day. <a href="/privacy">Privacy</a></p>
    </form>
  </section>

  <section class="logos"><!-- 4-6 customer logos similar to the visitor --></section>
  <section class="how"><!-- 3 steps: what happens in the demo, what they'll see --></section>
  <section class="quote"><!-- one customer quote with name, role, company --></section>
  <section class="faq"><!-- pricing signal, security, implementation time --></section>
</BaseLayout>
```

### The hidden tracking fields

<p data-astro-cid-rkuv35jc="">This component reads the Google click ID (<code data-astro-cid-rkuv35jc="">gclid</code>, or <code data-astro-cid-rkuv35jc="">gbraid</code>/<code data-astro-cid-rkuv35jc="">wbraid</code> on some iOS traffic) and UTM parameters from the URL and puts them into hidden form fields. Your CRM needs matching fields to store them.</p>
<p data-astro-cid-rkuv35jc="">This is the single most important thing for later stages of tracking: without the GCLID stored against the lead, you can't tell Google which clicks became customers.</p>

```html readonly title="src/components/TrackingFields.astro"
---
// src/components/TrackingFields.astro
// Hidden fields that carry ad click IDs and UTMs into the CRM with the lead.
// Values are read from the URL on landing and kept for 90 days, so a visitor who
// browses around before converting is still attributed to the ad click.
const keys = ['gclid', 'gbraid', 'wbraid', 'utm_source', 'utm_medium',
              'utm_campaign', 'utm_term', 'utm_content'];
---
{keys.map((k) => <input type="hidden" name={k} data-track={k} />)}
<input type="hidden" name="landing_page" data-track="landing_page" />

<script is:inline>
  (function () {
    var KEY = 'ad_attribution';
    var MAX_AGE = 90 * 24 * 60 * 60 * 1000;
    var params = new URLSearchParams(location.search);
    var stored = {};
    try { stored = JSON.parse(localStorage.getItem(KEY) || '{}'); } catch (e) {}
    if (stored.t && Date.now() - stored.t > MAX_AGE) stored = {};

    // A new ad click (any click ID or utm_source) replaces older values.
    var fresh = ['gclid', 'gbraid', 'wbraid', 'utm_source'].some(function (k) { return params.get(k); });
    if (fresh) {
      stored = { t: Date.now(), landing_page: location.pathname };
      params.forEach(function (v, k) { stored[k] = v; });
      try { localStorage.setItem(KEY, JSON.stringify(stored)); } catch (e) {}
    }
    document.querySelectorAll('input[data-track]').forEach(function (el) {
      var k = el.getAttribute('data-track');
      if (stored[k]) el.value = stored[k];
    });
  })();
</script>
```

<div className="gads-var" data-region="eu">
<p data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">EU/UK:</strong> storing click IDs in the visitor's browser counts as non-essential storage.</p>
<p data-astro-cid-rkuv35jc="">Only write to <code data-astro-cid-rkuv35jc="">localStorage</code> after the visitor accepts advertising or analytics cookies in your consent banner, or keep the values only in the page's hidden fields for that visit.</p>
<p data-astro-cid-rkuv35jc="">Your CMP usually exposes a consent check you can wrap the storage line in; ask your LLM to wire it up for the CMP you use.</p>
</div>

### Keep it out of search results and fast

```html readonly title="src/layouts/BaseLayout.astro"
---
// In src/layouts/BaseLayout.astro: accept noindex and a minimal header
const { title, noindex = false, minimalNav = false } = Astro.props;
---
<head>
  <title>{title}</title>
  {noindex && <meta name="robots" content="noindex, nofollow" />}
  <!-- Google tag and consent setup go here, once, for every page (see Tracking) -->
</head>
<body>
  {minimalNav ? <header class="lp-header"><a href="/">Logo</a></header> : <SiteHeader />}
  <slot />
</body>
```

<ul data-astro-cid-rkuv35jc="">
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">noindex:</strong> landing pages often duplicate site content and you don't want organic visitors on a page built for ad traffic.</li>
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Speed:</strong> Astro ships little JavaScript by default, which helps. Keep the hero image under about 150 KB (WebP or AVIF, with width and height set), avoid chat widgets and heavy video on the page, and test with PageSpeed Insights on mobile.</li>
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Mobile:</strong> a large share of B2B searches start on a phone, even if the sale closes on a laptop. Check the form is usable with a thumb.</li>
</ul>

<GadsPrompt title="Build the landing page in your Astro repo" claude={"Our marketing site is an Astro project. Create a Google Ads landing page.\n\nCampaign theme: [e.g. contract management software]\nAd promise (use as the H1, keep wording): \"[promise from the ad]\"\nOffer / conversion: [14-day free trial / 30-minute demo]\nProof points: [3-5 facts]\nCustomer quote: [quote, name, role, company]\nFAQ answers: [pricing signal, security, setup time]\n\nRequirements:\n1. New page at src/pages/lp/[slug].astro using our existing layout [name/path]. Add props to the layout if needed for: <meta name=\"robots\" content=\"noindex, nofollow\"> and a minimal header (logo only, no main nav).\n2. Above the fold: H1, one-line subhead, proof points, product image, and the form. Below: logos, 3-step \"what happens next\", quote, FAQ.\n3. Form fields: [work email, name, company, company size / work email + password]. Post to [our CRM form endpoint or handler].\n4. A reusable component src/components/TrackingFields.astro with hidden inputs for gclid, gbraid, wbraid, utm_source, utm_medium, utm_campaign, utm_term, utm_content and landing_page, filled by a small inline script from the URL and kept in localStorage for 90 days. [EU/UK only: only persist after the visitor gives consent via our CMP: name it.]\n5. No new JS frameworks; plain Astro and CSS. Images with width/height and lazy loading below the fold.\nShow me every file you create or change, then list what I need to set up in the CRM (matching fields) and how to test it."} chatgpt={"Our marketing site is an Astro project. Create a Google Ads landing page.\n\nCampaign theme: [e.g. contract management software]\nAd promise (use as the H1, keep wording): \"[promise from the ad]\"\nOffer / conversion: [14-day free trial / 30-minute demo]\nProof points: [3-5 facts]\nCustomer quote: [quote, name, role, company]\nFAQ answers: [pricing signal, security, setup time]\n\nRequirements:\n1. New page at src/pages/lp/[slug].astro using our existing layout [name/path]. Add props to the layout if needed for: <meta name=\"robots\" content=\"noindex, nofollow\"> and a minimal header (logo only, no main nav).\n2. Above the fold: H1, one-line subhead, proof points, product image, and the form. Below: logos, 3-step \"what happens next\", quote, FAQ.\n3. Form fields: [work email, name, company, company size / work email + password]. Post to [our CRM form endpoint or handler].\n4. A reusable component src/components/TrackingFields.astro with hidden inputs for gclid, gbraid, wbraid, utm_source, utm_medium, utm_campaign, utm_term, utm_content and landing_page, filled by a small inline script from the URL and kept in localStorage for 90 days. [EU/UK only: only persist after the visitor gives consent via our CMP: name it.]\n5. No new JS frameworks; plain Astro and CSS. Images with width/height and lazy loading below the fold.\nShow me every file you create or change, then list what I need to set up in the CRM (matching fields) and how to test it."} claudeHow="Use this with Claude Code in your website repo if you have it, or paste the relevant files (your layout and an existing page) into a chat and ask for the new files in full." chatgptHow="Use this with ChatGPT's Codex in your website repo if you have it, or paste the relevant files (your layout and an existing page) into a chat and ask for the new files in full." />

## Test the page on mobile

<p>Most B2B searches that turn into leads still start on a phone at some point. A slow or jumpy page costs you conversions and lowers the landing page experience part of Quality Score. Before launch and after any change:</p>
<ol>
<li>Open <strong>PageSpeed Insights</strong> (<a href="https://pagespeed.web.dev/" target="_blank" rel="noopener noreferrer">pagespeed.web.dev</a>), paste the landing page URL with no UTMs, and read the <strong>Mobile</strong> tab.</li>
<li>Look at the three Core Web Vitals and put them in the check below. Google rates each one good, needs work or poor.</li>
<li>Open the page on a real phone on mobile data, fill in the form with your thumb, and submit it.</li>
</ol>

<p>On an Astro site the usual culprits are a large hero image that was not run through Astro's image pipeline, third-party scripts (chat, heatmaps, testing tools) added to the shared layout, and web fonts loaded from another domain.</p>
<p>For ad landing pages, leave those scripts out entirely.</p>

```html readonly title="src/pages/lp/contract-management-demo.astro (hero image)"
---
import { Image } from 'astro:assets';
import hero from '../../assets/contract-dashboard.png';
---
<!-- Astro resizes the image, serves WebP/AVIF and sets width and height. -->
<!-- loading="eager": the hero is the largest element, so do not lazy-load it. -->
<Image src={hero} alt="Contract dashboard showing renewals due this month" widths={[480, 960]} sizes="(max-width: 640px) 100vw, 480px" loading="eager" />
```

## Make the form usable for everyone

<p>An accessible form is also a form more people finish. Check these on every landing page:</p>
<ul>
<li><strong>Visible labels</strong> above each field, not placeholder text that disappears when someone starts typing.</li>
<li><strong>Contrast</strong> of at least 4.5:1 for text and the button label against its background. Light grey on white fails.</li>
<li><strong>Keyboard</strong>: you can tab through every field and the button in order, and you can see where the focus is.</li>
<li><strong>Errors in words</strong> next to the field ("Enter a work email"), not only a red border.</li>
<li><strong>Autocomplete</strong> attributes so phones and browsers fill name, email and company for the visitor.</li>
<li><strong>Tap targets</strong> at least about 44 px high, with space between them.</li>
</ul>

```html readonly title="src/components/DemoForm.astro (accessible fields)"
<label for="email">Work email</label>
<input id="email" name="email" type="email" autocomplete="email" required aria-describedby="email-help" />
<p id="email-help">We'll send the demo invite here.</p>

<label for="company">Company</label>
<input id="company" name="company" autocomplete="organization" required />

<button type="submit">Book my demo</button>
```

<p>Ask your LLM to run the same checklist against your form component and to list the fixes as a diff. Then test it yourself with the keyboard only.</p>

## Spot the problems

<p data-astro-cid-rkuv35jc="">The ad says: <em data-astro-cid-rkuv35jc="">"Expense Management Software | Approve Expenses From Your Phone | Free 14-Day Trial"</em>. Here's the landing page it points to:</p>

<div className="gads-mock-ad" style={{ maxWidth: "640px" }} data-astro-cid-rkuv35jc="">
<div className="gads-sponsored" data-astro-cid-rkuv35jc="">example-spend.com/platform</div>
<div className="gads-hl" style={{ color: "var(--ink)" }} data-astro-cid-rkuv35jc="">Transforming the Future of Finance</div>
<div className="gads-desc" data-astro-cid-rkuv35jc="">Full site menu: Products ▾ Solutions ▾ Resources ▾ Company ▾ Careers · Log in</div>
<div className="gads-desc" data-astro-cid-rkuv35jc="">ExampleSpend's unified platform brings together AP, procurement, cards, travel and expenses with AI-driven insights. &#91;3 MB autoplay video&#93;</div>
<div className="gads-desc" data-astro-cid-rkuv35jc="">Form: First name · Last name · Work email · Phone · Company · Job title · Company size · Country · How did you hear about us? · Message → <strong data-astro-cid-rkuv35jc="">Contact sales</strong></div>
</div>

<div className="gads-var" data-region="eu india apac latam mea">
<div className="gads-callout gads-callout-region">
<p className="gads-callout-title">Regional notes</p>
<div className="gads-var" data-region="eu">
<p data-astro-cid-rkuv35jc="">Make sure the consent banner doesn't cover the form or headline on mobile. A full-screen cookie wall in front of a landing page loses many visitors before they see anything.</p>
<p data-astro-cid-rkuv35jc="">Use a banner at the bottom, and check the form submits whether or not the visitor accepts cookies.</p>
<p data-astro-cid-rkuv35jc="">Translate the page for each language you advertise in, show EUR or GBP pricing, and mention EU data residency if you offer it.</p>
</div>
<div className="gads-var" data-region="india">
<p data-astro-cid-rkuv35jc="">Show INR pricing or "plans from ₹…" if you have regional pricing, since USD-only pricing makes Indian buyers assume the product isn't for them.</p>
<p data-astro-cid-rkuv35jc="">Mobile load speed matters more here: test on a mid-range Android phone over a 4G connection.</p>
</div>
<div className="gads-var" data-region="apac">
<p data-astro-cid-rkuv35jc="">For Japan and Korea, use fully localised pages with local proof; a translated US page underperforms. For Australia and Singapore, show local currency and local support hours.</p>
</div>
<div className="gads-var" data-region="latam">
<p data-astro-cid-rkuv35jc="">Use Portuguese for Brazil and Spanish elsewhere, local currency (BRL, MXN) where you have regional pricing, and local payment options if trials convert to paid by card.</p>
<p data-astro-cid-rkuv35jc="">Mention support in the local language if you have it.</p>
</div>
<div className="gads-var" data-region="mea">
<p data-astro-cid-rkuv35jc="">If you advertise in Arabic, the page must be right-to-left and properly localised. Mention local or regional data hosting where it's true; it's a common buyer question in the Gulf.</p>
</div>
</div>
</div>

<details className="gads-deeper">
<summary><span className="gads-deeper-tag">Go deeper</span> Testing landing pages without a testing tool</summary>
<div className="gads-deeper-body">
<p data-astro-cid-rkuv35jc="">You don't need an A/B testing tool to start. Two practical options:</p>
<ul data-astro-cid-rkuv35jc="">
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Ad group split:</strong> point two similar ad groups at two different pages and compare conversion rates after a few hundred clicks each.</li>
<li data-astro-cid-rkuv35jc=""><strong data-astro-cid-rkuv35jc="">Ad variations or a campaign experiment:</strong> Google Ads can split traffic between two final URLs and report results. Use it once you have enough volume, roughly 100 or more conversions a month in the campaign, or the test will take months.</li>
</ul>
<p data-astro-cid-rkuv35jc="">Change one big thing at a time: the headline and offer, or the form, not the button colour. Small cosmetic changes rarely move B2B conversion rates enough to measure at typical volumes.</p>
</div>
</details>

<section className="gads-donow" aria-labelledby="donow-landing-pages">
<h2 id="donow-landing-pages">Do this now</h2>
<ul className="gads-checklist" data-module="landing-pages">

<li data-id="speed">PageSpeed Insights mobile run; LCP, INP and CLS all in the good range, or fixes listed.</li>
<li data-id="a11y">Form checked: visible labels, contrast, keyboard order, error text and autocomplete.</li>

<li data-id="page" data-astro-cid-rkuv35jc="">Create one landing page for your first campaign theme, with the ad's promise as the H1.</li>
<li data-id="nav" data-astro-cid-rkuv35jc="">Remove the main navigation and set the page to noindex.</li>
<li data-id="form-trial" data-goal="trial" data-astro-cid-rkuv35jc="">Cut the trial form to work email and password (or SSO).</li>
<li data-id="form-demo" data-goal="demo" data-astro-cid-rkuv35jc="">Cut the demo form to about four fields and add a calendar booking step.</li>
<li data-id="fields" data-astro-cid-rkuv35jc="">Add the hidden tracking fields and create matching fields in the CRM.</li>
<li data-id="test" data-astro-cid-rkuv35jc="">Submit a test lead with <code data-astro-cid-rkuv35jc="">?gclid=test123&amp;utm&#95;source=google</code> in the URL and confirm the values arrive in the CRM.</li>
<li data-id="mobile" data-astro-cid-rkuv35jc="">Check the page on a phone and run PageSpeed Insights on mobile.</li>
<li data-id="consent" data-region="eu" data-astro-cid-rkuv35jc="">Check the consent banner doesn't cover the form and that click IDs are only stored after consent.</li>
</ul>
</section>

Next: **Advertising Against Competitors**
