# SEO Audit — livinstaysalgarve.com

**Date:** April 27, 2026
**Auditor:** Hermes Agent (paperclip-dev)
**Domain:** livinstaysalgarve.com
**Overall Score:** 6.4 / 10

---

## Executive Summary

Livin Stays Algarve's website is built on **Astro v6.1.7** with Supabase Storage for images, supporting 3 languages (EN/PT/ES) with service worker caching. The technical foundation is solid — clean URLs, proper hreflang, good structured data, and fast TTFB. However, **GDPR compliance gaps**, **158 empty alt attributes on gallery images**, and **incomplete structured data** are holding back both legal safety and SEO performance.

---

## Stack & Infrastructure

| Component | Details |
|-----------|---------|
| Framework | Astro v6.1.7 |
| Image Storage | Supabase Storage |
| Languages | EN, PT, ES (hreflang + x-default) |
| Caching | Service Worker present |
| Payments | Stripe |
| Email | Resend |
| Channel Manager | Avaibook |
| TTFB | 28ms (excellent) |

---

## Strengths ✅

1. **Unique titles and meta descriptions** on every page
2. **Proper canonical URLs** and hreflang implementation (EN/PT/ES + x-default)
3. **Clean URL structure** — e.g., `/en/stay/quinta-da-capelinha`
4. **Good structured data coverage**: Organization, LodgingBusiness, BlogPosting, FAQPage, BreadcrumbList schemas
5. **Excellent performance**: 28ms TTFB, WebP images, lazy loading
6. **Well-configured robots.txt**: blocks admin paths, query params, legacy WordPress URLs
7. **Complete sitemap**: 63 URLs with hreflang alternates and lastmod dates
8. **High-quality multilingual content**

---

## Critical Issues ❌

### 1. No Cookie Consent Banner — GDPR Violation
**Severity:** 🔴 Critical
**Compliance Score:** 3/10

The website operates in the EU (Portugal) and serves EU visitors but has **no cookie consent mechanism**. This is a legal liability under GDPR and the ePrivacy Directive. A consent banner is required before non-essential cookies (analytics, marketing) are set.

**Fix:** Implement a cookie consent banner (e.g., CookieConsent by Osano, or a custom solution) that blocks non-essential cookies until explicit consent is given.

---

### 2. 158 Gallery Images with Empty `alt=""`
**Severity:** 🔴 Critical

Across stay/property pages, **158 gallery images have empty alt attributes**. Quinta da Capelinha alone has 86 images with `alt=""`. This is a major accessibility and SEO failure — Google uses alt text to understand image content, and screen readers depend on it.

**Affected pages:**
- Quinta da Capelinha: 86 images
- Villa Miramar, Villa Perogil, Charm & Elegance: 72+ images combined

**Fix:** Add descriptive, keyword-rich alt text to all gallery images. Example: `alt="Quinta da Capelinha living room with traditional Algarve tiles and natural light"`.

---

### 3. LodgingBusiness Schema — Empty `description` Fields
**Severity:** 🟠 High

The LodgingBusiness structured data has **empty description fields**, missing an opportunity for rich snippets in Google search results. Google uses schema descriptions for featured snippets and knowledge panels.

**Fix:** Populate the `description` field in each property's LodgingBusiness schema with a unique, compelling 150-300 character description.

---

### 4. Default OG Fallback Images on Most Pages
**Severity:** 🟠 High

Most non-property pages (blog posts, lifestyle pages, privacy policy) use a **generic fallback OG image** instead of page-specific images. This means social shares on Facebook, Twitter, LinkedIn, and WhatsApp show the same generic image instead of relevant visuals.

**Fix:** Generate and assign unique OG images (1200×630px) for each page, especially blog posts.

---

### 5. Contact Form Uses `method="get"` Instead of `"post"`
**Severity:** 🟠 High

The contact form submission method is set to `"get"`, which exposes form data in the URL query string. This is both a security issue (data visible in browser history, server logs, referrer headers) and a UX issue (URL length limits).

**Fix:** Change to `method="post"`.

---

### 6. 5 Render-Blocking Scripts on Every Page
**Severity:** 🟡 Medium

Every page loads **5 render-blocking JavaScript files** without `async` or `defer` attributes. This delays First Contentful Paint (FCP) and Largest Contentful Paint (LCP), impacting Core Web Vitals.

**Fix:** Add `defer` or `async` attributes to non-critical scripts. Inline critical JS if needed.

---

### 7. No Google Analytics Detected
**Severity:** 🟡 Medium

Despite the Privacy Policy **explicitly mentioning Google Analytics 4**, no GA4 tracking code was detected on any page. Either the analytics setup is broken or the Privacy Policy is inaccurate — both are problems.

**Fix:** Either install GA4 tracking (with proper cookie consent integration) or remove the GA4 reference from the Privacy Policy.

---

### 8. Blog Posts Use `og:type="website"` Instead of `"article"`
**Severity:** 🟡 Medium

All blog posts set `og:type="website"` instead of `"article"`. This prevents social platforms from treating blog content as articles, losing features like article-specific previews and reading time estimates.

**Fix:** Set `og:type="article"` on all blog/lifestyle pages and add `article:published_time`, `article:author` meta tags.

---

### 9. Suspicious AggregateRating — "1 review" on All Properties
**Severity:** 🟡 Medium

Every property page shows an **AggregateRating of exactly 1 review**. This looks suspicious to both users and Google. If these are placeholder values, they should be removed. If real, they should reflect actual review counts.

**Fix:** Either populate with real review data from Google/Booking.com/TripAdvisor, or remove the AggregateRating schema until real reviews are collected.

---

### 10. Stale Sitemap `lastmod` Dates
**Severity:** 🟡 Low

The sitemap contains **stale lastmod dates** — most are from 2026-02-04 or 2026-03-25. Google uses lastmod to prioritize crawling; stale dates mean Google may not re-crawl updated pages promptly.

**Fix:** Automate lastmod updates when content changes. Astro has plugins for dynamic sitemap generation.

---

## Navigation Issue 🌐

**Portuguese nav inconsistency:** The word "LIFESTYLE" is not translated in the Portuguese navigation menu. It should be "ESTILO DE VIDA" or "BLOG" in the PT version.

---

## Pages Audited (16+)

| Page | Type |
|------|------|
| Homepage (EN + PT) | Landing |
| Quinta da Capelinha | Property |
| Villa Miramar | Property |
| Villa Perogil | Property |
| Charm & Elegance | Property |
| Best Beaches | Blog/Lifestyle |
| Exploring Local Towns | Blog/Lifestyle |
| Theme Parks | Blog/Lifestyle |
| Privacy Policy | Legal |
| robots.txt | Technical |
| sitemap.xml | Technical |
| Experiences page | Reference |

---

## Top 5 Fixes (Prioritized by Impact)

| Priority | Fix | Impact |
|----------|-----|--------|
| 1 | Add cookie consent banner | Legal compliance (GDPR) |
| 2 | Fill alt text on 158 gallery images | SEO + Accessibility |
| 3 | Add page-specific OG images | Social sharing CTR |
| 4 | Fill LodgingBusiness description fields | Rich snippets |
| 5 | Defer/async render-blocking scripts | Core Web Vitals |

---

## Additional Properties in Sitemap (Not Fully Audited)

- Charm & Comfort
- Family & Soul
- Family & Vistas
- Family & Terrace
- Villa Pegada

---

## Third-Party Services Detected

- **Stripe** — payment processing
- **Resend** — transactional email
- **Avaibook** — channel manager
- **Supabase** — image storage and database

---

*Generated by Hermes Agent — Livin Stays Algarve internal tooling*
