# Weekly media coverage desk with share of voice tracking

> See every article written about your brand and your competitors in one place, with share of voice, clean readable text, and a weekly recap your team can send.

- Workflow type: app
- Services: Diffbot, Google Sheets, Google Docs, Slack
- Categories: Marketing
- Published: 2026-08-21

## What it does

- Pulls a watchlist of your brand names and competitor names from a Google Sheet, then builds a coverage grid of every article written about them in the date window you pick, one row per article with the headline, publication, date, brand and sentiment
- Gives you three ways to read the same window: a timeline of coverage over time, a share of voice breakdown showing each brand's slice of the total articles, and a ranking of the publications covering your category most
- Opens any article in a clean reading pane with the full text pulled through, so nobody has to fight a paywall or a wall of ads to see what was actually said
- Drafts a weekly recap on demand: a background agent groups the window's coverage into themes, flags where a competitor is winning the narrative, writes it into a new Google Doc and posts the link to your comms channel in Slack

## What you'll need

- A Diffbot account, which supplies both the article index the desk searches and the clean article text in the reading pane
- A Google account with a spreadsheet holding your watchlist of brand and competitor names, plus a second tab where logged coverage accumulates
- Google Docs access for the weekly recap document
- A Slack workspace and the channel your comms team reads

## Prompt

Build me a media coverage desk that our comms and marketing team opens every week to see who is writing about us and about our competitors. It is a browsable surface, not a scheduled job: a person opens it, picks a date window, and works through the coverage.

The watchlist lives in Google Sheets, not in the app. On load, a handler reads a Watchlist tab with Google Sheets Get Values. Each row is a brand name plus a label saying whether it is ours or a competitor. Everything the desk searches for comes from that tab, so the team can add or drop a brand by editing the spreadsheet without touching the app.

The main view is a coverage grid built from Diffbot Knowledge Graph DQL Search against the article index, one row per article showing headline, publication, date, which watchlist brand it belongs to, and sentiment. A date window picker sits at the top of the page and drives every query and every view on it. Important Diffbot detail: DQL Search paginates with from and size, and size maxes out at 50 per request, so the handler must page through results until it has the whole window rather than assuming one call returns everything. The Knowledge Graph endpoint is kg.diffbot.com/kg/v3/dql and auth is a token query parameter, not a bearer header. Article records carry a sentiment score already, so sentiment does not need a separate service.

Give the window three views over the same underlying coverage. A coverage timeline showing article volume over the window, broken out by brand so a spike is attributable. A share of voice breakdown measuring each brand's share of total article count in the window. And a ranking of the publications covering the category most, so the team can see which outlets actually drive the conversation and who they should be pitching.

Clicking any article opens a reading pane that pulls the clean full text through Diffbot Extract Article, showing title, author, date, sentiment and body text so nobody has to fight a paywall or a wall of ads to see what was actually said. The pane should also carry a Log to sheet action that appends that article's row to a History tab with Google Sheets Append Values, so coverage accumulates over time rather than resetting each time the window moves.

Put a Draft the weekly recap button on the page that kicks off a background agent. The agent takes the current window's coverage, groups it into themes, notes where a competitor is winning the narrative, then creates a new document with Google Docs Create Document and writes the recap into it with Google Docs Batch Update Document. When the doc is ready it posts the link into the comms channel with Slack Send a Message. The finished recap also gets listed inside the app in a Recaps view, with its date window and a link to the doc, so the team can reread past weeks instead of hunting through Slack history.

Two rules to bake in. First, let the user mark any row as ours, competitor, or irrelevant, and persist that classification. Rows marked irrelevant stay hidden on later loads so the same false matches do not keep reappearing, with some way to review and restore hidden rows. The ours versus competitor labelling should feed the share of voice view rather than being decorative.

Second, filter out syndicated press release wire duplicates. One announcement picked up by twenty outlets must not distort share of voice. Detect near-identical headlines and body text clustered on the same day around one announcement, collapse them into a single canonical entry with a pickup count, and count that announcement once in share of voice and in the timeline. Let the user expand the entry to see which outlets carried it, since the pickup list is genuinely useful to a comms team even though it should not inflate the numbers.

Audience is a comms and marketing team opening this weekly, so favour a dense, scannable grid over a sparse dashboard, and make the date window the one control everything else hangs off.

## How to customize

- Change the default date window the desk opens on, for example last 7 days for a weekly ritual or last 30 days for a monthly board update
- Edit the watchlist tab in your spreadsheet to add brands, drop them, or move a name between ours and competitor without touching the app
- Point the recap at a different Slack channel, or change how the recap is organized, for example by theme, by competitor, or by publication tier

## FAQ

### What do I need before this is useful?

A Diffbot account for the article index and article text, a Google account for the watchlist spreadsheet and the recap document, and a Slack workspace. The watchlist itself is just a tab with brand names, so you can start with your own name plus three or four competitors and grow it later.

### How is share of voice calculated?

Each brand's share is its number of articles in the selected date window divided by the total articles across every brand on the watchlist in that same window. Move the window and the whole breakdown recalculates, so you can compare a launch week against a quiet one.

### Will one press release picked up by twenty outlets distort the numbers?

No. The desk detects syndicated wire pickups of the same announcement and collapses them into a single entry with a pickup count you can expand. Share of voice counts the announcement once, so a widely syndicated release does not swamp a brand's real coverage.

### Can I hide articles that are not actually about us?

Yes. You can mark any row as ours, competitor, or irrelevant. Rows marked irrelevant stay hidden the next time anyone opens the desk, so the grid gets cleaner every week instead of showing the same false matches again.

### Does the weekly recap send itself automatically?

No, it runs when someone presses the button. That is deliberate: the recap reflects whatever date window you are looking at, and comms teams usually want to choose the moment. Every recap that has been drafted stays listed in the app so you can reread past weeks.

### Does coverage disappear when I move the date window?

Only from the live grid, which always reflects the window you picked. Anything you log to the history tab in your spreadsheet is appended permanently, so coverage accumulates over time rather than resetting each time the window moves.

Use this prompt in General Input: https://www.generalinput.com/prompts/weekly-media-coverage-desk-with-share-of-voice-tracking