Watches your competitors across news, social and review sites, and posts to Slack only when something changes how you sell against them.

UsesClaudeIsItDownStatusSerperSlack

Hear in Slack when a competitor does something that matters

Every day, the workflow sweeps where each competitor you name shows up: news from the past day, social sites from the past week and review sites from the past month. If you point it at a competitor's status page it also checks whether they are down. Anything new is put to the AI with one question: does any of this change how you sell against them?

When the answer is yes, a short battlecard note lands in your Slack channel: what happened, why it matters and a line a rep can use on a call. Funding, launches, pricing changes, outages and a pattern of complaints count; when nothing changes the picture, nothing is posted. Links already analysed are remembered, so a thread or a review is read once rather than every morning, and a problem with one competitor is reported without stopping the others.

Before the first run you need a Slack channel, the competitor names and a one-line description of your market, so a same-named company elsewhere is not mistaken for a rival.

ScheduleRun every day.Run every day.
ValuesSet competitors to [{name:Acme Analytics,statusSlug:}, {name:Globex Software,statusSlug:}].Set competitors to [{name:Acme Analytics,statusSlug:}, {name:Globex Software,statusSlug:}].
ValuesSet yourMarket to B2B analytics software for mid-market finance teams.Set yourMarket to B2B analytics software for mid-market finance teams.
ValuesSet slackChannelId to blank.Set slackChannelId to blank.
ValuesSet reviewSites to (site:g2.com OR site:capterra.com OR site:trustradius.com OR site:trustpilot.com OR site:getapp.com OR site:softwareadvice.com).Set reviewSites to (site:g2.com OR site:capterra.com OR site:trustradius.com OR site:trustpilot.com OR site:getapp.com OR site:softwareadvice.com).
ValuesSet socialSites to (site:reddit.com OR site:news.ycombinator.com OR site:x.com OR site:linkedin.com OR site:youtube.com).Set socialSites to (site:reddit.com OR site:news.ycombinator.com OR site:x.com OR site:linkedin.com OR site:youtube.com).
Stored ValuesGet the stored value 'handled_mentions'. Save it as handledStore.Get the stored value 'handled_mentions'. Save it as handledStore.
Dates & TimesGet today's date and save it as today.Get today's date and save it as today.
ValuesSet handled to an empty list.Set handled to an empty list.
ValuesSet handledKeys to an empty list.Set handledKeys to an empty list.
Decisions & LoopsIf handledStore.found is yesIf handledStore.found is yes
Yes
Decisions & LoopsIf a step below fails, save the error as storeErrorIf a step below fails, save the error as storeError
Try
Decisions & LoopsFor each entry in handledStore.value:For each entry in handledStore.value:
Decisions & Loops If the difference between today and entry.expires in days is greater than or… If the difference between today and entry.expires in days is greater than or…
Yes
ListsAdd entry to the end of handled and save it as handled.Add entry to the end of handled and save it as handled.
ListsAdd entry.key to the end of handledKeys and save it as handledKeys.Add entry.key to the end of handledKeys and save it as handledKeys.
No
No steps
On error
ValuesShow in the output: The stored list of already-analysed mentions could not be read, so this run treats everything it finds as new. storeError.message.Show in the output: The stored list of already-analysed mentions could not be read, so this run treats everything it finds as new. storeError.message.
ValuesChange handled to an empty list.Change handled to an empty list.
ValuesChange handledKeys to an empty list.Change handledKeys to an empty list.
No
No steps
Decisions & LoopsFor each competitor in competitors:For each competitor in competitors:
Decisions & LoopsIf a step below fails, save the error as sweepErrorIf a step below fails, save the error as sweepError
Try
ValuesSet competitorName to competitor.name.Set competitorName to competitor.name.
ValuesSet statusSlug to competitor.statusSlug.Set statusSlug to competitor.statusSlug.
SerperSerperSearch Google News for competitorName. Save it as news.Search Google News for competitorName. Save it as news.
SerperSerperSearch Google for '@competitorName socialSites'. Save it as social.Search Google for '@competitorName socialSites'. Save it as social.
SerperSerperSearch Google for '@competitorName review pricing complaints reviewSites'. Save it as reviews.Search Google for '@competitorName review pricing complaints reviewSites'. Save it as reviews.
ValuesSet keyPrefix to competitorName|.Set keyPrefix to competitorName|.
ListsKeep each item in news.articles where handledKeys doesn't contain keyPrefix plus item.link and save it as newArticles.Keep each item in news.articles where handledKeys doesn't contain keyPrefix plus item.link and save it as newArticles.
ListsKeep each item in social.results where handledKeys doesn't contain keyPrefix plus item.link and save it as newSocial.Keep each item in social.results where handledKeys doesn't contain keyPrefix plus item.link and save it as newSocial.
ListsKeep each item in reviews.results where handledKeys doesn't contain keyPrefix plus item.link and save it as newReviews.Keep each item in reviews.results where handledKeys doesn't contain keyPrefix plus item.link and save it as newReviews.
ValuesSet statusNote to blank.Set statusNote to blank.
ValuesSet serviceDown to false.Set serviceDown to false.
Decisions & LoopsIf statusSlug isn't emptyIf statusSlug isn't empty
Yes
Decisions & LoopsIf a step below fails, save the error as statusErrorIf a step below fails, save the error as statusError
Try
IsItDownStatusIsItDownStatusGet status for statusSlug. Save it as serviceStatus.Get status for statusSlug. Save it as serviceStatus.
ValuesChange statusNote to Service status right now: serviceStatus.status (serviceStatus.report_count_24h as text problem reports in 24h). serviceStatus.status_page_url.Change statusNote to Service status right now: serviceStatus.status (serviceStatus.report_count_24h as text problem reports in 24h). serviceStatus.status_page_url.
ValuesChange serviceDown to serviceStatus.status is not operational.Change serviceDown to serviceStatus.status is not operational.
On error
ValuesShow in the output: Could not read the service status for '@statusSlug'. Check the slug at isitdownstatus.com, or clear it. statusError.message.Show in the output: Could not read the service status for '@statusSlug'. Check the slug at isitdownstatus.com, or clear it. statusError.message.
No
No steps
Decisions & LoopsIf the length of newArticles plus the length of newSocial plus the length of…If the length of newArticles plus the length of newSocial plus the length of…
Yes
ValuesShow in the output: Nothing new for competitorName: every mention found today was already analysed on an earlier run, and no outage is showing.Show in the output: Nothing new for competitorName: every mention found today was already analysed on an earlier run, and no outage is showing.
No
ValuesSet findings to COMPETITOR: competitorNameSet findings to COMPETITOR: competitorName OUR MARKET: yourMarket --- NEWS (past 24 hours, not seen on an earlier run) --- newArticles as text --- SOCIAL (past week, not seen on an earlier run) --- newSocial as text --- REVIEW SITES (past month, not seen on an earlier run) --- newReviews as text --- SERVICE STATUS --- statusNote.
ClaudeClaudeAsk Claude: 'You are a competitive intelligence analyst supporting a sales team. Below are this period's raw mentions of one competitor, gathered from news, social and review sites, plus their current service status if we track it. Mentions already analysed on an earlier run have been removed, so a section can be empty.Ask Claude: 'You are a competitive intelligence analyst supporting a sales team. Below are this period's raw mentions of one competitor, gathered from news, social and review sites, plus their current service status if we track it. Mentions already analysed on an earlier run have been removed, so a section can be empty. Your job is to decide whether anything here CHANGES HOW WE SELL AGAINST THEM, and to say so in a form a rep can use on a call today. Things that change how we sell: a funding round or acquisition, a launch or major feature, a price or packaging change, an outage or security incident, a leadership change, a shift in their positioning or target market, a pattern of customer complaints, a notable win or loss, layoffs, or a change in their public roadmap. Things that do NOT: routine job postings, SEO blog posts, unrelated companies that happen to share the name, listicles and 'best tools of' roundups, our own marketing, and anything you have no source for. If nothing here meets that bar, reply with exactly NO_CHANGE and nothing else. Do not pad, do not summarize the noise, do not explain your reasoning. A quiet day is a valid answer and is far more useful than a manufactured one. Otherwise reply in this shape, in plain Slack-friendly text, no more than 200 words per item, most consequential first: *<What happened>* Why it matters: <one or two sentences on the effect on our deals> How to sell against it: <a concrete line or question a rep can use> Source: <url> Only include items you can point to a source for. Never invent a source. findings'. Save it as analysis. Maximum response length: 1500
TextTrim analysis.response_text and save it as verdict.Trim analysis.response_text and save it as verdict.
Decisions & LoopsIf verdict isn't empty and verdict doesn't contain NO_CHANGE (ignoring case)If verdict isn't empty and verdict doesn't contain NO_CHANGE (ignoring case)
Yes
SlackSlackSend a message to slackChannelId. Save it as posted.Send a message to slackChannelId. Save it as posted.*Competitor update — competitorName* verdict
No
No steps
Dates & TimesGet the date 2 days after today and save it as newsExpiry.Get the date 2 days after today and save it as newsExpiry.
Dates & TimesGet the date 8 days after today and save it as socialExpiry.Get the date 8 days after today and save it as socialExpiry.
Dates & TimesGet the date 32 days after today and save it as reviewExpiry.Get the date 32 days after today and save it as reviewExpiry.
Decisions & LoopsFor each article in newArticles:For each article in newArticles:
Lists Add a record of key and expires to the end of handled and save it as handled. Add a record of key and expires to the end of handled and save it as handled.
Decisions & LoopsFor each post in newSocial:For each post in newSocial:
Lists Add a record of key and expires to the end of handled and save it as handled. Add a record of key and expires to the end of handled and save it as handled.
Decisions & LoopsFor each review in newReviews:For each review in newReviews:
Lists Add a record of key and expires to the end of handled and save it as handled. Add a record of key and expires to the end of handled and save it as handled.
Decisions & LoopsIf the length of handled is greater than 300If the length of handled is greater than 300
Yes
ListsTake handled from position the length of handled minus 300 on and save it as handled.Take handled from position the length of handled minus 300 on and save it as handled.
No
No steps
Stored ValuesSet the stored value 'handled_mentions' to handled.Set the stored value 'handled_mentions' to handled.
On error
ValuesShow in the output: Competitor sweep failed for competitor.name as text: sweepError.message.Show in the output: Competitor sweep failed for competitor.name as text: sweepError.message.