Tally is generous. Source data is not part of it.
On Tally’s free plan you get as many forms and submissions as fair use allows (tally.so, checked September 2026), with conditional logic, payments, signatures and file uploads thrown in. A genuinely good deal, and it is why people move to it, often from Typeform after its February 2026 free-plan cut, which is covered in free alternatives to Typeform. What it records is what somebody typed. Where that person came from is a separate question, and Tally does not answer it.
The submission
- Every answer the visitor typed
- The time of submission
- Which of your forms it came from
- Uploads, payments and signatures attached to it
Everything before the form
- The channel or campaign that brought them
- The page they first landed on
- What else on your site they looked at
- A tidy source name in place of whatever the link said
| On each submission | Tally on its own | Tally plus Lead Source |
|---|---|---|
| Answers the visitor typed | Yes | Yes |
| Time of submission | Yes | Yes |
| Which form it came from | Yes | Yes |
| Real source and campaign | No | Yes, attached server-side when the form is sent |
| Landing page | No | Yes |
| Pages read on your site first | No | Yes |
| Source resolved to a fixed taxonomy | No | Yes |
| Per-form configuration needed | Hidden fields per form, maintained by you | None. The script on your site handles every embed |
Passing UTMs into Tally by hand
Doing it inside Tally means a hidden field in each form for each parameter, plus a promise that every link and embed passes those parameters through. Visitors who read a second page before enquiring still turn up empty. Then somebody gets to decide what “google” in a spreadsheet column was supposed to mean.
The manual way
- 01In the Tally editor, add hidden fields named
utm_source,utm_medium,utm_campaign,utm_content,utm_term, on this form and every other one. - 02Check that every route to the form, from ad links and landing-page buttons to email footers, passes those names exactly. Test them one by one. A typo produces no error, just a blank.
- 03Know that Tally fills a hidden field when the embed loads, from the page it loads on. Arrive on page one with UTMs, open the form on page three, and the field is empty.
- 04Work out downstream what each raw value meant, and keep six spellings of Google from fragmenting a year of responses into six rows.
With Lead Source
- Paste one script into the head of your site. Once, not once per form.
- Each Tally embed on the site reports a source from that point, and so does the one you embed next quarter. The Tally editor never comes into it.
- The script notes the source on the first page the visitor opens and remembers it while they browse. Three pages later, the Tally submission still gets the campaign.
- The campaign reads as a name, “Google Ads · Brand Search”, and turns up by email, in the dashboard, and in a CRM field by outbound webhook if you want it there.
// Tally builds the form. We are the part that says where the person came from.
Tally attribution when the form is on page three
A Tally embed on your contact page reads the contact page’s address. If the ad sent people straight there, you are covered. If it sent them to a pricing page or a blog post first, you are not.
The UTMs were on the pricing page. The contact page address has none, so the hidden field saves an empty value. Keeping the campaign alive between those two pages is a job for your site, since Tally only exists inside the embed.
Form tracking is how your site does that job. It records the source on the first page, holds it through the visit, and attaches it server-side when the Tally form is submitted.
Why your Tally lead source is blank
When a Tally response has no source, it is nearly always one of these four.
The UTMs stayed on the page the visitor landed on, and the form was elsewhere. The hidden field exists but no link or embed ever passes it a value. The value came through as typed, so google, Google and google.com become three separate rows. Or the form is shared as a tally.so link instead of embedded, and a script on your site never sees it.
The spelling problem throws no error, which is why it lasts. Mapping every raw value to a fixed category is what a lead source taxonomy does, and it keeps twelve months of Tally responses in the same rows.
One line of code. That’s the whole thing.
Create an account and your dashboard hands you one script for the head of the site where your Tally forms are embedded. That is the install. What it looks like is below, with a placeholder where your own key goes.
Lead source tracking installs in a few minutes, and the same script covers any other form on the site as well as Tally. For a view of what your Tally responses hold today, try the source your forms are capturing today.
<!-- Paste your real snippet from app.leadsource.co --> <script src="https://app.leadsource.co/js/ls.js" data-key="YOUR_SITE_KEY" defer></script>
Your snippet is created at signup and waits on the dashboard’s install page. It runs on your pages, outside Tally, so the Tally editor stays as it is.