You shipped a post on "CRM rollout mistakes in a clinic" and, three weeks later, another on "common failures when putting a practice management system live." They look different. Google and your own agent treat them as the same question.
To fix keyword cannibalization on a small blog, start with that clash: two URLs fighting for one intent. On a site with thousands of pages the noise washes out. With 12 or 20 posts, every collision shows in Search Console and in model citations. That small-blog math is why SaaS SEO as a solo founder starts with one question per URL.
We measured a real pair in seodraft. The word-overlap check scored 0.00 between "errores al implementar un CRM en una clínica" and "fallas frecuentes al poner un sistema de gestión en un consultorio". seodraft's semantic classifier caught that pair at 0.97.
Below you will spot synonym clashes, pick a winning URL, merge and redirect the loser, harden the topic bank, and choose which collision to fix first. If you want the product feature, see keyword cannibalization in seodraft.
- Spot the clash when the words look different
- Decide which URL keeps the intent
- Merge the loser and leave a clean redirect
- Harden the topic bank so the clash does not reopen
- Which collision to fix first this week
Spot the clash when the words look different
The word-overlap check scored 0.00 between two CRM phrases that ask the same question.
That 0.00 is the blind spot. A filter that only counts matching tokens lets synonyms through. The classifier caught that pair at 0.97, and seodraft's own reference article scored 0.90 on first-hand facts. The 0.97 says same question; the 0.90 confirms the strong draft rests on measurable facts.
Before you schedule a new term, run it against the bank. Low lexical overlap plus high semantic score means one post, already written.
If you have no classifier, read both titles out loud and ask whether a reader who landed on one already has the answer from the other. If yes, log the pair in an editor note so you do not replan it next week. A one-line note with both titles and the semantic score is enough for the next planning pass.
Decide which URL keeps the intent
Keep the URL with stronger first-hand evidence and fuller intent coverage.
Publish date is a weak tie-breaker. Prefer the draft that already carries first-hand numbers and named cases. The thinner sibling becomes the merge source. On a 15-post blog, that choice also decides which URL will collect the shared Search Console impressions after you clean up.
The scorecard: first-hand facts beat freshness, and a post that already passes the rules beats one still stuck in writing. Write the winner's articlePostId next to the topic in the bank before you touch redirects.
If both posts are thin, pause the merge and bank one more measured fact into the survivor first.
Merge the loser and leave a clean redirect
Move useful sections into the survivor, then point the old URL at the winner with a 301 or a canonical.
Copy the sections that still add a fact, a FAQ, or an example the survivor lacks. Drop the filler that duplicated the same steps. Unify the brief so the survivor opens with one angle. Then leave a 301 from the old URL, or a canonical if both must stay live for a short window.
After the merge, move internal links that pointed at the loser over to the survivor. In seodraft, the internal linking rules check that every link in a draft resolves. Update any CTA or related-reading block that still names the old slug. Re-check Search Console queries for both URLs a week later to confirm the winner now collects the shared impressions.
Leaving both pages live "just in case" usually leaves two half-finished answers for the same reader. One survivor with a redirect is easier for Google and for the next agent pass.
A short checklist:
- Winner: the post with more first-hand facts and fuller intent coverage.
- Loser: merged; old URL redirects.
- Bank: one term, one post id, status written.
Harden the topic bank so the clash does not reopen
Lock each open question to one articlePostId and refuse a second draft on the same intent.
In seodraft the bank stores the term, the status, and the articlePostId. When a topic already has an article, the next similar angle is flagged as overlap or merged. Chorch's rule for that bank, in his words: se mantiene o se reordena pero no se cambia (it stays or gets reordered, but it does not change). If the question still matters, move the date.
Measuring a keyword batch with DataForSEO costs about USD 0.11 per batch, and a SERP brief about USD 0.004 when the topic already has metrics. That read is cheap insurance before you open a second post on the same intent.
The writing workflow fits the same pattern: profile, evidence, brief, then the rules. I cover that flow in how to make AI write without sounding generic. The bank decides what to write; the rules decide whether the draft is ready. Why the bank and the rules sit behind your agent instead of a dashboard is in Agent-first: why seodraft killed most of its web UI.
Which collision to fix first this week
Start with the pair that already splits Search Console impressions across two thin URLs.
Next step: open Search Console, sort queries by impressions, and find any query that lands on two of your posts. Compare that pair with the bank. High semantic overlap means merge this week.
If the slot is free for a new question, write the brief before the body and run the rules. That order keeps the calendar full without reopening a clash you just fixed.
If you want to try the loop with your own agent (Claude, Cursor, or ChatGPT on Business, Enterprise or Edu), connect seodraft, load the topic bank, and let dedupe stop the next duplicate before it hits the calendar.
