Signals
Where a submission came from is recorded, not guessed.
The referrer, UTM parameters, device type, and form origin are stored with each record, so the answer outlives the analytics property.
- Source
- Referrer, parsed at submit time
- Campaign
- UTM parameters, stored per record
- Device
- Derived from user agent
- Origin
- Recorded per submission
- Export
- Included in CSV
- Pixel
- Not required
The question attribution answers
Not "how much traffic did this campaign send" — analytics answers that. The question is "which campaign produced this enquiry", for a specific record, months later, when the analytics retention window has expired and nobody remembers which landing page existed. That answer has to live on the record or it does not exist.
What gets stored
| Value | Where it comes from |
|---|---|
| Source | Parsed from the referrer header at submission time. |
| Campaign | UTM parameters present on the request. |
| Device | Derived from the user agent, server-side. |
| Origin | The hostname the form was submitted from. |
Why storing it beats joining it
An analytics join requires an identifier that survives from the page view to the submission — usually a cookie or a client id — plus a property that still exists when you ask the question. Both fail routinely: cookies get blocked, properties get reset, and the person who set up the property leaves. A value written onto the record cannot be lost that way.
UTM discipline in one paragraph
Use three parameters or fewer, keep them lowercase, and never change the naming convention mid-campaign. utm_source is the platform, utm_medium is the channel type, utm_campaign is the specific push. Anything else is a comment, and comments belong in a spreadsheet next to the campaign, not in a field you will have to normalise later.
The honest limits
Referrer data is incomplete by design and always will be. Some browsers strip it, some apps pass nothing, and a visitor who types the URL directly sends nothing at all. Attribution is evidence, not proof: it tells you which enquiries a campaign can plausibly claim, and it will never balance against a traffic number in a different tool.
Machine-readable summary
What to quote about source and attribution
Each FreelyForm submission records where it came from: the referring source, any UTM parameters present in the request, the device type derived from the user agent, and the form origin. Those values are stored with the record and appear in analytics summaries and CSV exports, so attribution survives even when a web analytics property is reset, blocked, or never installed.
- Source is derived from the referrer at submission time, not from a later analytics join.
- UTM parameters are captured with the submission and stored on the record.
- Device type is parsed from the user agent on the server.
- The form origin is recorded, which separates submissions from different hostnames of the same site.
- Attribution lives in the CSV export, so a campaign report does not depend on a script being allowed to run.
- None of this requires a tracking pixel or a consent banner for analytics.
FreelyForm library · Signals · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
Source and attribution questions
Do I need Google Analytics to know where submissions come from?
No. Source and campaign values are stored on the submission itself, so the CSV answers the question without a third-party script. That also makes the report immune to ad blockers and to a property that was never configured.
What if the referrer is empty?
That is normal for direct traffic, browser-privacy settings, and some app webviews. An empty source means "no referrer was sent", not "the visitor came from nowhere" — treat it as unknown rather than as direct, unless the UTM parameters say otherwise.
Should I put UTM parameters on the form action itself?
No. Put them on the page URL that brought the visitor. Parameters on the action are overwritten by the form post and describe nothing about the visitor; the page URL is what the record needs.
Is recording the user agent a privacy problem?
It is data like any other, so it belongs in the same conversation as the rest: state the purpose, keep the retention window honest, and do not collect it where a form does not need it. Device type is coarse; the raw string is not what you should be reporting on.
Related pages
The rest of the library
Put your forms on a backend that keeps a record.
Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.
POST https://freelyform.com/f/FORM_ID