Weekly security re-check for every vendor site in your sheet
Every Monday at 6am, every vendor and partner website on your watchlist gets re-scanned, with the verdict written straight back into the same row.
On a cron trigger, every Monday at 6am, re-check every vendor and partner website on my watchlist and write the results back into the same spreadsheet.
Start by reading the watchlist with Google Sheets Get Values against the vendor watchlist tab. Each row holds a vendor name and their website URL. Skip any row where the URL is blank or malformed, meaning it has no usable scheme or host, and count it as skipped rather than letting it break the run.
Before submitting anything, call urlscan Get Quotas to see how many private scans the account has left in the current minute, hour and day windows, and use that to decide how many rows can safely be processed in this run.
For each remaining row, submit the URL with urlscan Submit URL Scan using visibility set to private. Vendor portal URLs can contain identifying paths and a public submission would publish them, so private is required here and must not be switched to public or unlisted. Submit URL Scan returns a uuid immediately and the scan itself runs for roughly 10 to 30 seconds.
Wait for the scan to finish, then read it with urlscan Get Scan Result using that uuid. A 404 from Get Scan Result means the scan is not ready yet, so keep waiting and retry instead of treating it as a failure. A 410 means the scan was deleted, so treat that row as failed. Give each scan a sensible ceiling of about two minutes before marking it failed. From a successful result, pull the overall verdict, the malicious score, and the scan permalink.
Write the results straight back into the same row using Google Sheets Batch Update Values, filling a verdict column, a score column, a last checked date column, and a link column, so the sheet always shows the current state of every vendor. Batch the writes into a single request rather than updating one cell at a time.
Because this walks a whole list in one go, pace the submissions so the run does not blow through the scan quota. urlscan tracks quotas per minute, per hour and per day, separately per action type, and only successful requests count against them. Space the submissions out, and if a request comes back 429, back off for the number of seconds given in the X-Rate-Limit-Reset-After header before continuing. If the quota is exhausted, stop submitting and record how many rows were left unchecked.
Finish by posting one summary to our operations channel with Slack Send a Message. Include how many sites were checked, how many came back clean, an explicit list of any vendor whose site is now flagged with its score and permalink, any vendor whose scan failed outright, how many rows were skipped for a blank or malformed URL, and how many rows were left unchecked because the scan limit was reached.
Example output
What does this prompt do?
- Reads your vendor watchlist tab and picks up the website address from every row
- Runs each site through a private security scan, so vendor portal links are never published anywhere public
- Writes the verdict, the risk score, the date it was checked, and a link to the full report back into the same row
- Posts one Slack summary covering how many sites were checked, how many came back clean, and every vendor that is now flagged or failed to scan
What do I need to use this?
- A Google account with access to your vendor watchlist spreadsheet
- A urlscan.io account for the website scanning (the free plan works, it just allows fewer scans per day)
- A Slack workspace and a channel for the weekly summary
- A watchlist tab with a vendor name column and a website address column, plus four spare columns for verdict, score, date checked, and report link
How can I customize it?
- Change the schedule, for example daily for a short list or the first of the month for a long one
- Point the summary at a different channel, or send it as a direct message instead
- Adjust what counts as flagged, so only sites above a risk score you choose get called out
- Cap how many vendors get checked in a single run if you want to spread a long list across the week
FAQs
Will my vendors know I scanned their site?
What happens if I have more vendors than my plan allows me to scan?
What if a row has a blank or misspelled website address?
Does this work on the free urlscan.io plan?
Do I need a new spreadsheet, or can I use the one I already have?
Related templates
When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.
Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
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 weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.
Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.
Stop assuming your vendors' sites are still safe.
Put your watchlist on a schedule and let the spreadsheet show you the current state of every vendor, every Monday morning.