The website currently shows a fair baseline of content but requires technical optimization to improve search engine rankings and user experience. The most critical priorities include addressing slow page load speeds and correcting structural errors that prevent search engines from properly indexing your site. We recommend authorizing our team to implement these performance fixes and structural cleanup immediately to boost your site rankings and prevent layout shifts for visitors.
90
SEO
83
Performance
89
Accessibility
70
UI / Visual
75
Content
64
Technical
Screenshots
Desktop (1440px)
Mobile (375px)
SEO
2 high
high
Multiple H1 tags (2)
Found 2 H1 tags: "Voted The #1 Salon & Spa"; "Voted The #1 Salon & Spa". Confuses search engines about the page topic.
Keep only one H1 — the primary page heading. Remove or demote the others to H2.
high
Heading hierarchy skip
Heading jumps from H2 to H4: "Experience the power of the Gong in an intimate setting"
Use H3 instead of H4 here.
Performance
3 high1 medium
high
TTFB is 640ms (Slow)
Time to First Byte is 640ms. Lighthouse threshold: ≤600ms.
Check server response time, enable caching, or use a CDN.
high
5 render-blocking scripts
Scripts in <head> without async/defer block HTML parsing.
Add async or defer attributes to non-critical scripts.
high
25 images missing width/height attributes
Images without explicit dimensions cause Cumulative Layout Shift as they load.
Add width and height attributes to all <img> tags.
medium
31 images missing loading="lazy"
Images without native lazy loading: logo-blanco.png-1.webp, CiaoBella_Web_Home_award_BUK25.webp, CiaoBella_Web_Home_award_BUK25.webp…. The browser fetches all of them on page load regardless of whether they're visible.
Add loading="lazy" to non-hero <img> tags. Keep the first/hero image as-is (no loading attribute, or loading="eager") to avoid an LCP penalty.
Accessibility
2 high1 low
high
58 interactive elements below 44×44px touch target size
WCAG 2.5.5 recommends at least 44×44px for touch targets.
Increase padding on small buttons and links.
high
1 video(s) without captions
Videos without captions are inaccessible to deaf and hard-of-hearing users. WCAG 1.2.2.
Add <track kind='captions'> to all video elements.
low
axe-core could not run
axe-core failed: Page.evaluate() got an unexpected keyword argument 'timeout'. May be blocked by CSP or page too complex.
Test accessibility manually or via Chrome DevTools.
UI / Visual
1 critical2 high4 medium2 low
critical
[Visual] Mobile Responsiveness
The mobile navigation menu is completely broken, showing a vertical stack of links (Price list, Packages, Salon, Spa, Wellness, etc.) with massive overlapping and poor formatting. It renders the site unusable on mobile devices.
Implement a proper 'hamburger' menu pattern. Use CSS media queries to hide the full navigation list on mobile and display a toggle icon. Position the toggle absolutely in the header and create an overlay/drawer menu for the navigation links.
high
Horizontal overflow on mobile (375px)
Content overflows the viewport horizontally on mobile. This causes unwanted horizontal scrolling.
Fix CSS to prevent overflow: check for fixed widths, max-width on containers, and overflow:hidden on body.
high
[Visual] Typography
The 'Current schedule' section for yoga classes has significantly small, cramped text for the schedule details compared to the heading, hurting readability.
Increase the font-size of the schedule details (e.g., '8:30 – 9:30 am') to at least 16px and increase the line-height (e.g., line-height: 1.5) to provide better vertical rhythm.
medium
No favicon
No <link rel='icon'> found.
Add a favicon.ico and link it in <head>.
medium
Body text below 16px (13 elements)
Many text elements are smaller than the recommended 16px minimum.
Set base font-size to 16px for body content.
medium
[Visual] Layout & Spacing
The white space in the 'Featured Spa Services' section is inconsistent. The text labels are extremely close to the edge of the images, and the spacing between the four service cards is uneven.
Standardize padding using a grid system. Apply a consistent gap (e.g., gap: 20px) on the parent container using Flexbox or Grid. Add vertical margin (margin-top: 15px) to the text labels to create breathing room from the images.
medium
[Visual] Visual Hierarchy
The header call-to-action buttons ('BOOK ONLINE', 'CALL US') are formatted identically to the buttons in the body. In the main navigation, these appear as high-contrast buttons, but they lack a clear primary/secondary hierarchy.
Differentiate the 'Book Online' button as the primary CTA by using a more prominent background color or border-radius, while making 'Call Us' a secondary ghost button (bordered with transparent background) to guide user focus.
low
[Visual] Professionalism
The 'Gong Sound Immersion' section title is truncated on the mobile view ('Gong Sound Imme').
Use CSS 'text-overflow: ellipsis' or decrease the font size specifically for mobile viewports using a query: @media (max-width: 768px) { .section-title { font-size: 1.2rem; } }.
low
[Visual] Color & Branding
The text color used for descriptive paragraphs is a low-contrast gray that blends into the white background, specifically in the 'About Ciao Bella' section.
Improve web accessibility (WCAG AA compliance) by darkening the paragraph text color to at least #444444 to ensure it meets the recommended contrast ratio against the white background.
The header contains an incomplete sentence fragment, suggesting a missing link or CTA button text.
"Gong Sound Immersion: Every 3rd Saturday at 10:30 AM. to Book."
Replace ' to Book.' with 'Click here to book.' or wrap the phrasing in a clear hyperlink: '<a href="[URL]">Click here to book</a>'.
high
24 image(s) with generic or missing alt text
Images with uninformative alt text (filenames, 'image', 'photo', or empty): cropped-ciaobella.png, logo-blanco.png-1.webp, CiaoBella_Banner_EventoFeb21_web.we…
Write a natural-language description for each: what the image shows and why it's there (e.g. 'Relaxation massage room at Ciao Bella spa').
medium
[Content] Grammar & Spelling
Awkward phrasing and poor punctuation in the list of body systems.
"nervous systems, lymphatic systems, etcetera."
Change to: 'nervous, and lymphatic systems.'
medium
[Content] Grammar & Spelling
Inconsistent capitalization of common nouns throughout the copy.
"a Conscious Community, one breath at a time!"
Standardize to sentence case. Change to: 'a conscious community, one breath at a time!'
medium
[Content] Calls To Action
Redundant and competing CTAs ('BOOK ONLINE' and 'CALL US') appear in multiple sections without a clear primary conversion path.
"BOOK ONLINE
CALL US
VOTED THE #1 SALON & SPA"
Limit the hero section to one primary CTA (e.g., 'Book Now'). Use secondary style buttons for 'Call Us' to establish visual hierarchy.
medium
18 image(s) with keyword-stuffed alt text
Alt text used as a keyword list rather than a description: svg+xml;nitro-empty-id=MTMzNDo4NTM=, svg+xml;nitro-empty-id=MTM0Njo4ODE=, svg+xml;nitro-empty-id=MTM1ODo4NjM=…
Replace with one natural sentence describing what the image shows. Avoid cramming in keywords.
low
[Content] Professionalism
The phrasing 'vibrational-medicine' is non-standard and lacks hyphenation logic in this context.
"Through vibrational-medicine we will work on"
Remove the hyphen: 'Through vibrational medicine, we will...'
low
[Content] Professionalism
The copy 'they’ve made it onto our shelves in our present timeline' is overly abstract and confusing for a B2C retail description.
"they’ve made it onto our shelves in our present timeline."
Rewrite for clarity: 'We have curated these historical treasures for our current collection.'
Technical
1 critical3 high4 medium3 low
critical
Missing HSTS header
The HSTS HTTP response header is not set.
Add to your server/CDN/nginx config: Strict-Transport-Security: max-age=31536000; includeSubDomains
high
2 console error(s)
Browser console errors indicate broken functionality. First: Failed to load resource: the server responded with a status of 403 ()
Open Chrome DevTools (F12) > Console tab to see all errors with source URLs. Fix the root cause of each error — broken script loads, JS exceptions, or failed API calls.
Open Chrome DevTools > Network tab, filter by Status ≥ 400 to find all failing resources. Fix URLs, restore missing files, or remove unused references.
high
Missing X-Content-Type-Options header
The X-Content-Type-Options HTTP response header is not set.
Add to your server/CDN/nginx config: X-Content-Type-Options: nosniff
medium
Missing X-Frame-Options header
The X-Frame-Options HTTP response header is not set.
Add to your server/CDN/nginx config: X-Frame-Options: SAMEORIGIN
medium
Missing Content-Security-Policy header
The Content-Security-Policy HTTP response header is not set.
Add to your server/CDN/nginx config: Content-Security-Policy: default-src 'self'; img-src * data:; script-src 'self' (customize per stack)
medium
1 cookie(s) missing Secure flag
Cookies without Secure flag can be sent over HTTP: nitroCachedPage
Add the Secure attribute to all cookies on HTTPS sites.
medium
1 cookie(s) missing HttpOnly flag
Cookies accessible via JavaScript: nitroCachedPage. XSS can steal them.
Add HttpOnly attribute to session and auth cookies.
low
Missing Referrer-Policy header
The Referrer-Policy HTTP response header is not set.
Add to your server/CDN/nginx config: Referrer-Policy: strict-origin-when-cross-origin
low
Missing Permissions-Policy header
The Permissions-Policy HTTP response header is not set.
Add to your server/CDN/nginx config: Permissions-Policy: camera=(), microphone=(), geolocation=()
low
5 cookie(s) missing SameSite attribute
Cookies without SameSite may be sent on cross-site requests: __cf_bm, cf_clearance, __cf_bm
# QA Report: https://ciaobellaislamorada.com/
**Client:** Robbies
**Overall Score:** 78/100
**Date:** 2026-03-24
The website currently shows a fair baseline of content but requires technical optimization to improve search engine rankings and user experience. The most critical priorities include addressing slow page load speeds and correcting structural errors that prevent search engines from properly indexing your site. We recommend authorizing our team to implement these performance fixes and structural cleanup immediately to boost your site rankings and prevent layout shifts for visitors.
**Issues:** 2 critical · 15 high · 13 medium · 8 low
## SEO (90/100)
- **[HIGH]** Multiple H1 tags (2)
- Found 2 H1 tags: "Voted The #1 Salon & Spa"; "Voted The #1 Salon & Spa". Confuses search engines about the page topic.
- Fix: Keep only one H1 — the primary page heading. Remove or demote the others to H2.
- **[HIGH]** Heading hierarchy skip
- Heading jumps from H2 to H4: "Experience the power of the Gong in an intimate setting"
- Fix: Use H3 instead of H4 here.
## Performance (83/100)
- **[HIGH]** TTFB is 640ms (Slow)
- Time to First Byte is 640ms. Lighthouse threshold: ≤600ms.
- Fix: Check server response time, enable caching, or use a CDN.
- **[HIGH]** 5 render-blocking scripts
- Scripts in <head> without async/defer block HTML parsing.
- Fix: Add async or defer attributes to non-critical scripts.
- **[HIGH]** 25 images missing width/height attributes
- Images without explicit dimensions cause Cumulative Layout Shift as they load.
- Fix: Add width and height attributes to all <img> tags.
- **[MEDIUM]** 31 images missing loading="lazy"
- Images without native lazy loading: logo-blanco.png-1.webp, CiaoBella_Web_Home_award_BUK25.webp, CiaoBella_Web_Home_award_BUK25.webp…. The browser fetches all of them on page load regardless of whether they're visible.
- Fix: Add loading="lazy" to non-hero <img> tags. Keep the first/hero image as-is (no loading attribute, or loading="eager") to avoid an LCP penalty.
## Accessibility (89/100)
- **[HIGH]** 58 interactive elements below 44×44px touch target size
- WCAG 2.5.5 recommends at least 44×44px for touch targets.
- Fix: Increase padding on small buttons and links.
- **[HIGH]** 1 video(s) without captions
- Videos without captions are inaccessible to deaf and hard-of-hearing users. WCAG 1.2.2.
- Fix: Add <track kind='captions'> to all video elements.
- **[LOW]** axe-core could not run
- axe-core failed: Page.evaluate() got an unexpected keyword argument 'timeout'. May be blocked by CSP or page too complex.
- Fix: Test accessibility manually or via Chrome DevTools.
## UI (70/100)
- **[CRITICAL]** [Visual] Mobile Responsiveness
- The mobile navigation menu is completely broken, showing a vertical stack of links (Price list, Packages, Salon, Spa, Wellness, etc.) with massive overlapping and poor formatting. It renders the site unusable on mobile devices.
- Fix: Implement a proper 'hamburger' menu pattern. Use CSS media queries to hide the full navigation list on mobile and display a toggle icon. Position the toggle absolutely in the header and create an overlay/drawer menu for the navigation links.
- **[HIGH]** Horizontal overflow on mobile (375px)
- Content overflows the viewport horizontally on mobile. This causes unwanted horizontal scrolling.
- Fix: Fix CSS to prevent overflow: check for fixed widths, max-width on containers, and overflow:hidden on body.
- **[HIGH]** [Visual] Typography
- The 'Current schedule' section for yoga classes has significantly small, cramped text for the schedule details compared to the heading, hurting readability.
- Fix: Increase the font-size of the schedule details (e.g., '8:30 – 9:30 am') to at least 16px and increase the line-height (e.g., line-height: 1.5) to provide better vertical rhythm.
- **[MEDIUM]** No favicon
- No <link rel='icon'> found.
- Fix: Add a favicon.ico and link it in <head>.
- **[MEDIUM]** Body text below 16px (13 elements)
- Many text elements are smaller than the recommended 16px minimum.
- Fix: Set base font-size to 16px for body content.
- **[MEDIUM]** [Visual] Layout & Spacing
- The white space in the 'Featured Spa Services' section is inconsistent. The text labels are extremely close to the edge of the images, and the spacing between the four service cards is uneven.
- Fix: Standardize padding using a grid system. Apply a consistent gap (e.g., gap: 20px) on the parent container using Flexbox or Grid. Add vertical margin (margin-top: 15px) to the text labels to create breathing room from the images.
- **[MEDIUM]** [Visual] Visual Hierarchy
- The header call-to-action buttons ('BOOK ONLINE', 'CALL US') are formatted identically to the buttons in the body. In the main navigation, these appear as high-contrast buttons, but they lack a clear primary/secondary hierarchy.
- Fix: Differentiate the 'Book Online' button as the primary CTA by using a more prominent background color or border-radius, while making 'Call Us' a secondary ghost button (bordered with transparent background) to guide user focus.
- **[LOW]** [Visual] Professionalism
- The 'Gong Sound Immersion' section title is truncated on the mobile view ('Gong Sound Imme').
- Fix: Use CSS 'text-overflow: ellipsis' or decrease the font size specifically for mobile viewports using a query: @media (max-width: 768px) { .section-title { font-size: 1.2rem; } }.
- **[LOW]** [Visual] Color & Branding
- The text color used for descriptive paragraphs is a low-contrast gray that blends into the white background, specifically in the 'About Ciao Bella' section.
- Fix: Improve web accessibility (WCAG AA compliance) by darkening the paragraph text color to at least #444444 to ensure it meets the recommended contrast ratio against the white background.
## Content (75/100)
- **[HIGH]** 9 broken external link(s)
- Links returning errors: ciaobellaspa.zenoti.com, ciaobellaspa.zenoti.com, ciaobellaspa.zenoti.com…
- Fix: Fix or remove broken external links.
- **[HIGH]** [Content] Placeholder Text
- The header contains an incomplete sentence fragment, suggesting a missing link or CTA button text.
- Fix: Replace ' to Book.' with 'Click here to book.' or wrap the phrasing in a clear hyperlink: '<a href="[URL]">Click here to book</a>'.
- **[HIGH]** 24 image(s) with generic or missing alt text
- Images with uninformative alt text (filenames, 'image', 'photo', or empty): cropped-ciaobella.png, logo-blanco.png-1.webp, CiaoBella_Banner_EventoFeb21_web.we…
- Fix: Write a natural-language description for each: what the image shows and why it's there (e.g. 'Relaxation massage room at Ciao Bella spa').
- **[MEDIUM]** [Content] Grammar & Spelling
- Awkward phrasing and poor punctuation in the list of body systems.
- Fix: Change to: 'nervous, and lymphatic systems.'
- **[MEDIUM]** [Content] Grammar & Spelling
- Inconsistent capitalization of common nouns throughout the copy.
- Fix: Standardize to sentence case. Change to: 'a conscious community, one breath at a time!'
- **[MEDIUM]** [Content] Calls To Action
- Redundant and competing CTAs ('BOOK ONLINE' and 'CALL US') appear in multiple sections without a clear primary conversion path.
- Fix: Limit the hero section to one primary CTA (e.g., 'Book Now'). Use secondary style buttons for 'Call Us' to establish visual hierarchy.
- **[MEDIUM]** 18 image(s) with keyword-stuffed alt text
- Alt text used as a keyword list rather than a description: svg+xml;nitro-empty-id=MTMzNDo4NTM=, svg+xml;nitro-empty-id=MTM0Njo4ODE=, svg+xml;nitro-empty-id=MTM1ODo4NjM=…
- Fix: Replace with one natural sentence describing what the image shows. Avoid cramming in keywords.
- **[LOW]** [Content] Professionalism
- The phrasing 'vibrational-medicine' is non-standard and lacks hyphenation logic in this context.
- Fix: Remove the hyphen: 'Through vibrational medicine, we will...'
- **[LOW]** [Content] Professionalism
- The copy 'they’ve made it onto our shelves in our present timeline' is overly abstract and confusing for a B2C retail description.
- Fix: Rewrite for clarity: 'We have curated these historical treasures for our current collection.'
## Technical (64/100)
- **[CRITICAL]** Missing HSTS header
- The HSTS HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: Strict-Transport-Security: max-age=31536000; includeSubDomains
- **[HIGH]** 2 console error(s)
- Browser console errors indicate broken functionality. First: Failed to load resource: the server responded with a status of 403 ()
- Fix: Open Chrome DevTools (F12) > Console tab to see all errors with source URLs. Fix the root cause of each error — broken script loads, JS exceptions, or failed API calls.
- **[HIGH]** 1 resource(s) failing to load (4xx/5xx)
- Resources returning HTTP errors: HTTP 403: https://link.flowsly.io/widget/form/4vyloIoUuwtzVjJmDyOk
- Fix: Open Chrome DevTools > Network tab, filter by Status ≥ 400 to find all failing resources. Fix URLs, restore missing files, or remove unused references.
- **[HIGH]** Missing X-Content-Type-Options header
- The X-Content-Type-Options HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: X-Content-Type-Options: nosniff
- **[MEDIUM]** Missing X-Frame-Options header
- The X-Frame-Options HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: X-Frame-Options: SAMEORIGIN
- **[MEDIUM]** Missing Content-Security-Policy header
- The Content-Security-Policy HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: Content-Security-Policy: default-src 'self'; img-src * data:; script-src 'self' (customize per stack)
- **[MEDIUM]** 1 cookie(s) missing Secure flag
- Cookies without Secure flag can be sent over HTTP: nitroCachedPage
- Fix: Add the Secure attribute to all cookies on HTTPS sites.
- **[MEDIUM]** 1 cookie(s) missing HttpOnly flag
- Cookies accessible via JavaScript: nitroCachedPage. XSS can steal them.
- Fix: Add HttpOnly attribute to session and auth cookies.
- **[LOW]** Missing Referrer-Policy header
- The Referrer-Policy HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: Referrer-Policy: strict-origin-when-cross-origin
- **[LOW]** Missing Permissions-Policy header
- The Permissions-Policy HTTP response header is not set.
- Fix: Add to your server/CDN/nginx config: Permissions-Policy: camera=(), microphone=(), geolocation=()
- **[LOW]** 5 cookie(s) missing SameSite attribute
- Cookies without SameSite may be sent on cross-site requests: __cf_bm, cf_clearance, __cf_bm
- Fix: Set SameSite=Lax or Strict on all cookies.