---
title: "Understanding Attribution : All-In-One Guide"
description: "Understand how native attribution, UTMs, sources types, and conversions work in Aesthetix CRM."
url: https://help.aesthetixcrm.com/en/articles/1344-understanding-attribution-all-in-one-guide
collection: "Reporting & Dashboards"
updated: 2026-11-04
language: en
---

# Understanding Attribution : All-In-One Guide

Understand how native attribution, UTMs, sources types, and conversions work in Aesthetix CRM.

_This article explains how attribution works, what events trigger attribution capture, and how to read the data so you can see which marketing channels are actually driving patients through your door._

* * *

## What is Attribution?

Attribution is the answer to the question every practice owner asks: _"Where did this patient actually come from?"_

When someone interacts with your website, landing page, booking calendar, or chat widget, Aesthetix CRM captures a snapshot of how they got there — the URL they were on, what referred them, and any tracking parameters that were attached. We then categorize that snapshot into a clean source label like **Paid Search**, **Paid Social**, or **Organic Search**.

That label gets attached to the contact record. Over time, you can roll those labels up into reports to see which channels are producing the most leads, the most consults, and the most revenue.

* * *

## First Attribution vs. Latest Attribution

Every contact in Aesthetix CRM stores **two** attribution records: First and Latest. They serve different purposes and answer different questions.

<table data-id="0b299d9c-3fb3-4657-b1c1-e28baa407ad6" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="16577839-ae28-4e68-9e4a-ac81afc416ea"></p></td><td colspan="1" rowspan="1"><p data-id="dbdbcb9b-f4f9-44c0-bf8c-b12d730f17b9"><strong>First Attribution</strong></p></td><td colspan="1" rowspan="1"><p data-id="47d2a54c-e371-40ad-8d2f-c5b3f1feb3d9"><strong>Latest Attribution</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f9c75cbe-f543-4293-9688-f92460e0d7b6"><strong>Captures</strong></p></td><td colspan="1" rowspan="1"><p data-id="dec15058-c8b9-4325-b8eb-56c5a25a73a8">The very first interaction the contact ever had with your business</p></td><td colspan="1" rowspan="1"><p data-id="fd50fd42-7f11-43db-b1e9-5d8c92276c07">The most recent interaction the contact has had with your business</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9fba8629-135d-4f99-b580-4349508fd214"><strong>Changes over time?</strong></p></td><td colspan="1" rowspan="1"><p data-id="e324d7b9-4a8d-4bc4-8cf8-9ab1ff84967f">No — locked in forever after the first capture</p></td><td colspan="1" rowspan="1"><p data-id="a784c698-d7c2-496e-8aee-014bcb5c44ae">Yes — overwritten on every new tracked interaction</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c245b196-6d76-40bb-81d9-805616b0f4c1"><strong>Best used for</strong></p></td><td colspan="1" rowspan="1"><p data-id="3e427b2e-639e-4402-b6ac-6eeb97d398e6">Understanding which channels <em>introduce</em> new patients to your practice</p></td><td colspan="1" rowspan="1"><p data-id="ebf567fe-9df4-448a-9b57-8fa58d4fe6d8">Understanding which channels <em>re-engage</em> existing contacts and drive conversions</p></td></tr></tbody></table>

### A real-world example

A prospective patient sees an Instagram Reel about your CoolSculpting promo and taps through to your landing page. They fill out a "What Treatment Is Right for Me?" quiz.

-   **First Attribution = Paid Social** (Meta Ads)
    
-   **Latest Attribution = Paid Social** (Meta Ads)
    

Three weeks later, that same person Googles your practice name, clicks the organic result, and books a consult through your online calendar.

-   **First Attribution = Paid Social** _(unchanged — this is locked in)_
    
-   **Latest Attribution = Organic Search** _(updated to the most recent interaction)_
    

This is why both data points matter. First Attribution tells you what brought them in the door initially. Latest Attribution tells you what closed the loop.

* * *

## Where to find attribution data on a contact

Both First and Latest attribution live on every contact record.

1.  From the left navigation, click **Contacts**.
    
2.  Open any contact record.
    
3.  Scroll to the **Activity** tab in the right-hand column.
    
4.  Attribution data appears in the panel at the bottom right.
    

Each attribution record displays a detailed breakdown of the visitor's session. Here's what every field means:

<table data-id="8ca6eedb-c065-41bc-8010-fa43fd12bb29" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="27586d62-76b2-43b6-855c-4abc29fe26d5"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="4b89599a-d738-4ff1-823b-cf9a975be30c"><strong>What it captures</strong></p></td><td colspan="1" rowspan="1"><p data-id="814c50a7-d3f3-4034-9bc9-13b00077b441"><strong>Example</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c960ebf3-e0a3-4e95-8be1-3035435e8399"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="4d77ea0a-4dd9-4fe7-b240-8e7a1c32bd46">The categorized source label assigned by the rules engine</p></td><td colspan="1" rowspan="1"><p data-id="148ee32a-ccfe-4cc3-85e9-eca0b5b0eceb"><code>Paid Search</code>, <code>Organic Search</code>, <code>Direct Traffic</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="00194bfb-c2e4-4e20-b319-a6e011f37e47"><strong>Session URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="f962af93-af71-4d6f-8500-a3798d2b9d44">The first page the visitor landed on during the session that produced the conversion</p></td><td colspan="1" rowspan="1"><p data-id="01b3d731-5bf8-4810-bec8-b9f2adf5fdc6"><code>https://yourpractice.com/procedures/botox/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d3036109-73c6-4b86-8c14-771ea5162281"><strong>Page URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="896eb297-e626-4f2d-83c4-608757c34b0c">The actual page where the form, calendar, or chat conversion happened</p></td><td colspan="1" rowspan="1"><p data-id="b304b96a-c2d0-461d-9817-56f1c84e03a3"><code>https://yourpractice.com/contact/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b1b035bc-4050-4618-9c26-f591f2f53216"><strong>Referrer</strong></p></td><td colspan="1" rowspan="1"><p data-id="e380fc8c-9fa2-460c-8859-5bdc216c00d7">The website that referred the visitor (may be empty for direct traffic)</p></td><td colspan="1" rowspan="1"><p data-id="8de24704-5526-4f06-8361-02af09c4909b"><code>https://www.google.com</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="83170f95-e068-4d4d-9542-0258fab1e8b4"><strong>Campaign</strong></p></td><td colspan="1" rowspan="1"><p data-id="81a83f08-ed57-40a8-87bc-f6a215031253">The friendly campaign name (from <code>utm_campaign</code>)</p></td><td colspan="1" rowspan="1"><p data-id="68d639ca-0f38-4abc-a8b9-d8a3137a81a2"><code>summer_botox_promo</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="25592c78-f7a5-444c-b1aa-b68d8d50d6af"><strong>Campaign ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="a3ea8c06-361c-477a-ae37-46bc0fc93174">The platform-assigned campaign ID (from <code>campaign_id</code>)</p></td><td colspan="1" rowspan="1"><p data-id="73007962-da15-44ca-a31e-7bedab6a58fe"><code>123456789</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="adf4c1c7-7972-44a5-b2d1-ac07ff5e6d1f"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="3c01d7ce-0225-452e-a36d-e2fe2b1634ab">The type of conversion event that captured the data</p></td><td colspan="1" rowspan="1"><p data-id="5ce6a302-db3a-4bd1-a9ab-7160b93812ff"><code>form</code>, <code>calendar</code>, <code>chat</code>, <code>survey</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2dd59565-7738-4db9-81bf-36a4f3015b8c"><strong>Medium ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="9cec69c2-3908-4543-bde6-8ef7f629c248">The unique ID of the specific form, calendar, or widget that fired the event</p></td><td colspan="1" rowspan="1"><p data-id="df83d90b-2d35-40d0-822f-70fa5f8893d8"><code>fWPi83xs3wMNJB1peC4j</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d7644206-e461-4a30-87f7-27c13cf42d6a"><strong>Submission ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="9f3cf15d-fb79-4b13-9e1d-f7d2e9cebcaa">The unique ID of the conversion event itself</p></td><td colspan="1" rowspan="1"><p data-id="89e859a1-239c-4101-ac1d-1f684e65c6e7"><code>c84a816a-4f39-4193-9b17-1b763eba75ca</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="36387a71-915b-43ac-a3e1-0bc6bafc8d74"><strong>UTM Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="b1670f35-4cf6-4707-97b7-4b53131309d5">The <code>utm_source</code> parameter from the landing page URL</p></td><td colspan="1" rowspan="1"><p data-id="c8b403a5-07a6-47e2-8e34-27146fd10eb1"><code>adwords</code>, <code>fb_ad</code>, <code>direct</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8f049557-c2a1-4c1c-9d3b-decb95d9695e"><strong>UTM Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="21dd3f2c-8ed8-43b4-8b7c-92e8aec2e1dd">The <code>utm_medium</code> parameter from the landing page URL</p></td><td colspan="1" rowspan="1"><p data-id="f0d02a54-135b-4879-a480-da301673e4f4"><code>{adname}</code>, <code>{{adset.name}}</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ecf832e8-5a49-4352-a0fd-e57b60bc99a7"><strong>UTM Content</strong></p></td><td colspan="1" rowspan="1"><p data-id="5e9e7f57-b2d6-4924-b766-35b39af7fe85">The <code>utm_content</code> parameter from the landing page URL</p></td><td colspan="1" rowspan="1"><p data-id="8261be45-58f2-48fa-a886-41791439ab5d"><code>{adgroupname}</code>, <code>{{ad.name}}</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="39060a45-ec1f-4bdf-bcc7-7f881f3c4a20"><strong>UTM Event Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="a2ad131f-bf8b-4c7a-8fab-e7093ef35e1c">A normalized summary label of the source signal</p></td><td colspan="1" rowspan="1"><p data-id="ee449918-4408-47fc-952a-96bfe7f103a5"><code>direct</code>, <code>bing organic</code>, <code>google paid</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="aac6aa3e-f9b2-4b36-b85d-0ca3f687d15c"><strong>gclid</strong></p></td><td colspan="1" rowspan="1"><p data-id="5d5f5350-d141-4fdc-9ae1-ff5dd6ccefc1">Google Ads click ID (auto-appended to ad clicks when auto-tagging is on)</p></td><td colspan="1" rowspan="1"><p data-id="a6de06ca-c56a-4860-9b59-98d8667ea989"><code>CjOKCQjwnNyUBhCZARISA...</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="26f95fd4-f322-405d-9b9a-32e562e59f81"><strong>fbclid</strong></p></td><td colspan="1" rowspan="1"><p data-id="564e8e6c-a53c-4d4f-a46c-1f81481c2801">Facebook/Meta click ID (auto-appended to Meta ad clicks)</p></td><td colspan="1" rowspan="1"><p data-id="63b4f597-a3b9-4ae4-b750-a8035e706887"><code>IwAR1Sv...</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a7bc15f8-bbee-47d5-85cb-c5d176c21fcf"><strong>msclkid</strong></p></td><td colspan="1" rowspan="1"><p data-id="20e55214-62ec-48b4-96f8-6bbfd4130258">Microsoft/Bing Ads click ID</p></td><td colspan="1" rowspan="1"><p data-id="e5c65d68-badb-469c-bdc3-63fcc78dec23"><code>abc123...</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="256cccc5-62df-4bb7-a849-7abb1b3a0408"><strong>dclid</strong></p></td><td colspan="1" rowspan="1"><p data-id="ec16f38b-8b8c-448a-aafe-be2598516cd9">Display &amp; Video 360 / Google Display click ID</p></td><td colspan="1" rowspan="1"><p data-id="de49edfc-9ebf-401b-a4c5-cf17afa3ef2f"><code>CL_8...</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b6042c3d-293b-420a-be04-8703e456f8ba"><strong>fbc</strong></p></td><td colspan="1" rowspan="1"><p data-id="6d041c15-82a5-46b8-a24b-ada4f4467d76">Meta click cookie value (server-side tracking)</p></td><td colspan="1" rowspan="1"><p data-id="8d0c98cf-db7d-4c73-aa92-afaa137396af"><code>fb.1.1700000000.IwAR...</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="897ded62-d072-473e-a370-9faffcebc503"><strong>fbp</strong></p></td><td colspan="1" rowspan="1"><p data-id="6a5ded01-e472-48c6-aed4-4edd3a95d1a2">Meta Pixel browser cookie value (used by Meta Conversions API)</p></td><td colspan="1" rowspan="1"><p data-id="79bc64a3-b2e4-41ad-90c7-9e2c05d042ce"><code>fb.1.1777334716612.32642929282004571</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f92769a0-e0f0-4d50-9930-516c8caf8899"><strong>FB Event ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="c8ae3f47-ab18-4838-888b-cdbb5813b9cd">Unique event ID for deduplication when sending to Meta CAPI</p></td><td colspan="1" rowspan="1"><p data-id="004d5cf9-bb23-43ec-9dfd-63cc17e6b53d"><code>572584e1-e9f1-458e-bb87-b8b0fb270124</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cfde68a2-5148-431d-a42d-259f09348eb0"><strong>GA Client ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="ad78d0b7-39f2-46db-8f83-13271ae0f802">Google Analytics client cookie value</p></td><td colspan="1" rowspan="1"><p data-id="0c22baba-ae75-4049-8ede-a9ed6e3f07eb"><code>GA1.1.1928254996.1777334717</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4fdbd428-d448-4db4-990c-8ae4e710e7c6"><strong>User Agent</strong></p></td><td colspan="1" rowspan="1"><p data-id="1fe5d0fc-771a-44df-ace4-d0478ffa40d2">The browser and device used</p></td><td colspan="1" rowspan="1"><p data-id="9e38c77a-b4f1-4d62-a235-4722c08486be"><code>Mozilla/5.0 (iPhone; CPU iPhone OS 18_7...)</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="962e86df-6535-4698-a996-ff7ce279e887"><strong>IP</strong></p></td><td colspan="1" rowspan="1"><p data-id="ea5ec31a-e3da-4fd6-aef3-18c29366d126">The visitor's IP address (used for geolocation and fraud detection)</p></td><td colspan="1" rowspan="1"><p data-id="261c3ca3-68ba-46e3-81d2-eb57e1d8e007"><code>2600:8801:afc0:55::1019</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="da5f9716-8316-4870-8d63-af7f728557d6"><strong>Visitor ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="0c0b015e-a57b-41b4-bd0d-074e364ec1c1">Unique ID assigned to each chat widget visitor (for session continuity)</p></td><td colspan="1" rowspan="1"><p data-id="e909aff3-aaea-4a23-b9b4-419cb7718510"><code>ve9EPM428h8vShlRW1KT</code></p></td></tr></tbody></table>

### Session URL vs. Page URL — what's the difference?

This is the single most important field distinction to understand, and it trips up almost everyone the first time they read attribution data.

-   **Session URL** = where the visitor _first landed_ during that session (their entry point to your site)
    
-   **Page URL** = where the conversion event _actually happened_ (the page hosting the form they submitted)
    

A visitor might land on `/procedures/coolsculpting/` from a Google search (that's the Session URL), browse around, and finally submit a form on `/contact/` (that's the Page URL). The attribution **rules are evaluated against the Session URL** — because the entry point is where the original UTMs, referrer, and source signals live. By the time the visitor reaches your contact page, those signals are usually gone.

This is also why the Session URL is incredibly useful on its own: even when no UTMs are involved, it tells you exactly which page on your site is doing the work of converting cold visitors into leads.

* * *

## Attribution data in custom contact fields

In addition to the native attribution panel on the Activity tab, Aesthetix CRM also auto-populates a set of **custom contact fields** with the most useful attribution values. These fields are filled in automatically by a workflow that runs on every new lead capture — so any contact created through one of your lead capture forms will have these custom fields populated alongside the native attribution data.

### Why these custom fields exist

The native attribution data on the Activity tab is great for inspecting a single contact, but it has a few limitations:

-   It's not included in standard **CSV exports** — exports only include flat contact fields, not the nested attribution panel
    
-   It can't be used directly as **merge fields** in emails, SMS templates, or workflow conditions
    
-   It's not available as a column in **list views** or as a filter in [**smart lists**](https://help.aesthetixcrm.com/en/articles/1453-smart-lists.md)
    

By copying the most-used attribution values into custom contact fields, those values become first-class contact data — exportable, filterable, mergeable, and usable in any workflow logic without needing to query the API.

### The default mapped fields

<table data-id="03885316-687c-4b0f-94b8-79869e2e0fa8" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="b70f627e-d372-4745-b4eb-8fc00f24d17c"><strong>Custom Contact Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="4608345d-10ab-4dfe-9769-806735d36e0d"><strong>Mapped From</strong></p></td><td colspan="1" rowspan="1"><p data-id="db117448-dc73-4ad9-b981-3339179e2f12"><strong>What It Contains</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d61b572c-36af-40a7-a262-726521cd23ac"><strong>First Attribution Session Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="1ebb0353-101b-4d70-81c0-5d71e306f1b6">First Attribution → Session Source</p></td><td colspan="1" rowspan="1"><p data-id="eea1801c-262f-41dd-99b9-581d99e840e2">The source category from the <strong>first</strong> time this contact ever converted (Paid Search, Organic Search, Direct Traffic, etc.) — locked in forever after first conversion</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="937b174f-3d37-4f92-82f4-149158e096cc"><strong>Last Attribution Session Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="e891f051-704f-4b42-92c3-b92a2270f9a3">Latest Attribution → Session Source</p></td><td colspan="1" rowspan="1"><p data-id="e290e5c9-dcde-4846-b2f4-decef1e7f22f">The source category from the <strong>most recent</strong> conversion — updates every time the contact triggers a new conversion event</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a3963150-7137-4c10-b4b6-f1199172a5e2"><strong>UTM Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="10933e47-a895-44a9-9251-63750ea4d871">Latest Attribution → utmSource</p></td><td colspan="1" rowspan="1"><p data-id="42a09c8e-05f5-403e-9385-73f9f55df62a">The <code>utm_source</code> value from the most recent conversion (e.g., <code>adwords</code>, <code>fb_ad</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d637a83f-dbd8-4583-a507-b3156e82fca0"><strong>UTM Campaign</strong></p></td><td colspan="1" rowspan="1"><p data-id="adea825d-d4b7-47ef-83bf-dc80a8b3e413">Latest Attribution → campaign</p></td><td colspan="1" rowspan="1"><p data-id="916c1e52-3454-4811-bc75-9e6481323bda">The campaign name from the most recent conversion</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c099dbfc-018a-418c-b2d1-7c1d9121e3f9"><strong>UTM Content</strong></p></td><td colspan="1" rowspan="1"><p data-id="da4a2802-8942-48a8-9f17-832de85ff385">Latest Attribution → utmContent</p></td><td colspan="1" rowspan="1"><p data-id="ba81ef2e-6a58-4bcb-a6fe-8d2082d348d8">The ad content / variant identifier from the most recent conversion</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="981d513e-4531-40a6-921c-7f6eac3413e9"><strong>Attribution - Source URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="88c65d0d-0c0b-4836-8b09-b37ae4b53b27">Latest Attribution → url</p></td><td colspan="1" rowspan="1"><p data-id="0516a98b-3b2c-4573-aa09-cd90dcc8769a">The full landing URL from the most recent conversion (with all parameters)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ec1ebfca-1d69-4af1-ba4e-be88540fc1df"><strong>Attribution - GCLID</strong></p></td><td colspan="1" rowspan="1"><p data-id="391f3b72-3225-4ada-9623-b3c9a90e4b66">Latest Attribution → gclid</p></td><td colspan="1" rowspan="1"><p data-id="152eee6f-d978-4a56-a62f-305973bbd452">The Google Ads click ID from the most recent conversion</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cfd63f4c-e37b-4b92-80e2-dd4460330cad"><strong>Attribution - FBCLID</strong></p></td><td colspan="1" rowspan="1"><p data-id="b7b1fdd4-af0b-41dc-8080-ede4cc66a84b">Latest Attribution → fbclid</p></td><td colspan="1" rowspan="1"><p data-id="5d8aec60-9d95-4d78-91a3-f5f0de6f038a">The Meta (Facebook/Instagram) click ID from the most recent conversion</p></td></tr></tbody></table>

#### Attribution merge field reference (for building workflows and templates)

If you want to map additional attribution values into custom fields, populate them in your own workflows, or use them as merge fields in email/SMS templates, here are the exact merge field paths.

The attribution data is exposed as two objects on the contact:

-   attributionSource → First Attribution (locked at first capture)
    
-   lastAttributionSource → Latest Attribution (updates on every conversion)
    

Both objects have the same field structure. Replace lastAttributionSource with attributionSource in any of the paths below to reference First Attribution instead.

<table data-id="caa1dc3e-2641-41e8-9c75-930547fb96de" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="13056464-fe1b-4dee-b4d6-247aa70c8598"><strong>Value</strong></p></td><td colspan="1" rowspan="1"><p data-id="e8d347f6-2992-4409-977c-6b98326d3ec2"><strong>Merge Field Path</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="69205efe-d8ca-4b17-a13a-16274b0a0333">Source URL (where the conversion happened)</p></td><td colspan="1" rowspan="1"><p data-id="bf6e4e7e-4dd6-4db2-afa7-31f109668a42">{{contact.lastAttributionSource.url}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5b428ede-dd4b-40dd-8257-c5c14b3b9b86">Referrer</p></td><td colspan="1" rowspan="1"><p data-id="63a3e1c3-b7fb-43a1-8187-c6dbb92d7b68">{{contact.lastAttributionSource.referrer}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5e862683-f82d-427a-b421-cf38836469c1">utm_source</p></td><td colspan="1" rowspan="1"><p data-id="770034f2-8583-49ce-9704-df4353c84e2e">{{contact.lastAttributionSource.utmSource}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0f8cc363-87b6-4b5e-a283-86e4a0331c94">utm_medium</p></td><td colspan="1" rowspan="1"><p data-id="1093b5d4-1bad-4188-b235-bca216ce475d">{{contact.lastAttributionSource.utmMedium}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="437fe878-2274-4c7d-87ee-cd7296b66b03">utm_content</p></td><td colspan="1" rowspan="1"><p data-id="5372397f-dfae-46cc-8b24-dde8cacbca3d">{{contact.lastAttributionSource.utmContent}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="294fc5c3-ad27-4fd4-b4d8-80bdf9d10a3d">utm_campaign</p></td><td colspan="1" rowspan="1"><p data-id="82fd7a44-ef85-4a9f-995a-2071f06da0e3">{{contact.lastAttributionSource.campaign}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4face9e9-059a-45b4-9a65-fc0ce0db72f1">Campaign ID</p></td><td colspan="1" rowspan="1"><p data-id="8e606185-7db8-4c9f-ba7d-5ae5b9315370">{{contact.lastAttributionSource.campaignId}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="821d610f-574b-4630-ada3-7e2a98e5f620">Google Ads click ID</p></td><td colspan="1" rowspan="1"><p data-id="b7a678a1-3853-4c6b-9cf5-5376a2d8e8ca">{{contact.lastAttributionSource.gclid}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8ec36898-4617-4f45-b289-ea23ae517e6d">Meta (Facebook/Instagram) click ID</p></td><td colspan="1" rowspan="1"><p data-id="3dde3eac-9fc2-4ed2-a5d4-28ad9d9da4e5">{{contact.lastAttributionSource.fbclid}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ab4e79b3-7a4d-4111-a914-1268324cf06e">Microsoft/Bing Ads click ID</p></td><td colspan="1" rowspan="1"><p data-id="01bab7a9-7577-434a-b30a-051341a0f601">{{contact.lastAttributionSource.msclkid}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a1c604ec-413d-4e7d-af37-56f689d226a8">Display &amp; Video 360 click ID</p></td><td colspan="1" rowspan="1"><p data-id="dcdd3aae-9e30-42e3-bc55-113f71357980">{{contact.lastAttributionSource.dclid}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="be7e33fd-208c-44f6-8c1d-b8c601dfe778">Meta click cookie</p></td><td colspan="1" rowspan="1"><p data-id="9c040a46-4623-4924-92db-3b097e863597">{{contact.lastAttributionSource.fbc}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="80e9d7b6-fc29-4d03-b233-db62ff94959c">Meta Pixel browser cookie</p></td><td colspan="1" rowspan="1"><p data-id="02620d7e-7e69-4ad3-b97c-48a936ef3dfd">{{contact.lastAttributionSource.fbp}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3f4e0ce1-1a3b-440c-9c00-ed78d1c14caa">Meta CAPI Event ID</p></td><td colspan="1" rowspan="1"><p data-id="1e1e9208-624e-47f6-9b6e-2bc4e711bab2">{{contact.lastAttributionSource.fbEventId}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e336846a-7320-462d-a25b-dbb1201cbe54">User Agent</p></td><td colspan="1" rowspan="1"><p data-id="53934044-fbbb-4603-b420-91de8011c4af">{{contact.lastAttributionSource.userAgent}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="36bb9969-08bd-459d-bbb4-18bb57d4a253">IP Address</p></td><td colspan="1" rowspan="1"><p data-id="55191c13-ac30-4ce4-89ff-1d25ad1b3ae0">{{contact.lastAttributionSource.ip}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="784981e8-aeac-45da-bfa4-cb485a071025">Conversion event type (form/calendar/chat/survey/order_form)</p></td><td colspan="1" rowspan="1"><p data-id="b190c774-8ea8-4eca-bc29-8ac31f124842">{{contact.lastAttributionSource.medium}}</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cc62eea8-948d-4047-a036-3fb51ac4128d">Conversion event ID (the specific form/calendar/widget that fired)</p></td><td colspan="1" rowspan="1"><p data-id="07213477-c29a-4e82-90d3-480c50994121">{{contact.lastAttributionSource.mediumId}}</p></td></tr></tbody></table>

⚠ Two easy-to-miss gotchas in these field names:

1.  medium is NOT the same as utmMedium.
    

-   medium → returns the conversion event type (form, calendar, chat, survey, order\_form). This is what type of Aesthetix CRM asset captured the lead.
    
-   utmMedium → returns the actual utm\_medium URL parameter (e.g., cpc, social, email).
    

If you're trying to capture the utm\_medium from your campaign URLs, use utmMedium, not medium. Using medium by mistake will cause every contact to show "form" (or whichever conversion event type they came in through) regardless of what UTM was on the URL.

2.  utm\_campaign maps to campaign, not utmCampaign.
    

All the other UTM parameters use the utm prefix (utmSource, utmMedium, utmContent), but utm\_campaign is the exception. Its merge field is just {{contact.lastAttributionSource.campaign}}. There is no utmCampaign field.

### Important details about how these fields behave

-   **They populate at conversion time.** A workflow action attached to your lead capture forms copies the values from the native attribution data into the custom fields the moment a new contact is created or updated. Existing contacts created before this workflow was set up may not have all these fields populated.
    
-   **Most fields capture _Latest_ attribution, not First.** With the exception of "First Attribution Session Source," all the mapped fields use the Latest Attribution values. This means if a contact converts a second time through a different channel, most of these fields will update to reflect the new channel — only **First Attribution Session Source** stays locked to the original.
    
-   **They're available as merge fields everywhere.** You can reference these fields in email templates, SMS templates, workflow conditions, smart lists, segment filters, and CSV exports — anywhere custom contact fields are supported.
    
-   **They're included in CSV exports.** When you export contacts from the Contacts tab, these fields appear as columns — making it simple to pull attribution data into spreadsheets, BI tools, or external reports without API access.
    

### Why some custom fields will be empty for many contacts

This is one of the most common questions clients have when they first look at exported attribution data: _"Why are the UTM fields blank for half my contacts?"_

The answer is that **UTM parameters and click IDs only exist on URLs that were explicitly tagged with them** — typically by a paid ad campaign. They don't magically appear on every visitor's URL. Here's what gets populated for each source type:

<table data-id="a0cbb14e-dc63-4be6-82bd-a46a67ef782c" style="min-width: 150px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="5c917732-f519-4c63-a042-3b4e85aba318"><strong>Source Type</strong></p></td><td colspan="1" rowspan="1"><p data-id="e4b2f989-8e3a-445d-9926-306daca990e9"><strong>Source URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="76242b7b-574e-4913-b378-78e42ec590a8"><strong>UTM Source / Campaign / Content</strong></p></td><td colspan="1" rowspan="1"><p data-id="6e317426-a8e4-4930-b81e-7cf440bdfe92"><strong>GCLID</strong></p></td><td colspan="1" rowspan="1"><p data-id="ecc0097e-f0c6-4c04-aba4-63f6ac5a73d0"><strong>FBCLID</strong></p></td><td colspan="1" rowspan="1"><p data-id="1acc6c44-ea68-4dcb-84ab-73888d3308f3"><strong>Session Source</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="43e99bfc-afdf-4005-96fc-16c4f7cecdaf"><strong>Paid Search</strong> (Google Ads)</p></td><td colspan="1" rowspan="1"><p data-id="47cb0f89-aba2-4a30-bc33-4b8b82148739"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="ed346934-9744-4a00-a2f8-d6e7046f56fc"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes (from your ad's UTM template)</p></td><td colspan="1" rowspan="1"><p data-id="96d73008-fdfc-41ad-b589-23d327d7b56c"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes (auto-appended by Google)</p></td><td colspan="1" rowspan="1"><p data-id="85949048-ae2f-4786-a32a-67f31e383cee">—</p></td><td colspan="1" rowspan="1"><p data-id="f2ad9132-38eb-479d-843b-c334b05cec75"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3b65c3ff-31a6-4d33-9d3e-88ed8c28a08d"><strong>Paid Search</strong> (Bing Ads)</p></td><td colspan="1" rowspan="1"><p data-id="00fdf111-76b5-46a8-ab4a-ac6e0a4a9c13"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="b1d2214f-35e6-4b08-9ac1-bfd57512b5a4"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="ac3c5274-fa3d-4536-af89-591ebe11f970">—</p></td><td colspan="1" rowspan="1"><p data-id="0406f46f-ab6f-4707-80cd-e4452fbcb988">—</p></td><td colspan="1" rowspan="1"><p data-id="9158b779-e31f-48fd-9c92-04f12e46fc88"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="96c94df4-46b0-401f-b7ed-a3b787af6e93"><strong>Paid Social</strong> (Meta Ads)</p></td><td colspan="1" rowspan="1"><p data-id="de66ed4d-22f0-48ae-a634-144cf2066dc4"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="06bd6b77-fef7-49df-8179-8872f0443585"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes (from your ad's UTM template)</p></td><td colspan="1" rowspan="1"><p data-id="e21a1baa-598f-4ce0-8cc0-b83fcdf72c6d">—</p></td><td colspan="1" rowspan="1"><p data-id="73e611d4-c8d2-4971-a6de-c4ebf83adcc3"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes (auto-appended by Meta)</p></td><td colspan="1" rowspan="1"><p data-id="37e7b330-21e7-4cad-928d-81cebf805c6a"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e8761977-c2a1-418f-92ca-1710c7ac2c8d"><strong>Organic Search</strong></p></td><td colspan="1" rowspan="1"><p data-id="380252e9-7a11-4ee0-992e-05e39058e807"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="39569554-1423-45f1-ac29-0176cb432f5b"><span data-name="cross_mark" data-type="emoji">❌</span> Empty (no one tags organic results)</p></td><td colspan="1" rowspan="1"><p data-id="e4a54ae4-a53e-45d9-8c61-031db07e0d59">—</p></td><td colspan="1" rowspan="1"><p data-id="85735a74-004f-415d-89d3-48088740e10b">—</p></td><td colspan="1" rowspan="1"><p data-id="57df66b9-ce31-4399-907b-cf77d16d3173"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="89eea0de-e502-43f5-a239-08c6b140050e"><strong>Social Media</strong> (organic)</p></td><td colspan="1" rowspan="1"><p data-id="3248de15-04a2-4eb1-a481-6829220cda09"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="0b0b1b89-2e55-43f3-a1e3-341ced9d213e"><span data-name="cross_mark" data-type="emoji">❌</span> Usually empty (unless you tagged your bio link)</p></td><td colspan="1" rowspan="1"><p data-id="8208464e-8b28-4cac-9053-b041bbddbba3">—</p></td><td colspan="1" rowspan="1"><p data-id="5df4a84e-d0e9-4f2f-ac5f-aef7ff39ac37">—</p></td><td colspan="1" rowspan="1"><p data-id="80d02481-df62-4838-a4c2-3789cba03f62"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6efeb42c-3dfa-4287-942e-18fad4f695a0"><strong>Referrals</strong></p></td><td colspan="1" rowspan="1"><p data-id="dbce6ea8-8537-4bc1-90cd-8cc0e5fc8eb4"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="8574a4c7-78e5-4178-8416-e2ba45df0e21"><span data-name="cross_mark" data-type="emoji">❌</span> Usually empty (unless the referring site happened to use UTMs)</p></td><td colspan="1" rowspan="1"><p data-id="3e617983-41e5-454d-b60c-2dadd417c6bd">—</p></td><td colspan="1" rowspan="1"><p data-id="25338918-afd7-4d5f-9dd0-d5a6ce72eae6">—</p></td><td colspan="1" rowspan="1"><p data-id="d362c591-0625-46bd-ba58-68b483756f9e"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="678c4aef-ef3f-42cd-b63e-b5033a819275"><strong>Direct Traffic</strong></p></td><td colspan="1" rowspan="1"><p data-id="cd14b77c-3487-4f3a-bf6a-e81e15b62924"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td><td colspan="1" rowspan="1"><p data-id="6f960e33-b451-404c-8c37-9389a6c4cdeb"><span data-name="cross_mark" data-type="emoji">❌</span> Empty (typed URLs and bookmarks have no UTMs)</p></td><td colspan="1" rowspan="1"><p data-id="1259220a-1e17-4449-adf1-2e27ccf5c087">—</p></td><td colspan="1" rowspan="1"><p data-id="79445517-cb4a-45b4-897b-067d1974dcdb">—</p></td><td colspan="1" rowspan="1"><p data-id="9129e9e2-153f-496b-b565-6d3321be6cf8"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1d758ed7-74a0-4523-91f8-33b918df9cc8"><strong>Others</strong> (call, SMS, email, DM)</p></td><td colspan="1" rowspan="1"><p data-id="97a997c5-ba28-4d60-ad3b-5d2e38caa7f5"><span data-name="cross_mark" data-type="emoji">❌</span> Empty</p></td><td colspan="1" rowspan="1"><p data-id="a8f61fb2-7f2d-4e29-bb1c-3b94bf26486d"><span data-name="cross_mark" data-type="emoji">❌</span> Empty</p></td><td colspan="1" rowspan="1"><p data-id="606fab6b-a0b6-446c-a55d-a830a460fbba">—</p></td><td colspan="1" rowspan="1"><p data-id="035d7f1a-e256-44b7-98e1-8d8bb21dee6b">—</p></td><td colspan="1" rowspan="1"><p data-id="a745bd07-b912-49b1-bba8-ca54e786403c"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ebc622d1-55a5-4a22-9e8c-b6eb00c7d667"><strong>CRM UI / CRM Workflows / Third-Party</strong></p></td><td colspan="1" rowspan="1"><p data-id="72306174-fc8d-438b-a1cb-2d0343272a57"><span data-name="cross_mark" data-type="emoji">❌</span> Empty</p></td><td colspan="1" rowspan="1"><p data-id="d2c16b9c-baa5-49c1-9d77-05c4f308a95e"><span data-name="cross_mark" data-type="emoji">❌</span> Empty</p></td><td colspan="1" rowspan="1"><p data-id="e4683676-00a2-4355-bb00-a51bf83a786a">—</p></td><td colspan="1" rowspan="1"><p data-id="8ad0fa69-adba-4ab6-bd5d-8f0a9b9e096d">—</p></td><td colspan="1" rowspan="1"><p data-id="855446ed-d1a2-4abb-9691-669587af784a"><span data-name="check_mark_button" data-type="emoji">✅</span> Yes</p></td></tr></tbody></table>

**Key takeaways from this table:**

-   **Session Source (First and Last) populates for every contact, regardless of source.** This is the most reliable field for building smart lists and reports — every contact will have a value in it.
    
-   **UTMs only populate for contacts who arrived through a tagged URL.** That's almost always paid ads. If you want to enable UTM-based reporting on your organic posts (e.g., the link in your Instagram bio, your email newsletter links), you'll need to manually add UTM parameters to those URLs yourself — the system won't fabricate them.
    
-   **GCLID and FBCLID only populate for contacts who clicked through from Google Ads or Meta Ads, respectively.** These click IDs are auto-appended by the ad platforms when auto-tagging is enabled. Organic visitors will never have them.
    
-   **Contacts created without a web session at all** (CRM UI, CRM Workflows, Third-Party, Others) will have most attribution fields empty. Only the Source Session field will be populated.
    

> 💡 **For practical reporting:** Use **Last Attribution Session Source** as your primary segmentation field — it works for every contact. Use UTM and click ID fields when you specifically need to drill into paid campaign performance.

### When to use the custom field vs. the native attribution panel

<table data-id="de2c4c6a-2fae-46bf-b4ac-3c8a158ee22b" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="b8b1b84c-300b-4d6c-ada4-95b12054601a"><strong>Use Case</strong></p></td><td colspan="1" rowspan="1"><p data-id="952371f0-9268-4e9e-8de6-58e3ed68122b"><strong>Where To Look</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0e25affd-9141-4199-8bba-3fb13ed7db4d">Quickly seeing where a single contact came from</p></td><td colspan="1" rowspan="1"><p data-id="3f46b3d4-9b7b-4b6c-be79-c6ea370b30dd">Native Activity tab on the contact</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c0c1700a-3e88-40be-9968-6f7e03014fc3">Building a smart list of "all leads from Paid Search this month"</p></td><td colspan="1" rowspan="1"><p data-id="b46a697d-2fbc-44d9-b8c7-ee841cdd470a">Custom field: <strong>Last Attribution Session Source</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1c3f594e-9bd8-491c-a0ec-259cd5319191">Exporting a contact list with source data for an external report</p></td><td colspan="1" rowspan="1"><p data-id="20288fae-f187-4c30-a9f5-c7db6135d0ac">Custom fields (included in CSV export)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9f0dd31e-004f-424e-b306-1b19fa26e06d">Including the original campaign name in a follow-up email</p></td><td colspan="1" rowspan="1"><p data-id="782ed039-7022-46c1-96b8-dc688a2d73e6">Custom field merge: <strong>UTM Campaign</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d9af6cf9-ea89-4966-b8b1-459ca7d83a00">Triggering a workflow only for leads with a specific GCLID</p></td><td colspan="1" rowspan="1"><p data-id="b1b4ef51-f6f1-4de5-b07c-7dfefbf8090c">Custom field condition: <strong>Attribution - GCLID</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="be104a9d-36cd-4af8-9c2f-d3f25cbb7b00">Pulling rich session detail (IP, user agent, FB Event ID, click cookies, etc.)</p></td><td colspan="1" rowspan="1"><p data-id="ac568b44-99d7-4fef-a6a9-1700f1454921">Native attribution panel (or API)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e55d5cb8-99ea-4cd8-ad31-6e3da12d451c">Building a custom dashboard or BI integration</p></td><td colspan="1" rowspan="1"><p data-id="534363b9-323b-494d-b2e3-ae5f616d2f89">API (see <a target="_blank" rel="noopener noreferrer nofollow" class="linktype-link link" data-linktype="link" href="https://claude.ai/chat/2b90641e-a1dc-4bf6-becc-7e2025d2b800#for-developers-and-integrations">For developers and integrations</a>)</p></td></tr></tbody></table>

> 💡 **Need additional fields mapped?** The default setup covers the most commonly-used attribution values. If you want additional fields mapped into custom contact fields (e.g., MSCLKID for Bing Ads, the campaign ID, the IP address, the FB Event ID), our team can add those to your lead capture workflows. Submit a Custom Build Request with the specific fields you'd like added.

* * *

## Contact Source vs. Attribution Source — what's the difference?

This is one of the most common points of confusion in the platform, because there are actually **two different "source" concepts** on every contact, and they don't always agree.

### Contact Source (a single field on the contact record)

The **Contact Source** is a single text value attached to every contact, set at the moment the contact is created. It typically reflects _how the contact entered the system_ — for example, the name of the form they submitted, "Manual Entry," or "API."

You can see this field at the top of the contact record, alongside their name, email, and phone. It's what powers the **Lead Source widget** on the dashboard.

**You can control the Contact Source value in three ways:**

1.  **Set it inside the form builder.** Add a hidden Source field to any form/survey and define the value (e.g., "Botox Landing Page Form"). This becomes the Contact Source for any lead that submits that form.
    
2.  **Override it via URL parameter.** Append `?source=your_custom_value` to any page URL. The submitted form will use that value instead of the form's built-in source. This is useful for tagging traffic from specific campaigns or partners with a custom label.
    
3.  **Let the system fill it in by default** based on the form name, integration, or creation method.
    

> 💡 **How Aesthetix CRM protects Contact Source from being overwritten:** In any of our standard workflows that include a Contact Source update action (lead capture workflows, re-engagement workflows, etc.), the workflow first **checks whether a Contact Source already exists on the contact** — and only sets the value if the field is empty. This prevents a returning lead's original source from being overwritten by a later interaction. The value you see in the Contact Source field is reliably the _original_ source assigned at first capture, even if the contact has had many subsequent interactions.

### Attribution Source (the channel categorization on the attribution panel)

The **Attribution Source** is the marketing channel categorization (Paid Search, Organic Search, Direct Traffic, etc.) that the rules engine assigns based on the URL parameters and referrer of the conversion event. It lives on the attribution panel under the Activity tab.

This is what the rest of this article has been about.

### How they relate (and why they often look different)

<table data-id="b8524a1e-a3a8-4a73-a3f1-9cfb09f221a1" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="f95f8947-678d-4647-ad9c-0d40b6388a35"></p></td><td colspan="1" rowspan="1"><p data-id="a1d65d6e-1edb-48f6-95d8-201a3282f682"><strong>Contact Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="68806ef8-b24e-4df0-a6e2-515effacf263"><strong>Attribution Source</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7062ba21-687f-401c-8e4f-f8cc79bf05f4"><strong>Set by</strong></p></td><td colspan="1" rowspan="1"><p data-id="420b29ea-0610-4cb0-b00f-9b613ca059ed">The form builder, URL <code>?source=</code> parameter, or system default</p></td><td colspan="1" rowspan="1"><p data-id="e39d3da3-be8b-4107-86df-947c3c31cb80">The attribution rules engine (12 rules, first-match-wins)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="edebd998-07e4-4590-ae7d-f7ce8648cf3a"><strong>Format</strong></p></td><td colspan="1" rowspan="1"><p data-id="6d0c56d8-6a24-4501-9710-4deebbeb2f58">Free-text label (any string)</p></td><td colspan="1" rowspan="1"><p data-id="3aacfae1-2609-404a-b071-5b20464ed1ee">One of the standardized source types (Paid Search, Direct Traffic, etc.)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0db8b777-7ed5-4735-b6ac-16bcfce8ed98"><strong>Where it lives</strong></p></td><td colspan="1" rowspan="1"><p data-id="11a6313a-05cf-4b59-938d-6202ceb6a524">Top of the contact record, single field</p></td><td colspan="1" rowspan="1"><p data-id="83791b45-a670-41e5-b962-656f4befce7d">Activity tab → Attribution panel, two records (First and Latest)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="39c16d95-dd03-4527-a9af-09f55abef5f1"><strong>Used for</strong></p></td><td colspan="1" rowspan="1"><p data-id="5b09489f-4391-4747-9a70-6246a91904c5">Quick identification of "where this lead came in from"</p></td><td colspan="1" rowspan="1"><p data-id="facc5db7-54d8-4774-9e55-508433a254ef">Categorized channel reporting and attribution analysis</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7ecd8d74-de91-417d-9304-a1af36d3422e"><strong>Updates over time</strong></p></td><td colspan="1" rowspan="1"><p data-id="63f0e4ae-6216-420d-a52a-a55007fc635c">No — set once at first capture and protected from overwrite by Aesthetix CRM workflows</p></td><td colspan="1" rowspan="1"><p data-id="9f081ac4-9cba-44c6-9485-ee8021d3e921">Latest Attribution updates on every new conversion; First Attribution is locked</p></td></tr></tbody></table>

A contact might have **Contact Source = "Botox Landing Page Form"** and **First Attribution Source = "Paid Search"** simultaneously. Both are correct — they're answering different questions. The Contact Source tells you _which form they filled out_; the Attribution Source tells you _what marketing channel drove them to that form_.

> 💡 **For most reporting, Attribution Source is the more useful field** — because it gives you the standardized channel categorization needed to compare performance across sources. Use Contact Source when you specifically want to know which form or asset captured a lead.

* * *

## Where to view attribution data at scale (Reporting)

Everything we've covered so far has been about reading attribution data on a single contact. To see attribution across all your contacts and roll up reporting at the channel/campaign level, use:

-   **Attribution Report** (`Reporting → Attribution Report`) — shows where and how leads entered your platform across selected date ranges, broken down by source, campaign, and medium
    
-   **Google Ads Report** (`Reporting → Google Ads`) — campaign, ad group, and ad-level performance for Google Ads traffic (requires Google Ads UTM template setup)
    
-   **Facebook Ads Report** (`Reporting → Facebook Ads`) — campaign, ad set, and ad-level performance for Meta Ads traffic (requires Meta UTM template setup)
    
-   **Call Reports** (`Reporting → Call Reporting`) — inbound call volume, duration, and source attribution (requires Number Pools for source-level detail)
    
-   **Custom Dashboards with attribution filters** — when building a custom dashboard widget on Contacts or Opportunities data, you can add **Session Source**, **UTM Source**, **UTM Medium**, **UTM Campaign**, and other attribution properties as filters and grouping dimensions to build your own attribution views
    

[

Reporting: All-In-One Guide

Learn about how all Aesthetix CRM reporting works and the limitations of reporting & dashboards in the system.

](https://help.aesthetixcrm.com/en/articles/1246-reporting-all-in-one-guide.md)[

Dashboards: All-In-One Guide

Review this help article to learn everything about our template dashboards and how to build your own custom dashboard widgets.

](https://help.aesthetixcrm.com/en/articles/1247-dashboards-all-in-one-guide.md)

* * *

## Attribution source types

Every contact's First and Latest attribution will be categorized as one of the following source types.

<table data-id="5c6c078d-06e9-46f6-ae61-e0ed27af8395" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="d0d8742b-836c-44b7-a706-c2b43cfa30b3"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="6f810fcd-249a-4694-bb6f-7de089fe129d"><strong>What It Means</strong></p></td><td colspan="1" rowspan="1"><p data-id="4349755e-fbf7-4352-ad88-0f73c4c94330"><strong>Common Scenario for a Med Spa</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="74aa172a-85b3-4155-8a5b-0d283a953d07"><strong>Paid Search</strong></p></td><td colspan="1" rowspan="1"><p data-id="84f00c76-f4da-4c62-9657-e8f39e439d35">Click came from a paid search ad (Google Ads, Microsoft/Bing Ads)</p></td><td colspan="1" rowspan="1"><p data-id="36b79760-2369-4eeb-8f58-21e42899b787">A patient searches "Botox near me," clicks your Google Ad, and books a consult</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a7da7b97-2fb6-49e4-bdc0-a17684b02f35"><strong>Paid Social</strong></p></td><td colspan="1" rowspan="1"><p data-id="b682fab5-30fc-4593-8abf-e52112064655">Click came from a paid social ad (Meta, LinkedIn, X/Twitter, Reddit, WhatsApp click-to-chat ads)</p></td><td colspan="1" rowspan="1"><p data-id="e63082d0-e57a-43a4-9522-9910d3a96ad3">A patient taps a sponsored Instagram post for your laser hair removal special</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b50b28b1-3383-434c-aa48-f54ed68c59e5"><strong>Organic Search</strong></p></td><td colspan="1" rowspan="1"><p data-id="8f963f0c-a5a9-4f93-9a82-9c2d64f6de4b">Click came from an unpaid search engine result</p></td><td colspan="1" rowspan="1"><p data-id="2820e50c-c196-4dd8-a5d4-7b91f3fc98b3">A patient searches "best filler injector in [city]" and clicks your organic listing</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c7f8a9e8-db74-48a1-bc11-0a2feb79188e"><strong>Social Media</strong></p></td><td colspan="1" rowspan="1"><p data-id="d3942e32-7132-4131-9e87-bd3fc6a8d3b8">Click came from an organic post, story, or share on a social platform</p></td><td colspan="1" rowspan="1"><p data-id="9f999c1f-860c-4dc8-a43b-701d17c995e3">A patient clicks the link in your Instagram bio after seeing a Reel</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="df6c9ddb-de2f-41e1-8a6d-e66bce689ea8"><strong>Referrals</strong></p></td><td colspan="1" rowspan="1"><p data-id="61944053-250b-405c-9a1d-e34936826faa">Click came from another website that isn't a search engine or social platform</p></td><td colspan="1" rowspan="1"><p data-id="3d2e3280-deb3-408c-b58c-6e18c4a8e51e">A patient clicks through from a "best med spas" blog post or a directory listing</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e417ad8a-cbf1-4e5e-92e9-5719de6933cc"><strong>Direct Traffic</strong></p></td><td colspan="1" rowspan="1"><p data-id="a06158d6-daec-43c5-ab03-b47fa8d5112e">No referring source detected — typed the URL directly, used a bookmark, or had referrer data stripped</p></td><td colspan="1" rowspan="1"><p data-id="369071ad-766a-4833-9336-1c4b2993110b">A returning patient types your website URL into their browser</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2a4f26f7-f28d-4f64-aff6-8ebf6dd25c6f"><strong>Others</strong></p></td><td colspan="1" rowspan="1"><p data-id="fdd71138-c9a3-4d68-813b-d4bdc47bfb1c">Lead came in through a non-web channel — inbound call, SMS, email, WhatsApp, or Facebook Messenger</p></td><td colspan="1" rowspan="1"><p data-id="fd336332-48bf-4b2a-94ea-24788416d90f">A patient calls your tracking number after seeing a print ad</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="210ddbae-28cc-476d-b9ad-7d18f8c0507d"><strong>CRM UI</strong></p></td><td colspan="1" rowspan="1"><p data-id="d5b8a5a2-ac77-4684-b979-89e14d394dee">Lead was created manually inside Aesthetix CRM by a team member</p></td><td colspan="1" rowspan="1"><p data-id="e6c178b1-b6b3-41f9-b722-e1ad08769a68">Front desk adds a walk-in patient to the system by hand</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ed4a3b0d-905a-496b-ada9-db2b7a5c4d41"><strong>CRM Workflows</strong></p></td><td colspan="1" rowspan="1"><p data-id="0c0169cf-fd44-4b9a-a81a-8a61420d3cb3">Lead was created or modified by an automated workflow inside Aesthetix CRM</p></td><td colspan="1" rowspan="1"><p data-id="37733b4f-1b31-4bbc-8323-67544e96f155">A workflow auto-creates a contact based on a webhook trigger or an internal automation</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7f9f7097-da96-4f7a-917d-a4c095476e44"><strong>Third-Party</strong></p></td><td colspan="1" rowspan="1"><p data-id="ab31a61a-d9b9-4948-8440-81b8ccd0d80b">Lead was created by an external integration (Zapier, native API, EMR sync, etc.)</p></td><td colspan="1" rowspan="1"><p data-id="d9936ecf-d2d3-41a2-8b42-de527dbb083e">A new patient created in your EMR is synced into Aesthetix CRM via an integration</p></td></tr></tbody></table>

> 💡 **About "CRM Workflows":** This source type appears on contacts created or substantially modified by an automated workflow inside Aesthetix CRM (as opposed to manual creation, which produces "CRM UI"). It's a relatively new source type and may not be exhaustively documented in older help materials yet — if you see it on contacts in your account, this is what it means.

* * *

## How attribution actually gets captured

This is where most clients get tripped up — so it's worth walking through carefully. There are two questions to answer:

1.  **What events trigger an attribution capture?** (When does the system save the data?)
    
2.  **What needs to be in place for that data to be complete?** (How does the plumbing work?)
    

### Step 1: A conversion event has to fire

Aesthetix CRM does **not** track attribution on every page view by default. Attribution is recorded **only at the moment of a conversion event** that creates or updates a contact. The full list of events that trigger an attribution capture:

**Web-based conversion events (rich attribution capture):**

1.  Submits a **Form** built in Aesthetix CRM (or a compatible HTML `<form>` on a page where the External Tracking Script is installed)
    
2.  Submits a **Survey** built in Aesthetix CRM
    
3.  Books an appointment through an Aesthetix CRM **Calendar** widget
    
4.  Submits contact info through the Aesthetix CRM **Chat Widget**
    
5.  Completes an **Order Form** (one-step or two-step) built in Aesthetix CRM
    
6.  Clicks a **Trigger Link** sent in an email, SMS, WhatsApp, GMB, or Messenger/DM message
    

**Non-web conversion events (limited attribution capture):**

7.  **Inbound phone call** — creates or updates a contact based on the caller's phone number. By default, calls are categorized as **Others** with no source detail. **If the call is to a Number Pool number** (Pattern D), the system matches the call back to the visitor's original web session via cookie and assigns the correct source (Paid Search, Organic Search, etc.) instead of Others.
    
8.  **Inbound SMS, email reply, WhatsApp message, or Facebook/Instagram DM** — creates or updates a contact based on the inbound message. These are categorized as **Others** (for SMS/email) or **Social media** with minimal data (for WhatsApp/Messenger/IG DM). See Limitation #8 for details on the limited attribution data captured from messaging channels.
    

If none of these events occur, no contact is created and no attribution is recorded.

> 💡 **About Trigger Links:** These are tracked redirect links you create inside Aesthetix CRM (under **Conversations → Trigger Links**) and use in your outbound messages. When a contact clicks one, the click is logged on their activity timeline, can fire a workflow, _and_ updates their Latest Attribution data. This is why you'll occasionally see contacts whose Latest Attribution shows `url: "Trigger Link"` in the API or attribution panel — that contact recently clicked one of your tracked links.
> 
> 💡 **About Number Pool calls:** A call to a Number Pool tracking number is a full conversion event. The call itself triggers contact creation/update, and the source attribution inherited from the original web session is what makes the difference between Others (no source) and a properly categorized channel attribution. Without Number Pools, the call still creates a contact — it just gets the generic Others source. See Pattern D for setup details.

### Step 2: A tracking mechanism has to be on the page

Just having a form is only half the story. For attribution data to be **complete and accurate** — especially for visitors who browse multiple pages before converting — there needs to be a **tracking mechanism present on every page** of your site to capture the original session data and carry it forward.

There are three patterns for how this works in practice. Pick the one that matches your setup.

#### Pattern A: Site built natively in Aesthetix CRM

If your website, funnel, or landing page is **built inside Aesthetix CRM**, attribution tracking is built in automatically. The platform's JavaScript is already on every page. There's nothing to configure — UTMs, referrers, page paths, and session data flow through to the conversion event without any additional setup.

**Best for:** Practices that have built their main website, funnel, or specific campaign landing pages directly inside Aesthetix CRM.

#### Pattern B: External website with the Chat Widget on every page

If your main website is hosted on WordPress, Squarespace, Shopify, Webflow, Wix, or any other external platform, the Aesthetix CRM **Chat Widget** doubles as a session tracking script. As long as the chat widget code is installed on **every page** of your site, it does two things automatically:

1.  Stores anonymous session data (entry URL, UTMs, referrer, click IDs) in the browser as soon as the visitor lands
    
2.  Carries that session data across page navigations until the visitor finally converts — whether they convert through the chat widget itself, an embedded form, or an embedded calendar
    

When the conversion happens, the original session data from the entry page is attached to the contact, even if the conversion page is several clicks away from where the visitor first arrived.

**Best for:** Practices already using (or open to using) the Chat Widget. This is the **easiest way** to get cross-page attribution working without installing a separate tracking script — because the chat widget is doing the work for you.

#### Pattern C: External website with the External Tracking Script

If you don't use the Chat Widget but still need accurate cross-page attribution on an external website, install the **External Tracking Script**. This is a lightweight JavaScript snippet that does the same session-tracking job as the Chat Widget — without adding a chat interface to your site.

**To install:**

1.  From the left navigation, go to **Settings → External Tracking**
    
2.  Click **Copy Script** to grab your unique snippet
    
3.  Paste it just before the closing `</body>` tag on every page of your external site
    

The script will then:

-   Record page views anonymously, even before a contact exists
    
-   Store session data (entry URL, UTMs, referrer, click IDs) in the visitor's browser
    
-   Attach that session data to the contact when an embedded form is finally submitted
    
-   Capture supported custom field values from compatible HTML forms
    
-   Make page-view activity available as a workflow trigger
    

**Best for:** Practices on external websites that don't use the Chat Widget, or any practice that wants the additional ability to trigger workflows from page-view activity (e.g., "if someone visits the CoolSculpting page 3 times in a week, send a follow-up sequence").

##### Form compatibility for the External Tracking Script

For the External Tracking Script to capture form submissions (not just page views), the form must meet these requirements:

-   A real `<form>` HTML element exists in the page DOM
    
-   An `<input type="email">` field is present
    
-   All fields you want captured are visible (not `display: none`) and have a valid `name` attribute
    
-   The form is **not** inside an iframe
    
-   The form is **not** rendered by a third-party JavaScript widget that injects a `<div>`\-based UI
    

**Supported field types:**

The script can capture and map a wide range of field types when properly configured:

-   Single-line and multi-line text
    
-   Dropdowns (single-select and multi-select)
    
-   Checkboxes and radio buttons
    
-   Number, monetary, and date picker fields
    
-   Ratings and scores
    
-   File uploads and signatures (metadata only — the actual file content is not transferred)
    
-   Source, captcha, and boolean fields
    

**How fields get mapped to your CRM contact properties:**

The script tries to map fields in this priority order:

1.  The form field's `name` attribute matches an Aesthetix CRM contact property or custom field key
    
2.  The form field's `<label>` text matches an Aesthetix CRM display name
    
3.  The form field's `name` matches the label text (case-insensitive)
    

If no match is found, the value is stored as `unmapped_field` so your team can identify and fix the mapping.

> ⚠ **WordPress page builders are a major gotcha.** Many popular WordPress page builders (Elementor, Divi, WPBakery, Beaver Builder, Bricks) and form widgets render form-like UIs using `<div>` containers and JavaScript handlers — not real HTML `<form>` elements. **The External Tracking Script cannot detect submissions from these.** Page view tracking will still work, but form submissions will not sync to Aesthetix CRM.
> 
> If you're on WordPress, use a plugin that outputs valid HTML forms — **WPForms**, **Gravity Forms**, or **Contact Form 7** are the most reliable choices. To verify a form is compatible, right-click the form on your live site → Inspect → confirm there's a `<form>` tag wrapping the inputs (not just a `<div>`).

##### Installing the script on common platforms

<table data-id="7c2e417f-e612-4d52-9422-0b3215c3c6e7" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="3aedc97b-7aca-407a-8eba-e8450497c6b9"><strong>Platform</strong></p></td><td colspan="1" rowspan="1"><p data-id="8ec03969-23c7-4d02-8687-f4bb35e15c66"><strong>Where to paste the script</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0a42d5c6-48b4-4f90-8b27-222e874ef1a2"><strong>WordPress</strong></p></td><td colspan="1" rowspan="1"><p data-id="22529a74-7bd0-491e-9de4-cb1de1dee55a">Appearance → Theme Editor → Footer (or use the <em>Insert Headers and Footers</em> plugin). Paste before <code>&lt;/body&gt;</code>.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5cd11010-91a4-4e72-a475-f6221ac4be5c"><strong>Squarespace</strong></p></td><td colspan="1" rowspan="1"><p data-id="a44acd14-d189-4958-8f1f-49c0b030844a">Settings → Advanced → Code Injection → paste in the Footer field</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7699a6f8-4fec-43ba-bcee-4c12dbdb8678"><strong>Wix</strong></p></td><td colspan="1" rowspan="1"><p data-id="3282ddf1-9d97-4c2e-86be-702504d04bfd">Settings → Advanced → Custom Code → Add Custom Code → set to All Pages, Body (end)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="877f680e-4ef0-4654-8539-4f1181a52dfd"><strong>Shopify</strong></p></td><td colspan="1" rowspan="1"><p data-id="e6a96acc-1520-4a79-8046-d6e29e5ce2e0">Online Store → Themes → Edit Code → open <code>theme.liquid</code> → paste before <code>&lt;/body&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="59d65cca-d158-40da-bcb7-bf4b82012ff6"><strong>Webflow</strong></p></td><td colspan="1" rowspan="1"><p data-id="4c774dc3-3741-41a7-9df9-93d008b57ee7">Project Settings → Custom Code → Footer Code → paste and publish</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0450c715-3898-4d64-90cf-71fee05ce175"><strong>Custom HTML</strong></p></td><td colspan="1" rowspan="1"><p data-id="0575ba6e-ca92-4fdb-a951-45fdc140c00f">Paste directly before the closing <code>&lt;/body&gt;</code> tag in your site template</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="915a0978-3f58-4e05-a6f5-dc6faacb586a"><strong>Google Tag Manager</strong></p></td><td colspan="1" rowspan="1"><p data-id="2229ff63-3878-4cf4-abb5-8e31cdfb8f37">Custom HTML tag → trigger on All Pages → <span data-name="warning" data-type="emoji">⚠</span> verify the <code>data-tracking-id</code> attribute is preserved (some GTM configurations strip it — see Troubleshooting)</p></td></tr></tbody></table>

> ### Critical deployment requirement: both scripts must load before navigation
> 
> This is the single most common reason a properly-installed External Tracking Script still produces "Direct Traffic" or missing UTM data on real visitors. Understanding it is essential for any WordPress, Wix, Squarespace, Webflow, or Shopify deployment.
> 
> #### The technical requirement
> 
> For UTM data to be captured AND persistently restored across page navigations, two scripts must fully load on every page before the visitor navigates away:
> 
> 1.  The **External Tracking Script** (the snippet from Settings → External Tracking)
>     
> 2.  The **form, calendar, chat widget, or order form embed code** (the script that renders any Aesthetix CRM conversion widget on the page)
>     
> 
> If either script fails to fully load before the visitor clicks away, UTM data will not be captured or carried forward to subsequent pages. The visitor's session will look like "Direct Traffic" by the time they convert, even if they originally arrived from a properly-tagged paid ad URL.
> 
> #### Why this matters
> 
> This is also why some practices have never noticed an attribution issue. If you have the Chat Widget installed on every page (Pattern B), the chat widget script automatically loads on every page and acts as the second script — solving the dependency problem invisibly. Practices that don't use the chat widget and only deploy the External Tracking Script need to verify that a form, calendar, or other Aesthetix CRM widget is also loading reliably on every page.
> 
> #### What can prevent the scripts from loading in time
> 
> Modern WordPress sites (and other CMS platforms) often run performance optimization plugins that can interfere with script loading. The most common culprits we've seen:
> 
> **Script-delay plugins.** Plugins like WP Rocket, Perfmatters, FlyingPress, Autoptimize, and others can delay JavaScript loading until a user interaction occurs (often a scroll or a click). If a visitor lands on your page, doesn't scroll, and clicks an internal link to a different page, the External Tracking Script may never have loaded — meaning no UTM data was captured during that visit.
> 
> **Lazy-loading optimization plugins.** Performance plugins that lazy-load page elements can cause forms placed below the visible page area (in the footer or near the bottom of long pages) to not load at all during short visits. If the form never loaded, the second-script dependency is never satisfied, and UTM persistence breaks.
> 
> **Caching plugins with aggressive defer rules.** Caching plugins like WP Super Cache, W3 Total Cache, and LiteSpeed Cache can be configured to defer all third-party scripts, which delays or prevents the tracking script from running until late in the page lifecycle.
> 
> **Cookie consent banners that block scripts until accepted.** Consent management platforms like Cookiebot, OneTrust, and Complianz will hold tracking scripts from loading until the visitor accepts cookies. If a visitor never interacts with the banner before navigating, the tracking scripts never run.
> 
> #### How to diagnose if your deployment is affected
> 
> Run this test in a clean browser (incognito, no extensions, no content blockers):
> 
> 1.  Navigate to your site with a UTM-tagged URL: `https://yoursite.com/?utm_source=test&utm_medium=test&utm_campaign=diagnostic`
>     
> 2.  Open browser DevTools and watch the Network tab
>     
> 3.  Without scrolling, click an internal link to navigate to another page on the site
>     
> 4.  Submit a form on that second page
>     
> 5.  Check the resulting contact's attribution panel
>     
> 
> If the UTMs are missing on the resulting contact, the tracking script likely failed to load in time. If the UTMs are captured correctly, your deployment is firing as expected.
> 
> You can also confirm script loading by opening DevTools → Network tab and filtering for "external-tracking" or your form's script source. If those scripts appear with a "(canceled)" status, are loaded only after a delay, or are loaded only after a user interaction, your performance plugins are interfering.
> 
> #### Fixes when you find a problem
> 
> **Option 1: Exclude the Aesthetix CRM scripts from your performance plugin's delay/defer/lazy-load rules.**
> 
> Most performance plugins allow you to whitelist specific scripts. Find the rule list in your plugin and add exclusions for any scripts containing:
> 
> -   `external-tracking`
>     
> -   `widget`
>     
> -   `form`
>     
> -   `lc_form_tracking`
>     
> -   Your form's specific script source (visible in the form embed code)
>     
> 
> For WP Rocket specifically: go to WP Rocket → File Optimization → JavaScript → Delay JavaScript Execution → add the script URLs to the "Excluded JavaScript Files" list.
> 
> **Option 2: Preload the form on every page.**
> 
> If excluding scripts from optimization doesn't fully resolve the issue (or breaks other site functionality), the more robust fix is to preload an Aesthetix CRM form in the page header — even if it's not visually displayed there — to guarantee both required scripts load on every visit. The form can then be rendered again in its proper position lower on the page.
> 
> This requires a small amount of custom theme/template code. Reach out to your web developer or our team for guidance on implementing this. We've helped a number of practices with this pattern when their inherited WordPress setups have deep performance plugin dependencies that can't be easily reconfigured.
> 
> **Option 3: Configure your cookie consent banner to allow tracking scripts to load by default.**
> 
> If you're using a consent management platform, configure it to either allow tracking scripts to fire before consent (where legally appropriate for your jurisdiction) or to load tracking scripts immediately upon page load with delayed activation. This is a nuanced decision that depends on your compliance requirements — consult your legal/compliance advisor before adjusting.
> 
> #### When this dependency is most likely to be an issue
> 
> Watch for this pattern especially on:
> 
> -   WordPress sites that have been "inherited" from a previous agency or developer (multiple layered plugins, unknown optimization rules)
>     
> -   Sites with heavy performance optimization stacks (more than 2-3 performance plugins active)
>     
> -   Sites with strict cookie consent compliance requirements
>     
> -   Sites where forms are positioned below the fold or in the footer
>     
> -   Sites running on managed WordPress hosting with built-in caching/optimization layers (Kinsta, WP Engine, Pressable, Cloudways)
>     
> 
> If you're deploying the External Tracking Script on a site matching any of these descriptions, run the diagnostic test above before assuming the deployment is working. Test failures here are far more common than test failures on simple sites with minimal plugin stacks.
> 
> 💡 **Single-page apps (SPAs):** If your website is built as a React, Vue, or Next.js single-page app, page view tracking will only fire on the initial load by default. For attribution on subsequent in-app navigations, your developer needs to manually trigger a `page_view` event on each route change. Reach out to our team if you need guidance on this.

### The cross-page navigation problem (the #1 cause of broken attribution)

Here's the scenario that breaks attribution for most practices:

> A patient clicks a Google Ad → lands on your campaign landing page (with UTMs in the URL) → clicks "Schedule a Consult" in your menu → arrives on `/contact/` → submits the form there.

**Without the Chat Widget or External Tracking Script on every page:**

-   The form on `/contact/` only sees `/contact/` as the page it lives on
    
-   The original UTMs from the landing page URL are gone
    
-   The referrer at `/contact/` is your own domain (your landing page), not Google
    
-   → The conversion gets categorized as **Direct Traffic** or **Referral**, not **Paid Search**
    

**With the Chat Widget or External Tracking Script on every page:**

-   The original landing page URL (with UTMs) was captured anonymously when the visitor first arrived
    
-   That session data is preserved in the browser as the visitor moves around your site
    
-   When the form on `/contact/` fires, the original session data is attached to the new contact
    
-   → The conversion is correctly categorized as **Paid Search**
    

> ⚠ **This is the single most common reason "my paid ad leads are showing up as Direct Traffic."** If you're spending money on Google or Meta ads and your attribution looks broken, this is almost certainly why.

### Quick decision guide: which tracking pattern do I need?

<table data-id="935fa6b9-e637-4042-9037-53afe0cd4963" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="3122c1bd-81b8-482a-bd3a-b4f6c8af4e3e"><strong>Your Setup</strong></p></td><td colspan="1" rowspan="1"><p data-id="23e3dcb7-fea1-4863-9bc8-b3181ce5b49d"><strong>Recommended Pattern</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="fa08873b-9e76-41f2-8e7b-c56c3b518f9e">Website built entirely inside Aesthetix CRM</p></td><td colspan="1" rowspan="1"><p data-id="54fa71c6-57ec-4394-862a-edf1f46af851">Pattern A — nothing to install, you're done</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f0529680-b73f-430f-b982-4c385c120816">External website + already using the Chat Widget</p></td><td colspan="1" rowspan="1"><p data-id="3cec9163-bc09-44c1-a1e2-2616184950d0">Pattern B — chat widget covers it</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="19e7622c-d9ed-4c97-94b6-22bee5573a31">External website + Chat Widget not desired</p></td><td colspan="1" rowspan="1"><p data-id="d588484f-18b7-439d-9ad1-d875cc276e1e">Pattern C — install the External Tracking Script</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2db3fe51-ddcd-487a-a621-04e85906fd2f">External website + only single-page landing pages with forms on them</p></td><td colspan="1" rowspan="1"><p data-id="7f0fd5c8-40e7-44a1-ad68-37f3ec106e8d">Pattern A behavior at conversion time, but you'll lose any cross-page nuance — Pattern C still recommended</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="488eea66-1e03-4949-a206-0f55fe64b2d6">Mix of native landing pages + external main site</p></td><td colspan="1" rowspan="1"><p data-id="55ee2db5-ca19-46b1-b7ef-550b68c20064">Use Pattern A on the native pages, Pattern B or C on the external site</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="82d8e2f0-f998-487f-984b-fee20dabacbb">Inbound phone calls (additive to any of the above)</p></td><td colspan="1" rowspan="1"><p data-id="1e64da4a-a0a3-4128-a057-2caa141c6cd9">Pattern D — add <strong>Number Pools</strong> for call-channel attribution</p></td></tr></tbody></table>

### Pattern D: Capturing attribution from inbound phone calls (Number Pools)

Patterns A, B, and C handle web-based conversions (forms, calendars, chat). But what about **inbound phone calls**? By default, calls show up with the source **Others** — useful to know they came in by phone, but not useful for understanding which marketing channel drove them.

**Number Pools solve this.** They're a dynamic-number-insertion system that swaps the phone number displayed on your website based on where each visitor came from. When that visitor later calls the number they saw, the system stitches the call back to the original web session — and the resulting contact gets the correct source attribution (Paid Search, Organic Search, etc.) instead of Others.

**How it works in practice:**

1.  You purchase a small pool of phone numbers (typically 4–8) inside your account
    
2.  You install the **Number Pool tracking snippet** in the footer of your website (this is a separate snippet from the Chat Widget and External Tracking Script — all three can run on the same site)
    
3.  When a visitor lands on your site, the snippet detects their traffic source (paid search, organic, social, direct) and dynamically swaps the displayed phone number to a unique tracking number from your pool
    
4.  Different visitors see different numbers — the visitor from Google Ads sees Number A, the visitor from organic search sees Number B, etc.
    
5.  When a visitor calls the number shown on their page, the call is matched back to their session via cookie, attributed to the original source, and forwarded to your real business number
    
6.  The call appears in your Call Reports tagged with the correct source — and if it generates a new contact, that contact's First Attribution will reflect the original web source instead of "Others"
    

**To set up a Number Pool:**

1.  From the left navigation, go to **Settings → Phone Numbers**
    
2.  Select **Number Pools** under **Manage Numbers**
    
3.  Click **Create Number Pool** and select **Visitors Activity** as the tracking type
    
4.  Choose which visitor sources you want to track (we recommend **All Visitors** for the most complete picture)
    
5.  Add a **Forwarding Number** — this is your real business phone where the calls will route. _Important: this cannot be another Aesthetix CRM number, or it will create a forwarding loop._
    
6.  Choose your pool size (4 minimum). Larger pools are needed for higher-traffic sites — if too many concurrent visitors share the same number, attribution accuracy degrades.
    
7.  Save the pool, then click **Add/Edit Group ID** to generate the **Group Snippet**. Copy this snippet and paste it in the footer of every page on your site (just like the External Tracking Script).
    
8.  Verify it works by opening your site in an incognito window — you should see the displayed phone number swap based on how you arrived.
    

**Pool sizing rough guide:**

<table data-id="4ac2f4e7-93c7-465d-88f7-82d8f51d4188" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="bb33dc1c-ce30-45c1-96a1-698bf73314e2"><strong>Monthly Site Visitors</strong></p></td><td colspan="1" rowspan="1"><p data-id="15976303-71a7-4842-bcc9-49aa4570bafb"><strong>Recommended Pool Size</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3e10b07c-097a-4fa8-9f2e-02963591b63a">Under 5,000</p></td><td colspan="1" rowspan="1"><p data-id="2a9084c1-33b4-433c-b19b-512974c0860c">4 numbers</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8b631408-ba1d-4d37-8106-b5ace8d8d1f0">5,000 – 20,000</p></td><td colspan="1" rowspan="1"><p data-id="3e7f5031-9713-4672-b27a-377f48246704">6 numbers</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b8411162-8d5b-4361-be1d-f26f1122bcfc">20,000+</p></td><td colspan="1" rowspan="1"><p data-id="7c596663-7754-4510-ab4b-8b61f7c23119">8 or more numbers</p></td></tr></tbody></table>

Each number in the pool is billed at the standard phone number rate (same as any other phone number in your account).

> ⚠ **Important limitations of Number Pools:**
> 
> -   The visitor **must visit your website first** for the number swap to happen. Someone who sees a phone number directly in a Google Ad call extension or a print ad and dials it isn't going through the pool — that's just a regular inbound call.
>     
> -   For **Meta (Facebook/Instagram) Ads**, number pool attribution only works for click-to-call scenarios where the visitor clicks through to your website first. If the lead dials a pool number after seeing it on the site, attribution works. If they see your business number in a Meta ad and call directly, it doesn't.
>     
> -   Number pools require an active **Group Snippet** on your site to function. The snippet is _separate_ from the Chat Widget and External Tracking Script — install all three if you need full attribution coverage across forms, chat, and calls.
>     

**Best for:** Practices that invest meaningfully in paid ads or local SEO and want to know which channels drive their phone consultations. For most med spas, calls are still the dominant lead channel — so adding Number Pools to your attribution stack typically uncovers a significant amount of revenue that was previously categorized as "Others" with no source detail.

[

How to Setup Call Tracking With Number Pools

Learn how to setup attribution driven call tracking for Google Ads and Facebook Ads

](https://help.aesthetixcrm.com/en/articles/853-how-to-setup-call-tracking-with-number-pools.md)

* * *

### What CANNOT capture attribution data, no matter what

Some setups will never produce useful attribution data, regardless of which tracking pattern is in place:

<table data-id="924afa90-15fe-4930-902e-0e69ed4a2d24" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="307956c4-b954-4dbc-a58e-c044fb1eab91"><strong>Setup</strong></p></td><td colspan="1" rowspan="1"><p data-id="2c2fadf9-f41c-47b9-8d0f-853a105f88e1"><strong>Why It Doesn’t Work</strong></p></td><td colspan="1" rowspan="1"><p data-id="9f5509b3-dc91-45da-8a06-fa7444501381"><strong>What Happens</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3b6848ac-df5f-46ba-b1e6-c5fbf2fcec30"><strong>Iframe-based third-party forms</strong> (some Typeform embeds, JotForm popups, Calendly iframes)</p></td><td colspan="1" rowspan="1"><p data-id="4e94a2d0-3af9-48d7-a8ef-386febe7b66d">The form lives in a separate browser context that the tracking script can't see into</p></td><td colspan="1" rowspan="1"><p data-id="56afb3ba-2632-42a7-acce-9c64803ce382">No contact created via tracking</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="800d5e6c-f804-4679-b09e-eac35a2ecf38"><strong>Pure JavaScript widget forms</strong> (third-party plugins that don't render real HTML inputs in the page)</p></td><td colspan="1" rowspan="1"><p data-id="9d43105e-189f-4098-8334-0cad94d73d3e">The External Tracking Script needs a real <code>&lt;form&gt;</code> element in the DOM to detect the submission</p></td><td colspan="1" rowspan="1"><p data-id="351110d4-7825-4996-8670-fb377b51014a">No contact created via tracking</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="dd53a1b9-a1f9-48a6-927f-450944851c2c"><strong>Forms hosted on a different domain</strong> than where the tracking script is installed</p></td><td colspan="1" rowspan="1"><p data-id="6bc5570e-80ae-498a-aba2-a60905a565e1">Cross-domain session tracking is not supported in the standard configuration</p></td><td colspan="1" rowspan="1"><p data-id="e84bf2d7-e78c-4528-ae80-9aac1178369d">Inconsistent / falls back to Direct Traffic</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6bd38f47-3a32-4806-8ec3-0cafb570b035"><strong>Hidden or disabled form fields</strong> (<code>display: none</code>, all-disabled inputs)</p></td><td colspan="1" rowspan="1"><p data-id="b83e1313-e25f-46d9-9131-7e27adc91d6c">Tracking script intentionally ignores hidden form elements as a privacy/security measure</p></td><td colspan="1" rowspan="1"><p data-id="c55ccbe1-3d6e-45d8-a825-df23eb7e999b">No contact created via tracking</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="34838c1d-5c83-42c6-938f-0d744c087d00"><strong>Contacts created by Zapier or external API</strong></p></td><td colspan="1" rowspan="1"><p data-id="1c7a3cdb-93c3-4f85-bf78-48655bb03a56">Contact is created by an integration call, not from a tracked browser session</p></td><td colspan="1" rowspan="1"><p data-id="e675850a-d0b9-4c50-95a4-a65a3cd1b85b">Categorized as <strong>Third-Party</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="47616d60-8bf9-4b03-bbf2-b8b8bc9c493d"><strong>Contacts created manually by a team member</strong></p></td><td colspan="1" rowspan="1"><p data-id="2cc098ca-dcb5-440c-9f18-3a7319875f17">No browser session involved</p></td><td colspan="1" rowspan="1"><p data-id="c20a21f7-8440-49e7-a6fd-74e768ea2dc4">Categorized as <strong>CRM UI</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="da365a96-8e4d-4279-9ae7-cd7a2ab5c0cc"><strong>Contacts created or modified by an internal workflow</strong></p></td><td colspan="1" rowspan="1"><p data-id="022c21b1-5441-4efe-bdd0-a517b5d13d29">No browser session involved — the contact was generated by automation</p></td><td colspan="1" rowspan="1"><p data-id="354d8168-2576-4aff-9415-0639791a838c">Categorized as <strong>CRM Workflows</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6c398c0e-8c9b-41e9-b3ec-77b371b0a277"><strong>Inbound calls, SMS, email replies, WhatsApp messages, Messenger chats</strong></p></td><td colspan="1" rowspan="1"><p data-id="e92cd86f-ee86-4a81-891c-69bac2c77daa">These are non-web channels — there's no browser session to attribute</p></td><td colspan="1" rowspan="1"><p data-id="9ce0ffa0-4106-4990-969a-16c1579f1ff8">Categorized as <strong>Others</strong> (or inherits source from a Number Pool if used — see Pattern D)</p></td></tr></tbody></table>

* * *

## How Aesthetix CRM determines the source (the rules engine)

When a conversion event fires, the attribution engine looks at two things:

1.  **The full URL of the page** the visitor was on when they converted (including all query parameters)
    
2.  **The referring domain** — the website they were on right before they landed on your page (if available)
    

It then runs that data through a set of rules in priority order. The **first rule that matches** is the source that gets assigned. Once a match is found, the engine stops checking — so rule order matters.

<table data-id="ca5e325b-b76b-4ec3-8b79-649fdd3fdabc" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="f86c2dc9-99a6-4c71-8e7e-2ebe15a786ff"><strong>Order</strong></p></td><td colspan="1" rowspan="1"><p data-id="f3a1b6ba-8c02-486e-a31f-5506b33d5593"><strong>Rule</strong></p></td><td colspan="1" rowspan="1"><p data-id="d409b3a6-fa2f-4a59-97e7-32383e10e713"><strong>Assigned Source</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="25dfc854-890c-4ca3-b306-782b38dca3aa">1</p></td><td colspan="1" rowspan="1"><p data-id="b76a4b85-82e4-423d-acd0-85065a633c67">The <code>utm_source</code> parameter contains <code>adwords</code></p></td><td colspan="1" rowspan="1"><p data-id="a058907d-f7ad-4ddd-8373-d9c6553df251">Paid Search</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1b2e9b67-0812-472d-b661-dd3dc3d6ad25">2</p></td><td colspan="1" rowspan="1"><p data-id="714ad430-8146-4cd7-839b-03170c7dc015">A <code>gclid</code>, <code>wbraid</code>, or <code>gbraid</code> parameter is present (Google click IDs), or <code>msclkid</code> is present (Microsoft/Bing click ID)</p></td><td colspan="1" rowspan="1"><p data-id="123e04f1-5d29-4761-8752-c6a3be1f413b">Paid Search</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f999c778-facd-4f8e-9f6c-216852238203">3</p></td><td colspan="1" rowspan="1"><p data-id="0f2794b8-e519-4211-9cf0-252fa465e899">A <code>utm_source</code>, <code>utm_medium</code>, or <code>utm_campaign</code> parameter is present <strong>and</strong> the referring domain is <code>google.com</code></p></td><td colspan="1" rowspan="1"><p data-id="9f568c7c-2fb1-4128-a24e-3bf829cf41f2">Paid Search</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ece972b7-5a52-4eae-ad21-d040cada4ec9">4</p></td><td colspan="1" rowspan="1"><p data-id="550eb721-65b3-4abd-b4af-542b4f780c6e">The <code>utm_source</code> parameter contains <code>fb_ad</code>, <code>linkedin_ad</code>, <code>twitter_ad</code>, or <code>reddit_ad</code>, <strong>or</strong> the <code>ctwa_clid</code> parameter is present (WhatsApp click-to-ad)</p></td><td colspan="1" rowspan="1"><p data-id="d501db19-a092-4f74-bc6e-eeb19223bf5d">Paid Social</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="30f32261-ef98-4a56-8668-7617c34bb462">5</p></td><td colspan="1" rowspan="1"><p data-id="c82bf373-4c8d-45b7-8bc4-9631761c8501">The referring domain is a known social media site (Facebook, Instagram, LinkedIn, X, TikTok, etc.)</p></td><td colspan="1" rowspan="1"><p data-id="bf0c6f21-7542-4f96-b83f-2ae3cda4d859">Social Media</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="36e3d21b-b00b-4e67-831d-b293dc45412f">6</p></td><td colspan="1" rowspan="1"><p data-id="df571018-1f17-4a52-91ec-52a14fde5b1d">The referring domain is a known search engine (Google, Bing, Yahoo, DuckDuckGo)</p></td><td colspan="1" rowspan="1"><p data-id="3ccd33bc-ac0f-4ee5-9f5d-50e8dae7385d">Organic Search</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a88b0f45-2154-410d-a89b-f0c75eb951f8">7</p></td><td colspan="1" rowspan="1"><p data-id="70f112c1-7ba3-4c7a-88c9-864a65b553e0">The referring domain is anything else (not social, not search)</p></td><td colspan="1" rowspan="1"><p data-id="b40145c1-cb1c-4ca6-9c64-c395acda3178">Referrals</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="49ef061b-7651-47e2-95fb-eabfca860dcd">8</p></td><td colspan="1" rowspan="1"><p data-id="2fb2ddc6-e292-4143-b062-058c9a14cb7f">No referring domain and no tracking parameters present</p></td><td colspan="1" rowspan="1"><p data-id="a301a1da-c5a7-4e58-ba39-0f13c3fa14c6">Direct Traffic</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="81187fe9-4245-4683-a03f-6d0807f0ca3a">9</p></td><td colspan="1" rowspan="1"><p data-id="eb630d7e-048a-4786-a525-6d29ad083245">The lead came in through a non-web channel (call, SMS, email, WhatsApp, Messenger)</p></td><td colspan="1" rowspan="1"><p data-id="a74178f8-4dba-4277-ac1f-6bb3f6674327">Others</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cbc87a17-dbeb-4431-8306-b57e383bd25b">10</p></td><td colspan="1" rowspan="1"><p data-id="922ca884-d371-4f39-bf4d-e771da157d4b">The lead was created manually by a team member inside the CRM</p></td><td colspan="1" rowspan="1"><p data-id="dc6025c6-055e-4485-8add-7655685746c5">CRM UI</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="073a85bf-9a21-4508-9987-03d7e20d5bdc">11</p></td><td colspan="1" rowspan="1"><p data-id="a839c3cf-6bb4-4cae-ab18-74cc07bcd343">The lead was created or modified by an automated workflow inside the CRM</p></td><td colspan="1" rowspan="1"><p data-id="f0cf9934-3b94-46bd-b346-d3966d0bc925">CRM Workflows</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="35447365-0fef-4ae8-8cc9-570855219d55">12</p></td><td colspan="1" rowspan="1"><p data-id="948a4dfe-7c7c-4f86-bba0-92700e0cf123">The lead was created by a third-party integration (Zapier, API, EMR sync)</p></td><td colspan="1" rowspan="1"><p data-id="7ff9c87d-2030-4590-a769-3fdba6b8a647">Third-Party</p></td></tr></tbody></table>

### Why this order matters

Notice that **paid traffic rules run first**. This is intentional. If a Google Ad lands a visitor on your page and they convert, the engine sees the `gclid` parameter (rule 2) and stops there — assigning **Paid Search**. It never bothers checking rules 5, 6, or 7.

This also means **UTM parameters override referring domains in most cases**. If you tag your Facebook ad URL with `utm_source=fb_ad`, the visitor will be categorized as Paid Social even if Meta strips the referrer header.

> 💡 **Pro tip:** If you're seeing leads from your paid campaigns categorized as Direct Traffic, Organic Search, or Social Media instead of Paid Search/Paid Social, that's almost always a UTM parameter problem. See the Troubleshooting section.

* * *

## Real-world examples

Here's how attribution actually plays out across different visitor scenarios. Examples 1–3 all submit the **same "Contact Us" form on the same contact page**, but land in three different attribution buckets based on where they came from. Example 4 shows what attribution looks like when the contact never visits your website at all.

### Example 1: Direct Traffic

A prospective patient navigates directly to your website, browses a provider bio page, then submits the contact form.

<table data-id="e78faa20-bb6f-47b0-8986-c7d7cd878e6f" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="dbf9b777-88f9-43a1-8d15-30aa30396562"><strong><u>Field</u></strong></p></td><td colspan="1" rowspan="1"><p data-id="3a4e2ed0-39ca-4605-947b-99e7ae46564d"><strong><u>Captured Value</u></strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="902b9f43-db64-4c2c-b1b7-3384fc5a6152"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="5e72b692-f703-4585-95ca-b628df50c799">Direct Traffic</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="fad5c12e-c63c-4193-94dd-b10bf833503c"><strong>Session URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="920d6f28-17f3-42cc-83d9-f3cf5183b9e3"><code>https://yourpractice.com/about/providers/dr-amanda-rodriguez/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f4785744-5945-4334-afcb-129f06062efe"><strong>Page URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="2dec4b37-0637-430f-bd10-d4bddb7c192f"><code>https://yourpractice.com/contact/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a7e0955e-380b-4e31-9ba0-e6a6c0399471"><strong>Referrer</strong></p></td><td colspan="1" rowspan="1"><p data-id="eadd9daf-7b19-436e-9b4f-b15a86c4406e"><em>(empty)</em></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8caec240-4cf9-4802-859d-4887e540c69a"><strong>UTM Event Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="b6d6fda0-a762-4962-b128-c868595a831c"><code>direct</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b923a72b-ea0d-432a-8744-7b819454701d"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="64f870e9-d044-4fc0-a1fb-b8ab0f0abae9"><code>form</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="15e936b8-fdf2-4e56-92a3-a52affec6290"><strong>Form Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="1769aab4-dd59-4773-b755-065783645963">Contact Us</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4f342369-7a1b-4553-8ab8-b63189bf9321"><strong>Device</strong></p></td><td colspan="1" rowspan="1"><p data-id="c25d7f5d-1cef-47ca-9daa-3dc13eeea9c9">iPhone (Safari, iOS 18)</p></td></tr></tbody></table>

**Why it landed in Direct Traffic:** No referrer was captured, and no UTM parameters were present. Rules 1–7 didn't match, so the engine fell through to **rule 8**: no referring domain, no tracking URL → Direct Traffic.

**What this tells you:** This patient already knew about your practice — they typed your URL directly, used a bookmark, or clicked a link from somewhere that stripped the referrer (an iMessage, an in-app browser, a private browsing session, an email client). The Session URL is also revealing: they were specifically researching one of your providers, which is a strong consult-intent signal worth flagging for your front desk.

* * *

### Example 2: Organic Search

A prospective patient searches for a specific treatment on Bing, lands on your treatment page, navigates to the contact page, and submits the form.

<table data-id="887bf002-0b3b-49ab-98d2-c6f5044b200a" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="11ceed8b-c5af-4d02-b2b2-1fd6a965ce36"><u>Field</u></p></td><td colspan="1" rowspan="1"><p data-id="57b2ac22-be49-4a3c-ad9c-17cc51be30c2"><u>Captured Value</u></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="99776d8b-e7a1-475f-aea9-eb3731f28949"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="aa7f23e6-e783-4ae2-8fbe-471fbc5d97a8">Organic Search</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6bf38ba3-39ac-4b1c-a0d6-e21f70f70597"><strong>Session URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="aeb2dc0a-f6f1-4c2e-b36e-6a1a6b18de55"><code>https://yourpractice.com/procedures/skin-treatments/chemical-peels/cosmelan-md-depigmentation-peel/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f7d858e8-5454-4f4a-b825-1c7e0f3412fd"><strong>Page URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="0072f74f-acc2-4c3f-9164-96f72e0f0f56"><code>https://yourpractice.com/contact/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="09230518-bad4-456b-9fcf-413d54bcc46a"><strong>Referrer</strong></p></td><td colspan="1" rowspan="1"><p data-id="0d79c85e-6bfd-4939-a9e4-e5524bc56ef5"><code>https://www.bing.com</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="72ff5dd2-c5b9-468d-bb97-9828a60d3acf"><strong>UTM Event Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="b59df113-de2a-4ad6-8718-afc072904b9b"><code>bing organic</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="05534906-160d-4057-b75e-cfd9c9fd6899"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="3a934eec-f760-4e18-ac11-cd7bae56ea26"><code>form</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e4d54554-070d-482f-9c3e-c65bb50f3743"><strong>Form Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="994b6b7e-af5c-4bbf-892e-3da0cb0319ff">Contact Us</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f0c6549a-8c87-4fd7-8f0b-2aafbe33179e"><strong>Device</strong></p></td><td colspan="1" rowspan="1"><p data-id="12f95249-528d-49ab-93dc-5553a288c6cf">Windows desktop (Microsoft Edge)</p></td></tr></tbody></table>

**Why it landed in Organic Search:** No paid UTMs, no Google or Microsoft click IDs. The referrer (`bing.com`) is a known search engine, so **rule 6** matched → Organic Search.

**What this tells you:** This patient discovered your practice through SEO — and the Session URL reveals exactly which page ranked for their search ("Cosmelan MD depigmentation peel"). This is gold for your content strategy: it shows which procedure pages are doing the work of attracting cold demand. Note that Organic Search includes Bing, Yahoo, and DuckDuckGo, not just Google — don't underestimate the long tail of search engines, especially for desktop users.

* * *

### Example 3: Referral

A patient is browsing a partner website (a sister practice, a directory, or a press article), clicks through to your med spa, lands on the homepage, navigates to contact, and submits the form.

<table data-id="7875af5b-8ab1-4c97-8062-f7184ec27794" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="7edf3e68-46b6-48f0-93d9-e2f7202a22f9"><u>Field</u></p></td><td colspan="1" rowspan="1"><p data-id="6b1fc9fe-d089-45dc-a06a-aea099a2bda7"><u>Captured Value</u></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6e1ec4e7-8981-4a10-98d9-bc0bedf97dc7"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="b60085be-8780-44e7-a4a9-1f2f20e77e48">Referral</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b249e8e9-dab7-46fb-a98d-82dd3d07eb3e"><strong>Session URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="567542a5-45fd-45cc-868f-d7e17a16ebb1"><code>https://yourpractice.com/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f2ee9ba7-c189-4a2c-bfb0-d32d8c11aa3b"><strong>Page URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="b9250eb9-2ee0-4857-beb0-2821b85bd4cd"><code>https://yourpractice.com/contact/</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d5335195-7dba-494a-a044-00366467658b"><strong>Referrer</strong></p></td><td colspan="1" rowspan="1"><p data-id="d400f411-ceb6-40a9-ad04-2ee5972885ea"><code>https://www.partnerpracticesite.com</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7c984427-cc11-4ae7-af9d-ce9ddada6d2c"><strong>UTM Event Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="5a58d0a2-4f8a-4b20-b838-1ef7ad2a4dfb"><code>direct</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4c108769-f5ee-4dc7-bee3-e4aae2dc417a"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="18710610-c7ac-4a23-8ffb-67c868f3cf54"><code>form</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d12c9f1b-bc56-45f9-856a-60fa7ef0b80c"><strong>Form Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="122bfef6-3bc7-45cd-9035-b40def8e0d6e">Contact Us</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="97162d73-1f7e-4f2e-a401-cc3c7a446e97"><strong>Device</strong></p></td><td colspan="1" rowspan="1"><p data-id="99c541f6-639f-4fe7-aaa5-0b30c8fa7904">iPhone (Safari, iOS 18)</p></td></tr></tbody></table>

**Why it landed in Referral:** No paid UTMs, no Google click IDs, the referrer isn't a known social platform (rule 5 didn't match), and the referrer isn't a known search engine (rule 6 didn't match). **Rule 7** matched: a referring domain that's neither social nor search → Referral.

**What this tells you:** This patient came from another website that links to yours. The Referrer field tells you exactly which one. For practices with sister sites (e.g., a plastic surgery practice that also operates a med spa), partner directories, RealSelf-style listings, or press mentions, monitoring the Referral source over time will show you which of those off-site assets are actually driving leads.

* * *

### Example 4: Instagram DM (limited attribution)

A potential patient sees one of your Instagram posts, sends a direct message asking about a treatment, and that conversation generates a contact in Aesthetix CRM via the Conversations integration.

<table data-id="eb448ff6-0579-4284-9867-b8c69d003720" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="71592f33-648c-46b6-820f-a64abac29c94"><u>Field</u></p></td><td colspan="1" rowspan="1"><p data-id="e6f4c2c2-a307-4379-af50-6983c3d3e125"><u>Captured Value</u></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="21f4bdd3-61cc-4e0a-90a2-293ae81f7993"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="23e6ad8b-c49c-47e3-b29e-00d51e965323">Social media</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="481b22f1-c176-4feb-9055-81a3fe5f973d"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="fa0a05c1-e875-41d2-9def-a77a66a33b99"><code>instagram</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a8bb26f7-f916-4b8d-a091-9aec69eab770"><strong>Medium ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="95ef5442-2312-40d3-8dcc-591372b7a13d"><code>1610020290228413</code> (your connected Instagram account ID)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1341b9a3-b6f2-4b9c-bf5e-8fce707c4abc"><strong>Ig Sid</strong></p></td><td colspan="1" rowspan="1"><p data-id="6a06bb03-eb69-48a4-b294-8187e67cc6c9"><code>1610020290228413</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="44d3f45f-d5ae-4c0c-9990-5ae0f40ee61e"><strong>Session URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="40f964bf-17f5-4106-9d2c-afd96e86f6dd"><em>(empty)</em></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="481e130b-cf66-48e4-b95c-70231da5dce6"><strong>Page URL</strong></p></td><td colspan="1" rowspan="1"><p data-id="1fc730bc-92aa-4a29-a3c7-c71de1468406"><em>(empty)</em></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c3cc1ad3-1475-4681-91e3-ba5b69c146cf"><strong>Referrer</strong></p></td><td colspan="1" rowspan="1"><p data-id="f4b21731-ed3f-43ab-9a17-b6da7f97553c"><em>(empty)</em></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="794924b8-14cb-4e80-998d-d2cb0b463add"><strong>UTMs</strong></p></td><td colspan="1" rowspan="1"><p data-id="1e22fd99-cce8-45d9-a6ab-0e011c9443a3"><em>(empty)</em></p></td></tr></tbody></table>

**Why the data is so sparse:** This contact was never on your website. The conversion event happened entirely inside Instagram's DM interface. Aesthetix CRM only knows what Meta exposes through the messaging integration — which Instagram account received the message, and a session ID. There's no browser session to read URLs, referrers, or UTMs from.

**What this tells you:** This is the **expected behavior** for any DM-based channel (Instagram, Facebook Messenger, WhatsApp). You'll see the Source and Medium correctly identified, but you won't get the page-level or campaign-level attribution detail that web-based conversions produce. If you need to know _which Instagram ad or post_ drove a particular DM, you'll need to cross-reference the timing and content with your Meta Ads Manager reports — Aesthetix CRM doesn't have visibility into that on its own.

* * *

> 💡 **The big takeaway:** All three \[main\] of these submissions came through the same form on the same contact page. The conversion event itself is identical. But because attribution is based on the **Session URL** (entry point) and **Referrer** (where they came from) — not the Page URL where the form lives — three completely different sources were captured.
> 
> The Instagram DM example shows the other side of the coin: when there's no web session to attribute, the data captured is intentionally minimal. That's not a bug — it's a reflection of what the source channel actually exposes.
> 
> If you ever wonder "why did this contact get tagged as X?", look at the **Session URL**, **Referrer**, and **Medium** fields first, then walk those values through the rules table above. The answer will always be there.

* * *

## Setting up Paid Search tracking (Google Ads)

To get your Google Ads traffic correctly categorized as **Paid Search**, you need to apply our Google Ads UTM template to your final URL. Aesthetix CRM uses these parameters to identify and group your campaigns inside the Ad Reporting dashboard.

### The Google Ads UTM template {lpurl}?utm\_source=adwords&utm\_medium={adname}&utm\_campaign={campaignname}&utm\_content={adgroupname}&utm\_keyword={keyword}&utm\_matchtype={matchtype}&campaign\_id={campaignid}&ad\_group\_id={adgroupid}&ad\_id={creative}

> ⚠ **This is case-sensitive.** Copy and paste it exactly. Do not retype.

### Parameter breakdown

<table data-id="181130f7-ddcc-4ef6-824d-61352485b815" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="d2796778-91b2-40e8-acfd-92b57d3956b5"><strong>Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="f198767d-f659-4dd1-a7a0-e57c810e6243"><strong>Key</strong></p></td><td colspan="1" rowspan="1"><p data-id="1de0438f-967b-49c7-a6fe-0be315b02fb7"><strong>Value</strong></p></td><td colspan="1" rowspan="1"><p data-id="b6146e6d-8fa0-4b99-a909-1d10060c42c0"><strong>Set By</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="399af1e9-afd4-41c3-8fed-76bf901403f6">UTM Source</p></td><td colspan="1" rowspan="1"><p data-id="98a396d1-7584-455f-a09f-258cb8ac27a5"><code>utm_source</code></p></td><td colspan="1" rowspan="1"><p data-id="39f12b04-7d66-4c13-bb42-e5de3d2301e5"><code>adwords</code></p></td><td colspan="1" rowspan="1"><p data-id="7067d0db-f0fa-404d-8418-4d9772e5a105">You (must be exactly <code>adwords</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0d86c5a6-a2ec-4dcb-b748-5a83e93a62bc">UTM Medium</p></td><td colspan="1" rowspan="1"><p data-id="b675fad0-9082-4ad7-9a54-34362608555e"><code>utm_medium</code></p></td><td colspan="1" rowspan="1"><p data-id="74358a03-5664-410c-8c1f-5b6829395c81"><code>{adname}</code></p></td><td colspan="1" rowspan="1"><p data-id="95515168-44fd-4d6f-84ad-6dceb535e4a4">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2096877b-156a-4e9f-9957-aafeac29dce7">UTM Campaign</p></td><td colspan="1" rowspan="1"><p data-id="96827422-aeb2-4f47-9387-4d7b54c0fe87"><code>utm_campaign</code></p></td><td colspan="1" rowspan="1"><p data-id="3eaaebba-4f69-41f5-987f-6d4a47670866"><code>{campaignname}</code></p></td><td colspan="1" rowspan="1"><p data-id="06e191e5-2312-445b-99aa-84a0c1b70c9e">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="65384ba1-01d7-4a99-9c68-5ea53840c002">UTM Content</p></td><td colspan="1" rowspan="1"><p data-id="309d2412-7e1b-4609-a69b-52cb90533b06"><code>utm_content</code></p></td><td colspan="1" rowspan="1"><p data-id="f67397d6-829d-4524-b971-1d0a8874d3e7"><code>{adgroupname}</code></p></td><td colspan="1" rowspan="1"><p data-id="a05b3be2-079d-4a7c-8f81-660fc0d7c3ba">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9444a591-173c-43ab-9915-ec8e9a9fee25">Match Type</p></td><td colspan="1" rowspan="1"><p data-id="f974c3d4-4ccd-4db2-b845-810a7c87bd1f"><code>utm_matchtype</code></p></td><td colspan="1" rowspan="1"><p data-id="afcacfdb-3035-47f8-9e19-ee2f9f72badd"><code>{matchtype}</code></p></td><td colspan="1" rowspan="1"><p data-id="03819319-8740-4018-967f-ebbbcb644747">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d8d3d4e4-c8d5-4ff5-b371-2893b68509d2">Campaign ID</p></td><td colspan="1" rowspan="1"><p data-id="b52dcd85-fa39-4120-8ae1-2576e4dae3ef"><code>campaign_id</code></p></td><td colspan="1" rowspan="1"><p data-id="9b5d992f-bb67-4e1d-8d8a-c80bc912ddf2"><code>{campaignid}</code></p></td><td colspan="1" rowspan="1"><p data-id="1c029a0d-4d27-4cc2-a36c-2b602b8d4a94">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e315f341-e68c-4eb4-a6a5-17777c324cdd">Ad Group ID</p></td><td colspan="1" rowspan="1"><p data-id="2875940c-6dd2-460f-80ea-3649757b4172"><code>ad_group_id</code></p></td><td colspan="1" rowspan="1"><p data-id="b1eeb650-db21-47b2-86d2-58cc6566793e"><code>{adgroupid}</code></p></td><td colspan="1" rowspan="1"><p data-id="3e990005-0475-416a-a13d-9598f9231c6d">Google Ads (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2f98123d-5d77-4f3d-88b3-a5c3ff30bbdd">Ad ID</p></td><td colspan="1" rowspan="1"><p data-id="c5b58ca1-d38c-4d57-9cd3-98ca3e735e18"><code>ad_id</code></p></td><td colspan="1" rowspan="1"><p data-id="73d42ffa-6098-4e74-ab9b-e349a92d538a"><code>{creative}</code></p></td><td colspan="1" rowspan="1"><p data-id="e459e385-ce1c-46b0-b7b9-4f60eadfd1c7">Google Ads (auto-populated)</p></td></tr></tbody></table>

For full setup instructions including where to paste the template inside Google Ads, see the **Google Ads Reporting Setup** article.

[

Google Ads: All-In-One Guide

This comprehensive article combines multiple articles into one to help you get your Google ads properly setup and integrated with Aesthetix CRM.

](https://help.aesthetixcrm.com/en/articles/1096-google-ads-all-in-one-guide.md)

* * *

## Setting up Paid Social tracking (Meta — Facebook & Instagram)

To get your Meta Ads traffic correctly categorized as **Paid Social**, apply our Meta UTM template to your final URL.

### The Meta Ads UTM template

```javascript
{YourLandingPageUrl.com}?utm_source=fb_ad&utm_medium={{adset.name}}&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&campaign_id={{campaign.id}}

```

> ⚠ **This is case-sensitive.** Copy and paste it exactly. Note that Meta's dynamic placeholders use **double curly braces** `{{ }}` — Google's use single `{ }`.

### Parameter breakdown

<table data-id="59712812-b607-4a75-beca-3b192c22bee4" style="min-width: 100px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="2cd2af76-9e29-49bc-9bcc-4bb3ce70953a"><strong>Name</strong></p></td><td colspan="1" rowspan="1"><p data-id="cbc22fd5-9923-4f59-a6e9-3ba02065df32"><strong>Key</strong></p></td><td colspan="1" rowspan="1"><p data-id="9e051e13-3e69-4d5e-8ed1-d9196a5e3602"><strong>Value</strong></p></td><td colspan="1" rowspan="1"><p data-id="6832cc56-74a8-4f77-b645-0166efb8499d"><strong>Set By</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7236db8e-8e72-4872-8194-860feccbf841">UTM Source</p></td><td colspan="1" rowspan="1"><p data-id="beada931-b6f9-411d-828c-e7a5bcc30298"><code>utm_source</code></p></td><td colspan="1" rowspan="1"><p data-id="f8e65514-abf0-4a8a-98d1-2c0c99a583c6"><code>fb_ad</code></p></td><td colspan="1" rowspan="1"><p data-id="5a8a20c4-fab9-4020-9511-3d87b2b9b145">You (must be exactly <code>fb_ad</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="19eaf93e-54bb-4db4-9993-2bcd9d5567ca">UTM Medium</p></td><td colspan="1" rowspan="1"><p data-id="9bd58429-2f90-4d9f-937b-58b230dabedb"><code>utm_medium</code></p></td><td colspan="1" rowspan="1"><p data-id="2d3b2687-5f61-448d-8f7b-57b129ea6ad0"><code>{{adset.name}}</code></p></td><td colspan="1" rowspan="1"><p data-id="d689c1f5-eea0-4d66-b935-9be668965c2d">Meta Ads Manager (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="39d92f06-ae1f-4ee1-9bf6-b1b5093f9abe">UTM Campaign</p></td><td colspan="1" rowspan="1"><p data-id="4491c834-d66c-43d9-ba27-09801ad9af62"><code>utm_campaign</code></p></td><td colspan="1" rowspan="1"><p data-id="18a37045-16ae-4beb-8e52-217379ab969d"><code>{{campaign.name}}</code></p></td><td colspan="1" rowspan="1"><p data-id="9cf405ef-f0f8-4f5d-9f77-cc5660ee29db">Meta Ads Manager (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8f9de3de-beaf-4a4e-b7b2-ee7096a6721d">UTM Content</p></td><td colspan="1" rowspan="1"><p data-id="f1f395ab-eb6f-45c7-a2e9-021b531ea69b"><code>utm_content</code></p></td><td colspan="1" rowspan="1"><p data-id="4e661236-2b61-4744-babc-ba5159a5510f"><code>{{ad.name}}</code></p></td><td colspan="1" rowspan="1"><p data-id="864d6e14-294c-4897-b9e2-1194fdb140c6">Meta Ads Manager (auto-populated)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="64ffe5dd-bc3b-421c-be32-b4ad42fa5120">Campaign ID</p></td><td colspan="1" rowspan="1"><p data-id="927ef9fa-0af1-4c5a-a9d3-470407998846"><code>campaign_id</code></p></td><td colspan="1" rowspan="1"><p data-id="a92ba576-4076-4373-b8df-f232acadaf1d"><code>{{campaign.id}}</code></p></td><td colspan="1" rowspan="1"><p data-id="0ee3a799-d7cb-49a3-a231-2215e67e6f8f">Meta Ads Manager (auto-populated)</p></td></tr></tbody></table>

> 💡 The legacy value `utm_source=facebook` has been deprecated. Use `fb_ad` going forward — `facebook` will not be recognized as a paid social source.

For full setup instructions including where to paste the template inside Meta Ads Manager, see the **Meta Ads Reporting Setup** article.

[

Facebook Ads: All-In-One Guide

Use this guide as your one stop to set up Facebook ads whether using lead forms or landing pages.

](https://help.aesthetixcrm.com/en/articles/1098-facebook-ads-all-in-one-guide.md)

* * *

## Known limitations

Understanding these limitations up front will save your team a lot of "why isn't this working?" troubleshooting later.

### 1\. Attribution requires a compatible conversion event

Attribution data is captured through one of two mechanisms:

1.  **A native Aesthetix CRM form, calendar, survey, chat widget, or order form** — works on any site (native or external) where it's embedded
    
2.  **A standard HTML** `<form>` **element on a page where the External Tracking Script is installed** — works for compatible third-party forms with real `<form>` tags
    

Forms that fall outside both — **iframe-based embeds, popup-only forms, or JavaScript widget forms that don't render real HTML inputs** (including most WordPress page builder form widgets) — cannot be tracked. Page views may still be recorded if the script is installed, but submissions won't sync.

**Workaround:** Either embed a native Aesthetix CRM form on your external website, OR replace your incompatible form with one of the recommended HTML form plugins (WPForms, Gravity Forms, Contact Form 7) and install the External Tracking Script.

### 2\. Multi-page browsing journeys require a tracking mechanism on every page

If a visitor lands on Page A from a Google Ad and then navigates to Page B before submitting a form, the UTM parameters from Page A do not carry over **on their own**. By the time the conversion fires on Page B, the original ad click data has been lost.

**Solution:** Install one of the session-persistence layers covered above:

-   The **Chat Widget** on every page of your site, OR
    
-   The **External Tracking Script** on every page of your site
    

Either one will capture the original landing page data anonymously and attach it to the contact when they finally convert. See How attribution actually gets captured for detailed setup guidance.

### 3\. Encrypted search keywords show as "Unknown"

For Organic Search attribution, you may see keywords listed as "Unknown (SSL)." This is because Google encrypts search queries — the search engine itself doesn't pass keyword data to your site. This is a limitation of the search engines, not Aesthetix CRM.

### 4\. Some platforms strip referrer headers

Certain apps (in particular, the iOS Facebook and Instagram apps when opening links in their in-app browsers) sometimes strip the referrer header. When this happens without UTM parameters, the lead can land in **Direct Traffic** even though they clearly came from social. This is why proper UTM tagging on paid campaigns is non-negotiable.

### 5\. Do not add custom UTM parameters to the templates

Adding extra parameters or modifying the template values can cause the rules engine to miss the match. Stick to the templates exactly as provided.

### 6\. Inbound calls and SMS get categorized as "Others" — unless you use Number Pools

By default, calls into your business number are categorized as **Others** with no source detail — you know it came in by phone, but not which marketing channel drove it.

**Solution:** Set up **Number Pools** (Pattern D in How attribution actually gets captured). This dynamically swaps the phone number displayed on your website based on each visitor's traffic source, then attributes the resulting call back to that source. With Number Pools in place, calls inherit the same source classification as web conversions (Paid Search, Organic Search, etc.) instead of falling into Others.

For inbound SMS, email replies, and other text-based channels, there's no equivalent solution today — these will continue to be categorized as Others regardless of your tracking setup.

### 7\. Browser privacy settings can break session persistence

Modern browsers — particularly Safari on iOS and macOS — have aggressive privacy features (Intelligent Tracking Prevention, content blockers, private browsing modes) that can clear the browser storage used by the Chat Widget and External Tracking Script. When this happens:

-   Anonymous session data captured on Page A may be cleared before the visitor reaches Page B
    
-   The conversion will fall back to Direct Traffic or Referral
    

This is more of an issue for visitors who:

-   Use Safari Private Browsing
    
-   Have third-party cookie blocking enabled aggressively
    
-   Wait more than 7 days between landing on the site and converting (iOS ITP clears tracking data after 7 days)
    

**Workaround:** This is a browser-level limitation, not something Aesthetix CRM can override. The best mitigation is to make your conversion path short — keep the form on or near the landing page so the conversion happens in the same session.

### 8\. Facebook Messenger and Instagram DM leads have limited attribution data

When a contact is created from a Facebook Messenger or Instagram Direct Message conversation (via the Conversations integration), the attribution captured is intentionally minimal because there's no browser session to attribute. You'll typically only see:

<table data-id="606d9780-b214-4984-87c9-39af3a5f7b31" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="9a89c6ed-3bc7-4fe6-a9cf-44fb492de601"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="725c83d7-f5e1-476a-8ff9-59e8e88ff882"><strong>Captured Value</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="815af567-0c69-4ed1-ba61-b738657a1827"><strong>Source</strong></p></td><td colspan="1" rowspan="1"><p data-id="5005a5b1-8870-49ee-978e-789a8b93be36">Social media</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="30ffcc11-6ca7-4348-891c-941dd85d1579"><strong>Medium</strong></p></td><td colspan="1" rowspan="1"><p data-id="9e97ccbf-0a84-4d77-9050-fb9d6f4f79e5"><code>instagram</code> or <code>facebook</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2df3237a-28e3-4ede-a11a-ed08a792bf2a"><strong>Medium ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="27dd995d-1b45-42f7-ab1f-1407ecfaa388">The unique ID of the connected Page or Instagram account</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="38fd360b-faf4-4547-993e-205c3a64f787"><strong>Ig Sid</strong> <em>(Instagram only)</em></p></td><td colspan="1" rowspan="1"><p data-id="ad87d757-8f3c-4cd3-9a3a-519604c22327">The Instagram session ID for the message thread</p></td></tr></tbody></table>

You will **not** get session URLs, referrers, UTMs, click IDs, or device data — because the contact never visited your website during the conversion event. The system only knows which channel they came from and which connected account received the message.

This is a fundamental limitation of message-based channels, not a configuration issue. The same applies (with even less detail) to WhatsApp messages and other DM-based integrations.

**What this means for your reporting:** Don't expect to see Meta Ad campaign-level attribution on Messenger/DM leads, even if those leads originated from a click-to-message ad. If campaign-level attribution on Messenger/DM leads is critical for your practice, you'll need to combine the Aesthetix CRM data with reporting from Meta Ads Manager directly.

* * *

## Troubleshooting

### My paid leads are showing up as "Direct Traffic" or "Organic Search"

This is by far the most common attribution problem. There are two possible root causes — work through them in order.

**Root cause #1: Missing session-tracking layer on a multi-page journey**

If your landing page and your conversion page are different pages, you need either the **Chat Widget** or the **External Tracking Script** installed on every page. Without that, the original UTMs from the ad-clicked landing page are lost the moment the visitor navigates to a different page.

To diagnose:

1.  Open your landing page in an incognito browser
    
2.  Append a test UTM string: `?utm_source=adwords&utm_medium=test&utm_campaign=diagnostic`
    
3.  Click an internal link on the landing page (e.g., "Contact" in the menu) to navigate to your conversion page
    
4.  Submit the form on the conversion page
    
5.  Check the new contact's attribution panel. If the source shows **Direct Traffic** or **Referral** instead of **Paid Search**, your session-tracking layer is missing or not firing on every page
    

**Root cause #2: UTM parameter problems on the ad itself**

If your visitors land on the conversion page directly from the ad (no navigation in between) but attribution still shows wrong, the issue is in your ad's URL configuration:

1.  **Verify case sensitivity.** `utm_source=AdWords` is **not** the same as `utm_source=adwords`. Lowercase only, exactly as provided in the template.
    
2.  **Verify spelling.** A typo like `utm_souce` (missing the `r`) will silently fail. The engine looks for the exact key.
    
3.  **Test the URL manually.** Copy the final URL from a live ad preview, paste it into a fresh incognito browser, submit the form yourself, and check the contact's attribution data.
    
4.  **Check that you used the correct template.** Google Ads uses `utm_source=adwords`. Meta uses `utm_source=fb_ad`. Mixing them up will land in the wrong category.
    

### My contact's attribution shows the wrong source

Check the **Session URL** field on the attribution record (not the Page URL — those are different). The Session URL shows the exact URL the visitor was on when they _first entered the session_, including all parameters and the referrer at that moment. Run that URL and referrer through the [rules table](https://claude.ai/chat/2b90641e-a1dc-4bf6-becc-7e2025d2b800#how-aesthetix-crm-determines-the-source-the-rules-engine) above — the first rule that matches will tell you exactly why it was categorized that way.

If the Session URL doesn't include the UTM parameters you expected, your ad isn't tagging the landing URL correctly — see the steps above.

### Attribution is missing entirely on a contact

If a contact has no attribution data at all, one of the following is true:

-   The contact was created manually (CRM UI) or via integration (Third-Party) and never had a tracked conversion event
    
-   The conversion event happened on a third-party form, not a native Aesthetix CRM asset
    
-   The contact was created before attribution tracking was active on the form/calendar/widget they used
    

### My External Tracking Script isn't firing — no console logs, no data

A few things to check, in order:

1.  **Verify the script is actually on the page.** Right-click the page → View Source → search for `external-tracking.js`. If it's not there, the script wasn't added or your CMS didn't save it.
    
2.  **Verify the** `data-tracking-id` **attribute is intact.** Some Google Tag Manager configurations strip attributes when wrapping scripts. If your console shows `Tracking: Missing data-tracking-id attribute`, GTM is the culprit. Either fix the GTM tag to preserve attributes, or install the script directly in your site footer.
    
3.  **Enable debug mode.** Add `data-debug="true"` to the script tag and reload the page with browser DevTools open. You should see tracking logs in the Console.
    
4.  **Check for cookie blocking.** Browser privacy extensions (uBlock Origin, Privacy Badger), enterprise content blockers, or Brave's built-in shield can block the tracking script entirely. Test in a different browser without extensions.
    
5.  **Check for CORS errors.** In DevTools → Network tab, filter by the tracking request. If you see CORS errors, the domain may not be properly connected to your account — reach out to support.
    

### My single-page app (React, Vue, Next.js) isn't tracking page navigations

Single-page apps don't trigger a fresh page load when the user navigates between routes — the URL changes but the script doesn't fire again. As a result, only the initial page load is tracked.

To fix this, your developer needs to manually trigger a `page_view` event after each route change. This is a common pattern for SPAs and is a one-time setup. Reach out to our team for the specific implementation guidance.

* * *

## For developers and integrations

If your team is building dashboards, custom integrations, or pulling attribution data into a data warehouse, the same attribution data shown in the UI is exposed through the Aesthetix CRM API. When you call the **Get Contact** endpoint, the response includes two attribution objects:

-   `attributionSource` → corresponds to **First Attribution** in the UI
    
-   `lastAttributionSource` → corresponds to **Latest Attribution** in the UI
    

Both objects have the same field structure. Here's the full schema:

<table data-id="1a85814e-023c-4bba-b140-41de0a93c609" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="8a41a334-ccfe-4e88-bd75-2eede98a072e"><strong>API Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="6eddc8a7-473d-4240-8752-0c32bcbedbf3"><strong>Type</strong></p></td><td colspan="1" rowspan="1"><p data-id="d9fcec7b-b978-4c89-974c-540124dadd5f"><strong>Description</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ee34d9c0-2e81-4805-b438-cce2e9064567"><code>url</code></p></td><td colspan="1" rowspan="1"><p data-id="4bcde518-404d-4196-964c-1750a473b48c">string (required)</p></td><td colspan="1" rowspan="1"><p data-id="dd4cc791-69b7-41bc-819a-c0e70fae4810">The URL where the conversion event fired</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="99597c33-e82e-4c4e-a5d4-fede1a795031"><code>campaign</code></p></td><td colspan="1" rowspan="1"><p data-id="722fd467-1d9b-41be-bbbb-5392016aec10">string</p></td><td colspan="1" rowspan="1"><p data-id="b290cc54-4af9-48b5-86a2-88d7c1b1eec7">Campaign name (from <code>utm_campaign</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e96955c1-2547-4150-ab9c-fa7437e42c05"><code>campaignId</code></p></td><td colspan="1" rowspan="1"><p data-id="1a176ef8-a682-4a3a-95bf-db4b99935f21">string</p></td><td colspan="1" rowspan="1"><p data-id="561c4d8b-ba88-4f5e-94cf-24ba20638ed5">Platform-assigned campaign ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ab0d062f-d17d-4d99-b820-fa9e0e30ff1f"><code>utmSource</code></p></td><td colspan="1" rowspan="1"><p data-id="315926e6-a9e3-472e-b271-70827ca1c824">string</p></td><td colspan="1" rowspan="1"><p data-id="0629a5b3-8784-4cc2-962d-e983ef06058b"><code>utm_source</code> parameter value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="75b26a7a-d925-4492-9d6b-f081b47984f1"><code>utmMedium</code></p></td><td colspan="1" rowspan="1"><p data-id="87f0bf6b-5298-4a3e-8023-baac0aabfe96">string</p></td><td colspan="1" rowspan="1"><p data-id="0f830c61-95cf-4986-8094-322fb22b3eb9"><code>utm_medium</code> parameter value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="afe4f8be-e582-4cdb-914b-8454111ee5a0"><code>utmContent</code></p></td><td colspan="1" rowspan="1"><p data-id="5e9db759-acd1-4480-846f-26178681d4f5">string</p></td><td colspan="1" rowspan="1"><p data-id="fcb3a133-4283-4b05-923f-f92812ec0314"><code>utm_content</code> parameter value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="fec21bd0-b817-4e35-85d1-e101ccfdbd9f"><code>referrer</code></p></td><td colspan="1" rowspan="1"><p data-id="cbf2ae47-f300-4546-b273-f2690b7e294d">string</p></td><td colspan="1" rowspan="1"><p data-id="783e98fa-3161-4c97-9a27-222a617651cb">Referring URL</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="fc737a32-f4ee-43cc-8fe4-c8c036bf6421"><code>gclid</code></p></td><td colspan="1" rowspan="1"><p data-id="d4400413-585a-4f70-92db-a1becf0fbb05">string</p></td><td colspan="1" rowspan="1"><p data-id="54f71629-0aa4-457e-8e2b-beae48bca66c">Google Ads click ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="54c93e10-5705-4230-b32c-7c4201be6064"><code>fbclid</code></p></td><td colspan="1" rowspan="1"><p data-id="614cf6ac-68a9-4259-94c1-34f73602bc30">string</p></td><td colspan="1" rowspan="1"><p data-id="c5cc0016-13e7-42a1-bc04-eb0f93b07521">Meta (Facebook/Instagram) click ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="03979976-331f-4e8f-a8ea-31f7813f0190"><code>msclkid</code></p></td><td colspan="1" rowspan="1"><p data-id="0f0f1159-49df-4924-a685-d086185597b2">string</p></td><td colspan="1" rowspan="1"><p data-id="428d45e2-d2c4-4cf7-8398-8d66bd4899a3">Microsoft / Bing Ads click ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="47246c86-d5fd-4f8a-858b-7f39dc474701"><code>dclid</code></p></td><td colspan="1" rowspan="1"><p data-id="4e8394b9-b340-4f59-a3e2-455189b4ec43">string</p></td><td colspan="1" rowspan="1"><p data-id="7cc5cdcd-20de-4dc6-8431-bce20284e463">Display &amp; Video 360 / Google Display click ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="736d6858-689e-443c-9687-49ea3ddc9e55"><code>fbc</code></p></td><td colspan="1" rowspan="1"><p data-id="0ffc4e99-543f-47b1-ac0e-66d109f7df3c">string</p></td><td colspan="1" rowspan="1"><p data-id="87e1845b-b719-4d8e-ab4f-4357de91a96a">Meta click cookie value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cd0b6c76-4cf7-4bf9-9dd6-7ce4f31651e4"><code>fbp</code></p></td><td colspan="1" rowspan="1"><p data-id="2538b596-2d55-4869-8bb4-776c66227e5f">string</p></td><td colspan="1" rowspan="1"><p data-id="8d5a48f5-3831-4af6-9fd1-def2c8a1daa5">Meta Pixel browser cookie value</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="85fed29f-e053-4c39-b367-ff78e87cc7b6"><code>fbEventId</code></p></td><td colspan="1" rowspan="1"><p data-id="8bc477ed-1000-496f-b475-fd5fad986c76">string</p></td><td colspan="1" rowspan="1"><p data-id="f242af79-9654-4e82-8851-009f4f2c84ca">Meta CAPI event deduplication ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="05c0f4cc-511b-4bbf-a63f-fda5fb1b0b88"><code>userAgent</code></p></td><td colspan="1" rowspan="1"><p data-id="d9a6e5b9-d9b2-4edb-9074-2a46fe991857">string</p></td><td colspan="1" rowspan="1"><p data-id="3e86502b-a381-405e-b21b-e883ebd4f970">Visitor's browser user agent string</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3bb07e1a-b87a-4a1d-95ed-dc2021ee06c9"><code>ip</code></p></td><td colspan="1" rowspan="1"><p data-id="ebf8bd67-b2a4-4d01-ab0b-b389efe0a2ff">string</p></td><td colspan="1" rowspan="1"><p data-id="bd225dea-9d1d-42ca-81a8-c525f7d95a40">Visitor's IP address</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="290dadc0-d23d-47ec-9a5b-5e615dedc3ba"><code>medium</code></p></td><td colspan="1" rowspan="1"><p data-id="dc549ffb-2fd1-4432-910b-9b33635532a1">string</p></td><td colspan="1" rowspan="1"><p data-id="bfb13472-abf9-4b45-a187-adbb609ee5ff">Conversion event type (<code>form</code>, <code>survey</code>, <code>calendar</code>, <code>chat</code>, <code>order_form</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e4b862a1-ca4d-4e1a-8c91-618f2ce65d06"><code>mediumId</code></p></td><td colspan="1" rowspan="1"><p data-id="19075fbf-06ed-4148-bf46-6717a3a7be5d">string</p></td><td colspan="1" rowspan="1"><p data-id="9b9e8055-19f4-4804-b985-441ac6abc2cc">Unique ID of the specific form, calendar, or widget that fired the event</p></td></tr></tbody></table>

The contact response also includes a top-level `visitorId` field — a unique identifier assigned to each chat widget visitor, useful for stitching pre-conversion chat sessions to the resulting contact.

**Common use cases:**

-   Pulling attribution data into a BI tool (Looker, Tableau, Power BI) for cross-channel ROI analysis
    
-   Building a custom dashboard for multi-location practices that need consolidated reporting
    
-   Sending conversion events back to ad platforms via custom server-side integrations
    
-   Deduplicating leads across the CRM and an EMR or other downstream system
    

Aesthetix CRM API documentation, authentication, and full endpoint reference is available through your account team. API access requires an active OAuth integration or private integration token; reach out for setup details.

> 💡 **For agencies:** If you manage multiple Aesthetix CRM accounts and want a single attribution dashboard across all of them, the Get Contact endpoint combined with the Workflows API and Reporting API gives you everything you need to build a custom multi-account reporting layer.

* * *

## FAQ

**Q: Will attribution work if I embed an Aesthetix CRM form on my WordPress / Squarespace / Shopify site?**

Yes — the embedded form itself will capture attribution at the moment of submission. But for cross-page browsing journeys (visitor lands on Page A from an ad, then navigates to Page B and submits), you'll also need either the **Chat Widget** or the **External Tracking Script** installed on every page. Otherwise the original ad data from Page A will be lost by the time they reach Page B.

**Q: Should I use the Chat Widget or the External Tracking Script for attribution?**

If you already use (or want to use) the Chat Widget on your site, it handles attribution tracking automatically — no separate script needed. If you don't want a chat interface on your website, install the External Tracking Script instead. They both serve the same attribution purpose; the Chat Widget just adds the chat functionality on top. There's no benefit to installing both — pick one.

**Q: Does the External Tracking Script work with iframe-based forms?**

No. The script needs to see a real `<form>` element in the page DOM to detect submissions. Iframe-based forms (and many third-party form widgets) live in a separate browser context that the script can't access. If you need attribution on a third-party form, replace it with an embedded Aesthetix CRM form.

**Q: I have the External Tracking Script installed on my WordPress site but form submissions aren't syncing. Why?**

This is almost always because the form on your site is built with a page builder (Elementor, Divi, WPBakery, Beaver Builder, Bricks) or a JavaScript widget that renders form-like UI using `<div>` elements instead of a real HTML `<form>` tag. The script can't detect those submissions. Either rebuild the form using **WPForms**, **Gravity Forms**, or **Contact Form 7**, or replace it with an embedded Aesthetix CRM form. To verify: right-click your form → Inspect → look for `<form>` wrapping the inputs. If you see only `<div>` elements, that's the issue.

**Q: Can I track page views without form submissions?**

Yes — once the External Tracking Script is installed, page views are tracked anonymously and stored in the visitor's browser. You can use the **Page View** workflow trigger to fire automations based on which pages a visitor has viewed, even before they convert. Note that no contact record is created until a form submission ties the anonymous activity to a real person.

**Q: How do I track which marketing channel drove an inbound phone call?**

Use **Number Pools** (Pattern D in How attribution actually gets captured). Without a number pool, calls are categorized as **Others** with no source detail. With a number pool, the phone number displayed on your website dynamically swaps based on where each visitor came from, and calls to those tracked numbers are attributed back to the original source.

**Q: Why don't my Instagram DM leads have any URL or campaign data?**

Because the conversion happened entirely inside Instagram — the lead never visited your website. The system can only capture what Meta exposes through the messaging integration: the source channel (Social media), the medium (instagram), and your connected account ID. Session URLs, referrers, and UTMs require a browser session, which DM-based conversions don't have. This is the expected behavior for any DM, Messenger, or WhatsApp lead. See Limitation #8 for more detail.

**Q: Can I run the Chat Widget, External Tracking Script, AND Number Pool snippet on the same site?**

Yes — all three can coexist on the same site and they don't conflict. They handle different attribution capture jobs: the Chat Widget covers chat conversions and acts as a session tracker, the External Tracking Script covers form submissions and page-view-triggered workflows, and the Number Pool snippet handles inbound call attribution via dynamic number insertion. For a complete attribution picture across forms, chat, and calls, you'd typically run two of the three: (Chat Widget OR External Tracking Script) plus the Number Pool snippet.

**Q: How do I export attribution data into a spreadsheet?**

Use the **custom contact fields** that Aesthetix CRM auto-populates with attribution data — these are included in standard CSV exports from the Contacts tab. The native attribution data on the Activity tab is not included in CSV exports, but the custom fields (First Attribution Session Source, Last Attribution Session Source, UTM Source, UTM Campaign, UTM Content, Attribution - Source URL, Attribution - GCLID, Attribution - FBCLID) cover the most-used values. See Attribution data in custom contact fields for the full list.

**Q: Can I use attribution data as merge fields in emails or SMS?**

Yes — through the **custom contact fields**. You can reference any of the mapped attribution custom fields the same way you'd reference any other contact field (e.g., `{{contact.last_attribution_session_source}}` in a template). The native attribution panel data is not directly available as merge fields, which is why we set up the custom field workflow in the first place.

**Q: Why are the UTM Source / UTM Campaign / GCLID / FBCLID fields empty on so many of my contacts?**

Because UTM parameters and click IDs only exist on URLs that were explicitly tagged with them — typically by paid ad campaigns. Contacts who arrived via organic search, direct traffic, organic social media, referrals, inbound calls, or DM channels don't have UTMs because no one tagged the URL they arrived through. **This is expected and normal.** If you want UTMs on your organic content (Instagram bio link, email newsletter links, partner referrals), you'll need to manually add UTM parameters to those URLs yourself. See the table in Why some custom fields will be empty for many contacts.

**Q: What is the "CRM Workflows" attribution source?**

"CRM Workflows" appears on contacts that were created or substantially modified by an automated workflow inside Aesthetix CRM (as opposed to manual entry, which produces "CRM UI"). For example, if you have a workflow that auto-creates a contact from a webhook trigger, that contact's source will be CRM Workflows. This is a relatively new source type and may not appear in older help materials. It's a normal source — not an error.

**Q: Why does my contact show one source at the top of their record and a different source on the attribution panel?**

Because those are two different fields. The single "Source" field at the top of the contact record is the **Contact Source** — a free-text label set by the form, URL parameter, or system default. The source shown on the Activity tab attribution panel is the **Attribution Source** — the standardized marketing channel categorization (Paid Search, Organic Search, etc.) assigned by the rules engine. Both are correct; they answer different questions. See Contact Source vs. Attribution Source for the full explanation.

**Q: I want all leads from a specific landing page to be tagged with a custom source label — how?**

Use the `?source=` URL parameter. Append it to your landing page URL (e.g., `https://yoursite.com/landing?source=summer_promo_2026`) and any form submitted from that page will be tagged with that custom Contact Source label. This overrides the form's built-in source value. Note: this only affects the Contact Source field, not the Attribution Source — the Attribution Source is still determined by UTMs and referrer.

**Q: If a returning lead submits another form, does their Contact Source get overwritten?**

No. Aesthetix CRM workflows that update Contact Source always check whether the field already has a value — if it does, the workflow leaves it alone. This means the Contact Source you see on a returning lead is the _original_ source from when they first entered your system, not the most recent form they happened to submit. (If you want to track the most recent interaction channel, use the **Last Attribution Session Source** custom field instead — that one updates on every new conversion.)

**Q: Do Trigger Link clicks update attribution?**

Yes. When a contact clicks a Trigger Link in an email, SMS, WhatsApp, GMB, or Messenger/DM, the click is recorded as a tracked event on their activity timeline and their **Latest Attribution** is updated to reflect that the most recent interaction was a Trigger Link click. The First Attribution remains locked to whatever was originally captured.

**Q: How long is anonymous session data stored before a contact submits a form?**

Session data is stored in browser storage and persists across navigation within the same browsing session. It can persist across multiple sessions for some time, but iOS Safari's Intelligent Tracking Prevention will typically clear it after 7 days of inactivity. For best results, design your conversion path so visitors convert in the same session they arrive in.

**Q: What happens to attribution if a contact converts twice in the same session?**

Latest Attribution will update to reflect the most recent conversion event. If both conversions happen on the same visit (same UTMs, same referrer), the data will look identical — but the timestamp will update.

**Q: Can I see attribution data in the Reporting dashboard, not just on individual contacts?**

Yes. The Ad Reporting dashboards roll up attribution data across all your contacts and let you filter by source, campaign, ad group, and more. See the Ad Reporting articles for details.

**Q: How does attribution interact with the Facebook/Meta Conversions API (CAPI)?**

They serve different purposes. Native attribution categorizes contacts inside Aesthetix CRM for your own reporting. CAPI sends conversion events back to Meta so Meta can optimize ad delivery. You should set up both — they don't conflict.

**Q: Does Aesthetix CRM support TikTok Ads attribution?**

Currently, the rules engine recognizes `fb_ad`, `linkedin_ad`, `twitter_ad`, and `reddit_ad` as Paid Social signals. TikTok-tagged URLs (e.g., `utm_source=tiktok_ad`) will currently fall into Social Media or Referrals depending on the referrer. If TikTok is a major channel for your practice, contact our team — we can help you tag URLs to land in a meaningful category.

**Q: Will attribution capture if a patient clicks an SMS link and submits a form?**

Yes — but the source assigned will be based on the URL parameters in the SMS link. If you don't add UTM parameters to your SMS links, the conversion will likely be categorized as Direct Traffic. We recommend tagging SMS campaign links with `utm_source=sms&utm_campaign={campaign_name}` to track their performance.

**Q: Can I edit attribution data after it's been captured?**

First Attribution is locked once captured and cannot be edited. Latest Attribution updates automatically on every new conversion event. Neither can be edited manually through the UI.

**Q: Does attribution work on my mobile-optimized landing page?**

Yes. The attribution engine doesn't care about device type — it reads the URL and referrer, both of which are present on mobile and desktop equally.

**Q: What are the Fbp, GA Client ID, and FB Event ID fields on the attribution panel?**

Those are **tracking identifiers**, not attribution sources. They're captured automatically alongside attribution data so they can be used downstream:

-   **Fbp** is the Meta Pixel browser cookie. It's needed to send conversion events back to Meta via the Conversions API (CAPI), which lets Meta optimize ad delivery against your actual closed leads.
    
-   **GA Client ID** is the Google Analytics client cookie. It's used to stitch together user activity between your website's GA4 tracking and conversion events fired in Aesthetix CRM.
    
-   **FB Event ID** is a unique ID generated for each conversion event so that browser-side Pixel events and server-side CAPI events can be deduplicated by Meta.
    

You don't need to do anything with these fields directly. They're stored so the system can use them when sending data to Meta and Google for ad optimization.

* * *

_Need help setting up attribution tracking for your campaigns? Setup of paid ad attribution tracking falls outside the standard support scope. If you'd like our team to configure your Google Ads or Meta Ads UTM templates, submit a Custom Build Request and we'll get you a quote._
