adegagaucha.com — SEO + GEO Audit

URL: https://adegagaucha.com/ Date: 2026-06-03 Duration: 32m 34s Business: Local Market: United States · English (+ Weglot es/pt/ar/fr) Mode: first Kit: Claude-Growth v1.0.17 T1 · GSC + DataForSEO MCP + Firecrawl MCP + WordPress MCP
Technical + CWV
72 /100
Fair
GEO + AEO
61 /100
Fair
Overall Search-Readiness
66 /100
Fair
74 Technical
58 Schema
55 Sitemap
80 Performance
64 GEO
62 Platform
58 Brand
68 Image
70 Local
68 Accessibility
58 Compliance
78 Audit Health
76 GSC / Google
71 On-Page
52 Visual

This SEO + GEO Audit scores the site on three composite indices — Technical + Core Web Vitals, GEO + AEO readiness, and an Overall Search-Readiness score — built from specialist agents covering technical health, schema, sitemap, performance, AI-crawler access, llms.txt, platform readiness, brand authority, and on-page quality. Every issue is ranked by fix ROI; ready-to-paste fix artifacts and a 90-day roadmap follow.

How to Read This Report

Ordered by what to do, in 3 tiers:

  • ACT (top) — what to fix, in order: Top-3 Priority · Quick Wins · Findings by severity · 90-Day Roadmap · 🤖 Apply with Claude Code (copy-paste prompt) + the ready-to-paste robots.txt / llms.txt artifacts in the Autofix Bundle.
  • INVESTIGATE (middle) — drill down: Score Breakdown · per-category Deep Dives (incl. on-page audit + performance levers) · the 7 charts (CWV, GEO radar, GSC, AI-crawler table, platform, striking-distance) · per-skill cards.
  • TRUST (bottom) — confidence the run was sound: Verification (10 gates) · Methodology timeline · Appendix (formulas, tools, tier coverage, capability checklist).

To apply fixes: hand Claude Code the report MD plus the fixes/ folder, then paste the prompt in the "🤖 Apply These Fixes with Claude Code" section below.

Glossary — what the terms mean

CWV (Core Web Vitals) — Google's UX metrics: LCP (load), INP (responsiveness), CLS (visual stability). They feed ranking + the Technical score.

LCP — Largest Contentful Paint — when the largest element renders. Good <2.5s, Poor ≥4.0s. Driven mostly by server response time (TTFB).

INP / CLS — INP = Interaction-to-Next-Paint (target <200ms, replaced FID). CLS = layout shift (target <0.1).

GEO / AEO — Generative / Answer Engine Optimization — being citable by AI engines (ChatGPT, Perplexity, Gemini, AI Overviews), not just ranking in blue links.

llms.txt — An emerging 2026 manifest that tells LLMs which URLs to read. A broken/missing one costs AI-citation coverage.

AI crawler access — Whether bots like GPTBot / ClaudeBot / PerplexityBot are allowed in robots.txt. Blocking them removes you from AI answers.

Schema (structured data) — JSON-LD that labels your content (Article, FAQ, Organization, Person…). Helps both rich results and AI extraction.

Canonical — The <link rel="canonical"> tag declaring the preferred URL for a page — prevents duplicate-content dilution.

Striking distance — Keywords ranking on page 2 (positions 11-20) with real impressions — small wins can push them to page 1.

Crawl budget — How many pages a search engine will fetch per visit. Wasted on junk URLs = important pages crawled less often.

E-E-A-T — Experience, Expertise, Authoritativeness, Trustworthiness — Google's content-quality framework.

The 3 Problems Hurting You Most Right Now

#1

Menu dishes & prices are not crawlable HTML (locked in a third-party widget)

seo-page grep of /menu and /menu/orlando: Picanha/Filet Mignon/Feijoada/prices = 0 HTML matches (content behind getsauce.com). GSC: /menu/ 1,366 clk / 111,037 imp / pos 6.7 (1.2% CTR).

→ Fix: 16h · Crawlable menu unlocks dish-level + near-me rankings and AI menu citations
#2

High-volume non-branded 'brazilian steakhouse' queries stuck at position 7-8

GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'brazilian steakhouse near me' 8,223 imp @ pos 7.8. 167 queries sit in positions 5...

→ Fix: 24h · Top-3 for the 3 non-branded heads ~= +3,000-5,000 incremental clicks / 90 days
#3

Indexed staging & utility subdomains duplicating production content

Firecrawl crawl: new.adegagaucha.com (HTTP 200, own robots; duplicates /blog /menu /rewards /our-team /lunch-menu /bar-menu /faqs), onlinemenu.adegagaucha.com (QuickQR menu), crm.adegagaucha.com (logi...

→ Fix: 6h · Consolidate duplicate surfaces -> stronger, more stable rankings on the main dom

Quick Wins — Shippable This Week

11.0h total

6 fixes shippable this week (effort = S). Estimated overall score lift +5-15 points.

  • H5Entity graph too thin: sameAs lists only Facebook 2h Stronger entity disambiguation -> better AI citations + knowledge panel eligibil
  • M9llms.txt is invalid — it serves the homepage HTML instead of a real file 1h Clean AI roadmap to menu, locations, reservations, about
  • M7Google Business website link points to a UTM/localo-tagged URL 1h Cleaner canonical + consistent NAP
  • L4No breadcrumb schema on homepage; hreflang lacks x-default 2h Cleaner SERP + correct international fallback
  • M2Privacy policy is robots-blocked, has a contradictory index tag, and lacks GDPR/CCPA language 2h Compliance + trust; lets the policy be found
  • M12Awards & reputation exist off-site but aren't surfaced on-site or in schema 3h Stronger E-E-A-T + AI trust signals

Executive Summary

66/100

Overall Score: 66/100 (Fair)

Website audit found 25 issues across 15 weighted categories. Technical fundamentals score 72/100 (Fair), while AI search readiness scores 61/100 (Fair).

Issue Distribution

P1: 5 P2: 15 P3: 5

Priority breakdown by severity — 25 findings total

The 3 Biggest Problems

  1. Menu dishes & prices are not crawlable HTML (locked in a third-party widget)seo-page grep of /menu and /menu/orlando: Picanha/Filet Mignon/Feijoada/prices = 0 HTML matches (content behind getsauce...
  2. High-volume non-branded 'brazilian steakhouse' queries stuck at position 7-8GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'b...
  3. Indexed staging & utility subdomains duplicating production contentFirecrawl crawl: new.adegagaucha.com (HTTP 200, own robots; duplicates /blog /menu /rewards /our-team /lunch-menu /bar-m...

Audit Details:

  • URL: https://adegagaucha.com/
  • Business Type: Local (confidence: high)
  • Market: United States · English (+ Weglot es/pt/ar/fr)
  • Pages Analyzed: 8
  • Sampled Deep: 8 business-type-prioritized pages

Score Breakdown

Overall Composite

CategoryScoreWeightWeightedRating
Technical 74/100 16% 11.9 Fair
Schema 58/100 12% 6.7 Poor
Sitemap 55/100 5% 3.0 Poor
Performance 80/100 12% 9.3 Good
Geo 64/100 22% 14.3 Fair
Platform 62/100 5% 3.3 Fair
Brand 58/100 12% 6.7 Poor
Image 68/100 5% 3.6 Fair
Local 70/100 11% 7.5 Fair
Accessibility* 68/100 Fair
Compliance* 58/100 Poor
Audit* 78/100 Good
Google-Api* 76/100 Good
Page-Deep-Dive* 71/100 Fair
Visual* 52/100 Poor
OVERALL 100% 66.3 → 66/100 Fair

* Informational categories with 0% weight in overall formula — surfaced from agent findings for context but not double-counted toward overall score.

Three Composite Scores

CompositeScoreRatingFormula
Technical + Core Web Vitals72/100FairTechnical*0.45 + Performance*0.35 + Sitemap*0.20...
GEO + AEO Readiness61/100FairGeo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12...
Overall Search-Readiness66/100FairTechnical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Plat...

Score Interpretation

  • 90-100: Excellent
  • 75-89: Good
  • 60-74: Fair
  • 40-59: Poor
  • 0-39: Critical

How this audit was conducted

Audit timeline

Audit ran in 32m 34s across 11 phases. 15 category scores computed.

0_setup
Setup
17s
1_discovery
Live Discovery
2s
2_sampling
Page Sampling
4s
3_issues
Issue Catalog Scan
5s
4_agents
Parallel Agents
26m50s
5_synthesis
Synthesis
5m16s
6_score
Score Calculation
0s
6.5_verification
Verification (10 gates)
0s
7_deliverable
Deliverable Generation
0s
8_pdf
PDF Generation
0s
9_cleanup
Cleanup
0s

Total: 32m 34s

Specialist tools used (click to inspect)

Specialist agents ran in parallel during Phase 4. Each examined a different dimension of your site. Click any agent to see its sub-scores, cost, and output file.

geo-accessibility 68/100
Why this tool:

Static WCAG 2.2 AA signals are mixed. Strengths: <html lang="en-US"> present, an /accessibility/ statement page exists (linked in footer), strong aria-label coverage on social/nav/CTA elements (12), and accordions expose aria-expanded. Defects that also hurt SEO/GEO: NO <main> and NO <header> landmarks (screen-reader + machine document-outline weakness); duplicate H1 (2 found) plus a full NESTED <…

ComponentScoreRating
Alt Text88/100Good
Semantic Structure52/100Poor
Forms Nav60/100Fair
geo-brand-mentions 58/100
Why this tool: Off-site brand authority scan (Reddit/YouTube/Wikipedia/LinkedIn)

Real-world reputation is excellent (multiple awards, 4.9/8689) but NOT reflected in the on-site entity graph: sameAs lists only Facebook, so AI/search can't easily connect the brand to authoritative third-party profiles.

geo-compliance 58/100
Why this tool:

No cookie consent banner present despite GTM + ActiveCampaign site-tracking firing and a privacy policy that admits use of 'cookies, pixel tags, and other online tracking technologies' — a CCPA/GDPR gap given FL local + Weglot multilingual (intl) traffic. Privacy policy and Terms exist and return 200, but robots.txt disallows both AND Terms carries a noindex meta tag; privacy policy paradoxically…

geo-crawlers 92/100
Why this tool: AI bot robots.txt audit (11 bots)

All 18 major AI/LLM crawlers are ALLOWED. robots.txt contains exactly one User-agent block (*) with no AI-specific Disallow rules, so every AI bot inherits the permissive wildcard policy and may crawl all content except the 13 listed utility/legal paths. No X-Robots-Tag header is present on the homepage (verified via curl -I), so there is no header-level suppression of AI indexing.

This is the des…

geo-llmstxt 30/100
Why this tool: llms.txt validate + generate

llms.txt returns HTTP 200 but the body is the full WordPress homepage HTML, not a valid llms.txt - effectively missing for AI consumers.

geo-platform-optimizer 62/100
Why this tool: Per-platform readiness (AIO/ChatGPT/Perplexity/Gemini/Copilot)

AI-search readiness is mixed. Strong: full SSR, rich Restaurant schema, all AI crawlers allowed, 4.9/8689 review authority. Weak: llms.txt broken (serves HTML), menu content non-crawlable, thin entity graph.

geo-schema 58/100
Why this tool: Winner over seo-schema — sameAs 14-platform strategy, per-type GEO rules

Rank Math emits a 6-node @graph on the homepage (Place, combined Restaurant+Organization, WebSite, ImageObject, WebPage, and a SECOND standalone Restaurant). Core LocalBusiness scaffolding is present and valid JSON-LD, but the schema is undermined by a duplicate/conflicting Restaurant entity (two @ids, contradictory priceRange 50-100 vs 80-150, telephone +14072504455 vs 14072504455, addressCountry…

ComponentScoreRating
Coverage60/100Fair
Validity48/100Poor
Sameas Entity Graph25/100Critical
Local Completeness35/100Critical
geo-technical 74/100
Why this tool: Winner over seo-technical — 449 lines, SSR 15pt dedicated, 11-bot matrix

WordPress is fully server-side rendered (300KB HTML, no SPA shell, self-referencing canonical, robots index/follow) so AI crawlers see all content — the single most important GEO factor passes. Crawlability is healthy: robots.txt is syntactically clean, sitemap_index (Rank Math) lists post+page sitemaps with fresh 2026-06-02 lastmod, and all three live location pages (/locations/orlando|kissimmee|…

ComponentScoreRating
Crawlability85/100Good
Indexation80/100Good
Security62/100Fair
Ssr Rendering95/100Excellent
Page Speed Signals58/100Poor
seo-audit 78/100
Why this tool: Master orchestrator — 15 subagents, 500-page crawl, built-in PDF

On-page SEO fundamentals are solid: unique well-formed titles/descriptions, correct self-referencing canonicals, indexable robots directives, complete OG/Twitter cards, Restaurant schema, valid hreflang (en/pt/es), and a fresh Rank Math sitemap (lastmod 2026-06-02). The two material defects are a duplicate H1 on the homepage (the 'todo' string flagged upstream is a benign Spanish CSS comment, NOT…

ComponentScoreRating
On Page76/100Good
Indexability82/100Good
Internal Linking80/100Good
seo-backlinks 0/100
Why this tool: Profile health + toxic links + authority gap

Backlink profile could not be measured this run - DataForSEO Backlinks subscription inactive, no Moz key. Reported N/A, not zero.

seo-google 76/100
Why this tool:

Strong branded dominance (22,558 clicks/90d, avg pos 8.5, 4.64% CTR) but the high-volume non-branded 'brazilian steakhouse' cluster is stuck at position 7-8 with 1.8-2.2% CTR - the single largest growth lever. 81% of traffic is mobile.

seo-images 68/100
Why this tool:

WebP adoption is strong (183 WebP refs) but no AVIF, no <picture>/responsive <source>, and 8 MB of mostly-image weight. The social/AI preview image is a generic logo, not food.

seo-local 70/100
Why this tool:

Local SEO is strong on rankings/reputation (#1 branded+location, 4.9/8689, OpenTable Diners' Choice + TripAdvisor Travelers' Choice 2023-2025) but multi-location schema and GBP link hygiene have clear gaps.

seo-maps 0/100
Why this tool:

Geo-grid map-pack tracking could not run (API error). GSC near-me queries indicate map-pack headroom; directional only.

seo-page 71/100
Why this tool:

Homepage is strongly optimized on-page (57-char title with brand+entity, 157-char location-rich meta, single logical H1, 10 keyword-aligned H2s, dense local-keyword coverage: Brazilian steakhouse 25x / Orlando 22x / Kissimmee 22x / Deerfield Beach 15x / churrasco 11x / rodizio 4x, valid canonical, en/pt/es hreflang, rich Restaurant+AggregateRating 4.9/8689 schema).

Two material homepage gaps: a du…

ComponentScoreRating
Homepage82/100Good
Menu Page58/100Poor
seo-performance 80/100
Why this tool: Core Web Vitals + field vs lab data

Measured lab Core Web Vitals PASS on desktop (LCP 2.05s, CLS 0, TBT 16ms; Perf 0.84). The real risk is an 8.08 MB total page weight that threatens mobile (81% of traffic).

seo-sitemap 55/100
Why this tool: Sitemap health + URL structure analysis

Architecture is sprawling with serious duplicate-surface problems: indexed staging/utility subdomains, a live /blog_old, and many parallel URL patterns for the same content.

seo-visual 52/100
Why this tool:

Browser capture (Playwright/Chromium 1280x720 + 375x812) confirms hero video + H1 are above-the-fold and a CTA is visible at both breakpoints. However, 5 compounding issues drag the score into the 40-59 band:

  1. duplicate H1 — a promotional popup/banner injects a second H1 at the very top of the DOM with emoji and seasonal text, competing directly with the brand H1;
  2. the LCP element is almost…

High Priority — Fix within 1 week

5 issues

These issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

H1

Duplicate copies of your site are live and getting indexed

High

Google has found multiple near-identical copies of your website on staging/utility subdomains (new., crm., onlinemenu., plus a French Kissimmee subdomain). Search engines split your ranking strength across these copies instead of concentrating it on your real site, and a login page is needlessly exposed.

6h (M) HIGH Consolidate duplicate surfaces -> stronger, more stable rankings on the main domain

Recommended fix

Add noindex + robots Disallow (or 301 to canonical) on new./crm./onlinemenu. subdomains; keep only the production host indexable; remove crm login from crawl.

Technical details for your developer
Firecrawl crawl: new.adegagaucha.com (HTTP 200, own robots; duplicates /blog /menu /rewards /our-team /lunch-menu /bar-menu /faqs), onlinemenu.adegagaucha.com (QuickQR menu), crm.adegagaucha.com (login page indexed), kissimmee.adegagaucha.com/fr
Indexed staging & utility subdomains duplicating production content
sitemap
seo-sitemap
H2

Search engines and AI can't read your menu or prices

High

Your menu items and prices load through an external widget (getsauce.com), so Google and AI assistants like ChatGPT can't actually read them. That blocks you from ranking for specific dish and price searches and from being quoted when people ask AI 'what's on the menu at Adega Gaucha?'. The /menu page already collects 111k impressions but converts poorly because of this.

16h (L) HIGH Crawlable menu unlocks dish-level + near-me rankings and AI menu citations

Recommended fix

Render menu items + prices as server-side HTML (not an iframe/JS widget); add schema.org Menu / hasMenuItem markup per location.

Technical details for your developer
seo-page grep of /menu and /menu/orlando: Picanha/Filet Mignon/Feijoada/prices = 0 HTML matches (content behind getsauce.com). GSC: /menu/ 1,366 clk / 111,037 imp / pos 6.7 (1.2% CTR).
Menu dishes & prices are not crawlable HTML (locked in a third-party widget)
platform
seo-page
H3

You're on page 1 for big money keywords but just below the top 3

High

For valuable non-branded searches like 'brazilian steakhouse', 'brazilian steakhouse orlando' and 'brazilian steakhouse near me', you rank around position 7-8 and only capture ~2% of clicks. These three terms alone show ~46,000 impressions in 90 days. Pushing them into the top 3 is the single biggest traffic opportunity on the site.

24h (M) HIGH Top-3 for the 3 non-branded heads ~= +3,000-5,000 incremental clicks / 90 days

Recommended fix

Strengthen non-branded intent on homepage + /locations/* (unique city copy, crawlable menu, FAQ, reviews); build local/food-media + tourism backlinks; consolidate menu URLs (see M6/M8).

Technical details for your developer
GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'brazilian steakhouse near me' 8,223 imp @ pos 7.8. 167 queries sit in positions 5-20.
High-volume non-branded 'brazilian steakhouse' queries stuck at position 7-8
geo
seo-google
H4

Two of your three restaurants are invisible to Google's local data

High

Your homepage tells Google about the Orlando restaurant only. Kissimmee and Deerfield Beach have no LocalBusiness entity with their own address, phone, hours and map pin — even though the Kissimmee address already ranks #1 when searched directly. This weakens each city's local and AI presence.

5h (M) HIGH Per-location entities strengthen each city's local + AI visibility

Recommended fix

Add a distinct Restaurant/LocalBusiness JSON-LD block on each /locations/* page with its own address, geo, telephone, openingHours, priceRange and hasMenu.

Technical details for your developer
rank-math @graph PostalAddress = 8204 Crystal Clear Ln, Orlando only. Kissimmee NAP exists (site ranks #1 for '7804 w irlo bronson memorial hwy kissimmee fl 34747') but has no LocalBusiness entity; Deerfield Beach likewise absent.
Only the Orlando location is in structured data; Kissimmee & Deerfield Beach are missing
schema
geo-schema
H5

Google & AI can't connect your brand to its reviews and awards

High

Your structured data only links the brand to Facebook. It omits Instagram, TripAdvisor, Yelp, OpenTable and your Google Business profiles — the exact authoritative sources that prove you're a real, highly-rated, award-winning restaurant. Adding them helps AI assistants trust and cite you and supports a Google knowledge panel.

2h (S) HIGH Stronger entity disambiguation -> better AI citations + knowledge panel eligibility

Recommended fix

Add 6-10 sameAs URLs to the Organization node (Instagram, TripAdvisor, Yelp, OpenTable, the 3 Google Business profiles, Wikidata if created).

Technical details for your developer
@graph Organization sameAs = ['https://www.facebook.com/adega.gaucha'] only (grep-verified). No Instagram / TripAdvisor / Yelp / OpenTable / Google Business / Wikidata / LinkedIn.
Entity graph too thin: sameAs lists only Facebook
brand
geo-schema

Medium Priority — Fix within 1 month

15 issues

These improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

M1

Trackers run before visitors agree — a privacy-law exposure

Medium

Google Tag Manager and ActiveCampaign start tracking visitors the moment a page loads, but there's no cookie-consent banner. For a Florida business (CCPA) with multilingual/international traffic (GDPR), that's a real compliance gap and a trust issue.

4h (M) HIGH Removes privacy-law exposure + builds visitor trust

Recommended fix

Install a consent manager (e.g. Complianz/Cookiebot); gate GTM + ActiveCampaign behind consent; add a 'Do Not Sell/Share' link.

Technical details for your developer
geo-compliance: no CMP found (cookiebot/onetrust/complianz/iubenda/termly all absent by grep); GTM-5WVCNNKW + ActiveCampaign site_tracking.js fire pre-consent (grep-verified). Only 2 trackers verified; FB/TikTok/Hotjar/Clarity absent.
No cookie-consent banner while GTM + ActiveCampaign fire before consent
compliance
geo-compliance
M2

Your privacy policy is hidden from search and missing required wording

Medium

The privacy policy page exists but is blocked in robots.txt while also carrying an 'index' meta tag (a contradiction), and its text contains no GDPR/CCPA or 'Do Not Sell' language. A privacy policy should be openly accessible and legally complete.

2h (S) HIGH Compliance + trust; lets the policy be found

Recommended fix

Unblock /privacy-policy/ and /terms-of-use/ in robots.txt; add GDPR/CCPA + Do-Not-Sell sections.

Technical details for your developer
geo-compliance: /privacy-policy/ returns 200 but is Disallowed in robots.txt and has meta robots 'index'; no GDPR/CCPA/'Do Not Sell' strings found. /terms-of-use/ similarly blocked.
Privacy policy is robots-blocked, has a contradictory index tag, and lacks GDPR/CCPA language
compliance
geo-compliance
M3

Your homepage is very heavy, which slows phones

Medium

The homepage downloads about 8 MB, most of it images. Lab Core Web Vitals still pass on desktop, but 81% of your visitors are on mobile where heavy pages load slower on real 4G connections. Trimming weight protects those ~18,000 mobile clicks a quarter.

6h (M) HIGH Faster mobile loads; protects mobile traffic + conversions

Recommended fix

Enable WP Rocket Remove Unused CSS + Delay JS; serve AVIF + responsive srcset; right-size hero images and audit the 360/video embeds.

Technical details for your developer
Lighthouse total-byte-weight = 8,078,017 bytes (homepage). GSC device split: mobile 18,195 clicks (81%) vs desktop 4,124. Measured LCP 2.05s / CLS 0 (lab desktop) currently PASS.
Homepage weighs 8.08 MB — a mobile performance risk
performance
seo-performance
M4

Too many builder files load before the page can show

Medium

The Elementor/ElementsKit/GutenKit/WPVR plugin stack loads dozens of CSS and JS files that block rendering. It isn't hurting desktop lab scores today, but it bloats the page and adds mobile risk.

5h (M) HIGH Less main-thread work + bytes, steadier mobile performance

Recommended fix

Use WP Rocket Remove Unused CSS + Load JS Deferred; disable unused builder modules.

Technical details for your developer
geo-technical grep: 33 render-blocking <link rel=stylesheet> + 75 <script> tags on homepage.
33 render-blocking stylesheets + ~75 scripts from the page-builder stack
performance
seo-performance
M5

Your structured data contradicts itself

Medium

There are two Restaurant blocks on the homepage with conflicting details: priceRange '50-100' vs '80-150', phone '+14072504455' vs '14072504455', country 'USA' vs 'United States', and the 4.9/8689 star rating sits in a separate block detached from the main Restaurant entity. Inconsistent data weakens how confidently Google and AI represent you.

3h (M) HIGH Consistent, consolidated entity -> better rich results + AI trust

Recommended fix

Consolidate to one canonical Restaurant entity per location; align priceRange/phone/country; attach AggregateRating to that entity.

Technical details for your developer
geo-schema grep of rank-math @graph: priceRange 50-100 (Org/Place) vs 80-150 (Restaurant node); telephone +14072504455 vs 14072504455; addressCountry USA vs United States; AggregateRating 4.9/8689 lives in a separate JSON-LD block, not on the #organization Restaurant node.
Conflicting & fragmented Restaurant schema (priceRange, phone, country, detached rating)
schema
geo-schema
M6

Old and duplicate page URLs compete with each other

Medium

An old blog (/blog_old) is still live, and many pages exist at two URLs at once (e.g. /kissimmee and /locations/kissimmee, /lunch-menu and /menu/lunch). These duplicates split ranking signals and confuse crawlers.

5h (M) HIGH Consolidated signals + cleaner crawl

Recommended fix

301 /blog_old; pick one canonical URL per topic and 301 the rest; purge redirecting URLs from the sitemap.

Technical details for your developer
Firecrawl: /blog_old ('Blog & OLD'); duplicate pairs /kissimmee vs /locations/kissimmee, /lunch-menu vs /menu/lunch, /bar-menu vs /menu/bar, /birthday vs /offers/birthday, /brunch-menu vs /menu/brunch; ~24 301-redirecting URLs still in page-sitemap.xml.
Legacy /blog_old + many parallel URL patterns for identical content
sitemap
seo-sitemap
M7

Your Google listing sends clicks to a tracking URL, not your clean page

Medium

The website button on your Google Business profile (Deerfield Beach) points to a URL with tracking parameters, and that tagged URL is what ranks (2,952 clicks). This competes with your clean location page and muddies your address-consistency signals.

1h (S) HIGH Cleaner canonical + consistent NAP

Recommended fix

Point the GBP website link to the clean /locations/deerfieldbeach/ URL (or canonicalize the parameter URL).

Technical details for your developer
GSC top pages: /deerfieldbeach?utm_source=google_profile&utm_campaign=localo&utm_medium=mainlink = 2,952 clicks (indexed, ranking).
Google Business website link points to a UTM/localo-tagged URL
local
seo-local
M8

Several menu pages fight each other for the same searches

Medium

Menu searches are spread across /menu/, /adega-gaucha-menus/, /menu-adega-gaucha-brazilian-steakhouse-orlando/, /menu/dinner/ and more. Concentrating this into one clear menu hub would make rankings more stable.

4h (M) MEDIUM Stronger, less volatile menu rankings

Recommended fix

Choose one canonical menu hub; 301 legacy menu slugs into it; interlink per-location menus from there.

Technical details for your developer
GSC: /menu/ (111k imp), /adega-gaucha-menus/ (66,280 imp pos 3.3), /menu-adega-gaucha-brazilian-steakhouse-orlando/, /menu/dinner/, /menu/lunch/ all rank for menu intent.
Menu intent split across many competing URLs
geo
seo-google
M9

Your AI-guidance file is broken

Medium

The /llms.txt file (a newer standard that tells AI assistants where your key pages are) returns your full WordPress homepage HTML instead of a proper text file. AI crawlers requesting it get garbage.

1h (S) HIGH Clean AI roadmap to menu, locations, reservations, about

Recommended fix

Publish a real plain-text /llms.txt listing canonical key URLs with short descriptions; serve as text/plain.

/geo llmstxt --generate
Technical details for your developer
curl https://adegagaucha.com/llms.txt -> '<!DOCTYPE html><html lang=en-US>...<title>Adega Gaucha...' (Rank Math homepage markup), not text/markdown.
llms.txt is invalid — it serves the homepage HTML instead of a real file
geo
geo-llmstxt
M10

Images aren't fully optimized and your share preview is unappetizing

Medium

Images use WebP (good) but never the newer, smaller AVIF format or responsive picture sources, contributing to the 8 MB page. And the social/AI preview image is your 800x800 logo rather than a mouth-watering churrasco photo, which lowers click-through when pages are shared or cited.

4h (M) HIGH Lighter mobile pages + higher share/citation CTR

Recommended fix

Enable AVIF (Imagify/Performance Lab) + responsive srcset; set a high-quality food photo as og:image with descriptive alt.

Technical details for your developer
grep homepage: 183 .webp, 0 .avif, 0 <picture>, 0 <source type=image/(webp|avif)>; og:image = Adega_Gaucha_Logo_Avatar-1024x1024.png; og:image:alt='steakhouse'.
No AVIF / responsive <picture> sources; social preview image is a logo, not food
image
seo-images
M11

A few on-page cleanups are overdue

Medium

The page-sitemap still lists ~24 URLs that 301-redirect, the /menu title is too long to show fully in search results, and the homepage has two H1 headings. Individually small, together they chip away at crawl efficiency and clarity.

3h (S) HIGH Cleaner crawl + better SERP snippet

Recommended fix

Remove redirecting URLs from the sitemap; shorten the /menu title; reduce to one H1 (also see M13 root cause).

Technical details for your developer
seo-audit: ~24 301-redirecting URLs in page-sitemap.xml; /menu <title> 73 chars over SERP width; 2 verified <h1> on homepage (hero + stale promo).
On-page hygiene: ~24 redirecting URLs in sitemap, over-long /menu title, 2 H1s
technical
seo-audit
M12

Your awards aren't working for you in search

Medium

You've won OpenTable Diners' Choice 2024, TripAdvisor Travelers' Choice 2023-2025 and Best of Florida 2023, and a 4.9/8689 rating — but these aren't presented in your About page or structured data where Google and AI can use them as trust signals.

3h (M) HIGH Stronger E-E-A-T + AI trust signals

Recommended fix

Add awards to the About page and Organization schema (award property); link the source profiles via sameAs (see H5).

Technical details for your developer
Firecrawl page copy: 'Proud Winners of OpenTable Diners Choice 2024, TripAdvisor Travelers Choice 2023/2024/2025, and Best of Florida 2023'; hosted a Yelp Elite event.
Awards & reputation exist off-site but aren't surfaced on-site or in schema
brand
geo-brand-mentions
M13

A broken widget injects a second webpage inside your homepage

Medium

An Elementor FAQ widget embeds a complete second <html lang='en'> document inside the homepage. That creates the duplicate H1, conflicts with the page's en-US language, and produces invalid markup that can confuse screen readers, search crawlers and AI parsers.

3h (M) HIGH Valid DOM -> reliable parsing for SEO, a11y and AI

Recommended fix

Rebuild the FAQ widget without a nested <html> document; ensure one <h1> and a single page-level lang.

Technical details for your developer
geo-accessibility: nested full <html lang='en'> document inside the FAQ Elementor widget; conflicts with page lang=en-US; drives the 2nd H1. seo-visual confirmed duplicate H1 in DOM order.
Invalid nested <html> document in an Elementor FAQ widget (root cause of duplicate H1 + lang conflict)
accessibility
geo-accessibility
M14

A few protective web-security headers are missing

Medium

The site sends HSTS and some headers but is missing a Content-Security-Policy and X-Frame-Options, and uses a permissive Referrer-Policy. These don't affect rankings directly but reduce protection against clickjacking/injection and can dent 'best practices' trust signals.

2h (S) MEDIUM Hardening + best-practice trust

Recommended fix

Add a Content-Security-Policy and X-Frame-Options: SAMEORIGIN; tighten Referrer-Policy to strict-origin-when-cross-origin.

Technical details for your developer
curl -I homepage: HSTS + X-Content-Type-Options + Permissions-Policy present; Content-Security-Policy ABSENT, X-Frame-Options ABSENT; Referrer-Policy=no-referrer-when-downgrade.
Security headers incomplete: no CSP, no X-Frame-Options, leaky Referrer-Policy
technical
geo-technical
M15

You're missing easy 'near me' visibility

Medium

Searches like 'brazilian restaurant near me', 'steakhouse near me' and 'churrasco near me' sit at positions 9-11. These are high-intent local searches where small gains drive real foot traffic.

4h (M) MEDIUM Map-pack + organic near-me visits

Recommended fix

Strengthen per-location proximity content + GBP categories/posts/review velocity; build local citations.

Technical details for your developer
GSC: 'brazilian restaurant near me' pos 10.2 (6,089 imp), 'steakhouse near me' pos 9.3, 'churrasco near me' pos 8.6, 'steak near me' pos 10.6.
'Near me' local demand under-captured
local
seo-local

Low Priority — Backlog

5 issues

Nice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.

L1

Small accessibility fixes remain

Low

Some form fields (subscribe, search) have no labels, there's no skip-to-content link, and heading levels skip (h2 -> h5). These affect screen-reader users and are quick to fix.

3h (S) HIGH Better accessibility + minor a11y/SEO signal

Recommended fix

Add <label>s to inputs, a skip-to-content link, and fix heading order.

Technical details for your developer
geo-accessibility: 3 placeholder-only inputs with no <label>; no skip-to-content link; heading jump h2->h5; unlabeled <nav>. Strengths: lang=en-US, 0 missing alt on 43 imgs, 12 aria-labels.
Accessibility gaps: missing form labels, no skip link, skipped heading levels
accessibility
geo-accessibility
L2

Server could use newer, faster transfer protocols

Low

The server responds over HTTP/1.1 with gzip compression. Enabling HTTP/2 and Brotli would shave a little transfer time, especially helpful on mobile.

2h (S) MEDIUM Marginal speed gain

Recommended fix

Enable HTTP/2 (or HTTP/3) + Brotli at the server/CDN.

Technical details for your developer
curl -I: HTTP/1.1; Content-Encoding: gzip (no br); h2 capability available per geo-technical.
HTTP/1.1 and gzip-only (no HTTP/2 / Brotli)
performance
seo-performance
L3

A couple of old spammy-looking URLs linger

Low

URLs like /dinner-menu-food-place-near-me and /cocktails-menu-restaurants-near-me look keyword-stuffed and low quality. Cleaning them up improves overall quality signals.

1h (S) MEDIUM Quality-signal cleanup

Recommended fix

301 these to the clean canonical menu URLs.

Technical details for your developer
Firecrawl: /dinner-menu-food-place-near-me, /cocktails-menu-restaurants-near-me.
Keyword-stuffed legacy slugs (doorway pattern)
sitemap
seo-sitemap
L4

Two minor structured-data omissions

Low

The homepage has no breadcrumb structured data, and the multilingual hreflang set (en/pt/es) is missing an x-default. Both are small but easy wins for cleaner SERP display and international targeting.

2h (S) HIGH Cleaner SERP + correct international fallback

Recommended fix

Add BreadcrumbList schema and an hreflang x-default.

Technical details for your developer
seo-audit/seo-page: no BreadcrumbList on homepage; hreflang en/pt/es present but no x-default.
No breadcrumb schema on homepage; hreflang lacks x-default
schema
geo-schema
L5

Two small front-end rendering glitches

Low

fetchpriority=high is applied to lazy-loaded SVG placeholders instead of the real hero image, and the mobile primary CTA renders at 0x0 in testing. Minor, but worth tidying for LCP and mobile usability.

2h (S) MEDIUM Protects LCP + mobile CTA visibility

Recommended fix

Move fetchpriority=high to the true LCP hero; fix the mobile CTA sizing.

Technical details for your developer
seo-visual (browser): fetchpriority=high on lazy SVG placeholders; hero video poster preloaded twice; mobile primary CTA at 0x0 dimensions. Positive: all 43 imgs have width/height (no image CLS); viewport correct; CLS measured 0.
fetchpriority wasted on lazy SVG placeholders; mobile primary CTA renders 0x0
image
seo-visual

Technical Deep Dive

74/100

Rating: Fair · Primary source: /geo-technical (74/100)

WordPress is fully server-side rendered (300KB HTML, no SPA shell, self-referencing canonical, robots index/follow) so AI crawlers see all content — the single most important GEO factor passes. Crawlability is healthy: robots.txt is syntactically clean, sitemap_index (Rank Math) lists post+page sitemaps with fresh 2026-06-02 lastmod, and all three live location pages (/locations/orlando|kissimmee|deerfieldbeach/) return 200, are NOT robots-blocked, and ARE in the page-sitemap (114 total URLs).

The robots.txt Disallow for /adega-gaucha-locations/ is largely harmless because that URL 301-redirects to /locations/ — it blocks a dead redirect, not live local content, but it is stale config worth cleaning. Weakest areas: (1) security headers — HTTPS+HSTS+nosniff+Permissions-Policy present but NO Content-Security-Policy and NO X-Frame-Options, plus a leaky Referrer-Policy (no-referrer-when-downgrade); (2) page-speed static signals — 33 render-blocking stylesheets and 75 script tags from the Elementor/ElementsKit/GutenKit builder stack, 0 font preloads, brotli requested but server falls back to gzip.

Mitigations already in place: 31/33 external scripts carry defer/async, all 43 imgs have width attributes (good CLS), 16 lazy-loaded + 4 fetchpriority=high. HTTP served as HTTP/1.1 though server advertises Upgrade: h2,h2c (HTTP/2 capable but not negotiated). X-Robots-Tag: noindex on sitemap_index.xml is standard/cosmetic for sitemaps, not a content-indexation problem.

Cross-checked by: seo-audit: 78/100seo-page: 71/100

Sub-component scores

ComponentScoreRating
Crawlability85/100Good
Indexation80/100Good
Security62/100Fair
Ssr Rendering95/100Excellent
Page Speed Signals58/100Poor

Findings from /geo-technical (7)

P3 Fully server-side rendered — AI crawlers see all content (PASS)

Evidence: curl homepage = 300,787 bytes HTML; grep <p = 10, <h1/<h2 = 12; grep 'div id="root|app"' = 0 (no SPA shell); meta robots content="follow, index, max-snippet:-1, max-image-preview:large"; canonical href="https://adegagaucha.com/" (self-referencing)

Impact: Highest-weight GEO factor passes: GPTBot/ClaudeBot/PerplexityBot (no JS execution) receive full content in initial HTML. No remediation needed; maintain SSR — do not migrate to a client-rendered theme.

P2 No Content-Security-Policy and no X-Frame-Options header

Evidence: curl -sI https://adegagaucha.com/ | grep -iE 'Content-Security|X-Frame' returned EMPTY (both ABSENT). Present headers: Strict-Transport-Security: max-age=31536000, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Permissions-Policy: geolocation=(), microphone=(),

Impact: Missing CSP = elevated XSS exposure; missing X-Frame-Options = clickjacking exposure. Security headers are a trust signal but have minimal direct ranking/GEO weight, hence P2 not P1.

P3 Weak Referrer-Policy leaks full URL on cross-origin HTTP

Evidence: curl -sI homepage: 'Referrer-Policy: no-referrer-when-downgrade' (sends full referrer to any HTTPS destination; only withholds on HTTPS->HTTP downgrade)

Impact: Minor privacy/data-leakage; no SEO/GEO ranking impact. Low priority.

P3 Stale robots.txt block of /adega-gaucha-locations/ (dead redirect, not live page)

Evidence: robots.txt: 'Disallow: /adega-gaucha-locations/'. curl -sI /adega-gaucha-locations/ = HTTP/1.1 301 -> Location: /locations/. Live page curl -sI /locations/ = HTTP/1.1 200, NOT in robots Disallow (grep 'Disallow: /locations' = empty). Sitemap contains /locations/orlando/, /locatio

Impact: NOT harmful to local-SEO indexation: the three live location pages are 200, unblocked, and in-sitemap. The block targets an old redirecting slug only. Cleanup avoids future confusion and prevents accidental crawl-budget signals on a redirect.

P2 33 render-blocking stylesheets + 75 script tags from page-builder stack

Evidence: grep on 300KB homepage HTML: stylesheet links = 33; <script tags total = 75; external src scripts = 33 of which only 2 lack defer/async (31/33 deferred — good); font preloads (rel=preload as=font) = 0; preconnect/dns-prefetch = 7. Stack: Elementor Pro + ElementsKit + GutenKit + W

Impact: Render-blocking CSS is the top LCP risk on this page (static signal only — live CWV measured by separate agent). Builder bloat inflates critical request chain. Confidence on user-facing CWV impact is MEDIUM without field data per accuracy rule 3.

P3 Brotli not served (gzip-only) and HTTP/1.1 despite HTTP/2 capability

Evidence: curl --compressed -D - => Content-Encoding: gzip (server falls back to gzip even when 'br' requested in Accept-Encoding). Response line: HTTP/1.1 200 OK with header 'Upgrade: h2,h2c' (server advertises HTTP/2 but did not negotiate it on request). Vary: Accept-Encoding present.

Impact: Brotli typically yields ~15-20% smaller text payloads vs gzip; HTTP/2 multiplexing helps the long request chain (33 CSS + 33 JS). Both improve transfer speed for this asset-heavy page. No correctness/indexation impact.

P3 Indexability and canonical configuration are correct (PASS)

Evidence: meta robots = index,follow; canonical = self-referencing https://adegagaucha.com/; http://adegagaucha.com/ -> 301 https://adegagaucha.com/ (HTTPS enforced); HSTS max-age=31536000 present; hreflang alternate tags = 3 (en, pt, es via Weglot). X-Robots-Tag: noindex appears only on s

Impact: Core indexability signals are healthy for both Google and AI crawlers. Multilingual hreflang correctly declared.

Findings from /seo-audit (8)

P1 Homepage has 2 <h1> tags (duplicate H1)

Evidence: grep '<h1' tmp/home.html -> 2 matches at byte 112828 and 260310. H1#1=[The Modern<br>Brazilian Steakhouse]; H1#2=[🌷 This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience. The best gift isn’t wrapped, it’s grilled!] (class='elementor-heading-title')

Impact: Splits the page's primary topical/keyword signal between the brand-defining hero and a transient promo headline, diluting relevance for 'Brazilian steakhouse Florida'. A single H1 is a long-standing on-page best practice.

P2 Stale seasonal promo as homepage H1 (Mother's Day, on 2026-06-03)

Evidence: Homepage H1#2 text='This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience'. Mother's Day 2026 was 2026-05-10; audit date 2026-06-03. og:updated_time='2026-05-28T09:48:33-04:00'.

Impact: Outdated seasonal content in the most prominent heading position signals poor freshness to users and crawlers and wastes prime above-the-fold real estate ~3 weeks after the event passed.

P2 ~24 redirecting (301) legacy flat URLs listed in page-sitemap.xml

Evidence: page-sitemap.xml lists legacy URLs e.g. /wine-list/, /orlando/, /kissimmee/, /brunch-menu/, /lunch-menu/, /bar-menu/, /desserts-menu/, /buffet/, /churrascotogo/. curl -I /wine-list/ -> 'HTTP/1.1 301 Moved Permanently, Location: /menu/wine-list/'; /orlando/ -> 301 -> /locations/or

Impact: Sitemaps should contain only canonical 200-status URLs. Listing 301-redirecting URLs wastes crawl budget, sends Google mixed signals about preferred URLs, and can slow consolidation of the clean URL structure.

P2 /menu title tag exceeds SERP display width (73 chars)

Evidence: tmp/menu.html <title>='Our Menu – Brazilian Steakhouse in Orlando, Kissimmee and Deerfield Beach' = 73 chars (>~60 char / ~580px desktop truncation threshold).

Impact: Title likely truncated in Google results, hiding 'Deerfield Beach' and weakening CTR for that location's queries.

P2 No BreadcrumbList schema or on-page breadcrumb navigation

Evidence: grep -i 'BreadcrumbList' tmp/home.html -> 0; grep -i 'breadcrumb' tmp/home.html -> 0. Schema types present: Restaurant x2, WebSite, WebPage, AggregateRating, OpeningHoursSpecification, PostalAddress x4, GeoCoordinates x2, Place, SearchAction — no BreadcrumbList.

Impact: Misses breadcrumb rich-result eligibility in SERPs and the navigational/hierarchy clarity that helps Google understand the deep /locations/* and /menu/* structure.

P3 hreflang set has no x-default

Evidence: tmp/home.html: <link rel='alternate' href='https://adegagaucha.com/' hreflang='en'/>, hreflang='pt' (/pt/), hreflang='es' (/es/). grep -i 'x-default' -> 0.

Impact: Without x-default, Google has no explicit fallback for locales not in the en/pt/es set; low impact given en is the de-facto default, but it is an incomplete hreflang cluster.

P3 'todo' upstream flag is a benign Spanish CSS comment, NOT an English placeholder

Evidence: Only match for 'todo' in tmp/home.html: 'width: 100%; /* Ocupa todo el ancho del contenedor */' ('takes up the full width of the container'). No standalone 'TODO' placeholder string exists. grep '\btodo\b' -> 1 (this comment).

Impact: No SEO impact — inline CSS comment, not visible content. Documented here to correct the upstream regex false-positive so it is not actioned as a content defect.

P3 og:image:alt is generic ('steakhouse') and og:image is logo, not a dish/venue photo

Evidence: tmp/home.html: og:image='.../Adega_Gaucha_Logo_Avatar-1024x1024.png', og:image:alt='steakhouse'. twitter:card='summary_large_image' paired with a square 800x800 logo.

Impact: Weak social/link-preview appeal; a square logo on a summary_large_image card and a one-word alt under-sell click-throughs from shared links.

Findings from /seo-page (9)

P0 Menu items, dishes & prices are NOT in crawlable HTML — trapped behind external getsauce.com widget

Evidence: grep of /menu.html and /menu/orlando/ for Picanha, Filet Mignon, Feijoada, Caipirinha, Salad Bar, Pao de Queijo, Sausage, Beef, Pork = 0 each; 'Picanha:3' on Orlando page is only inside img alt='...Picanha Churrasco'; '$[0-9]' price patterns = 0; menu links resolve to https://www

Impact: Local long-tail dish/price queries ('picanha orlando', 'brazilian steakhouse menu prices kissimmee') and AI assistants (ChatGPT/Perplexity/AI Overviews) cannot read or cite the menu. Largest organic + AI-visibility gap on the site.

P1 No Menu / MenuItem / MenuSection schema on any menu page

Evidence: grep '"@type":"(Menu|MenuItem|MenuSection)"' = 0 on /menu.html and /menu/orlando/. Menu pages carry only Restaurant/Place/Breadcrumb/WebPage schema.

Impact: Misses Restaurant menu rich results and structured menu data that AI engines use to answer 'what's on the menu / what does X cost' queries.

P1 /menu page is thin: hub-only content, no item-level depth vs informational+transactional intent

Evidence: /menu H1='Our Menus' (1), H2 count=3 (Each Location Its Own Culinary Experience / ENJOY WITH US / HOST YOUR EVENTS), H3 count=3 (Orlando/Kissimmee/Deerfield Beach). churrascaria=0, rodizio=0 on /menu. Body is location routers + events CTA, no dishes.

Impact: Page ranks weakly for 'brazilian steakhouse menu orlando' class queries because it offers no substantive menu answer; intent (see the menu) is unmet on-page.

P1 FAQPage schema ABSENT despite visible homepage FAQ section

Evidence: Homepage H2 'FAQs About Dining At Adega Gaucha' present in heading list; grep '"@type":"(FAQPage|Question|Answer)"' on /home.html = 0; no itemprop acceptedAnswer markup found.

Impact: Forgoes FAQ rich-result eligibility and easy AI-answer extraction for high-intent local dining questions already written on the page.

P2 Two H1 tags on homepage (second is an empty Elementor heading)

Evidence: grep '<h1' on /home.html returns 2: '<h1>' -> 'The Modern Brazilian Steakhouse' (valid) and '<h1 class="elementor-heading-title elementor-size-default">' which strips to empty text.

Impact: Diluted/ambiguous H1 signal; an empty H1 is a wasted primary heading and minor accessibility issue.

P2 Canonical/hreflang inconsistency on menu URL set; no x-default

Evidence: /menu and /menu-adega-gaucha-brazilian-steakhouse-orlando/ return byte-identical 189449-byte pages; both canonical to https://adegagaucha.com/menu/ (so the brief's URL is non-canonical but correctly points to /menu/). hreflang present en/pt/es on both pages but grep 'x-default' =

Impact: Multiple live URLs for the same page risk minor dilution if both are linked/indexed; missing x-default weakens international/Weglot signal for unmatched locales.

P2 Homepage hero/key images have empty alt attributes

Evidence: /home.html 23 <img>; alt='' count = 5 (includes leading hero images). Good alts exist on others ('Adega Gaucha Brazilian Steakhouse Picanha Churrasco', 'Open Table Diners Choice award 2023 2024 2025', 'Dinner').

Impact: Missed image-SEO + accessibility on above-fold hero; lost opportunity for location/keyword-bearing alt text.

P3 Menu-page images use weak/duplicated generic alt text

Evidence: /menu.html img alts: 'Adega Gaucha' repeated x4, and a malformed 'Adega_Gaucha_Group Dinin Events Orlando Host Steakhouse' (typo 'Dinin', underscores).

Impact: Low descriptive value and a visible typo in alt text; minor image-SEO/accessibility loss.

Schema Deep Dive

58/100

Rating: Poor · Primary source: /geo-schema (58/100)

Rank Math emits a 6-node @graph on the homepage (Place, combined Restaurant+Organization, WebSite, ImageObject, WebPage, and a SECOND standalone Restaurant). Core LocalBusiness scaffolding is present and valid JSON-LD, but the schema is undermined by a duplicate/conflicting Restaurant entity (two @ids, contradictory priceRange 50-100 vs 80-150, telephone +14072504455 vs 14072504455, addressCountry USA vs United States), a single-location footprint (only Orlando 8204 Crystal Clear Ln; Kissimmee + Deerfield Beach absent despite 3 locations), a sameAs array with ONLY Facebook (no Instagram/Wikidata/Google/TripAdvisor/Yelp), no AggregateRating anywhere in the graph (SHARED CONTEXT claim NOT confirmed = ABSENT), no speakable, and no Person/author schema despite twitter:data1='Fabiano Borsato'. servesCuisine and hasMenu exist only on the orphan Restaurant node and servesCuisine is polluted with non-cuisine values (Reservations Accepted, Happy Hour, etc.).

BreadcrumbList correctly present on /menu. Pinned page = homepage.

Sub-component scores

ComponentScoreRating
Coverage60/100Fair
Validity48/100Poor
Sameas Entity Graph25/100Critical
Local Completeness35/100Critical

Findings from /geo-schema (10)

P0 Duplicate, conflicting Restaurant entities in same @graph (two @ids, contradictory priceRange/telephone/country)

Evidence: Node A @id 'https://adegagaucha.com/#organization' @type [Restaurant,Organization]: priceRange '50-100', telephone '+14072504455', addressCountry 'USA'. Node B @id 'https://adegagaucha.com/#schema-130589' @type Restaurant: priceRange '80-150', telephone '14072504455', addressCoun

Impact: Two competing Restaurant nodes confuse Google entity resolution and AI knowledge-graph builders; conflicting priceRange and telephone create NAP inconsistency that can suppress rich results and erode local trust signals.

P1 sameAs entity graph is critically thin — Facebook only

Evidence: #organization node: "sameAs": [ "https://www.facebook.com/adega.gaucha" ]. No Instagram, Google Business Profile, TripAdvisor, Yelp, Wikidata, Wikipedia, LinkedIn, OpenTable, or YouTube. sameAs absent entirely from the #schema-130589 Restaurant node.

Impact: sameAs is the single highest-leverage GEO property for cross-platform entity resolution. With only Facebook, AI models (ChatGPT, Perplexity, Gemini, AI Overviews) cannot confidently link Adega Gaucha across platforms or verify it as a recognized entity, weakening citation likelih

P1 Only Orlando represented in schema; Kissimmee + Deerfield Beach have no LocalBusiness/Restaurant node

Evidence: All geo/address nodes point to Orlando: Place node streetAddress '8204 Crystal Clear Ln', geo 28.448804,-81.400653. The #schema-130589 description text reads 'in Orlando, Kissimmee, and Deerfield Beach' but no PostalAddress/GeoCoordinates/Restaurant node exists for Kissimmee or D

Impact: Two of three physical locations are invisible to local pack, Maps, and AI 'near me' queries. For a 3-location chain this is a major local-completeness gap directly costing discoverability in Kissimmee and Deerfield Beach markets.

P1 AggregateRating ABSENT from entire homepage graph

Evidence: grep 'AggregateRating|ratingValue|reviewCount|ratingCount' across rank-math-schema JSON = 0 matches in all 6 nodes. (SHARED CONTEXT listed AggregateRating among homepage @types; not present in actual markup — recorded as ABSENT per evidence rule.)

Impact: No star-rating rich result eligibility and no review-strength signal for AI models. Review stars are a high-CTR SERP feature for restaurants; their absence forfeits a strong local trust signal.

P2 servesCuisine polluted with non-cuisine values; both servesCuisine and hasMenu present only on the orphan Restaurant node

Evidence: #schema-130589 servesCuisine array includes valid cuisines ('Brazilian Steakhouse','Churrascaria','South American Cuisine') BUT also non-cuisine entries: 'Reservations Accepted','Online Ordering Available','Happy Hour','Family Friendly Dining','Full Bar','Group Dining'. hasMenu '

Impact: Misusing servesCuisine as a feature dump dilutes the cuisine signal and is invalid per Schema.org (servesCuisine = cuisine type only). After GS1 merge, the canonical node would lose hasMenu/servesCuisine unless migrated.

P2 No Person/author (Fabiano Borsato) schema despite twitter author meta

Evidence: HTML head: <meta name="twitter:label1" content="Written by"> and <meta name="twitter:data1" content="Fabiano Borsato">. No Person node, no 'author' or 'founder' property anywhere in the @graph; 'Borsato' appears only in the twitter meta, not in JSON-LD.

Impact: Author/founder identity is an E-E-A-T and entity signal AI models use to attribute expertise and ground the brand to a real person. The signal exists as Twitter Card metadata but is not machine-linked in structured data.

P3 No speakable property anywhere — page not marked up for voice/AI assistant reading

Evidence: grep 'speakable' across rank-math-schema JSON = 0 matches on homepage. Absent on WebPage and Restaurant nodes.

Impact: speakable explicitly flags voice/AI-readable sections (hours, location, cuisine, reservations) — high-value for 'hey Google, what time does Adega Gaucha open' style assistant queries. Underused property; low effort, direct GEO/voice signal.

P2 openingHours format issues and dual hours representations across the two nodes

Evidence: #organization uses legacy openingHours strings with full day NAMES and 12h-style ranges: 'Monday 10:30-09:00','Tuesday,Wednesday,Thursday,Friday,Saturday 11:30-10:00','Sunday 11:00-09:00' (note 'Monday 10:30-09:00' implies close BEFORE open / overnight ambiguity). #schema-130589

Impact: openingHours strings should use ISO day codes (Mo,Tu) and 24h HH:MM; '10:30-09:00' is parse-ambiguous. The two nodes disagree on daily hours, producing conflicting hours signals for Google and assistants.

Sitemap Deep Dive

55/100

Rating: Poor · Primary source: /seo-sitemap (55/100)

Architecture is sprawling with serious duplicate-surface problems: indexed staging/utility subdomains, a live /blog_old, and many parallel URL patterns for the same content.

Findings from /seo-sitemap (4)

P1 Indexed staging / duplicate subdomains

Evidence: Firecrawl found new.adegagaucha.com (HTTP 200, own robots, duplicates /blog /menu /rewards /our-team /lunch-menu /bar-menu /faqs), onlinemenu.adegagaucha.com (QuickQR menu), crm.adegagaucha.com (login indexed), kissimmee.adegagaucha.com/fr.

Impact: Eliminates duplicate-content dilution + wasted crawl budget

P2 Legacy /blog_old still live and indexed

Evidence: Firecrawl: https://adegagaucha.com/blog_old title 'Blog & OLD'.

Impact: Removes duplicate blog surface

P2 Parallel URL patterns for identical content (cannibalization)

Evidence: Firecrawl: /kissimmee vs /locations/kissimmee; /lunch-menu vs /menu/lunch; /bar-menu vs /menu/bar; /birthday vs /offers/birthday; /brunch-menu vs /menu/brunch. ~24 301-redirecting URLs still in page-sitemap.xml.

Impact: Consolidates ranking signals; cleaner crawl

P3 Keyword-stuffed legacy slugs (doorway pattern)

Evidence: Firecrawl: /dinner-menu-food-place-near-me, /cocktails-menu-restaurants-near-me.

Impact: Quality signal cleanup

Performance Deep Dive

80/100

Rating: Good · Primary source: /seo-performance (80/100)

Measured lab Core Web Vitals PASS on desktop (LCP 2.05s, CLS 0, TBT 16ms; Perf 0.84). The real risk is an 8.08 MB total page weight that threatens mobile (81% of traffic).

Cross-checked by: geo-technical: 74/100seo-google: 76/100

Performance levers — lab (mobile vs desktop)

MetricMobile (PSI)Desktop (Lighthouse)
Performance score0.84
LCP2.05s
CLS0
TBT / FID
FCP1.43s

Findings from /seo-performance (3)

P2 Total page weight 8.08 MB - mobile performance risk

Evidence: Lighthouse total-byte-weight = 8,078,017 bytes on homepage. 81% of GSC traffic is mobile.

Impact: Better mobile LCP on 4G; protects 18k mobile clicks/90d

P2 33 render-blocking stylesheets + ~75 scripts from page-builder stack

Evidence: geo-technical grep: 33 render-blocking stylesheets + 75 script tags (Elementor/ElementsKit/GutenKit/WPVR).

Impact: Reduces main-thread + bytes; bloats mobile

P3 HTTP/1.1 + gzip-only (no brotli)

Evidence: curl -I shows HTTP/1.1; Content-Encoding: gzip (no br).

Impact: Marginal transfer savings + multiplexing

Findings from /geo-technical (7)

P3 Fully server-side rendered — AI crawlers see all content (PASS)

Evidence: curl homepage = 300,787 bytes HTML; grep <p = 10, <h1/<h2 = 12; grep 'div id="root|app"' = 0 (no SPA shell); meta robots content="follow, index, max-snippet:-1, max-image-preview:large"; canonical href="https://adegagaucha.com/" (self-referencing)

Impact: Highest-weight GEO factor passes: GPTBot/ClaudeBot/PerplexityBot (no JS execution) receive full content in initial HTML. No remediation needed; maintain SSR — do not migrate to a client-rendered theme.

P2 No Content-Security-Policy and no X-Frame-Options header

Evidence: curl -sI https://adegagaucha.com/ | grep -iE 'Content-Security|X-Frame' returned EMPTY (both ABSENT). Present headers: Strict-Transport-Security: max-age=31536000, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Permissions-Policy: geolocation=(), microphone=(),

Impact: Missing CSP = elevated XSS exposure; missing X-Frame-Options = clickjacking exposure. Security headers are a trust signal but have minimal direct ranking/GEO weight, hence P2 not P1.

P3 Weak Referrer-Policy leaks full URL on cross-origin HTTP

Evidence: curl -sI homepage: 'Referrer-Policy: no-referrer-when-downgrade' (sends full referrer to any HTTPS destination; only withholds on HTTPS->HTTP downgrade)

Impact: Minor privacy/data-leakage; no SEO/GEO ranking impact. Low priority.

P3 Stale robots.txt block of /adega-gaucha-locations/ (dead redirect, not live page)

Evidence: robots.txt: 'Disallow: /adega-gaucha-locations/'. curl -sI /adega-gaucha-locations/ = HTTP/1.1 301 -> Location: /locations/. Live page curl -sI /locations/ = HTTP/1.1 200, NOT in robots Disallow (grep 'Disallow: /locations' = empty). Sitemap contains /locations/orlando/, /locatio

Impact: NOT harmful to local-SEO indexation: the three live location pages are 200, unblocked, and in-sitemap. The block targets an old redirecting slug only. Cleanup avoids future confusion and prevents accidental crawl-budget signals on a redirect.

P2 33 render-blocking stylesheets + 75 script tags from page-builder stack

Evidence: grep on 300KB homepage HTML: stylesheet links = 33; <script tags total = 75; external src scripts = 33 of which only 2 lack defer/async (31/33 deferred — good); font preloads (rel=preload as=font) = 0; preconnect/dns-prefetch = 7. Stack: Elementor Pro + ElementsKit + GutenKit + W

Impact: Render-blocking CSS is the top LCP risk on this page (static signal only — live CWV measured by separate agent). Builder bloat inflates critical request chain. Confidence on user-facing CWV impact is MEDIUM without field data per accuracy rule 3.

P3 Brotli not served (gzip-only) and HTTP/1.1 despite HTTP/2 capability

Evidence: curl --compressed -D - => Content-Encoding: gzip (server falls back to gzip even when 'br' requested in Accept-Encoding). Response line: HTTP/1.1 200 OK with header 'Upgrade: h2,h2c' (server advertises HTTP/2 but did not negotiate it on request). Vary: Accept-Encoding present.

Impact: Brotli typically yields ~15-20% smaller text payloads vs gzip; HTTP/2 multiplexing helps the long request chain (33 CSS + 33 JS). Both improve transfer speed for this asset-heavy page. No correctness/indexation impact.

P3 Indexability and canonical configuration are correct (PASS)

Evidence: meta robots = index,follow; canonical = self-referencing https://adegagaucha.com/; http://adegagaucha.com/ -> 301 https://adegagaucha.com/ (HTTPS enforced); HSTS max-age=31536000 present; hreflang alternate tags = 3 (en, pt, es via Weglot). X-Robots-Tag: noindex appears only on s

Impact: Core indexability signals are healthy for both Google and AI crawlers. Multilingual hreflang correctly declared.

Findings from /seo-google (4)

P1 High-volume non-branded 'brazilian steakhouse' cluster stuck at position 7-8

Evidence: GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'brazilian steakhouse near me' 8,223 imp @ pos 7.8. 167 queries in pos 5-20.

Impact: Moving the 3 non-branded heads from pos ~7 to pos 3 ~= +3-5k incremental clicks/90d

P1 /menu/ earns 111k impressions at pos 6.7 but content is non-crawlable

Evidence: GSC: /menu/ 1,366 clk / 111,037 imp / pos 6.7 (1.2% CTR); menu dish/price text not in HTML (getsauce.com widget).

Impact: Crawlable menu could lift CTR and capture dish-level + near-me queries

P2 GBP main link lands on UTM-tagged URL

Evidence: GSC top pages: /deerfieldbeach?utm_source=google_profile&utm_campaign=localo&utm_medium=mainlink = 2,952 clicks (indexed ranking URL with tracking params).

Impact: Param URL competes with clean canonical; dilutes signals

P2 Menu URL fragmentation / cannibalization

Evidence: GSC: /menu/, /adega-gaucha-menus/ (66,280 imp pos 3.3), /menu-adega-gaucha-brazilian-steakhouse-orlando/, /menu/dinner/, /menu/lunch/ all rank for menu intent.

Impact: Consolidating equity to one menu hub improves rank stability

Geo Deep Dive

64/100

Rating: Fair · Primary source: /geo-llmstxt (30/100)

llms.txt returns HTTP 200 but the body is the full WordPress homepage HTML, not a valid llms.txt - effectively missing for AI consumers.

Findings from /geo-llmstxt (1)

P2 Invalid llms.txt (serves homepage HTML / soft-404)

Evidence: curl -sL https://adegagaucha.com/llms.txt -> '<!DOCTYPE html><html lang=en-US>...<title>Adega Gaucha...' (Rank Math homepage markup), not text/markdown.

Impact: A real llms.txt guides AI crawlers to menu, locations, reservations, about

Platform Deep Dive

62/100

Rating: Fair · Primary source: /geo-platform-optimizer (62/100)

AI-search readiness is mixed. Strong: full SSR, rich Restaurant schema, all AI crawlers allowed, 4.9/8689 review authority. Weak: llms.txt broken (serves HTML), menu content non-crawlable, thin entity graph.

Findings from /geo-platform-optimizer (2)

P1 Non-crawlable menu blocks AI dish/price citations

Evidence: Menu items/prices absent from HTML (getsauce.com widget).

Impact: Unlocks menu/price AI answers

P2 llms.txt invalid (serves homepage HTML)

Evidence: curl https://adegagaucha.com/llms.txt returns full WordPress homepage HTML, not llms.txt markdown.

Impact: Clean AI site map of key pages

Brand Deep Dive

58/100

Rating: Poor · Primary source: /geo-brand-mentions (58/100)

Real-world reputation is excellent (multiple awards, 4.9/8689) but NOT reflected in the on-site entity graph: sameAs lists only Facebook, so AI/search can't easily connect the brand to authoritative third-party profiles.

Findings from /geo-brand-mentions (2)

P1 sameAs lists only Facebook - entity graph too thin for AI authority

Evidence: @graph Organization sameAs=['https://www.facebook.com/adega.gaucha'] only. No Instagram, TripAdvisor, Yelp, OpenTable, Google Business, Wikidata, LinkedIn.

Impact: Stronger entity disambiguation -> better AI citations + knowledge panel

P2 Award/reputation signals exist off-site but unconsolidated

Evidence: Firecrawl page copy: 'Proud Winners of OpenTable Diners Choice 2024, TripAdvisor Travelers Choice 2023/2024/2025, and Best of Florida 2023'; hosted Yelp Elite event.

Impact: Surfacing awards in schema/About strengthens E-E-A-T + AI trust

Findings from /seo-backlinks (1)

P2 Authority/citation footprint appears thin (indirect signal)

Evidence: On-site sameAs lists only Facebook; off-site awards exist but unconsolidated. Direct backlink metrics UNAVAILABLE.

Impact: Local link building likely needed to lift non-branded heads (seo-google SG1)

Image Deep Dive

68/100

Rating: Fair · Primary source: /seo-performance (80/100)

Measured lab Core Web Vitals PASS on desktop (LCP 2.05s, CLS 0, TBT 16ms; Perf 0.84). The real risk is an 8.08 MB total page weight that threatens mobile (81% of traffic).

Findings from /seo-performance (3)

P2 Total page weight 8.08 MB - mobile performance risk

Evidence: Lighthouse total-byte-weight = 8,078,017 bytes on homepage. 81% of GSC traffic is mobile.

Impact: Better mobile LCP on 4G; protects 18k mobile clicks/90d

P2 33 render-blocking stylesheets + ~75 scripts from page-builder stack

Evidence: geo-technical grep: 33 render-blocking stylesheets + 75 script tags (Elementor/ElementsKit/GutenKit/WPVR).

Impact: Reduces main-thread + bytes; bloats mobile

P3 HTTP/1.1 + gzip-only (no brotli)

Evidence: curl -I shows HTTP/1.1; Content-Encoding: gzip (no br).

Impact: Marginal transfer savings + multiplexing

Accessibility Deep Dive

68/100

Rating: Fair · Primary source: /geo-accessibility (68/100)

Static WCAG 2.2 AA signals are mixed. Strengths: <html lang="en-US"> present, an /accessibility/ statement page exists (linked in footer), strong aria-label coverage on social/nav/CTA elements (12), and accordions expose aria-expanded. Defects that also hurt SEO/GEO: NO <main> and NO <header> landmarks (screen-reader + machine document-outline weakness); duplicate H1 (2 found) plus a full NESTED <html lang="en"> document embedded in an Elementor HTML widget (the FAQ block) that conflicts with the page-level lang="en-US" and breaks document validity; no skip-to-content link; skipped heading levels (h2->h5 with no h3/h4); and 3 form inputs (subscribe full_name/email + search) with zero <label> elements (placeholder-only, fails 1.3.1/3.3.2).

Alt coverage is acceptable: 34/43 images have descriptive alt, 9 use valid empty alt="" (decorative), 0 missing the attribute. Contrast and focus-indicator checks require a browser and are listed as coverage gaps.

Sub-component scores

ComponentScoreRating
Alt Text88/100Good
Semantic Structure52/100Poor
Forms Nav60/100Fair

Findings from /geo-accessibility (9)

P1 No <main> or <header> landmark on homepage

Evidence: grep -oicE '<main[ >]' = 0; '<header[ >]' = 0 (home). Present: <nav> x4, <footer> x1. Menu page also 0 main / 0 header.

Impact: Screen-reader users cannot jump to primary content via landmark navigation (WCAG 1.3.1 / ARIA landmark best practice); machine document-outline / GEO content extraction is weaker without a <main> content boundary.

P1 Duplicate H1 + nested full <html> document in Elementor HTML widget

Evidence: grep '<h1[ >]' = 2. Byte offset of <html>: 16 and 210452. Nested doc at line 3101: '<!DOCTYPE html><html lang="en"><head>...<title>Adega Gaucha | FAQs</title>'. Second H1 belongs to this nested document.

Impact: Two H1s confuse screen-reader heading navigation and dilute the topical H1 signal for SEO; a nested <html>/<head>/<title> inside <body> is invalid HTML and the embedded lang="en" conflicts with the page lang="en-US", harming assistive-tech language detection and crawler parsing.

P1 Form inputs lack associated <label> (placeholder-only)

Evidence: grep '<label' = 0 vs '<input' = 3. Inputs: subscribe-form full_name (placeholder 'First & Last Name', required), email (placeholder 'Email Address', required), search field (placeholder 'enter search term'). No for/id or aria-label on the inputs themselves.

Impact: Placeholder text is not a programmatic label; it disappears on input and is unreliable for screen readers (WCAG 1.3.1 Info & Relationships, 3.3.2 Labels or Instructions, 4.1.2 Name/Role/Value). Affects the birthday/email subscribe form and site search.

P2 No skip-to-content link

Evidence: grep for 'skip-to-content|skip-link|#content...skip' = 0 matches on homepage.

Impact: Keyboard and screen-reader users must tab through the full nav (4 <nav> blocks) on every page load to reach content (WCAG 2.4.1 Bypass Blocks).

P2 Skipped heading levels (h2 -> h5, no h3/h4)

Evidence: Heading sequence on home: h1 h2 h3 h3 h3 h4 h5 h2 h5 h2 h5 h5 h5 h5 h2 h2 h3 h2 h3 h5 h2 h5 h2 h2 h2 h1 h3. Multiple h2->h5 jumps; h6 count = 0.

Impact: Non-sequential headings break the logical document outline for screen-reader heading navigation (WCAG 1.3.1) and weaken content-structure signals used by AI extractors/GEO.

P3 Primary nav lacks aria-label; otherwise good ARIA coverage

Evidence: grep '<nav class="adega-menu">' has no aria-label; footer navs (ag-footer-nav, ag-footer-legal) also unlabeled. Positive: 12 aria-label values on social/CTA (Facebook, Instagram, 'Birthday gift — claim yours', etc.) and 7 accordion buttons expose aria-expanded.

Impact: Multiple <nav> elements without distinct aria-labels are announced identically ('navigation') to screen readers, reducing wayfinding (WCAG 1.3.1 / ARIA practice). Low severity since labels exist elsewhere.

P3 Image alt coverage acceptable; 9 decorative empty-alt verified, 0 missing

Evidence: Home: 43 <img> total, 34 with non-empty alt, 9 with alt="" (valid decorative), 0 with no alt attribute. 20.9% lack a descriptive alt but all are explicitly marked decorative. Menu page: 6/6 images have non-empty alt (100%).

Impact: Minor. Empty alt on truly decorative images is WCAG-correct. Risk only if any of the 9 decorative-marked images actually convey content (e.g., logo, dish photos) — that would be a 1.1.1 failure.

P3 Image-heavy hero — text-in-image risk unverifiable statically

Evidence: Homepage 300KB, 16 lazy images + 4 fetchpriority=high (per shared context); hero H1 'The Modern Brazilian Steakhouse' is real text (good), but cannot confirm whether hero/section background images embed marketing copy without rendering.

Impact: If promotional text (hours, offers, location names) is baked into hero/section images, it is invisible to screen readers and to AI/GEO text extraction (WCAG 1.4.5 Images of Text).

Compliance Deep Dive

58/100

Rating: Poor · Primary source: /geo-compliance (58/100)

No cookie consent banner present despite GTM + ActiveCampaign site-tracking firing and a privacy policy that admits use of 'cookies, pixel tags, and other online tracking technologies' — a CCPA/GDPR gap given FL local + Weglot multilingual (intl) traffic. Privacy policy and Terms exist and return 200, but robots.txt disallows both AND Terms carries a noindex meta tag; privacy policy paradoxically has 'index' in its meta robots yet is robots.txt-blocked (conflicting signals).

Privacy policy lacks any GDPR, CCPA, or 'Do Not Sell' language. HTTPS + HSTS (max-age=31536000) confirmed; no CSP. Verified third-party trackers via exact grep only: Google Tag Manager (GTM-5WVCNNKW) and ActiveCampaign site_tracking.js. No exact match for Facebook pixel, TikTok, Hotjar, Clarity, or Bing — reported ABSENT.

Findings from /geo-compliance (6)

P1 No cookie consent banner / CMP present despite active trackers

Evidence: grep for cookiebot|onetrust|complianz|cookie-law-info|borlabs|iubenda|termly|cookie-notice|wp-gdpr|cookieyes|moove_gdpr on homepage returned ZERO matches, while GTM-5WVCNNKW (gtm.js) and activecampaign site_tracking.js both load on page load.

Impact: CCPA (FL business serving CA visitors) and GDPR (Weglot multilingual implies EU/intl visitors) both expect notice + opt-out/consent before non-essential tracking. Trackers fire pre-consent. Legal/trust exposure; California 'Do Not Sell/Share' opt-out not offered.

P2 Privacy policy blocked in robots.txt with conflicting index meta

Evidence: robots.txt: 'Disallow: /privacy-policy/'. But page HTML meta: robots content="follow, index, max-snippet:-1...". Page returns HTTP 200 and is user-accessible.

Impact: A privacy policy SHOULD be openly indexable/accessible for compliance and trust signals; blocking it in robots.txt while the page itself says 'index' is a contradictory signal and weakens transparency. Crawlers cannot read it to corroborate trust/E-E-A-T.

P3 Terms of use double-blocked (robots.txt Disallow + noindex meta)

Evidence: robots.txt: 'Disallow: /terms-of-use/'. Page HTML meta: robots content="follow, noindex". Page returns HTTP 200.

Impact: Terms are accessible to users (200) but deliberately kept out of the index. Lower compliance impact than privacy policy, but still a transparency/trust signal best left accessible to crawlers.

P1 Privacy policy lacks GDPR / CCPA / 'Do Not Sell' language

Evidence: WebFetch of /privacy-policy/: terms PRESENT = 'cookies, pixel tags, and other online tracking technologies', SMS opt-out (reply STOP), contact it@adegagaucha.com. Terms ABSENT = GDPR, CCPA, California Consumer Privacy Act, 'Do Not Sell', Google Analytics, data rights.

Impact: Policy admits tracking-tech use but provides no CCPA disclosures (right to know/delete/opt-out of sale-share) and no GDPR lawful-basis/data-subject-rights section. For a FL business with multilingual (intl) reach, both regimes are plausibly in scope.

P2 Data-collection forms (newsletter / birthday) without visible consent linkage

Evidence: Homepage grep: type="email" input + ActiveCampaign plugin present; robots.txt also blocks /birthdayform/. ActiveCampaign site_tracking.js loads. No CMP/consent checkbox detected in homepage grep.

Impact: Email + birthday (potentially DOB) collection via ActiveCampaign with site-wide tracking but no detected consent checkbox or privacy-policy link at point of collection raises CCPA/GDPR consent-and-notice concerns, especially for the birthday form (could imply age/minor data).

P3 HTTPS + HSTS confirmed; no CSP header

Evidence: Response headers: 'Strict-Transport-Security: max-age=31536000' and 'X-Content-Type-Options: nosniff' present. No Content-Security-Policy and no X-Frame-Options header observed.

Impact: Transport security is solid (HSTS 1yr). Missing CSP/X-Frame-Options is a defense-in-depth hardening gap, not a privacy-law violation; low priority given third-party tag footprint is small (GTM + AC).

Local Deep Dive

70/100

Rating: Fair

No Phase 4 agent JSON found for this category. Findings related to this category appear in the issue list above.

Audit Deep Dive

78/100

Rating: Good · Primary source: /seo-audit (78/100)

On-page SEO fundamentals are solid: unique well-formed titles/descriptions, correct self-referencing canonicals, indexable robots directives, complete OG/Twitter cards, Restaurant schema, valid hreflang (en/pt/es), and a fresh Rank Math sitemap (lastmod 2026-06-02). The two material defects are a duplicate H1 on the homepage (the 'todo' string flagged upstream is a benign Spanish CSS comment, NOT an English placeholder) and ~24 legacy flat URLs that 301-redirect yet remain listed in page-sitemap.xml.

Breadcrumb markup is absent and the /menu title exceeds SERP display width.

Sub-component scores

ComponentScoreRating
On Page76/100Good
Indexability82/100Good
Internal Linking80/100Good

Findings from /seo-audit (8)

P1 Homepage has 2 <h1> tags (duplicate H1)

Evidence: grep '<h1' tmp/home.html -> 2 matches at byte 112828 and 260310. H1#1=[The Modern<br>Brazilian Steakhouse]; H1#2=[🌷 This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience. The best gift isn’t wrapped, it’s grilled!] (class='elementor-heading-title')

Impact: Splits the page's primary topical/keyword signal between the brand-defining hero and a transient promo headline, diluting relevance for 'Brazilian steakhouse Florida'. A single H1 is a long-standing on-page best practice.

P2 Stale seasonal promo as homepage H1 (Mother's Day, on 2026-06-03)

Evidence: Homepage H1#2 text='This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience'. Mother's Day 2026 was 2026-05-10; audit date 2026-06-03. og:updated_time='2026-05-28T09:48:33-04:00'.

Impact: Outdated seasonal content in the most prominent heading position signals poor freshness to users and crawlers and wastes prime above-the-fold real estate ~3 weeks after the event passed.

P2 ~24 redirecting (301) legacy flat URLs listed in page-sitemap.xml

Evidence: page-sitemap.xml lists legacy URLs e.g. /wine-list/, /orlando/, /kissimmee/, /brunch-menu/, /lunch-menu/, /bar-menu/, /desserts-menu/, /buffet/, /churrascotogo/. curl -I /wine-list/ -> 'HTTP/1.1 301 Moved Permanently, Location: /menu/wine-list/'; /orlando/ -> 301 -> /locations/or

Impact: Sitemaps should contain only canonical 200-status URLs. Listing 301-redirecting URLs wastes crawl budget, sends Google mixed signals about preferred URLs, and can slow consolidation of the clean URL structure.

P2 /menu title tag exceeds SERP display width (73 chars)

Evidence: tmp/menu.html <title>='Our Menu – Brazilian Steakhouse in Orlando, Kissimmee and Deerfield Beach' = 73 chars (>~60 char / ~580px desktop truncation threshold).

Impact: Title likely truncated in Google results, hiding 'Deerfield Beach' and weakening CTR for that location's queries.

P2 No BreadcrumbList schema or on-page breadcrumb navigation

Evidence: grep -i 'BreadcrumbList' tmp/home.html -> 0; grep -i 'breadcrumb' tmp/home.html -> 0. Schema types present: Restaurant x2, WebSite, WebPage, AggregateRating, OpeningHoursSpecification, PostalAddress x4, GeoCoordinates x2, Place, SearchAction — no BreadcrumbList.

Impact: Misses breadcrumb rich-result eligibility in SERPs and the navigational/hierarchy clarity that helps Google understand the deep /locations/* and /menu/* structure.

P3 hreflang set has no x-default

Evidence: tmp/home.html: <link rel='alternate' href='https://adegagaucha.com/' hreflang='en'/>, hreflang='pt' (/pt/), hreflang='es' (/es/). grep -i 'x-default' -> 0.

Impact: Without x-default, Google has no explicit fallback for locales not in the en/pt/es set; low impact given en is the de-facto default, but it is an incomplete hreflang cluster.

P3 'todo' upstream flag is a benign Spanish CSS comment, NOT an English placeholder

Evidence: Only match for 'todo' in tmp/home.html: 'width: 100%; /* Ocupa todo el ancho del contenedor */' ('takes up the full width of the container'). No standalone 'TODO' placeholder string exists. grep '\btodo\b' -> 1 (this comment).

Impact: No SEO impact — inline CSS comment, not visible content. Documented here to correct the upstream regex false-positive so it is not actioned as a content defect.

P3 og:image:alt is generic ('steakhouse') and og:image is logo, not a dish/venue photo

Evidence: tmp/home.html: og:image='.../Adega_Gaucha_Logo_Avatar-1024x1024.png', og:image:alt='steakhouse'. twitter:card='summary_large_image' paired with a square 800x800 logo.

Impact: Weak social/link-preview appeal; a square logo on a summary_large_image card and a one-word alt under-sell click-throughs from shared links.

Google-Api Deep Dive

76/100

Rating: Good · Primary source: /seo-google (76/100)

Strong branded dominance (22,558 clicks/90d, avg pos 8.5, 4.64% CTR) but the high-volume non-branded 'brazilian steakhouse' cluster is stuck at position 7-8 with 1.8-2.2% CTR - the single largest growth lever. 81% of traffic is mobile.

Findings from /seo-google (4)

P1 High-volume non-branded 'brazilian steakhouse' cluster stuck at position 7-8

Evidence: GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'brazilian steakhouse near me' 8,223 imp @ pos 7.8. 167 queries in pos 5-20.

Impact: Moving the 3 non-branded heads from pos ~7 to pos 3 ~= +3-5k incremental clicks/90d

P1 /menu/ earns 111k impressions at pos 6.7 but content is non-crawlable

Evidence: GSC: /menu/ 1,366 clk / 111,037 imp / pos 6.7 (1.2% CTR); menu dish/price text not in HTML (getsauce.com widget).

Impact: Crawlable menu could lift CTR and capture dish-level + near-me queries

P2 GBP main link lands on UTM-tagged URL

Evidence: GSC top pages: /deerfieldbeach?utm_source=google_profile&utm_campaign=localo&utm_medium=mainlink = 2,952 clicks (indexed ranking URL with tracking params).

Impact: Param URL competes with clean canonical; dilutes signals

P2 Menu URL fragmentation / cannibalization

Evidence: GSC: /menu/, /adega-gaucha-menus/ (66,280 imp pos 3.3), /menu-adega-gaucha-brazilian-steakhouse-orlando/, /menu/dinner/, /menu/lunch/ all rank for menu intent.

Impact: Consolidating equity to one menu hub improves rank stability

Page-Deep-Dive Deep Dive

71/100

Rating: Fair · Primary source: /seo-page (71/100)

Homepage is strongly optimized on-page (57-char title with brand+entity, 157-char location-rich meta, single logical H1, 10 keyword-aligned H2s, dense local-keyword coverage: Brazilian steakhouse 25x / Orlando 22x / Kissimmee 22x / Deerfield Beach 15x / churrasco 11x / rodizio 4x, valid canonical, en/pt/es hreflang, rich Restaurant+AggregateRating 4.9/8689 schema).

Two material homepage gaps: a duplicate empty Elementor <h1> (2 H1 tags total) and FAQPage schema ABSENT despite a visible FAQ section. The /menu page is a thin HUB (H1 'Our Menus', only 3 H2 + 3 location H3s, no item-level content) that routes to /menu/orlando|kissimmee|deerfield-beach/.

CRITICAL: actual menu items, dishes, and prices are NOT in crawlable HTML on any menu page (grep of Picanha/Filet Mignon/Feijoada/Caipirinha/prices = 0 crawlable hits; 'Picanha' only appears inside image alt text) — items live behind an external getsauce.com ordering widget. No Menu/MenuItem schema anywhere.

This blocks local long-tail dish rankings and AI-citation of the menu. Canonical on /menu resolves to /menu/ (the URL in the brief, /menu-adega-gaucha-brazilian-steakhouse-orlando/, serves the same page but is NOT the self-referencing canonical). hreflang lacks x-default on both pages.

Sub-component scores

ComponentScoreRating
Homepage82/100Good
Menu Page58/100Poor

Findings from /seo-page (9)

P0 Menu items, dishes & prices are NOT in crawlable HTML — trapped behind external getsauce.com widget

Evidence: grep of /menu.html and /menu/orlando/ for Picanha, Filet Mignon, Feijoada, Caipirinha, Salad Bar, Pao de Queijo, Sausage, Beef, Pork = 0 each; 'Picanha:3' on Orlando page is only inside img alt='...Picanha Churrasco'; '$[0-9]' price patterns = 0; menu links resolve to https://www

Impact: Local long-tail dish/price queries ('picanha orlando', 'brazilian steakhouse menu prices kissimmee') and AI assistants (ChatGPT/Perplexity/AI Overviews) cannot read or cite the menu. Largest organic + AI-visibility gap on the site.

P1 No Menu / MenuItem / MenuSection schema on any menu page

Evidence: grep '"@type":"(Menu|MenuItem|MenuSection)"' = 0 on /menu.html and /menu/orlando/. Menu pages carry only Restaurant/Place/Breadcrumb/WebPage schema.

Impact: Misses Restaurant menu rich results and structured menu data that AI engines use to answer 'what's on the menu / what does X cost' queries.

P1 /menu page is thin: hub-only content, no item-level depth vs informational+transactional intent

Evidence: /menu H1='Our Menus' (1), H2 count=3 (Each Location Its Own Culinary Experience / ENJOY WITH US / HOST YOUR EVENTS), H3 count=3 (Orlando/Kissimmee/Deerfield Beach). churrascaria=0, rodizio=0 on /menu. Body is location routers + events CTA, no dishes.

Impact: Page ranks weakly for 'brazilian steakhouse menu orlando' class queries because it offers no substantive menu answer; intent (see the menu) is unmet on-page.

P1 FAQPage schema ABSENT despite visible homepage FAQ section

Evidence: Homepage H2 'FAQs About Dining At Adega Gaucha' present in heading list; grep '"@type":"(FAQPage|Question|Answer)"' on /home.html = 0; no itemprop acceptedAnswer markup found.

Impact: Forgoes FAQ rich-result eligibility and easy AI-answer extraction for high-intent local dining questions already written on the page.

P2 Two H1 tags on homepage (second is an empty Elementor heading)

Evidence: grep '<h1' on /home.html returns 2: '<h1>' -> 'The Modern Brazilian Steakhouse' (valid) and '<h1 class="elementor-heading-title elementor-size-default">' which strips to empty text.

Impact: Diluted/ambiguous H1 signal; an empty H1 is a wasted primary heading and minor accessibility issue.

P2 Canonical/hreflang inconsistency on menu URL set; no x-default

Evidence: /menu and /menu-adega-gaucha-brazilian-steakhouse-orlando/ return byte-identical 189449-byte pages; both canonical to https://adegagaucha.com/menu/ (so the brief's URL is non-canonical but correctly points to /menu/). hreflang present en/pt/es on both pages but grep 'x-default' =

Impact: Multiple live URLs for the same page risk minor dilution if both are linked/indexed; missing x-default weakens international/Weglot signal for unmatched locales.

P2 Homepage hero/key images have empty alt attributes

Evidence: /home.html 23 <img>; alt='' count = 5 (includes leading hero images). Good alts exist on others ('Adega Gaucha Brazilian Steakhouse Picanha Churrasco', 'Open Table Diners Choice award 2023 2024 2025', 'Dinner').

Impact: Missed image-SEO + accessibility on above-fold hero; lost opportunity for location/keyword-bearing alt text.

P3 Menu-page images use weak/duplicated generic alt text

Evidence: /menu.html img alts: 'Adega Gaucha' repeated x4, and a malformed 'Adega_Gaucha_Group Dinin Events Orlando Host Steakhouse' (typo 'Dinin', underscores).

Impact: Low descriptive value and a visible typo in alt text; minor image-SEO/accessibility loss.

Visual Deep Dive

52/100

Rating: Poor · Primary source: /seo-visual (52/100)

Browser capture (Playwright/Chromium 1280x720 + 375x812) confirms hero video + H1 are above-the-fold and a CTA is visible at both breakpoints. However, 5 compounding issues drag the score into the 40-59 band: (1) duplicate H1 — a promotional popup/banner injects a second H1 at the very top of the DOM with emoji and seasonal text, competing directly with the brand H1; (2) the LCP element is almost certainly the hero video poster (Capture.jpg, JPEG, ~unknown KB, preloaded twice with redundant tags) rather than any of the 4 fetchpriority=high <img> tags — both high-priority imgs resolve to an SVG placeholder at page-load time (lazy-loaded via data-lazy-src plugin), creating a fetchpriority=high + lazy-load conflict on at least one of them; (3) the hero video MP4 (2.5 MB) is served from a different subdomain (new.adegagaucha.com) with no <video preload> attribute — latency risk; (4) two distinct Google Fonts bundles (9 total link tags, 4 render-blocking stylesheets) cause measurable FOUT/FOIT risk; (5) the mobile 'BOOK NOW' CTA in the sticky bottom bar has zero rendered dimensions (0x0 rect), meaning the anchored button may be a zero-size tap target on some mobile browsers.

No horizontal overflow on mobile. All 43 <img> tags carry explicit width and height attributes (good CLS hygiene for img tags). WPVR 360 tour referenced in JS/CSS but not rendered as iframe on homepage — no live CLS risk there.

Findings from /seo-visual (10)

P1 Duplicate H1 — promotional popup H1 competes with brand H1

Evidence: DOM query via Playwright returns 2 H1 elements: (1) 'THE MODERN BRAZILIAN STEAKHOUSE' at rect.top=213px (hero section); (2) 'This Mother's Day, surprise her with Adega Gaucha's legendary Churrasco Experience...' at rect.top=0 — rendered as the topmost element, likely a sticky pro

Impact: Google's Googlebot reads the promo H1 first in DOM order and may weight it as the page topic signal, diluting the brand/keyword H1. Seasonal H1 creates repeated crawl-time topic drift. Known 2-H1 issue confirmed.

P2 fetchpriority=high conflict with lazy-load plugin on award badge image

Evidence: One <img> tag carries both fetchpriority='high' and a lazy-load plugin data-lazy-srcset pattern. At Playwright networkidle, src resolves to an SVG placeholder (data:image/svg+xml...) with natural_w=150, natural_h=150 — actual image not fetched. The fetchpriority=high signal is wa

Impact: Browser priority scheduler elevates an SVG placeholder to high fetch priority, potentially delaying true LCP candidate. Real award badge images (trust signals) load late, harming perceived load quality and potential LCP score.

P2 Hero LCP is a video poster (JPEG) preloaded twice — redundant preload tag

Evidence: HTML source contains two <link rel='preload' as='image' href='Capture.jpg'> tags for the same URL: one with fetchpriority='high' (WP Rocket), one without. The hero element is a <video class='ag-hero__video'> with poster='Capture.jpg' — making Capture.jpg the probable LCP candidat

Impact: Duplicate preload wastes one browser preload slot and may cause a double-fetch depending on browser cache keying. No video preload means first-frame display depends on video stream buffering. Cross-origin subdomain adds DNS/TLS round-trip for video. JPEG poster is larger than equ

P2 4 render-blocking Google Fonts stylesheet requests (2 duplicate bundles)

Evidence: Source contains 9 Google Fonts <link> tags total; 4 are rel='stylesheet' (render-blocking). Two distinct font bundles are each requested twice: Bundle A (Inter/Oswald/Jost/Playfair Display) appears as both a WP Rocket preload and a direct stylesheet; Bundle B (Montserrat/Varela R

Impact: Each render-blocking stylesheet adds a network round-trip on the critical path. Duplicate requests mean the browser may issue redundant fetches before cache kicks in. Loading 10+ font families across 2 bundles increases FOUT/FOIT window — visible text flash during hero load. This

P2 Mobile sticky CTA 'BOOK NOW' renders at 0x0 dimensions

Evidence: Playwright mobile (375x812) DOM query: CTA text 'book your table now' has rect={x:0, y:0, width:0, height:0, top:0}. The element exists and visible_atf=true only because coordinates are 0,0 — but zero width/height means no rendered tap surface. Separately, 'Menu' and 'Order now'

Impact: If the primary mobile reservation CTA (book your table now) has no rendered dimensions, mobile users cannot tap it. This directly breaks the primary conversion path on mobile. Google's mobile-first index evaluates mobile usability; a zero-size CTA may also trigger Core Web Vitals

P3 Visual hierarchy: H1 visible but hero headline uses dark overlay — low contrast risk

Evidence: Desktop screenshot (1280x720) shows 'THE MODERN BRAZILIAN STEAKHOUSE' in white text over a darkened food-photography video frame. Contrast ratio not measured (no automated contrast tool invoked). H1 is the dominant above-the-fold text element at ~213px from top. Mobile screenshot

Impact: If video frame brightens at certain timestamps, H1 text may fall below WCAG AA 4.5:1 ratio. Low contrast on primary H1 is an accessibility issue and can indirectly affect engagement metrics.

P3 WPVR 360-tour plugin present in codebase but not rendering iframe on homepage

Evidence: HTML source grep finds 5 WPVR/360-tour string references (likely in CSS/JS asset URLs). Playwright DOM query returns 0 iframes on homepage (only GTM noscript iframe). No WPVR shortcode found in rendered HTML. Plugin is loaded but 360-tour not embedded on homepage.

Impact: WPVR JS/CSS assets may still be enqueued globally (adding payload), but no live CLS risk from an unrendered iframe. If tour pages do embed WPVR iframes without explicit width/height attributes, those pages will have CLS risk. Homepage CLS risk from WPVR is not confirmed.

P3 33 stylesheet link tags total — Elementor + WP plugin CSS proliferation

Evidence: Source grep returns 33 <link rel='stylesheet'> tags in homepage HTML. This includes Elementor base/pro, Weglot, multiple plugin stylesheets. While WP Rocket minifies/combines some, the Google Fonts 4 render-blocking requests remain separate. Large stylesheet count increases criti

Impact: Each additional stylesheet is a potential render-blocking resource. At 33 total, even with deferred loading for non-critical sheets, the sheer volume increases the probability of render-blocking and delays FCP. This is background pressure on all Core Web Vitals, not an isolated i

Visualizations

Site-infrastructure charts. Keyword-gap, competitor, and internal-link visualizations live in /blog-audit-pipeline (content-portfolio audit) after the v0.5.15 split. Where data is unavailable for this tier/source, a disclosure callout is shown instead of placeholder numbers.

Chart 1: Core Web Vitals

Targets: LCP <2.5s · INP <200ms · CLS <0.1. LCP (load speed) is driven mostly by server response time (TTFB) — see Performance deep dive.

2053 ms
LCP
0 ms
INP
0.00
CLS

Fig 1: Core Web Vitals — lab data — desktop (Lighthouse/PSI; CrUX field N/A; INP=lab TBT proxy)

Chart 2: GEO Readiness Radar

How citable the site is to AI engines. Each axis 0-100; further from center is better. Weak axes (llms.txt, brand authority) are the biggest AI-visibility gaps.

Citability(64)Brand(58)Platform(62)Crawler(92)llms.txt(30)Schema AI(58)Answer(0)

Fig 2: GEO readiness across 7 dimensions

Chart 3: Backlink Authority Distribution

DR/DA 0-20 = low-authority links; 61-100 = high-authority. You want more referring domains, weighted toward the right.

📊 Backlink Authority Distribution

Direct backlink metrics could not be measured this run — the histogram needs referring-domain data that is unavailable.
Backlink profile could not be measured this run - DataForSEO Backlinks subscription inactive, no Moz key. Reported N/A, not zero.

Each row is an AI/search bot. Allowed = it can read and cite your pages; Blocked removes you from that engine's answers.

The Priority Breakdown figure is in the Executive Summary. All charts use Okabe-Ito color-blind safe palette.

90-Day Roadmap

Visual phased plan. Each block clickable in full HTML; here shown as Gantt-style timeline.

Weeks 1-2 (Critical)
Weeks 3-6 (Schema + Perf)
Weeks 7-12 (Authority + Content)
P0 Critical fixes
P1 High fixes
P2 Medium fixes
Content expansion
Internal links
Authority building

What ships each window

Weeks 3-6 · P1
  • H1 · Duplicate copies of your site are live and getting indexed
  • H2 · Search engines and AI can't read your menu or prices
  • H3 · You're on page 1 for big money keywords but just below the top 3
Weeks 7-12 · P2
  • M1 · Trackers run before visitors agree — a privacy-law exposure
  • M2 · Your privacy policy is hidden from search and missing required wording
  • M3 · Your homepage is very heavy, which slows phones

Expected Score Progression

MilestoneProjected ScoreDelta
Current baseline66/100
After Week 1-2 (all P0 fixed)66/100+0
After Week 6 (P0+P1 fixed)74/100+8 (cumulative +8)
After Week 12 (P0+P1+P2 fixed)82/100+8 (cumulative +16)

Projection model: sums each finding's impact_quantified per-axis score points (geo/technical/brand/schema/…) per severity bucket, capped at 25/18/12 pts respectively to avoid double-counting overlapping fixes. Real-world deltas depend on execution quality.

Autofix Bundle

25 fixes

Pipeline generates fix artifacts into audits/[client]/[date]/fixes/. Generate-only mode — review + apply manually via WP MCP / direct upload.

🤖 AUTO-SAFE (upload directly) — 3 fixes
H5 · Entity graph too thin: sameAs lists only Facebook manual-guide
M9 · llms.txt is invalid — it serves the homepage HTML instead of a real file /geo llmstxt --generate
L4 · No breadcrumb schema on homepage; hreflang lacks x-default manual-guide
👁️ AUTO-REVIEW (review carefully first) — 9 fixes
H4 · Only the Orlando location is in structured data; Kissimmee & Deerfield Beach are missing manual-guide
M2 · Privacy policy is robots-blocked, has a contradictory index tag, and lacks GDPR/CCPA language manual-guide
M5 · Conflicting & fragmented Restaurant schema (priceRange, phone, country, detached rating) manual-guide
M10 · No AVIF / responsive sources; social preview image is a logo, not food manual-guide
M11 · On-page hygiene: ~24 redirecting URLs in sitemap, over-long /menu title, 2 H1s manual-guide
M12 · Awards & reputation exist off-site but aren't surfaced on-site or in schema manual-guide
M13 · Invalid nested document in an Elementor FAQ widget (root cause of duplicate H1 + lang conflict) manual-guide
L1 · Accessibility gaps: missing form labels, no skip link, skipped heading levels manual-guide
L5 · fetchpriority wasted on lazy SVG placeholders; mobile primary CTA renders 0x0 manual-guide
📋 MANUAL (step-by-step guides) — 13 fixes
H1 · Indexed staging & utility subdomains duplicating production content manual-guide
H2 · Menu dishes & prices are not crawlable HTML (locked in a third-party widget) manual-guide
H3 · High-volume non-branded 'brazilian steakhouse' queries stuck at position 7-8 manual-guide
M1 · No cookie-consent banner while GTM + ActiveCampaign fire before consent manual-guide
M3 · Homepage weighs 8.08 MB — a mobile performance risk manual-guide
M4 · 33 render-blocking stylesheets + ~75 scripts from the page-builder stack manual-guide
M6 · Legacy /blog_old + many parallel URL patterns for identical content manual-guide
M7 · Google Business website link points to a UTM/localo-tagged URL manual-guide
M8 · Menu intent split across many competing URLs manual-guide
M14 · Security headers incomplete: no CSP, no X-Frame-Options, leaky Referrer-Policy manual-guide
M15 · 'Near me' local demand under-captured manual-guide
L2 · HTTP/1.1 and gzip-only (no HTTP/2 / Brotli) manual-guide
L3 · Keyword-stuffed legacy slugs (doorway pattern) manual-guide

How to apply

# For AUTO-SAFE / AUTO-REVIEW artifacts:
python execution/wp_push_safe.py [post_id] fixes/[category]/[file] --expected-slug [slug]

# For MANUAL guides:
# Read fixes/manual-guides/*.md and execute steps manually

🤖 Apply These Fixes with Claude Code

Most teams apply these with Claude Code. Hand Claude just the report MD seo-audit_adegagaucha.com_2026-06-03.md (plus the fixes/ folder for ready-to-apply artifacts) — not the whole folder — then paste the prompt below.

You are a senior SEO + GEO engineer. Task: APPLY a site SEO + GEO audit.

CONTEXT
- Read the report: seo-audit_adegagaucha.com_2026-06-03.md (Top-3 Priority, findings by severity, per-category deep
  dives, 90-Day Roadmap, Score Predictor).
- Ready-to-paste artifacts are in the fixes/ folder + the report's "Ready-to-paste
  artifacts" block (robots.txt AI policy, llms.txt draft, schema JSON-LD, meta).
- Site: adegagaucha.com (WordPress -> apply via WP MCP).

WORKFLOW
1. Read the report. Summarize the Top 3 Fixes + the AUTO-SAFE items. Change nothing yet.
2. Propose a plan: ship AUTO-SAFE artifacts first (robots.txt, llms.txt, headers), then
   AUTO-REVIEW (schema/meta) after I review each, then MANUAL guides. Wait for my OK.
3. When applying each fix:
   - Site files (robots.txt, llms.txt, .htaccess) -> show the diff, I deploy.
   - WP content/schema/meta -> edit in WP, create a REVISION/DRAFT, never publish directly.
4. After each fix, VERIFY with the exact signal the finding measured (curl/grep: header
   present, bot allowed, schema present, llms.txt 200...) -> report pass/fail with evidence.

RULES
- Don't fabricate or weaken a fix to make it "pass". Evidence-only.
- NEVER publish directly -> always draft/revision for my review.
- Keep a checklist: [finding id] -> applied / drafted / skipped + why.

Verification Pass — 10 Gates

9/9

Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).

GateCheckStatusDetail
Gate 1 Every finding ties to evidence (5 attrs) ✓ PASS All 25 findings have evidence + severity + effort + impact + confidence
Gate 2 Every chart hydrates from real source or shows disclosure ✓ PASS 7 chart slots: real data populates where agent JSON available; placeholder data eliminated v0.5.7
Gate 3 Every score documents calculation in appendix ✓ PASS Formula audit trail in phase6-scores.json
Gate 4 No fabricated data (confidence field required) ✓ PASS All 25 findings carry confidence field; chart values traced to agent JSON
Gate 5 Reproducibility log present ✓ PASS Appendix C populated with tools/versions/data sources
Gate 6 Severity not inflated (P0 ≤ P1 generally) ✓ PASS 0 P0 vs 5 P1 — distribution healthy
Gate 7 Low-confidence findings flagged inline ✓ PASS 6 medium-confidence + 0 low-confidence findings flagged in evidence cards
Gate 8 Reaudit matrix complete (if reaudit mode) — N/A N/A — first audit mode
Gate 9 Quick wins separated from roadmap ✓ PASS Quick Wins section distinct from 90-Day Roadmap
Gate 10 Composite scores match category breakdown ✓ PASS All 3 composites reverse-compute correctly (±0.5 tolerance)

Appendix

Appendix A — Score Calculation Methodology

Technical + CWV Composite

Technical*0.45 + Performance*0.35 + Sitemap*0.20

Components:
  technical: 74 × 0.45 = 33.30
  performance: 80 × 0.35 = 28.00
  sitemap: 55 × 0.20 = 11.00

Sum: 72.3
Rounded: 72

GEO + AEO Composite

Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12

Components:
  geo: 64 × 0.45 = 28.80
  schema: 58 × 0.30 = 17.40
  platform: 62 × 0.12 = 7.75
  brand: 58 × 0.12 = 7.25

Sum: 61.2
Rounded: 61

Overall Search-Readiness Composite

Technical*0.18 + Schema*0.13 + Sitemap*0.06 + Performance*0.13 + Geo*0.25 + Platform*0.06 + Brand*0.13 + Image*0.06 + Local*0.12

Components:
  technical: 74 × 0.16 = 11.89
  schema: 58 × 0.12 = 6.73
  sitemap: 55 × 0.05 = 2.95
  performance: 80 × 0.12 = 9.29
  geo: 64 × 0.22 = 14.29
  platform: 62 × 0.05 = 3.32
  brand: 58 × 0.12 = 6.73
  image: 68 × 0.05 = 3.64
  local: 70 × 0.11 = 7.50

Sum: 66.3
Rounded: 66

Appendix B — Reproducibility

  • Kit version: Claude-Growth v1.0.17
  • Audit timestamp: 2026-06-03T01:32:09.365224+00:00
  • Audit duration: 32m 34s
  • Mode: first
  • Tier detected: T1 (capability detection)
  • Coverage at this tier: ~95-100% — first-party GSC truth + external SERP/backlink data + (optional) field CWV.

Capability checklist

  • Google Search Console (GSC)
  • DataForSEO MCP
  • Firecrawl MCP
  • Chrome DevTools MCP (field CWV)
  • WordPress MCP

Missing a connector lowers coverage — see the setup guide: ongboit.com/claude-growth-setup-tool-api-mcp.

Data sources consulted

  • GSC API: ✓ (OAuth granted)
  • DataForSEO MCP: ✓
  • Firecrawl MCP: ✓ (N/A pages)
  • reportlab: ✓ (PDF generation)

Skill routing decisions

See skills/seo-pipeline/references/skill-routing.md for winner-per-pair analysis (4 duplicate skills compared head-to-head across 8-12 dimensions each).

Reference files

  • references/issue-catalog.md — 23 detection patterns
  • references/business-type-sampling.md — 5 types × 8 priority pages
  • references/composite-formula.md — 9 weights + 5-tier rubric
  • references/pdf-spec.md — Times New Roman + 7 charts
  • references/verification-checklist.md — 10 Phase 6.5 gates
  • references/skill-routing.md — winner-per-pair matrix
  • references/autofix-catalog.md — 23 autofix scenarios

Glossary

Plain-language definitions of every term (CWV, GEO/AEO, llms.txt, canonical, striking distance, crawl budget, E-E-A-T…) are in the How to Read This Report section near the top.

Appendix C — All Agent Findings (86 raw, 18 agents)

Every finding from every agent, ungrouped — nothing consolidated away. The prioritized Issues sections above are the deduped, board-grade view of these.

geo-accessibility — score 68/100 · 9 finding(s)
High GA1No <main> or <header> landmark on homepage
grep -oicE '<main[ >]' = 0; '<header[ >]' = 0 (home). Present: <nav> x4, <footer> x1. Menu page also 0 main / 0 header.
→ Screen-reader users cannot jump to primary content via landmark navigation (WCAG 1.3.1 / ARIA landmark best practice); machine document-outline / GEO content extraction is weaker without a <main> content boundary.
High GA2Duplicate H1 + nested full <html> document in Elementor HTML widget
grep '<h1[ >]' = 2. Byte offset of <html>: 16 and 210452. Nested doc at line 3101: '<!DOCTYPE html><html lang="en"><head>...<title>Adega Gaucha | FAQs</title>'. Second H1 belongs to this nested document.
→ Two H1s confuse screen-reader heading navigation and dilute the topical H1 signal for SEO; a nested <html>/<head>/<title> inside <body> is invalid HTML and the embedded lang="en" conflicts with the page lang="en-US", harming assistive-tech language detection and crawler parsing.
High GA3Form inputs lack associated <label> (placeholder-only)
grep '<label' = 0 vs '<input' = 3. Inputs: subscribe-form full_name (placeholder 'First & Last Name', required), email (placeholder 'Email Address', required), search field (placeholder 'enter search term'). No for/id or aria-label on the inputs themselves.
→ Placeholder text is not a programmatic label; it disappears on input and is unreliable for screen readers (WCAG 1.3.1 Info & Relationships, 3.3.2 Labels or Instructions, 4.1.2 Name/Role/Value). Affects the birthday/email subscribe form and site search.
Medium GA4No skip-to-content link
grep for 'skip-to-content|skip-link|#content...skip' = 0 matches on homepage.
→ Keyboard and screen-reader users must tab through the full nav (4 <nav> blocks) on every page load to reach content (WCAG 2.4.1 Bypass Blocks).
Medium GA5Skipped heading levels (h2 -> h5, no h3/h4)
Heading sequence on home: h1 h2 h3 h3 h3 h4 h5 h2 h5 h2 h5 h5 h5 h5 h2 h2 h3 h2 h3 h5 h2 h5 h2 h2 h2 h1 h3. Multiple h2->h5 jumps; h6 count = 0.
→ Non-sequential headings break the logical document outline for screen-reader heading navigation (WCAG 1.3.1) and weaken content-structure signals used by AI extractors/GEO.
Low GA6Primary nav lacks aria-label; otherwise good ARIA coverage
grep '<nav class="adega-menu">' has no aria-label; footer navs (ag-footer-nav, ag-footer-legal) also unlabeled. Positive: 12 aria-label values on social/CTA (Facebook, Instagram, 'Birthday gift — claim yours', etc.) and 7 accordion buttons expose aria-expanded.
→ Multiple <nav> elements without distinct aria-labels are announced identically ('navigation') to screen readers, reducing wayfinding (WCAG 1.3.1 / ARIA practice). Low severity since labels exist elsewhere.
Low GA7Image alt coverage acceptable; 9 decorative empty-alt verified, 0 missing
Home: 43 <img> total, 34 with non-empty alt, 9 with alt="" (valid decorative), 0 with no alt attribute. 20.9% lack a descriptive alt but all are explicitly marked decorative. Menu page: 6/6 images have non-empty alt (100%).
→ Minor. Empty alt on truly decorative images is WCAG-correct. Risk only if any of the 9 decorative-marked images actually convey content (e.g., logo, dish photos) — that would be a 1.1.1 failure.
Low GA8Image-heavy hero — text-in-image risk unverifiable statically
Homepage 300KB, 16 lazy images + 4 fetchpriority=high (per shared context); hero H1 'The Modern Brazilian Steakhouse' is real text (good), but cannot confirm whether hero/section background images embed marketing copy without rendering.
→ If promotional text (hours, offers, location names) is baked into hero/section images, it is invisible to screen readers and to AI/GEO text extraction (WCAG 1.4.5 Images of Text).
Low GA9Accessibility statement page present (positive signal)
grep href=".*accessibilit.*" -> 'https://adegagaucha.com/accessibility/' linked from footer. Note (cross-check): this page is Disallowed in robots.txt per shared context.
→ Positive for ADA/WCAG conformance posture and user trust. The robots.txt block prevents the statement from being indexed/cited by search and AI — minor GEO loss but not an accessibility defect.
geo-brand-mentions — score 58/100 · 2 finding(s)
High GB1sameAs lists only Facebook - entity graph too thin for AI authority
@graph Organization sameAs=['https://www.facebook.com/adega.gaucha'] only. No Instagram, TripAdvisor, Yelp, OpenTable, Google Business, Wikidata, LinkedIn.
→ Stronger entity disambiguation -> better AI citations + knowledge panel
Medium GB2Award/reputation signals exist off-site but unconsolidated
Firecrawl page copy: 'Proud Winners of OpenTable Diners Choice 2024, TripAdvisor Travelers Choice 2023/2024/2025, and Best of Florida 2023'; hosted Yelp Elite event.
→ Surfacing awards in schema/About strengthens E-E-A-T + AI trust
geo-compliance — score 58/100 · 6 finding(s)
High GCO1No cookie consent banner / CMP present despite active trackers
grep for cookiebot|onetrust|complianz|cookie-law-info|borlabs|iubenda|termly|cookie-notice|wp-gdpr|cookieyes|moove_gdpr on homepage returned ZERO matches, while GTM-5WVCNNKW (gtm.js) and activecampaign site_tracking.js both load on page load.
→ CCPA (FL business serving CA visitors) and GDPR (Weglot multilingual implies EU/intl visitors) both expect notice + opt-out/consent before non-essential tracking. Trackers fire pre-consent. Legal/trust exposure; California 'Do Not Sell/Share' opt-out not offered.
Medium GCO2Privacy policy blocked in robots.txt with conflicting index meta
robots.txt: 'Disallow: /privacy-policy/'. But page HTML meta: robots content="follow, index, max-snippet:-1...". Page returns HTTP 200 and is user-accessible.
→ A privacy policy SHOULD be openly indexable/accessible for compliance and trust signals; blocking it in robots.txt while the page itself says 'index' is a contradictory signal and weakens transparency. Crawlers cannot read it to corroborate trust/E-E-A-T.
Low GCO3Terms of use double-blocked (robots.txt Disallow + noindex meta)
robots.txt: 'Disallow: /terms-of-use/'. Page HTML meta: robots content="follow, noindex". Page returns HTTP 200.
→ Terms are accessible to users (200) but deliberately kept out of the index. Lower compliance impact than privacy policy, but still a transparency/trust signal best left accessible to crawlers.
High GCO4Privacy policy lacks GDPR / CCPA / 'Do Not Sell' language
WebFetch of /privacy-policy/: terms PRESENT = 'cookies, pixel tags, and other online tracking technologies', SMS opt-out (reply STOP), contact it@adegagaucha.com. Terms ABSENT = GDPR, CCPA, California Consumer Privacy Act, 'Do Not Sell', Google Analytics, data rights.
→ Policy admits tracking-tech use but provides no CCPA disclosures (right to know/delete/opt-out of sale-share) and no GDPR lawful-basis/data-subject-rights section. For a FL business with multilingual (intl) reach, both regimes are plausibly in scope.
Medium GCO5Data-collection forms (newsletter / birthday) without visible consent linkage
Homepage grep: type="email" input + ActiveCampaign plugin present; robots.txt also blocks /birthdayform/. ActiveCampaign site_tracking.js loads. No CMP/consent checkbox detected in homepage grep.
→ Email + birthday (potentially DOB) collection via ActiveCampaign with site-wide tracking but no detected consent checkbox or privacy-policy link at point of collection raises CCPA/GDPR consent-and-notice concerns, especially for the birthday form (could imply age/minor data).
Low GCO6HTTPS + HSTS confirmed; no CSP header
Response headers: 'Strict-Transport-Security: max-age=31536000' and 'X-Content-Type-Options: nosniff' present. No Content-Security-Policy and no X-Frame-Options header observed.
→ Transport security is solid (HSTS 1yr). Missing CSP/X-Frame-Options is a defense-in-depth hardening gap, not a privacy-law violation; low priority given third-party tag footprint is small (GTM + AC).
geo-crawlers — score 92/100 · 3 finding(s)
Low GC1All major AI/LLM crawlers are allowed via permissive wildcard (desirable for AI citations)
robots.txt contains exactly one rule group: 'User-agent: *' with no AI-specific Disallow. Grep for gptbot|oai|chatgpt|claude|anthropic|perplexity|google-extended|ccbot|amazonbot|applebot|bytespider|meta-external|duckassist returned NO_AI_BOT_RULES_FOUND. User-agent block count = 1.
→ Positive baseline: GPTBot, ClaudeBot, PerplexityBot, Google-Extended, etc. can all crawl menu/location/about content, enabling AI-engine citations and 'best Brazilian steakhouse near me' style AI answers. No action required to maintain access.
Medium GC2Location & review pages Disallowed for ALL agents, including AI crawlers
robots.txt lines: 'Disallow: /adega-gaucha-locations/', 'Disallow: /review-us/', 'Disallow: /review-us-kissimmee/', 'Disallow: /links/', 'Disallow: /links-kissimmee/', 'Disallow: /links-orlando/'. These are blanket Disallows under 'User-agent: *', so they apply to GPTBot/ClaudeBot/PerplexityBot too.
→ High-intent local content (locations, NAP, reservation/review hubs) is invisible to AI crawlers. For a multi-location steakhouse, the locations directory is exactly what an AI assistant needs to answer 'where is Adega Gaucha' or 'Adega Gaucha Kissimmee hours'. Blocking it can suppress AI-surfaced local discovery.
Low GC3No X-Robots-Tag header on homepage (no header-level AI suppression)
curl -I https://adegagaucha.com/ returned HTTP/1.1 200 OK with headers Strict-Transport-Security, X-Content-Type-Options, X-XSS-Protection, Referrer-Policy, Permissions-Policy, Cache-Control, Vary, Content-Type. No 'X-Robots-Tag' present, therefore no 'noai', 'noimageai', or 'noindex' directive at the header level.
→ Confirms there is no second, hidden layer blocking AI indexing. Homepage is fully crawlable and AI-indexable at both robots.txt and HTTP-header levels.
geo-llmstxt — score 30/100 · 1 finding(s)
Medium GL1Invalid llms.txt (serves homepage HTML / soft-404)
curl -sL https://adegagaucha.com/llms.txt -> '<!DOCTYPE html><html lang=en-US>...<title>Adega Gaucha...' (Rank Math homepage markup), not text/markdown.
→ A real llms.txt guides AI crawlers to menu, locations, reservations, about
geo-platform-optimizer — score 62/100 · 2 finding(s)
High GP1Non-crawlable menu blocks AI dish/price citations
Menu items/prices absent from HTML (getsauce.com widget).
→ Unlocks menu/price AI answers
Medium GP2llms.txt invalid (serves homepage HTML)
curl https://adegagaucha.com/llms.txt returns full WordPress homepage HTML, not llms.txt markdown.
→ Clean AI site map of key pages
geo-schema — score 58/100 · 10 finding(s)
Critical GS1Duplicate, conflicting Restaurant entities in same @graph (two @ids, contradictory priceRange/telephone/country)
Node A @id 'https://adegagaucha.com/#organization' @type [Restaurant,Organization]: priceRange '50-100', telephone '+14072504455', addressCountry 'USA'. Node B @id 'https://adegagaucha.com/#schema-130589' @type Restaurant: priceRange '80-150', telephone '14072504455', addressCountry 'United States'. Both describe the same Orlando business; no sameAs/identity link between them.
→ Two competing Restaurant nodes confuse Google entity resolution and AI knowledge-graph builders; conflicting priceRange and telephone create NAP inconsistency that can suppress rich results and erode local trust signals.
High GS2sameAs entity graph is critically thin — Facebook only
#organization node: "sameAs": [ "https://www.facebook.com/adega.gaucha" ]. No Instagram, Google Business Profile, TripAdvisor, Yelp, Wikidata, Wikipedia, LinkedIn, OpenTable, or YouTube. sameAs absent entirely from the #schema-130589 Restaurant node.
→ sameAs is the single highest-leverage GEO property for cross-platform entity resolution. With only Facebook, AI models (ChatGPT, Perplexity, Gemini, AI Overviews) cannot confidently link Adega Gaucha across platforms or verify it as a recognized entity, weakening citation likelihood for 'Brazilian steakhouse Orlando' style prompts.
High GS3Only Orlando represented in schema; Kissimmee + Deerfield Beach have no LocalBusiness/Restaurant node
All geo/address nodes point to Orlando: Place node streetAddress '8204 Crystal Clear Ln', geo 28.448804,-81.400653. The #schema-130589 description text reads 'in Orlando, Kissimmee, and Deerfield Beach' but no PostalAddress/GeoCoordinates/Restaurant node exists for Kissimmee or Deerfield Beach.
→ Two of three physical locations are invisible to local pack, Maps, and AI 'near me' queries. For a 3-location chain this is a major local-completeness gap directly costing discoverability in Kissimmee and Deerfield Beach markets.
High GS4AggregateRating ABSENT from entire homepage graph
grep 'AggregateRating|ratingValue|reviewCount|ratingCount' across rank-math-schema JSON = 0 matches in all 6 nodes. (SHARED CONTEXT listed AggregateRating among homepage @types; not present in actual markup — recorded as ABSENT per evidence rule.)
→ No star-rating rich result eligibility and no review-strength signal for AI models. Review stars are a high-CTR SERP feature for restaurants; their absence forfeits a strong local trust signal.
Medium GS5servesCuisine polluted with non-cuisine values; both servesCuisine and hasMenu present only on the orphan Restaurant node
#schema-130589 servesCuisine array includes valid cuisines ('Brazilian Steakhouse','Churrascaria','South American Cuisine') BUT also non-cuisine entries: 'Reservations Accepted','Online Ordering Available','Happy Hour','Family Friendly Dining','Full Bar','Group Dining'. hasMenu 'https://adegagaucha.com/menu/' present here only. The #organization (combined) node has NEITHER servesCuisine NOR hasMenu.
→ Misusing servesCuisine as a feature dump dilutes the cuisine signal and is invalid per Schema.org (servesCuisine = cuisine type only). After GS1 merge, the canonical node would lose hasMenu/servesCuisine unless migrated.
Medium GS6No Person/author (Fabiano Borsato) schema despite twitter author meta
HTML head: <meta name="twitter:label1" content="Written by"> and <meta name="twitter:data1" content="Fabiano Borsato">. No Person node, no 'author' or 'founder' property anywhere in the @graph; 'Borsato' appears only in the twitter meta, not in JSON-LD.
→ Author/founder identity is an E-E-A-T and entity signal AI models use to attribute expertise and ground the brand to a real person. The signal exists as Twitter Card metadata but is not machine-linked in structured data.
Low GS7No speakable property anywhere — page not marked up for voice/AI assistant reading
grep 'speakable' across rank-math-schema JSON = 0 matches on homepage. Absent on WebPage and Restaurant nodes.
→ speakable explicitly flags voice/AI-readable sections (hours, location, cuisine, reservations) — high-value for 'hey Google, what time does Adega Gaucha open' style assistant queries. Underused property; low effort, direct GEO/voice signal.
Medium GS8openingHours format issues and dual hours representations across the two nodes
#organization uses legacy openingHours strings with full day NAMES and 12h-style ranges: 'Monday 10:30-09:00','Tuesday,Wednesday,Thursday,Friday,Saturday 11:30-10:00','Sunday 11:00-09:00' (note 'Monday 10:30-09:00' implies close BEFORE open / overnight ambiguity). #schema-130589 uses a single OpeningHoursSpecification with opens '11:30 AM'/closes '10:00 PM' for ALL 7 days — contradicting the per-day hours in the other node.
→ openingHours strings should use ISO day codes (Mo,Tu) and 24h HH:MM; '10:30-09:00' is parse-ambiguous. The two nodes disagree on daily hours, producing conflicting hours signals for Google and assistants.
Low GS9hasMap uses HTML-entity-encoded ampersand (&amp;) inside JSON-LD URL
Place node: "hasMap": "https://www.google.com/maps/search/?api=1&amp;query=28.448804,-81.400653,10" — contains '&amp;' rather than a literal '&'.
→ Inside JSON-LD a URL value should contain a literal '&'; the '&amp;' is HTML escaping leaking into JSON and yields a malformed query param when consumed programmatically. Minor but a validity defect.
Low GS10addressCountry uses non-canonical values ('USA' / 'United States') instead of ISO 3166 'US'
Place + #organization nodes: addressCountry 'USA'. #schema-130589 node: addressCountry 'United States'. Also #schema-130589 streetAddress duplicates city/state/zip into one field: '8204 Crystal Clear Ln #1700, Orlando, FL 32809'.
→ Google prefers ISO 3166-1 alpha-2 country codes; mixed free-text country strings and overstuffed streetAddress reduce parse reliability for Maps/local.
geo-technical — score 74/100 · 7 finding(s)
Low GT1Fully server-side rendered — AI crawlers see all content (PASS)
curl homepage = 300,787 bytes HTML; grep <p = 10, <h1/<h2 = 12; grep 'div id="root|app"' = 0 (no SPA shell); meta robots content="follow, index, max-snippet:-1, max-image-preview:large"; canonical href="https://adegagaucha.com/" (self-referencing)
→ Highest-weight GEO factor passes: GPTBot/ClaudeBot/PerplexityBot (no JS execution) receive full content in initial HTML. No remediation needed; maintain SSR — do not migrate to a client-rendered theme.
Medium GT2No Content-Security-Policy and no X-Frame-Options header
curl -sI https://adegagaucha.com/ | grep -iE 'Content-Security|X-Frame' returned EMPTY (both ABSENT). Present headers: Strict-Transport-Security: max-age=31536000, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Permissions-Policy: geolocation=(), microphone=(), camera=()
→ Missing CSP = elevated XSS exposure; missing X-Frame-Options = clickjacking exposure. Security headers are a trust signal but have minimal direct ranking/GEO weight, hence P2 not P1.
Low GT3Weak Referrer-Policy leaks full URL on cross-origin HTTP
curl -sI homepage: 'Referrer-Policy: no-referrer-when-downgrade' (sends full referrer to any HTTPS destination; only withholds on HTTPS->HTTP downgrade)
→ Minor privacy/data-leakage; no SEO/GEO ranking impact. Low priority.
Low GT4Stale robots.txt block of /adega-gaucha-locations/ (dead redirect, not live page)
robots.txt: 'Disallow: /adega-gaucha-locations/'. curl -sI /adega-gaucha-locations/ = HTTP/1.1 301 -> Location: /locations/. Live page curl -sI /locations/ = HTTP/1.1 200, NOT in robots Disallow (grep 'Disallow: /locations' = empty). Sitemap contains /locations/orlando/, /locations/kissimmee/, /locations/deerfieldbeach/ — all crawlable.
→ NOT harmful to local-SEO indexation: the three live location pages are 200, unblocked, and in-sitemap. The block targets an old redirecting slug only. Cleanup avoids future confusion and prevents accidental crawl-budget signals on a redirect.
Medium GT533 render-blocking stylesheets + 75 script tags from page-builder stack
grep on 300KB homepage HTML: stylesheet links = 33; <script tags total = 75; external src scripts = 33 of which only 2 lack defer/async (31/33 deferred — good); font preloads (rel=preload as=font) = 0; preconnect/dns-prefetch = 7. Stack: Elementor Pro + ElementsKit + GutenKit + Weglot + WPVR + WP Rocket.
→ Render-blocking CSS is the top LCP risk on this page (static signal only — live CWV measured by separate agent). Builder bloat inflates critical request chain. Confidence on user-facing CWV impact is MEDIUM without field data per accuracy rule 3.
Low GT6Brotli not served (gzip-only) and HTTP/1.1 despite HTTP/2 capability
curl --compressed -D - => Content-Encoding: gzip (server falls back to gzip even when 'br' requested in Accept-Encoding). Response line: HTTP/1.1 200 OK with header 'Upgrade: h2,h2c' (server advertises HTTP/2 but did not negotiate it on request). Vary: Accept-Encoding present.
→ Brotli typically yields ~15-20% smaller text payloads vs gzip; HTTP/2 multiplexing helps the long request chain (33 CSS + 33 JS). Both improve transfer speed for this asset-heavy page. No correctness/indexation impact.
Low GT7Indexability and canonical configuration are correct (PASS)
meta robots = index,follow; canonical = self-referencing https://adegagaucha.com/; http://adegagaucha.com/ -> 301 https://adegagaucha.com/ (HTTPS enforced); HSTS max-age=31536000 present; hreflang alternate tags = 3 (en, pt, es via Weglot). X-Robots-Tag: noindex appears only on sitemap_index.xml (standard for XML sitemaps, not a content page).
→ Core indexability signals are healthy for both Google and AI crawlers. Multilingual hreflang correctly declared.
seo-audit — score 78/100 · 8 finding(s)
High SA1Homepage has 2 <h1> tags (duplicate H1)
grep '<h1' tmp/home.html -> 2 matches at byte 112828 and 260310. H1#1=[The Modern<br>Brazilian Steakhouse]; H1#2=[🌷 This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience. The best gift isn’t wrapped, it’s grilled!] (class='elementor-heading-title')
→ Splits the page's primary topical/keyword signal between the brand-defining hero and a transient promo headline, diluting relevance for 'Brazilian steakhouse Florida'. A single H1 is a long-standing on-page best practice.
Medium SA2Stale seasonal promo as homepage H1 (Mother's Day, on 2026-06-03)
Homepage H1#2 text='This Mother’s Day, surprise her with Adega Gaucha’s legendary Churrasco Experience'. Mother's Day 2026 was 2026-05-10; audit date 2026-06-03. og:updated_time='2026-05-28T09:48:33-04:00'.
→ Outdated seasonal content in the most prominent heading position signals poor freshness to users and crawlers and wastes prime above-the-fold real estate ~3 weeks after the event passed.
Medium SA3~24 redirecting (301) legacy flat URLs listed in page-sitemap.xml
page-sitemap.xml lists legacy URLs e.g. /wine-list/, /orlando/, /kissimmee/, /brunch-menu/, /lunch-menu/, /bar-menu/, /desserts-menu/, /buffet/, /churrascotogo/. curl -I /wine-list/ -> 'HTTP/1.1 301 Moved Permanently, Location: /menu/wine-list/'; /orlando/ -> 301 -> /locations/orlando/. ~24 such legacy entries found alongside their clean canonical equivalents.
→ Sitemaps should contain only canonical 200-status URLs. Listing 301-redirecting URLs wastes crawl budget, sends Google mixed signals about preferred URLs, and can slow consolidation of the clean URL structure.
Medium SA4/menu title tag exceeds SERP display width (73 chars)
tmp/menu.html <title>='Our Menu – Brazilian Steakhouse in Orlando, Kissimmee and Deerfield Beach' = 73 chars (>~60 char / ~580px desktop truncation threshold).
→ Title likely truncated in Google results, hiding 'Deerfield Beach' and weakening CTR for that location's queries.
Medium SA5No BreadcrumbList schema or on-page breadcrumb navigation
grep -i 'BreadcrumbList' tmp/home.html -> 0; grep -i 'breadcrumb' tmp/home.html -> 0. Schema types present: Restaurant x2, WebSite, WebPage, AggregateRating, OpeningHoursSpecification, PostalAddress x4, GeoCoordinates x2, Place, SearchAction — no BreadcrumbList.
→ Misses breadcrumb rich-result eligibility in SERPs and the navigational/hierarchy clarity that helps Google understand the deep /locations/* and /menu/* structure.
Low SA6hreflang set has no x-default
tmp/home.html: <link rel='alternate' href='https://adegagaucha.com/' hreflang='en'/>, hreflang='pt' (/pt/), hreflang='es' (/es/). grep -i 'x-default' -> 0.
→ Without x-default, Google has no explicit fallback for locales not in the en/pt/es set; low impact given en is the de-facto default, but it is an incomplete hreflang cluster.
Low SA7'todo' upstream flag is a benign Spanish CSS comment, NOT an English placeholder
Only match for 'todo' in tmp/home.html: 'width: 100%; /* Ocupa todo el ancho del contenedor */' ('takes up the full width of the container'). No standalone 'TODO' placeholder string exists. grep '\btodo\b' -> 1 (this comment).
→ No SEO impact — inline CSS comment, not visible content. Documented here to correct the upstream regex false-positive so it is not actioned as a content defect.
Low SA8og:image:alt is generic ('steakhouse') and og:image is logo, not a dish/venue photo
tmp/home.html: og:image='.../Adega_Gaucha_Logo_Avatar-1024x1024.png', og:image:alt='steakhouse'. twitter:card='summary_large_image' paired with a square 800x800 logo.
→ Weak social/link-preview appeal; a square logo on a summary_large_image card and a one-word alt under-sell click-throughs from shared links.
seo-backlinks — score N/A · 1 finding(s)
Medium SB1Authority/citation footprint appears thin (indirect signal)
On-site sameAs lists only Facebook; off-site awards exist but unconsolidated. Direct backlink metrics UNAVAILABLE.
→ Local link building likely needed to lift non-branded heads (seo-google SG1)
seo-google — score 76/100 · 4 finding(s)
High SG1High-volume non-branded 'brazilian steakhouse' cluster stuck at position 7-8
GSC 90d: 'brazilian steakhouse' 21,385 imp @ pos 7.8 / 1.8% CTR; 'brazilian steakhouse orlando' 16,720 imp @ pos 6.9; 'brazilian steakhouse near me' 8,223 imp @ pos 7.8. 167 queries in pos 5-20.
→ Moving the 3 non-branded heads from pos ~7 to pos 3 ~= +3-5k incremental clicks/90d
High SG2/menu/ earns 111k impressions at pos 6.7 but content is non-crawlable
GSC: /menu/ 1,366 clk / 111,037 imp / pos 6.7 (1.2% CTR); menu dish/price text not in HTML (getsauce.com widget).
→ Crawlable menu could lift CTR and capture dish-level + near-me queries
Medium SG3GBP main link lands on UTM-tagged URL
GSC top pages: /deerfieldbeach?utm_source=google_profile&utm_campaign=localo&utm_medium=mainlink = 2,952 clicks (indexed ranking URL with tracking params).
→ Param URL competes with clean canonical; dilutes signals
Medium SG4Menu URL fragmentation / cannibalization
GSC: /menu/, /adega-gaucha-menus/ (66,280 imp pos 3.3), /menu-adega-gaucha-brazilian-steakhouse-orlando/, /menu/dinner/, /menu/lunch/ all rank for menu intent.
→ Consolidating equity to one menu hub improves rank stability
seo-images — score 68/100 · 3 finding(s)
Medium SI1No AVIF + no responsive <picture>/<source>; 8 MB image-driven page weight
grep homepage: 183 .webp, 0 .avif, 0 <picture>, 0 <source type=image/(webp|avif)>; Lighthouse total-byte-weight 8.08 MB.
→ AVIF + responsive srcset cuts mobile bytes substantially (81% mobile)
Medium SI2og:image is an 800x800 logo, not appetizing food
og:image = .../Adega_Gaucha_Logo_Avatar-1024x1024.png; og:image:alt='steakhouse'.
→ Better social/AI link previews -> higher share CTR
Low SI316 images lazy-loaded; verify hero not lazy
grep: loading=lazy x16, fetchpriority=high x4 (seo-visual flagged fetchpriority on lazy SVG placeholders).
→ Protects LCP
seo-local — score 70/100 · 3 finding(s)
High SL1Only Orlando location in homepage schema - Kissimmee & Deerfield Beach absent
rank-math @graph PostalAddress = 8204 Crystal Clear Ln, Orlando only. Kissimmee NAP exists (ranks #1 for '7804 w irlo bronson memorial hwy kissimmee fl 34747') but no LocalBusiness entity.
→ Per-location entities strengthen each city's local + AI presence
Medium SL2GBP website link uses UTM/localo params
GSC: /deerfieldbeach?utm_source=google_profile&utm_campaign=localo&utm_medium=mainlink ranks with 2,952 clicks.
→ Cleaner canonical + NAP consistency
Medium SL3Non-branded 'near me' local demand under-captured
GSC: 'brazilian restaurant near me' pos 10.2 (6,089 imp), 'steakhouse near me' pos 9.3, 'churrasco near me' pos 8.6.
→ Local-pack + organic near-me upside
seo-maps — score N/A · 1 finding(s)
Medium SM1'Near me' local-pack headroom (proxy)
GSC: 'brazilian restaurant near me' pos 10.2, 'steak near me' pos 10.6, 'churrasco near me' pos 8.6.
→ Map-pack inclusion drives high-intent local visits
seo-page — score 71/100 · 9 finding(s)
Critical SP1Menu items, dishes & prices are NOT in crawlable HTML — trapped behind external getsauce.com widget
grep of /menu.html and /menu/orlando/ for Picanha, Filet Mignon, Feijoada, Caipirinha, Salad Bar, Pao de Queijo, Sausage, Beef, Pork = 0 each; 'Picanha:3' on Orlando page is only inside img alt='...Picanha Churrasco'; '$[0-9]' price patterns = 0; menu links resolve to https://www.getsauce.com/order/adega-gaucha/menu (external). Orlando page H2s = Lunch/Brunch/Dinner with no item text below.
→ Local long-tail dish/price queries ('picanha orlando', 'brazilian steakhouse menu prices kissimmee') and AI assistants (ChatGPT/Perplexity/AI Overviews) cannot read or cite the menu. Largest organic + AI-visibility gap on the site.
High SP2No Menu / MenuItem / MenuSection schema on any menu page
grep '"@type":"(Menu|MenuItem|MenuSection)"' = 0 on /menu.html and /menu/orlando/. Menu pages carry only Restaurant/Place/Breadcrumb/WebPage schema.
→ Misses Restaurant menu rich results and structured menu data that AI engines use to answer 'what's on the menu / what does X cost' queries.
High SP3/menu page is thin: hub-only content, no item-level depth vs informational+transactional intent
/menu H1='Our Menus' (1), H2 count=3 (Each Location Its Own Culinary Experience / ENJOY WITH US / HOST YOUR EVENTS), H3 count=3 (Orlando/Kissimmee/Deerfield Beach). churrascaria=0, rodizio=0 on /menu. Body is location routers + events CTA, no dishes.
→ Page ranks weakly for 'brazilian steakhouse menu orlando' class queries because it offers no substantive menu answer; intent (see the menu) is unmet on-page.
High SP4FAQPage schema ABSENT despite visible homepage FAQ section
Homepage H2 'FAQs About Dining At Adega Gaucha' present in heading list; grep '"@type":"(FAQPage|Question|Answer)"' on /home.html = 0; no itemprop acceptedAnswer markup found.
→ Forgoes FAQ rich-result eligibility and easy AI-answer extraction for high-intent local dining questions already written on the page.
Medium SP5Two H1 tags on homepage (second is an empty Elementor heading)
grep '<h1' on /home.html returns 2: '<h1>' -> 'The Modern Brazilian Steakhouse' (valid) and '<h1 class="elementor-heading-title elementor-size-default">' which strips to empty text.
→ Diluted/ambiguous H1 signal; an empty H1 is a wasted primary heading and minor accessibility issue.
Medium SP6Canonical/hreflang inconsistency on menu URL set; no x-default
/menu and /menu-adega-gaucha-brazilian-steakhouse-orlando/ return byte-identical 189449-byte pages; both canonical to https://adegagaucha.com/menu/ (so the brief's URL is non-canonical but correctly points to /menu/). hreflang present en/pt/es on both pages but grep 'x-default' = 0 everywhere.
→ Multiple live URLs for the same page risk minor dilution if both are linked/indexed; missing x-default weakens international/Weglot signal for unmatched locales.
Medium SP7Homepage hero/key images have empty alt attributes
/home.html 23 <img>; alt='' count = 5 (includes leading hero images). Good alts exist on others ('Adega Gaucha Brazilian Steakhouse Picanha Churrasco', 'Open Table Diners Choice award 2023 2024 2025', 'Dinner').
→ Missed image-SEO + accessibility on above-fold hero; lost opportunity for location/keyword-bearing alt text.
Low SP8Menu-page images use weak/duplicated generic alt text
/menu.html img alts: 'Adega Gaucha' repeated x4, and a malformed 'Adega_Gaucha_Group Dinin Events Orlando Host Steakhouse' (typo 'Dinin', underscores).
→ Low descriptive value and a visible typo in alt text; minor image-SEO/accessibility loss.
Low SP9Above-fold CTA coverage is strong and clear (no defect) — reservations + order present
/home.html CTA counts: reservations 12 + Reserve 1; Order Now/ORDER NOW 6; external links to opentable.com (3), getsauce.com (9), toasttab.com (1). External links correctly carry rel='nofollow noopener'/'noopener' (15 nofollow noopener, 7 noopener).
→ Positive: clear reservation + order conversion paths; external rel attributes are correctly set. Documented as a strength, not a fix.
seo-performance — score 80/100 · 3 finding(s)
Medium SPF1Total page weight 8.08 MB - mobile performance risk
Lighthouse total-byte-weight = 8,078,017 bytes on homepage. 81% of GSC traffic is mobile.
→ Better mobile LCP on 4G; protects 18k mobile clicks/90d
Medium SPF233 render-blocking stylesheets + ~75 scripts from page-builder stack
geo-technical grep: 33 render-blocking stylesheets + 75 script tags (Elementor/ElementsKit/GutenKit/WPVR).
→ Reduces main-thread + bytes; bloats mobile
Low SPF3HTTP/1.1 + gzip-only (no brotli)
curl -I shows HTTP/1.1; Content-Encoding: gzip (no br).
→ Marginal transfer savings + multiplexing
seo-sitemap — score 55/100 · 4 finding(s)
High SS1Indexed staging / duplicate subdomains
Firecrawl found new.adegagaucha.com (HTTP 200, own robots, duplicates /blog /menu /rewards /our-team /lunch-menu /bar-menu /faqs), onlinemenu.adegagaucha.com (QuickQR menu), crm.adegagaucha.com (login indexed), kissimmee.adegagaucha.com/fr.
→ Eliminates duplicate-content dilution + wasted crawl budget
Medium SS2Legacy /blog_old still live and indexed
Firecrawl: https://adegagaucha.com/blog_old title 'Blog & OLD'.
→ Removes duplicate blog surface
Medium SS3Parallel URL patterns for identical content (cannibalization)
Firecrawl: /kissimmee vs /locations/kissimmee; /lunch-menu vs /menu/lunch; /bar-menu vs /menu/bar; /birthday vs /offers/birthday; /brunch-menu vs /menu/brunch. ~24 301-redirecting URLs still in page-sitemap.xml.
→ Consolidates ranking signals; cleaner crawl
Low SS4Keyword-stuffed legacy slugs (doorway pattern)
Firecrawl: /dinner-menu-food-place-near-me, /cocktails-menu-restaurants-near-me.
→ Quality signal cleanup
seo-visual — score 52/100 · 10 finding(s)
High SV1Duplicate H1 — promotional popup H1 competes with brand H1
DOM query via Playwright returns 2 H1 elements: (1) 'THE MODERN BRAZILIAN STEAKHOUSE' at rect.top=213px (hero section); (2) 'This Mother's Day, surprise her with Adega Gaucha's legendary Churrasco Experience...' at rect.top=0 — rendered as the topmost element, likely a sticky promo bar/popup. HTML source confirms both <h1> tags. The promo H1 contains emoji (🌷) and seasonal copy, making it unstable for keyword targeting.
→ Google's Googlebot reads the promo H1 first in DOM order and may weight it as the page topic signal, diluting the brand/keyword H1. Seasonal H1 creates repeated crawl-time topic drift. Known 2-H1 issue confirmed.
Medium SV2fetchpriority=high conflict with lazy-load plugin on award badge image
One <img> tag carries both fetchpriority='high' and a lazy-load plugin data-lazy-srcset pattern. At Playwright networkidle, src resolves to an SVG placeholder (data:image/svg+xml...) with natural_w=150, natural_h=150 — actual image not fetched. The fetchpriority=high signal is wasted on a placeholder; the real image (BOFL-Seal-2025) loads late. A second fetchpriority=high img also resolves to SVG placeholder at load time (src=data:image/svg+xml, in_viewport=false at y=1065px).
→ Browser priority scheduler elevates an SVG placeholder to high fetch priority, potentially delaying true LCP candidate. Real award badge images (trust signals) load late, harming perceived load quality and potential LCP score.
Medium SV3Hero LCP is a video poster (JPEG) preloaded twice — redundant preload tag
HTML source contains two <link rel='preload' as='image' href='Capture.jpg'> tags for the same URL: one with fetchpriority='high' (WP Rocket), one without. The hero element is a <video class='ag-hero__video'> with poster='Capture.jpg' — making Capture.jpg the probable LCP candidate. The <video> tag has no preload attribute (preload defaults to 'metadata' or 'none' per browser). MP4 source is 2.5 MB on new.adegagaucha.com subdomain (cross-origin connection overhead). Poster is JPEG, not WebP.
→ Duplicate preload wastes one browser preload slot and may cause a double-fetch depending on browser cache keying. No video preload means first-frame display depends on video stream buffering. Cross-origin subdomain adds DNS/TLS round-trip for video. JPEG poster is larger than equivalent WebP.
Medium SV44 render-blocking Google Fonts stylesheet requests (2 duplicate bundles)
Source contains 9 Google Fonts <link> tags total; 4 are rel='stylesheet' (render-blocking). Two distinct font bundles are each requested twice: Bundle A (Inter/Oswald/Jost/Playfair Display) appears as both a WP Rocket preload and a direct stylesheet; Bundle B (Montserrat/Varela Round/Hind Siliguri/Dosis/Roboto + others) same pattern. Preconnects to fonts.gstatic.com appear 3 times in source (two preconnect + one dns-prefetch duplication).
→ Each render-blocking stylesheet adds a network round-trip on the critical path. Duplicate requests mean the browser may issue redundant fetches before cache kicks in. Loading 10+ font families across 2 bundles increases FOUT/FOIT window — visible text flash during hero load. This directly affects LCP timing.
Medium SV5Mobile sticky CTA 'BOOK NOW' renders at 0x0 dimensions
Playwright mobile (375x812) DOM query: CTA text 'book your table now' has rect={x:0, y:0, width:0, height:0, top:0}. The element exists and visible_atf=true only because coordinates are 0,0 — but zero width/height means no rendered tap surface. Separately, 'Menu' and 'Order now' CTAs are at rect_top=-8809px and -8735px (hidden in off-canvas nav). Desktop shows 'BOOK NOW' and 'ORDER NOW' buttons visible in a bottom sticky bar at 1280px.
→ If the primary mobile reservation CTA (book your table now) has no rendered dimensions, mobile users cannot tap it. This directly breaks the primary conversion path on mobile. Google's mobile-first index evaluates mobile usability; a zero-size CTA may also trigger Core Web Vitals INP issues.
Low SV6Visual hierarchy: H1 visible but hero headline uses dark overlay — low contrast risk
Desktop screenshot (1280x720) shows 'THE MODERN BRAZILIAN STEAKHOUSE' in white text over a darkened food-photography video frame. Contrast ratio not measured (no automated contrast tool invoked). H1 is the dominant above-the-fold text element at ~213px from top. Mobile screenshot (375x812) shows same text at ~230px from top, readable. Logo ('Adega Gaucha' wordmark) is in-viewport on both breakpoints (rect_top=60px desktop, visible on mobile). Navigation shows only 'MENU' text link at top-left on both breakpoints — location CTAs (Orlando/Kissimmee/Deerfield Beach) are in a sub-menu not visible without interaction.
→ If video frame brightens at certain timestamps, H1 text may fall below WCAG AA 4.5:1 ratio. Low contrast on primary H1 is an accessibility issue and can indirectly affect engagement metrics.
Low SV7WPVR 360-tour plugin present in codebase but not rendering iframe on homepage
HTML source grep finds 5 WPVR/360-tour string references (likely in CSS/JS asset URLs). Playwright DOM query returns 0 iframes on homepage (only GTM noscript iframe). No WPVR shortcode found in rendered HTML. Plugin is loaded but 360-tour not embedded on homepage.
→ WPVR JS/CSS assets may still be enqueued globally (adding payload), but no live CLS risk from an unrendered iframe. If tour pages do embed WPVR iframes without explicit width/height attributes, those pages will have CLS risk. Homepage CLS risk from WPVR is not confirmed.
Low SV833 stylesheet link tags total — Elementor + WP plugin CSS proliferation
Source grep returns 33 <link rel='stylesheet'> tags in homepage HTML. This includes Elementor base/pro, Weglot, multiple plugin stylesheets. While WP Rocket minifies/combines some, the Google Fonts 4 render-blocking requests remain separate. Large stylesheet count increases critical-path depth.
→ Each additional stylesheet is a potential render-blocking resource. At 33 total, even with deferred loading for non-critical sheets, the sheer volume increases the probability of render-blocking and delays FCP. This is background pressure on all Core Web Vitals, not an isolated issue.
Low SV9Good: all 43 <img> tags carry explicit width and height attributes
Static grep across all <img> tags in source: 0 images missing width or height attributes out of 43 total. All images use explicit integer pixel dimensions (e.g., width='1707' height='1138', width='500' height='500'). This correctly reserves layout space and prevents img-caused CLS.
→ Positive signal. Browser can compute aspect ratio before image bytes arrive, eliminating CLS from image loading. Elementor's default behavior of injecting width/height is correctly configured.
Low SV10Good: viewport meta correct, no horizontal overflow on mobile
viewport meta: 'width=device-width, initial-scale=1.0, viewport-fit=cover' — correctly configured including viewport-fit=cover for notched devices. Playwright mobile (375x812): body.scrollWidth=375 = window.innerWidth=375, horizontal_overflow=false. No uncontained wide elements detected.
→ Positive signal. Mobile rendering is contained. No horizontal scroll that would trigger Google's mobile usability penalties.