The Public Tender a Small Contractor Almost Didn't Bid On
By Ergini, Software & AI Developer
A composite story. The company and the people in it are invented. The problem, the rules and the system are real, and the full blueprint is in the use case library.
TL;DR
A composite story: a 45-person building services contractor near Utrecht almost passes on a school maintenance tender it is well suited for, because nobody has three evenings to read 212 pages. The assistant I would build reads the pack into a compliance matrix with checked page references, follows every clarification and correction, checks references, certificates and page limits in code, and drafts only from approved bid library content. The director decides whether to bid, confirms every exclusion answer and signs the submission.
An alert, forwarded eight days late
The daily tender alert lands at six in the morning in a shared mailbox that nobody owns. On a Tuesday in September it lists 31 notices. Road salt, school cleaning, a software licence. Number 17 is different: a municipality east of Utrecht has published a notice on TenderNed for a four-year framework agreement to maintain the heating and ventilation in 28 school buildings, in two lots.
Nobody opens it until the Wednesday of the following week, when Fatima, the office manager, forwards it to Joost with one line:
Isn't this us?
It is exactly them. The firm is a 45-person building services contractor near Utrecht, and it already maintains boilers and air handling units in eleven schools for two school boards. Public work is a small share of its revenue, and Marieke, the director, wants that share to grow. There is no bid manager. Tenders are done by Joost, who runs operations, in the evenings.
The firm is invented, and so are the municipality, Fatima, Joost and Marieke. The pattern is not, and it is easy to miss, because a bid you never submit leaves no trace in anyone's numbers.
212 pages and a note that says "no bid"
Joost downloads the ZIP at 21:40 that Wednesday: fourteen files, 212 pages. The notice. The instructions to tenderers. A specification with an appendix for every school building. A draft framework agreement. The award criteria and their weights. And the UEA, the Dutch version of the European Single Procurement Document, with its exclusion and selection questions. The window for questions closes in six days. Bids are due in nineteen.
He reads the first thirty pages. He sees that the plan of approach is scored, with a four-page limit, and that the references must be comparable work completed in the last three years. Then he writes a note on the opportunity in the CRM:
No bid. No time to read it properly.
Marieke finds the note on Friday and walks over. "Is it the wrong work?"
"It's exactly our work," Joost says. "It's the reading."
He is right, and it is not laziness. Before anyone writes a word, someone has to read all 212 pages and turn them into a list of requirements, each with its page, then find the answers the firm has given before, in folders nobody has tidied in years. That is three evenings before the bid has even started. And the last tender the firm did submit was rejected because one reference project had been completed outside the permitted window. Nobody noticed until the letter came.
A folder called Aanbestedingen
Marieke calls me that afternoon. I work from Pristina, so it is a video call, and I ask to see the ZIP and wherever the firm keeps what it wrote for past bids. That turns out to be a SharePoint folder called Aanbestedingen, Dutch for tenders.
The folder tells me more than the call does. Six past submissions in Word, each one a copy of the one before with changes. Three versions of the same answer about working in occupied buildings, none marked as the one that was approved. Project sheets for the school work, one without a completion date. CVs for two technicians who left last year. The material to answer most of this tender exists. Nobody can tell which version of it is true.
So I tell Marieke what I would not do: switch on drafting next week. An assistant that writes from this folder as it is would blend the three versions into a fluent fourth and name a technician who no longer works there. The library has to be sorted first, with an approval column in SharePoint that Joost fills in over the coming weeks. That is the slow part of the whole project, and it is worth doing anyway.
What can start at once is the reading. Nothing about extracting requirements from a tender pack depends on the library, and the window for questions closes on Tuesday.
The matrix, by Monday evening
The first version of the reader runs over the weekend. A model reads all fourteen files and extracts the contracting authority, the lots, the deadlines, the exclusion and selection criteria, the award criteria with their weights, and every requirement, each with the document and page it came from. Code turns that into an Excel compliance matrix: one row per requirement, with its type (pass or fail, scored, or information only), an owner and a status.
On Monday evening Joost checks it against the PDFs, and finds the first real problem. A handful of rows point at the wrong page, most of them where the instructions summarize a condition that the draft agreement sets out in full. A matrix you cannot trust to the page is worse than none, because people stop checking. So a rule goes in before anything else: every requirement carries the sentence it came from, code finds that sentence in the PDF text and sets the page itself, and a row whose sentence cannot be found is marked, never silently kept.
Six of the rows, as Joost sees them that night:
| Requirement | Where | What the assistant found | Who acts |
|---|---|---|---|
| Two comparable references, completed in the last three years | Instructions, p. 19 | Sheets for three school contracts; one was completed three years and two months before the deadline | Joost picks the other two |
| VCA safety certification | Instructions, p. 20 | Certificate in the folder, expiring before the framework starts | Marieke, to renew now |
| Plan for maintenance in occupied school buildings, four A4 pages at most | Award criteria, p. 31 | Scored; three unapproved versions of an earlier answer | Joost writes, from the best one |
| Approach to reducing emissions during the work | Award criteria, p. 32 | Scored; nothing in the folder | Joost, from scratch |
| Liability insurance of EUR 2.5 million per claim | Draft agreement, p. 58 | Current policy covers EUR 1.25 million | Marieke, with the broker |
| Response times for heating failures during the heating season | Specification, p. 74 | Differs between lot 1 and lot 2, and the instructions do not say whether both lots can be won | A question to the municipality |
The reference row is the one that would have sunk them again. The window is checked in code against the completion dates on the project sheets, not by someone skimming at midnight. The insurance row is the one nobody should discover the night before submission. Both are now visible with two weeks to go.
The Nota van Inlichtingen
On Tuesday morning Joost writes two questions, both straight from the matrix: can one bidder win both lots, and must the insurance proof show EUR 2.5 million at submission or only at award? Marieke reads them, changes one word, and Joost submits them through the portal with hours to spare. Without the matrix, he would have found the lot question while writing, after the window had closed.
Eight days later the municipality publishes its answers to all bidders' questions, in the document Dutch tenders call a Nota van Inlichtingen. Both lots can be won. Insurance proof is needed at award. And, in a paragraph near the end, the plan of approach is now limited to three pages instead of four.
That last change is the kind that gets missed. The assistant follows the notice, pulls every new document, compares it with the version before and reopens the rows it touches. Joost gets a Teams message that names the row, the old limit, the new limit and the page it came from. His draft is three and a half pages long. He has five days to cut it, not five hours.
The upload receipt
The last checks are code, run on the rendered documents rather than estimated from word counts: three pages means three pages in the PDF the municipality will open. Every required attachment is present. The renewed VCA certificate is in the folder, with its new expiry date. The two reference projects fall inside the three-year window by their completion dates.
The UEA is pre-filled from the firm's company record, with every answer that changed since the last one highlighted. The exclusion questions are formal declarations, and the model never answers them alone: Marieke reads and confirms each one herself. She reads the plan of approach twice, signs, and the bid is uploaded on the Friday at 11:20, a full working day before the deadline. The portal's receipt is saved to the bid folder.
Whether the firm wins is up to the municipality's scoring, weeks later, and nothing in this build can promise that. What changed is simpler. The firm bid on work it is good at, instead of writing "no time" on it. The reading cost Joost one evening, spent checking a matrix instead of building one, and his other evenings went into the two answers that are actually scored.
The next notice, and the answer it will not write
Over the following weeks the rest is built around Joost's sorted library. A daily job queries TED and TenderNed by the CPV codes and keywords for the firm's work. Each new notice gets a score in code, with weights Marieke agreed: scope, value, region, certificates held, references inside the window, the bid calendar, and the days left. A strong fit arrives in Teams as a go request with its reasons. A hard fail, such as a turnover threshold the firm does not meet, is logged as a no-bid with the reason, so the pattern shows up over time. The decision to bid stays Marieke's.
When a province tenders ventilation maintenance for its offices a month later, drafting is switched on. For each scored requirement, the assistant searches the library through Microsoft Graph, under the folder's own permissions, and only among documents marked approved. It ranks what it finds and drafts an answer into the Word template, with every source attached as a comment for the reviewer. A CV of someone who has left is excluded automatically.
The emissions question comes up again, and this time there is something to draw on: the answer Joost wrote for the schools, approved and filed with that tender as its source. Then comes a scored criterion on social return, jobs for people far from the labour market, and the firm has never written a word about it. The message in Teams reads:
No approved source for 4.4 (social return, scored). Assigned to Marieke, due Thursday. Nothing has been drafted.
That refusal is the feature. A fluent paragraph about a social return plan the firm does not have is a claim it could later be held to. The full design, from monitoring to the checks before upload, is in the blueprint for a public tender bid assistant.
If a tender pack is sitting unopened in your inbox
Look at the products first. Altura does bid management in the Netherlands and increasingly Germany, Tendium covers the Nordics and Stotles the UK, and Loopio and Responsive are strong answer libraries for commercial RFPs. If one covers your market and your team will keep its content current, buy it.
A custom build wins when the value sits in what you already have: a SharePoint folder of past bids, project sheets and CVs, and a review habit that works. The assistant reads them where they live instead of migrating them. It is an AI integration, usually in the tier for retrieval over your own documents with evaluation, and the price moves with the portals you watch, the languages you bid in and the state of your library. The retrieval design is in the RAG architecture tutorial, the draft agreement in each pack deserves a contract review against your playbook, and the full blueprint has the rest.
Frequently asked questions
Can AI build a compliance matrix from a tender pack?
Yes, and it is one of the most useful places to start. A model extracts every requirement from the tender documents with its document and page reference, and code checks each reference against the PDF text before it becomes a row. Each row gets a type, an owner and a status, so the matrix exists on the first day of the bid and every line traces back to its sentence.
Can AI write public tender responses?
It can draft from your approved material, and that is the only way it should. Every drafted paragraph cites an approved past answer, project sheet or CV from your bid library. Where nothing approved exists, the assistant drafts nothing and assigns the requirement to a person. Experts edit the drafts, the bid manager checks compliance, and a director signs the submission.
Is it allowed to use AI for a public tender bid?
Generally yes. You remain responsible for every statement you submit, so read the instructions to tenderers for any conditions the contracting authority sets. Exclusion grounds and ESPD answers are formal declarations, so a director confirms each one. The rule that every claim traces back to an approved source is what makes AI assistance defensible: nothing goes into the bid that your firm cannot stand behind.
What does an AI tender assistant cost to set up?
It is usually an AI integration in the retrieval tier: search over your own documents, with evaluation. The price moves with how many portals and countries you monitor, the state of your bid library, the languages involved and how strict your Word templates are. Most of the effort goes into marking which answers, project sheets and CVs are approved and current. Reading a 200-page pack costs from well under a euro to a few euros.