AI agents
Claude op €800/seat afkappen: playbook voor CRM-agent
Het is de vierde van de maand en je CFO staart naar een Claude-factuur die stilletjes verdrievoudigd is. Veertig reps, één CRM-agent, geen plafond per seat. Zo losten we het op.

Het is de vierde van de maand. Je finance lead opent de Anthropic-factuur van vorige maand, scrollt naar de regel voor de sales-CRM-agent, en het bedrag staat veertig procent hoger dan in april. Het team is niet gegroeid. Het product is niet veranderd. Twee reps hebben net door dat de agent hun hele ochtend research en outreach doet als ze het netjes vragen. De board meeting is donderdag.
Dit is het gesprek dat we drie weken geleden hadden met een B2B-dienstenteam met veertig sales-seats op een CRM-agent met Claude eronder. Hun stack werkte. De kostencurve niet.
Wat volgt is het playbook waar we op uitkwamen. Een harde cap van €800 per seat per maand, geen gedoe bij elke call, geen verrassingsfacturen, en de pipeline bleef draaien. De cijfers en code zijn die we hebben uitgerold, met de klantnaam vervangen.
Waarom een cap, en waarom nu
Als je eind mei Hacker News scrollde, zag je de discussie over Ubers interne plafond van $1.500 per maand voor AI-tools. Het interessante was niet het bedrag. Het was dat een bedrijf met de onderhandelingspositie van Uber besloot dat een cap de juiste vorm van het antwoord was, niet een korting.
Dezelfde logica geldt bij kleinere bedrijven, harder. Zonder cap volgt AI-gebruik een keiharde Pareto: de top twee of drie reps verbranden zestig tot tachtig procent van je maandelijkse Claude-budget in de eerste tien dagen, en de onderste helft raakt de agent amper aan. Je CFO ziet het gemiddelde en raakt in paniek. Je toppers zien geen weerstand en gaan harder. Tegen het einde van de maand lijkt die begrotingsregel niet meer op de proof of concept die je hebt goedgekeurd.
Een cap per seat lost drie dingen tegelijk op. Het maakt de rekening voorspelbaar. Het dwingt het gesprek over welke seats de agent eigenlijk rechtvaardigen. En het zet de toon voor een degradatiebeleid, want zodra 'oneindig' van tafel is, moet je beslissen wat er gebeurt als het budget op is.
De seat prijzen op €800
We hebben €800 niet uit de lucht gegrepen. We rekenden terug vanuit drie cijfers.
Ten eerste, de kosten van de acties die de agent daadwerkelijk doet. Een typische CRM-sequence bij deze klant zag er zo uit: een stuk of twaalf signalen over een prospect ophalen, een first-touch e-mail opstellen, een transcript van een sales call samenvatten, en de opportunity-record bijwerken. Met Claude Sonnet en prompt caching netjes aan kostte die sequence ongeveer €0,31 tot €0,45. Zonder caching kostte dezelfde sequence €0,90 tot €1,20. Caching telt. Daar komen we op terug.
Ten tweede, de kosten van de tijd van de rep die de agent vervangt. De all-in kosten per sales-uur bij deze klant lagen rond €85. Als de agent een rep twee uur per dag bespaart over twintig werkdagen, is dat €3.400 aan vervangen arbeid per seat per maand. Alles onder een kwart daarvan is een comfortabele marge.
Ten derde, de kosten van een rep die buiten z'n script gaat. De harde cap moest los genoeg zijn dat geen eerlijke werkdag erin loopt. We modelleerden een top-deciel dag (zestig tot tachtig agent-sequences) en een top-deciel maand (achttien van die dagen). Dat plafond kwam uit op ongeveer €720. We rondden af op €800 om ruimte te laten voor eenmalige escalaties, en om het plafond zelf makkelijk te onthouden.
Als jouw sequences andere bedragen kosten, wordt jouw cijfer anders. De vorm van de vraag blijft hetzelfde.
De middleware die over het budget gaat
De eerste regel die we opschreven: geen Claude API key staat op een laptop van een rep, in een browserextensie of in de CRM zelf. Elke agent-call gaat via een kleine proxyservice waar de CRM mee praat. De proxy authenticeert de seat, checkt het budget, doet de upstream call naar Anthropic, registreert precies wat de call kostte aan cache reads, cache writes, fresh input en output, en geeft de response terug.
De proxy is zo'n vierhonderd regels TypeScript. Het interessante stuk is de budget gate. De rest is loodgieterswerk.
// proxy/budget.ts
import { db } from "./db";
import { priceCall, type Usage } from "./pricing";
const SEAT_CAP_EUR = 800; // hard monthly ceiling
const SOFT_WARN_AT = 0.80; // 80% triggers banner + downshift
const HARD_CUT_AT = 1.00; // 100% blocks non-critical actions
export async function checkSeatBudget(
seatId: string,
actionTier: "routine" | "critical"
) {
const cycle = currentBillingCycle();
const { spent_eur } = await db.one(
`select coalesce(sum(cost_eur), 0) as spent_eur
from agent_calls
where seat_id = $1 and cycle = $2`,
[seatId, cycle]
);
const ratio = spent_eur / SEAT_CAP_EUR;
if (ratio >= HARD_CUT_AT && actionTier === "routine") {
return { allow: false, reason: "seat_capped", spent_eur };
}
if (ratio >= SOFT_WARN_AT) {
return { allow: true, downshift: true, spent_eur };
}
return { allow: true, downshift: false, spent_eur };
}
export async function recordCall(seatId: string, usage: Usage) {
const cost_eur = priceCall(usage);
await db.none(
`insert into agent_calls(seat_id, cycle, model, input_tokens,
output_tokens, cache_read_tokens,
cache_write_tokens, cost_eur, ts)
values ($1, $2, $3, $4, $5, $6, $7, $8, now())`,
[seatId, currentBillingCycle(), usage.model,
usage.input_tokens, usage.output_tokens,
usage.cache_read_tokens, usage.cache_write_tokens, cost_eur]
);
}
Twee ontwerpkeuzes daarin zijn de moeite waard om uit te lichten.
Eén: de budgetcheck geeft een downshift-flag terug, niet alleen allow of deny. Die gebruiken we om het model tijdens de rit te wisselen zonder de rep lastig te vallen. Twee: routine versus critical wordt bepaald door de aanroepende actie, niet door de rep of de LLM. Een 'research een cold lead'-call is routine. Een 'stel een tegenbod op voor een zescijferige deal die nu open staat in Salesforce'-call is critical. De caller geeft de tier mee.
Token accounting die echt klopt
Als je een seat factureert op 'totaal tokens' lieg je tegen de seat. Modern Claude-gebruik heeft vier meters, niet één. Cache reads kosten ongeveer een tiende van een fresh input token. Cache writes kosten iets meer dan een fresh input token. Output kost vier tot vijf keer een input token. Plet die vier in één dimensie en je rekent de seat te weinig (en je gaat door de cap voordat je het merkt) of te veel (en je triggert soft warnings op calls die bijna gratis waren).
De pricing helper doet het rekenwerk voor de vier meters.
// proxy/pricing.ts
// EUR per million tokens. Pulled from your contract sheet.
// Update when Anthropic changes the price list.
const RATES = {
"claude-sonnet": {
input_fresh: 3.00,
input_cache_read: 0.30,
input_cache_write: 3.75,
output: 15.00,
},
"claude-haiku": {
input_fresh: 0.80,
input_cache_read: 0.08,
input_cache_write: 1.00,
output: 4.00,
},
} as const;
export type Usage = {
model: keyof typeof RATES;
input_tokens: number; // fresh, non-cached
output_tokens: number;
cache_read_tokens: number;
cache_write_tokens: number;
};
export function priceCall(u: Usage): number {
const r = RATES[u.model];
const per = (x: number) => x / 1_000_000;
return (
per(u.input_tokens) * r.input_fresh +
per(u.cache_read_tokens) * r.input_cache_read +
per(u.cache_write_tokens) * r.input_cache_write +
per(u.output_tokens) * r.output
);
}
Houd de tarieventabel in een config-bestand, niet in de code. De cijfers veranderen. De vorm niet.
Caching is de budget-multiplier
De grootste hefboom in deze hele oefening is prompt caching. De CRM-agent leest dezelfde bundle van dertigduizend tokens bij elke call: het salesplaybook van het bedrijf, de objection-handling guide, de ICP-definitie, en de interne threads van de afgelopen week over pricing. Niets daarvan verandert tussen calls. Het moet allemaal in de prompt staan om de agent goede outreach te laten schrijven. Zonder caching betaal je het input token-tarief over dertigduizend tokens, bij elke call opnieuw.
Met caching betaal je het cache write-tarief één keer per vijf-minuten venster, en het cache read-tarief op elke call binnen dat venster. In onze metingen bij deze klant trok dat de mediane sequence-kosten omlaag van ongeveer €1,05 naar €0,38. Een reductie van vierenzestig procent op de uitgaven, voor enige andere optimalisatie.
Als je prompt caching nog niet aan hebt staan voor een agent met veel volume, doe dat voordat je over je contract onderhandelt. Het verandert het bedrag waar je voor tekent.
Twee praktische opmerkingen over de cache. Eén: structureer de prompt zo dat de stabiele delen vooraan staan en de volatiele delen achteraan. De cache breekt zodra de prefix verandert. Twee: reken op een cache miss bij de eerste call van elk vijf-minuten venster. Een bursty team van veertig reps zit tijdens werktijd grotendeels binnen dat venster en valt 's nachts grotendeels eruit, wat prima is omdat er dan niemand werkt.
Soft warnings, hard cuts en de override pool
De cap is niet alleen een cijfer. Het is een reeks gedragingen die getriggerd worden bij zestig, tachtig, vijfennegentig en honderd procent van de seat-uitgaven.
Bij zestig procent gebeurt er niets zichtbaars voor de gebruiker. We loggen een marker zodat het analytics-dashboard de seat oranje kan kleuren als de cyclus pas halverwege is. Managers zien de grafiek. Reps niet.
Bij tachtig procent begint de proxy downshift: true terug te geven op routine-acties. De CRM wisselt Sonnet voor Haiku bij background research en korte samenvattingen. Concepten die de rep gaat lezen en bewerken blijven op Sonnet. De rep ziet een kleine banner in de agent-sidebar: 'Je hebt €640 van je cap van €800 gebruikt. Achtergrondtaken draaien de rest van de cyclus op een kleiner model.' Geen drama.
Bij vijfennegentig procent worden zelfs Sonnet-calls gedownshift. De banner verandert van neutraal naar waarschuwingskleur, en de agent zet één regel onder elk concept: 'Gegenereerd op het lite-model om binnen je maandelijkse cap te blijven.'
Bij honderd procent geven routine-acties een rustige weigering: 'Je hebt je AI-budget voor juni opgemaakt. Je manager kan het ophogen vanuit Instellingen. Critical client-acties op open deals lopen door.' Critical acties, de acties die door de caller getagd zijn, blijven draaien, maar boeken in een gedeelde override pool met een eigen daglimiet en een Slack-ping naar de sales ops lead. We gaven de override pool twaalf procent van het hoofdbudget mee, en dat heeft elke legitieme overschrijding gedekt in de drie cyclussen sinds.
Eén ding om mee op te passen. Als de hard cut ook critical acties blokkeert, beginnen je reps binnen een week persoonlijke Anthropic-accounts aan te maken op hun eigen creditcard. Vraag het iemand die ooit shadow IT heeft proberen te verbieden. De override pool is er om de cap eerlijk te houden zonder het team van het platform te jagen.
Wat de rep echt ziet
De zichtbare laag in de CRM bestaat uit drie dingen. Een kleine chip in de agent-sidebar met uitgaven, cap en resterende dagen in de cyclus. Een banner die verschijnt bij tachtig procent en verandert bij vijfennegentig. En een weigerscherm dat kort en rustig is, en de rep precies vertelt welke twee klikken naar 'vraag mijn manager om een verhoging' leiden.
// crm/AgentBudgetChip.tsx
<Chip tone={tone(spent, cap)}>
€{Math.round(spent)} / €{cap} gebruikt · {daysLeft} dagen over
</Chip>
Reps stopten binnen een week met vragen over kosten. De chip beantwoordde de vraag voordat ze 'm bedachten.
Het dashboard dat de CFO ook echt opent
Het interne dashboard is de andere helft. De proxy-database maakt dit triviaal, omdat elke call op rij-niveau staat: seat, action tier, model, kosten. Drie grafieken verdienen de hele oefening terug. Uitgaven per seat over de cyclus, aflopend gesorteerd. Uitgaven per action type, om te zien of één workflow disproportioneel veel budget vreet. En de burn van de override pool, met een rode lijn op het daglimiet.
Dit is de grafiek die de cap omzet van een financiële verdediging naar een productgesprek. Als het team ziet dat 'research een cold lead' vijfendertig procent van de agent-uitgaven opslokt en op vier procent converteert, gaat de volgende sprint niet over budget. Hij gaat over een goedkopere research-workflow.
De cap uitrollen zonder revolte
Het grootste implementatierisico was niet technisch. Het was de uitrol-e-mail. Als de reps de cap lezen als een bezuiniging, heb je een moraleprobleem voordat de eerste Sonnet-call gedownshift wordt.
We faseerden de launch over drie weken. Week één draaide de proxy in shadow mode: volledige accounting, geen blokkades, geen UI voor de rep. Die week gebruikten we om te bevestigen dat de verdeling per seat ook echt matchte met ons model, en om twee power users te vinden wiens workflow vanaf dag één de override pool nodig had in plaats van vanaf dag vijftien.
Week twee verscheen de chip in de sidebar, maar de cap stond op €1.200, bewust boven de hoogst gemeten uitgave. Reps kregen een heads-up bericht dat de vier-meter pricing in normale taal uitlegde en het override-pad benoemde. Niemand raakte het plafond.
Week drie zakte de cap naar €800 en gingen de soft warnings aan. We hebben de twee power users individueel pre-briefed en aangeboden om hun eerste week op een gedeeld budget te draaien, zodat ze hun gewoontes konden bijschaven zonder dat de chip op dag drie oranje werd. Beiden namen het aanbod aan. Bij cyclus drie had geen van beiden het nog nodig.
Hoe wij dit uitrollen
Toen we de CRM-agent voor dit team bouwden, liepen we ertegenaan dat twee power users zeventig procent van de maandelijkse Claude-uitgaven verbrandden in de eerste acht dagen van elke cyclus, en niemand merkte het tot de factuur binnenkwam. Uiteindelijk losten we het op met de vier-meter accounting, de ladder van soft naar hard cap, en de override pool hierboven, en de factuur is drie cyclussen achter elkaar binnen vijf procent van de forecast gebleven. Wil je hulp om dit soort guardrails in je eigen AI-agents te bouwen, dan is dat ongeveer de vorm van het werk.
Het kleinste wat je vandaag kunt doen: open de Anthropic-factuur van vorige maand, deel het totaal door het aantal mensen dat de agent echt heeft gebruikt, en kijk of het cijfer je verrast. Als dat zo is, is je cap al te laat.
Kern
Een AI-cap per seat met downshift voordat je weigert houdt de factuur voorspelbaar en de pipeline draaiend.
FAQ
Moet de cap per seat zijn of gepoold over het team?
Per seat voor de hoofdcap. Gepoolde caps belonen zware gebruikers en straffen voorzichtige, en je verliest de data per seat die je CFO nodig heeft. Pool het override-budget, niet de hoofdcap.
Wat gebeurt er als een rep midden in een live deal de cap raakt?
Routine-acties worden geblokkeerd. Critical acties, de acties die de aanroepende code als deal-stage werk tagt, lopen door en boeken in een gedeelde override pool met een daglimiet en een audit log.
Hoeveel bespaart prompt caching nou echt?
Bij deze klant bracht caching de mediane sequence-kosten omlaag van ongeveer €1,05 naar €0,38, een reductie van vierenzestig procent. Jouw cijfer hangt af van hoe stabiel je prompt prefix is.
Waarom een harde cap in plaats van alleen een alert?
Alerts worden gemute. Een harde cap dwingt het kostengesprek op je agenda in plaats van in je inbox. Je kunt nog steeds overrides toekennen, het verschil zit in de default.