Research Methodology
How LeadValets Tests Search and AI Visibility
This page documents how LeadValets measures search visibility and AI answer engine visibility for plumbing and HVAC companies. It covers the Search Authority Snapshot, the full Search Authority Audit™, and the Search Authority Tracker™. Every score, ranking change, and AI recommendation we report is produced using the methods described here — nothing is simulated or staged.
Sections marked [CONFIRM] contain process details that are being finalized. They will be replaced with confirmed language before the next update.
1How we choose queries
We test visibility using the questions that real buyers type into Google and AI answer engines — not generic keyword lists. Queries are built from four components: the trade (e.g., "plumber"), the service (e.g., "water heater repair"), the city or service area, and the intent type (emergency, high-value commercial, best-company comparison, general local service, or informational).
Each tracked project uses a set of rendered questions generated from PromptTemplate records, with variables filled in from the client's BusinessLocation data. The same question set is sent to every AI engine so results are directly comparable.
[CONFIRM] Query selection criteria
Confirm the exact criteria for including a query in the tracked set: minimum search volume threshold, whether Google Suggest / People Also Ask expansions are used, how many queries per client by default, and who approves the final list.
2How we control for location and device
AI answer engines and Google results both vary by the searcher's location. To produce consistent, comparable measurements, every query is run with an explicit geographic context tied to the client's service area.
[CONFIRM] Location and device controls
Confirm: (a) whether queries include the city name in the prompt text or rely on a location parameter, (b) whether tests run from a fixed datacenter IP, a residential proxy, or a geo-located browser session, (c) whether device type (desktop vs. mobile) is held constant or tested separately, and (d) how often location is re-verified.
3Which AI engines we test and how answers are recorded
We test the AI answer engines that plumbing and HVAC buyers are most likely to use when researching a contractor. Each engine is tested with the same rendered question, and the full response is saved.
For every response, we record:
- Date — the timestamp the response was collected.
- Engine — the AI answer engine and model/surface version (e.g., ChatGPT GPT-5, Gemini 3, Perplexity Pro, Claude Sonnet, Google AI Overviews).
- Prompt — the exact rendered question text sent to the engine.
- Full response — the complete text returned, stored verbatim in the ProviderRun record.
- Source URL and screenshot — when available, the URL and a dated screenshot of the response.
[CONFIRM] Engine list and collection method
Confirm: (a) the exact list of engines tested by default, (b) whether responses are collected manually (admin-verified), via API, or via automated browser session, (c) whether follow-up prompts are used, and (d) the cadence (weekly, monthly, quarterly).
4Mention vs. recommendation vs. citation: definitions
These three terms describe different levels of visibility in an AI answer. They are not interchangeable — a business can be mentioned without being recommended, and cited without being mentioned by name.
Mention
The tracked business's name appears anywhere in the AI response — in the answer text, a list, a table, or a source citation. The business is named, but not necessarily endorsed.
Recommendation
The AI response positions the tracked business as a good choice for the buyer's need. This includes being listed in a "top picks" or "best companies" list, or being described with positive evaluative language ("a reliable option," "highly rated"). A recommendation is a subset of a mention — every recommendation is also a mention, but not every mention is a recommendation.
Primary recommendation
The tracked business is the first or most prominently recommended company in the response. This is the highest visibility level — the equivalent of ranking #1 in Google's Map Pack.
Citation
A source URL in the AI response links to or references the tracked business's website, Google Business Profile, or a third-party listing about them. A citation can reference the business without naming it in the answer text — the link is the signal. Citations are tracked separately in the Citation record with the source URL, domain, and source type (company website, directory, review platform, etc.).
The Tracker measures each of these as rates: mention rate, recommendation rate, primary recommendation rate, and citation rate — each calculated as the percentage of eligible responses where the event occurred.
5How competitors are selected
Each tracked project includes a set of competitor businesses so we can measure share of voice — not just whether the client is visible, but how visible they are relative to the other companies a buyer might choose.
[CONFIRM] Competitor selection process
Confirm: (a) how many competitors are tracked by default, (b) whether competitors are chosen by the client, by LeadValets, or both, (c) whether competitors are drawn from Google Maps results, AI responses, or a separate list, and (d) whether competitors can be added or removed mid-project.
6How ranking and call changes are calculated for client results
Case study results are reported as before-and-after comparisons with dated evidence. We do not report a ranking change without a dated screenshot or a call-tracking log entry that shows the starting and ending state.
[CONFIRM] Ranking and call calculation
Confirm: (a) which ranking positions are tracked (Map Pack, organic, AI answer position), (b) whether rankings are averaged across queries or reported per-query, (c) the call-tracking source used (client call forwarding service, Google forwarding numbers, or manual logs), (d) how seasonality is accounted for, and (e) the minimum observation period before a result is reported.
7How the Snapshot and Audit scores are weighted
The Search Authority Snapshot runs a server-side crawl of your homepage — the same way a non-JavaScript crawler would see it. Each check is binary (pass or fail), and the two scores are the sum of weighted passes. No check is ever staged or simulated — if we cannot fetch your site, we tell you.
Snapshot: SEO Readiness Score (0–100)
Total: 100 points
| Check | Weight | What it measures |
|---|---|---|
| HTTP status 200 | 15 | Your server responds successfully to crawler requests. |
| HTTPS enabled | 10 | Your site is served over a secure connection. |
| Title tag present | 15 | Your homepage has a <title> tag describing your business. |
| Meta description present | 10 | Your homepage has a meta description summarizing what you do. |
| Visible word count ≥ 300 | 10 | Your raw HTML contains at least 300 words of visible text before JavaScript runs. |
| sitemap.xml present | 10 | A sitemap.xml file exists at your site root. |
| Phone number visible in raw HTML | 10 | A US-format phone number appears as text in your HTML source. |
| tel: link present | 10 | Your phone number is wrapped in a clickable <a href="tel:…"> link. |
| City name in title, H1, or body | 10 | Your city appears in your title tag, H1 heading, or body text. |
Snapshot: AI Readiness Score (0–100)
Total: 100 points
| Check | Weight | What it measures |
|---|---|---|
| JSON-LD structured data present | 20 | Your homepage includes at least one JSON-LD block with a @type. |
| llms.txt present | 15 | An llms.txt file exists at your site root to guide AI answer engines. |
| robots.txt allows Googlebot | 10 | Your robots.txt does not block Googlebot with Disallow: /. |
| robots.txt allows OAI-SearchBot | 10 | Your robots.txt does not block OAI-SearchBot (ChatGPT Search). |
| robots.txt allows ClaudeBot | 10 | Your robots.txt does not block ClaudeBot. |
| robots.txt allows PerplexityBot | 10 | Your robots.txt does not block PerplexityBot. |
| Title tag present | 5 | Your homepage has a <title> tag. |
| Meta description present | 5 | Your homepage has a meta description. |
| Visible word count ≥ 300 | 10 | Your raw HTML contains at least 300 words of visible text. |
| City name in body text | 5 | Your city appears somewhere in your body text. |
Snapshot: Local Visibility Score
The Local Visibility score uses the Google Places API to check your Google Business Profile presence and accuracy. It appears only when a Google Places API key is configured. If it is not, the Snapshot shows "Local check runs in the full audit" and the full Search Authority Audit™ covers it.
Full Audit: AEO Score (0–100)
The full Search Authority Audit™ produces an overall AEO score from seven weighted categories. Each category is scored 0–100 independently, then combined using the weights below.
| Category | Weight | What it measures |
|---|---|---|
| Answer Readiness | 20 | Whether your site content directly answers the questions buyers ask AI engines. |
| Entity Clarity | 15 | How clearly your business name, services, and location are structured for AI extraction. |
| Local Authority | 15 | Google Business Profile completeness, local citations, and geographic relevance signals. |
| Structured Data | 15 | JSON-LD schema coverage across your site (LocalBusiness, FAQPage, Services, etc.). |
| Trust & Citation | 10 | Review quantity and recency, domain authority, and external citation consistency. |
| Technical Accessibility | 10 | Crawlability, page speed, mobile rendering, and indexability. |
| Topical Authority | 15 | Content depth and breadth across your service categories and locations. |
How Snapshot checks are performed
- Server-side fetch: We fetch your homepage HTML with a standard HTTP request — no JavaScript execution. This mirrors how search engines and AI crawlers first see your site.
- Raw HTML parsing: Title tags, meta descriptions, JSON-LD, phone numbers, and city names are extracted from the raw HTML source, not the rendered DOM.
- robots.txt: We fetch
/robots.txtand check whether Googlebot, OAI-SearchBot, ClaudeBot, and PerplexityBot are blocked by aDisallow: /rule. - llms.txt: We check whether
/llms.txtexists at your site root. - sitemap.xml: We check whether
/sitemap.xmlexists at your site root. - Failed checks: The three highest-priority failed checks are shown with a plain-English description and a one-line fix. Priority is based on impact: HTTP status and HTTPS first, then bot blocking, then content and structured data.
What the Snapshot does not do
- It does not execute JavaScript — content loaded client-side is invisible to the Snapshot, just as it is to many crawlers.
- It does not crawl multiple pages — only your homepage (or the URL you enter).
- It does not test what AI engines actually recommend — that requires the full Search Authority Tracker™.
- It does not check backlinks, reviews, or Google Business Profile data — those are covered in the full audit.
8Sample sizes, limitations, and update schedule
We are transparent about what our data can and cannot tell you. AI answer engines are non-deterministic — the same prompt can return different responses on different runs. We account for this by testing the same question set repeatedly and reporting rates, not single observations.
[CONFIRM] Sample sizes and update schedule
Confirm: (a) the default number of queries per tracked project, (b) the number of runs per query per reporting period, (c) the reporting frequency (monthly, quarterly), (d) known limitations (non-determinism, model version changes, geo-variance), and (e) when this methodology page is reviewed and updated.
9Corrections policy: how to report an error and how corrections are dated
If you find an error in any LeadValets report, case study, or methodology description, we want to know. Contact us at jfloyd@leadvalets.com with a description of the error and, if applicable, a link to the page or report.
[CONFIRM] Corrections process
Confirm: (a) the turnaround time for reviewing a reported error, (b) whether corrections are noted inline or in a changelog, (c) whether the "Last updated" date at the top of this page is bumped for every correction or only for substantive methodology changes, and (d) whether past versions of this page are archived.
When a correction is made, the "Last updated" date at the top of this page is updated to reflect the change.