Monthly keyword cannibalization audit into Asana

By General Input

First Monday each month, find queries where two or more of your own pages compete in Google search, and file ready-to-action consolidation tasks in Asana.

Integrations

  • Google Search Console
  • Asana

Type

Agentic Task

Categories

  • Marketing

On the first Monday of every month at 9am in my local timezone, run a keyword cannibalization audit against my Google Search Console property and file consolidation tasks in Asana, one per real conflict, so the SEO team has a ready-to-action queue instead of a raw report.

Inputs I want to configure once: the Search Console property (URL-prefix or sc-domain form, use the exact value returned by List Sites), the Asana workspace and the project where tasks should land, a short list of brand terms and product names to exclude, and an optional default assignee for the created tasks.

Pull the data from Google Search Console using Search Analytics Query over the last 90 full days (account for the 2 to 3 day data lag), grouped by query and page together, with searchType web, dataState all, and rowLimit 25000 paginated via startRow until the rows array comes back smaller than the limit. Use the data to build, for each query, the set of URLs that ranked for it with their clicks, impressions, CTR, and average position.

Flag a query as a real cannibalization conflict only when ALL of these are true: two or more of my URLs each have at least a meaningful share of the query's impressions (default: each competing URL has at least 100 impressions and at least 10 percent of the query's total impressions), the average positions of the top two URLs are within 3 of each other, no single URL already owns more than 80 percent of the clicks for that query, and the query does not contain any of my brand or product terms. These thresholds should be easy to edit at the top of the agent's instructions.

For each conflict, pick a recommended canonical winner. Score URLs by traffic share (clicks first, then impressions as a tiebreaker), better average position, and clearer intent fit based on the URL path and any title signal you can infer. Optionally call Inspect URL on the top two competing URLs to confirm their Google-selected canonical and indexing state, and use that to back the recommendation. Then choose a recommended action from: consolidate the losing page into the winner, set up a 301 redirect from loser to winner, rework internal links to point at the winner, or noindex the loser. Pick the action that best fits the situation and explain why in one sentence.

For every flagged conflict, call Asana Create a Task in the configured project. The task title should be: Cannibalization: "<query>". The notes (description) should include the recommended winner URL, the loser URLs, each URL's clicks, impressions, CTR, and average position over the last 90 days, the impression and click split, a severity tag (High when position difference is under 3 and the impression ratio is above 0.5, otherwise Medium), the recommended action with a one-sentence rationale, and the indexed canonical from URL Inspection if available. If a default assignee is configured, set it. Use the project gid from the configured Asana project and pass it in the projects array on the request body. Include opt_fields=name,permalink_url so I can log a link back to the created task.

Sort conflicts by severity then total impressions so the highest-impact tasks land first in the project. To stay polite with Asana's rate limit and avoid flooding the project, cap the run at the top 25 conflicts by default and make that cap configurable.

Before creating any tasks, de-duplicate against the last run: if a task with the same query title already exists in the project and is still open, skip creating a new one and instead add a brief comment noting the latest impression and click numbers so we do not pile up duplicates month over month.

At the end of the run, return a short summary: how many queries were scanned, how many conflicts passed the filter, how many Asana tasks were created versus updated via comment, and the top 3 highest-severity conflicts inline.

Related prompts

Explore more prompts
Influencer campaign war room for campaigns still in flightContent decay review board for your WordPress pagesOne console for every SEO client's search performanceCheck in bulk which of your pages Google has actually indexedBuild every client's monthly marketing report in one clickFind and refresh the Ghost posts quietly losing trafficTrack every client call promise until it is actually doneDecide which old blog posts to refresh, merge, or leaveSee every blocked Asana task and who is holding it upAsana team workload board for your Monday capacity check