How to Measure AI Search Traffic and Conversions
Measure AI-search conversions by keeping sampled citation checks, identifiable referral sessions, distinct visitors, new accounts, trials, confirmed first payments, paid accounts, and currency amounts as separate units. Join only approved identifiers, freeze one entrance and follow-up window, deduplicate people and accounts, preserve identity gaps and refunds, and report first-touch and assisted results separately without claiming causal ROI.
Copy the traffic-to-payment reconciliation worksheet
Freeze the cohort and its maturity rule first, then reconcile analytics identities to unique accounts, successful payments, and refunds while preserving every excluded or unmatched row.
# AI search traffic and conversion reconciliation Manual worksheet — version 1.0. Use approved pseudonymous IDs in the working file. Keep raw email, payment credentials, and other unnecessary personal data out of analytics exports and this worksheet. ## 1. Freeze the cohort before calculating - Site / analytics property: - Time zone: - Qualifying landing pages: - Qualifying source rule (for example, reviewed AI Assistant session sources): - Entry window, inclusive: - Per-person follow-up window: - Report close / refund snapshot: - Required history for first-touch classification: - Distinct-visitor metric and reporting identity: - Known tracked person key: - New-account definition: - Trial-start definition: - Confirmed first-payment definition: - Paid-at-close definition: - Currency and collected-amount definition: - First-touch rule: - Assisted-only rule: ## 2. Preserve visibility as separate context | Visibility source | Planned checks | Eligible observed checks | Unavailable / failed | Owned-link citation observations | Evidence pointer | | --- | ---: | ---: | ---: | ---: | --- | | [Fixed prompt and surface panel] | | | | | | Do not divide sampled citations by sessions, visitors, signups, accounts, payments, or revenue. The sampled-check population is not the visitor cohort. ## 3. Reconcile source control totals | Unit | Raw count | Deduped count | Source/export | Definition or query | Excluded from joined rates | Reason | | --- | ---: | ---: | --- | --- | ---: | --- | | Identifiable AI referral sessions | | | | | | | | Distinct analytics visitors | | | | | | | | Direct / unattributed sessions | | | | | All | Source unknown; do not assign to AI | | Signup events / people / new accounts | | | | | | | | Trial-start events / accounts | | | | | | | | Payment attempts / confirmed first-payment accounts | | | | | | | | Gross collected first-payment amount | | | | | | | | Succeeded refunds against eligible payments | | | | | | | | Net collected first-payment amount at report close | | | | | | | ## 4. Build the identity and eligibility waterfall | Disposition | Distinct people or declared person proxies | Rule | Evidence pointer | | --- | ---: | --- | --- | | Distinct visitors in qualifying sessions | | Starting population | | | Less internal / test identities | | Mutually exclusive exclusion | | | Less accounts created before the qualifying entrance | | Mutually exclusive exclusion | | | Less unresolved analytics-to-person joins | | Eligibility unknown; never label as non-converters | | | Less entrants without the full follow-up window | | Hold for a later mature cohort | | | Known tracked eligible people | | Rate denominator | | Known tracked eligible people = distinct visitors − internal/test − pre-existing accounts − unresolved joins − immature entrants. ## 5. Keep one joined row per eligible person | person_key | qualifying_session_key | qualifying_time | landing_page | first_known_source | attribution_cut | eligible_reason | first_account_id | signup_time | trial_start_time | first_successful_payment_time | amount_received | currency | refund_amount_at_close | paid_at_close | evidence_pointers | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---: | --- | ---: | --- | --- | | [pseudonymous ID] | | | | | AI first-touch / AI assisted-only | | | | | | | | | | | If several people join one account, choose an account-level denominator before calculating an account rate. If one person creates several accounts, predeclare which first eligible account is retained. Keep duplicate events as a raw control total, not extra people or accounts. ## 6. Calculate only compatible, mature rates - Matched-signup rate = eligible people with one matched first signup ÷ known tracked eligible people. - Trial-start rate = unique eligible trial accounts ÷ unique eligible new accounts. - Confirmed first-payment rate = unique eligible accounts with a successful first payment inside the follow-up window ÷ unique eligible new accounts. - Paid-at-close rate = unique eligible accounts still paid at report close ÷ unique eligible new accounts. - Net collected first-payment amount = eligible amount received − succeeded refunds against those payments as of report close. Repeat the account calculations separately for AI first-touch and AI assisted-only. Do not add overlapping attribution cuts. Do not annualize one payment, substitute checkout or trial events for payment, or call collected cash accounting revenue unless finance uses that definition. ## 7. Exceptions and interpretation - Unmatched identities: - Duplicate people, accounts, events, invoices, or payments: - Failed, pending, zero-value, test, refunded, disputed, or out-of-window payments: - Currency conversions and exchange-rate date: - Consent, tag, attribution, or billing changes: - Material concurrent campaigns or product changes: - Result label: observed after an identifiable AI referral / AI first-touch / AI assisted-only / unknown - What the evidence cannot establish, including causal lift or ROI: - Owner and next reconciliation date:
Freeze the qualifying entrance
Choose the analytics property, landing pages, reviewed AI-referral source rule, entry window, time zone, and one distinct-visitor identity. Use the GA4 AI-referrals guide for source setup; do not rebuild a regex inside this reconciliation.
Create an approved identity bridge
Export session and user identifiers from your own analytics, map them to pseudonymous internal person and account IDs under your privacy rules, and preserve unresolved identities as a separate gap. Do not join on a guess or paste raw email into GA4.
Deduplicate account and billing outcomes
Keep raw event counts for control totals, then retain one first eligible signup, one first account, one trial-start state, and the first successful payment per account. Exclude test, failed, pending, zero-value, duplicate, and out-of-window records under stated rules.
Wait for the full conversion window
Give every entrant the same follow-up time before calculating rates. Join refunds through a declared report-close date, then report first-touch and assisted-only cuts separately with their own denominators.
Which units belong in an AI-search conversion report?
A citation observation, session, visitor, signup event, person, account, trial, successful payment, and currency amount answer different questions. Put them in one reconciliation only when each row retains its source, unit, deduplication rule, date window, and eligibility rule.
The citation panel remains visibility context. Referral analytics begin only when a visit reaches the site with usable source information. Product and billing outcomes begin only after an approved identity join. No denominator crosses those boundaries unless the joined population makes the numerator a defined subset.
| Layer | Reportable unit | Required boundary |
|---|---|---|
| Sampled citations | Eligible prompt-by-surface observations containing an owned link | State planned, observed, unavailable, and matching rules; never use this as a visitor denominator |
| Identifiable visits | Sessions by reviewed source and landing page | Omit no-click activity and visits without usable referral attribution |
| Distinct visitors | Unique analytics users under one declared reporting identity | Do not equate a reported user automatically with one verified human or account |
| Known eligible people | Deduped, join-eligible person IDs after stated exclusions | Preserve unresolved identities and wait for equal follow-up |
| New accounts and trials | Unique account IDs meeting separate creation and trial rules | Keep raw events as control totals and resolve multi-person or multi-account mappings |
| Paid accounts | Unique eligible accounts with a confirmed first successful payment; also show paid state at close | Checkout, purchase-event, invoice-created, pending, failed, and zero-value records are not substitutes |
| Collected amount | Currency amount received, gross and net of in-scope succeeded refunds | Do not mix currencies, annualize, call it ARR or LTV, or present it as causal ROI |
What does a complete SaaS reconciliation look like?
This is original fictional data for Morrow Metrics, a fictional B2B SaaS company. It is not RankEcho customer data, a benchmark, or a claim about typical AI-search performance.
Scope: qualifying identifiable AI-referral entrances occurred from 1–30 June 2026 UTC on three declared resource pages. The company used a 90-day known-session history for its mutually exclusive attribution cuts and followed each entrant for 60 full days. The report closed on 31 August 2026 after every June entrant matured. Five July entrants visible in a later export belong to a different immature cohort and are absent from every June total below.
The fictional visibility panel had 48 planned prompt-by-surface checks: 42 eligible observations, six unavailable checks, and 14 eligible observations containing an owned link. The analytics export independently contained 52 identifiable AI-referral sessions from 41 distinct visitors. These populations were not joined, so no quotient between the 14 sampled observations and 52 sessions is computed or interpretable.
| Measure | Fictional result | Unit | Treatment |
|---|---|---|---|
| Sampled citation observations | 48 planned fixed checks; 42 eligible observations; 6 unavailable; 14 contained an owned link | Prompt-by-surface observations | Visibility context only; no citation-to-session or citation-to-revenue calculation |
| Identifiable AI referral sessions | 52 | Sessions | Reviewed analytics source export; repeated sessions remain sessions |
| Distinct analytics visitors | 41 | Distinct visitors under the declared reporting identity | A reporting unit, not 41 verified humans or accounts |
| Direct / unattributed traffic | 73 | Sessions | Shown separately and excluded; none is reassigned to AI |
| Known tracked eligible people | 24 | People in this synthetic one-person-per-identity cohort | Full 60-day follow-up and approved join available |
| Matched signup people and new accounts | 11 raw signup events → 9 people → 9 unique new accounts | People, events, and accounts | Two repeated events removed; every signup person creates one account in this example |
| Trial starts | 8 raw trial-start events → 6 unique accounts | Events and accounts | Two repeated events removed |
| Confirmed first payments | 4 attempts → 3 unique accounts with a successful amount received | Attempts and paid accounts | One unsuccessful attempt excluded |
| Paid accounts at report close | 2 | Unique accounts | One of the three first payments was fully refunded before close |
| First-payment amounts | USD 347 gross − USD 49 succeeded refund = USD 298 net collected | US dollars | Cash collected as defined for this worksheet; no ARR, LTV, accounting-revenue, or ROI claim |
How do the eligible people and exclusions reconcile?
The 41 distinct visitors split into four mutually exclusive dispositions: 24 known tracked eligible people, two internal or test identities, eight identities joined to accounts created before the qualifying entrance, and seven identities without an approved analytics-to-person join. The arithmetic is 41 − 2 − 8 − 7 − 0 immature = 24.
The seven unresolved identities remain an identity gap. They are excluded from joined rates because eligibility and outcomes cannot be established; they are not counted as seven non-converters. No June entrant is excluded for immaturity because the report waited until all 60-day windows closed.
The fictional company also recorded 73 Direct sessions on the included pages. Those sessions sit outside the 52 identifiable AI-referral sessions and the 41-visitor starting population. Similar timing or landing pages do not establish their source, so none is assigned to AI.
| Disposition | Visitors | Rate treatment |
|---|---|---|
| Known tracked, new-account eligible, and fully mature | 24 | Included as the person-level denominator |
| Internal or test | 2 | Excluded by declared identity rule |
| Account existed before qualifying entrance | 8 | Excluded from the new-account cohort |
| Identity join unresolved | 7 | Excluded and reported as unknown, never as a non-conversion |
| Immature June entrant | 0 | None; report waited for full follow-up |
| Total distinct analytics visitors | 41 | Control total |
Which conversion rates are valid in the fictional cohort?
The person-level signup calculation is 9 matched signup people ÷ 24 known tracked eligible people = 37.5%. In this synthetic example each signup person created exactly one new account, so the next calculations have nine unique eligible new accounts as their denominator.
Six of nine new accounts started a trial, or 66.7%. Three of nine had a confirmed successful first payment inside the same 60-day follow-up, or 33.3%; equivalently, three of six trial accounts first paid, or 50.0%. At report close, two of nine new accounts remained paid, or 22.2%, after one fully refunded first payment.
The three successful first payments were USD 149, USD 149, and USD 49: USD 347 gross. The USD 49 payment received a succeeded full refund before close, leaving two paid accounts and USD 298 net collected first-payment amount. Paid-account counts and currency amounts stay in separate columns. The worksheet does not annualize the payments or claim accounting revenue, lifetime value, incremental lift, or ROI.
| Calculation | Compatible numerator and denominator | Result |
|---|---|---|
| Matched-signup rate | 9 matched signup people ÷ 24 eligible people | 37.5% |
| Trial-start rate | 6 unique trial accounts ÷ 9 unique new accounts | 66.7% |
| New-account first-payment rate | 3 confirmed first-payment accounts ÷ 9 unique new accounts | 33.3% |
| Trial-to-first-payment rate | 3 confirmed first-payment accounts ÷ 6 unique trial accounts | 50.0% |
| Paid-at-close rate | 2 paid-at-close accounts ÷ 9 unique new accounts | 22.2% |
| Net collected first-payment amount | USD 347 received − USD 49 succeeded refund | USD 298 |
How should first-touch and assisted conversions be reported?
Morrow Metrics defines AI first-touch as an identifiable AI referral on the earliest known site session in the 90-day history. AI assisted-only means an identifiable AI referral occurred before signup, while the earliest known session came from another source. These cuts are mutually exclusive in this worksheet; an overlapping assisted definition would require separate tables whose totals are never added.
The cuts describe recorded sequences under a chosen history window. Missing earlier visits, identity changes, consent, and unattributed sessions can change the classification. Neither cut estimates what would have happened without the AI visit.
| Attribution cut | Eligible people | Signup people / accounts | Trial accounts | First-payment accounts | Paid at close | Net collected amount |
|---|---|---|---|---|---|---|
| AI first-touch | 15 | 5 | 4 | 2 | 2 | USD 298 |
| AI assisted-only | 9 | 4 | 2 | 1 | 0 | USD 0 after a USD 49 refund |
| Total mature joined cohort | 24 | 9 | 6 | 3 | 2 | USD 298 |
How do you perform the reconciliation with your own systems?
Use the existing GA4 guide to validate the AI Assistant and source view, then export the sessions, landing pages, timestamps, and permitted identifiers you need. Preserve the report name, property, time zone, date range, dimensions, filters, and export time. Standard report totals and row-level exports may use different identity or estimation behavior, so reconcile control totals before joining.
Create the identity bridge in your controlled analytics environment. A session key can combine the declared user or pseudonymous ID with session ID; an authenticated handoff can add your internal person and account IDs prospectively. Keep unresolved joins explicit, follow your consent and retention rules, and never repair missing history with an assumed identity.
Export account creation, trial state, first successful payment, amount received, currency, and refunds from your own product and billing systems. Deduplicate to the declared person and account units, check timestamps in one time zone, and preserve evidence pointers. If your system cannot reliably join a stage, report its count separately and stop the rate before that gap.
What can this reconciliation support?
The output supports a bounded statement such as: among 24 known, eligible, fully mature people with an identifiable AI referral in the declared June cohort, nine matched to a new account and three of those accounts recorded an in-window successful first payment; two remained paid at close after one refund. It also supports a separate visibility statement about 14 owned-link observations in 42 eligible fixed checks.
It cannot show that a sampled citation produced any particular session, that AI created incremental demand, that Direct traffic came from AI, or that a page change caused a signup or payment. Causal ROI would need a design with a credible counterfactual plus complete cost and outcome definitions; this manual sequence does not provide one.
How can RankEcho fit beside this worksheet?
RankEcho's Proof Loop can record a shipment and later same-prompt observations. Use that record as the sampled visibility layer, then reconcile visits, people, accounts, payments, and refunds in the analytics and billing systems your team already controls.
The public Proof Loop demo shows the evidence workflow on sample data. RankEcho does not natively connect this worksheet to GA4, Search Console, or a billing provider, and the Proof Loop does not establish that a shipment caused a citation, referral, signup, payment, or revenue result.
Frequently asked questions
Not from a sampled citation panel and an analytics session total. Their populations and denominators differ, and the records usually do not identify which answer produced which visit. Report sampled citations and identifiable sessions separately unless you have a valid event-level join.
No. Direct means the analytics system lacks a clear referral source and can have several causes. Keep it unattributed unless a separate, reliable source record identifies the visit; landing-page or timing similarity is insufficient.
No. One visitor can start several sessions, and an analytics user depends on the property's reporting identity. Report sessions and distinct visitors separately, then state which permitted identifier supports any person or account join.
No. Deduplicate signup and trial events to their own account states. Count a new paid account only after the billing record meets your declared successful first-payment rule, then show refunds and paid-at-close status separately.
Report them as an identity gap and exclude them from joined rates. Do not label them as non-converters. If the gap is material, improve prospective consented identity capture or restrict the claim to the stages you can observe.
Choose a window that matches the SaaS buying cycle before looking at outcomes, then wait until every entrant has the full window. Report later payments separately rather than changing the window to improve the result.
No. Those labels apply a declared attribution rule to an observed sequence. They do not estimate incrementality or supply a counterfactual, and this worksheet does not include the complete cost basis needed for ROI.
Sources reviewed
Material technical claims below were checked against primary provider documentation. The sources support the documented control or signal, not a guarantee of indexing, ranking, an AI impression, or a citation.
9 claim-level source records
| Claim reviewed | Official source | Review record |
|---|---|---|
| Google Analytics says recognized AI-assistant referrals can be assigned the ai-assistant medium, AI Assistant default channel, and (ai-assistant) campaign values. | Google Analytics: What's new | Checked 2026-09-11 · Google Analytics release note dated May 13, 2026 · This supports beginning the worksheet with identifiable referral sessions exported under a documented analytics definition. It does not recover visits with missing attribution, observe answer impressions, or connect a referral to a sampled citation, signup, payment, or cause. · Confidence: High |
| Google Analytics defines a session as a period of interaction, generates a session ID when a session starts, recommends combining user_id or user_pseudo_id with session_id for a unique session identifier outside Analytics, and estimates session counts in Analytics reports. | Google Analytics: About Analytics sessions | Checked 2026-09-11 · Current Google Analytics session documentation · This supports keeping sessions separate from visitors and declaring the exact exported identity fields used for deduplication. It does not make a device or analytics identifier equivalent to a verified person or business account. · Confidence: High |
| Google Analytics defines Total users, Active users, New users, and Returning users as different user metrics and defines Total users as unique users who triggered any event in the selected date range. | Google Analytics: Understand user metrics | Checked 2026-09-11 · Current Google Analytics user-metric definitions · This supports naming the selected distinct-visitor metric and reporting identity. It does not establish a one-to-one correspondence between an analytics user and a human, account, trial, or payer. · Confidence: High |
| Google Analytics distinguishes user-, session-, and event-scoped traffic-source dimensions: First user dimensions describe where a new user was acquired, Session dimensions describe where a session originated, and event-scoped key-event credit follows the selected attribution model. | Google Analytics: Scopes of traffic-source dimensions | Checked 2026-09-11 · Current Google Analytics acquisition-scope documentation · This supports reporting first-touch and assisted views as separately declared attribution cuts. It does not establish incrementality or show that an AI source caused a later account or payment. · Confidence: High |
| Google Analytics User-ID accepts identifiers generated by the business to associate activity across sessions and devices; Google requires unique IDs, prohibits impermissible personally identifiable information, and does not reprocess data collected before implementation. | Google Analytics: Measure activity across platforms with User-ID | Checked 2026-09-11 · Current Google Analytics User-ID documentation · This supports an approved pseudonymous identity bridge and an explicit identity-gap row. It does not justify joining by raw email, repairing historical gaps, or treating unmatched visitors as non-converters. · Confidence: High |
| Google Analytics describes (direct) / (none) as traffic without a clear referral source and lists missing parameters, redirects, URL shorteners, direct entry, offline documents, and ad blockers among possible reasons. | Google Analytics: Understand (direct) / (none) traffic | Checked 2026-09-11 · Current Google Analytics direct-traffic documentation · This supports leaving Direct traffic unattributed in the worksheet. A matching landing page, time, or later signup does not identify an AI source for a Direct session. · Confidence: High |
| OpenAI says ChatGPT search referral URLs automatically include utm_source=chatgpt.com so inbound referral traffic can be reviewed in analytics when that attribution reaches the site. | OpenAI publishers and developers FAQ | Checked 2026-09-11 · Current OpenAI publisher documentation · This supports treating an intact ChatGPT referral as identifiable traffic. It does not mean every answer, citation, or ChatGPT interaction produces an attributable visit or later commercial outcome. · Confidence: High |
| Stripe's PaymentIntent reference exposes customer, currency, amount received, and status values including succeeded, processing, canceled, and states requiring a payment method, confirmation, action, or capture. | Stripe API: The PaymentIntent object | Checked 2026-09-11 · Current Stripe API reference · This is one billing-provider example supporting confirmation from the billing record rather than an analytics purchase event. Teams must use their own processor's actual fields and finance definitions; this page does not require Stripe or connect RankEcho to it. · Confidence: High |
| Stripe's Refund object separately exposes the refunded amount, currency, related charge or payment intent, creation time, and refund status. | Stripe API: The Refund object | Checked 2026-09-11 · Current Stripe API reference · This is one billing-provider example supporting a dated refund adjustment. A requested, pending, failed, or unrelated refund must not be silently subtracted as though it were a succeeded refund against an eligible payment. · Confidence: High |
