# How do I receive inquiries from an ad landing page with their source (UTM, gclid)?

Add the Siteon script tag to the landing page and mark its form with data-sitekit-form. The script remembers utm_* parameters, gclid and fbclid from a visitor's first and latest visit, plus the landing page and referrer, and saves them with every inquiry automatically, with no hidden fields. Each successful submission is also announced, with its submission ID, to Google Tag Manager's dataLayer and as a sitekit:submit event on document, so you can count it as a GA4 key event or a Google Ads conversion (deduplicated by transaction ID). This is included on every plan, from $4/month per site on your live domain.

URL: https://siteon.dev/guides/ad-landing-page-leads-utm
Updated: 2026-10-26

## What gets recorded

| Value | Contents |
|---|---|
| `utm_source` / `utm_medium` / `utm_campaign` / `utm_term` / `utm_content` | UTM parameters in the URL |
| `gclid` / `fbclid` | Google Ads and Meta ads click IDs |
| `landing` / `referrer` / `at` | Landing page, referrer and time |

- Two sets are kept: the first visit and the most recent one, for 90 days in the visitor's browser
- They are attached to the submission and saved with the inquiry. You don't add hidden inputs
- A visitor who lands on the page, leaves, and comes back later through another page is still matched to the ad, because the first visit is kept

## Steps

### 1. Add the script tag (and your GTM container, if you use one)

```html
<script src="https://cdn.siteon.dev/sitekit.js" data-site="hanaya" data-gtm="GTM-XXXXXXX" defer></script>
```

`data-gtm` is optional. On Siteon hosting or the Cloudflare Pages relay you can enter the GTM ID in the dashboard (Settings → Advanced) instead (don't set both).

### 2. Mark the form

```html
<form data-sitekit-form="contact">
  <label>Name <input name="name" required></label>
  <label>Email <input type="email" name="email" required></label>
  <input type="text" name="_hp" tabindex="-1" autocomplete="off"
         style="position:absolute;left:-9999px" aria-hidden="true">
  <button type="submit">Request a quote</button>
</form>
```

Declare the form in schema.json and apply it with `siteon schema push` (see [the contact form guide](https://siteon.dev/guides/add-contact-form-to-static-site)).

### 3. Pick up submissions in GTM

Only when a submission succeeds (once, after it has been saved), the script pushes this to `dataLayer`. Field values are never included.

```js
{
  event: "sitekit_form_submit",
  form: "contact",
  sitekit_form: "contact",
  sitekit_site: "hanaya",
  sitekit_submission_id: "…"   // submission ID, for deduplicating conversions
}
```

In GTM, create:

1. A trigger: type "Custom Event", event name `sitekit_form_submit`
2. Variables: type "Data Layer Variable", for `form` (named `Form Key`) and `sitekit_submission_id` (named `Submission ID`)

You can rename the event in the dashboard (Settings → Notifications → each form); if you do, update the trigger too.

### 4. Set up the conversions

**GA4**: Create a "GA4 Event" tag with event name `generate_lead` and parameter `form_key` = `{{Form Key}}`, firing on the trigger from step 3. In GA4's admin under "Events", mark `generate_lead` as a key event.

**Google Ads**: Create a conversion action in Google Ads (category such as "Submit lead form") and put its conversion ID and label in a GTM "Google Ads Conversion Tracking" tag. **Set the transaction ID to `{{Submission ID}}`** so the same submission is never counted twice. Add a "Conversion Linker" tag (all pages) to the container if there isn't one.

**Without GTM**: Listen for the `sitekit:submit` event on `document` and pass it to tags you write yourself.

```html
<script>
  document.addEventListener("sitekit:submit", (e) => {
    const d = e.detail;
    gtag("event", "generate_lead", { form_key: d.sitekit_form, transaction_id: d.sitekit_submission_id ?? undefined });
    fbq("track", "Lead", { content_name: d.sitekit_form }, { eventID: d.sitekit_submission_id ?? undefined });
  });
</script>
```

For the Meta pixel, passing the same submission ID as `eventID` removes duplicates.

### 5. Test with a tagged URL

Open the page with `?utm_source=test&utm_medium=cpc&utm_campaign=launch` and send the form in GTM's preview (Tag Assistant). You're done when the completion event appears, the Data Layer shows `sitekit_submission_id`, and the inquiry arrives in the dashboard with its source. Delete the test inquiry afterwards: it counts toward your limit.

### 6. (Optional) Pass leads to a CRM or offline conversions

On paid plans, a [webhook](https://siteon.dev/docs/webhooks) sends each inquiry, with its field values and traffic source (including `gclid`), to Zapier, Make or your CRM. That gives you what you need to import leads that turned into deals back into Google Ads as offline conversions.

## What it costs

| | Free | Lite | Standard | Business |
|---|---|---|---|---|
| Monthly | $0 | $4 | $12 | $39 |
| Form submissions | 50/mo | 500/mo | 1K/mo | 5K/mo |
| Page views (approx.) | ~10K/mo | ~30K/mo | ~300K/mo | ~2M/mo |
| Webhooks | Not included | 5 per site · signed · auto-retry | 5 per site · signed · auto-retry | 5 per site · signed · auto-retry |

Source recording, the conversion event, notifications and auto-replies are on every plan. Webhooks are on paid plans only. The Free plan works on development and preview domains and on its Siteon hosting subdomain (`<name>.siteun.com`, with a badge). To run an ad landing page on your own domain, use a paid plan.

## Limits and what's coming

- If the visitor's browser blocks `localStorage`, nothing is recorded (the form still sends)
- Values longer than 500 characters are truncated
- Submissions caught by the bot trap also look successful, so the GTM event fires for them too. Count real inquiries in the dashboard
- Passing inquiries to a spreadsheet (coming soon)
- Your own domain with Siteon hosting (coming soon)

## Related docs

- [The script tag](https://siteon.dev/docs/script): traffic-source recording and GTM
- [Forms](https://siteon.dev/docs/forms#tracking-submissions-in-gtm): the GTM event, GA4 and Google Ads examples, `sitekit:submit`
- [Webhooks](https://siteon.dev/docs/webhooks): payload, signature verification, retries
- [Public API](https://siteon.dev/docs/api): the `attribution` field

---

Siteon is infrastructure for AI-built websites: it adds hosting, a CMS your client can edit, contact forms, analytics and control from AI agents (CLI and MCP) around static HTML built with AI or by hand, so it is ready to ship.
