RFP Scout: an AI bid-qualification pipeline.
Built for Max Cacchione's custom-software consultancy, which wins its work through public-sector and healthcare RFPs. Every morning two n8n workflows read every digest and feed, score each opportunity against the firm's own bid rubric, and hand the team a ranked sheet with the reasoning written out.
See it run
The Problem
Finding the right bids meant someone reading four daily email digests (BidBanana, RFPMart, eVA Virginia and Periscope S2G) plus hundreds of RSS listings every morning, opening each notice and deciding by gut whether it was worth a bid. Good opportunities were missed, and hours went into notices that were never a fit: federal work the firm can't bid on, K-12 districts it avoids, license renewals, and projects far below its minimum deal size.
How it works
The email scanner polls Gmail for the four digests. Digests are free text listing 5 to 20 opportunities each, so one AI pass does two jobs at once: it pulls every opportunity out of the email as structured JSON (buyer, title, RFP number, link, due date, value) and scores each one. Duplicates are dropped against the sheet by link, or by title when a digest has no link.

The feed scanner runs daily at 7 AM Eastern across eight category feeds, about 400 listings a run. Each listing is normalized first: RFP number, state, budget and deadline are parsed out of the title, and obvious problems like RFIs and license renewals are pre-flagged before the model sees them. New listings are scored in batches of five with a pause between batches to stay inside API rate limits.
The scoring model
The prompt encodes the firm's own fit check, not a generic “is this relevant?” question. Hard filters force an automatic Skip, with the reason named: federal procurement, passed deadlines, hardware, website-only work, IT support only, RFIs, renewals and sole-source notices. Everything else gets a 100-point weighted score across project type, industry, deal size, scope fit, competition, delivery risk, strategic value and pricing, plus a verdict and a rationale that shows the sub-scores, so any number can be checked in seconds. When a notice doesn't state a budget, the model estimates one from industry price anchors.
The feedback loop
The sheet has a Feedback column only the client's team writes in: “website-only, skip these”, “under our floor”. On every run, the latest 25 notes are fed back into the prompt as examples of the team's judgment. Scoring keeps moving toward how the partners actually decide, and nobody has to edit a prompt to get there.
Problems worth knowing about
Rows multiplied by the sheet
Reading the sheet inside a per-item flow ran the read once per item, so N listings times M rows came out the other side. The fix was collapsing to a single trigger item before the read and pulling the original listings back by node reference afterwards.
Batches that lost data
Running 400+ listings through a batch loop dropped AI results until each response was re-joined to its original listing by position from a stashed copy, instead of trusting what flowed out of the HTTP node.
Cloud platform limits
n8n Cloud blocks environment variables, so the API key moved into a credential. Long runs also outlive the 100-second webhook limit, so production uses a scheduled trigger and testing uses a capped webhook.
Free-text digests
Each email service formats its digest differently. Rather than a parser per sender, the text is extracted once and the model returns every opportunity in one JSON response, which kept a fourth and fifth source cheap to add.
Where it landed
~400 Listings read a day5 Sources, one sheet249 Opportunities scored at go-live25 Feedback notes in every prompt
Every source is read before the team starts work. Federal, K-12, renewals and under-floor deals are filtered with the reason written down, so nobody re-reads them, and the scoring learns from the team's notes without prompt edits. It shipped ahead of a hard deadline.



