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
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).
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...
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...
Quick Wins — Shippable This Week
11.0h total6 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/100Overall 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
Priority breakdown by severity — 25 findings total
The 3 Biggest Problems
- 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... - 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; 'b... - 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-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
| Category | Score | Weight | Weighted | Rating |
|---|---|---|---|---|
| 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
| Composite | Score | Rating | Formula |
|---|---|---|---|
| Technical + Core Web Vitals | 72/100 | Fair | Technical*0.45 + Performance*0.35 + Sitemap*0.20... |
| GEO + AEO Readiness | 61/100 | Fair | Geo*0.45 + Schema*0.30 + Platform*0.12 + Brand*0.12... |
| Overall Search-Readiness | 66/100 | Fair | Technical*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.
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 —
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 <…
| Component | Score | Rating |
|---|---|---|
| Alt Text | 88/100 | Good |
| Semantic Structure | 52/100 | Poor |
| Forms Nav | 60/100 | Fair |
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.
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…
geo-crawlers 92/100 —
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 —
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 —
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 —
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…
| Component | Score | Rating |
|---|---|---|
| Coverage | 60/100 | Fair |
| Validity | 48/100 | Poor |
| Sameas Entity Graph | 25/100 | Critical |
| Local Completeness | 35/100 | Critical |
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|…
| Component | Score | Rating |
|---|---|---|
| Crawlability | 85/100 | Good |
| Indexation | 80/100 | Good |
| Security | 62/100 | Fair |
| Ssr Rendering | 95/100 | Excellent |
| Page Speed Signals | 58/100 | Poor |
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…
| Component | Score | Rating |
|---|---|---|
| On Page | 76/100 | Good |
| Indexability | 82/100 | Good |
| Internal Linking | 80/100 | Good |
seo-backlinks 0/100 —
Backlink profile could not be measured this run - DataForSEO Backlinks subscription inactive, no Moz key. Reported N/A, not zero.
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.
seo-images 68/100 —
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 —
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 —
Geo-grid map-pack tracking could not run (API error). GSC near-me queries indicate map-pack headroom; directional only.
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 du…
| Component | Score | Rating |
|---|---|---|
| Homepage | 82/100 | Good |
| Menu Page | 58/100 | Poor |
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).
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.
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:
- 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;
- the LCP element is almost…
High Priority — Fix within 1 week
5 issuesThese issues significantly limit your reach. Plan to fix within the next sprint. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Duplicate copies of your site are live and getting indexed
HighGoogle 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.
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/frSearch engines and AI can't read your menu or prices
HighYour 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.
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).You're on page 1 for big money keywords but just below the top 3
HighFor 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.
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.Two of your three restaurants are invisible to Google's local data
HighYour 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.
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.Google & AI can't connect your brand to its reviews and awards
HighYour 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.
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.Medium Priority — Fix within 1 month
15 issuesThese improvements compound over time. Schedule into your next month. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Trackers run before visitors agree — a privacy-law exposure
MediumGoogle 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.
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.Your privacy policy is hidden from search and missing required wording
MediumThe 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.
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.Your homepage is very heavy, which slows phones
MediumThe 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.
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.Too many builder files load before the page can show
MediumThe 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.
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.Your structured data contradicts itself
MediumThere 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.
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.Old and duplicate page URLs compete with each other
MediumAn 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.
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.Your Google listing sends clicks to a tracking URL, not your clean page
MediumThe 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.
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).Several menu pages fight each other for the same searches
MediumMenu 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.
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.Your AI-guidance file is broken
MediumThe /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.
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.Images aren't fully optimized and your share preview is unappetizing
MediumImages 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.
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'.A few on-page cleanups are overdue
MediumThe 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.
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).Your awards aren't working for you in search
MediumYou'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.
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.A broken widget injects a second webpage inside your homepage
MediumAn 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.
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.A few protective web-security headers are missing
MediumThe 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.
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.You're missing easy 'near me' visibility
MediumSearches 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.
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.Low Priority — Backlog
5 issuesNice-to-have refinements. Add to backlog for when capacity allows. Issues ranked by impact-to-effort ratio — highest-ROI fixes appear first.
Small accessibility fixes remain
LowSome 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.
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.Server could use newer, faster transfer protocols
LowThe server responds over HTTP/1.1 with gzip compression. Enabling HTTP/2 and Brotli would shave a little transfer time, especially helpful on mobile.
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.A couple of old spammy-looking URLs linger
LowURLs 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.
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.Two minor structured-data omissions
LowThe 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.
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.Two small front-end rendering glitches
Lowfetchpriority=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.
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.Technical Deep Dive
74/100Rating: 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
| Component | Score | Rating |
|---|---|---|
| Crawlability | 85/100 | Good |
| Indexation | 80/100 | Good |
| Security | 62/100 | Fair |
| Ssr Rendering | 95/100 | Excellent |
| Page Speed Signals | 58/100 | Poor |
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/100Rating: 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
| Component | Score | Rating |
|---|---|---|
| Coverage | 60/100 | Fair |
| Validity | 48/100 | Poor |
| Sameas Entity Graph | 25/100 | Critical |
| Local Completeness | 35/100 | Critical |
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/100Rating: 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/100Rating: 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)
| Metric | Mobile (PSI) | Desktop (Lighthouse) |
|---|---|---|
| Performance score | — | 0.84 |
| LCP | — | 2.05s |
| CLS | — | 0 |
| TBT / FID | — | — |
| FCP | — | 1.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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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/100Rating: 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
| Component | Score | Rating |
|---|---|---|
| Alt Text | 88/100 | Good |
| Semantic Structure | 52/100 | Poor |
| Forms Nav | 60/100 | Fair |
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/100Rating: 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/100Rating: 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/100Rating: 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
| Component | Score | Rating |
|---|---|---|
| On Page | 76/100 | Good |
| Indexability | 82/100 | Good |
| Internal Linking | 80/100 | Good |
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/100Rating: 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/100Rating: 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
| Component | Score | Rating |
|---|---|---|
| Homepage | 82/100 | Good |
| Menu Page | 58/100 | Poor |
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/100Rating: 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.
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.
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.
What ships each window
- 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
- 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
| Milestone | Projected Score | Delta |
|---|---|---|
| Current baseline | 66/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.
manual-guide
/geo llmstxt --generate
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
manual-guide
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/9Phase 6.5 verification ran before deliverable generation. 9 of 9 active gates passed (1 N/A for current mode).
| Gate | Check | Status | Detail |
|---|---|---|---|
| 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 patternsreferences/business-type-sampling.md— 5 types × 8 priority pagesreferences/composite-formula.md— 9 weights + 5-tier rubricreferences/pdf-spec.md— Times New Roman + 7 chartsreferences/verification-checklist.md— 10 Phase 6.5 gatesreferences/skill-routing.md— winner-per-pair matrixreferences/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 GA1 | No <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 GA2 | Duplicate 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 GA3 | Form 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 GA4 | No 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 GA5 | Skipped 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 GA6 | Primary 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 GA7 | Image 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 GA8 | Image-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 GA9 | Accessibility 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 GB1 | sameAs 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 GB2 | Award/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 GCO1 | No 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 GCO2 | Privacy 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 GCO3 | Terms 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 GCO4 | Privacy 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 GCO5 | Data-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 GCO6 | HTTPS + 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 GC1 | All 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 GC2 | Location & 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 GC3 | No 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 GL1 | Invalid 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 GP1 | Non-crawlable menu blocks AI dish/price citations Menu items/prices absent from HTML (getsauce.com widget). → Unlocks menu/price AI answers |
| Medium GP2 | llms.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 GS1 | Duplicate, 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 GS2 | sameAs 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 GS3 | Only 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 GS4 | AggregateRating 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 GS5 | servesCuisine 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 GS6 | No 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 GS7 | No 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 GS8 | openingHours 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 GS9 | hasMap uses HTML-entity-encoded ampersand (&) inside JSON-LD URL Place node: "hasMap": "https://www.google.com/maps/search/?api=1&query=28.448804,-81.400653,10" — contains '&' rather than a literal '&'. → Inside JSON-LD a URL value should contain a literal '&'; the '&' is HTML escaping leaking into JSON and yields a malformed query param when consumed programmatically. Minor but a validity defect. |
| Low GS10 | addressCountry 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 GT1 | Fully 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 GT2 | No 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 GT3 | Weak 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 GT4 | Stale 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 GT5 | 33 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 GT6 | Brotli 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 GT7 | Indexability 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 SA1 | Homepage 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 SA2 | Stale 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 SA5 | No 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 SA6 | hreflang 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 SA8 | og: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 SB1 | Authority/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 SG1 | High-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 SG3 | GBP 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 SG4 | Menu 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 SI1 | No 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 SI2 | og: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 SI3 | 16 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 SL1 | Only 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 SL2 | GBP 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 SL3 | Non-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 SP1 | Menu 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 SP2 | No 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 SP4 | FAQPage 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 SP5 | Two 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 SP6 | Canonical/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 SP7 | Homepage 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 SP8 | Menu-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 SP9 | Above-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 SPF1 | Total 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 SPF2 | 33 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 SPF3 | HTTP/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 SS1 | Indexed 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 SS2 | Legacy /blog_old still live and indexed Firecrawl: https://adegagaucha.com/blog_old title 'Blog & OLD'. → Removes duplicate blog surface |
| Medium SS3 | Parallel 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 SS4 | Keyword-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 SV1 | Duplicate 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 SV2 | fetchpriority=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 SV3 | Hero 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 SV4 | 4 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 SV5 | Mobile 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 SV6 | Visual 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 SV7 | WPVR 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 SV8 | 33 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 SV9 | Good: 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 SV10 | Good: 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. |