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)
<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
<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).
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.
{
event: "sitekit_form_submit",
form: "contact",
sitekit_form: "contact",
sitekit_site: "hanaya",
sitekit_submission_id: "…" // submission ID, for deduplicating conversions
}In GTM, create:
- A trigger: type "Custom Event", event name
sitekit_form_submit - Variables: type "Data Layer Variable", for
form(namedForm Key) andsitekit_submission_id(namedSubmission 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.
<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 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 Soon
- Your own domain with Siteon hosting Soon
Related docs
- The script tag: traffic-source recording and GTM
- Forms: the GTM event, GA4 and Google Ads examples,
sitekit:submit - Webhooks: payload, signature verification, retries
- Public API: the
attributionfield