DEV Community

Cover image for Built a public tender monitor in n8n — PDF extraction + Slack alerts [free template]
Terence Hielscher
Terence Hielscher

Posted on

Built a public tender monitor in n8n — PDF extraction + Slack alerts [free template]

Every morning it pulls all new public tenders from official EU sources,
downloads each PDF, and extracts structured data automatically. Anything
above €100k lands in Slack within minutes.

The output looks like this:

Title: Website Redesign
Authority: Institute of Science and Technology Austria
Region: Lower Austria
Value: €350,000
Deadline: 04/05/2026
CPV: 72413000

Four gotchas I hit building this that might save you time:

  1. The API returns a notices array — you need a Split Out node before
    the Loop, otherwise you only ever process the first item

  2. Add 2s Wait nodes before the PDF download and before the extraction
    node to avoid 429 rate limit errors from both services

  3. Use $now.toFormat('yyyyMMdd') for the date filter — hardcoding a date
    means you get identical results every day

  4. Contract value is null for many documents — use
    Number($json.data.estimated_contract_value) || 0 in the IF node
    with "Convert types where required" enabled

The data source and notification channel are both swappable — works
with any procurement API on the input side and any messaging platform
on the output side.

Template JSON in the first comment. Happy to answer questions.

I'm now adding a Q&A Bot and Vector DB to the workflow.
Ideally, the system will automatically apply for pre-filtered tenders.

Top comments (0)