HubSpot-Native AEO Setup, step by step

The admin's guide to wiring AEO into HubSpot natively — 5 custom properties, a tagging workflow, deal-stage mapping, UTM schema, and a weekly report your CMO can read on a phone.

Published April 17, 2026 · 18 min read

Before you buy another AEO tool, wire the attribution into HubSpot. Most of what B2B SaaS CMOs need to survive a renewal review — a dollar number for AEO-influenced pipeline, a weekly report, deal-level tagging — already exists in the HubSpot seat you're paying for. It's just not turned on by default.

This guide is the HubSpot-native setup one RevOps admin can ship in a day. Six steps: custom properties, a workflow that tags AEO-source contacts, deal-stage mapping, a standardized UTM schema, a weekly report, and the four failure modes that break it. Everything runs on Marketing Hub Pro and up. No outside vendor required for the core wiring. We'll note where Lantern ($99/mo or Enterprise) accelerates it, but the guide works standalone.

If you need the budget case before the technical build, read the CFO's Guide to AEO Budget Defense. If you need the 2026 benchmarks to size pipeline against, the 2026 AEO Pipeline Benchmark preview has the working numbers.

Step 1 — Create the 5 AEO custom properties

The entire setup rests on five Contact-level properties plus two mirror properties on the Deal object. Create them under Settings → Properties → Contact Properties.

These are not HubSpot-native defaults. Do not attempt to repurpose Original Source — it misclassifies LLM traffic as Direct, and the "Identifying LLM-Referred Contacts in HubSpot: A Temporary Hack" thread in the HubSpot community is evidence the defaults don't hold up. Custom properties are the durable fix.

The JSON below is what you'd push via the HubSpot Properties API if you're creating them programmatically. Admins creating them in the UI can use this as the field-by-field reference.

[
  {
    "name": "aeo_source_engine",
    "label": "AEO Source Engine",
    "type": "enumeration",
    "fieldType": "select",
    "groupName": "aeo_attribution",
    "description": "First AEO engine detected on the contact record. Written by workflow when utm_source matches an AEO pattern.",
    "options": [
      { "label": "ChatGPT", "value": "chatgpt", "displayOrder": 1 },
      { "label": "Perplexity", "value": "perplexity", "displayOrder": 2 },
      { "label": "Claude", "value": "claude", "displayOrder": 3 },
      { "label": "Gemini", "value": "gemini", "displayOrder": 4 },
      { "label": "Copilot", "value": "copilot", "displayOrder": 5 },
      { "label": "AI Overviews", "value": "ai-overviews", "displayOrder": 6 },
      { "label": "Other AEO", "value": "other", "displayOrder": 7 }
    ]
  },
  {
    "name": "aeo_first_touch_prompt",
    "label": "AEO First-Touch Prompt",
    "type": "string",
    "fieldType": "text",
    "groupName": "aeo_attribution",
    "description": "Slug of the prompt cluster that the first AEO session landed against. Populated from utm_campaign."
  },
  {
    "name": "aeo_first_touch_url",
    "label": "AEO First-Touch URL",
    "type": "string",
    "fieldType": "text",
    "groupName": "aeo_attribution",
    "description": "The landing page URL of the contact's first AEO session. Populated from the HubSpot analytics first-touch page."
  },
  {
    "name": "aeo_self_reported_source",
    "label": "AEO Self-Reported Source",
    "type": "string",
    "fieldType": "text",
    "groupName": "aeo_attribution",
    "description": "Free-text value from the 'How did you first hear about us?' form field, parsed to extract AEO engine names."
  },
  {
    "name": "aeo_touchpoint_count",
    "label": "AEO Touchpoint Count",
    "type": "number",
    "fieldType": "number",
    "groupName": "aeo_attribution",
    "description": "Running total of AEO touchpoints across the contact's lifetime. Incremented by workflow on every AEO-tagged session."
  }
]

Mirror two of these on the Deal object — aeo_first_engine and aeo_first_prompt — copied from the primary contact at deal creation. This is what lets pipeline reports roll AEO attribution to the dollar level.

Why these five, not ten. Attribution drifts when property count gets ambitious. Five is the minimum to answer: which engine, which prompt cluster, which page, what the buyer self-reported, and how many touches. Add more only when the first five are stable for 60 days.

Step 2 — The workflow that tags AEO-source contacts

The workflow is a Contact-based automation that fires on two enrollment triggers: a new session with utm_source matching an AEO pattern, or a form submission where the "How did you first hear about us?" field contains AEO engine language.

Build it under Automation → Workflows → Create workflow → Contact-based. Here is the workflow's logical shape, exported pseudo-JSON — close to what you'd see if you exported a HubSpot workflow backup. Adapt the exact action IDs for your portal.

{
  "workflow_name": "AEO Source Tagging — v1",
  "type": "CONTACT_FLOW",
  "enabled": true,
  "enrollment_triggers": [
    {
      "trigger_type": "contact_property_change",
      "property_name": "hs_latest_source_data_1",
      "operator": "CONTAINS_TOKEN",
      "values": ["chatgpt", "perplexity", "claude", "gemini", "copilot", "ai-overviews", "openai.com", "perplexity.ai"]
    },
    {
      "trigger_type": "form_submission",
      "form_id": "",
      "property": "how_did_you_first_hear_about_us",
      "operator": "CONTAINS_TOKEN",
      "values": ["chatgpt", "chat gpt", "gpt", "perplexity", "claude", "gemini", "copilot", "ai overview", "ai search"]
    }
  ],
  "actions": [
    {
      "id": 1,
      "type": "SET_CONTACT_PROPERTY",
      "property": "aeo_source_engine",
      "value_from": "EXTRACT_ENGINE_FROM_UTM_OR_TEXT"
    },
    {
      "id": 2,
      "type": "SET_CONTACT_PROPERTY",
      "property": "aeo_first_touch_prompt",
      "value_from": "utm_campaign",
      "only_if_property_empty": true
    },
    {
      "id": 3,
      "type": "SET_CONTACT_PROPERTY",
      "property": "aeo_first_touch_url",
      "value_from": "hs_analytics_first_url",
      "only_if_property_empty": true
    },
    {
      "id": 4,
      "type": "SET_CONTACT_PROPERTY",
      "property": "aeo_self_reported_source",
      "value_from": "how_did_you_first_hear_about_us"
    },
    {
      "id": 5,
      "type": "INCREMENT_CONTACT_PROPERTY",
      "property": "aeo_touchpoint_count",
      "by": 1
    },
    {
      "id": 6,
      "type": "ADD_TO_LIST",
      "list_name": "AEO-Sourced Contacts (Rolling 90d)"
    }
  ],
  "re_enrollment": {
    "allow": true,
    "property_triggers": ["hs_latest_source_data_1"]
  }
}

The critical flag is only_if_property_empty on actions 2 and 3. Without it, a later AEO session overwrites first-touch data, which is the "silent overwrite" failure mode we cover in step 6. First-touch stays first-touch; aeo_touchpoint_count is the running total.

Re-enrollment is on. A contact who first touches via ChatGPT and later returns via Perplexity should get their touchpoint count incremented, not their first-touch engine overwritten.

Step 3 — Deal-Stage mapping

Properties on Contact records don't roll up to pipeline dollars by themselves. You need AEO attribution on the Deal object, copied at creation from the primary contact, then surfaced at every pipeline stage.

On the Deal object, mirror aeo_first_engine and aeo_first_prompt. Add an automation that, on Deal creation, copies these from the primary contact. Then add an "AEO attribution" property group to every sales-pipeline stage so the CMO sees engine and prompt on every deal card.

Deal stageAEO properties visibleWhat the CMO sees at this stage
Lead-In (0%) aeo_first_engine, aeo_first_touch_url Which engine put this contact in pipeline. Filter: "all leads touched by ChatGPT this week."
Discovery (10%) aeo_first_engine, aeo_first_prompt, aeo_touchpoint_count Which prompt cluster converted. Early signal on which prompts are pipeline-predictive.
Qualified (25%) All AEO props + self-reported source Confirms AEO attribution against what the buyer said on the form. Cross-reference for audit.
Proposal (40%) All AEO props Pipeline dollar at this stage × 40% = stage-weighted AEO pipeline contribution.
Commit (80%) All AEO props Near-certain AEO-influenced revenue. This is the number for the next board meeting.
Closed-Won (100%) All AEO props + close notes AEO-influenced closed-won ARR. The denominator for CAC payback math.

Stage-weighted AEO pipeline is the number that survives CFO review: sum of (deal amount × stage probability) across all deals where aeo_first_engine is set. Not closed-won. Pipeline, with probability disclosed.

Step 4 — The UTM schema, standardized

A tagging workflow can't tag what isn't there. If the content team writes links one way and the demand-gen team writes them another, the workflow enrollment triggers miss half the traffic. Standardize the UTM schema, publish it as a pinned doc, and enforce it in the URL builder your team actually uses (HubSpot Campaigns, the Chrome UTM-builder extension, or a shared Notion page).

Here is the schema every link into or out of AEO channels should follow:

utm_source   = chatgpt | perplexity | claude | gemini | copilot | ai-overviews
utm_medium   = aeo
utm_campaign = <prompt-cluster-slug>  // e.g. best-hubspot-alternatives-b2b-saas
utm_content  = <engine-session-id-if-available>  // optional but useful for MMM
utm_term     = <brand-or-intent-keyword>  // optional

// Examples:
https://runlantern.com/guides/cfo-aeo-budget-defense/?utm_source=chatgpt&utm_medium=aeo&utm_campaign=cfo-aeo-budget-defense
https://runlantern.com/learn/aeo-pipeline-attribution/?utm_source=perplexity&utm_medium=aeo&utm_campaign=what-is-aeo-attribution
https://runlantern.com/compare/lantern-vs-profound/?utm_source=claude&utm_medium=aeo&utm_campaign=profound-alternatives

utm_medium=aeo is the load-bearing piece. It's what distinguishes an AEO session from organic search even when the engine name ends up in utm_source. HubSpot treats utm_medium as the grouping dimension in most default reports, so making it explicit gives you a clean AEO channel without having to rebuild attribution rules.

Note that not every AEO session will carry UTMs. ChatGPT preserves them when the user clicks a citation link; Perplexity usually preserves them; Claude's link-out behavior varies by version; some surfaces strip them. This is why step 5 layers self-reported attribution on top — UTMs are the 60–70% signal, the form field is the 30% that closes the gap.

Step 5 — The weekly report, built in HubSpot Reports

You don't need a BI tool. HubSpot Reports can produce a weekly AEO report that the CMO reads on a phone.

Build three reports and combine them on a single dashboard:

  1. AEO Contacts This Week. Single-object report on Contacts. Filter: aeo_source_engine is known AND create date is this week. Break down by aeo_source_engine. Secondary breakdown by aeo_first_touch_prompt.
  2. AEO-Influenced Pipeline. Cross-object report on Deals + Contacts. Filter: associated contact has aeo_source_engine set. Metric: sum of (deal amount × stage probability). Segment by pipeline stage.
  3. AEO Closed-Won (Trailing 90 Days). Single-object report on Deals. Filter: aeo_first_engine is set AND stage is Closed-Won AND close date is in the last 90 days. Sum of amount. This is the CAC-payback denominator.

Schedule the dashboard email at 8am Monday to the CMO, the Head of Growth, and RevOps. Keep it to one page. The CMO's job on Monday morning is to read it in 90 seconds and forward it with a one-line comment to the CEO if the numbers are worth celebrating.

What to put in the weekly email subject line. "AEO pipeline this week: $[amount]." Not "AEO dashboard update" — a number, and only a number. CMOs who've shipped this are getting replies from their CEO that were unreachable when the subject was "AI visibility report."

Step 6 — The 4 failure modes and how to audit for them

Every HubSpot-native AEO setup we've seen fails in one of four ways. Audit for these before you route the weekly report to leadership — because leadership trust, once lost, takes a quarter to earn back.

Failure mode 1: Property drift

Content and demand-gen teams drift off the UTM schema. After 60 days, half of AEO sessions arrive with utm_source=chat-gpt (hyphenated) or utm_medium=ai (not aeo). The workflow stops enrolling those contacts. Weekly AEO numbers quietly decline; leadership assumes AEO stopped working. It didn't — tagging did.

Audit: Once a month, pull all contacts created in the last 30 days and bucket hs_analytics_source values. Anything that smells like an AEO engine but isn't in the canonical list gets added to the workflow triggers, and the content doc gets updated. This is a 20-minute RevOps task, not a project.

Failure mode 2: Silent overwrite

A contact first touches via ChatGPT. Two weeks later they touch via Perplexity. If the workflow actions don't have only_if_property_empty on first-touch fields, Perplexity's values overwrite ChatGPT's. The AEO reports now attribute first-touch to the wrong engine, and the prompt-cluster data is noise.

Audit: Pick 20 contacts with aeo_touchpoint_count greater than 3. Verify their aeo_first_touch_url actually matches the earliest session in HubSpot Analytics. If it drifts, rebuild the workflow.

Failure mode 3: Direct misclassification

The active HubSpot community thread asking for "AI Search as Original Source" exists because ChatGPT and Perplexity sessions frequently land as Direct Traffic when UTMs get stripped or the user opens the citation in a new tab. Your workflow only tags contacts with UTMs — contacts without UTMs sit in Direct, invisible.

Audit: Run self-reported attribution on every demo form. Contacts whose self-reported source is an AEO engine but whose hs_analytics_source is Direct are your Direct-misclassification cohort. Typical ratio: 30–50% of Direct is AEO-sourced for 50–500 person B2B SaaS in 2026. Flag them manually until the workflow self-reported trigger catches them.

Failure mode 4: Deal-level attribution gaps

Contact properties are set, but deals aren't inheriting them. Usually one of two causes: the Deal-creation automation that copies aeo_first_engine from the primary contact is disabled, or the deal has multiple associated contacts and the "primary" contact isn't the AEO-tagged one.

Audit: Monthly, pull all deals created in the last 60 days. Any deal where at least one associated contact has aeo_source_engine set but the deal's aeo_first_engine is null — that's a gap. Usually a 30-minute fix on the Deal-creation automation logic.

What Lantern does on top of this setup

Lantern is the layer that ships the citation data into HubSpot, so your workflow has utm_source values to fire against in the first place. The six-step setup above still works without us — we're betting on accelerating it, not replacing it. Pricing: $99/mo or Enterprise. 10 V1 design-partner spots open.

What to ship this week

FAQ

Common questions about HubSpot-native AEO setup.

Do I need HubSpot Marketing Hub Enterprise for this?
No. Marketing Hub Pro ($890/mo) covers the five custom properties, the workflow, the deal mirrors, and single-object Reports. Enterprise adds multi-touch revenue attribution reports, which are nice but not required.
How long does the full setup take?
Half a day for the Contact-level properties and workflow, a second half-day for deal mirrors and the weekly report. Budget two admin days including the RevOps audit.
Why not use HubSpot Original Source?
Original Source misclassifies LLM traffic as Direct. HubSpot's own community has active threads about this. A custom aeo_source_engine property plus UTM-triggered workflow is the durable fix.
Should I add a self-reported attribution question on forms?
Yes. "How did you first hear about us?" free-text. Parse for AEO engine keywords in a workflow and write aeo_self_reported_source. This catches 30–50% of AEO traffic that UTMs miss.
Does this replace a third-party AEO tool?
Not entirely. Third-party tools (Profound, Scrunch, Athena, Peec) monitor citations — they tell you where you appear. This setup wires attribution into HubSpot. You may still want a monitoring layer for citation breadth; attribution belongs in the CRM.

Where Lantern fits.

Lantern ships the citation data into HubSpot so the workflow above has something to fire against. The setup works standalone — we accelerate it. $99/mo or Enterprise. 10 V1 design-partner spots open.

Join Waitlist