SEO Audit Report
SEO Audit · morrowvault.com

Full-Site SEO
Audit 2026

MorrowVault — a private check-in app and personal message vault for final messages, voice notes and video, triggered by silence rather than death alone. Audited across all 13 HTML pages via local source analysis, live testing, Google field data (GSC / GA4 / PSI) and Playwright desktop & mobile capture.

2026-07-18 13 pages · EN Static SSR · Vercel Edge 30 tasks
82
/ 100
Health Score · Good
Technical
88
Content / E-E-A-T
74
On-Page / SXO
88
Schema
86
Performance
96
AI / GEO
61
Images
68
01 · Category Scores

Scores by Dimension

MorrowVault sits on an unusually solid technical base: fully server-rendered static HTML on Vercel edge (3 ms TTFB), near-perfect Core Web Vitals, complete structured data, clean robots / canonical / sitemap, all AI crawlers allowed, llms.txt live, and 12/12 pages indexed by Google with zero errors. The points lost are almost entirely on the content and commercial side, not the technical one: weak authority and product-trust signals, near-zero multimodal and brand-entity presence for AI search, and a single waitlist CTA with no pricing. Scoring is calibrated as a non-YMYL emotional consumer product — trust is judged by privacy transparency, real authorship and user feedback, not by legal/financial compliance artifacts.

96
Performance (CWV)weight 10%

LCP 1.1–1.3 s mobile, CLS ~0, TTFB 3 ms, 60 KB page weight over 5 requests. Only two small wins left.

88
Technical SEOweight 22%

Clean crawl/index setup end to end; deductions come from 'unsafe-inline' CSP, passive IndexNow and minor redirect/HSTS gaps.

88
On-Page SEOweight 20%

One clean H1 per page, all titles 46–57 chars, full canonical and OG coverage; five descriptions run long.

86
Schema Structured Dataweight 10%

25+ JSON-LD blocks, 100% valid, no deprecated types; the dangling Article.publisher @id is the main defect.

74
Content / E-E-A-Tweight 23%

Strong Experience & Trust (real founder byline, honest privacy policy); E-E-A-T ≈63 held back by zero third-party endorsement and no at-rest encryption disclosure.

68
Imagesweight 5%

No missing alt text anywhere, but the site carries zero content imagery — no product screenshots at all.

61
AI Search Readiness (GEO)weight 10%

Crawler access is excellent (90/100), but multimodal is 22/100 and brand-entity signal 35/100 — nothing for an AI to cite visually or verify externally.

Bottom Line

Fix the GA4 tracking defect (T1) first — organic traffic is currently 100% misattributed to Direct, so every downstream traffic analysis is untrustworthy. Then take the two cheapest high-yield wins: rewrite title/description on the five pages already ranking on page one with 0% CTR (T6) and add defer to icons.js/footer.js (T7). After that, the structural work: unblock the mobile hero CTA hidden behind the cookie banner (T4), state at-rest encryption for a product that calls itself a private vault (T11), and close the keyword/topic mismatch on what-happens-to-accounts-when-you-die (T5).

02 · Task List (Single Source of Truth)

30 Fixes

Order by number (e.g. "how do we fix T5"). By default the audit delivers findings only — no code is changed until you assign a task. Status: ⬜ Open · 🔄 In Progress · ✅ Done.

2
CRITICAL · NOW
9
HIGH · THIS WEEK
14
MEDIUM · THIS MONTH
5
LOW · BACKLOG
CriticalNow
#ItemStatus
T1Analytics — Fix GA4 tracking: switch to Consent Mode v2 and restore organic channel attribution (currently 100% misread as Direct)⬜ Open
T4Visual / UX — Stop the mobile cookie banner from covering the CTA; move the homepage mobile primary CTA above the fold⬜ Open
HighThis week
#ItemStatus
T5SXO / Contentwhat-happens-to-accounts-when-you-die keyword/topic mismatch → retarget to a precise long-tail term, or add a bank/financial-accounts section with intent splitting⬜ Open
T6On-Page / GSC — Rewrite title/description on the 5 pages ranking page-one with 0% CTR (emergency-access 5.8, final-messages 6.9, dead-mans-switch-alternative 7.4, check-in-without-location 8.2, digital-legacy-vault 14.5)⬜ Open
T7Performance — Add defer to the icons.js/footer.js script tags (mobile Speed Index 3.8s → ~2.5s)⬜ Open
T8Performance / Images — Convert og-default.png (252 KB) to WebP/AVIF under 100 KB⬜ Open
T9Schema — Fix the dangling Article.publisher @id on 9 landing pages (inline name/logo)⬜ Open
T10On-Page — Trim 5 over-length meta descriptions to ≤160 chars (letter 202, elderly 195, dms-email 195, about 172, accounts 165)⬜ Open
T11Product Trust — Document encryption at rest and related data-security handling — the core trust point for a "private vault" holding voice, video and final messages (unrelated to YMYL); optionally cite GDPR/CCPA terms⬜ Open
T12Content / E-E-A-T — Add clickable source links to the cited statistics (Euromonitor / Pew) and re-check freshness of the 2023 figures⬜ Open
T13Content / E-E-A-T — Start collecting and displaying beta-user testimonials / external endorsement (authority signal is currently near zero)⬜ Open
MediumThis month
#ItemStatus
T2Content / Trust — Add a Terms of Service page + footer link + sitemap entry (the product has paid plans and a content-release mechanism, so basic user terms are good practice, not a legal compliance requirement)⬜ Open
T14GEO / Images — Multimodal: add 1–2 real product screenshots (with descriptive alt) to the homepage and each of the 3 core pages⬜ Open
T15GEO / SXO — Convert the generic comparison content into a real <table> and name actual competitors (Vital Watchdog / Cipherwill / DGLegacy / GoodTrust / Evaheld)⬜ Open
T16GEO — Establish the brand entity: LinkedIn / YouTube company pages + sameAs on Organization schema⬜ Open
T17GEO — Expand FAQ answers back to 150–220 words (the long-form text already exists in llms.txt); keep visible FAQ and schema in sync⬜ Open
T18Schema / GEO — Add HowTo JSON-LD to pages that contain numbered steps⬜ Open
T19GEO / Technical — Add the missing /digital-legacy-vault to llms.txt and sitemap; verify all three content inventories match⬜ Open
T20Content / E-E-A-T — Build a standalone Trust & Security page (security architecture, data regions, disaster recovery, certification roadmap)⬜ Open
T21Content / E-E-A-T — Bring in 1–2 domain advisors for endorsement; add professional review/disclaimer notes to sensitive articles⬜ Open
T22Technical / Security — Remove 'unsafe-inline' from CSP (externalise the 3 inline scripts into .js files)⬜ Open
T23Schema — Normalisation: operatingSystem to a string, contactType → "customer service", add mentions:{@id:#app} to Article⬜ Open
T24Technical — Wire active IndexNow submission into the deploy pipeline (indexnow_submit.py)⬜ Open
T25SXO / Commercial — Evaluate publishing a price range / early-bird pricing (closes the Action gap on commercial-intent pages)⬜ Open
T26On-Page / UX — Show visible published/updated dates; add a mobile hamburger menu; bring all tap targets to ≥48px⬜ Open
LowBacklog
#ItemStatus
T3Content / Transparency — Add operator and contact transparency (who runs it, how to reach them) to the privacy policy and footer (not a legal-entity registration requirement)⬜ Open
T27Technical — Add includeSubDomains; preload to HSTS; eliminate the 3-hop www+.html redirect chain; drop the non-standard IndexNow: line from robots.txt⬜ Open
T28Technical / Performance — Pre-compile icons to inline SVG at build time (removes the CLS risk and retires icons.js); fix the style-hover dead code⬜ Open
T29Technical — Confirm the relationship between morrowvault.app and the main domain to avoid duplicate content / diluted authority⬜ Open
T30Content — Moderate the repeated brand phrasing to reduce the "AI-written" feel; add a support prompt to verify-contact-result; add verifiable external identity links to About⬜ Open
03 · Category Detail

Findings by Dimension

88

Technical SEO

Crawl · Index · Security · Rendering
What Works

Minimal, open robots.txt declaring both Sitemap and IndexNow; self-referencing canonicals across the site with canonical / vercel.json / sitemap in perfect three-way agreement; privacy and verify-contact-result correctly noindex and excluded from the sitemap; single-hop 301/308 redirects in all normal cases; a solid security header baseline (HSTS / CSP / X-Frame / nosniff); all core content, navigation, metadata and JSON-LD present in the raw HTML with no JS-rendering dependency; clean mobile rendering verified live.

  • HighCSP relies on 'unsafe-inline' — three inline scripts (waitlist form, slide-to-confirm demo, scroll animation) render the XSS protection ineffective. Externalise them, then tighten script-src (application/ld+json is unaffected). · T22
  • MedIndexNow is declared statically but never actively pushed — the key file is in place with no deploy hook calling the API on update. · T24
  • MedClient-side icon replacement carries a mild CLS risk: <i data-lucide> reserves no box dimensions. Pre-compile to inline SVG at build time. · T28
  • MedHSTS is missing includeSubDomains; preload; the edge www+.html combination produces a 3-hop chain; the IndexNow: line in robots.txt is flagged as an invalid directive by Lighthouse (dragging the Lighthouse SEO score to 92). · T27
74

Content Quality / E-E-A-T

Experience · Expertise · Authority · Trust — E-E-A-T ≈63, non-YMYL calibrated

Classification: an emotional consumer product, not judged under the legal/financial/estate YMYL framework. Trust is measured the way this product should be measured — privacy transparency, a real author with real lived experience, data-security disclosure, user feedback. For an emotional product the founder's personal experience is itself the most relevant experience/expertise signal; legal or compliance credentials are not required.

What Works

Every landing page carries a visible author byline (Tim Wang, Founder, with genuine personal backstory — not schema-only); the About page contains a full founder narrative plus Person schema; all content pages hit 1,600–2,100 words without padding; FAQs are written independently per page; a clear product-boundary statement appears site-wide ("Not a legal will or estate-planning service."); the privacy policy is detailed and honestly discloses what the product does not do. Experience and Trust are consequently already strong.

  • HighNo data-security disclosure — the site markets a "private vault" for voice, video and final messages yet mentions only encryption in transit, never at rest. This is the product's core trust point (unrelated to YMYL): users need a reason to believe their content is safely kept long-term. · T11
  • HighWeak authority — no user reviews, press or third-party endorsement, and sameAs is empty. Normal for a pre-launch product, but still the main drag on E-E-A-T; close it as soon as you launch. · T13
  • HighCited statistics carry no source links (Euromonitor and Pew both appear as bare text; the Pew figure is marked 2023 and needs a freshness check). · T12
  • MedNo Terms of Service — with paid plans and a content-release mechanism, basic user terms are good practice (not a hard legal-compliance item). · T2
  • MedThe founder could add soft expertise signals — the personal experience is already strong Experience; optionally add a line on design philosophy, or a bereavement/peer-support perspective, to lift perceived Expertise (legal or estate-planning credentials are not expected). · T21
  • LowAdd operator contact transparency; show visible publish dates; optionally build a Trust/Security section; moderate the repeated brand phrasing to reduce the "AI-written" feel. · T3 / T26 / T20 / T30
88

On-Page SEO

Titles · Descriptions · Headings · Internal Links
What Works

One unique H1 per page with a clean heading hierarchy; every title lands in the 46–57 character range; canonical coverage is complete; internal linking is healthy (33 links on the homepage, ~21 on landing pages); OG and Twitter Card tags are complete; no <img> anywhere is missing alt text.

  • MedFive meta descriptions run long enough to be truncated in the SERP (letter 202 / elderly 195 / dms-email 195 / about 172 / accounts 165 characters). · T10
  • Lowverify-contact-result has no description (already noindex, so impact is minimal). · T30
86

Schema Structured Data

JSON-LD · Entity Graph · Rich Results
What Works

25+ JSON-LD blocks site-wide, 100% syntactically valid with no deprecated types; a well-formed @graph entity graph on the homepage; nine landing pages consistently ship FAQPage + Article + BreadcrumbList; Article.author is fully inlined; the Offer honestly declares PreOrder.

  • HighArticle.publisher points at a dangling @id — the complete Organization node exists only on the homepage, so a per-page parser cannot resolve it (paste-ready fix in findings/schema.md). · T9
  • MedoperatingSystem should be a string rather than an array; contactType should be "customer service"; landing-page Article nodes should add mentions:{@id:#app}. · T23
  • MedNo HowTo schema, despite several pages containing numbered step sequences. · T18
  • InfoFAQPage rich results were retired site-wide by Google in May 2026, but the markup still helps AI citation — keep it.
96

Performance / Core Web Vitals

Lab data — CrUX has no field data for this site
MetricHomepage (mobile / desktop)Landing pages (mobile / desktop)Threshold
LCP1.3s / 0.4s1.1s / 0.3s≤2.5s ✅
CLS0 / 0.00060 / 0≤0.1 ✅
TBT (≈INP)23–70ms / 0ms0ms / 0ms
TTFB3ms3ms
Lighthouse Perf98 / 100100 / 100
What Works

Total page weight is just 60 KB / 56 KB across 5 requests; fonts are self-hosted woff2 with preload and font-display:optional; Google Analytics loads asynchronously behind the consent gate. Note: CrUX returns no field data for this site (Chrome traffic below threshold), so the figures above are PSI/Lighthouse lab values.

  • MedAdd defer to icons.js / footer.js — mobile Speed Index drops from 3.8s to roughly 2.5s for a one-line change. · T7
  • Lowog-default.png is 252 KB — convert to WebP. · T8
61

AI Search Readiness / GEO

AI Overviews · ChatGPT · Perplexity · Bing Copilot
What Works

Technical accessibility scores 90/100: GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot and Google-Extended all return 200 in live testing; server-rendered static HTML is ideal for AI crawlers; llms.txt is live (29 KB); FAQ and Article schema plus visible bylines are in place. Directional platform readiness: Perplexity ~60 / ChatGPT ~58 / Google AIO ~55 / Bing Copilot ~45.

  • CritMultimodal content is effectively absent (22/100) — zero screenshots, zero video, only two comparison tables across the entire site. · T14 / T15
  • CritBrand entity signal is zero (35/100) — no sameAs, no external home for the brand anywhere. · T16
  • CritFAQ answers are too short at 63–104 words versus the 134–167 word citation sweet spot — the long-form answers already exist in llms.txt and can simply be moved back onto the pages. · T17
  • HighSite-level schema is not inlined across pages; llms.txt and sitemap both omit /digital-legacy-vault; HowTo markup is missing. · T19 / T23 / T18
68

Images

Alt Text · Formats · Weight · Content Imagery
What Works

No image on the site is missing alt text, and image weight is not hurting Core Web Vitals — the whole site loads in 60 KB.

  • HighNo content imagery at all — zero product screenshots or video across 13 pages. This is simultaneously the biggest GEO gap and the biggest conversion gap. · T14
  • Medog-default.png at 252 KB should be served as WebP/AVIF under 100 KB. · T8
54

Search Experience / SXO

Intent match · Persona scoring — average across 5 pages, unweighted
PageIntent matchSXO gapPrimary issue
letter-to-be-opened-after-deathALIGNED65No downloadable template, no authoritative citations
dead-mans-switch-alternativeMEDIUM55Generic comparison table, zero security signals
digital-legacy-vaultMEDIUM-HIGH53Behind competitors that have already launched
check-in-app-for-elderly-parentsHIGH49Should be a landing page; competitors publish prices
what-happens-to-accounts-when-you-dieCRITICAL48Keyword/topic mismatch (T5)
  • CritMost severe: for that keyword the top 8 SERP results are Bankrate, PNC and law firms discussing what happens to bank accounts after death, while the page discusses digital entertainment accounts — near-zero semantic overlap against a strongly YMYL SERP. Retarget to a precise long-tail term. · T5
  • HighSystemic issue 1 — a single site-wide CTA ("Join the waitlist"), no pricing and no shippable product, which caps conversion on commercial-intent pages. · T25
  • HighSystemic issue 2 — zero screenshots or video to demonstrate the product. · T14
  • HighSystemic issue 3 — comparison tables use generic categories instead of naming real competitors. · T15
71

Visual & Mobile

Above the fold · Tap targets · Rendering — unweighted
What Works

Desktop is strong: visual hierarchy, whitespace and the warm green palette suit a sensitive subject well, and landing pages carry the founder byline in the desktop viewport without scrolling.

  • HighThe cookie banner (fixed, z-index 9999, 118 px tall) covers the mobile viewport — homepage body copy is clipped at the bottom and the secondary CTA on landing pages is squeezed by roughly 28 px. · T4
  • HighThe homepage mobile primary CTA sits below the fold (y=796 in an 812 px viewport), requiring 200 px+ of scrolling. · T4
  • MedTap targets are undersized (nav CTA 38 px, cookie buttons 35 px, against a 44–48 px minimum), and there is no hamburger menu on mobile. · T26
  • InfoScroll fade-in animations leave full-page screenshots blank (the content is still in the DOM). Honour prefers-reduced-motion and add a no-JS fallback.

Google Field Data (GSC / GA4 / CrUX)

Real Google data — Tier 2
What Works

Indexation is healthy: the sitemap submits 12 URLs with zero errors, URL Inspection returns PASS on 12/12 pages, and canonicals agree throughout. GSC over the last 28 days (≈ the last 90, as the site is new): 2 clicks, 188 impressions, 1.06% CTR, average position 27.0. CrUX confirms no field data — a traffic-volume issue, not a technical one.

  • CritGA4 tracking defect — GSC records real clicks, yet GA4 reports Organic = 0 over both 28 and 90 days, with all 92 sessions attributed to Direct. Root cause located in footer.js: GA4 (G-D6PDQSLKC2) only loads gtag.js after the user clicks "Accept" on the cookie banner, so (1) visitors who decline or ignore the banner are never recorded, and (2) the delayed load means document.referrer has already become an internal self-reference by first fire, which is then misread as Direct. Fix with Consent Mode v2. Until this is fixed, treat GA4 organic numbers as unusable and rely on GSC. · T1
  • HighQuick win — five pages already rank on page one but convert 0% of impressions: /emergency-access-for-family (5.8), /final-messages (6.9), /dead-mans-switch-alternative (7.4), /check-in-app-without-location-tracking (8.2), /digital-legacy-vault (14.5). The ranking is already there; only the title and description need rewriting. · T6
  • LowIncidental finding — /about receives a referral link from morrowvault.app; confirm the relationship between the two domains. · T29