You keep category and product pages from cannibalizing each other by assigning each tier its own distinct intent and refusing to let them chase the same keyword. Cannibalization happens when both pages target the same term, so they compete for the same query, split the signals between them, and neither ranks as well as one focused page would. The fix is a clean separation rule based on what kind of search each tier should actually win, and then linking and optimizing accordingly.
Category pages are built for browse and comparison intent, which is the broader head term. A shopper landing on a category is exploring options, comparing across a set, and not yet committed to a single item. That page should target the general term, the kind people type when they want to see what is available, “running shoes” rather than a specific model. Its content, title, and headings should speak to the range, the filtering, and the choices, because that is the job it is winning.
Product pages are built for specific transactional intent, the model and SKU level terms. A shopper on a product page is close to buying a particular item and is searching with precision: the exact model name, a SKU, a feature-specific variant. That page should own the specific term and leave the head term to the category. Its content should go deep on the one product, not reach upward to compete for the broad query the category is meant to capture.
The error that causes the collision is optimizing both tiers for the same head keyword, usually because the head term has the most volume and it is tempting to point everything at it. When the category and a flagship product both target it, they cannibalize each other, and the page you least wanted to rank may win the query while the right one languishes. Each tier reaching for its own intent prevents the overlap entirely.
To apply this, map your keyword set in two layers before you optimize anything: assign broad browse terms to category pages and specific model or SKU terms to product pages, with no term living in both. Then link from the category down to its products so the structure reinforces the split. Give each page tier its own intent and its own words, and the competition between them disappears.