A few weeks ago a Canadian government affairs firm came to me with a problem. Every Monday morning, one of their analysts was opening the Innovation Canada programs database, copying out 1,000+ rows of new and updated funding programs, manually tagging which ones were a fit for which client sector, deduping against last week's list, and putting together a digest email for the partners.
Six hours. Every Monday. By hand.
Worse: by the time the digest landed, half the new programs were already a week old. The team was always playing catch-up, and the partners felt it.
The bottleneck wasn't the data, it was the human
The Innovation Canada feed is public. The data is structured. The fit-scoring logic is well-defined. There was nothing about this work that actually required a human, except the part where someone had to sit down on a Monday and grind through it.
That's the kind of work I love automating. Repetitive, rule-based, and bleeding the team's most valuable resource: attention.
What I built: GrantRadar
I built a self-hosted n8n workflow called GrantRadar that runs every Monday at 6 AM. By the time the team logs in, the analyst work is already done.
Here's every node in the workflow and what it does:
A simple cron trigger. No webhooks, no manual button. The workflow fires on a schedule so it's predictable, observable, and easy to debug.
Hits the public IC programs endpoint, returns 1,615 active funding programs as JSON. Cached locally so we can replay if anything downstream fails.
Standardizes field names, parses dates, deduplicates against last week's snapshot stored in Supabase. Only new or updated programs continue downstream.
To respect Claude's rate limits and avoid one bad request crashing the whole run, each program is processed individually with retry logic.
This is the magic. Each program is sent to Claude with a custom prompt that knows the firm's client portfolio: their sectors, their geographies, their funding ranges. Claude returns a structured score (HIGH / MED / LOW) plus a one-line rationale.
The team's existing Google Sheet gets new rows appended. Color-coded by score, sortable, filterable. The format the analysts already know, just populated automatically.
An email with the top 10 high-fit programs lands in the partners' inboxes at 6:30 AM, with a link to the full tracker. The digest is templated so it looks identical to the one the analysts used to write.
The honest result
The workflow has been running for several weeks now. The analyst still glances at the tracker on Monday morning, but they're using the time to think about which programs to surface to which clients, not to copy-paste from a database.
The 6 hours we saved? It went straight into client-facing work that actually moves the firm forward.
A note on transparency
A small confession: the first version of the AI scoring node had a bug where about 15% of programs were getting flagged as "unknown" instead of being properly scored. We caught it in the second week of running, traced it to an edge case in the Claude prompt, and patched it. Now we're at over 99% successful classification.
I'm calling that out because most case studies hide stuff like that. Real automation work has bugs, has trade-offs, has things that need a second pass. The win isn't perfection on day one. The win is a system that gets better every week and a feedback loop tight enough to catch issues fast.
Want the workflow?
I'm packaging GrantRadar as a fork-able template. If you want to track a different dataset (your country's funding programs, RFPs in your industry, anything with a structured public feed) the same skeleton works.
Got a 6-hour-a-week problem?
Book a free 30-minute audit. I'll tell you exactly what I'd build, what it would cost, and what it would save you.
Book a Free AuditWe build these systems for government relations firms. See what yours could look like.
Built for public affairs →Get every teardown in your inbox.
One email per build. The full node-by-node breakdown, plus the JSON to fork it. No fluff, no spam.