Submission source
What it is
Every form submission can carry provenance — a short record of where it came from. It has three parts, stored alongside the submission:
source— the channel the submission came from. This is the important one: it's a first-class, indexed value you can filter and report on (e.g.facebook,google-ads:summer,chatbot,hiring).referrer— the page the submitter came from. If your integration doesn't set it explicitly, the platform fills it in from the request'sReferer/Originheader.metadata— any extra free-form key/values your integration wants to keep.
The platform never invents a source. If a submission doesn't arrive with one,
its source stays empty — there are no false positives in your reporting. Built-in
entry points set a source when they genuinely know the channel (the chatbot sends
chatbot, the hiring flow sends hiring); website and API submissions forward
whatever your integration passes.
For CRM lead-source reporting, a meaningful custom source (an ad campaign, a
named referral flow) is what shows up. The bare channels (api, website,
chatbot, hiring) fall back to the form's own form:<slug> source so they
don't overwrite it.
Source vs. referrer
They sound similar but answer different questions, and it's worth keeping them straight:
- Source — which channel produced this? A deliberate, human-meaningful
label for the marketing channel or campaign behind the submission. You (or a
known entry point) choose it:
facebook,google-ads:summer,newsletter,qr-flyer. It's what lead-source reporting is built on, it's indexed for filtering, and BusinessDash never guesses it — if you don't set it, it stays empty. - Referrer — what web page were they on just before? The technical HTTP
referrer: the URL the browser came from. It's captured automatically from
the request's
Referer/Originheader (or you can pass one), so it's incidental context rather than a label you curate.
| Source | Referrer | |
|---|---|---|
| Answers | Which channel / campaign | Which web page they came from |
| Example | google-ads:summer | https://example.com/pricing |
| Who sets it | You / a known entry point (deliberate) | Captured from the request (automatic) |
| Shape | A short label you choose | A full URL |
| Used for | Lead-source reporting + filtering (first-class, indexed) | Supplementary context |
| If absent | Stays empty — never guessed | Falls back to the Referer / Origin header |
| Reliable? | As reliable as you make it | Often missing (direct visits, privacy modes, cross-origin) |
The practical upshot:
- Use
sourcefor attribution. It answers "where do our leads come from?", so set it deliberately on every channel — tag your ad links, your newsletter, your QR codes. Pair it with Posted at to keep channel names consistent. - Treat
referreras a hint, not a system of record. It's handy extra context ("they were on the pricing page"), but browsers drop it for direct visits, privacy modes, and many cross-origin navigations — so never rely on it for reporting. - They're independent. A submission can have a referrer but no source (someone arrived from Google and submitted, but you didn't tag a channel) — which is exactly why Require Submission Source checks the source and ignores the referrer.
Require Submission Source
In Settings → Require Submission Source you decide whether a source is optional or mandatory.
This toggle checks the source specifically — not the referrer. A submission
that has a referrer but no source still counts as "sourceless".
| Off (default) | On | |
|---|---|---|
| Submission with a source | Stored | Stored |
| Submission without a source | Stored (source left empty) | Rejected before it's stored |
| Where it's enforced | — | Every entry point: website, API, chatbot |
| Submitter sees | Success | A "source required" error |
When it's on, a sourceless submission is rejected server-side and never written — at all ingest paths, not just one — so you can't accumulate unattributed records.
How to use it
Define your channels
List where the form is shared on the Posted at setting so the sources you expect are written down.
Make sure real traffic carries a source
Built-in channels handle this for you. For your own embeds or SDK calls, pass a
source when you submit (e.g. tag a campaign link as google-ads:summer).
Decide whether to enforce it
Leave Require Submission Source off to capture everything; turn it on once you're confident every legitimate submission is tagged.
What to expect — with vs. without
- Without enforcing it (the default): you capture every submission. Some rows simply have an empty source. This is the safe choice while you're still wiring up attribution.
- With it enforced: every stored submission is guaranteed to be attributable to a channel, which keeps lead-source reports clean. The trade-off is real — any legitimate submission that arrives with no source (for example, someone opening the raw form URL directly with no referrer and no source parameter) will be turned away. Only enable it when your real traffic always carries a source.
Turning this on without first confirming your channels set a source can silently reject good submissions. Verify your embeds/links pass a source, then enable it.