24–48 hours
Search engines re-crawl your pages within hours of changes appearing in your sitemap or RSS feeds. SEO sub-score updates reflect newly indexed content quickly.
Transparency
Every number fixmyseo shows you is derived from a documented rule. This page explains every scoring dimension, every check, every data source, how competitors are discovered and ranked, and what has changed in each release.
fixmyseo measures AI visibility across three independent pillars. Each pillar scores 0–100. The overall score is the arithmetic mean: (SEO + AEO + GEO) ÷ 3. No weighting is applied between pillars — each outcome pillar contributes equally to the overall score (ADR Decision 6). Agent Runtime Compatibility (ARC) routes runtime-compatibility sub-scores into each pillar; it is measurement vocabulary, not a fourth pillar.
HTTPS, mobile viewport, Core Web Vitals, crawlability, on-page technical signals. These are prerequisites for any AI platform to index and trust the site.
AI Overview presence, featured snippets, knowledge panel signals, People Also Ask boxes. The signals AI uses to surface structured answers. Runtime compatibility (10 %) from ARC. FAQ schema removed at v0.1.
Actual citation checks across ChatGPT, Perplexity, Claude, Gemini, Google AI Overviews, and more. sameAs entity authority, vertical directory presence.
The SEO pillar measures discoverability and quality signals in traditional search engines. At v0.1, six sub-scores combine into the SEO pillar score: content quality and intent match (30 %), technical health (25 %), authority signals (22 %), content freshness (10 %), runtime compatibility via ARC (8 %), and brand web mentions (3 %). Local-intent businesses also receive a conditional Local SEO signals sub-score. The individual checks below contribute to the technical health and crawlability components.
https://. Detected via HTTP response.meta[name=viewport] tag with content including width=device-width.X-Content-Type-Options, X-Frame-Options, Content-Security-Policy. Indicates baseline response hardening.The AEO pillar measures appearance in deterministic answer surfaces: Google AI Overviews, featured snippets, knowledge panels, and People Also Ask boxes. Signals are detected from live SERP probes and structured-data analysis.
| Sub-score | Weight | Measurement method |
|---|---|---|
| AI Overview presence | 40 % | Inclusion in Google AI Overviews across tracked queries |
| Featured snippet capture | 25 % | Capture rate for featured snippet positions |
| Knowledge panel signals | 15 % | Entity disambiguation, knowledge graph presence |
| People Also Ask presence | 10 % | Inclusion in PAA boxes for tracked queries |
| Runtime compatibility | 10 % | ARC findings from google-search-agent-manager + cloudflare-project-think |
The GEO pillar is the only pillar that measures actual AI behaviour — not just technical signals that might influence AI. Queries are submitted live to AI platforms and citation presence is checked directly.
Platforms checked depend on the customer's subscription tier:
| Tier | Platforms checked |
|---|---|
| Starter (3) | ChatGPT, Google AI Overviews, Claude |
| Growth (6) | + Perplexity, Gemini, Mistral |
| Scale (6) | Same as Growth |
Queries are templated from the business context (name, category, city/country) and reach profile. Local-reach domains use location-modified queries ("best coffee shop near Sea Point"); global-reach domains use neutral queries. A minimum of 3 queries and maximum of 8 queries per platform are submitted per sweep.
A domain is counted as cited when the API response contains the exact domain hostname in a source attribution, a URL, or a named recommendation. The raw response text is retained for audit log purposes but is not shown to other users.
GEO score = (citation rate across all queries across all checked platforms) × 100, clipped to 0–100. Citation rate = number of queries where the domain was cited ÷ total queries run.
Agent Runtime Compatibility (ARC) is measurement vocabulary, not a fourth scored pillar. ARC measures whether agent runtimes can successfully read a customer's site — and routes those findings into the three outcome pillars via a pillar-routing table.
ARC runs three checks for each applicable (check × runtime) pair:
| Runtime | Category | Routes to | Tier |
|---|---|---|---|
| gemini-fetch | headless-fetch | GEO | Starter+ |
| claude-agent-skills | model-native-harness | GEO | Starter+ |
| openai-agents-sdk | model-native-harness | GEO | Growth+ |
| perplexity-fetch | headless-fetch | GEO | Growth+ |
| google-search-agent-manager | search-agent | SEO, AEO | Starter+ |
| cloudflare-project-think | model-native-harness | AEO, GEO | Scale |
Retrievability is the property of a page being eligible to enter the candidate set an AI engine draws on when generating a response. A page is retrievable if it is accessible to relevant crawlers, returns a parseable response to headless-fetch requests, and its material content is present without JavaScript execution for runtimes that do not execute JS.
The Retrievability view surfaces per-page, per-runtime eligibility for the customer's tracked pages. It is a diagnostic view — not a scored sub-score — because calibrated-weight evidence connecting retrievability to downstream citation outcomes is deferred to v0.2 (ADR Deferred Decision 5). The view is computed at query time from ARC and AI crawler accessibility data.
When an owned domain's snippet beacons in for the first time, and the business-context form has been completed, fixmyseo automatically runs competitor discovery to populate a ranked list of up to 15 candidates. This section explains exactly how discovery works.
Keywords are derived from:
business_contexts.adjacent_offeringscore_offering_categoryThe keyword set and all SERP/citation queries are scoped to the domain's declared reach profile before being submitted. A local-reach domain in Cape Town will only see Cape Town–scoped SERP results; a global-reach domain will see results from its declared country set. This prevents a local plumber from seeing US plumbing-supply chains in their top-15 competitor list despite keyword overlap.
DataForSEO is queried for organic SERP results across the keyword set, scoped to the domain's reach. Each candidate domain that appears in these results is scored by:
The citation_history table (populated from GEO sweeps) is cross-referenced. Candidates that appear in AI platform citations for the same queries that cite the owned domain receive a higher confidence score, and are more likely to receive the llm_rival or direct badge.
Each candidate's schema.org type and dominant content topics are compared against the owned domain's core_offering_category. Candidates outside the vertical are downranked. This prevents unrelated sites that happen to rank for overlapping informational keywords from appearing as high-priority competitors.
Up to 15 candidates are returned, sorted by composite confidence score (0–100). Each result includes a badge and a rationale string explaining the strongest signal that placed it on the list.
Each competitor suggestion carries a badge that summarises the dominant signal used to rank it, and a confidence score (0–100). Badges are not mutually exclusive in the underlying signal data; the badge shown is the single strongest signal.
| Badge | Signal | Example rationale |
|---|---|---|
| Direct | High overlap on both SERP and GEO citation signals simultaneously. | "Appears in 18 of your top 20 SERPs and is cited in 11 LLM queries you target — your strongest direct competitor." |
| SERP rival | High keyword overlap in organic search results; low or moderate GEO citation overlap. | "Ranks for 28 of your 40 target keywords (avg. position 5.1)." |
| LLM rival | High GEO citation overlap; lower SERP overlap. Cited by AI when the owned domain isn't. | "Cited in 14 of 30 tracked LLM queries — more than your domain (8)." |
| Adjacent | Same vertical or audience; lower keyword/citation overlap than Direct or Rival thresholds. | "Same vertical (specialty coffee retail); ranks for 9 of your keywords." |
| Local rival | Same geographic market with meaningful overlap. Applies only to Local-reach domains. | "Based in your city, targets the same keywords — consistent SERP competitor in your market." |
The confidence score (0–100) is a composite of four weighted sub-scores:
| Sub-score | Weight | Notes |
|---|---|---|
| SERP keyword overlap % | 35 % | keywords_overlap / total_keywords × 100 |
| SERP position quality | 20 % | Normalised: rank 1 = 100, rank 20 = 0. Averaged across overlapping keywords. |
| GEO citation overlap | 30 % | shared_citation_queries / total_geo_queries × 100 |
| Category match score | 15 % | 1.0 = same schema.org type; 0.5 = same vertical; 0.0 = no match |
Every owned domain declares a reach profile that governs how fixmyseo parameterises all scans, queries, and competitor discovery. Reach is set during onboarding and can be edited from domain settings at any time.
| Profile | Definition | DataForSEO location_code | GEO query style |
|---|---|---|---|
| Local | 1–N specific cities or metros. Defined by location codes and an ISO country code. | City-level code (e.g. 1006886 for Cape Town) | Location-modified: "best [category] near [city]" |
| National | One or more ISO countries without city anchoring. | Country-level code (e.g. 2840 for US) | Country-scoped neutral: "best [category] in [country]" |
| Global | Multi-country. Default rotation: US, UK, DE, AU. Configurable on Scale. | Rotated across declared countries | Neutral: "[category] [product/service]" |
Local reach prioritises: LocalBusiness schema, NAP consistency, Google Business Profile validation, local citation audit (Yelp, TripAdvisor, industry directories per vertical).
Global reach prioritises: Organization schema, hreflang audit, international SEO recommendations, multi-language FAQ generation.
National reach prioritises: national-scale entity signals, breadcrumb schema, country-specific directory presence.
fixmyseo never infers data that should be measured. Each check names its source. Where a source is unavailable, the check is marked "Not checked" — not scored as a pass or fail.
| Data | Source | Cache TTL |
|---|---|---|
| Page HTML / robots.txt | Direct HTTP fetch via @fixmyseo/crawler | Per-audit (no cross-audit cache) |
| Core Web Vitals (field) | Chrome UX Report (via PageSpeed Insights API) | 24 hours |
| Core Web Vitals (lab) | PageSpeed Insights Lighthouse | 24 hours |
| GEO citations | Live AI platform queries (ChatGPT API, Perplexity API, etc.) | None — always fresh per sweep |
| SERP results | DataForSEO Organic Results API | Per-audit (no cross-audit cache) |
| Competitor discovery | DataForSEO SERP overlap + citation_history table | On-demand refresh; auto-refreshes on business-context update |
| Schema detection | @fixmyseo/crawler JSON-LD parser | Per-audit |
| PSI cache | PageSpeed Insights — domain-level deduplicated | 24 hours (shared across audits) |
AI visibility moves on three distinct timescales. After FixMySEO deploys a fix, you’ll see different pillars update at different rates. Understanding this prevents the common mistake of evaluating results too early.
Search engines re-crawl your pages within hours of changes appearing in your sitemap or RSS feeds. SEO sub-score updates reflect newly indexed content quickly.
AI answer engines refresh their underlying corpus and prompt-data on roughly-weekly cycles. Structured content and FAQ deployment shows up in answer rates within this window.
Entity authority signals — citations, schema completeness, off-domain mentions — accumulate slowly through the broader web ecosystem. GEO sub-score reflects the cumulative effect of authority-building over weeks.
Want to see how this looks in practice? Read our breakdown of a real customer’s 30-day trajectory.
expand_faqs recategorised to AEO. B2B SaaS citation platform redistribution. Competitor discovery methodology added (§5–6 above). Reach-profile–aware GEO query construction documented (§7).