{"id":369,"date":"2026-05-25T15:17:34","date_gmt":"2026-05-25T15:17:34","guid":{"rendered":"https:\/\/saveyourclicks.com\/blog\/build-diaries\/auditing-landing-page-redesign-13-seo-bugs\/"},"modified":"2026-05-25T15:20:17","modified_gmt":"2026-05-25T15:20:17","slug":"auditing-landing-page-redesign-13-seo-bugs","status":"publish","type":"post","link":"https:\/\/saveyourclicks.com\/blog\/en\/build-diaries\/auditing-landing-page-redesign-13-seo-bugs\/","title":{"rendered":"Auditing a Landing Page Redesign: 13 SEO Bugs You&#8217;ll Hit"},"content":{"rendered":"\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link rel=\"stylesheet\" media=\"print\" onload=\"this.media='all';this.onload=null\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700;800&#038;display=swap\">\n\n<noscript><link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;700;800&#038;display=swap\"><\/noscript>\n\n<style>html{scroll-behavior:smooth;scroll-padding-top:32px}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}.bd-article{--bg:#ffffff;--bg-alt:#f8fafc;--bg-dark:#0a0f1e;--primary:#3b82f6;--primary-dark:#2563eb;--accent:#8b5cf6;--accent-soft:#faf5ff;--gradient:linear-gradient(135deg,#3b82f6,#8b5cf6);--text:#0f172a;--text-2:#475569;--text-muted:#94a3b8;--text-light:#f1f5f9;--border:#e2e8f0;--border-strong:#cbd5e1;--good:#16a34a;--good-bg:#dcfce7;--warn:#dc2626;--warn-bg:#fee2e2;--warn-soft:#fef2f2;--code-bg:#f1f5f9;--radius:12px;--radius-lg:16px;--shadow-sm:0 1px 2px rgba(15,23,42,.04);--shadow:0 4px 12px rgba(15,23,42,.06);--shadow-lift:0 12px 32px rgba(15,23,42,.08);--ease:cubic-bezier(.22,1,.36,1);font-family:'Inter',-apple-system,BlinkMacSystemFont,sans-serif;color:var(--text);background:var(--bg);line-height:1.65;-webkit-font-smoothing:antialiased;font-weight:400}.bd-article *,.bd-article *::before,.bd-article *::after{box-sizing:border-box}.bd-article p{margin:0 0 1em}.bd-article p:last-child{margin-bottom:0}.bd-article a{color:var(--primary-dark);text-decoration:none;transition:color .15s var(--ease)}.bd-article a:hover{color:var(--primary)}.bd-article code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.92em;background:var(--code-bg);color:var(--text);padding:.1em .4em;border-radius:4px;border:1px solid var(--border)}.bd-article em{font-style:normal;color:var(--primary-dark);font-weight:600}.bd-container{max-width:840px;margin:0 auto;padding:0 24px}.bd-article .bd-hero{background:var(--bg-dark);color:var(--text-light);padding:88px 0 72px;position:relative;overflow:hidden}.bd-article .bd-hero::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 70% 50% at 50% -10%,rgba(59,130,246,.18),transparent 60%),radial-gradient(ellipse 50% 40% at 90% 90%,rgba(139,92,246,.14),transparent 60%);pointer-events:none}.bd-article .bd-hero > .bd-container{position:relative;z-index:1}.bd-article .bd-eyebrow{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;margin-bottom:28px;background:rgba(59,130,246,.1);border:1px solid rgba(59,130,246,.25);border-radius:50px;font-size:13px;font-weight:600;color:#93c5fd}.bd-article .bd-eyebrow time{color:var(--text-muted);font-weight:400}.bd-article .bd-dot{width:6px;height:6px;border-radius:50%;background:#22c55e;animation:bd-pulse 2s ease-in-out infinite}@keyframes bd-pulse{0%,100%{opacity:1}50%{opacity:.4}}.bd-article .bd-hero h1{font-size:clamp(32px,5.5vw,52px);font-weight:800;letter-spacing:-.025em;line-height:1.12;color:var(--text-light);margin:0 0 20px}.bd-article .bd-grad{background:var(--gradient);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}.bd-article .bd-lead{font-size:18px;color:var(--text-muted);line-height:1.7;max-width:680px;margin:0 0 40px}.bd-article .bd-honesty{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px;padding-top:32px;border-top:1px solid rgba(255,255,255,.08);margin:0}.bd-article .bd-honesty > div{display:flex;flex-direction:column-reverse;gap:4px;min-width:0}.bd-article .bd-honesty dt{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em;margin:0;font-weight:600}.bd-article .bd-honesty dd{font-size:24px;font-weight:800;color:var(--text-light);margin:0;letter-spacing:-.02em;line-height:1.1}.bd-article .bd-timeline{padding:72px 0 32px;background:var(--bg)}<\/style>\n\n<link rel=\"stylesheet\" media=\"print\" onload=\"this.media='all';this.onload=null\" href=\"\/blog\/wp-content\/uploads\/build-diaries\/auditing-landing-page-redesign-13-seo-bugs.css?v=2c1f1a86\">\n<noscript><link rel=\"stylesheet\" href=\"\/blog\/wp-content\/uploads\/build-diaries\/auditing-landing-page-redesign-13-seo-bugs.css?v=2c1f1a86\"><\/noscript>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Auditing a Landing Page Redesign: 13 SEO Bugs You'll Hit\",\n  \"description\": \"A timestamped build diary auditing a pre-launch SaaS landing page redesign. Three bugs, three breakthroughs, one dead end \u2014 including the moment we discovered an entire content block was about the wrong product.\",\n  \"author\": { \"@type\": \"Person\", \"name\": \"Yusof Ansari\", \"url\": \"https:\/\/saveyourclicks.com\/\" },\n  \"publisher\": { \"@type\": \"Organization\", \"name\": \"Save Your Clicks\", \"url\": \"https:\/\/saveyourclicks.com\/\", \"logo\": { \"@type\": \"ImageObject\", \"url\": \"https:\/\/saveyourclicks.com\/assets\/logo.png\" } },\n  \"datePublished\": \"2026-05-25\",\n  \"dateModified\": \"2026-05-25\",\n  \"articleSection\": \"Build Diaries\",\n  \"keywords\": \"on-page seo audit, landing page seo, open graph tags, heading hierarchy, topical relevance, cms redesign, build diary\"\n}\n<\/script>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    { \"@type\":\"Question\",\"name\":\"What is topic drift in a CMS redesign?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"When a CMS template is reused across sibling pages, the body copy of one page can end up on a page about a different product. Google reads the largest body-text block as the strongest topical signal \u2014 so a virtual-staging page whose biggest text block is about item removal ranks for neither well. The fix is to audit every text block against the page's actual H1 intent.\"}},\n    { \"@type\":\"Question\",\"name\":\"How do you find broken topical signals on a landing page?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Extract every heading and large body block into a flat list, then check each one against the H1's primary keyword. If a block doesn't share at least one keyword from the H1 cluster, flag it. We caught two entire sections that way \u2014 a stats H2 about a different product, and a 200-word SEO block written for a sibling page.\"}},\n    { \"@type\":\"Question\",\"name\":\"Should Open Graph tags use property or name attributes?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Open Graph tags use property: og:title, og:description, og:image, og:url. Twitter Card tags use name: twitter:card, twitter:title, twitter:image. Standard meta tags (description, robots, author) also use name. Most CMS Page SEO panels have a dropdown to pick between the two \u2014 picking the wrong one causes Facebook and LinkedIn to silently ignore the tag.\"}},\n    { \"@type\":\"Question\",\"name\":\"Why use only Google Keyword Planner for a landing page audit?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Google Keyword Planner reports the same volumes Google's own ranking system sees, with no third-party model layered on top. Ahrefs and SEMrush estimate from clickstream data \u2014 useful for competitor research but noisy for absolute volume. For content writing decisions on a single page, GKP's competition index lets you spot low-competition long-tail terms that the bigger tools smooth over.\"}},\n    { \"@type\":\"Question\",\"name\":\"How long should a pre-launch landing page audit take?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"For a single landing page with full keyword research and competitor SERP review: 90 minutes to 3 hours. This one was 2 hours and 6 minutes. The biggest variable is whether the page has topic drift \u2014 rewriting body copy after finding wrong-topic blocks accounts for most of the time. Heading-only audits run under an hour but miss the most important issues.\"}}\n  ]\n}\n<\/script>\n\n<article class=\"bd-article\">\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 HERO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <header class=\"bd-hero\">\n    <div class=\"bd-container\">\n      <p class=\"bd-eyebrow\"><span class=\"bd-dot\" aria-hidden=\"true\"><\/span>Build Diary \u00b7 03 \u00b7 <time datetime=\"2026-05-25\">May 25, 2026<\/time><\/p>\n      <p class=\"bd-hero-title\">Auditing a <span class=\"bd-grad\">landing page redesign<\/span> before launch \u2014 13 SEO bugs, every minute timestamped.<\/p>\n      <p class=\"bd-lead\">A 2-hour chat-driven SEO audit on a pre-launch SaaS landing page. Three bugs, three breakthroughs, one dead end. Including the moment we found an entire body-text block written about a different product \u2014 and the moment a single-tool keyword constraint surfaced a zero-competition keyword the big tools missed.<\/p>\n\n      <dl class=\"bd-honesty\" aria-label=\"Build summary\">\n        <div><dt>Build time<\/dt><dd><span class=\"bd-num\">2h 06m<\/span><\/dd><\/div>\n        <div><dt>Bugs fixed<\/dt><dd><span class=\"bd-num\">3<\/span><\/dd><\/div>\n        <div><dt>Breakthroughs<\/dt><dd><span class=\"bd-num\">3<\/span><\/dd><\/div>\n        <div><dt>Dead ends<\/dt><dd><span class=\"bd-num\">1<\/span><\/dd><\/div>\n      <\/dl>\n    <\/div>\n  <\/header>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TIMELINE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <main class=\"bd-timeline\">\n    <div class=\"bd-container\">\n\n      <ol class=\"bd-rail\" aria-label=\"Build timeline\">\n\n        <!-- \u2500\u2500 Milestone: start \u2500\u2500 -->\n        <li class=\"bd-event bd-milestone\" id=\"start\">\n          <time class=\"bd-event-time\" datetime=\"PT0M\">+0:00<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\">Start<\/p>\n            <h2>The plan: audit a redesigned landing page before it goes live.<\/h2>\n            <p>A real-estate SaaS had redesigned the landing page for their main product and asked for an SEO review before pushing it to production. The page was beautiful \u2014 better hero, cleaner stats, animated step-by-step &#8220;how it works&#8221; cards. The brief was short: extract the heading structure, do keyword research, and tell me what to change. Three data sources lined up: Google Keyword Planner for volumes, Google Search Console for the current page&#8217;s organic traction, and competitor SERP data to see what was beating it. Two hours later we had a different page.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 01: wrong topic \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-01\">\n          <time class=\"bd-event-time\" datetime=\"PT7M\">+0:07<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-eureka\">Eureka \u2726<\/span><\/p>\n            <h2>Two whole sections were about a different product.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: this isn&#8217;t a copy-tweak job \u2014 the CMS imported text from a sibling page and Google&#8217;s strongest body-text signal points at the wrong keyword.<\/p>\n            <p>Extracted the headings into a flat list. The stats H2 said &#8220;What You Get with AI Image Enhancement&#8221; \u2014 on a page about a different feature entirely. Scrolled to the bottom. The whole SEO content block \u2014 one H2, five H3s, ~200 words of body copy \u2014 was written about <em>item removal<\/em>. None of it was about the actual product the page was selling. This is what topic drift looks like in a CMS redesign: when the template is reused across sibling pages, body copy travels with it. The largest text block on the page was teaching Google about a keyword the page doesn&#8217;t sell.<\/p>\n            <figure class=\"bd-figure\">\n              <img src=\"https:\/\/saveyourclicks.com\/blog\/wp-content\/uploads\/2026\/05\/build-diary-auditing-landing-page-redesign-13-seo-bugs-1.png\" alt=\"Screenshot of the review document showing the bottom SEO content block \u2014 an H2 and five H3s all written about a different product than the page's actual topic.\" width=\"1200\" height=\"450\" loading=\"lazy\" decoding=\"async\">\n              <figcaption>Section 11 of the review document. The entire SEO content block \u2014 H2 plus five H3s \u2014 was written about a sibling product. Every paragraph beneath these headings reinforced the wrong topical signal.<\/figcaption>\n            <\/figure>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Bug 01: H1 no keyword \u2500\u2500 -->\n        <li class=\"bd-event bd-bug\" id=\"bug-01\">\n          <time class=\"bd-event-time\" datetime=\"PT17M\">+0:17<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-warn\">Bug 01<\/span><span class=\"bd-cost\">\u23f1 5 min \u00b7 \ud83e\udde0 reusable lesson<\/span><\/p>\n            <h2>The visually-dominant H1 carried no keyword.<\/h2>\n            <dl class=\"bd-bug-detail\">\n              <div><dt>Symptom<\/dt><dd>The H1 was split into two <code>&lt;span&gt;<\/code> elements \u2014 a small eyebrow with the brand keyword, and a large main line that said &#8220;Stage the Space. Sell the Vision.&#8221; Beautiful. Search-irrelevant.<\/dd><\/div>\n              <div><dt>Root cause<\/dt><dd>The copywriter optimized the visually-dominant line for emotion. The eyebrow absorbed the keyword by accident, but eyebrow text is the secondary signal \u2014 Google reads the larger H1 first.<\/dd><\/div>\n              <div><dt>Fix<\/dt><dd>Replace the main span with &#8220;Virtual Staging Software \u2014 Stage Any Room in Seconds&#8221;. Captures the head term (5,400\/mo) and the LOW-competition &#8220;software&#8221; qualifier (880\/mo, competition index 33). The poetic eyebrow stays; we just stopped wasting the dominant line.<\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Bug 02: content-only audit \u2500\u2500 -->\n        <li class=\"bd-event bd-bug\" id=\"bug-02\">\n          <time class=\"bd-event-time\" datetime=\"PT22M\">+0:22<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-warn\">Bug 02<\/span><span class=\"bd-cost\">\u23f1 18 min \u00b7 \ud83e\udde0 reusable lesson<\/span><\/p>\n            <h2>The audit was content-only \u2014 it missed everything else.<\/h2>\n            <dl class=\"bd-bug-detail\">\n              <div><dt>Symptom<\/dt><dd>First draft of the review only critiqued heading text. The client asked: &#8220;what about semantic tags, images, performance?&#8221; The page had a section subtitle marked up as <code>&lt;h2&gt;<\/code>, the mobile view duplicated every H2, and four testimonials all reused the same two before\/after image URLs. None of that came up.<\/dd><\/div>\n              <div><dt>Root cause<\/dt><dd>Anchored on the literal request (&#8220;heading structure&#8221;) and skipped the scaffolding. A real audit covers content <em>and<\/em> markup <em>and<\/em> media <em>and<\/em> performance \u2014 they&#8217;re all SEO signals.<\/dd><\/div>\n              <div><dt>Fix<\/dt><dd>Rebuilt the document as 13 sections covering: head meta, hero, marquee, how-it-works, stats, features, testimonials, audiences, FAQ, CTA, SEO content block, sitewide observations, and competitor gaps. Inside each: content + semantic + media + performance notes. Hero video using <code>preload=\"metadata\"<\/code> with autoplay (LCP risk). Testimonial avatars rendered from transparent 1\u00d71 GIFs. Editor wrapper attributes (<code>data-editable-*<\/code>, <code>data-astro-cid-*<\/code>) inflating the DOM. None of these would have surfaced from a heading-only audit.<\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 02: CMS empty \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-02\">\n          <time class=\"bd-event-time\" datetime=\"PT31M\">+0:31<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-eureka\">Eureka \u2726<\/span><\/p>\n            <h2>The CMS panel was set up but never populated.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: the redesign team built the plumbing for Open Graph and JSON-LD but never filled the values \u2014 two distinct failure modes hiding on the same page.<\/p>\n            <p>Mid-audit, the client pasted a screenshot of the CMS Page SEO panel. Empty meta tags. Empty schemas. <code>curl<\/code> on the production HTML confirmed it: <code>&lt;title&gt;<\/code> was literally the slug (<code>virtual-staging-service<\/code>), <code>meta description<\/code> was an empty string, no <code>og:title<\/code>, no <code>og:description<\/code>, no <code>og:image<\/code>, no schemas. The redesign team had built the editor controls but never used them. This is its own bug \u2014 separate from the topic drift \u2014 and on the same page.<\/p>\n            <figure class=\"bd-figure\">\n              <img src=\"https:\/\/saveyourclicks.com\/blog\/wp-content\/uploads\/2026\/05\/build-diary-auditing-landing-page-redesign-13-seo-bugs-2.png\" alt=\"Screenshot of the CMS Page SEO panel showing empty Meta tags section and empty JSON-LD schemas section.\" width=\"857\" height=\"471\" loading=\"lazy\" decoding=\"async\">\n              <figcaption>The CMS exposed structured fields for OG tags and JSON-LD schemas. All empty. The plumbing was ready; the audit&#8217;s job was to fill it.<\/figcaption>\n            <\/figure>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Dead end: \/og\/virtual-staging URL \u2500\u2500 -->\n        <li class=\"bd-event bd-deadend\" id=\"deadend-01\">\n          <time class=\"bd-event-time\" datetime=\"PT52M\">+0:52<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-muted\">Dead end<\/span><span class=\"bd-cost\">\u23f1 10 min<\/span><\/p>\n            <h2>Trying to explain why <code>\/og\/virtual-staging<\/code> is not a URL.<\/h2>\n            <p>The client asked: &#8220;is <code>\/og\/virtual-staging<\/code> the right URL for the page?&#8221; The slug looked like an Open Graph artifact, and OG was the topic of the conversation, so the assumption was logical. The instinct was to dive into the protocol spec \u2014 what <code>property=\"og:url\"<\/code> means, why path namespaces are unrelated, how scrapers resolve the canonical URL. Ten minutes of explanation later the client was more confused, not less.<\/p>\n            <p class=\"bd-deadend-lesson\"><strong>What I learned:<\/strong> when explaining technical concepts to non-specialists, lead with where the thing <em>lives<\/em>, not what it does. &#8220;Open Graph tags live in <code>&lt;head&gt;<\/code>, never in the URL&#8221; is one sentence that answers the question before they ask it. The protocol spec only matters once they trust the placement.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Bug 03: social URLs drift \u2500\u2500 -->\n        <li class=\"bd-event bd-bug\" id=\"bug-03\">\n          <time class=\"bd-event-time\" datetime=\"PT79M\">+1:19<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-warn\">Bug 03<\/span><span class=\"bd-cost\">\u23f1 7 min \u00b7 \ud83e\udde0 reusable lesson<\/span><\/p>\n            <h2>Social URLs drifted to 404s during the redesign.<\/h2>\n            <dl class=\"bd-bug-detail\">\n              <div><dt>Symptom<\/dt><dd>Building Organization schema required <code>sameAs<\/code> social URLs. The redesigned footer pointed at <code>linkedin.com\/{brand}\/<\/code>, <code>youtube.com\/{brand}\/<\/code>, <code>tiktok.com\/{brand}\/<\/code> \u2014 all of which return 404. Real platform URLs need specific path structures (<code>\/showcase\/...<\/code>, <code>\/channel\/UC-...<\/code>, <code>\/@username<\/code>).<\/dd><\/div>\n              <div><dt>Root cause<\/dt><dd>Copy\/paste between branches during the redesign collapsed every social link into the same flat <code>platform.com\/brand\/<\/code> shape. The CSS was perfect; the URLs themselves had been silently broken.<\/dd><\/div>\n              <div><dt>Fix<\/dt><dd>Curl&#8217;d the live production page (still the old design) and extracted the verified URLs from its footer. Used those in the schema. Flagged the broken redesign footer URLs separately \u2014 they need to be replaced in the redesign before launch, not just in schema.<\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 03: GKP only constraint \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-03\">\n          <time class=\"bd-event-time\" datetime=\"PT122M\">+2:02<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\"><span class=\"bd-pill bd-pill-eureka\">Eureka \u2726<\/span><\/p>\n            <h2>The single-tool keyword constraint paid off.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: a constraint that felt limiting at the start of the audit produced the highest-ROI keyword find of the day.<\/p>\n            <p>For the SEO content rewrite, the brief was strict: use <em>only<\/em> Google Keyword Planner. No Ahrefs, no SEMrush. The first instinct was to argue \u2014 competitor data adds context. The constraint stuck. Pulled GKP for per-room virtual-staging queries and the table came back with <code>virtual staging bedroom<\/code> at 140 searches\/month, competition index <strong>0<\/strong>. Then <code>what is staging in real estate<\/code> at 90\/mo, competition index <strong>4<\/strong>. Both terms were absent from the Ahrefs SERP overview run earlier \u2014 buried under noisier head-term competitors. The GKP-only constraint surfaced the lowest-competition long-tail terms in the entire audit. The constraint was the win.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Milestone: shipped \u2500\u2500 -->\n        <li class=\"bd-event bd-milestone bd-shipped\" id=\"shipped\">\n          <time class=\"bd-event-time\" datetime=\"PT126M\">+2:06<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\">Shipped<\/p>\n            <h2>Audit handed off. Every recommendation grounded in real data.<\/h2>\n            <p>Final deliverables: a 13-section heading-by-heading review document, a rewritten SEO content block (H2 + five H3s + closing paragraph) targeting GKP-verified keywords, 14 OG and Twitter meta tag entries, three JSON-LD schemas (<code>SoftwareApplication<\/code>, <code>BreadcrumbList<\/code>, <code>Organization<\/code>), and a new FAQ entry for the comparison-intent query. Every schema value was either pulled from the page itself or from production HTML via <code>curl<\/code> \u2014 nothing fabricated. The client implemented the OG tags before the call ended.<\/p>\n            <figure class=\"bd-figure\">\n              <img src=\"https:\/\/saveyourclicks.com\/blog\/wp-content\/uploads\/2026\/05\/build-diary-auditing-landing-page-redesign-13-seo-bugs-3.png\" alt=\"Screenshot of the CMS Page SEO panel after the audit, showing seven meta tag entries filled in: og:type, og:site_name, og:title, og:description, og:url, robots, and author.\" width=\"867\" height=\"816\" loading=\"lazy\" decoding=\"async\">\n              <figcaption>The same CMS panel after applying the audit&#8217;s recommendations. Open Graph tags populated, robots directive set, author field filled. The brand name and URL in the screenshot are blurred \u2014 this diary is anonymized at the client&#8217;s request.<\/figcaption>\n            <\/figure>\n          <\/div>\n        <\/li>\n\n      <\/ol>\n    <\/div>\n  <\/main>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TIME LEDGER \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"bd-ledger-section\" id=\"ledger\">\n    <div class=\"bd-container\">\n      <header class=\"bd-section-header\">\n        <p class=\"bd-section-num\">The honest accounting<\/p>\n        <h2>Where the 2 hours <em>actually<\/em> went.<\/h2>\n        <p class=\"bd-section-lead\">Most SEO audit estimates lie because they assume the page is roughly correct and only needs tweaks. This one wasn&#8217;t \u2014 and the rewrite work after finding topic drift was the biggest single category.<\/p>\n      <\/header>\n\n      <dl class=\"bd-ledger\" aria-label=\"Time spent by phase\">\n        <div class=\"bd-ledger-row\" style=\"--w:20%\">\n          <dt>Setup<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-setup\"><\/span><span class=\"bd-ledger-num\">25m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:28%\">\n          <dt>Debug bugs<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-bug\"><\/span><span class=\"bd-ledger-num\">35m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:8%\">\n          <dt>Dead ends<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-deadend\"><\/span><span class=\"bd-ledger-num\">10m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:16%\">\n          <dt>Eureka moments<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-eureka\"><\/span><span class=\"bd-ledger-num\">20m (worth it)<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:28%\">\n          <dt>Polish &amp; ship<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-polish\"><\/span><span class=\"bd-ledger-num\">36m<\/span><\/dd>\n        <\/div>\n      <\/dl>\n      <p class=\"bd-ledger-takeaway\"><strong>Takeaway:<\/strong> most time went into rewriting copy <em>after<\/em> discovering topic drift in the CMS-imported content \u2014 a heading-only audit would have missed this entirely. The fastest win was the single-tool keyword constraint at minute 122; the deepest cost was Bug 02, accepting the brief literally instead of expanding scope at minute 22.<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 FAQ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <section class=\"bd-faq-section\" id=\"faq\">\n    <div class=\"bd-container\">\n      <header class=\"bd-section-header\">\n        <p class=\"bd-section-num\">Questions you might have<\/p>\n        <h2>The five <em>real<\/em> questions about this.<\/h2>\n      <\/header>\n\n      <div class=\"bd-faq\">\n        <details>\n          <summary>What is topic drift in a CMS redesign?<\/summary>\n          <p>When a CMS template is reused across sibling pages, the body copy of one page can end up on a page about a different product. Google reads the largest body-text block as the strongest topical signal \u2014 so a page whose biggest text block is about the wrong product ranks for neither well. The fix is to audit every text block against the page&#8217;s actual H1 intent.<\/p>\n        <\/details>\n        <details>\n          <summary>How do you find broken topical signals on a landing page?<\/summary>\n          <p>Extract every heading and large body block into a flat list, then check each one against the H1&#8217;s primary keyword. If a block doesn&#8217;t share at least one keyword from the H1 cluster, flag it. We caught two entire sections that way \u2014 a stats H2 about a different product, and a 200-word SEO block written for a sibling page.<\/p>\n        <\/details>\n        <details>\n          <summary>Should Open Graph tags use <code>property<\/code> or <code>name<\/code> attributes?<\/summary>\n          <p>Open Graph tags use <code>property<\/code>: <code>og:title<\/code>, <code>og:description<\/code>, <code>og:image<\/code>, <code>og:url<\/code>. Twitter Card tags use <code>name<\/code>: <code>twitter:card<\/code>, <code>twitter:title<\/code>, <code>twitter:image<\/code>. Standard meta tags (<code>description<\/code>, <code>robots<\/code>, <code>author<\/code>) also use <code>name<\/code>. Most CMS Page SEO panels have a dropdown to pick between the two \u2014 picking the wrong one causes Facebook and LinkedIn to silently ignore the tag.<\/p>\n        <\/details>\n        <details>\n          <summary>Why use only Google Keyword Planner for a landing page audit?<\/summary>\n          <p>Google Keyword Planner reports the same volumes Google&#8217;s own ranking system sees, with no third-party model layered on top. Ahrefs and SEMrush estimate from clickstream data \u2014 useful for competitor research but noisy for absolute volume. For content writing decisions on a single page, GKP&#8217;s competition index lets you spot low-competition long-tail terms that the bigger tools smooth over.<\/p>\n        <\/details>\n        <details>\n          <summary>How long should a pre-launch landing page audit take?<\/summary>\n          <p>For a single landing page with full keyword research and competitor SERP review: 90 minutes to 3 hours. This one was 2 hours and 6 minutes. The biggest variable is whether the page has topic drift \u2014 rewriting body copy after finding wrong-topic blocks accounts for most of the time. Heading-only audits run under an hour but miss the most important issues.<\/p>\n        <\/details>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 FOOTER \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <footer class=\"bd-footer\">\n    <div class=\"bd-container\">\n      <p>Build Diaries \u00b7 A series on shipping AI-built work to production \u2014 every minute timestamped, every dead end shown, every breakthrough named.<\/p>\n      <p class=\"bd-footer-meta\"><time datetime=\"2026-05-25\">May 25, 2026<\/time> \u00b7 by <a href=\"https:\/\/saveyourclicks.com\/\" rel=\"author\">Yusof Ansari<\/a><\/p>\n    <\/div>\n  <\/footer>\n\n<\/article>\n\n<script src=\"\/blog\/wp-content\/uploads\/build-diaries\/auditing-landing-page-redesign-13-seo-bugs.js?v=33ca7bfc\" defer><\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Auditing a SaaS landing page redesign before launch \u2014 13 SEO bugs found, from missing Open Graph tags to wrong-topic copy and broken heading hierarchy.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[103],"tags":[],"class_list":["post-369","post","type-post","status-publish","format-standard","hentry","category-build-diaries"],"lang":"en","translations":{"en":369},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/comments?post=369"}],"version-history":[{"count":1,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/369\/revisions"}],"predecessor-version":[{"id":370,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/369\/revisions\/370"}],"wp:attachment":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/media?parent=369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/categories?post=369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/tags?post=369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}