Tally is generous. Source data is not part of it.
Tally gives you unlimited forms and unlimited submissions on its free plan within fair use guidelines, per tally.so, checked September 2026, and it includes conditional logic, payments, signatures and file uploads at no cost. 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
- The pages they read before enquiring
- Any resolution of a raw parameter to a real source name
| 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, captured server-side at submission |
| Landing page | No | Yes |
| Full page journey before the form | No | Yes |
| Source resolved to a fixed taxonomy | No | Yes |
| Per-form configuration needed | Hidden fields per form, maintained by you | None. One script covers every form |
Passing UTMs into Tally by hand
The standard recipe runs like this. Add a hidden field per form for every parameter you care about, and make sure every link to the form carries those parameters. Accept that anyone who reads a second page before enquiring arrives with nothing, then work out, downstream, what “google” in a spreadsheet column actually meant.
The manual way
- 01Open each form in the Tally editor. Add a hidden field for
utm_source,utm_medium,utm_campaign,utm_content,utm_term. Repeat for every form you run. - 02Update every link that points at the form. In ads, on landing pages, in email footers, then test each one, because a mistyped parameter fails silently.
- 03Accept that a hidden field reads the URL at the moment the form loads. A visitor who lands with campaign parameters, reads two more pages and then opens the form arrives with a bare URL and an empty field.
- 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.
- Every Tally form embedded on that site is tracked from then on, including forms you add later. No hidden fields to maintain.
- The source is recorded on the first page load and held for the whole session, so a visitor who reads three pages before enquiring still arrives with the campaign that brought them.
- Source recorded with the campaign name written out: “Google Ads · Local Services Sydney”. Delivered to your inbox, your dashboard, and a CRM field via outbound webhook if you use one.
// Tally builds the form. We are the part that says where the person came from.
Tally attribution across multiple page views
A hidden field takes its value from the URL the form loads on. Click an ad and fill the form on that same page load and it works. Most visits are not that tidy.
Somebody arrives with campaign parameters, reads two more pages, then opens the form. By then the URL is bare and the hidden field has nothing to read. The value has to be held from the first page through to the form and attached at submission. Tally leaves that part to you.
Form tracking is the piece that holds it. The source is recorded on the first page load, held for the whole session, and attached server-side at submission.
Why your Tally lead source is blank
Blank source data almost always comes down to one of four things.
The session was not held, so the parameters stayed on the landing page while the visitor moved on, or the field exists and nothing writes to it, so every response arrives empty, which looks like a tracking gap and is a configuration gap, or nothing resolved the value, so Google arrives under three spellings and no report will group them, or the form is hosted on tally.so rather than embedded on your own site, so there is no page of yours for a script to run on.
The third is the quiet one. Resolving a raw parameter to a fixed category is what keeps a year of responses comparable, and that is what a lead source taxonomy is for.
One line of code. That’s the whole thing.
Sign up, copy the script from your dashboard, paste it into the head of your site. Every Tally form embedded on that site is tracked from then on, including forms you add later. The block below shows the shape of it. Your real one has your account key baked in.
Lead Source installs in a few minutes, and one script covers every form on the site, Tally or otherwise. Curious what your forms record right now? Look at the source your forms are capturing today.
<!-- illustrative. Paste your real snippet from app.leadsource.co --> <script src="https://app.leadsource.co/js/ls.js" data-key="YOUR_SITE_KEY" defer></script>
The real snippet is generated for your account when you sign up. Copy it from the install page in the dashboard. It runs on your site, not inside Tally, so there is nothing to configure in the Tally editor.