The implementation guide. Custom property JSON, workflow export schema, UTM tagging patterns, and source-property propagation from contact to deal.
HubSpot's native Original Source fields were not designed for AI answer engines. Out of the box, a contact who found you through a ChatGPT citation lands with Original Source = Direct Traffic, Original Source Drill-Down 1 = blank, Original Source Drill-Down 2 = blank. First-touch attribution, broken.
That's the active HubSpot community thread everyone is hitting: "Identifying LLM-Referred Contacts in HubSpot: A Temporary Hack." It is the exact shape of the problem. This page is the implementation guide: the custom properties, the workflows, the UTM schema, and the source-property propagation chain that fixes it.
HubSpot is Lantern's V1 CRM integration. Everything below is what Lantern ships natively. If you want to do it yourself first, this is the blueprint.
No single signal identifies an AI-referred contact reliably. You combine three:
Each signal alone has gaps. Together they cover ~85% of AEO-referred contacts in typical B2B SaaS funnels.
Create the following custom properties in HubSpot. The JSON below is the export-ready definition you can use to request these from your RevOps team (or Lantern, if you're onboarding with us).
{
"contact_properties": [
{
"name": "aeo_first_touch_engine",
"label": "AEO First Touch Engine",
"type": "enumeration",
"fieldType": "select",
"options": [
{"label": "ChatGPT", "value": "chatgpt"},
{"label": "Perplexity", "value": "perplexity"},
{"label": "Claude", "value": "claude"},
{"label": "Gemini", "value": "gemini"},
{"label": "AI Overviews", "value": "ai-overviews"},
{"label": "Other AI", "value": "other-ai"}
],
"groupName": "contactinformation"
},
{
"name": "aeo_first_touch_prompt",
"label": "AEO First Touch Prompt",
"type": "string",
"fieldType": "text"
},
{
"name": "aeo_first_touch_timestamp",
"label": "AEO First Touch Timestamp",
"type": "datetime",
"fieldType": "date"
},
{
"name": "aeo_self_reported_source",
"label": "AEO Self-Reported Source",
"type": "string",
"fieldType": "text"
},
{
"name": "aeo_touchpoint_count",
"label": "AEO Touchpoint Count",
"type": "number",
"fieldType": "number"
}
]
}
{
"company_properties": [
{"name": "aeo_first_touch_engine", "label": "AEO First Touch Engine", "type": "enumeration"},
{"name": "aeo_first_touch_prompt", "label": "AEO First Touch Prompt", "type": "string"},
{"name": "aeo_first_touch_timestamp", "label": "AEO First Touch Timestamp", "type": "datetime"}
]
}
{
"deal_properties": [
{"name": "aeo_influenced", "label": "AEO Influenced", "type": "enumeration",
"options": [{"label": "Yes", "value": "yes"}, {"label": "No", "value": "no"}]},
{"name": "aeo_first_touch_engine", "label": "AEO First Touch Engine", "type": "enumeration"},
{"name": "aeo_first_touch_prompt", "label": "AEO First Touch Prompt", "type": "string"},
{"name": "aeo_attributed_pipeline", "label": "AEO Attributed Pipeline", "type": "number"}
]
}
Any outbound link you can influence inside content likely to be cited by LLMs should carry the following UTM schema. Used consistently, it produces a queryable dataset inside HubSpot (via the contact's hs_analytics_first_url property).
utm_source = ai-search (always — this is your "channel" in HubSpot)
utm_medium = citation (for links inside answers) or referral (for links on third-party pages LLMs crawl)
utm_campaign = <engine>-<content-slug> — e.g., chatgpt-comparison-hubspot-alternatives
utm_term = the tracked prompt (optional but recommended for prompt-level attribution)
utm_content = the specific asset — blog, compare, learn, homepage
Worked example. A ChatGPT answer cites your comparison page at runlantern.com/compare/lantern-vs-profound/. Because most buyers copy-paste the URL rather than click, you won't see UTMs on those. But when the buyer then shares the link in a Slack message to a colleague, or you drop that same URL into a LinkedIn post, you tag it: ?utm_source=ai-search&utm_medium=citation&utm_campaign=chatgpt-profound-alternatives&utm_content=compare. The UTM-tagged click produces a clean first-touch record.
This is the single most important piece of instrumentation in your HubSpot. Every inbound form — demo request, trial signup, gated download, contact us, newsletter — carries a free-text field:
Label: How did you first hear about us?
Type: Single-line free text (not a dropdown — dropdowns bias the answer)
Required: Optional (don't add friction), but track non-response rate; it should be under 30%
Maps to: aeo_self_reported_source property on the contact record
Responses that contain any of the following strings are AEO touchpoints: ChatGPT, GPT, OpenAI, Perplexity, Claude, Anthropic, Gemini, Bard, Google AI, AI search, AI Overviews, an AI, asked AI, asked ChatGPT. Parse with a regex workflow; flip aeo_first_touch_engine accordingly.
Three HubSpot workflows, each with a clear trigger and action. Workflow exports below are described (not literal JSON — HubSpot workflow JSON is internal-only; your RevOps team will build them from these specs).
Trigger: aeo_self_reported_source is known.
Actions: An if-branch tree matching the response text against each engine pattern. If contains "chatgpt" or "gpt" → set aeo_first_touch_engine = chatgpt. If contains "perplexity" → perplexity. And so on. If none match but the response is non-empty, log and skip. Set aeo_first_touch_timestamp to the form submission time.
Trigger: aeo_first_touch_engine is known on contact.
Actions: Copy aeo_first_touch_engine, aeo_first_touch_prompt, aeo_first_touch_timestamp to the primary associated company via property sync. On deal creation where the primary contact has aeo_first_touch_engine populated, set aeo_influenced = yes and snapshot the three properties onto the deal.
Trigger: deal stage changes and aeo_influenced = yes.
Actions: Set aeo_attributed_pipeline = deal amount × HubSpot stage probability. Write to the deal. Log an event to a deal timeline that the CFO's Ops team can query.
With the schema and the workflows in place, the monthly CFO report becomes a single HubSpot list filter plus a formula:
aeo_influenced = yes AND create_date >= first day of monthaeo_attributed_pipelinedealstage = closedwon AND aeo_influenced = yes, sum amountThose two numbers are the top of the one-page memo. The rest is math you already know: AEO CAC payback = (program cost) ÷ (closed-won × gross margin × 1/12). See the CFO's Guide for the full memo template.
Everything on this page can be built manually by your RevOps team. It takes 2–4 days of focused work. Lantern ships it pre-built on our HubSpot integration, plus the AI citation detection layer (the other half of the chain — see AEO pipeline attribution for the full six-step chain).
Two tiers. $99/mo for the self-serve install. Enterprise for custom property schemas, field-level encryption, and a shared Slack channel with our engineering team. No per-seat math. No per-prompt math.
If you want the downloadable template of everything on this page — JSON property definitions, workflow specs, the form field schema — grab the HubSpot AEO dashboard template.
Lantern ships the full HubSpot attribution layer — properties, workflows, citation tracking, monthly PDF — natively. $99/mo or Enterprise.
Join Waitlist