Media monitoring on a small budget
Most small teams do not need a Meltwater-class platform for media monitoring. A feed-based monitor covers online news well. It does not see print, broadcast, podcasts, social posts or paywalled text, and if you need those, you should buy the platform.
We built one on 2026-10-14 to see how far free tools go. The subject was Stripe, the payments company. We pulled three queries from Google News RSS, counted the noise, checked the feed against Stripe's own newsroom, and ran a polling script. We also created one Google Alert with RSS delivery and compared it to the Google News feed. This post covers news and web coverage, not social listening.

What media monitoring is, and what it is not
Media monitoring means tracking where a brand, person or topic appears in the press and getting notified. The channels are online news, print, broadcast and social media. A feed can only see the first one.
Paid platforms sell all four channels plus reporting. A feed-based monitor sells none of that. It gives you headlines, links, publishers and dates from online news, and you build the rest.
Who needs a paid media monitoring platform and who does not
Pick by what you must prove, not by what you want to watch.
| Your situation | Paid platform | Feed-based monitor |
|---|---|---|
| You need print and broadcast coverage | Yes. A feed cannot see them. | No |
| You report coverage to clients or a board | Yes, for the reports and dashboards | You would build your own |
| You need sentiment or reach numbers | Yes | No. We did not build this. |
| You watch 3 to 10 queries for online news | Optional | Enough |
| A founder tracks a competitor's announcements | Rarely worth it | Enough |
| You need social listening | A social tool. See the Brand24 note below. | No |
We read these pages on 2026-10-14. Treat them as the vendors' claims, not our tests.
- Meltwater: the pricing page lists four plans (Starter, Pro, Enterprise, Agency), each with a "Contact Sales" button and no figure. Its FAQ says pricing is tailored to the modules, sources and users you choose. Its media monitoring page claims 200M+ online publications, 400,000+ print titles, 20,000+ podcasts, plus broadcast and social. We cannot give you a price because none is published.
- Onclusive: its home page claims 3M+ online sources, 70K+ print outlets, 6K+ broadcast channels and 25+ social platforms. The page we read asks you to request a demo and shows no price.
- Brand24: the prices page lists the entry plan at $249 a month, or $199 a month billed annually. That plan has 3 keywords, 2K mentions a month, one user and updates every 12 hours. The next plan is $349 monthly, or $299 billed annually, with 7 keywords, 10K mentions and hourly updates. There is a 14-day free trial, and the page says no credit card is needed. Its comparison table lists X, news, blogs, newsletters and podcasts as source types, though we did not check which plan includes which.
If your real need is social mentions, or sentiment on a handful of keywords, Brand24 is the fairer comparison. Meltwater publishes no price, and a published one is easier to plan around. We did not test any of the three products, and our setup does not match them. It covers online news and nothing else.
What a feed-based monitor can see
Google News search feeds give you the headline, a link, the publisher, a date and a snippet. Google Alerts can deliver to a feed as well. Our guides cover the details: Google News RSS feed URLs for the search feeds and Google Alerts as an RSS feed for the alert feeds. In short, use Google News when you want volume and control over the query. Use Alerts when you want Google to pick a small number of "best" results for you.
What the feed cannot see:
- Print and broadcast, unless the outlet also publishes online.
- Podcasts and social posts.
- The body of paywalled articles. You see the headline and not the text.
- Anything Google News does not index.
Pick the queries
We watched Stripe for 7 days with three queries. The name is a good test because "stripe" is also a pattern on a shirt.
If you would rather watch specific outlets than a name, how to pick sources for a niche news digest shows how we counted items per outlet with site: queries.
# 1. The name, narrowed to the business
curl -s "https://news.google.com/rss/search?q=%22Stripe%22+payments+when:7d&hl=en-US&gl=US&ceid=US:en"
# 2. The name plus risk words
curl -s "https://news.google.com/rss/search?q=%22Stripe%22+(outage+OR+lawsuit+OR+breach+OR+fine+OR+layoffs+OR+fraud)+when:7d&hl=en-US&gl=US&ceid=US:en"
# 3. The name plus competitors
curl -s "https://news.google.com/rss/search?q=%22Stripe%22+(Adyen+OR+Square+OR+PayPal+OR+Checkout.com)+when:7d&hl=en-US&gl=US&ceid=US:en"
Quotes, OR, parentheses, -word and when: all worked inside q. Our Google News RSS guide covers the operators in more detail, and we counted what each one returned in Google News RSS search operators.
Pull the feed and count the noise
The first pull is the bare name, which is what most people try first.

One hundred items from 77 publishers. The feed is capped at about 100 items, and the first items are not in date order. Then we labelled every headline by hand and by rule. "Names the company" means the headline is about Stripe the business. "Stripe as a pattern" means football uniforms, a lawsuit about four-stripe logos, road line painting, Red Stripe beer and comforters. "No name" means the headline does not contain the word.
| Query (7 days, 2026-10-14) | Items | Publishers | Same-story repeats | Names the company | Stripe as a pattern | No name in headline |
|---|---|---|---|---|---|---|
Stripe |
100 | 77 | 6 | 54 | 36 | 10 |
"Stripe" payments |
48 | 37 | 4 | 41 | 0 | 7 |
"Stripe" + risk words |
17 | 17 | 0 | 3 | 7 | 7 |
"Stripe" + competitors |
41 | 31 | 0 | 5 | 0 | 36 |
Same-story repeats use the check from our headline matching post: token overlap of 0.6 on the headline, oldest first. We did not re-derive the method.
Three things stand out.
First, over a third of the bare-name feed is noise. 36 of 100 headlines were about stripes, mostly an Adidas lawsuit against an Australian label over a four-stripe design and an Oklahoma State "Stripe the Stadium" game.
Second, the repeat count undercounts. The check flagged 6 of 100. But 20 of the 100 headlines were one story, Ripple adding Stripe-owned Privy wallets to the XRP Ledger, from 16 publishers. Different outlets wrote different headlines, so a token check misses most of them. That gap is what the second dedup pass is for. We counted repeats across more feeds in how often a Google News RSS feed repeats the same story.
Third, the risk query was thin and still noisy. It returned 17 items and 3 named the company. One was Stripe confirming it blocked transactions linked to Palestine Action, which is the kind of item you want. Seven were the Adidas case again. The competitor query was mostly about PayPal, with a takeover story running that week. Only 5 of 41 headlines named Stripe.
The links are not publisher links. Every link points to news.google.com/rss/articles/..., as the screenshot shows. Our post on getting the real article URL covers how to resolve them.
Cut the noise
We tried three changes to the bare Stripe query, then counted the same way.
| Query | Items | Names the company | Stripe as a pattern | Real items not returned |
|---|---|---|---|---|
Stripe |
100 | 54 | 36 | 0 |
Stripe -adidas -football -"Red Stripe" -"charity stripe" -uniforms -"black stripe" |
68 | 51 | 7 | 8 |
"Stripe" payments |
48 | 41 | 0 | 16 |
"Stripe" (payments OR fintech OR stablecoin) |
49 | 36 | 0 | 22 |
"Real items not returned" counts the 54 headlines that named the company in the bare pull and are missing from the new feed. It includes items that simply fell outside a feed capped at about 100, so it overstates what the filter removed.
Exclusions kept 51 of 54 relevant items. Of the 8 missing, 5 were "buy verified Stripe accounts" spam that we were happy to lose. The other 3 were real: two Yahoo Finance headlines on the Privy story and a profile in The Times. We did not find out why they dropped. Seven pattern headlines survived, including "Fall line stripe work" from a county road crew and a company called Stripe Consulting. The -word list never ends.
Requiring a second word cut the noise to zero. It also cuts coverage: a story about Stripe that never says "payments", "fintech" or "stablecoin" in the headline or snippet will not show up. That is the trade. A tight query gives a clean feed that misses things, and a wide one gives you everything plus a shirt.
How complete is it
We checked the feed against Stripe's own newsroom. Four announcements fell inside a 30-day window, and we ran the "Stripe" payments query with when:30d. The feed returned 100 items, spanning 2026-09-15 to 2026-10-14.
| Stripe newsroom item | Date | In the feed? |
|---|---|---|
| FedEx and Stripe | 2026-10-06 | Yes, several headlines |
| Stripe agrees to acquire Parafin | 2026-09-30 | Yes, five headlines |
| OUSD is now available on Stripe | 2026-09-30 | Yes, one headline (CryptoRank, 2026-10-01) |
| Stripe marks 10 years in Japan | 2026-09-30 | No |
Three of four. For the Japan item we also searched Stripe Japan 10 years. The six results had nothing about it. The best match was a Nikkei article about Stripe and Meta's Muse in Japan, which is a different story. We do not know why it is missing: Google may not have indexed any outlet that covered it, or nobody did. Four stories is a tiny sample. It tells you the feed misses things, not how often.
A second limit shows in the same pull. A 30-day search returned only 100 items, so a busy name needs a short window or a narrow query, or the cap will cut old items without telling you.
Get alerts where you work
We wrote a short script that polls the three queries, drops items it has seen and drops headlines that look like a story it already sent. It prints new items or, if SLACK_WEBHOOK_URL is set, posts them to a Slack incoming webhook.
import json, os, re, urllib.parse, urllib.request
import xml.etree.ElementTree as ET
QUERIES = {
"name": '"Stripe" (payments OR fintech OR stablecoin) when:1d',
"risk": '"Stripe" (outage OR lawsuit OR breach OR fine OR layoffs OR fraud) -adidas when:1d',
"rivals": '"Stripe" (Adyen OR Square OR PayPal OR "Checkout.com") when:1d',
}
SEEN = "seen.json"
HOOK = os.environ.get("SLACK_WEBHOOK_URL") # optional; prints if unset
def tokens(title):
return set(re.findall(r"[a-z0-9]+", title.rsplit(" - ", 1)[0].lower()))
def fetch(q):
url = ("https://news.google.com/rss/search?hl=en-US&gl=US&ceid=US:en&q="
+ urllib.parse.quote_plus(q))
root = ET.fromstring(urllib.request.urlopen(url, timeout=20).read())
for it in root.iter("item"):
yield it.findtext("guid"), it.findtext("title"), it.findtext("link")
seen = json.load(open(SEEN)) if os.path.exists(SEEN) else {"guids": [], "titles": []}
known = [set(t) for t in seen["titles"]]
new = []
for name, q in QUERIES.items():
for guid, title, link in fetch(q):
toks = tokens(title)
if guid in seen["guids"]:
continue
seen["guids"].append(guid)
if any(len(toks & k) / max(1, len(toks | k)) >= 0.6 for k in known):
continue # same story, similar headline
known.append(toks); seen["titles"].append(sorted(toks))
new.append(f"[{name}] {title}\n{link}")
json.dump(seen, open(SEEN, "w"))
print(f"{len(new)} new items")
text = "\n\n".join(new)
if new and HOOK:
req = urllib.request.Request(HOOK, json.dumps({"text": text}).encode(),
{"Content-Type": "application/json"})
urllib.request.urlopen(req, timeout=20)
else:
print(text)
Run it from cron or any scheduler, for example hourly: 0 * * * * cd /path/to/monitor && python3 monitor.py.
What we actually ran: two polls on 2026-10-14, two minutes apart. The first fetched 62 items, found 4 repeated across queries, dropped 2 as similar headlines and reported 56 new. The second fetched 62 and reported 0 new. We did not run it for days. We did not post to Slack or send email, so those destinations are untested. It sends links as Google redirects. For the fetch, resolve and dedupe pipeline in more detail, see our daily newsletter build.
The 56 "new" items show the dedup limit from earlier. Twenty headlines about one Ripple story do not collapse under a 0.6 token check, so you would still get several alerts for one event.
Where Google Alerts fits
Alerts is the easiest start: type a query, pick a delivery option, wait. We created one alert for "Stripe" payments with Deliver to set to RSS feed. The screenshot is from 2026-10-14 and shows it in the list with the other test alerts in the account.

The feed already held 18 entries, published 2026-10-12 and 2026-10-13. Twelve headlines named the company, and 7 matched a headline in the Google News feed for the same query. The rest were mostly stablecoin and AI-agent stories. The Alerts links are google.com/url?... wrappers around the publisher URL, not news.google.com redirects. We only tried one query, so this is a spot check, not a benchmark.
Alerts has two known weak spots. The emails sometimes stop, which we cover in why Google Alerts stopped sending emails. The RSS option avoids email, and the feed format is in our Google Alerts RSS guide. We did not create the other two queries as alerts. To get Alerts into a channel your team already reads, see how to send Google Alerts to Slack. For tools to use instead of or next to Alerts, see Google Alerts alternatives for news monitoring.
What this setup will not do
- No print, broadcast, podcast or social coverage. The feed sees what Google News indexes.
- No sentiment, reach or ad-value numbers. You get headlines, and anything else you build.
- Unknown delay. We did not measure how long a story takes to reach the feed, so we do not call it real-time.
- Opaque coverage. Google decides what is in the feed and in what order. One of four newsroom announcements was missing and we cannot say why.
- A cap of about 100 items per query, so busy names need short windows or narrow queries.
- Name collisions need your attention. Stripe was a hard case, and a
-wordlist never ends. We counted other kinds of noise for three more companies in monitoring competitors with Google News RSS. - A small test: one subject, one day of pulls, two polls of the script and one alert.
- Not a compliance record. We did not test whether this holds up as legal or contractual proof of coverage. For a regulator example with a measured coverage delay, see regulatory news monitoring with RSS and a webhook.
Skip the plumbing
Feedmarkdown runs the fetch, resolve and dedupe steps for you. It takes Google News and Google Alerts as sources, resolves redirects to publisher URLs, drops duplicates across sources before scraping, and returns each article as full-text Markdown. You get it by HMAC-signed webhook, or pull it as JSON Feed 1.1 or Atom, so a Slack message or an email can carry the article text and not just a headline. Starter is $19 a month for 10 sources checked every 6 hours, Pro is $49 for 50 sources checked hourly, and Agency is $149 for 200 sources checked every 15 minutes. On Starter you will not get alerts within minutes. Plans are in the pricing section. Print, broadcast, social and sentiment are not part of it.