A lead is worth much more when you know what produced it. Send tracking_data with an enquiry and Gorilla Dash works out the source — Paid Search, Organic Social, Referral and so on — and shows it against the lead, in your reports, and in the source breakdown.
Send nothing and every lead is filed as Direct. That is not Gorilla Dash failing to detect the source; it is Gorilla Dash correctly reporting that nothing was told to it.
The shape
tracking_data is an array. Each entry is one parameter the visitor arrived with.
| Key | Required | What it is |
|---|---|---|
parameter | Yes | The parameter name — utm_source, gclid, referrer, or anything of your own. |
value | No | Its value. |
path | No | The page path the visitor was on when it was captured, such as /quote. |
session_at | No | When the visitor arrived with it. An ISO 8601 timestamp. Drives first and last touch. |
"tracking_data":[{"parameter":"utm_source","value":"google","path":"/quote","session_at":"2026-09-01T09:14:00+10:00"},{"parameter":"utm_medium","value":"cpc","path":"/quote"},{"parameter":"gclid","value":"Cj0KCQ..."}]
You are not limited to a fixed list. Send whatever your campaigns use — utm_campaign, utm_term, utm_content, msclkid, ttclid, an internal promo code. Gorilla Dash stores all of them and shows them against the lead, even the ones it does not recognise as a source signal.
The one parameter people forget
referrer, whose value is the host the visitor came from — google.com, facebook.com, news.example.com. It is the only way Gorilla Dash can tell Organic Search from Organic Social from Referral, and it is the single most common omission in a hand-built integration.Send the host, not the whole URL. A full URL is accepted and the host is read out of it, but the host on its own is cleaner and avoids storing a visitor's browsing path.
How the source is decided
Gorilla Dash works down this list and stops at the first rule that matches. Order matters: a lead carrying both a Google Ads click id and a Facebook referrer is Paid Search, because paid signals outrank organic ones.
| Source | What triggers it |
|---|---|
| Paid Search | gclid, gbraid or wbraid present, or utm_medium of cpc, ppc or googlead. |
utm_medium of email, or utm_source of email, newsletter or mailchimp. | |
| Paid Social | utm_medium of paid_social, sponsored, boosted or display; a utm_source that is a social network domain; or fbclid. |
| LLM Model | A referrer from an AI assistant, or a utm_source of chatgpt, gemini, copilot, claude, perplexity or bard. |
| Google My Business | utm_source of gmb or googlemaps, or utm_campaign of Google My Business. |
| Organic Search | A referrer from a search engine, or utm_source of google or bing. |
| Organic Social | A referrer from a social network. |
| Referral | Any other referrer. |
| Direct | Nothing matched, or nothing was sent. |
The domain lists behind those rules are broad. Search covers Google, Bing, Yahoo, DuckDuckGo, Yandex, Baidu, Ecosia, Brave and others. Social covers the obvious networks plus messaging apps and review sites such as Yelp, Trustpilot, Glassdoor, G2, Capterra and Tripadvisor. Subdomains are matched too, so l.facebook.com counts as Facebook.
First touch and last touch
If your tracking data spans more than one visit, Gorilla Dash also records how the customer first found you and what brought them back to convert.
- First touch — the source calculated from the earliest
session_at, plus everything within the following hour. - Last touch — the source calculated from the latest
session_at, plus everything in the hour before it. - Time to enquiry — how long passed between that first touch and the enquiry itself.
The hour-wide window is what groups the parameters of one visit together, so a single arrival carrying utm_source, utm_medium and gclid counts as one touch rather than three.
None of this works without session_at. Send only what the visitor arrived with on the final visit and first touch and last touch will both be that visit, which is accurate but not very useful.
What happens to session_at
Timestamps are checked before they are stored. Anything more than a year old, more than a day in the future, or unparseable is replaced with the moment the enquiry was received. Rows with no timestamp at all get that same moment — one shared instant for the whole submission, so an untimestamped payload stays a single touch rather than being smeared across several.
Always include a time zone offset. A bare 2026-09-01 09:14:00 is read as UTC, which will silently shift your attribution by hours.
Collecting the data in the first place
If the lead comes from your own website, capture parameters on every landing and keep them until the visitor converts. The Gorilla Dash tracking script does exactly this: on each page it records the referring host as referrer, every query-string parameter as its own entry, the page path, and the visit time — then hands the accumulated set over when a form is submitted.
Copy that pattern in your own integration. Store the entries in the visitor's browser, add to them on each visit rather than replacing them, and send the whole set with the enquiry. That is what makes multi-visit attribution possible.
If the lead comes from somewhere else — a Meta lead form relayed through Zapier, a partner feed — send whatever that source knows. Even a single {"parameter":"utm_source","value":"facebook_lead_ads"} is far better than nothing, and session_at is optional precisely so those senders can still attach attribution.
Naming your own sources
Beyond the calculated source, you can define your own named sources and the parameter values that trigger them — so a lead carrying utm_campaign=spring-sale is labelled "Spring Sale" in plain English throughout Gorilla Dash.
- Open Enquiries and choose URL Parameter List to see every parameter your leads are actually arriving with.
- Choose URL Sources to create named sources and link them to those parameters and values.
- Use Source Report to see the breakdown.
The named sources attached to each lead come back on the API as enquiry_sources, alongside the calculated calculated_source.
Fixing attribution after the fact
If you sent a lead with no tracking data, or the wrong tracking data, you can replace it with PUT /enquiries/{id}. The source, first touch and last touch are all recalculated from what you send. See the guide on updating an enquiry.
Common problems
| Symptom | Likely cause |
|---|---|
| Everything is Direct | No tracking_data is being sent at all, or none of it reaches the enquiry payload. |
| Organic traffic shows as Direct | No referrer entry. Add it. |
| Paid clicks show as Organic Search | utm_medium is missing or capitalised, and there is no click id. |
| First touch always equals last touch | No session_at, or you are only sending the final visit. |
| Attribution is hours out | session_at sent without a time zone offset. |
| A parameter is stored but ignored | It is not one of the recognised source signals. Give it meaning with a named source under URL Sources. |