<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Greg</title>
    <description>The latest articles on DEV Community by Greg (@blogworkflow).</description>
    <link>https://dev.to/blogworkflow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4242162%2Fe4d87a2e-0016-405e-8aae-a6ec55dcc14f.png</url>
      <title>DEV Community: Greg</title>
      <link>https://dev.to/blogworkflow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blogworkflow"/>
    <language>en</language>
    <item>
      <title>Two of Your Blog Posts Are Fighting for the Same Search: How to Find and Fix Keyword Cannibalization</title>
      <dc:creator>Greg</dc:creator>
      <pubDate>Fri, 13 Nov 2026 10:54:53 +0000</pubDate>
      <link>https://dev.to/blogworkflowai/two-of-your-blog-posts-are-fighting-for-the-same-search-how-to-find-and-fix-keyword-cannibalization-2ll</link>
      <guid>https://dev.to/blogworkflowai/two-of-your-blog-posts-are-fighting-for-the-same-search-how-to-find-and-fix-keyword-cannibalization-2ll</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: written by the team behind BlogWorkflow, an SEO article writer. This post was drafted with AI assistance and contains no product pitch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have kept a technical blog for a year or two, there is a good chance you have written the same post twice without noticing. One year it was "Setting up ESLint in a monorepo", the next it was "ESLint config for workspaces". Both are decent. Both target the same search. And instead of one strong page, Google now sees two half-strong pages and keeps swapping which one it shows.&lt;/p&gt;

&lt;p&gt;That pattern is usually called keyword cannibalization. It is not a penalty, and Google does not punish you for it. The cost is quieter: links, clicks and attention are split across two URLs, and neither one ends up as the obvious best answer. This post shows how to find it with free tools and how to pick the right fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;The symptoms are easy to misread as "SEO is random":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A post that used to rank steadily now jumps around from week to week.&lt;/li&gt;
&lt;li&gt;Search Console shows two or more of your URLs getting impressions for the same query.&lt;/li&gt;
&lt;li&gt;The page Google shows for a query is the older, weaker post, not the one you updated last month.&lt;/li&gt;
&lt;li&gt;Readers land on a post and then click through to your other post on the same topic, because the first one did not fully answer them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these alone proves cannibalization. Two pages ranking for a broad query can be perfectly healthy if they serve different intents. The question is always: would a reader searching this query be happy with either page, or does each page do a different job?&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Find candidate overlaps in Search Console
&lt;/h2&gt;

&lt;p&gt;You need a verified property in Google Search Console. Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Performance → Search results&lt;/strong&gt; and set the date range to the last 3 months.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ New → Query&lt;/strong&gt;, choose "Exact query", and enter a query you care about (for example &lt;code&gt;eslint monorepo&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Switch to the &lt;strong&gt;Pages&lt;/strong&gt; tab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If two or more of your URLs show impressions for that one query, write them down. Repeat for your ten or twenty most important queries. Google's help page on the &lt;a href="https://support.google.com/webmasters/answer/7576553" rel="noopener noreferrer"&gt;Performance report&lt;/a&gt; explains how queries and pages are counted if the numbers look odd.&lt;/p&gt;

&lt;p&gt;A quicker first pass for small blogs: search your own site with &lt;code&gt;site:yourblog.dev eslint monorepo&lt;/code&gt;. If several posts come up with near-identical titles, you have candidates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Decide whether the overlap is real
&lt;/h2&gt;

&lt;p&gt;Put each pair side by side and answer three questions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query: eslint monorepo
Page A: /eslint-monorepo-setup (2024)
Page B: /eslint-config-workspaces (2025)
Same reader? yes / no
Same intent? learn / fix / compare / set up
Could one replace the other? yes / no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the reader and the intent are the same and either page could replace the other, the overlap is real. If Page A is a setup tutorial and Page B is a comparison of lint tools, they are different jobs and you should leave them alone, just link between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Pick the fix
&lt;/h2&gt;

&lt;p&gt;There are four fixes. Choose the lightest one that solves the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Merge and redirect.&lt;/strong&gt; Best when two posts cover the same thing and one is clearly better. Move anything useful from the weaker post into the stronger one, then send the old URL to the new one with a permanent (301) redirect. Google's guide to &lt;a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects" rel="noopener noreferrer"&gt;redirects and Google Search&lt;/a&gt; explains why a permanent server-side redirect is the clearest signal. Update your own internal links so they point straight at the surviving post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Canonical tag.&lt;/strong&gt; Use this when both pages must stay live (for example, a printable version or a copy syndicated on another platform) but you want one treated as the main version. Google's page on &lt;a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;consolidating duplicate URLs&lt;/a&gt; covers when &lt;code&gt;rel="canonical"&lt;/code&gt; is the right tool and why it is a hint rather than a command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Differentiate.&lt;/strong&gt; When both posts deserve to exist, make their jobs obviously different. Rewrite the weaker post's title, intro and headings around a narrower question ("ESLint flat config migration in a monorepo" instead of a second general setup guide), and cut the sections that duplicate the other post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Re-point internal links.&lt;/strong&gt; Sometimes the overlap is mostly caused by your own links: the old post gets linked from every new article, so it keeps looking important. Decide which page is the main one for the topic and make your internal links, navigation and "related posts" point there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Stop it from happening again
&lt;/h2&gt;

&lt;p&gt;The cheapest fix is the one you never need. Before writing a new post, spend two minutes checking what you already have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep a simple list of published posts with one column for the main query each post targets.&lt;/li&gt;
&lt;li&gt;Before starting a draft, search that list and your own site for the new post's main query.&lt;/li&gt;
&lt;li&gt;If an existing post already owns that query, update it instead of starting a new one, or give the new post a clearly different job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a fuller version of that pre-writing check, this guide on &lt;a href="https://blogworkflow.ai/resources/ai-content-workflow/avoiding-content-cannibalization-in-an-ai-seo-workflow" rel="noopener noreferrer"&gt;how to fix keyword cannibalization before it starts&lt;/a&gt; walks through a topic-to-URL map and a short dedup checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on expectations
&lt;/h2&gt;

&lt;p&gt;After a merge or redirect, give Google a few weeks to recrawl both URLs before judging the result. Rankings can wobble while it settles. The examples above (ESLint posts, the query and the URLs) are illustrative, not data from a real site; the useful part is the process, which works the same way for any topic on any blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Listed my top queries and checked the Pages tab for each&lt;/li&gt;
&lt;li&gt;[ ] Marked pairs where two URLs share the same reader and intent&lt;/li&gt;
&lt;li&gt;[ ] Chose one fix per pair: merge + 301, canonical, differentiate, or re-point links&lt;/li&gt;
&lt;li&gt;[ ] Updated internal links to the surviving or main page&lt;/li&gt;
&lt;li&gt;[ ] Added a "main query" column to my list of published posts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>seo</category>
      <category>blogging</category>
      <category>webdev</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
