Methodology
How we score AI visibility
Most agencies will tell you they run an "AI visibility audit." Almost none will tell you what they measure. This is our complete rubric — every check, every threshold, every weight — so you can check our arithmetic before you pay for anything.
The five dimensions
An audit produces five independent scores and one letter grade. Each dimension measures something different, and a firm can be strong in one while failing another.
| Dimension | Range | Weight in grade |
|---|---|---|
| AI Platform Presence | 0–5.0 | 35% |
| Schema / Structured Data | 0–7 | 25% |
| Directory Citations | 0–9 | 20% |
| NAP Consistency | 0–1.0 | 10% |
| Knowledge Graph Entity | 0–3 | 10% |
Dimension 1 · 35% of grade
AI Platform Presence (0–5.0)
The question this answers: when a prospective client asks an AI assistant for a recommendation, does your firm get named?
We query four platforms directly and record which firms each one names.
| Platform | How we query it |
|---|---|
| ChatGPT | OpenAI API |
| Perplexity | Perplexity sonar API |
| Google Gemini | Google AI Studio API |
| Claude | Anthropic API |
The queries
Eight templates, each filled with the firm's city and ZIP code. They are written the way a real person asks — not the way a marketer writes a keyword.
"best estate planning attorney in {city} TX"
"best local estate planning attorney {city} Texas"
"estate planning lawyer near {city} Texas"
"who should I hire for a will and trust in {city} Texas"
"estate planning attorney {city} Texas"
"recommend an estate planning attorney near {zip}"
"estate planning attorney {city} TX reviews"
"wills and trusts lawyer {city} Texas"
How the score is calculated
A firm counts as mentioned when any word longer than three characters from its name appears in the response, case-insensitively. "Law Office of Doyle Ross Jackson" is matched on office, doyle, ross, and jackson.
Each platform gets a mention rate between 0 and 1 — the share of the eight queries in which the firm appeared. Those rates are averaged and rescaled so a perfect result is always 5.0, regardless of how many platforms returned usable data:
platform_rate = min(1.0, mentions / queries_run)
overall_score = sum(platform_rate) × (5.0 / platforms_scored)
A platform that returns an error or has no API key configured is excluded from the calculation rather than counted as a zero. A firm is never penalized for our infrastructure failing.
Dimension 2 · 25% of grade
Schema / Structured Data (0–7)
Structured data is how a website tells a machine what it is. Seven binary checks against the JSON-LD on your site — one point each.
| # | Check | What it looks for | Cost if missing |
|---|---|---|---|
| 1 | JSON-LD present | Any <script type="application/ld+json"> block | AI cannot read your business identity from your site |
| 2 | Attorney schema type | @type includes Attorney or LegalService | AI doesn't know you're a lawyer |
| 3 | Practice area markup | knowsAbout or makesOffer | AI doesn't know you do estate planning |
| 4 | Geographic markup | areaServed or geo | AI can't match you to local queries |
| 5 | Person entity | founder or employee typed as Person | AI can't connect the attorney to the firm |
| 6 | Opening hours | openingHoursSpecification | AI can't say when you're available |
| 7 | Review markup | aggregateRating | No ratings signal for AI to reference |
If a JSON-LD block exists but contains malformed JSON, check 1 fails and every downstream check fails with it — a parser that chokes reads exactly like a page with no markup at all.
Dimension 3 · 20% of grade
Directory Citations (0–9)
AI systems corroborate. A claim that exists only on your own website is the weakest possible signal; the same claim confirmed by nine independent directories is a strong one. One point per directory where a profile is found.
| Directory | Directory | Directory |
|---|---|---|
| Google Business Profile | Avvo | Justia |
| FindLaw | Super Lawyers | Martindale-Hubbell |
| Yelp | State Bar of Texas | Birdeye |
Claim status — whether you control the profile or it was auto-generated about you — is tracked separately and reported, but it does not change the citation score. Existence is what the score measures.
We never guess. When a directory check is rate-limited or blocked by bot detection, that entry is recorded as not verified and excluded from the score. It is never recorded as "not listed," and it never counts against you. An unverified check is a gap in our data, not a finding about your firm.
Dimension 4 · 10% of grade
NAP Consistency (0–1.0)
NAP is Name, Address, Phone. We collect all three from every directory where a profile was found, normalize them — lowercased, punctuation stripped, whitespace collapsed — and compare every source against every other source, field by field.
consistency_score = total_similarity / total_comparisons
This is the quietest failure in local search. A suite number on one listing and not another, or an old phone number that never got updated, is enough to make an AI system treat one business as two — and split the evidence for both.
| Score | Grade |
|---|---|
| ≥ 0.95 | A |
| ≥ 0.80 | B |
| ≥ 0.65 | C |
| ≥ 0.50 | D |
| < 0.50 | F |
A firm with fewer than two directory profiles scores a default 0.5 — neither good nor bad. With one data point there is nothing to compare, and inventing a verdict would be dishonest.
Dimension 5 · 10% of grade
Knowledge Graph Entity (0–3)
Whether your firm exists as a resolvable entity — a thing a machine can look up and be confident it has the right one — rather than as a string of text that happens to appear on some pages. One point per source.
| Source | How we check |
|---|---|
| Wikidata | SPARQL query against query.wikidata.org, falling back to the entity search API |
| Google Knowledge Panel | Search query and result parsing |
| Search for a company or person profile |
The overall grade
Each raw score is normalized to a 0–1 scale, weighted, and summed:
weighted = (ai_score / 5.0) × 0.35
+ (schema_score / 7.0) × 0.25
+ (citation_score / 9.0) × 0.20
+ nap_score × 0.10
+ (entity_score / 3.0) × 0.10
| Weighted score | Grade |
|---|---|
| ≥ 0.90 | A |
| ≥ 0.75 | B |
| ≥ 0.60 | C |
| ≥ 0.45 | D |
| < 0.45 | F |
When a dimension can't be measured at all, its weight is removed and the rest are renormalized to sum to 1.0. A firm with no website has no schema score, so schema's 25% is redistributed across the other four dimensions rather than scored as zero.
Limitations
What this method does not do well
Every measurement has failure modes. Here are ours, stated plainly — if a vendor won't tell you where their numbers are weak, the numbers are worth less.
Name matching is token-based
A firm whose name contains a common word can pick up a false positive when a different firm is mentioned. A firm that goes by a shorter name in practice can be missed entirely. We read the excerpts rather than trusting the count.
Directory checks can be blocked
Rate limits and bot detection produce unverified results. Those are excluded from scoring, not penalized — but they reduce how much the citation score is worth. Re-running later usually recovers the data.
NAP needs two sources
With a single directory profile there is nothing to compare against, so the score defaults to the midpoint. A thin footprint shows up in the citation score instead, which is where it belongs.
AI answers vary between runs
These systems are not deterministic. A single query is a sample, not a verdict — which is why the score is built from 8 queries across 4 platforms rather than one lookup.
Want this run on your firm?
Twenty minutes will tell you more than a year of guessing.
Audit findings describe what we measured on the dates listed in the report. Any projection of future visibility is a directional estimate, not a guarantee — results depend on implementation quality, market dynamics, and competitive factors.