NOAA severe weather alerts in Slack for every job site
Every 20 minutes during the workday, check NOAA for severe weather at each site in your Google Sheet, and post a crew-ready alert in the right Slack channel.
Build me an agent workflow that monitors severe weather at our active job sites and pushes alerts into the right Slack channel per site. It should run on a schedule during the workday and act on official National Weather Service alerts, not on raw weather readings.
Trigger: cron, every 20 minutes between 6am and 7pm local time, Monday through Saturday. Skip overnight and Sundays.
Site registry lives in Google Sheets. Use Google Sheets Get Values to read a tab called 'Sites' with these columns: site_name, latitude, longitude, slack_channel_id, and severity_floor (one of Minor, Moderate, Severe, Extreme; default Moderate when blank). Each row is one active site. Treat blank rows as the end of the registry.
For each site row, call the NOAA Weather Get Active Alerts action filtered by point using the row's latitude and longitude. NOAA's coordinates use four decimal places, so round if needed. NOAA tags every alert with a severity of Minor, Moderate, Severe, or Extreme and an event type like 'Tornado Warning' or 'Flash Flood Warning'. Drop any alert whose severity ranks below the site's severity_floor. Drop alerts that have already expired.
Deduplicate against alerts you have already announced earlier the same day. Treat each NOAA alert ID as the unique key. Updates and cancellations to an already-announced alert ID should be threaded as a reply on the original Slack message, not posted as a fresh top-level alert. If a site has no qualifying alerts on this run, skip it silently.
Post to Slack using the Slack Send a Message action. Group results by slack_channel_id so a channel that's getting multiple alerts in the same run receives one parent message ('Active weather alerts for [site or sites]') and one threaded reply per alert, instead of several separate top-level posts. If a single channel only has one alert, post it as a normal channel message.
Each per-alert message should be short, scannable, and written for a foreman or crew lead. Include the site name in bold, the NWS event type (e.g. 'Severe Thunderstorm Warning'), the headline, the effective and expiration times in the site's local timezone, the severity, and one concrete recommended action drawn from the hazard type (examples: 'stop crane operations', 'shelter in place', 'delay pour', 'pause roof work', 'secure scaffolding'). Use Slack mrkdwn formatting.
Expose these settings at the top of the workflow so I can tune them without editing prompts: the Google Sheet ID and tab name; the cron expression and active-hours window; the default severity floor; and the per-hazard action playbook mapping NWS event types to recommended actions.
Important constraints. Use the NOAA Weather integration (noaa-weather), not a generic weather provider, because we want the official NWS severity and event taxonomy. Use the user-token Slack integration so messages are attributed to the operations lead who set this up. Do not post 'all clear' or heartbeat messages on quiet runs. Do not post advisories below the configured severity floor.
Additional information
What does this prompt do?
- Reads your active job sites from a Google Sheet, with each row carrying the site name, location, Slack channel, and a minimum severity.
- Checks the National Weather Service every 20 minutes for active alerts on each site's coordinates and drops anything below your severity floor.
- Posts a short, crew-readable Slack message in the right channel for each affected site, naming the hazard, the timing window, and the action to take.
- When the same channel gets multiple alerts at once, batches them into one parent message with the rest as threaded replies instead of spamming.
What do I need to use this?
- A Google Sheet listing your active sites with site name, latitude, longitude, Slack channel, and a minimum severity (Minor, Moderate, Severe, or Extreme).
- A Slack workspace and the channels where each crew should get alerts.
- Nothing for the weather data itself. NOAA is a free public U.S. government source, no account or key needed.
How can I customize it?
- Change how often it runs, or restrict it to working hours and weekdays so off-hours alerts don't fire.
- Raise or lower the severity floor per site so coastal, urban, or low-risk sites only ping on the conditions that matter.
- Add a per-hazard action playbook (stop crane ops, shelter in place, delay pour, pause roof work) so the Slack message tells the crew exactly what to do.
- Route different crews, regions, or projects to different Slack channels by changing the channel column in your sheet.
Frequently asked questions
Where does the weather data come from?
How does it avoid spamming the channel on a stormy day?
What happens at sites with no active hazards?
Can different sites post to different Slack channels?
Does it cover sites outside the United States?
What do the severity levels mean?
Stop watching the radar all day.
Connect Slack and a Google Sheet once. Geni watches NOAA for every job site and pings the crew only when severe weather is real.