Export Report
OVERALL SCORE
Level 2, Agent-Limited
- AI Discoverability 37 out of 100
- Agent Ease of Use 42 out of 100
- Security & Trust 85 out of 100
- GEO, AIO and AEO 46 out of 100
- SEO 91 out of 100
- Performance 68 out of 100
- Accessibility 10 out of 100
What AI sees of your website
Avo: Guarantee event data quality upstream
Avo helps data and product teams guarantee event data quality upstream, so they can build great user experiences
Next step
Turn this report into a fix workflow
2 failed checks are ready to move into MCP or CLI remediation. Generate a repair prompt, connect the scanner to your coding agent, or open the integration docs before your next rescan.
| Metric | Score | Status | Passed | Failed | Warning | Evidence |
|---|---|---|---|---|---|---|
| AI Discoverability | 37 | Priority fix | 15 | 2 | 0 | View details |
| Discoverability | 47 | Priority fix | 6 | 0 | 0 | |
| Content Readiness | 27 | Priority fix | 9 | 0 | 0 | |
| Bot Access Control | 38 | Priority fix | 0 | 2 | 0 | View details |
| GEO, AIO and AEO | 46 | Priority fix | 5 | 0 | 0 | |
| GEO Readiness | Not Applicable | Not Applicable | 2 | 0 | 0 | |
| AIO Readiness | Not Applicable | Not Applicable | 1 | 0 | 0 | |
| AEO Readiness | Not Applicable | Not Applicable | 2 | 0 | 0 | |
| SEO | 91 | Strong | 7 | 0 | 0 | |
| SEO | 91 | Strong | 7 | 0 | 0 | |
| Security & Trust | 85 | Mostly ready | 25 | 2 | 2 | View details |
| Security & Trust | 85 | Mostly ready | 25 | 2 | 2 | View details |
| Performance | 68 | Needs work | 13 | 0 | 0 | |
| Performance | 68 | Needs work | 13 | 0 | 0 | |
| Accessibility | 10 | Priority fix | 0 | 1 | 0 | View details |
| Accessibility | 10 | Priority fix | 0 | 1 | 0 | View details |
Prioritized recommendations
Issues ranked by score impact
3 items need attention
AI DiscoverabilityBot Access ControlEstablished
AI bot rules in robots.txt
AI bot rules in robots.txt failed at "Fetch robots.txt".
100 Fail
AI DiscoverabilityBot Access ControlEstablished
AI bot rules in robots.txt
AI bot rules in robots.txt failed at "Fetch robots.txt".
Needs attention
AI bot rules in robots.txt
Issue
No robots.txt content was available to inspect for AI bot rules.
Why it matters
AI crawler product tokens have different meanings. Explicit robots.txt groups make training, search, and retrieval access policy auditable for compliant crawler operators.
Check name
AI bot rules in robots.txt
Score
0/100
Status
fail
Category
Bot Access Control
Maturity
Established
Goal
Declare deliberate robots.txt rules for major AI training, AI search, user-triggered, and dataset crawlers.
Result
AI bot rules in robots.txt failed at "Fetch robots.txt".
Validation steps
Fetch robots.txt
No robots.txt content was available to inspect for AI bot rules.
Classify AI crawler rules
No explicit User-agent rules were found for major AI crawler tokens.
Evidence log2 steps · 10 lines
Fetch robots.txt [fail]! No robots.txt content was available to inspect for AI bot rules.INFOFetch robots.txtINFORequesting /robots.txt from the site originFAILCheck whether robots.txt content is available actual="no content" expected="content returned" length=0FAILNo robots.txt content was available to inspect for AI bot rules.Classify AI crawler rules [fail]! No explicit User-agent rules were found for major AI crawler tokens.INFOClassify AI crawler rulesINFOParsing User-agent groups and Allow/Disallow records for known AI crawler tokens evaluatedPath="/"INFOEvaluating exact User-agent matches before wildcard fallback exactAiPolicyCount=0 totalCrawlerTokens=18FAILNo explicit AI crawler User-agent groups were found examplesExpected=["GPTBot","OAI-SearchBot","ClaudeBot","Google-Extended","CCBot"]FAILCompare explicit AI crawler coverage actual=0 expected="> 0 explicit non-search AI crawler policies" missingTokens=["GPTBot","OAI-SearchBot","ChatGPT-User","ClaudeBot","Claude-SearchBot","Claude-User","Google-Extended","Applebot-Extended","Amazonbot","Amzn-SearchBot","Amzn-User","PerplexityBot"]INFOResolved effective root-path policy for crawler tokens blocked=0 allowed=0 unspecified=21
Security & TrustSecurity & TrustEstablished
Frame protection
Frame protection failed at "Validate CSP frame-ancestors".
72 Fail
Security & TrustSecurity & TrustEstablished
Frame protection
Frame protection failed at "Validate CSP frame-ancestors".
Needs attention
Frame protection
Issue
frame-ancestors contains invalid source expressions: http://localhost:1235/, https://*.avo-dev.app/, https://*.avo.app/, wss://*.intercom.io, https://canny.io/api/users/identify, https://firebaselogging-pa.googleapis.com/, https://*.posthog.com/.
Why it matters
Frame protection blocks hostile sites from embedding pages in deceptive frames, reducing clickjacking and UI redressing risk.
Check name
Frame protection
Score
28/100
Status
fail
Category
Security & Trust
Maturity
Established
Goal
Prevent unwanted framing with an enforcing CSP frame-ancestors directive or a valid X-Frame-Options fallback.
Result
Frame protection failed at "Validate CSP frame-ancestors".
Validation steps
Validate CSP frame-ancestors
frame-ancestors contains invalid source expressions: http://localhost:1235/, https://*.avo-dev.app/, https://*.avo.app/, wss://*.intercom.io, https://canny.io/api/users/identify, https://firebaselogging-pa.googleapis.com/, https://*.posthog.com/.
Validate X-Frame-Options
X-Frame-Options is not DENY or SAMEORIGIN.
Review CSP and XFO interaction
CSP frame-ancestors controls modern browser behavior, but the X-Frame-Options fallback is invalid or conflicting.
Review observed browser responses
One or more same-origin HTML documents observed by Chrome did not emit valid frame protection.
Evidence log4 steps · 16 lines
Validate CSP frame-ancestors [fail]! frame-ancestors contains invalid source expressions: http://localhost:1235/, https://*.avo-dev.app/, https://*.avo.app/, wss://*.intercom.io, https://canny.io/api/users/identify, https://firebaselogging-pa.googleapis.com/, https://*.posthog.com/.INFOValidate CSP frame-ancestorsINFORead CSP frame-ancestors signals enforcingHeaderPresent=true reportOnlyHeaderPresent=false metaFrameAncestors=false policyCount=1 duplicateDirectives=[]FAILCompare effective frame-ancestors directive actual={"values":["'self'","http://localhost:1235/","http://avo.localhost","https://*.avo-dev.app/","https://*.avo.app/","https://*.mixpanel.com","https://consent.iubenda.com","https://avo-web-app.appspot.com","https://api.avo.app","https://api.amplitude.com","https://*.algolia.net","https://api.segment.io","https://cdn.segment.com","https://*.fullstory.com","https://www.googleapis.com","https://firestore.googleapis.com","https://firebaselogging.googleapis.com","https://firebaseremoteconfig.googleapis.com","https://firebaseinstallations.googleapis.com","https://sentry.io","https://*.ingest.sentry.io","https://api-iam.intercom.io","https://uploads.intercomcdn.com","wss://*.intercom.io","https://*.intercom.io","https://*.intercomcdn.com","https://securetoken.googleapis.com","https://api.mixpanel.com","https://heapanalytics.com","https://firebasestorage.googleapis.com","https://www.google-analytics.com","https://hits-i.iubenda.com","https://canny.io/api/users/identify","https://webflow.com","https://cdn.dreamdata.cloud","https://firebaselogging-pa.googleapis.com/","https://*.posthog.com/"],"mode":"malformed","valid":false,"restrictive":false,"broadSources":[]} expected="valid restrictive enforcing frame-ancestors" issue="frame-ancestors contains invalid source expressions: http://localhost:1235/, https://*.avo-dev.app/, https://*.avo.app/, wss://*.intercom.io, https://canny.io/api/users/identify, https://firebaselogging-pa.googleapis.com/, https://*.posthog.com/."FAILframe-ancestors contains invalid source expressions: http://localhost:1235/, https://*.avo-dev.app/, https://*.avo.app/, wss://*.intercom.io, https://canny.io/api/users/identify, https://firebaselogging-pa.googleapis.com/, https://*.posthog.com/.Validate X-Frame-Options [fail]! X-Frame-Options is not DENY or SAMEORIGIN.INFOValidate X-Frame-OptionsINFORead X-Frame-Options fallback value="SAMEORIGIN SAMEORIGIN" parsedValues=["SAMEORIGIN SAMEORIGIN"] normalizedValues=["sameorigin sameorigin"]FAILCompare X-Frame-Options value actual="invalid" expected="DENY or SAMEORIGIN" valid=false obsoleteAllowFrom=false duplicateOrConflicting=false issue="X-Frame-Options is not DENY or SAMEORIGIN."FAILX-Frame-Options is not DENY or SAMEORIGIN.Review CSP and XFO interaction [warning]! CSP frame-ancestors controls modern browser behavior, but the X-Frame-Options fallback is invalid or conflicting.INFOReview CSP and XFO interactionINFOCompare modern CSP and legacy XFO behavior modernBrowserMechanism="csp-frame-ancestors" cspOverridesXfo=true cspMode="malformed"WARNCheck CSP/XFO policy alignment actual="aligned or single mechanism" expected="no conflicting framing policy" issue="CSP frame-ancestors controls modern browser behavior, but the X-Frame-Options fallback is invalid or conflicting."WARNCSP frame-ancestors controls modern browser behavior, but the X-Frame-Options fallback is invalid or conflicting.Review observed browser responses [warning]! One or more same-origin HTML documents observed by Chrome did not emit valid frame protection.INFOReview observed browser responsesINFOSample Chrome-observed same-origin responses observedResponseCount=65 sameOriginCount=1 htmlDocumentCount=1WARNCompare observed HTML frame protection actual={"missingOrInvalidFrameProtectionCount":1,"broadFrameAncestorsCount":0,"affected":[{"url":"https://www.avo.app/","status":200,"resourceType":"document","contentType":"text/html; charset=utf-8","contentSecurityPolicy":"base-uri https://*.avo.app; default-src 'self'; script-src 'self' 'nonce-b35ZEWRHBxRTaQWxbufecW02M63odmzN' 'strict-dynamic' https://cdn.avo.app https://www.googletagmanager.com https://*.googletagmanager.com https://cdn.segment.com https://*.mxpnl.com https://edge.fullstory.com https://rs.fullstory.","contentSecurityPolicyReportOnly":null,"xFrameOptions":"SAMEORIGIN SAMEORIGIN"}]} expected="0 missing/invalid or broad same-origin HTML responses" issue="One or more same-origin HTML documents observed by Chrome did not emit valid frame protection."WARNOne or more same-origin HTML documents observed by Chrome did not emit valid frame protection.
AccessibilityAccessibilityBrowser audit
Buttons must have discernible text
100 Fail
AccessibilityAccessibilityBrowser audit
Buttons must have discernible text
Check name
Buttons must have discernible text
Score
0/100
Status
fail
Device
desktop
Category
Accessibility
Fix guidance
Buttons must have discernible text
Evidence
{
"ruleId": "button-name",
"impact": "critical",
"description": "Ensure buttons have discernible text",
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
{
"truncated": true,
"omittedCount": 4,
"originalCount": 12
}
],
"affectedNodeCount": 5,
"nodes": [
{
"target": [
".phone-left > .phone-frame > .phone-screen > .phone-header > .phone-header-back"
],
"html": {
"discarded": true,
"reason": "[discarded fetched document data]",
"originalType": "string",
"originalLength": 186
},
"failureSummary": "Fix any of the following:\n Element does not have inner text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"target": [
".phone-left > .phone-frame > .phone-screen > .phone-header > .phone-header-basket"
],
"html": {
"discarded": true,
"reason": "[discarded fetched document data]",
"originalType": "string",
"originalLength": 187
},
"failureSummary": "Fix any of the following:\n Element does not have inner text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"target": [
".phone-right > .phone-frame > .phone-screen > .phone-header > .phone-header-back"
],
"html": {
"discarded": true,
"reason": "[discarded fetched document data]",
"originalType": "string",
"originalLength": 186
},
"failureSummary": "Fix any of the following:\n Element does not have inner text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"target": [
".phone-right > .phone-frame > .phone-screen > .phone-header > .phone-header-basket"
],
"html": {
"discarded": true,
"reason": "[discarded fetched document data]",
"originalType": "string",
"originalLength": 187
},
"failureSummary": "Fix any of the following:\n Element does not have inner text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"target": [
".toggle-switch"
],
"html": {
"discarded": true,
"reason": "[discarded fetched document data]",
"originalType": "string",
"originalLength": 94
},
"failureSummary": "Fix any of the following:\n Element does not have inner text that is visible to screen readers\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
]
}Sign in to see 37 other issues and the full report
Create a free account to unlock every issue, evidence details, exports, and higher free limits.
Fix with MCP or CLI
Use this report as the handoff into remediation. Generate a coding-agent prompt with the failing checks attached, or jump to the MCP and CLI setup docs before your next rescan.
Score history