Voice agents
Waadi voice agents: sixteen ways they fail an SNCU audit
At 16:43 on a Tuesday in Rotterdam, your voice agent confirms an uitzendovereenkomst for a logistics shift. Three weeks later, SNCU asks for the recording.

At 16:43 on a Tuesday in Rotterdam, a candidate calls Uitzendbureau Z. The voice agent picks up, takes the intake in clean Dutch, and confirms an uitzendovereenkomst for a logistics shift starting Thursday at 06:00. Three weeks later, the SNCU inspector asks for the audio. The operations lead listens back, and inside ninety seconds finds three problems she did not know the agent could create.
This is the field guide we wish she had on her desk that morning. Sixteen failure modes, ranked by who has to fix them. The first eight live in the dialog policy: an operations lead with prompt access can ship the fix before the inspector schedules the follow-up call. The last eight live in code. The agent cannot continue safely until a payroll engineer adds a CAO-check gate that runs before the bot says the words ik bevestig je contract.
The audit shape, briefly
SNCU is the joint compliance body of the staffing CAOs, funded by the sector to police the agreements that the ABU and NBBU publish. An SNCU inspection works backwards from a single payslip or contract. If the contract was created by a voice agent, the inspector asks for the call. If the call gave the candidate a number that the payslip does not back up, the agency is in scope for a Waadi violation, an inlenersbeloning violation, or both.
Two things matter for an agent. First, the agent is treated as the agency, not as software, so its statements bind. Second, every spoken number is testable against the CAO that applied at the moment of the call. Applied is doing a lot of work in that sentence.
Eight failures the operations lead can fix this week
These are prompt-and-policy fixes. No payroll math involved. We have shipped each one inside a day for clients on our voice-agent stack.
1. The agent records without a clean consent capture
The first sentence of the call has to ask, in Dutch, for permission to record, and the agent has to log the candidate's ja. Without it the recording is inadmissible as evidence for the agency, and the inspector will treat the absence of audio as a presumption against you.
2. No retention rule on the audio or transcript
SNCU can look back twelve months on a CAO-naleving check. If your storage policy deletes voice-agent transcripts after thirty days for AVG reasons, you have shortened your own evidence window. The fix is a retention policy that distinguishes intake calls (twelve months minimum) from rejection calls (delete after thirty).
3. The agent confirms the contract before reading it back
SNCU listens for two things on these calls: that the candidate accepted, and that the binding clauses were spoken before the acceptance. The agent should read the four binding clauses back (function, sector, start time, gross hourly rate) and only then ask akkoord. Many agents we audit say akkoord first and read the clauses as a courtesy after. SNCU treats the order as the order.
4. No statement of the inlener and KVK number
The candidate is allowed to know which company they are being lent to. If the agent says een logistiek bedrijf in Rotterdam instead of distributiecentrum X, KVK 12345678, the inlenersbeloning question becomes unanswerable on tape, and the inspector has to subpoena it.
5. No human-handoff trigger on wage questions
The agent should refuse to answer verdien ik straks ook 14 euro per uur als ik in nachtdienst werk? on its own. This is not a wage question, it is a CAO question. The fix is a refusal phrase plus a callback within four working hours. The refusal phrase itself protects the agency.
6. ID verification not captured in audio
Under the Wet op de identificatieplicht the agency must verify a valid ID before the first shift. The voice agent does not have to do the verification, but it has to capture the candidate's commitment to bring the ID on day one, on tape, with date of birth read back. A silent assumption that intake will do it later is the most common gap we see.
7. No plain-Dutch inlenersbeloning summary
Inlenersbeloning betekent dat je verdient wat een vaste werknemer van de inlener met dezelfde functie zou verdienen. That single sentence, read on the call, blocks half the disputes SNCU sees. Most agents skip it because the legal team did not write it for the prompt library.
8. No log of which CAO version was quoted
The ABU CAO updates yearly, sometimes mid-year. If the agent quotes a number from the CAO without naming the version, the audit trail cannot prove which scale applied. Add a single line to the system prompt: begin every wage statement with the CAO version code, for example ABU-CAO 2026-01.
The first eight failures are not engineering work. They are a written prompt, a refusal phrase, a retention rule, and a read-back order. Ship them before you touch the model.
Eight failures that need a CAO-check gate in code
These are the ones where the operations lead is right to push back. You cannot fix a wage floor by writing a better prompt. The agent has to call a service that knows the candidate's function group, the inlener's sector, and the CAO version that applied on the call date, and refuse to confirm anything until the service answers. We call this the CAO-check gate.
9. Wage below the function-group floor
Every function group in the inlener's CAO has a minimum scale wage. The agent has no way to know 12,50 euro for a logistiek medewerker is below scale unless it queries the table. We ship this as a function call the agent must make before quoting any number.
10. Wrong phase classification
Phase A, B, and C in the ABU CAO change the candidate's rights, especially around termination and continued payment. Phase is a function of cumulative weeks worked, not of the current contract. The agent needs the tenure history from the payroll system before it can place the candidate.
11. Missing StiPP pension eligibility
After eight worked weeks (basisregeling) or 52 weeks (plusregeling) the candidate becomes eligible for StiPP pension. The agent has to know which threshold the candidate is past, and say so on the call. A bot that quietly leaves pension off the offer creates an underpayment claim by week nine.
12. Holiday allowance pulled from the wrong year
8% is the statutory floor, 8,33% is common in staffing, some inlener CAOs lift higher. The agent must read the current year's value for the right inlener, not a number frozen into the prompt last winter.
13. Inlenersbeloning lookup wrong per sector
A schoonmaak inlener and a metaal inlener have different scales, different ADV days, different shift surcharges. The agent has to read the inlener's sector code from the assignment record, not infer it from the address.
14. Travel-cost reimbursement misaligned
Travel cost is set per inlener CAO, not per agency. Reading 0,23 per kilometer from a single source list will be wrong about half the time.
15. Reservation percentages quoted as part of the gross wage
Holiday reservation, short-rest reservation, sick-leave reservation and bovenwettelijke vakantie all sit on top of gross, not inside it. An agent that quotes a single number without naming the reservations creates the impression of a higher take-home than the payslip will show.
16. No A1 / WAS check for cross-border candidates
If the candidate is socially insured in another EU member state, the agency needs an A1 statement and a payroll setup that respects the Wet Aanpak Schijnconstructies. The agent cannot confirm a contract until both are flagged. We have seen agents quietly close a Polish driver's intake without ever asking the country-of-insurance question.
What the CAO-check gate actually looks like
A CAO-check gate is a single function the voice agent has to call, with the agreement payload, before it can return any confirmation utterance. If the function returns anything other than ok, the agent falls back to a hand-off script. The shape we use in production:
type CaoCheckInput = {
cao_version: string // "ABU-CAO 2026-01"
inlener_kvk: string
inlener_sector: string // e.g. "logistiek"
function_group: string // e.g. "logistiek medewerker"
start_date: string // ISO
hourly_gross_eur: number
candidate_tenure_weeks: number
candidate_country_of_insurance: string
}
type CaoCheckResult =
| { ok: true; phase: "A" | "B" | "C"; stipp: "none" | "basis" | "plus" }
| { ok: false; reason: string; handoff: "wage" | "phase" | "stipp" | "a1" | "sector" }
async function caoCheck(i: CaoCheckInput): Promise<CaoCheckResult> {
const scale = await scaleFloor(
i.cao_version, i.inlener_sector, i.function_group, i.start_date,
)
if (i.hourly_gross_eur < scale) {
return { ok: false, reason: `below scale ${scale}`, handoff: "wage" }
}
const phase = phaseFromTenure(i.candidate_tenure_weeks)
const stipp = stippEligibility(i.candidate_tenure_weeks)
if (
i.candidate_country_of_insurance !== "NL" &&
!(await hasA1(i.inlener_kvk, i.start_date))
) {
return { ok: false, reason: "missing A1", handoff: "a1" }
}
return { ok: true, phase, stipp }
}
The agent's system prompt then carries one rule: never speak a confirmation utterance unless the last caoCheck call returned ok: true. The fallback hand-off script says, in Dutch: Een collega belt je binnen vier werkuren terug om dit definitief te maken. That sentence is the difference between an audit that resolves in your favour and one that does not.
How to tell which group your agent is in
Pull the last fifty intake calls. For each call, answer two questions: did the agent state the CAO version on tape, and did the agent call a wage-floor function before it confirmed? If the answer to either is no, you are in the second eight, and the work is engineering, not prompt-writing.
When we built the Dutch-language voice agent for a staffing client earlier this year, the actual blocker was exactly this split: prompt fixes on one side, payroll engineering on the other. We solved it with a CAO-check service plus a one-page prompt rewrite, and the same shape sits behind our other voice agents.
Today's five-minute audit: open your last intake call and write down which of the sixteen items above the agent did, and which it skipped. If the count of skips is above three, the inspector is doing the audit anyway.
Key takeaway
Half the SNCU failures in a Dutch staffing voice agent are prompt fixes; the other half need a CAO-check service the bot must call before any confirmation.
FAQ
How long should voice-agent intake calls be retained for SNCU audits?
Twelve months is the safe floor. SNCU can look back a full year on a CAO-naleving check, so a 30-day AVG retention rule on intake calls shortens your own evidence window.
Can a voice agent run the inlenersbeloning check itself?
Not from a static prompt. The agent has to call a service that looks up the inlener's sector, function group, and current CAO scale on the call date. Without that gate it cannot speak a wage safely.
Does the agent have to verify ID before confirming a contract?
It does not have to do the verification, but it has to capture the candidate's commitment to bring a valid ID to the first shift, on tape, with date of birth read back.
What is the difference between ABU and NBBU for this?
They are two staffing CAOs with similar structure but different scales and surcharges. The agent must know which one the agency falls under and quote from that document, named on tape.