Problem

Why HubSpot form submissions arrive without UTMs

UTMs only land on a HubSpot contact when something reads them from the URL and sends them with the submission: a hidden field, the tracking cookie, or both. They go missing when the form cannot see the landing page URL (iframes, single-page apps, redirects), when the visitor converts on a different page from the one they landed on, or when a custom form or API call submits without the hutk cookie value. Each cause can be tested in a few minutes with a tagged URL and a fresh email address.

By Vladimir Cvetkoski · Last updated

Root causes

The 6 most common causes, and how to check each one

  1. 01

    The form sits in an iframe and cannot see the page URL

    HubSpot prefills form fields, including hidden ones, from query parameters in the URL. A form rendered inside an iframe can only prefill from the URL the iframe itself is loaded with. Depending on the embed method, a CMS plugin or a custom iframe, the landing page's query string may never reach it, so hidden UTM fields stay empty unless the parent page passes the values in.

    How to check
    1. 01Right-click the form and choose Inspect. If it sits inside an <iframe>, check whether the iframe src contains your UTMs.
    2. 02Load the page with ?utm_source=test&utm_medium=audit and submit with a new email address.
    3. 03Open the contact and check your UTM properties and the page URL on the form submission in the activity timeline.
  2. 02

    Hidden fields are missing or mapped to the wrong property

    Prefill only works when the query parameter name matches the property's internal name exactly. A property labelled UTM Source with the internal name utm_source_c will never be filled by ?utm_source=. Dropdown properties only accept their defined options, and dependent fields cannot be prefilled at all.

    How to check
    1. 01In Settings > Properties, open each UTM property and copy its Internal name. It must equal the URL parameter, character for character.
    2. 02Open the form editor and confirm there is a hidden field for every UTM property, using a single-line text property.
    3. 03Load the form with test UTMs, find the hidden inputs in DevTools > Elements and check their values before you submit.
  3. 03

    The visitor lands on one page and converts on another

    UTMs live on the landing URL only. A visitor who lands on /pricing?utm_source=linkedin, clicks to /demo and submits there has no UTMs in the URL when the form loads. HubSpot's cookie may still set Original Source correctly, but your UTM properties stay blank. The fix is to store the first-touch values on landing (a first-party cookie or local storage) and write them into the hidden fields on submit.

    How to check
    1. 01Land on page A with test UTMs, click through to a form on page B and submit with a new email address.
    2. 02Compare the contact's Original Source and drill-downs with your UTM properties. If the source is right and the UTMs are blank, this is your cause.
  4. 04

    Custom forms and API submissions without `hutk`

    Non-HubSpot forms submitted through the Forms API need the visitor's hubspotutk cookie value passed as hutk in the context object, along with pageUri. Without it, HubSpot cannot connect the submission to the visitor's earlier page views, so the contact arrives with no browsing history and a weak or missing source. Forms posted to your own backend lose the cookie unless the code forwards it.

    How to check
    1. 01In DevTools > Network, find the request to api.hsforms.com/submissions/v3/integration/submit/... and check that context.hutk is present.
    2. 02Compare that value with the hubspotutk cookie under Application > Cookies. They must match.
    3. 03Open the test contact. If the timeline starts with the form submission and shows no page views before it, the submission was not linked to the visitor.
  5. 05

    Redirects drop the query string

    A redirect between the ad and the form page (http to https, trailing slash, language or geo routing, a vanity URL) can drop everything after the ?. Language and geo redirects are often set up separately from the main redirect rules, so they get missed.

    How to check
    1. 01Run each tagged ad URL through curl -sIL "<url>" and check every Location header keeps the parameters.
    2. 02Test from a different country or browser language if your site redirects on either.
  6. 06

    Single-page apps do not report route changes

    In a React, Next.js or Vue site, moving between pages does not reload the page. The HubSpot tracking code only records the first page view unless the app calls _hsq.push(['setPath', '/new-path']) followed by _hsq.push(['trackPageView']) on each route change. Some routers also clean query parameters from the URL after the first render, before the form reads them.

    How to check
    1. 01In DevTools > Network, filter for track.hubspot.com, move between two routes and check a new page view request is sent for each.
    2. 02After the first route change, check whether the UTMs are still in the address bar.
    3. 03Search the codebase for setPath and trackPageView. If neither exists, route changes are not tracked.
Self-check

Checklist

  1. 01List every form type on the site: HubSpot embed, iframe, pop-up, custom or API form, booking tool.
  2. 02For each UTM property, confirm the internal name matches the URL parameter exactly.
  3. 03Load each form page with ?utm_source=test&utm_medium=test&utm_campaign=form-check and inspect the hidden field values before submitting.
  4. 04Submit each form with a new email address (for example [email protected]).
  5. 05Repeat one test landing on one page and submitting on another.
  6. 06On a single-page app, move through two routes before submitting.
  7. 07For each test contact, check the UTM properties, Original Source, First Page Seen and whether page views appear before the submission.
  8. 08Delete the test contacts afterwards so they do not distort your reports.
When it is not a quick fix

When to get help

A single broken form integration, such as an embedded form that drops UTMs, is usually 2 to 5 hours of work as part of The Fix. If the tests show several form types failing in different ways, start with the Attribution Audit so every entry point gets fixed in one pass.

Questions

Common questions

HubSpot reads UTMs to set its own source properties, such as Original Source and its drill-downs. To keep the raw utm_source, utm_medium and utm_campaign values on the contact, you create your own properties and capture them with hidden fields.

Both, in separate properties. First-touch properties are only set when empty, so they keep how the person found you. Last-touch properties are overwritten on every conversion, so they show what brought them back. Mixing the two in one property makes both useless.

Yes, if you want to send pipeline back to Google Ads. UTMs tell you the campaign. The gclid ties the contact to the exact click, which is what offline conversions need. See why Google Ads is not seeing offline conversions.