Platforms

How to track Typeform submissions as conversions, by source

Count Typeform submissions as conversions with the embed callback, pass UTM tags into hidden fields, and see which ad or post brought each response.

On this page

To track Typeform submissions as conversions, embed the typeform on your own page with Typeform's embed library and send a conversion from its onSubmit callback. The submission is then counted on your page, tied to the visit that came from your ad or post. A plain link to form.typeform.com loses the source, because the response happens on Typeform's domain.

This page compares three setups (callback, thank-you page redirect and webhook), shows how to carry UTM tags into the responses, and what to send to the ad platforms.

Why a typeform loses the source

An embedded typeform is an iframe from Typeform's domain. Your page's analytics tag sees the page, not what happens inside the frame, so it never sees a question answered or the form sent. A shared link is worse: the visitor leaves your site, and unless the link carries UTM tags, nobody knows where they came from.

The three ways to count a submission

SetupHow the submission is countedNeedsBest for
Embed and onSubmitTypeform's callback runs on your page when the form is sentTypeform's embed code on your pageMost sites
Redirect to your thank-you pageA visit to /thanks is the conversionA Typeform plan with redirectsCounting only; the source is often lost
Webhook to your serverTypeform posts each response to your endpointA server, or an automation toolResponses with a value, or a CRM in between

Embed: count Typeform's onSubmit callback

Typeform's embed library takes callbacks for what happens inside the form: onReady, onStarted, onQuestionChanged, onSubmit and others. onSubmit "fires when user submits the form" and passes the formId and the responseId (Typeform, embed library). Send your conversion from it.

Use Typeform's embed code, the data-tf-widget or data-tf-popup markup with embed.js, rather than a hand-made iframe, so the callbacks work. In plain HTML, a callback is the name of a function on the page, such as data-tf-on-submit="sentTypeform".

Redirect: count a page on your site

Typeform can send people to a web address when they finish. The embed's redirectTarget option decides where that page opens; the default, _parent, opens it in your page rather than inside the frame (Typeform). Point the redirect at a page such as /thanks and count a visit to it.

The catch: the thank-you page is opened from Typeform's domain, so many analytics tools read it as a new visit referred by typeform.com, and the ad that brought the visitor loses the credit. Sporetag reads it the same way today, which is why the callback is the better setup.

Keep answers out of that address. If you add answers or hidden fields such as an email to the redirect URL, an analytics tag that records full addresses stores personal data. Google asks you never to send that to Google Analytics (Google).

Webhook: count it on your server

Typeform can post every response to a URL you choose (Typeform). Your server, or an automation tool, then forwards the conversion with any details you want, such as a quote value. Use the responseId as the event id, so a retried webhook counts once.

Install Sporetag with Typeform

  1. Add the Sporetag tag to your site (see the HTML install guide), and open the page that embeds the typeform.
  2. Use Typeform's embed code with an onSubmit callback that sends a Typeform sent event, as in the code below.
  3. On the Goals tab, add a custom goal, An action happens, with the event name Typeform sent.
  4. Send a test response from the page and check the goal on the Goals tab.
  5. Leave Typeform's redirect off, or keep it for the visitor's sake and count the callback, not the page.

The embed, with the callback and the UTM tags forwarded:

HTML
<div data-tf-widget="FORM_ID" data-tf-on-submit="sentTypeform"
     data-tf-transitive-search-params="utm_source,utm_medium,utm_campaign"></div>
<script src="//embed.typeform.com/next/embed.js"></script>
<script>
  function sentTypeform(e) { sporetag('Typeform sent', { form: e.formId }); }
</script>

Sporetag's Someone fills in a form goal reads forms on your own pages. It cannot see inside Typeform's frame, which is why the callback is needed.

Pass UTM tags into the responses

Your analytics knows the campaign from the page address. Typeform does not, unless you pass it in. Two options from Typeform's embed library (Typeform):

  • transitiveSearchParams: forwards the parameters you name from your page's address to the form, such as utm_source, utm_medium and utm_campaign. Add hidden fields with the same names to the typeform to store them with each response.
  • hidden: passes values you set yourself into hidden fields.

With the tags in each response, Typeform's results, exports and integrations show the campaign too, and a CRM that receives the responses keeps it.

Send submissions to Google Ads and Meta

A submission is a lead, so the ad platforms should learn from it:

  • Google Ads: fire a conversion from the same onSubmit callback or the thank-you page. The lead-gen conversion tracking guide covers values and counting.
  • Meta: send a Lead event from the callback, and the same event from your server with the responseId as event id, so it counts once. See the Meta Conversions API guide.
  • Not every response is a lead. A quiz or survey may bring many responses and few buyers. Count the ones that qualify, and send those as the main conversion.

Common questions

How do I track Typeform submissions in Google Analytics 4?

Embed the typeform with Typeform's embed code and send a GA4 event, such as generate_lead, from the onSubmit callback. Mark it as a key event.

Why does Typeform show no source for my responses?

The form ran on Typeform's domain or in a frame, so it never saw the page's UTM tags. Forward them with transitiveSearchParams into hidden fields of the same names.

You can count the click with a tagged short link, and keep the tags with utm_ hidden fields on the form's own link. Counting the submission itself needs a redirect to your site or a webhook.

Does a Typeform submission count twice if someone reloads?

The onSubmit callback runs once per submission. A thank-you page counts again on reload, so use the callback, or a webhook with the responseId as event id, when exact counts matter.

Sources

Spotted something wrong or out of date? Email hello@sporetag.com and we will fix it.