GBP/Local-First Audit Mode (No-Website Clients) GBP/Local-First Audit Mode (No-Website Clients) Implemented: MC #102861 (2026-06-03) Driver: First real client Smoke House Hadžići (no website, GBP-only) via partner Asmir Status: PASS — type-check, build, validate:phase4, validate:phase5, validate:gbp-local Overview The SEO Readiness Portal now supports clients who do not have a website and rely solely on Google Business Profile (GBP) as their primary online presence. This is a common scenario for small local businesses (restaurants, trades, services). When a client is detected as no-website , the audit runner switches into GBP-first mode and runs a different checklist tailored to local optimization best practices. Detection Logic No-website mode is activated when: intake.hasWebsite === false (explicit opt-in), OR site.canonicalUrl is empty or blank (implicit) The detection is implemented in src/lib/audit/runner.ts function isNoWebsiteMode(site, intake) . New Intake Fields (Optional, Non-Breaking) Three new fields have been added to the Intake type ( src/lib/workspace/types.ts ): Field Type Purpose hasWebsite boolean? Explicit override: when false, forces no-website mode even if canonicalUrl is not empty gbpClaimed boolean? Whether the business owner has claimed the GBP listing gbpManagerAccess boolean? Whether ALAI/partner has been added as a manager to the GBP listing All three are optional and undefined-safe . Existing fixtures and validations are unaffected. GBP-First Checklist (12 Checks) When no-website mode is active, the audit runs the following checks instead of website-dependent checks: Check ID Severity Category Description intake-not-submitted P1 evidence Intake must be submitted or reviewed before workspace is review-ready gbp-first-strategy P1 local Strategy finding: recommends GBP-first approach + optional simple-site later gbp-not-claimed P0 local Business owner has not claimed the GBP listing → cannot manage or optimize gbp-manager-access-missing P1 local ALAI/partner not added as manager → cannot perform optimization work gbp-claim-status-unknown P1 local Claim/manager status not confirmed → action recommended to clarify gbp-nap-url-missing P1 local GBP URL not recorded → NAP consistency cannot be verified gbp-primary-category-missing P2 local Priority services missing → cannot determine correct GBP primary category gbp-hours-not-confirmed P2 local Business hours not confirmed → can reduce customer trust gbp-photos-not-confirmed P2 local Photos not confirmed → profiles with photos attract more engagement gbp-review-routine-not-confirmed P2 local Review response routine not set → important trust/engagement signal gbp-posts-not-confirmed P2 local GBP posts activity not confirmed → posts keep profile active and relevant missing-priority-services P2 content Priority services missing → needed for page/backlog recommendations missing-competitors P2 content Competitor list missing → needed for manual review context access-status-unknown P2 evidence Analytics/Search Console access status unknown Total: 12 checks in no-website mode vs. 6 in standard website mode. Skipped Website-Dependent Checks The following checks are conditionally skipped in no-website mode: httpsCanonicalCheck — requires canonicalUrl domainMatchCheck — requires canonicalUrl and domain These are replaced by the GBP-specific checks above. Report/Backlog/Export Flow GBP-first findings flow through the existing report/backlog/export workflow with no changes: Findings are categorized (new local category introduced) Backlog conversion works as normal Markdown export includes all GBP findings No-ranking disclaimer is preserved Validation Scripts A new fixture script validates the no-website path: npm run validate:gbp-local This runs scripts/validate-gbp-local.ts which: Creates a test client with empty canonicalUrl Runs the local audit in no-website mode Asserts exactly 12 checks are run Confirms gbp-first-strategy finding is present Existing validations remain unchanged and passing: npm run validate:phase4 — standard website path (6 checks) npm run validate:phase5 — report generation GBP API Integration (Deferred) Important operator note: This is a manual-input MVP . The portal does not integrate with the Google Business Profile API to fetch live data (photos count, reviews count, hours, etc.). All GBP checks rely on: Intake fields ( gbpClaimed , gbpManagerAccess , googleBusinessProfileUrl ) Intake notes (hours/photos/reviews confirmed via text patterns) Live GBP API integration is a follow-on scope , likely in parallel with Google Search Console/Analytics integration (MC #102806 deferred). Safe Defaults All GBP checks follow a fail-closed philosophy: If a field is undefined or unknown → emit an "action recommended" finding (P1 or P2) Never emit a false pass Example: if gbpClaimed is undefined , the check emits gbp-claim-status-unknown (P1) asking the operator to confirm with the client. Implementation Evidence Source: src/lib/audit/runner.ts lines 124-437 Types: src/lib/workspace/types.ts lines 54-63 Fixture: scripts/validate-gbp-local.ts Validation: npm run validate:gbp-local passes Build: npm run type-check and npm run build pass Summary The SEO Readiness Portal now handles two client profiles : Website clients (existing path) — 6 checks, website-dependent validation No-website / GBP-only clients (new path) — 12 checks, GBP-first optimization Detection is automatic based on canonicalUrl or explicit hasWebsite flag. Both paths use the same report/backlog/export workflow. No breaking changes to existing fixtures or validations.