{"id":446,"date":"2026-05-31T14:56:10","date_gmt":"2026-05-31T14:56:10","guid":{"rendered":"https:\/\/saveyourclicks.com\/blog\/build-diaries\/ai-seo-claude-redesign-audit-dev-team\/"},"modified":"2026-05-31T15:28:34","modified_gmt":"2026-05-31T15:28:34","slug":"ai-seo-claude-redesign-audit-dev-team","status":"publish","type":"post","link":"https:\/\/saveyourclicks.com\/blog\/en\/build-diaries\/ai-seo-claude-redesign-audit-dev-team\/","title":{"rendered":"AI SEO With Claude: A Redesign Audit for the Dev Team"},"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\/ai-seo-claude-redesign-audit-dev-team.css?v=2c1f1a86\">\n<noscript><link rel=\"stylesheet\" href=\"\/blog\/wp-content\/uploads\/build-diaries\/ai-seo-claude-redesign-audit-dev-team.css?v=2c1f1a86\"><\/noscript>\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"AI SEO With Claude: A Redesign Audit for the Dev Team\",\n  \"description\": \"A timestamped build diary about using Claude for an on-page SEO audit of three redesigned SaaS pages \u2014 keyword cannibalization, hreflang and schema fixes \u2014 handed off as a dev-team punch list.\",\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-31\",\n  \"dateModified\": \"2026-05-31\",\n  \"articleSection\": \"Build Diaries\",\n  \"keywords\": \"ai seo, on-page seo audit, keyword cannibalization, hreflang, schema, 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\":\"Can Claude actually do an SEO audit, or just write content?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It can audit. The useful pattern is feeding Claude the live page markup plus Search Console queries and Keyword Planner volumes, then having it review element by element: title, H1, headings, canonical, hreflang, schema, and internal links. It is not a crawler \u2014 you bring the data \u2014 but it is fast at spotting intent mismatch, cannibalization, and missing tags across many pages.\"}},\n    {\"@type\":\"Question\",\"name\":\"What is keyword cannibalization and why did it shape the audit?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Cannibalization is two pages competing for the same money term, so neither ranks well. The fix was an architecture rule: each money term belongs to exactly one page. The homepage stays a hub and links to tools without targeting their terms in its title or H1; each tool page owns its own head term.\"}},\n    {\"@type\":\"Question\",\"name\":\"Why hand the work to the dev team instead of editing the pages directly?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The redesign was on a staging build behind a CMS editor, and mid-audit a deploy returned a 502, so the developer froze changes. We agreed to apply edits section by section and I handed over each change as a payload rather than touching production. Several fixes \u2014 canonical pointing at the dev host, broken hreflang, stripped editor artifacts \u2014 are template-level and only the dev team can ship them.\"}},\n    {\"@type\":\"Question\",\"name\":\"What were the highest-impact fixes found?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Re-pointing titles and H1s to the terms each page could actually win, fixing hreflang that pointed at the homepage instead of the page itself, moving canonicals from the dev host to production, adding missing OpenGraph and BreadcrumbList\/SoftwareApplication schema, and removing placeholder blog content before launch.\"}}\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 04 \u00b7 <time datetime=\"2026-05-31\">May 31, 2026<\/time><\/p>\n      <p class=\"bd-hero-title\">AI SEO with <span class=\"bd-grad\">Claude<\/span> \u2014 a redesign audit, handed to the dev team.<\/p>\n      <p class=\"bd-lead\">I used Claude to run an on-page SEO audit across three redesigned SaaS pages \u2014 pulling live markup, Search Console and Keyword Planner \u2014 then handed the developers a fix list instead of editing production. Every step timestamped.<\/p>\n\n      <dl class=\"bd-honesty\" aria-label=\"Build summary\">\n        <div><dt>Build time<\/dt><dd><span class=\"bd-num\">4h 30m<\/span><\/dd><\/div>\n        <div><dt>Bugs fixed<\/dt><dd><span class=\"bd-num\">2<\/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\">2<\/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\">07:35 \u00b7 the brief<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\">Start<\/p>\n            <h2>Three redesigned pages, one rule: rewrite headings only.<\/h2>\n            <p>A real-estate AI SaaS rebuilt its site on a staging environment and wanted the redesign checked for SEO before launch \u2014 homepage, photo editing, and renovation. My constraint: I could only <strong>rewrite<\/strong> existing headings, never add or remove them. So the method had to be diagnostic, not creative. For each page Claude pulled the live markup, the Search Console queries it already ranked for, and Google Keyword Planner volumes, then reviewed it element by element: title, H1, every heading, canonical, hreflang, schema, and internal links.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 01 \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-01\">\n          <time class=\"bd-event-time\" datetime=\"PT30M\">08:05<\/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 homepage ranked for a phrase that wasn&#8217;t in its H1.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: stop guessing the target keyword \u2014 read what the page already ranks for, then put that phrase where the page can use it.<\/p>\n            <p>Search Console showed the homepage earning hundreds of clicks for its single biggest non-brand term while that exact phrase appeared <em>nowhere<\/em> in the H1. The page was quietly ranking on page-2 strength alone. That one data point reframed the whole audit: the job wasn&#8217;t to invent keywords, it was to align each page&#8217;s visible headings with the demand it was already attracting but under-serving.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 02 \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-02\">\n          <time class=\"bd-event-time\" datetime=\"PT65M\">08:40<\/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>One money term, one page \u2014 the anti-cannibalization rule.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: treat the site as a portfolio of intents, not a pile of pages \u2014 and assign each head term an owner.<\/p>\n            <p>The tool pages were all drifting toward the same big generic terms, which means none of them would win any of them. So we set an architecture rule and reused it on every page: the homepage stays a <strong>hub<\/strong> that links to tools and lists them in its meta description, but never targets their terms in its title or H1; each tool page owns exactly one head term. This rule did more for the projected rankings than any single heading rewrite.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Bug 01 \u2500\u2500 -->\n        <li class=\"bd-event bd-bug\" id=\"bug-01\">\n          <time class=\"bd-event-time\" datetime=\"PT90M\">across all 3 pages<\/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 ~40 min \u00b7 \ud83e\udde0 reusable lesson<\/span><\/p>\n            <h2>The same five template bugs shipped on every page.<\/h2>\n            <dl class=\"bd-bug-detail\">\n              <div><dt>Symptom<\/dt><dd>Every redesigned page repeated the same defects: the <code>canonical<\/code> pointed at the staging host, OpenGraph\/Twitter tags were missing entirely, the &#8220;How It Works&#8221; H2 rendered twice (desktop + mobile), the blog strip shipped &#8220;Mock placeholder&#8221; cards with empty images, and CMS editor artifacts (<code>data-editable-*<\/code>, a dev-host API URL) leaked into the public HTML.<\/dd><\/div>\n              <div><dt>Root cause<\/dt><dd>These aren&#8217;t content problems \u2014 they&#8217;re template-level and identical everywhere, baked into the shared layout and the editor build. No amount of heading rewriting touches them.<\/dd><\/div>\n              <div><dt>Fix<\/dt><dd>They became a <strong>dev-team punch list<\/strong>: move canonical to production, add the OG\/schema set, render one H2 and CSS-toggle, populate or hide the blog, and strip editor artifacts from the production render. Handed over, not hand-edited.<\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Bug 02 \u2500\u2500 -->\n        <li class=\"bd-event bd-bug\" id=\"bug-02\">\n          <time class=\"bd-event-time\" datetime=\"PT120M\">photo-editing page<\/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 ~30 min \u00b7 \ud83e\udde0 reusable lesson<\/span><\/p>\n            <h2>Broken hreflang and a CTA pointing at three different hosts.<\/h2>\n            <dl class=\"bd-bug-detail\">\n              <div><dt>Symptom<\/dt><dd>On the photo-editing page, the <code>hreflang<\/code> alternates for <code>en<\/code> and <code>x-default<\/code> pointed at the homepage instead of the page itself, and the primary call-to-action used three different app hosts across the page (one with an extra <code>dev.<\/code> subdomain that was likely dead).<\/dd><\/div>\n              <div><dt>Root cause<\/dt><dd>Self-referencing alternates were templated wrong, and the CTA links were authored by hand at different times against different environments.<\/dd><\/div>\n              <div><dt>Fix<\/dt><dd>Point each alternate at its own URL and collapse the CTA to one canonical app host. <strong>My call on the headings:<\/strong> keep the strong H1 as-is, front-load &#8220;Real Estate&#8221; in the title, and rewrite the duplicated bottom content block so it stops cloning the homepage copy.<\/dd><\/div>\n            <\/dl>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Dead end 01 \u2500\u2500 -->\n        <li class=\"bd-event bd-deadend\" id=\"deadend-01\">\n          <time class=\"bd-event-time\" datetime=\"PT150M\">mid-session<\/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 ~25 min<\/span><\/p>\n            <h2>Pushing edits straight to staging \u2014 until it 502&#8217;d.<\/h2>\n            <p>While we were lining up changes, a staging deploy fell over with a 502 and the developer called a freeze. The plan to push edits as they were found died on the spot; touching it further would have made debugging the outage harder.<\/p>\n            <figure>\n              <img decoding=\"async\" src=\"https:\/\/saveyourclicks.com\/blog\/wp-content\/uploads\/2026\/05\/build-diary-ai-seo-claude-redesign-audit-dev-team-1.png\" alt=\"Slack thread: homepage returned a 502 after changes, developer says stop pushing changes\" loading=\"lazy\" width=\"760\" height=\"386\">\n              <figcaption>The freeze, in Slack. (Translated to English; the request payload with session cookies is redacted; names shown as roles.)<\/figcaption>\n            <\/figure>\n            <p class=\"bd-deadend-lesson\"><strong>What I learned:<\/strong> on a shared staging build, the SEO reviewer doesn&#8217;t own the deploy. Agree on a delivery channel first \u2014 section by section, as payloads the dev applies \u2014 so an audit never collides with an outage.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Dead end 02 \u2500\u2500 -->\n        <li class=\"bd-event bd-deadend\" id=\"deadend-02\">\n          <time class=\"bd-event-time\" datetime=\"PT170M\">20 min lost<\/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 ~20 min<\/span><\/p>\n            <h2>Trusting keyword numbers from a bad tool run.<\/h2>\n            <p>Early on, a batch of keyword volumes came back from a flaky data pull and I started building the renovation strategy on them \u2014 a big, low-competition, fast-growing cluster. It looked too good. Re-querying Google Keyword Planner cleanly told the real story: the head term was mid-competition, and the phrase the page&#8217;s title leaned on (&#8220;ai renovation software&#8221;) had effectively <strong>zero<\/strong> demand.<\/p>\n            <p class=\"bd-deadend-lesson\"><strong>What I learned:<\/strong> re-pull suspicious numbers before they become a strategy. One clean confirmation call is cheaper than a plan built on noise.<\/p>\n          <\/div>\n        <\/li>\n\n        <!-- \u2500\u2500 Eureka 03 \u2500\u2500 -->\n        <li class=\"bd-event bd-eureka\" id=\"eureka-03\">\n          <time class=\"bd-event-time\" datetime=\"PT385M\">14:00<\/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 &#8220;renovation&#8221; page was actually an interior-design page.<\/h2>\n            <p class=\"bd-eureka-shift\">The shift: audit the rendered HTML, not the URL or the brief \u2014 the page&#8217;s real intent lives in its H1 and copy.<\/p>\n            <p>The page lived at <code>\/renovation<\/code>, but its real H1 was &#8220;AI Interior Design and Renovation&#8221; and almost all of its content \u2014 hero, tool cards, FAQ \u2014 was interior-design. It was the redesigned successor of the old interior-design page. The owner then made the call: this page is <strong>renovation only<\/strong>, the standalone interior-design page is retired. That decision changed everything downstream \u2014 title, H1, FAQ, and a required 301 redirect \u2014 and none of it would have surfaced from the URL alone.<\/p>\n            <figure>\n              <img decoding=\"async\" src=\"https:\/\/saveyourclicks.com\/blog\/wp-content\/uploads\/2026\/05\/build-diary-ai-seo-claude-redesign-audit-dev-team-2.png\" alt=\"Slack thread: agreeing to apply SEO changes section by section once the deploy is fixed\" loading=\"lazy\" width=\"760\" height=\"368\">\n              <figcaption>Coordinating the section-by-section handoff once the deploy was healthy. (Translated; names shown as roles.)<\/figcaption>\n            <\/figure>\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=\"PT450M\">15:05 \u00b7 shipped<\/time>\n          <div class=\"bd-event-card\">\n            <p class=\"bd-event-tag\">Shipped<\/p>\n            <h2>Three review docs + a dev punch list, ready for launch.<\/h2>\n            <p>Each page got a self-contained review: a complementary, non-cannibalizing title and H1, a copy-paste meta-tags table, JSON-LD with no invented data (real price kept, ratings left as a marked placeholder rather than faked), and an element-by-element heading pass. The cross-page template bugs went to the developers as a single list, and the strategy decisions \u2014 hub-and-spoke architecture, renovation-only scope, the 301 \u2014 were written down so the handoff survives the chat.<\/p>\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 time <em>actually<\/em> went.<\/h2>\n        <p class=\"bd-section-lead\">Active working time across three chats \u2014 idle gaps excluded. Most of it went to pulling clean data and writing the handoff, not to the heading rewrites themselves.<\/p>\n      <\/header>\n\n      <dl class=\"bd-ledger\" aria-label=\"Time spent by phase\">\n        <div class=\"bd-ledger-row\" style=\"--w:22%\">\n          <dt>Setup &amp; data<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-setup\"><\/span><span class=\"bd-ledger-num\">60m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:20%\">\n          <dt>Debug bugs<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-bug\"><\/span><span class=\"bd-ledger-num\">55m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:22%\">\n          <dt>Dead ends<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-deadend\"><\/span><span class=\"bd-ledger-num\">60m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:14%\">\n          <dt>Eureka moments<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-eureka\"><\/span><span class=\"bd-ledger-num\">35m<\/span><\/dd>\n        <\/div>\n        <div class=\"bd-ledger-row\" style=\"--w:22%\">\n          <dt>Polish &amp; ship<\/dt>\n          <dd><span class=\"bd-ledger-bar bd-ledger-polish\"><\/span><span class=\"bd-ledger-num\">60m<\/span><\/dd>\n        <\/div>\n      <\/dl>\n      <p class=\"bd-ledger-takeaway\"><strong>Takeaway:<\/strong> the single biggest time-saver would have been agreeing the delivery channel \u2014 section-by-section payloads to the dev \u2014 <em>before<\/em> the deploy broke, not after.<\/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 real questions about this.<\/h2>\n      <\/header>\n\n      <div class=\"bd-faq\">\n        <details>\n          <summary>Can Claude actually do an SEO audit, or just write content?<\/summary>\n          <p>It can audit. The useful pattern is feeding Claude the live page markup plus Search Console queries and Keyword Planner volumes, then having it review element by element: title, H1, headings, canonical, hreflang, schema, and internal links. It is not a crawler \u2014 you bring the data \u2014 but it is fast at spotting intent mismatch, cannibalization, and missing tags across many pages.<\/p>\n        <\/details>\n        <details>\n          <summary>What is keyword cannibalization and why did it shape the audit?<\/summary>\n          <p>Cannibalization is two pages competing for the same money term, so neither ranks well. The fix was an architecture rule: each money term belongs to exactly one page. The homepage stays a hub and links to tools without targeting their terms in its title or H1; each tool page owns its own head term.<\/p>\n        <\/details>\n        <details>\n          <summary>Why hand the work to the dev team instead of editing the pages directly?<\/summary>\n          <p>The redesign was on a staging build behind a CMS editor, and mid-audit a deploy returned a 502, so the developer froze changes. We agreed to apply edits section by section and I handed over each change as a payload rather than touching production. Several fixes \u2014 canonical pointing at the dev host, broken hreflang, stripped editor artifacts \u2014 are template-level and only the dev team can ship them.<\/p>\n        <\/details>\n        <details>\n          <summary>What were the highest-impact fixes found?<\/summary>\n          <p>Re-pointing titles and H1s to the terms each page could actually win, fixing hreflang that pointed at the homepage instead of the page itself, moving canonicals from the dev host to production, adding missing OpenGraph and BreadcrumbList\/SoftwareApplication schema, and removing placeholder blog content before launch.<\/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\">Client and brand names withheld at the owner&#8217;s request; the Slack screenshots are translated to English with the request payload and personal names redacted. <time datetime=\"2026-05-31\">May 31, 2026<\/time><\/p>\n    <\/div>\n  <\/footer>\n\n<\/article>\n\n<script src=\"\/blog\/wp-content\/uploads\/build-diaries\/ai-seo-claude-redesign-audit-dev-team.js?v=33ca7bfc\" defer><\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>How I used Claude for an on-page SEO audit of three redesigned SaaS pages \u2014 keyword cannibalization, hreflang and schema fixes \u2014 handed off as a dev-team punch list.<\/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-446","post","type-post","status-publish","format-standard","hentry","category-build-diaries"],"lang":"en","translations":{"en":446},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/446","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=446"}],"version-history":[{"count":2,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":448,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions\/448"}],"wp:attachment":[{"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saveyourclicks.com\/blog\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}