How do I track UTM parameters with a Notion form?

Notion form UTM tracking isn't built in. Use one form link per channel, or a hidden-field form that writes utm_source and utm_campaign to Notion.

Nookesh KarriNovember 13, 20266 min read
Light cover card with the title 'How do I track UTM parameters with a Notion form?' in dark text and a blue accent bar

Notion form UTM tracking isn’t built in: a native Notion form ignores anything added to its link, so ?utm_source=newsletter never reaches your database. You have two honest options. Share a separate form link per channel, or put a form with hidden fields in front of your Notion database so each tracking value lands in its own property.

Does Notion form UTM tracking work natively?

Notion form UTM tracking doesn’t work natively, because Notion’s form builder has no setting for URL parameters. Notion’s forms help covers questions, sharing, anonymous responses, conditional logic and automations. It says nothing about URL parameters, hidden fields or tracking where a respondent came from.

So the tag falls off. You post yourform?utm_source=linkedin, someone opens it, and the new row in Notion looks like one from any other channel. You can’t fill a hidden property either, because every question maps to a field the respondent sees.

Still deciding whether native forms are enough? Read the limitations of Notion forms.

What UTM parameters actually are

UTM parameters are labels added to the end of a link that say where a visit came from. Google’s URL builder guide defines the main ones like this:

Parameter What it records Example values
utm_source The referrer google, newsletter4, billboard
utm_medium The marketing medium cpc, banner, email
utm_campaign The product, slogan or promo code spring_sale
utm_content Which creative or link was clicked two call-to-action links in one email
utm_term The paid keyword your ad keyword

Google’s advice is blunt: “you should always use utm_source, utm_medium, and utm_campaign.” Leave one out and its reports show “(not set)”. The same gap shows up as an empty property in Notion.

Values are case sensitive. Google’s own example is that utm_source=google is different from utm_source=Google. In a Notion database that means two separate groups for one channel.

The simplest native workaround is to give each channel its own copy of the form and tag responses after they arrive. It needs no extra tool, and it works on any Notion plan.

  1. Add a Source select property to the database behind your form.
  2. Duplicate the form view once per channel, for example one for the newsletter and one for LinkedIn. Our guide to duplicating a Notion form shows the steps.
  3. On each copy, set an automation for new responses that fills Source with that channel’s value. Notion lets you build automations into your form that run on each new response.
  4. Share each link only in its own channel.

This holds up for a handful of channels. It breaks down when you want campaign-level detail, because every new campaign means another form copy and another automation.

Option two: hidden fields that write to Notion

A hidden field is a form field the respondent never sees, filled from the link instead. You add hidden fields named utm_source, utm_medium and utm_campaign, and the form copies each value from the URL into a matching Notion property.

As of November 2026, Tally’s help page says its hidden fields are free for all users and lists passing UTM parameters as a use case. The link format is the usual one. The first parameter starts with ? and each extra one joins with &, so a newsletter link ends in ?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale.

To set this up:

  1. In Notion, add text properties called utm_source, utm_medium and utm_campaign.
  2. In the form tool, add hidden fields with the same names.
  3. Map each hidden field to its Notion property. Our guide to mapping form fields to Notion properties covers the matching rules.
  4. Open a tagged link, submit a test, and check the new row.

Hidden doesn’t mean trusted. Anyone can edit the link before opening it. Use UTM data to count channels, never to set pricing or grant access.

The embed trap: tags on the parent page

When a form is embedded on your landing page, the UTM tags sit on the landing page’s address, not on the form’s own link. Your ad points to yoursite.com/apply?utm_source=google, but the iframe loads the form without those tags unless the embed passes them along.

Tally’s embed docs say the widget “automatically forwards the host page’s path and query parameters to the embed,” and you still need matching hidden fields. Fillout’s embed help says its embeds inherit the parent page’s parameters, and you can also hard-code one, like data-ref="Facebook".

If your fields arrive empty only on the embedded version, this is almost always why. Test the embedded page with a tagged link, not the form’s direct link.

How nDBForms handles campaign sources

nDBForms writes each submission as a new row in your Notion database and gives every form an iframe embed code. Its analytics dashboard tracks views, starts, completions, drop-off by question, devices, referrers and countries.

The referrer view shows which sites send people to the form. That isn’t UTM capture. The published feature list doesn’t include hidden fields or URL prefill, so nDBForms won’t write utm_campaign into a Notion property today. If per-campaign data in Notion is the deciding feature, a hidden-field tool fits better. You can also stay native with one form per channel.

Reading campaign results inside Notion

Once the values land in Notion, a grouped view turns them into a quick report. Notion lets you group a database by a property: open View settings, choose Group, and pick utm_source. Each channel becomes its own section with its own count.

A few habits keep that view clean:

  • Use lowercase everywhere. newsletter, not Newsletter, so one channel stays one group.
  • Pick a short list of medium names, like email, cpc and social.
  • Filter by campaign. Notion filter groups combine AND and OR logic, nested up to three layers deep, so “Source is newsletter AND campaign is spring_sale” is easy.
  • Keep a sheet of every tagged link you’ve shared, so nobody invents a new spelling.

My take: with fewer than five channels, one form per channel is plenty, and everything stays inside Notion. Once you run paid ads with several campaigns, hidden fields are worth the extra tool. Neither method fixes the real limit. UTM data only records where someone clicked from, so anyone who pastes a tagged link into a group chat gets counted under the original channel.

For a broader look at turning submissions into leads, see building a lead capture form in Notion.

FAQ

Do native Notion forms capture UTM parameters?

No. Notion’s forms help covers questions, sharing, anonymous responses, conditional logic and automations, but nothing about URL parameters or hidden fields. A tagged link opens the same blank form and the tags are dropped.

Which UTM parameters should I use for a form?

Use utm_source, utm_medium and utm_campaign on every link. Google’s guidance says to always include those three. Add utm_content only when you need to tell two links in the same email or post apart.

Why are my UTM fields empty when the form is embedded?

The tags sit on your landing page’s address, not on the form inside the iframe. The embed has to forward the parent page’s parameters, and the form needs hidden fields with matching names.

Are UTM values case sensitive?

Yes. Google notes that utm_source=google is different from utm_source=Google. Pick lowercase for everything and stick to it, or one channel shows up as two groups in Notion.

Sources