See llms.txt for all machine-readable content.

Back to Templates

Send daily US government bid digests to Gmail and Slack with Apify

Quick overview

Every morning, this workflow checks US city, county and state procurement portals through two Apify Actors, keeps only new bids that match your keywords and states, drops past-due ones and emails one digest, soonest deadline first. Slack is optional. If one source fails, the other still delivers.

How it works

  1. A daily schedule (7 AM) starts the run. Config holds your keywords, states, email, Slack channel and a cost cap per Actor run.
  2. Build Actor Inputs checks your settings before anything is spent and builds both Actor inputs.
  3. Run Government Bids Scraper calls the Apify Actor that reads 550+ local-government OpenGov portals by state, plus PlanetBids portals you list.
  4. Run State Bids Scraper calls the Actor for the official IL, MA, NJ, OR and NV state portals.
  5. Combine and Normalize turns both outputs into one shape: title, agency, state, deadline, posted date, link and source.
  6. Filter Bids re-checks keywords (word start), excluded words and states, and drops anything already past due.
  7. Keep Only Unsent Bids uses n8n workflow static data as a second memory, so a copied workflow or a new stateKey never repeats a bid you already got. Keys are saved only after the email or Slack message was delivered. No new bids means no message. Otherwise one HTML email and/or one Slack post goes out, soonest deadline first. A failed Actor call or an unreadable portal sends one short problem alert, while bids from the working source still go out.

Setup

  1. Create a free Apify account and copy your API token from Apify Console > Settings > API & Integrations.
  2. In n8n, create a Header Auth credential with name Authorization and value "Bearer <your token>", and select it in both Run nodes. The token is never stored in the workflow.
  3. Connect your Gmail account in the two email nodes, and Slack (chat:write) if you want Slack messages.
  4. Open Config and set keywords, governmentBidsStates (any 2-letter codes), stateBidsStates (IL, MA, NJ, OR or NV), emailTo, and optionally sendSlack and slackChannelId.
  5. Run it once by hand to check the output, then activate it. The first run returns every current match as the baseline; later runs only new ones.

Additional info

Uses two Apify Actors:

  • Government Bids Scraper (OpenGov + PlanetBids): https://apify.com/chimey_forearm/opengov-bids-scraper
  • State Bids Scraper (IL BidBuy, MA COMMBUYS, NJSTART, OregonBuys, NevadaEPro): https://apify.com/chimey_forearm/state-bids-scraper
    Cost: each Actor charges $0.01 per bid returned plus $0.02 per run start (the Government Bids Scraper is $0.002 per bid until Nov 20, 2026). A day with nothing new costs only the start fees. maxChargePerActorUsd (default $1) caps each run. Apify's free plan includes monthly platform credit.
    Customize: change the schedule, add OpenGov agency codes or PlanetBids portal IDs, keep stateKey fixed (a new one starts a fresh baseline), set includeUpdates to false to skip addendum alerts, or swap Gmail for SMTP or Outlook.