Competitor share of voice board for content planning
See which content topics you own and which your competitors own in one grid, then claim the gaps straight into your content calendar.
Build me an internal share of voice board that my marketing team opens before monthly content planning. It should show at a glance which topics we own and which our competitors own, and it must end in a decision (claiming a topic into our content calendar) rather than being a passive chart wall nobody acts on.
Settings view. I configure three things here, saved server side so the whole team sees the same board: a list of topics, where each topic has a short display label plus the BuzzSumo search query behind it so I can use quoted phrases and OR groups; a list of domains that includes our own site marked as ours plus each competitor domain; and a default date range. I also store the Notion content planning database id and the Slack channel for planning here.
Main view is the grid. One row per topic, one column per domain, with our column visually distinct from the competitor columns. Each cell comes from a single BuzzSumo Search Articles call where the query is that row's topic query scoped with the site: operator for that column's domain, and begin_date and end_date come from the selected date range converted to Unix timestamps in seconds. The cell shows the number of articles found and the total engagement across them, summing the Facebook, Twitter, Pinterest and Reddit engagement fields on each article. A cell with zero articles is real data and should read as zero, not as an error.
Cost control is a first class feature here, not a nicety, so design for it from the start. BuzzSumo paid plans include roughly 100 Search API calls per month (see https://help.buzzsumo.com/en/articles/3883145-api-access-for-paid-web-app-subscriptions), and this grid is topics multiplied by domains, so a 6 topic by 4 domain board burns 24 of those calls in one rebuild. The grid must never rebuild on page load, on date range change, or on any navigation. It rebuilds only when I press Refresh. Before a full rebuild, show a confirmation stating exactly how many searches it will consume, for example "This will use 24 of your BuzzSumo searches this month". Every row also gets its own Refresh so I can bring a single topic up to date for the cost of one call per domain. Persist the last successful result for every cell, including the articles behind it, and show an "as of" timestamp at the top of the board and on each row so I always know how stale each row is. If a topic or date range changes so a cached cell no longer matches, grey the cell and keep showing its old "as of" value instead of silently refetching.
Drill in. Clicking any cell opens a panel listing the articles behind that number, ranked by engagement, each with its title, publication date, author when present, an engagement breakdown and a link out. This reads from the articles cached during the last refresh and must never fire a new search, so drilling in is always free. The whole point is that I can read what actually won rather than just seeing a count.
Gap flagging. Mark a cell as a gap when competitors have meaningful coverage and engagement on that topic while our own domain has little or none. Make the threshold configurable, defaulting to something like competitors having at least three articles or a clear engagement lead while we have zero or one. Gaps should be obvious in the grid and also collected in a Gaps list ordered by how much competitor engagement we are ceding.
Claiming a topic. From any gap cell I press Plan this topic, which creates a page in our Notion content planning database with Create a Page. The page carries the topic, the date range examined, which competitor domains are winning it, the top competing articles with titles, links and engagement figures, and the total engagement we are missing. Call Retrieve a Database first to read the database schema so the app maps values onto the real property names rather than guessing them. After the page is created, mark that cell as claimed straight away and link out to the new Notion page.
Reading claims back. When the board loads, query the content planning database with Query a Data Source and match existing pages to topics, so anything already planned shows as claimed instead of resurfacing as a gap every month. This is a Notion read rather than a BuzzSumo search, so it is safe to run on every load. A claimed cell still shows its numbers and still drills in, it just stops counting as a gap and stops appearing in the Slack post.
Slack handoff. Add a Post top gaps to Slack button that sends the top three unclaimed gaps to the planning channel with Send a Message. Each gap should name the topic, which competitors own it, the size of the engagement gap, and the single best competing article as evidence, so the message is enough to open the planning meeting with.
Handle quota failures honestly. If BuzzSumo returns a quota or rate limit error, keep the cached grid on screen, mark only the cells that failed to refresh, and tell me plainly that the monthly search allowance is exhausted rather than blanking the board. Space batched searches by about a second and back off on repeated errors.
What does this prompt do?
- Builds a grid of your topics against your own website and your competitors, showing how many articles each one published and how much engagement those articles earned over a date range you pick.
- Flags the squares where competitors have strong coverage and you have almost none, so the gaps are obvious before planning starts.
- Lets you click any square to read the articles that actually won, ranked by engagement, instead of staring at a number.
- Turns a gap into a planned topic in your Notion content calendar in one click, and posts the top three gaps to Slack for the planning meeting.
What do I need to use this?
- A BuzzSumo account on a paid plan, since data access is not included with free trials
- A Notion workspace with a content planning database you can add pages to
- A Slack workspace and a channel where your content team plans
- A short list of the topics you care about and the competitor websites you want to compare against
How can I customize it?
- Change the topic list and the competitor websites at any time, and pick the date range you want to look at, such as the last 30 days or the last quarter
- Adjust what counts as a gap, for example how much competitor coverage is needed before a topic is worth claiming
- Choose which Slack channel receives the top three gaps, and which Notion database receives claimed topics
FAQs
Why does the board only update when I press Refresh?
Can I update one topic instead of the whole board?
Will this work on a free BuzzSumo trial?
How does it know a topic is already planned?
How many competitors can I compare at once?
Related templates
Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.
Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.
Open one screen each Monday to see which upcoming posts still have no image, generate three on-brand options, and file the one you pick.
See warmup status, daily send volume, and bounce risk for every sending account in one grid, with the riskiest mailboxes floating to the top.
Review Introw partner payouts line by line, approve them from one board, raise the matching bill in Xero, and post every approval to Slack.
See every access, purchase and leave request waiting on your decision in one screen, approve or decline in place, and send the reason back to the requester.
Stop guessing which topics your competitors own.
Open one board before content planning, see the gaps in your coverage, and leave the meeting with topics claimed in your calendar.