Marketing Operations
How to Measure AI Referral Traffic and Genuine Enquiries
A practical way to compare GA4 assistant sessions, confirmed form submissions and CRM evidence without turning mismatched counts into an invented conversion rate.
A visitor follows a link from an AI assistant, reads your service page and returns a week later to enquire. Your analytics report shows one source; your CRM contact may show another. Neither number alone tells you how many genuine enquiries came from that assistant.
Start by keeping the evidence in separate rows: observed assistant sessions, confirmed submissions, submission records matched to CRM evidence and qualified enquiries. Join records only when you have a reliable identifier and permission to use it. Otherwise, report the totals separately and say what is unknown.
This guide is for marketers and revenue operations teams deciding whether referral traffic is producing useful conversations. Its figures and identifiers are synthetic. It does not establish incrementality or promise that an assistant caused a sale. Sources were checked on 2 November 2026.
What to do first
- Use the session-scoped GA4 channel when counting visits, and document the date range and timezone.
- Keep Google Search AI-feature impressions separate from analytics sessions and from CRM records.
- Count confirmed form submissions, not contact-button clicks, and exclude known tests using evidence.
- Match only the same submission records through a permitted, reliable reference. An unmatched record is an unresolved case, not automatically a lost enquiry.
- Report the number reviewed as genuine and qualified separately from total submissions. Unknown qualification is not zero.
What each system can and cannot tell you
In May 2026, Google Analytics introduced an AI Assistant channel for traffic from recognised assistants. Google's channel documentation says the AI Assistant group excludes Google AI Overviews and AI Mode, which are included in Organic Search. Use Session default channel group for a session question; first-user and event-scoped channel dimensions answer different questions.
Recognition is not complete visibility. Referrer loss, consent choices, blockers, settings and processing can limit what analytics records. A session attributed to an assistant is an observed attribution, not proof that no other source contributed. Document your attribution rule and review changes before comparing periods.
Search Console's generative AI performance reports describe impressions in Google Search or Discover AI features. That is visibility, not a GA4 session or a confirmed enquiry. Google says those impressions are already included in its overall performance report; adding them again inflates the total. The AI-search reporting guide covers that impression scope in more detail.
HubSpot's original and latest traffic-source properties describe a contact's first and most recent known web sources. HubSpot also lists AI Referrals as a source. Those fields can be affected by tracking gaps or later activity. A contact property is a snapshot of a contact, not a history of every submitted form. Where available, inspect the form submission record and associated CRM evidence under your existing access and privacy rules.
Write the reporting contract
Before exporting, write down the decision, the exact start and end, timezone, extraction time, processing delay, sources, exclusions and owner. Make the period complete and use the same definition in the comparison. A report generated at 09:00 may still contain data that is being processed; the download timestamp does not prove the underlying period is complete.
Define the unit of every row. A GA4 session is not a person. One person can return in another session or submit more than once. A CRM contact is not necessarily a new enquiry during the selected week. A form-button click is an interaction, not evidence that a message was sent. If a form system does not expose a reliable submission log, mark submission count unavailable rather than substituting the number of contacts.
Agree on your qualification rule before counting: for example, a non-test request that falls within a documented service and buying remit. Record the reviewer and date. A useful decision rule can be simple, but it must not be applied differently just because one source has a more attractive result.
Build a defensible submission-level match
If your implementation already supplies a stable, permitted submission reference to both a confirmed submission log and CRM evidence, use that reference. Record how it is generated, how duplicates are handled and what happens when delivery is delayed. Keep source-specific evidence with its date; the source label attached to a contact today may describe a different interaction from the submission being reviewed.
Do not join by guessed similarity of names, email addresses or timestamps. Do not create a new tracking identifier or export personal information merely to make a chart look complete. Check your consent, access, retention and data policies with the responsible owner. If a lawful reliable match is absent, state that the join is unavailable. The GA4 session count and CRM enquiry count can still be reported as separate observations.
Use one row per confirmed submission, not one row per webhook attempt or CRM update. Keep excluded tests, duplicates and unresolved delivery events visible in an audit log so they cannot silently change the denominator. The evidence framework provides a worksheet for the decision and its owner.
A worked example: 40 submissions and 30 matches
Suppose a synthetic, completed week contains 180 observed AI Assistant sessions. Separately, an approved source rule identifies 40 distinct confirmed non-test submissions. Thirty of those 40 can be matched to CRM evidence with the agreed submission reference. Six of the matched submissions are confirmed as genuine qualified enquiries.
The observed match coverage is 30 ÷ 40 = 75%. Ten submission records are unmatched. The confirmed-qualified share is 6 ÷ 30 = 20% of matched submissions. Any matched submissions not yet reviewed remain unknown; that 20% is not a final qualification rate unless the review is complete. The ten unmatched cases could reflect timing, missing identifiers, delivery problems or other explanations. The counts do not establish which explanation is correct.
Do not divide six by 180 and call the result a conversion rate unless the two measures represent a defensible linked cohort with compatible scope, consent and attribution. Even then, label its unit and limitations. The reconciliation calculator handles the supported record-level arithmetic and explicitly distinguishes unknown qualification from zero.
A small, testable reconciliation query
The following SQLite example uses synthetic references. It assumes the source rule and confirmation were verified upstream, every timestamp is normalised as a fixed UTC ISO string, and the CRM table has at most one reviewed state per submission. Replace neither assumption with a guess. Use a read-only approved extract; do not paste real contact data into this example.
CREATE TEMP TABLE submission (
ref TEXT PRIMARY KEY, event_utc TEXT NOT NULL,
confirmed INTEGER NOT NULL, assistant_source INTEGER NOT NULL, is_test INTEGER NOT NULL
);
CREATE TEMP TABLE crm_review (
ref TEXT PRIMARY KEY, qualification TEXT NOT NULL
CHECK (qualification IN ('qualified', 'not_qualified', 'unknown'))
);
INSERT INTO submission VALUES
('S1','2026-10-20T10:00:00Z',1,1,0),
('S2','2026-10-21T10:00:00Z',1,1,0),
('S3','2026-10-22T10:00:00Z',1,1,0),
('TEST','2026-10-23T10:00:00Z',1,1,1);
INSERT INTO crm_review VALUES ('S1','qualified'), ('S2','unknown');
SELECT COUNT(*) AS eligible,
COALESCE(SUM(CASE WHEN c.ref IS NOT NULL THEN 1 ELSE 0 END), 0) AS matched,
COALESCE(SUM(CASE WHEN c.qualification = 'qualified' THEN 1 ELSE 0 END), 0) AS confirmed_qualified,
COALESCE(SUM(CASE WHEN c.qualification = 'unknown' THEN 1 ELSE 0 END), 0) AS matched_review_pending
FROM submission AS s LEFT JOIN crm_review AS c ON c.ref = s.ref
WHERE s.confirmed = 1 AND s.assistant_source = 1 AND s.is_test = 0
AND s.event_utc >= '2026-10-19T00:00:00Z'
AND s.event_utc < '2026-10-26T00:00:00Z';
The result is eligible=3, matched=2, confirmed_qualified=1, matched_review_pending=1. One eligible record has no CRM match, and one matched record still needs qualification. The test record is excluded. The half-open period includes the start and excludes the next week's start; translate the business timezone before constructing UTC boundaries. SQLite stores these strings, not native timezone-aware timestamps, so inconsistent formats would invalidate the comparison.
Production data is rarely this tidy. A real pipeline needs uniqueness checks, source-evidence validation, retry and late-arrival policy, access controls and a correction log. If records can have multiple CRM events, reduce them to one agreed state per submission before this join; otherwise the join can multiply the denominator. Do not add the resulting aggregate back to raw session or contact totals.
A review checklist before sharing
- Re-run the same fixed dates and definitions after the stated data-latency window. Record the extract time and any revision.
- Verify the assistant channel and source rules against the property configuration; do not assume another analytics or CRM product uses the same taxonomy.
- Check that each included item is a confirmed non-test submission and that each matched reference occurs at most once.
- Inspect a small permitted sample of unmatched cases for delay, duplicate handling or missing evidence. Keep unresolved cases unresolved.
- Count qualification only after review. A blank or pending classification is unknown, not a failed lead.
- Have another authorised person compare the written note with the source totals. Do not export enquiry messages to a general AI tool.
What a useful report sounds like
“We observed 180 assistant sessions during the completed week. Of 40 confirmed submissions meeting our separate source rule, 30 matched CRM evidence. Six matched submissions are confirmed qualified; qualification is incomplete for the rest. Ten submissions have no current match. Marketing operations will check the matching and delivery evidence on the next business day.”
That note preserves useful progress without implying a causal result or turning an unknown into a loss. The copyable review prompt can draft a similar note from anonymised aggregates. If no model is available, use the same observation, limitation and next-action structure manually.
Limits and next steps
This is a reconciliation method, not a complete attribution model. Some AI-assisted discovery produces no identifiable referral; some contact journeys span channels or devices; consent and access limits can make a join impossible. Small counts can change dramatically when one enquiry is reclassified. Use the result to improve evidence and handoffs, not to claim revenue lift.
Start with one completed week, one form and one documented question. Save the worksheet and calculation with the report, then repeat with a comparable period after the data has matured. For implementation help, see the forward-deployed marketer service and the free Marketing Workflow Architect.