Catch a blocklisted domain before your customers do
Every weekday, check your domains for new blocklist flags, log results in your spreadsheet, and get a Slack alert only when something gets worse.
Every weekday at 7am, run a reputation health check across the domains we own and depend on, so that we find out we have been blocklisted before our customers tell us. Every step is deterministic: read rows, one lookup per row, compare against the stored verdict, write back, alert on a threshold.
Start by reading the watchlist from our Google Sheets tab using Get Values, over a range that covers the whole table. Each row holds one domain plus the state left behind by the previous run. The layout is: column A the domain, column B the last known verdict, column C the last known malicious engine count, and column D the date and time of the last check. Skip the header row, and skip any row whose domain cell is blank.
For each domain in the list, call the VirusTotal Get a Domain Report operation with the bare domain as the identifier. Read the engine counts from attributes.last_analysis_stats, specifically the harmless, malicious, and suspicious values. To be able to name individual vendors in the alert, also read attributes.last_analysis_results and collect every engine whose category is malicious or suspicious, keeping both the engine name and the result label it returned.
Derive a fresh verdict for each domain from those counts: malicious when the malicious count is 1 or more, suspicious when the malicious count is 0 but the suspicious count is 1 or more, and clean when both are 0. Rank verdicts in severity order clean, then suspicious, then malicious, so the fresh verdict can be compared against the value already recorded in the sheet.
Pace the per-domain loop. A free VirusTotal key allows only 4 requests per minute and 500 per day, so wait about 16 seconds between domain lookups and keep the watchlist to roughly 100 domains. If a lookup comes back rate limited, back off and retry that domain rather than dropping it. If a lookup returns not found, the domain is simply not in VirusTotal yet: record the verdict as unknown, still update the timestamp, and do not treat it as a detection.
Write the results back into the same sheet with Update Values: the fresh verdict into the verdict column, the malicious engine count into the count column, and the current date and time into the last checked column. Always write the timestamp for every domain that was checked, even when nothing changed, so we can tell the difference between a domain that is genuinely clean and a domain the workflow failed to reach.
Alert only when something is actually wrong. A domain qualifies if one or more engines now flag it as malicious or suspicious, or if its fresh verdict is worse than the verdict already recorded in the sheet. For every qualifying domain, use the Slack Bot Send a Message operation to post to our operations channel, naming the domain, the specific engines that flagged it along with the label each one returned, and the before and after values for both the verdict and the malicious engine count. Include a link to the domain's VirusTotal report so someone can dig in immediately. Group all qualifying domains into a single message rather than sending one message per domain, because Slack throttles repeated posts to the same channel.
When nothing has changed, stay completely silent. If every domain comes back clean and no verdict is worse than what the sheet recorded, do not post to Slack at all. The only side effect of a quiet run is the refreshed set of timestamps in the sheet.
Example output
What does this prompt do?
- Reads your domain watchlist straight from the Google Sheet your team already maintains, one domain per row.
- Checks every domain against 70+ security and blocklist vendors each weekday morning.
- Writes the fresh verdict, the number of vendors flagging the domain, and the time of the check back into the same sheet.
- Posts a Slack alert naming the domain, the vendors that flagged it, and how the numbers changed. Stays completely silent when nothing has changed.
What do I need to use this?
- A VirusTotal account. The free plan is enough for a watchlist of up to about 100 domains.
- A Google Sheet with one row per domain, plus columns for the last verdict, the number of flagging vendors, and the date of the last check.
- A Slack workspace and the channel where your operations team wants alerts to land.
How can I customize it?
- Change the schedule: run it daily including weekends, twice a day, or only on Monday mornings.
- Change who hears about it: point alerts at a different Slack channel, or split marketing domains and infrastructure domains into separate channels.
- Change the alert threshold: speak up on a single vendor flag, or stay quiet until several vendors agree.
FAQs
Will this work with a free VirusTotal account?
Will it fill our channel with noise every morning?
Which domains should go on the watchlist?
Do we need a security team to use this?
What if a domain is brand new and not known yet?
Related templates
When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.
Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.
Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.
Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
Stop finding out about blocklists from your customers.
Put your domain watchlist on autopilot and let your spreadsheet and your Slack channel do the monitoring for you.