Mapping Keywords to Pages
Assign each keyword to a single page to avoid competing with yourself.
Once you have keywords, you must decide which page targets which term. This is keyword mapping.
One primary keyword per page
Give each page one main keyword plus a few closely related variations. Do not create two pages targeting the same term.
Keyword cannibalization
When multiple pages chase the same keyword, they split signals and compete with each other. This is cannibalization. Fix it by merging pages or re-targeting one of them.
Build a keyword map
A simple spreadsheet works well:
| URL | Primary keyword | Intent |
|---|---|---|
| /pour-over-guide | pour over coffee | Informational |
| /best-gooseneck-kettles | best gooseneck kettle | Commercial |
Example
# A keyword map keeps one clear target per URL
URL | primary keyword | intent
/pour-over-guide | pour over coffee | info
/best-gooseneck-kettles | best gooseneck kettle | commercial
/buy-v60-dripper | buy hario v60 | transactionalWhen to use it
- An SEO audit reveals two pages targeting 'best CRM software' and cannibalising each other; mapping assigns the term to one canonical page and redirects the duplicate.
- A content manager builds a keyword map in a spreadsheet to ensure every cluster article links back to the correct pillar page for that topic.
- A developer uses the keyword map as the source of truth for URL slugs, title tags, and H1s when building a new site section.
More examples
Keyword map as JSON structure
A structured keyword map prevents keyword cannibalization by explicitly assigning each primary keyword to exactly one target URL.
{
"keyword_map": [
{
"primary_keyword": "project management software",
"intent": "commercial",
"target_url": "/project-management-software/",
"page_type": "pillar",
"supporting_keywords": ["pm tool", "task management app"]
},
{
"primary_keyword": "project management for remote teams",
"intent": "informational",
"target_url": "/blog/project-management-remote-teams/",
"page_type": "cluster-article",
"links_to_pillar": "/project-management-software/"
}
]
}Detect keyword cannibalization
Grouping Search Console data by query and counting distinct URLs per query surfaces all cannibalization cases across the site.
# Search Console API: find multiple URLs ranking for the same query
curl -s -X POST \
'https://searchconsole.googleapis.com/v1/sites/https%3A%2F%2Fexample.com/searchAnalytics/query' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"startDate":"2024-01-01","endDate":"2024-03-31",
"dimensions":["query","page"],"rowLimit":1000}' \
| python3 -c "
import sys, json
from collections import defaultdict
rows = json.load(sys.stdin).get('rows',[])
map_qp = defaultdict(list)
for r in rows:
map_qp[r['keys'][0]].append(r['keys'][1])
for q, pages in map_qp.items():
if len(pages) > 1:
print(f'CANNIBAL: {q}')
for p in pages: print(f' {p}')
"Canonical tag to resolve mapping conflict
Adding a canonical tag on the duplicate page consolidates ranking signals to the intended target URL without a redirect.
<!-- On the DUPLICATE page that should not rank -->
<head>
<!-- Point to the single authoritative URL for this keyword -->
<link rel="canonical"
href="https://example.com/project-management-software/">
</head>
Discussion