Group your keywords by intent rather than topic, assign each intent-cluster to exactly one page, and check at assignment that no two pages target the same intent or the same search results. That is the method. The discipline that prevents overlap is mapping by intent, not by keyword string, because two different-looking keywords that want the same answer belong on one page, and two similar-looking keywords that want different answers belong on two.

The reason intent is the right unit is that the search engine resolves queries by what the searcher wants, not by the words they typed. “Best running shoes” and “top running shoes to buy” are different strings with one intent, so they map to a single page, and building two pages for them just sets your own pages competing. Mapping by keyword string misses this entirely: it produces a page per phrase, and phrases that share intent end up as near-duplicates fighting each other in the same results. Sorting by intent first collapses those duplicates before they are ever built.

The practical procedure is to take your keyword list, cluster the phrases that share a single searcher need, and treat each cluster as one page’s job. Then run the overlap check at the moment of assignment: for any two clusters, would they target the same intent or surface the same search results page? If yes, they are not really two intents and should merge. If their results pages genuinely differ, they are distinct and earn separate pages. Catching the overlap here, at the map, is far cheaper than discovering it later when two live pages cannibalize each other.

So when you sit down to map, do not start from the keyword strings. Cluster by intent, give each intent one page, and before you finalize the map, compare every pair of pages for shared intent or shared results. Merge anything that overlaps, split anything that genuinely diverges, and you will have a map where each page owns its query space alone.