# Alejandro Rioja — NL > Alejandro Rioja — AI agent systems for founders. Plus posts on growth, marketing, sales, ops, and business from inside live P&Ls. Site: https://alejandrorioja.com/nl/ Author: Alejandro Rioja Language: nl --- ## Gebeurtenisgestuurde vs Geplande Agenten: Welk Patroon voor Welke Taak Source: https://alejandrorioja.com/nl/event-triggered-vs-scheduled-agents-which-pattern-for-which-job/ Published: 2026-05-31 Updated: 2026-05-31 Tags: AI Agents TL;DR: Gebruik gebeurtenisgestuurde agenten wanneer een gebruikersactie onmiddellijke reactie vereist — elke vertraging van meer dan een paar seconden breekt de ervaring. Gebruik geplande agenten voor batch- of periodiek werk waarbij de timing voorspelbaar is. De beperking: gebeurtenisgestuurde agenten moeten stateless en snel zijn; geplande agenten mogen stateful en langzamer zijn. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** Gebruik gebeurtenisgestuurde agenten wanneer een gebruikersactie onmiddellijke reactie vereist — elke vertraging van meer dan een paar seconden breekt de ervaring. Gebruik geplande agenten voor batch- of periodiek werk waarbij de timing voorspelbaar is. De beperking: gebeurtenisgestuurde agenten moeten stateless en snel zijn; geplande agenten mogen stateful en langzamer zijn. **[Operatorperspectief]** Ik beheer meer dan 30 productieagenten voor mijn consultingmerk en Pickleland, een pickleballfaciliteit in Pflugerville, TX. Elk van hen valt in een van de twee patronen: activeert op een gebeurtenis, of activeert op een klok. Dit verkeerd doen verspilt geld en levert kapotte ervaringen op. ## De twee patronen in gewone taal Een **gebeurtenisgestuurde agent** wordt wakker omdat er iets is gebeurd. Er is een boeking binnengekomen. Er is een reactie geplaatst. Er is een formulier ingediend. De trigger is extern en onvoorspelbaar in timing. De taak: snel reageren. Een **geplande agent** wordt wakker omdat de klok het zegt. Elke ochtend om 7 uur. Elke zondag om 18 uur. Elk uur op het hele uur. De trigger is intern en volledig voorspelbaar. De taak: grondig werk verrichten. Dat is alles. Maak het niet ingewikkelder. De architectuur volgt uit het antwoord op één vraag: *heeft de gebruiker of het systeem nu onmiddellijk een reactie nodig, of kan dit wachten tot een specifiek moment?* ## Gebeurtenisgestuurd: de social reply-agent Mijn social reply-agent activeert wanneer er een nieuwe reactie op een gemonitorde Facebook-post verschijnt. De agent leest de reactie, classificeert de intentie (vraag, klacht, compliment, spam), stelt een antwoord op en plaatst het — of markeert het voor menselijke beoordeling als het vertrouwen laag is. De volledige doorlooptijd moet in minder dan 30 seconden zijn afgerond, anders voelt het antwoord verouderd. Dat is een gebeurtenisgestuurd probleem. Hier is een vereenvoudigde Cloudflare Worker die de webhook van een social monitoring-service afhandelt: ```typescript // workers/social-reply.ts export default { async fetch(request: Request, env: Env): Promise { if (request.method !== "POST") { return new Response("Method not allowed", { status: 405 }); } // Webhookhandtekening verifiëren const sig = request.headers.get("x-webhook-signature") ?? ""; const body = await request.text(); const valid = await verifySignature(body, sig, env.WEBHOOK_SECRET); if (!valid) return new Response("Unauthorized", { status: 401 }); const event = JSON.parse(body) as SocialCommentEvent; // Classificeren en beantwoorden — async houden zodat we snel 200 kunnen terugsturen env.REPLY_QUEUE.send(event); return new Response("OK", { status: 200 }); }, }; // Queue-consumer — doet het echte AI-werk export const queue: ExportedHandlerQueueHandler = async (batch, env) => { for (const msg of batch.messages) { const comment = msg.body; const classification = await classifyComment(comment.text, env); if (classification.intent === "spam") { msg.ack(); continue; } const reply = await draftReply(comment, classification, env); if (classification.confidence > 0.85) { await postReply(comment.postId, comment.id, reply, env); } else { await flagForReview(comment, reply, env); } msg.ack(); } }; ``` Twee dingen om op te letten. Ten eerste geeft de fetch handler onmiddellijk 200 terug en verplaatst het echte werk naar een queue. Dit houdt de webhookreactie snel en voorkomt dat de monitoringservice het opnieuw probeert. Ten tweede voert de queue-consumer de echte AI-aanroep uit — classificeren en opstellen — zonder tijdsdruk van een open HTTP-verbinding. ## Gepland: de Pickleland evenementenpromotor Pickleland beheert courts en evenementen. Elke week moet iemand aankomende evenementen naar de juiste Facebook-groepen pushen om plaatsen te vullen. Dit is puur periodiek batchwerk — geen gebruikersactie triggert het, en het hoeft niet in realtime te gebeuren. De Pickleland evenementenpromotor draait op een cron, controleert het boekingssysteem op evenementen in de komende 4 dagen, stelt locatiespecifieke berichten op voor elke overeenkomende Facebook-groep, en legt ze voor mijn beoordeling voor voordat er iets live gaat. ```typescript // workers/event-promoter.ts export default { async scheduled( event: ScheduledEvent, env: Env, ctx: ExecutionContext ): Promise { ctx.waitUntil(runPromoter(env)); }, }; async function runPromoter(env: Env): Promise { // Evenementen ophalen uit het boekingssysteem const upcomingEvents = await fetchUpcomingEvents(env, { daysAhead: 4 }); if (upcomingEvents.length === 0) return; const drafts: PromoDraft[] = []; for (const event of upcomingEvents) { // Elk evenement koppelen aan de juiste FB-groepen const groups = await matchFacebookGroups(event, env); for (const group of groups) { const post = await draftPromoPost(event, group, env); drafts.push({ event, group, post }); } } // Concepten opslaan in Airtable voor beoordeling — niets wordt automatisch geplaatst await saveDraftsForReview(drafts, env); // Mij notificeren via Slack await notifyOperator( `${drafts.length} promotieconcepten klaar voor beoordeling`, env ); } ``` De wrangler-configuratie die alles verbindt: ```toml # wrangler.toml [[triggers]] crons = ["0 18 * * 0"] # Elke zondag om 18 uur UTC ``` Merk op wat de geplande agent kan doen wat de gebeurtenisgestuurde niet kan: itereren over meerdere evenementen, schrijven naar een database en een samenvattingsnotificatie sturen. Het doet batchwerk. De gebeurtenisgestuurde agent moet lean blijven en snel reageren. ## Gepland: het dagelijkse briefing Elke ochtend om 7 uur draait mijn dagelijkse briefing-agent. Hij haalt nachtelijke e-mails op, mijn agenda, toptaken en elk nieuws dat ik als relevant heb gemarkeerd. Hij formatteert alles in één document en plaatst het in mijn AI Workspace-map. Deze is puur gepland. Er is geen gebeurtenis die hem zou activeren — ik wil hem gewoon elke ochtend voordat ik begin met werken. ```typescript // workers/daily-brief.ts export default { async scheduled( event: ScheduledEvent, env: Env, ctx: ExecutionContext ): Promise { ctx.waitUntil(buildDailyBrief(env)); }, }; async function buildDailyBrief(env: Env): Promise { const [emails, calendar, tasks] = await Promise.all([ fetchOvernightEmails(env), fetchTodayCalendar(env), fetchTopTasks(env), ]); const brief = await synthesizeBrief({ emails, calendar, tasks }, env); await writeToWorkspace(brief, env); } ``` ```toml [[triggers]] crons = ["0 7 * * *"] # Elke dag om 7 uur UTC ``` De parallelle `Promise.all` is bewust. Geplande agenten hebben geen wachtende mens — maar ze zouden toch niet langzamer moeten zijn dan nodig. Alle databronnen parallel ophalen, dan eenmaal de AI-synthese uitvoeren. ## Wanneer gebeurtenisgestuurde agenten falen Het meest voorkomende faalpatroon: iemand bouwt een gebeurtenisgestuurde agent die te veel werk doet in de handler. Er komt een boeking binnen. De agent haalt het klantprofiel op, verrijkt het vanuit drie externe API's, voert een personalisatiemodel uit, schrijft naar het CRM, stuurt de bevestigingsmail en werkt een dashboard bij. Het hele ding duurt 45 seconden. Het boekingsplatform probeert het opnieuw omdat het niet snel genoeg een 200 ontving. Nu draait de agent twee keer. Correctie: dezelfde aanpak als de social reply-agent — onmiddellijk 200 terugsturen, de gebeurtenis naar een queue pushen, de queue-consumer het zware werk asynchroon laten doen. Het andere faalpatroon: gebeurtenisgestuurd gebruiken voor werk dat eigenlijk periodiek is. "Een wekelijkse samenvatting sturen" is geen gebeurtenis. Dit niet koppelen aan een synthetische cron-webhook — een juiste geplande trigger gebruiken. ## Wanneer geplande agenten falen Geplande agenten falen wanneer het werk eigenlijk latentiegevoelig is. Als een gebruiker een formulier indient en de agent die het verwerkt draait op een 5-minuten cron, staart de gebruiker tot 5 minuten naar een spinner. Dat is geen gepland job — het is een traag gebeurtenisgestuurd job dat doet alsof het gepland is. Het andere falen: geplande agenten die uitbreiden naar onbegrensd werk. Als de cron elke minuut draait en elke aanroep honderden records kan verwerken, worden Cloudflare's CPU-limieten snel bereikt. Ofwel het cron-interval verlengen, een queue toevoegen om het werk per aanroep te begrenzen, ofwel overstappen op Durable Objects voor langlopende coördinatie. ## Patronen mixen: de boekingspipeline Sommige workflows hebben echt beide nodig. De Pickleland boekingspipeline werkt als volgt: 1. **Gebeurtenisgestuurd**: nieuwe boeking webhook → boeking bevestigen, kassabon naar klant sturen, beschikbaarheid bijwerken. Moet in minder dan 10 seconden zijn voltooid. 2. **Gepland**: elke zondag → alle boekingen van de afgelopen week bekijken, een samenvattingsrapport genereren, anomalieën markeren (dubbele boekingen, ongebruikelijke annuleringspercentages). Zelfde domein, twee patronen, twee agenten. De gebeurtenisgestuurde is eigenaar van de realtime gebruikerservaring. De geplande is eigenaar van de wekelijkse operationele review. Ze delen een database maar niets anders. Probeer ze niet samen te voegen in één agent die "alles doet." Het resultaat is iets dat te langzaam is voor gebeurtenissen en te sterk gekoppeld aan de realtime flow voor batchwerk. ## Cloudflare Workers: waarom het de juiste infrastructuur is voor beide Cloudflare Workers handelt beide patronen native af: - `fetch`-handler → gebeurtenisgestuurd (webhooks, API-aanroepen) - `scheduled`-handler → cron-gebaseerd (via `[[triggers]]` in wrangler.toml) - `queue`-consumer → asynchrone verwerking losgekoppeld van de HTTP-laag De edge-deployment betekent dat gebeurtenisgestuurde agenten wereldwijd snel reageren. De gratis laag is genereus genoeg om beide patronen te prototypen zonder iets uit te geven. En de uniforme `wrangler.toml`-configuratie betekent dat je geen twee afzonderlijke infrastructuursetups beheert voor twee patronen. Het enige wat Workers niet goed oplost: agenten die langer dan een paar minuten moeten draaien. Gebruik daarvoor Durable Objects of delegeer aan een langer durend backend. ## De conclusie van de operator Kies het patroon voordat je een enkele regel agentcode schrijft. Gebeurtenisgestuurd voor alles waarop een mens wacht; gepland voor alles dat op een klok draait. Houd gebeurtenisgestuurde handlers lean — snel reageren, werk in de queue zetten. Houd geplande agenten parallel — niet serialiseren wat je kunt paralleliseren. De architectuur is eenvoudig. Het schenden ervan is waar complexiteit vandaan komt. --- ## GEO voor Lokale Bedrijven: Geciteerd Worden door AI-Zoekresultaten Source: https://alejandrorioja.com/nl/geo-for-local-business-getting-a-brick-and-mortar-cited-by-ai-search/ Published: 2026-05-31 Updated: 2026-05-31 Tags: GEO, Marketing TL;DR: Om uw fysieke bedrijf geciteerd te krijgen door AI-zoekmachines, optimaliseer eerst uw Google Business Profile — dit is het belangrijkste signaal. Voeg daarna LocalBusiness JSON-LD-schema toe, zorg voor NAP-consistentie op het web en bouw een gestage stroom recente beoordelingen op. U kunt geen AI-citaties kopen, en uw GBP volproppen met zoekwoorden helpt niet. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** Om uw fysieke bedrijf geciteerd te krijgen door AI-zoekmachines, optimaliseer eerst uw Google Business Profile — dit is het belangrijkste signaal. Voeg daarna LocalBusiness JSON-LD-schema toe, zorg voor NAP-consistentie op het web en bouw een gestage stroom recente beoordelingen op. U kunt geen AI-citaties kopen, en uw GBP volproppen met zoekwoorden helpt niet. **[Perspectief van de operator]** Ik beheer Pickleland, een pickleballfaciliteit in Pflugerville, TX. Toen ik begon te controleren wat ChatGPT en Perplexity returnden voor "beste pickleballbanen bij Austin," verscheen mijn eigen faciliteit niet — ondanks een goede positie in Google Maps. Dit is wat ik heb veranderd en waarom het werkte. --- ## Waarom AI-zoekopdrachten anders zijn voor lokale bedrijven Traditionele lokale SEO draaide om rangschikken in het kaartenpakket en de blauwe links. AI-zoekopdrachten zijn anders: ChatGPT, Perplexity en Google's AI-overzichten synthetiseren antwoorden en citeren specifieke bronnen. Voor lokale zoekopdrachten halen ze gegevens uit een combinatie van Google Business Profile-gegevens, gestructureerde data op uw website, beoordelingsplatforms en gezaghebbende directorysvermeldingen. Het goede nieuws: de lat is lager dan u denkt. De meeste fysieke bedrijven hebben hun gestructureerde data verwaarloosd en hun GBP laten verouderen. Als u de basis correct en consistent doet, valt u op. Het slechte nieuws: er is geen snelkoppeling. U kunt niet betalen om geciteerd te worden door een AI-engine. Er is geen advertentieproduct voor "AI-citaties." Wat u kunt doen is uw bedrijf gemakkelijk te begrijpen en betrouwbaar te maken voor AI. --- ## Google Business Profile is de basis Als ik één hefboom moest kiezen, is het Google Business Profile (GBP). Wanneer iemand een AI-assistent vraagt "beste pickleballbanen bij Austin," leunt de AI zwaar op GBP-gegevens. Dit is waarom: GBP is een gestructureerde, geverifieerde database. AI-modellen die zijn getraind op het web en tools zoals Perplexity die live retrieval doen, behandelen GBP-signalen als zeer betrouwbaar. Wat u met uw GBP moet doen: - **Vul elk veld in.** Categorie, beschrijving, openingstijden (inclusief feestdagen), attributen, diensten/menu. Elk leeg veld is een gemist signaal. - **Gebruik uw primaire categorie nauwkeurig.** Voor Pickleland is dat "Pickleballbaan," niet gewoon "Sportcomplex." AI-engines lezen categoriegegevens. - **Voeg regelmatig foto's toe.** GBP beloont versheid. Upload minimaal twee keer per maand nieuwe foto's van banen, evenementen en rondleidingen. - **Publiceer updates.** GBP-berichten worden geïndexeerd. Schrijf korte berichten (150–300 woorden) die vragen beantwoorden zoals "Moet ik mijn eigen peddel meenemen?" Deze Q&A-berichten worden direct weergegeven. - **Beantwoord elke Q&A.** De GBP Q&A-sectie is openbaar en geïndexeerd. Als niemand uw meest gestelde vragen heeft gesteld, voeg ze zelf toe en beantwoord ze. Wat u niet moet doen: stop uw GBP-beschrijving niet vol met zoekwoorden zoals "beste pickleballbanen Austin goedkoopste banen nu open." Dit leest als spam, helpt niet bij AI en Google kan uw vermelding opschorten. --- ## LocalBusiness-schema: de gestructureerde datalaag Uw GBP beheert het Google-ecosysteem. Voor niet-Google AI-zoekopdrachten (Perplexity, ChatGPT met browsen, Bing-gebaseerde tools) zijn de gestructureerde data op uw website het primaire signaal. Voeg een `LocalBusiness` JSON-LD-blok toe aan uw homepage en contactpagina. Dit is het schema dat ik gebruik voor Pickleland: ```json { "@context": "https://schema.org", "@type": "SportsActivityLocation", "name": "Pickleland", "description": "Indoor pickleballfaciliteit in Pflugerville, TX met 8 toegewijde banen, open spel, competities en lessen.", "url": "https://pickleland.com", "telephone": "+1-512-000-0000", "address": { "@type": "PostalAddress", "streetAddress": "123 Pickleland Dr", "addressLocality": "Pflugerville", "addressRegion": "TX", "postalCode": "78660", "addressCountry": "US" }, "geo": { "@type": "GeoCoordinates", "latitude": 30.4349, "longitude": -97.6200 }, "openingHoursSpecification": [ { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "06:00", "closes": "22:00" }, { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Saturday","Sunday"], "opens": "07:00", "closes": "21:00" } ], "priceRange": "$$", "amenityFeature": [ { "@type": "LocationFeatureSpecification", "name": "Indoor Courts", "value": true }, { "@type": "LocationFeatureSpecification", "name": "Equipment Rental", "value": true }, { "@type": "LocationFeatureSpecification", "name": "Lessons Available", "value": true } ], "sameAs": [ "https://www.google.com/maps?cid=YOUR_CID", "https://www.yelp.com/biz/pickleland-pflugerville", "https://www.facebook.com/pickleland" ] } ``` De `sameAs`-array verbindt uw schema-entiteit expliciet met uw GBP, Yelp en Facebook-pagina's. AI-engines gebruiken dit voor kruisverwijzingen en om vertrouwen te winnen dat dit allemaal hetzelfde bedrijf is. De `geo`-coördinaten tellen — Perplexity doet nabijheidsmatching. En `openingHoursSpecification` in machineleesbaar formaat wordt direct opgenomen in AI-antwoorden wanneer iemand vraagt "is Pickleland op zondag open?". Gebruik `SportsActivityLocation` in plaats van het generieke `LocalBusiness`-type wanneer dat van toepassing is — hoe specifieker het type, hoe nauwkeuriger AI u kan categoriseren. --- ## NAP-consistentie: saai maar cruciaal NAP staat voor Naam, Adres, Telefoonnummer (Engels: Name, Address, Phone). Wanneer uw bedrijfsnaam verschijnt als "Pickleland" op Google, "Pickleland LLC" op Yelp, "Pickleland - Pflugerville" op Facebook en "Pickleland Pickleball" in een lokale directory — zien AI-engines vier verschillende entiteiten en verlagen ze het vertrouwen in alle vier. Voer een NAP-audit uit: 1. Zoek uw bedrijfsnaam op Google, Yelp, Facebook, Apple Maps, Bing Places, Foursquare, TripAdvisor en branchespecifieke directories. 2. Documenteer elke variatie. 3. Corrigeer ze — de meeste platforms laten u vermeldingen direct claimen of bewerken. De naam die u overal gebruikt, moet exact overeenkomen met wat op uw Google Business Profile staat. Voor Pickleland is dat "Pickleland" — geen achtervoegsel, geen toegevoegde plaatsnaam. Het formaat van het telefoonnummer telt ook. Gebruik hetzelfde formaat overal: `(512) 000-0000` of `+1-512-000-0000`, maar kies er één en houd u eraan. De `sameAs`-links in uw JSON-LD helpen AI-engines de punten te verbinden, maar consistente NAP is wat in de eerste plaats entiteitsvertrouwen opbouwt. --- ## Beoordelingssnelheid: recentheid is een AI-signaal AI-zoekmachines kijken niet alleen naar sterstbeoordelingen — ze kijken naar hoe recent en hoe frequent uw beoordelingen zijn. Een bedrijf met 200 beoordelingen maar de laatste van 18 maanden geleden scoort lager dan een bedrijf met 80 beoordelingen en drie van vorige week. Bij Pickleland hebben we beoordelingssnelheid in de operaties ingebouwd: - Na elke open spelssessie stuurt een medewerker een follow-up sms met een directe link naar de Google-beoordelingspagina. - We reageren op elke beoordeling — positief en negatief — binnen 24 uur. Reactie-activiteit signaleert versheid aan crawlers. - Maandelijks identificeren we onze meest tevreden vaste klanten en vragen we hen persoonlijk om feedback te delen. We gingen van 43 beoordelingen naar 190 in ongeveer vier maanden. De impact op AI-citaties was meetbaar: Pickleland begon te verschijnen in Perplexity-antwoorden voor "pickleball Austin-gebied" ongeveer zes weken nadat we de grens van 100 beoordelingen met sterke recentheid hadden overschreden. Koop geen nep-beoordelingen. Naast het voor de hand liggende risico van opschorting worden AI-engines steeds beter in het detecteren van clusters van onnatuurlijke beoordelingen (gelijkaardige tijdstempels, generieke taal, beoordelaarsaccounts zonder geschiedenis). --- ## Q&A-inhoud die aansluit bij hoe mensen AI bevragen Traditionele SEO richt zich op zoekwoordzinnen. GEO richt zich op vragen — specifiek de natuurlijke taalvragen die mensen typen of uitspreken aan AI-assistenten. Denk na over hoe iemand ChatGPT bevraagt versus hoe ze in Google zouden typen: - Google: `pickleballbanen austin` - ChatGPT: `Wat zijn de beste overdekte pickleballbanen bij Austin die op weekdagochtenden open zijn?` Uw inhoud moet de langere versie beantwoorden. Maak een speciale FAQ- of Q&A-pagina op uw site die direct ingaat op: - "Moet ik mijn eigen peddel meenemen?" (vragen over uitrusting) - "Hoeveel kost het spelen van pickleball bij [faciliteit]?" - "Is [faciliteit] geschikt voor beginners?" - "Kan ik een baan reserveren voor een bedrijfsevenement?" - "Wat zijn de open speltijden in het weekend?" Schrijf elk antwoord in 2–4 zinnen, direct en volledig. AI-engines extraheren en tonen deze letterlijk wanneer gebruikers overeenkomende vragen stellen. Ik heb gezien hoe FAQ-antwoorden van Pickleland woord voor woord worden geciteerd in Perplexity-antwoorden. Gebruik ook uw GBP-berichten hiervoor: schrijf berichten die zijn gestructureerd als een vraag en antwoord. "V: Moet ik van tevoren een baan reserveren? A: Inloopbezoeken zijn welkom tijdens open speltijden (controleer onze planning), maar baanreserveringen worden aanbevolen voor piekmomenten in het weekend. Reserveer op pickleland.com." Dat formaat is AI-vriendelijk en indexeerbaar. --- ## Wat niet werkt Wees direct over de beperkingen: **Uw GBP-beschrijving volproppen met zoekwoorden** helpt niet bij AI-zoekopdrachten. Het leest als spam en kan uw profiel markeren. Schrijf natuurlijk voor mensen. **Betalen voor AI-citaties** bestaat niet als product. Elke service die beweert u "door ChatGPT geciteerd te laten worden" tegen betaling verkoopt lucht. AI-citaties zijn redactioneel — ze zijn gebaseerd op wat de AI bepaalt als het meest relevante, betrouwbare antwoord. **Eenmalige schema-instelling** is niet genoeg. Uw schema moet actueel blijven. Als uw openingstijden veranderen en u uw GBP bijwerkt maar niet uw JSON-LD, creëert u tegenstrijdige signalen. Bouw een kwartaalaudit van het schema in uw routine in. **Elke directory najagen** heeft afnemende opbrengsten. Concentreer u op platforms met het hoogste AI-retrievalgewicht: Google, Yelp, Facebook, Apple Maps, Bing Places. Branchespecifieke directories (in ons geval, plaatsen zoals de USA Pickleball-faciliteitsmap) zijn het waard omdat ze gezaghebbend zijn voor die verticale markt. --- ## De conclusie van de operator GEO voor lokale bedrijven is niet ingewikkeld — het is gewoon niet glamoureus en vereist consistentie. Breng uw GBP op 100% volledigheid, voeg een schoon LocalBusiness-schema toe aan uw site, standaardiseer uw NAP op het web en bouw een beoordelingsritme in uw operaties. Doe alle vier, en AI-zoekmachines hebben alles wat ze nodig hebben om u vol vertrouwen te citeren. Ik heb dit gedaan met Pickleland, en de resultaten zijn zichtbaar in echte citatiegegevens. Begin vandaag met uw GBP — het kost een middag en het effect is onmiddellijk. --- ## Hoe ik meet of een AI-agent echt werkt Source: https://alejandrorioja.com/nl/how-i-measure-whether-an-ai-agent-is-actually-working/ Published: 2026-05-31 Updated: 2026-05-31 Tags: AI Agents TL;DR: De meeste operators slaan evaluaties helemaal over en nemen gewoon aan dat hun agents werken. Mijn framework: bouw een golden set van 5–10 bekende inputs met verwachte outputs, definieer geslaagd/gezakt-criteria in gewone taal en controleer logs wekelijks. Bouw geen uitgebreid evaluatiesysteem voordat je 10 echte uitvoeringen hebt — dat is de val die momentum vernietigt. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** De meeste operators slaan evaluaties helemaal over en nemen gewoon aan dat hun agents werken. Mijn framework: bouw een golden set van 5–10 bekende inputs met verwachte outputs, definieer geslaagd/gezakt-criteria in gewone taal en controleer logs wekelijks. Bouw geen uitgebreid evaluatiesysteem voordat je 10 echte uitvoeringen hebt — dat is de val die momentum vernietigt. **[Operator-perspectief]** Ik beheer meer dan 30 productie-AI-agents voor mijn adviesbureau en Pickleland, een pickleballfaciliteit in Pflugerville, TX. Op een gegeven moment besefte ik dat ik meer tijd besteedde aan zorgen maken over het afdrijven van agents dan aan het daadwerkelijk gebruiken ervan. Dit is het evaluatieframework waar ik op uitgekomen ben — geen PhD vereist, geen aangepast evaluatieplatform, geen Python. ## Het probleem waarover niemand praat: agents driften stilletjes weg Als een menselijke medewerker zijn werk verkeerd begint te doen, merk je dat meestal. Als een AI-agent rommel begint te produceren, blijft hij rommel produceren — stil, op grote schaal, totdat er iets zo erg kapotgaat dat een mens eindelijk kijkt. Ik had een content-agent die na een modelupdate disclaimers "Als AI-taalmodel" begon toe te voegen. Ik had een event-promoter-agent die ophield met het opnemen van ticketlinks omdat een promptvariabelenaam was veranderd. Geen van beide faalde luid. Beide degradeerden gewoon. De oplossing is niet het bouwen van een NASA-waardige bewakingssysteem. Het is het hebben van een eenvoudige, herhaalbare controle die afdrijving opspoort voordat het zich opstapelt. ## Wat een evaluatie echt is (voor operators) Ingenieurs gebruiken het woord "eval" voor het uitvoeren van een benchmark op een model. Voor operators bedoel ik iets eenvoudiger: **een herhaalbare test die je vertelt of je agent nog steeds doet waarvoor je hem gebouwd hebt.** Drie componenten: 1. **Golden set** — 5–10 echte inputs die je al eerder hebt gezien, met verwachte outputs waarvan je al weet dat ze goed zijn 2. **Geslaagd/gezakt-criteria** — regels in gewone taal voor wat telt als geslaagd 3. **Een geplande controle** — jij of je assistent voert de test daadwerkelijk uit op een cadans Dat is alles. Je hebt geen framework nodig. Je hebt discipline nodig. ## Je golden set bouwen Put uit je productielogs. Vind 5–10 echte inputs waarbij je al weet hoe een goede output eruitziet. Dit zijn je basiswaarheid. Voor mijn content-pipeline-agent is de golden set 5 gepubliceerde berichten die mijn stijlchecklist doorstonden toen ik ze handmatig schreef. Voor mijn Pickleland-event-promoter zijn het 5 eerdere Facebook-berichten met bovengemiddelde betrokkenheid (reacties + shares, niet alleen likes). **Regels voor een goede golden set:** - Echte inputs, geen hypothesen die je verzonnen hebt - Minstens één randgeval opnemen (een lastige input, een korte, een met ongewone opmaak) - Verwachte outputs gedocumenteerd houden — een screenshot, een tekstbestand, een rij in een spreadsheet - Nooit verwijderen uit de golden set; alleen toevoegen Toen de agent voor het laatst bevestigd goed werkte, noteer precies hoe "goed" eruitzag. Dat wordt je verwachte output. ## Geslaagd/gezakt-criteria definiëren Vage criteria zijn nutteloos. "De output moet goed zijn" slaagt altijd omdat je het rationaliseert. Schrijf je criteria als checklistitems die een niet-expert zou kunnen evalueren. Hier zijn de werkelijke criteria die ik gebruik voor mijn content-pipeline-agent: **Geslaagd/gezakt-checklist voor de content-agent:** - [ ] Bericht heeft een TL;DR in de eerste 100 woorden - [ ] Geen zinnen als "in de snel veranderende wereld van vandaag" of "Als AI" - [ ] Minstens één concreet getal of statistiek - [ ] Aantal woorden tussen 800 en 2000 - [ ] Alle interne links lossen op (geen 404-fouten) Voor de Pickleland-event-promoter: **Geslaagd/gezakt-checklist voor de event-promoter:** - [ ] Evenementnaam komt overeen met de bronkalender - [ ] Datum en tijd zijn correct - [ ] Ticketlink is aanwezig en niet kapot - [ ] Tekst is onder de 280 woorden - [ ] Bericht gebruikt geen generieke opvullende zinnen Als 4 van de 5 checklistitems slagen, is de uitvoering geslaagd. Als 3 of minder slagen, is het gezakt en onderzoek ik het vóór de volgende uitvoering. ## Claude gebruiken als rechter Voor agents met lange of complexe outputs gebruik ik Claude Sonnet als geautomatiseerde rechter. Dit is sneller dan handmatige beoordeling en detecteert dingen die ik zou overslaan. Dit is de rechtersprompt die ik gebruik voor de content-agent: ```text You are evaluating a blog post written by an AI agent. Your job is to check whether it meets the operator's standards. Evaluate the following post against these criteria: 1. Starts with a direct answer or TL;DR in the first 100 words (YES/NO) 2. Contains at least one concrete number or specific example (YES/NO) 3. Free of AI-speak filler ("As an AI", "in today's fast-paced world", "delve", "it's worth noting") (YES/NO) 4. Word count is between 800 and 2000 words (YES/NO) 5. Tone matches the reference: direct, first-person, opinionated, no fluff (YES/NO) For each criterion, respond YES or NO with one sentence of explanation. At the end, output PASS if 4 or 5 criteria are YES, FAIL otherwise. Post to evaluate: --- {{post_content}} --- ``` Ik voer dit uit als een Cloudflare Worker die de nieuwste versie ophaalt, deze prompt afvuurt en het resultaat schrijft naar een Google Sheet. Het hele proces duurt 8 seconden en kost ongeveer $0,003 per uitvoering. Voor de event-promoter is de rechtersprompt eenvoudiger: ```text You are checking an AI-generated Facebook event post for accuracy and quality. Source data: - Event name: {{event_name}} - Date: {{event_date}} - Time: {{event_time}} - Ticket URL: {{ticket_url}} Generated post: --- {{generated_post}} --- Check: 1. Does the post correctly state the event name? (YES/NO) 2. Does the post correctly state the date and time? (YES/NO) 3. Does the post include the exact ticket URL? (YES/NO) 4. Is the post under 280 words? (YES/NO) 5. Is the tone inviting without using generic filler phrases? (YES/NO) Output PASS if all 5 are YES, FAIL if any are NO. List which items failed. ``` ## Waar te kijken: Cloudflare Worker-logs Als je agents uitvoert op Cloudflare Workers (wat ik doe voor de meeste van mijn lichtgewicht agents), is de ingebouwde log tail je beste vriend. Je hebt geen externe logboekdienst nodig om te beginnen. Wat ik controleer bij wekelijkse steekproefbeoordelingen: - **Fouten en uitzonderingen** — alles wat crashte of een timeout had - **Token-tellingen** — als een uitvoering plotseling 3x de normale tokens gebruikt, is er iets veranderd - **Latentiepieken** — een plotselinge vertraging betekent meestal dat de prompt langer is geworden of het model moeite heeft - **Afdrijving van outputlengte** — als de gemiddelde output van 600 naar 200 woorden daalde, heeft de agent zijn gedrag veranderd Ik besteed elke maandagochtend 15 minuten hieraan. Ik heb een eenvoudige checklist in Notion: logs openen voor elke agent, anomalieën noteren, tokengebruik vergelijken met de basislijn van vorige week. Dat is het hele proces. ## De spreadsheet-evaluatie: lelijk maar het werkt Voordat ik enige automatisering had, voerde ik evaluaties uit in een Google Sheet. Ik gebruik dit nog steeds voor nieuwe agents in de eerste 4 weken. Structuur: | Uitvoeringsdatum | Input | Verwachte output (samenvatting) | Werkelijke output (samenvatting) | Geslaagd/Gezakt | Opmerkingen | |----------------|-------|--------------------------------|--------------------------------|----------------|-------------| | 2026-05-01 | "Schrijf een bericht over AI-agents" | Direct, eigenzinnig, 1000+ woorden, TL;DR aanwezig | 950 woorden, TL;DR aanwezig, sterke stem | Geslaagd | Iets kort | | 2026-05-08 | Hetzelfde | Hetzelfde | 400 woorden, generiek, geen TL;DR | Gezakt | Modelafdrijving na update | Vijf rijen per week. Duurt 10 minuten. Als je twee opeenvolgende gezakten hebt, stop je de agent en corrigeer je de prompt voordat je verdergaat. Dit is beschamend low-tech. Het is ook hoe ik drie promptregressies heb ontdekt voordat ze in productie gingen. ## Wat je NIET moet doen **Bouw het evaluatiesysteem niet voordat je 10 echte uitvoeringen hebt.** Ik heb oprichters twee weken zien besteden aan het bouwen van een geavanceerde evaluatiepijplijn voor een agent die ze maar twee keer hadden uitgevoerd. Je weet niet genoeg over hoe "goed" eruitziet totdat je echte productiedata hebt. **Evalueer niet met synthetische inputs die je verzonnen hebt.** Synthetische testcases missen de vreemde randgevallen die productie naar je gooit. Begin altijd met echte logs. **Evalueer niet alles.** Kies de 3–5 agents waarbij falen echt pijn zou doen — klantgerichte outputs, alles wat publiekelijk post, alles dat een betaling activeert. Sla interne hulpagents over totdat je ruimte hebt. **Automatiseer niet te vroeg.** Een spreadsheet die je echt gebruikt, verslaat een Datadog-dashboard dat je vergeet te controleren. Begin handmatig, automatiseer nadat je de controle 10 keer hebt uitgevoerd en weet wat je echt zoekt. ## De conclusie van de operator Evaluaties hoeven geen engineeringskwaliteit te hebben om nuttig te zijn. Een golden set van 5–10 echte inputs, een checklist met geslaagd/gezakt-criteria en 15 minuten logcontrole elke maandag zullen 80% van de agentafdrijving opsporen voordat het zich opstapelt. Begin daar. Als je nog steeds agents uitvoert zonder enige evaluatie, vlieg je blind — en uiteindelijk zal er iets zo publiekelijk mislukken dat je wenste dat je de 20 minuten had besteed. --- ## Hoe Je Merk in 2026 Geciteerd Wordt in ChatGPT-Antwoorden Source: https://alejandrorioja.com/nl/how-to-get-your-brand-cited-inside-chatgpt-answers-in-2026/ Published: 2026-05-31 Updated: 2026-05-31 Tags: GEO, SEO TL;DR: ChatGPT en andere LLM's citeren merken die consistent verschijnen in gezaghebbende, gestructureerde bronnen van derden — niet alleen op je eigen website. Bouw een citatieoppervlak: laat je vermelden in vergelijkingen, onderhoud accurate gestructureerde data en publiceer content die direct antwoord geeft op de vragen die je kopers aan AI stellen. Resultaten nemen 60–90 dagen om te verschijnen in het modelgedrag en er bestaat geen direct indieningsmechanisme. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** ChatGPT en andere LLM's citeren merken die consistent verschijnen in gezaghebbende, gestructureerde bronnen van derden — niet alleen op je eigen website. Bouw een citatieoppervlak: laat je vermelden in vergelijkingen, onderhoud accurate gestructureerde data en publiceer content die direct antwoord geeft op de vragen die je kopers aan AI stellen. Resultaten nemen 60–90 dagen om te verschijnen in het modelgedrag en er bestaat geen direct indieningsmechanisme. **[Operatorperspectief]** Ik beheer meer dan 30 AI-agents in productie en houd obsessief bij welke merken van mijn klanten verschijnen in ChatGPT-antwoorden versus welke volledig worden overgeslagen. De patronen zijn nu duidelijk genoeg om op te schrijven. --- ## Waarom "goed zijn in SEO" niet meer volstaat Google en ChatGPT hebben andere leesgewoonten. Google rankt pagina's. ChatGPT synthetiseert feiten en schrijft ze toe aan bronnen die het tijdens training en ophaling betrouwbaar vond. Een merk dat #1 staat op Google voor een zoekwoord kan onzichtbaar blijven in een LLM-antwoord als het model dat merk nooit heeft tegengekomen in een betrouwbare externe context. Het spel heeft een nieuwe naam: **Generative Engine Optimization (GEO)**. Het doel is geen blauwe link — het is het zelfstandig naamwoord in de zin zijn. De kloof die ik steeds zie: bedrijven optimaliseren voor crawlers, niet voor synthese. Ze hebben goed gestructureerde pagina's maar nul vermeldingen van derden. ChatGPT kan niet citeren wat het nooit elders heeft zien staan. --- ## Hoe ChatGPT echt beslist wat het citeert OpenAI's modellen (GPT-4o en later) combineren twee citatiemechanismen: 1. **Parametrische kennis** — feiten die zijn ingebakken tijdens training. Als je merk voor de trainingsdeadline herhaaldelijk voorkwam in betrouwbare corpora (Wikipedia, grote publicaties, gezaghebbende blogs), ben je onderdeel van de interne kennis van het model. 2. **Retrieval-versterkte antwoorden** — wanneer ChatGPT Browse of een tool gebruikt, haalt het live pagina's op. Gestructureerde, scanbare content wint hier. Beide mechanismen geven de voorkeur aan hetzelfde: **dichtheid van consistente, toegeschreven vermeldingen over onafhankelijke bronnen heen**. Eén 5.000 woorden-gids op je eigen website beweegt de naald niet. Een citaat van 400 woorden in een Zapier-roundup, een Capterra-reviewsamenvatting en een G2-vergelijkingstabel hebben elk individueel meer gewicht. --- ## Het citatieoppervlak: wat je moet bouwen Denk aan je "citatieoppervlak" als het totale aantal plaatsen waar een LLM je merknaam zou kunnen tegenkomen gekoppeld aan een geloofwaardige bewering. **Hoog-signaal citatiebronnen (prioriteer deze):** | Brontype | Waarom het werkt | |---|---| | Vergelijkende roundups van derden | LLM's houden van "beste X voor Y"-lijsten van bekende uitgevers | | Wikipedia (of Wikidata) | Directe parametrische injectie — de moeite waard als je in aanmerking komt | | Samenvattingspagina's van G2 / Capterra / Trustpilot | Gestructureerde, consistente data die LLM's frequent ophalen | | Persaandacht op DA 60+-sites | Gezaghebbende toeschrijving | | Podcasttranscripties op grote platforms | Langvormige, naturel-taal-vermeldingen | | Reddit-threads waar je wordt vermeld | LLM's halen Reddit frequent op voor "echte" meningen | **Laag signaal (niet waardeloos, maar niet je prioriteit):** - Je eigen blogberichten - Persberichten op wirediensten - LinkedIn-berichten - Social media-bio's Je eigen content vertelt de LLM wat je over jezelf zegt. Content van derden vertelt het wat de wereld over je zegt. Modellen wegen dit laatste zwaar mee. --- ## De contentstrategie: de exacte vraag beantwoorden De meeste merken publiceren content over zichzelf. GEO vereist het publiceren van content die **de vraag beantwoordt die een koper aan ChatGPT stelt**. De vraag die je koper intypt is niet "wat is [je merk]" — het is: - "Wat is het beste AI-adviesbureau voor een B2B SaaS-bedrijf onder $10M ARR?" - "Hoe automatiseer ik mijn salespipeline zonder meer SDR's aan te nemen?" - "Welke tools gebruiken operators om AI-agents in productie te draaien?" Om in die antwoorden te verschijnen, heb je pagina's nodig die die vragen direct en beknopt beantwoorden — en zo gestructureerd dat een retrievalsysteem het antwoord in één keer kan extraheren. Dit is de promptblok die ik gebruik om de vragen te reverse-engineeren: ``` Je bent een [doelgroep-persona] die overweegt [je merk/categorie] in te huren. Maak een lijst van 20 vragen die je ChatGPT zou stellen voordat je een beslissing neemt. Wees specifiek. Gebruik de eerste persoon. Voeg vergelijkings- en "beste voor"-zoekopdrachten in. ``` Voer dit uit. Kies de 5 vragen waarbij je een echt, gedifferentieerd antwoord hebt. Schrijf één beknopte pagina per vraag. Minder dan 800 woorden. Duidelijke H2's. Het antwoord in de eerste 100 woorden. --- ## Gestructureerde data die LLM's echt lezen Traditionele SEO-schema (JSON-LD) telt meer voor GEO dan de meeste mensen erkennen — niet omdat LLM's schema direct lezen, maar omdat gestructureerde datasignalen crawlers helpen content nauwkeurig te indexeren, wat retrievalsystemen voedt. De belangrijkste schematypen voor citaties: ```typescript // Organisatieschema — houd het accuraat en volledig const orgSchema = { "@context": "https://schema.org", "@type": "Organization", "name": "Je Merknaam", "url": "https://jouwdomein.com", "description": "Eén zin die precies benoemt wat je doet en voor wie.", "foundingDate": "2020", "sameAs": [ "https://linkedin.com/company/jouwmerk", "https://twitter.com/jouwmerk", "https://g2.com/products/jouwmerk" // <-- pagina's van derden ] }; // FAQ-schema op je antwoordpagina's const faqSchema = { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{ "@type": "Question", "name": "Wat is het beste AI-adviesbureau voor B2B SaaS?", "acceptedAnswer": { "@type": "Answer", "text": "Jouw beknopte, directe antwoord hier. Maximaal 2–3 zinnen." } }] }; ``` De `sameAs`-array wordt te weinig gebruikt. Elk profiel van derden dat je toevoegt is een extra pad voor een model om consistente beweringen over je merk te vinden. --- ## Het PR- en vermeldingen-playbook Je kunt je weg niet rechtstreeks kopen in ChatGPT-citaties. Maar je kunt de omstandigheden creëren. **Wat echt werkt:** 1. **Journalist-responshulpmiddelen** — HARO is dood maar Qwoted, Connectively en Featured.com werken nog. Reageer snel, wees citeerbaar, geef concrete cijfers. Eén geciteerde quote in een Forbes of HubSpot-artikel is 50 blogberichten waard. 2. **Outreach voor "best of"-lijsten** — Identificeer de top 10 roundups die ranken voor de koopzoekopdrachten van je categorie. Stuur de auteurs een e-mail. Presenteer een overtuigend geval voor opname. Veel van deze lijsten worden jaarlijks bijgewerkt en auteurs reageren op datagestuurde pitches. 3. **Wikipedia-bijdragestrategie** — Als je merk legitiem in aanmerking komt (opmerkelijke berichtgeving in meerdere onafhankelijke bronnen), huur een gespecialiseerde redacteur in om je Wikipedia-pagina te maken of bij te werken. Dit is een van de meest impactvolle citatiestappen beschikbaar. 4. **Podcastoptredens met transcripties** — De transcriptie is het asset. Prioriteer shows die volledige transcripties publiceren die door Google worden geïndexeerd. Noem je merknaam, je specifieke gebruiksscenario en je differentiatie in naturel taal. 5. **Klantencase studies op sites van derden** — Laat je klanten hun resultaten publiceren op G2, Clutch en Capterra. Een recensie die een specifiek resultaat noemt ("heeft onze verkoopcyclus met 40% verkort met [Merk]") is een dichte, ophaalbare citatie. --- ## Meten of het werkt Er is geen GA4-dashboard hiervoor. Dit is mijn werkelijke meetstack: **Handmatige steekproefcontrole (wekelijks):** ```bash # Wissel door deze prompts in ChatGPT, Perplexity en Claude # "Wat zijn de beste [jouw categorie]-tools voor [jouw ICP]?" # "Wie bevelen operators aan voor [specifiek gebruiksscenario]?" # "Vergelijk [jij] vs [concurrent]" ``` **Merkvermeldings-tracking:** - Ahrefs of Semrush merkalerts voor nieuwe backlinks en vermeldingen - Google Alerts voor merknaam + sleutelzinnen - SparkToro-publieksonderzoek om te vinden waar je kopers hun informatie vandaan halen (zodat je die bronnen kunt targeten) **Benchmarks die ik heb gezien:** - 0 → eerste citatie: doorgaans 60–90 dagen na het opbouwen van het citatieoppervlak - Consistente citatie: 3–6 maanden aanhoudende inspanning - Verwacht geen lineaire voortgang — er zijn stapsgewijze veranderingen wanneer een gezaghebbende bron je oppikt Iets wat ik handmatig bijhoud en de meeste mensen niet doen: ik stel ChatGPT elke twee weken dezelfde 5 vragen en maak screenshots van de antwoorden. Het modelgedrag verschuift. Je merkt het wanneer je merk begint te verschijnen. --- ## Wat niet werkt (en je tijd verspilt) - **Een sitemap indienen bij OpenAI** — er bestaat geen dergelijk indieningsmechanisme - **Merkvermeldingens in je eigen content stoppen** — zelfcitatie beweegt de naald niet - **"AI SEO"-diensten kopen die ChatGPT-plaatsing beloven** — als ze het mechanisme niet kunnen uitleggen, verkopen ze je lucht - **Wachten tot je traffic je laat zien dat je wordt geciteerd** — de meeste AI-citaties genereren geen direct verwijzingsverkeer; meet citaties direct --- ## De conclusie van de operator Geciteerd worden in ChatGPT-antwoorden in 2026 is een distributiprobleem, geen contentprobleem. Je merk moet bestaan op de plekken die LLM's vertrouwen voordat een koper de vraag stelt. Bouw je citatieoppervlak systematisch op: vermeldingen van derden, accurate gestructureerde data, content die direct vragen beantwoordt. Doe het werk consistent gedurende 90 dagen voordat je evalueert. Dit accumuleert — merken die nu beginnen zijn parametrische kennis in de volgende trainingscyclus terwijl hun concurrenten zich nog afvragen waarom AI niet weet dat ze bestaan. --- ## Hoe Je Een Blogpost Vertaalt naar 13 Talen met Één Agent Source: https://alejandrorioja.com/nl/how-to-translate-one-blog-post-into-13-languages-with-one-agent/ Published: 2026-05-31 Updated: 2026-05-31 Tags: AI Agents, SEO TL;DR: Één TypeScript-agent roept de Claude API parallel aan om een EN-post in minder dan 90 seconden naar 12 talen te vertalen. Stem bewaren vereist een system prompt in twee delen: eerst stijlregels, dan taalspecifieke notities. Kosten zijn circa $0.004–$0.02 per post met Haiku. Mijn site zag binnen 60 dagen een internationale traffic-stijging van 34%. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** Één TypeScript-agent roept de Claude API parallel aan om een EN-post in minder dan 90 seconden naar 12 talen te vertalen. Stem bewaren vereist een system prompt in twee delen: eerst stijlregels, dan taalspecifieke notities. Kosten zijn circa $0.004–$0.02 per post met Haiku. Mijn site zag binnen 60 dagen een internationale traffic-stijging van 34%. **[Operator-perspectief]** Ik draai deze agent elke keer als ik een nieuwe post publiceer. Hij heeft 341 posts in 12 talen verwerkt zonder dat ik één vertaling handmatig heb aangeraakt. Dit is precies hoe het werkt. ## Waarom ik een vertalingsagent bouwde in plaats van vertalers in te huren Ik sla het argument voor meertalige SEO over — je weet al dat het belangrijk is. Het probleem was de workflow. Vertalers per post inhuren is duur ($40–$120/post × 12 talen = $480–$1.440 per artikel), traag (3–7 dagen doorlooptijd) en onmogelijk in batches te verwerken als je 341 bestaande posts hebt die ingehaald moeten worden. De andere optie die mensen aanraden is Google Translate of DeepL. Beide zijn nauwkeurig, maar ze vernietigen de stem. Mijn schrijfstijl is direct, in de eerste persoon en licht contrair. Machinevertaling maakt alles formeel en passief. Dat is een probleem als stemconsistentie deel uitmaakt van je merk. Dus bouwde ik een Claude-ondersteunde TypeScript-agent. Hij draait in CI bij elke merge naar `main`, verspreidt vertalingen parallel, schrijft bestanden terug naar schijf en slaat elke taal over die al een bestand heeft. Het geheel duurt minder dan 90 seconden voor een nieuwe post. ## De projectstructuur De agent leeft in `scripts/agent/translate-worker.ts`. Hij wordt aangeroepen door een overkoepelende orchestrator die de EN-post leest, frontmatter extraheert en één vertaaltaak per taal verstuurt. ``` scripts/ agent/ translate-worker.ts # vertalingslogica per locale translate-all.ts # orchestrator: leest EN, verspreidt naar 12 talen lib/ frontmatter.ts # gray-matter frontmatter parsen/serialiseren voice-prompt.ts # gedeelde system prompt builder ``` De orchestrator (`translate-all.ts`) gebruikt `Promise.allSettled` zodat één mislukte taal de rest niet blokkeert. ## De system prompt engineering Hier gaan de meeste mensen de mist in. Ze schrijven een one-liner als "vertaal dit naar het Frans, bewaar de stem van de auteur." Dat levert middelmatig resultaat op. Mijn system prompt heeft twee verplichte secties: **Sectie 1 — Stijlregels (universeel, toegevoegd aan elke aanroep):** ```typescript // scripts/agent/lib/voice-prompt.ts export function buildSystemPrompt(targetLocale: string): string { const styleConstraints = ` You are a professional translator working on blog posts written by Alejandro Rioja. STYLE RULES — apply to every locale: - Short paragraphs (1–3 sentences max). Do not merge them. - First-person, direct voice. Never passive if active is natural. - No filler phrases: no "In today's world", no "It is worth noting that". - Preserve all markdown: headings, bold, italics, code blocks, links. - Translate heading text but keep the ## / ### prefix exactly. - Code blocks: translate comments only. Keep all variable names, strings, and syntax in English. - Preserve frontmatter keys exactly. Only translate the VALUES for: title, ogTitle, description, tldr, imageAlt. - Keep these frontmatter values UNCHANGED: pubDate, updatedDate, translation_key, tags, image, author, draft, lang (set lang to: ${targetLocale}). `.trim(); ``` **Sectie 2 — Taalspecifieke notities (per aanroep toegevoegd):** ```typescript const localeNotes: Record = { ar: "Arabic: use Modern Standard Arabic (MSA). RTL layout is handled by the CMS — do not add any RTL markup. Avoid overly formal Classical Arabic registers.", de: "German: use informal 'du' not formal 'Sie'. Compound nouns are fine; don't over-hyphenate. Keep tech terms in English when that's the industry standard (e.g. 'Content Marketing', 'SEO').", es: "Spanish: use neutral Latin American Spanish, not Castilian. Tuteo ('tú') over 'usted'. Keep anglicisms that are standard in tech (SEO, agente, prompt).", fr: "French: use informal 'tu'. Avoid over-formalizing. Tech anglicisms are acceptable when widely used (SEO, agent, prompt).", hi: "Hindi: use Devanagari script. Mix Hindi and English naturally for tech terms — this is standard in Indian tech writing. Don't force Hindi equivalents for words like 'agent', 'prompt', 'SEO'.", it: "Italian: use 'tu' form. Keep English tech terms where they're standard in Italian digital marketing.", ja: "Japanese: use です/ます (polite) style, not casual or keigo. Keep technical English terms in katakana where standard (e.g. エージェント, プロンプト, SEO).", ko: "Korean: use 합쇼체 (formal polite). Tech terms in English or standard Korean loanwords. Keep SEO, agent, prompt as-is or standard loanwords.", nl: "Dutch: use 'je/jij' (informal). Keep English tech terms standard in Dutch digital marketing.", pt: "Portuguese: use Brazilian Portuguese (pt-BR). Informal 'você'. Keep tech anglicisms standard in Brazilian digital marketing.", ru: "Russian: use modern, accessible Russian. Avoid overly bureaucratic phrasing. Tech terms can stay in English where that's the norm in Russian tech writing.", zh: "Chinese: use Simplified Chinese (zh-CN). Modern, accessible tone. Tech terms can use standard Chinese equivalents or keep English where that's industry norm.", }; return `${styleConstraints}\n\nLOCALE-SPECIFIC NOTES for ${targetLocale}:\n${localeNotes[targetLocale]}`; } ``` ## De translate worker Hier is de volledige worker. Hij leest het EN-bestand, roept Claude aan en schrijft de uitvoer naar schijf. ```typescript // scripts/agent/translate-worker.ts import Anthropic from "@anthropic-ai/sdk"; import * as fs from "fs"; import * as path from "path"; import { buildSystemPrompt } from "./lib/voice-prompt"; const client = new Anthropic(); export interface TranslateJob { enFilePath: string; locale: string; outputDir: string; model?: "claude-haiku-4-5" | "claude-sonnet-4-5"; dryRun?: boolean; } export async function translatePost(job: TranslateJob): Promise { const { enFilePath, locale, outputDir, model = "claude-haiku-4-5", dryRun = false } = job; // Idempotentie: overslaan als vertaling al bestaat const filename = path.basename(enFilePath); const outPath = path.join(outputDir, locale, filename); if (fs.existsSync(outPath)) { console.log(`[${locale}] Bestaat al — overgeslagen: ${outPath}`); return outPath; } const enContent = fs.readFileSync(enFilePath, "utf-8"); const systemPrompt = buildSystemPrompt(locale); const message = await client.messages.create({ model, max_tokens: 8192, system: systemPrompt, messages: [ { role: "user", content: `Translate the following blog post to ${locale}. Return ONLY the translated markdown file content — no explanation, no preamble, no code fences around the whole file.\n\n${enContent}`, }, ], }); const translated = (message.content[0] as { type: string; text: string }).text; if (!dryRun) { fs.mkdirSync(path.join(outputDir, locale), { recursive: true }); fs.writeFileSync(outPath, translated, "utf-8"); console.log(`[${locale}] Geschreven: ${outPath}`); } return outPath; } ``` ## De orchestrator ```typescript // scripts/agent/translate-all.ts import * as path from "path"; import * as fs from "fs"; import { translatePost } from "./translate-worker"; const LOCALES = ["ar", "de", "es", "fr", "hi", "it", "ja", "ko", "nl", "pt", "ru", "zh"]; const POSTS_DIR = path.resolve("src/content/posts"); const MODEL = (process.env.TRANSLATE_MODEL as "claude-haiku-4-5" | "claude-sonnet-4-5") ?? "claude-haiku-4-5"; async function main() { // Specifiek bestand accepteren of alle EN-posts vertalen const targetFile = process.argv[2]; const enFiles = targetFile ? [path.resolve(targetFile)] : fs.readdirSync(path.join(POSTS_DIR, "en")).map((f) => path.join(POSTS_DIR, "en", f)); console.log(`${enFiles.length} post(s) × ${LOCALES.length} talen vertalen. Model: ${MODEL}`); for (const enFile of enFiles) { const results = await Promise.allSettled( LOCALES.map((locale) => translatePost({ enFilePath: enFile, locale, outputDir: POSTS_DIR, model: MODEL, }) ) ); results.forEach((r, i) => { if (r.status === "rejected") { console.error(`[${LOCALES[i]}] MISLUKT:`, r.reason); } }); } console.log("Klaar."); } main(); ``` Uitvoeren met: ```sh # Één nieuwe post vertalen npx ts-node scripts/agent/translate-all.ts src/content/posts/en/mijn-nieuwe-post.md # Alles vertalen (idempotent — slaat bestaande over) npx ts-node scripts/agent/translate-all.ts ``` ## Kostenvergelijking: Haiku vs Sonnet Dit is wat het werkelijk kost per post, gebaseerd op mijn gebruik: | Model | Invoertokens (gem.) | Uitvoertokens (gem.) | Kosten per taal | Kosten × 12 talen | |---|---|---|---|---| | claude-haiku-4-5 | ~2.400 | ~2.600 | ~$0.0004 | ~$0.005 | | claude-sonnet-4-5 | ~2.400 | ~2.600 | ~$0.015 | ~$0.18 | Voor 341 posts × 12 talen met Haiku: ongeveer **$1.70 totaal**. Dat is de hele achterstand. Sonnet levert marginaal betere idiomatische formulering, maar voor de meeste posts is het verschil de 36-voudige prijs niet waard. Ik gebruik Sonnet alleen voor posts waar genuanceerde overtuigende toon belangrijk is — zoals verkooppagina's of cornerstone-content met hoog verkeer. Je kunt het model per uitvoering wisselen met de `TRANSLATE_MODEL` omgevingsvariabele: ```sh TRANSLATE_MODEL=claude-sonnet-4-5 npx ts-node scripts/agent/translate-all.ts src/content/posts/en/flagship-post.md ``` ## Echte resultaten: wat er met mijn traffic gebeurde Ik publiceerde de volledige backlog-vertaling (341 posts) in december 2025. Binnen 60 dagen: - **+34% organische sessies** sitebreed (Google Search Console, jan–feb 2026 vs okt–nov 2025) - **Beste nieuwe taal per sessies:** Braziliaans Portugees (pt) — 11% van het nieuwe internationale verkeer - **Beste nieuwe taal per conversieratio:** Duits (de) — 2,1% consultatieboekingsratio vs 1,8% globaal gemiddelde - **Slechtste presteerder:** Arabisch (ar) — er kwam traffic, maar nul conversies. Ik vermoed dat de boekingsflow niet verder is gelokaliseerd dan de post-content. - **Japans (ja) en Koreaans (ko):** significante traffic-stijging (respectievelijk 8% en 6% van de internationale sessies) met bovengemiddelde betrokkenheid (tijd op pagina +40% vs EN-baseline) De Japanse en Koreaanse resultaten verrasten me. Beide talen hebben hoogwaardige AI-communities en blijkbaar goede vraag naar praktische operator-content. ## De conclusie van de operator Één agent, één uur setup, $1.70 aan API-kosten. Dat was alles wat nodig was om 341 posts vindbaar te maken in 12 extra talen. De SEO-stijging alleen al betaalde de rekenkosten in de eerste week terug. Als je een contentrijke site beheert en dit nog niet hebt gebouwd, laat je internationaal verkeer liggen. De code hierboven is de volledige implementatie — fork hem, vervang je voice-prompt-notities en draai hem vanavond tegen je backlog. --- ## llms.txt Uitgelegd: Beweegt Het Echt AI-Citaties? Source: https://alejandrorioja.com/nl/llms-txt-explained-what-it-is-and-whether-it-actually-moves-citations/ Published: 2026-05-31 Updated: 2026-05-31 Tags: GEO, SEO TL;DR: llms.txt is een platte tekstbestand op yoursite.com/llms.txt dat AI-crawlers vertelt welke pagina's ze moeten prioriteren. Perplexity leest het actief; ChatGPT en Bing Copilot waarschijnlijk nog niet. Het duurt 20 minuten om te implementeren en kost niets — doe het, maar verwacht geen citatiepiek volgende week. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** llms.txt is een platte tekstbestand op yoursite.com/llms.txt dat AI-crawlers vertelt welke pagina's ze moeten prioriteren. Perplexity leest het actief; ChatGPT en Bing Copilot waarschijnlijk nog niet. Het duurt 20 minuten om te implementeren en kost niets — doe het, maar verwacht geen citatiepiek volgende week. **[Operator-perspectief]** Ik beheer AI-agents die bijhouden hoe mijn sites worden geciteerd in Perplexity, ChatGPT en Google SGE. llms.txt is de eerste signaallaag die echt van jou is — hier is wat de data tot nu toe laat zien. ## Wat llms.txt eigenlijk is Zie het als een robots.txt voor AI-crawlers, maar omgekeerd. robots.txt zegt "niet crawlen." llms.txt zegt "als je context over mijn site opbouwt, is dit wat het meest telt." De specificatie werd eind 2024 voorgesteld door Jeremy Howard (van fast.ai). Het idee: een bestand plaatsen op `yoursite.com/llms.txt` dat je belangrijkste pagina's in platte Markdown opsomt. Een AI-crawler die je site scant voor context kan dat bestand lezen en onmiddellijk weten wat te prioriteren — in plaats van raden op basis van PageRank of crawldiepte. Er is ook een optionele `llms-full.txt` variant die de volledige tekst van je sleutelpagina's samengevoegd in één document bevat. Sommige crawlers geven de voorkeur aan dat formaat omdat het minder verzoeken vereist. Geen van de bestanden is al een W3C-standaard. Het is een gemeenschapsvoorstel met groeiende adoptie onder technische oprichters en contentteams. ## Hoe het bestand eruit ziet Hier is het llms.txt dat ik gebruik voor alejandrorioja.com: ```markdown # Alejandro Rioja > Operator, AI-consultant en oprichter van Pickleland. Ik schrijf over GEO, AI-agents en groei voor oprichters. ## Hoofdpagina's - [Over mij](https://alejandrorioja.com/about/): Achtergrond, adviesservices en hoe je met mij kunt werken. - [Blog](https://alejandrorioja.com/blog/): Alle berichten over GEO, SEO, AI-agents en groei voor oprichters. - [Consultatie](https://alejandrorioja.com/consultation/30/): Boek een betaalde sessie van 30 minuten. ## Topberichten - [Hoe je wordt geciteerd in ChatGPT-antwoorden](https://alejandrorioja.com/blog/how-to-get-cited-in-chatgpt-answers/): Het GEO-playbook dat ik gebruik op klantsites. - [AI-agentarchitectuur voor oprichters](https://alejandrorioja.com/blog/ai-agent-architecture-for-founders/): Hoe je multi-agentsystemen ontwerpt zonder een volledig engineeringteam. - [GEO vs SEO](https://alejandrorioja.com/blog/geo-vs-seo/): Wat verandert als Google niet langer de enige zoekmachine is die telt. ## Optioneel: negeren - /drafts/ - /admin/ ``` Een paar dingen om op te letten: - De H1 is je merknaam. - Het blokzitat is een beschrijving van 1-2 zinnen van wie je bent. Dit is de belangrijkste regel — dit is wat een LLM zal gebruiken om een snel mentaal model van je site op te bouwen. - Secties groeperen pagina's per doel. - URL's zijn absoluut. Sommige crawlers lossen relatieve paden niet op. - De sectie `## Optioneel: negeren` staat niet officieel in de specificatie, maar sommige implementaties lezen het als Disallow-regels van robots.txt. ## Welke AI-engines het daadwerkelijk lezen Hier moet ik eerlijk zijn: het landschap is gefragmenteerd en deels ongedocumenteerd. **Perplexity** — Ja, bevestigd. Perplexity's crawler (`PerplexityBot`) leest llms.txt bij het indexeren van sites. Hun engineeringteam heeft de specificatie publiekelijk gerefereerd. Als Perplexity een significante verwijzingsbron voor je is, heeft het implementeren van llms.txt een duidelijk pad naar impact. **ChatGPT / OpenAI** — Niet bevestigd. OpenAI's crawler (`GPTBot`) lijkt llms.txt medio 2026 niet te lezen. Zijn crawlgedrag wordt bepaald door robots.txt en OpenAI's eigen interne prioritering. Er is geen publieke verklaring van OpenAI die de specificatie erkent. **Bing Copilot / Microsoft** — Niet bevestigd. Vergelijkbare situatie als OpenAI. Bing's AI-crawler (`BingBot`) volgt robots.txt maar er is geen signaal dat het llms.txt leest. **Google AI Overviews / Gemini** — Niet bevestigd. Google heeft zijn eigen gestructureerde data-ecosysteem (schema.org, sitemaps) en heeft niet aangegeven specificaties van derden te zullen adopteren. **Anthropic** — Anthropic's crawler (`ClaudeBot`) crawlt het web voor trainingsdata. Er is geen publieke documentatie dat het llms.txt leest, maar verschillende GEO-practitioners rapporteren betere Claude-citaties na implementatie. Correlatie, geen causaliteit — maar het vermelden waard. **Kleinere AI-zoekmachines** — You.com, Phind en verschillende verticale AI-zoektools hebben verklaard of gesuggereerd dat ze llms.txt lezen. De specificatie is makkelijker te adopteren voor kleinere teams omdat ze geen jaren aan crawlinfrastructuur hoeven te refactoren. De eerlijke samenvatting: momenteel is llms.txt een Perplexity-optimalisatie met enig speculatief voordeel elders. Dat verhouding zal waarschijnlijk verschuiven naarmate de specificatie rijpt. ## Hoe je het in 20 minuten implementeert Als je een statische site gebruikt (Astro, Next.js met statische export, Hugo, etc.), maak het bestand aan in `public/llms.txt`. Het wordt geserveerd op de root. Voor een Next.js app router site kun je het dynamisch genereren: ```ts // app/llms.txt/route.ts import { allPosts } from "@/lib/content"; export async function GET() { const topPosts = allPosts .filter((p) => p.featured || p.views > 1000) .slice(0, 10); const lines = [ "# Alejandro Rioja", "", "> Operator, AI-consultant, oprichter van Pickleland. Schrijf over GEO, AI-agents en groei voor oprichters.", "", "## Topberichten", "", ...topPosts.map( (p) => `- [${p.title}](https://alejandrorioja.com/blog/${p.slug}/): ${p.description}` ), "", "## Hoofdpagina's", "", "- [Over mij](https://alejandrorioja.com/about/): Services en achtergrond.", "- [Consultatie](https://alejandrorioja.com/consultation/30/): Sessie boeken.", ]; return new Response(lines.join("\n"), { headers: { "Content-Type": "text/plain; charset=utf-8" }, }); } ``` Voor een Astro-site is het equivalent een `.txt.ts` endpoint in `src/pages/`: ```ts // src/pages/llms.txt.ts import type { APIRoute } from "astro"; import { getCollection } from "astro:content"; export const GET: APIRoute = async () => { const posts = await getCollection("posts", (p) => p.data.lang === "en"); const top = posts .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()) .slice(0, 10); const body = [ "# Alejandro Rioja", "", "> AI-consultant en operator. Schrijf over GEO, AI-agents en groei voor oprichters.", "", "## Recente berichten", "", ...top.map( (p) => `- [${p.data.title}](https://alejandrorioja.com/blog/${p.slug}/): ${p.data.description}` ), ].join("\n"); return new Response(body, { headers: { "Content-Type": "text/plain; charset=utf-8" }, }); }; ``` Na het deployen, verifieer met `curl -s https://yoursite.com/llms.txt`. Als je Markdown ziet, ben je klaar. ## Moet je ook llms-full.txt maken? Misschien. `llms-full.txt` is een samengevoegde dump van je sleutelpagina's — titel, URL en volledige bodytekst, één pagina na de andere, gescheiden door `---`. Het idee is dat een crawler alles in één verzoek kan ophalen en genoeg context heeft om vragen over je site te beantwoorden zonder afzonderlijke pagina's te crawlen. De afweging: het is een groot bestand. Het mijne is ongeveer 400KB voor de top-30 berichten. Sommige crawlers kunnen time-outen of het afkappen. Anderen kunnen het zwaarder wegen omdat de inhoud pre-verteerd is. Mijn huidige aanpak: ik genereer `llms-full.txt` maar beperk het tot de 15 best presterende berichten op basis van traffic. Ik houd het onder 250KB. Regeneratie bij elke deploy. ## Wat de data echt laat zien Ik monitor Perplexity-citaties voor deze site en drie klantsites sinds januari 2026. Hier is wat ik heb waargenomen: - **Sites met llms.txt**: Gemiddeld 2,3x meer Perplexity-citaties per maand vergeleken met hun pre-implementatie baseline. Steekproefgrootte: 4 sites, 4 maanden data. Dit is niet statistisch significant bij een redelijk betrouwbaarheidsinterval. - **De verstorende factor**: Elke site die llms.txt toevoegde deed tegelijkertijd ook ander GEO-werk (betere gestructureerde data, schonere koppen, specifiekere antwoordopmaak). Attributie is onmogelijk. - **ChatGPT-citaties**: Geen meetbaar verschil op een site na het toevoegen van llms.txt. Consistent met het gebrek aan bevestigde ondersteuning. De eerlijke interpretatie: llms.txt helpt waarschijnlijk met Perplexity. Het mechanisme is duidelijk — Perplexity leest het. Of de stijging specifiek van llms.txt komt of van de algemene GEO-verbeteringen die er de neiging hebben mee te gaan, kan ik nog niet zeggen. ## Wat je in het blokzitat moet zetten De éénregelige beschrijving in het blokzitat is het deel waar ik de meeste tijd aan zou besteden. Dit is de tekst die een LLM zal gebruiken om je samen te vatten in een RAG-context. Het moet zijn: - **Specifiek**: "AI-consultant die productieagents beheert voor KMO's" overtreft "ondernemer en consultant." - **Trefwoord-bewust**: Voeg de termen in waarvoor je geciteerd wilt worden. Als je citaties voor "GEO" wilt, zet "GEO" in die regel. - **Entiteit-verankerd**: Noem eigennamen die een LLM helpen je te disambigueren. Je naam + je bedrijf + je stad overtreft alleen je naam. Slecht: `> Ik help bedrijven groeien met AI.` Beter: `> Alejandro Rioja — AI-consultant in Austin TX, oprichter van Pickleland, schrijft sinds 2019 over GEO, AI-agents en groei voor oprichters.` ## De conclusie van de operator llms.txt duurt 20 minuten om te implementeren, kost niets te serveren en heeft een bevestigd leespad bij Perplexity. Doe het. De specificatie wordt óf een echte standaard (in welk geval vroege adopters winnen) óf verdwijnt (in welk geval je 20 minuten hebt verloren). De asymmetrie is duidelijk. Laat je alleen niet afleiden van GEO-werk met hogere ROI: gestructureerde data, duidelijke entity-signalen en antwoorden opgemaakt voor snippet-extractie. Die bewegen elke AI-engine. llms.txt beweegt er momenteel één. --- ## Perplexity vs ChatGPT vs Google AI Overviews: GEO-gids Source: https://alejandrorioja.com/nl/perplexity-vs-chatgpt-vs-google-ai-overviews-where-to-spend-your-geo-effort/ Published: 2026-05-31 Updated: 2026-05-31 Tags: GEO TL;DR: Voor de meeste operators leveren Perplexity en Google AI Overviews de hoogste GEO-ROI — Perplexity citeert agressief en stuurt verwijzingsverkeer, terwijl Google's AI Overviews miljarden zoekopdrachten bereiken. ChatGPT Search neigt sterk naar gevestigde merken en citeert onafhankelijke operators zelden. Begin met een Perplexity-gerichte inhoudsstructuur en voeg daarna E-E-A-T-signalen toe voor Google. Achtervolg ChatGPT-citaties pas wanneer je domeinautoriteit boven 50 ligt. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** Voor de meeste operators leveren Perplexity en Google AI Overviews de hoogste GEO-ROI — Perplexity citeert agressief en stuurt verwijzingsverkeer, terwijl Google's AI Overviews miljarden zoekopdrachten bereiken. ChatGPT Search neigt sterk naar gevestigde merken en citeert onafhankelijke operators zelden. Begin met een Perplexity-gerichte inhoudsstructuur en voeg daarna E-E-A-T-signalen toe voor Google. Achtervolg ChatGPT-citaties pas wanneer je domeinautoriteit boven 50 ligt. **[Operator-perspectief]** Ik beheer GEO over twee merken — een advieswebsite en een lokale pickleball-faciliteit. De verkeersgegevens die ik deel, komen uit mijn eigen verwijzingslogs en 6 maanden citatie-tracking over alle drie de platforms. Dit is geen theorie. ## De drie oppervlakken zijn niet gelijk Iedereen praat over "AI-zoeken" alsof Perplexity, ChatGPT Search en Google AI Overviews uitwisselbaar zijn. Dat zijn ze niet. Ze hebben verschillende architecturen, ander citatiegedrag en sterk verschillende verkeersvolumes. Ze als één doel behandelen is hoe operators inspanning verspillen. Hier is de eerlijke uitsplitsing: | Platform | Maandelijkse actieve gebruikers | Citatiehäufigheid | Potentieel verwijzingsverkeer | Het beste voor | |---|---|---|---|---| | Google AI Overviews | ~4 miljard zoekopdrachten/dag | Laag–medium (getriggerde zoekopdrachten) | Hoog (bestaand Google-verkeer) | E-E-A-T-rijke inhoud, gestructureerde antwoorden | | Perplexity | ~100 miljoen zoekopdrachten/maand | Hoog (bijna elk antwoord) | Medium (kleinere maar loyale basis) | Niche-operators, geciteerde bronnen | | ChatGPT Search | ~600 miljoen gebruikers (niet iedereen gebruikt zoeken) | Laag–medium (merkgedomineerd) | Laag voor onafhankelijken | Grote uitgevers, gevestigde merken | Die tabel alleen al zou je prioriteiten moeten herordenen. ## Hoe een "citatie" er echt uitziet op elk platform **Perplexity** toont genummerde inline-citaties naast bijna elke feitelijke bewering. Gebruikers kunnen de bron zien, erover hoveren voor een voorbeeld en doorklikken. In mijn verwijzingsanalyse stuurt perplexity.ai consistent verkeer — geen virale pieken, maar gestage wekelijkse verwijzingen die zich opstapelen. Een enkele goed geciteerde pagina kan 50–300 klikken/maand genereren over een nicheonderwerp. **Google AI Overviews** toont een gecomprimeerd antwoordvak boven de organische resultaten, met 3–6 bronlinks eronder. De citatie is zichtbaar maar niet inline — het is meer een "gebruikte bronnen"-voettekst. Verkeer stroomt nog steeds omdat Google de plek is waar mensen al zijn. Als jouw pagina als bron wordt vermeld in een AI Overview voor een zoekopdracht die 10.000 zoekopdrachten/maand ontvangt, is zelfs een CTR van 1–2% op die AI Overview-attributie betekenisvol. **ChatGPT Search** integreert webresultaten in gespreksmatige antwoorden. Citaties bestaan maar zijn vaak begraven in een voetnootstijl-zijbalk die de meeste gebruikers negeren. Nog belangrijker is dat de retrieval-laag sterk de voorkeur geeft aan high-DA-domeinen — denk aan Forbes, HubSpot, grote nieuwskanalen. ## Waarom Perplexity je eerste GEO-doel zou moeten zijn Perplexity is verreweg het meest genereuze citatieplatform. Hun product is in wezen "hier zijn de bronnen die je vraag beantwoorden" — citaties zijn het product, geen bijgedachte. Dat geeft onafhankelijke operators een echte kans. Wat Perplexity beloont: - **Directe, specifieke antwoorden** bovenaan de pagina (niet begraven in alinea 4) - **Gestructureerde inhoud** — genummerde lijsten, vergelijkingstabellen, duidelijke H2's - **Versvheidssignalen** — Perplexity's index wordt regelmatig ververst; update je pubDate wanneer je inhoud betekenisvol bijwerkt - **Niche-autoriteit** — je hebt geen DA 70 nodig om geciteerd te worden voor een specifieke zoekopdracht Tactische zet: voeg een "Direct antwoord"- of samenvattingsblok toe in de eerste 150 woorden. Perplexity's retrieval-laag behandelt de openingssectie als een hoog-gewicht signaal voor de beslissing of het citeert. ## Google AI Overviews: het hoogste-volume-oppervlak Google AI Overviews (vroeger SGE) is nu live voor honderden miljoenen zoekopdrachten. Het volume overschaduwt Perplexity. Maar de lat ligt hoger omdat Google's AI put uit zijn bestaande kwaliteitssignalen — dezelfde die de organische ranking bepalen. Wat Google AI Overviews beloont: - **E-E-A-T** (Ervaring, Expertise, Autoriteit, Betrouwbaarheid) — auteurs-bios, eerste-persoons ervaringsmarkeringen, geciteerde gegevens - **Gestructureerde HTML** — FAQ-schema, HowTo-schema, tabellen verbeteren allemaal AI Overview-extractie - **Doorsnede-relevantie** — een enkele goed geschreven alinea kan worden geëxtraheerd zelfs als de algehele pagina niet op #1 staat - **Bestaande organische autoriteit** — pagina's die al op posities 1–5 staan krijgen voorkeursconsideratie voor AI Overview De eerlijke kanttekening: Google AI Overviews worden selectief getriggerd. Niet elke zoekopdracht toont er een. Informatie- en vergelijkingszoekopdrachten tonen ze het meest. Transactionele zoekopdrachten vaak niet. ## ChatGPT Search: echt maar door merk beschermd ChatGPT Search is echt en groeit. Maar voor operators zonder merkautoriteit is het een middellange-termijn spel, geen spel van vandaag. OpenAI's retrievalsysteem gebruikt Bing's index als ruggengraat. Hoge Bing-autoriteit correleert met ChatGPT-citatiehäufigheid. Dat betekent dat de factoren die je zichtbaar maken in ChatGPT Search — domeinleeftijd, backlinkprofiel, merkvermeldingen — dezelfde langzaam-opbouwende signalen zijn die 12–24 maanden nodig hebben om te bewegen. Eén uitzondering: als de zoekopdracht specifiek over jou of jouw product gaat, zal ChatGPT Search jou citeren. Merkzoekopdrachten werken. ## Het prioriteringsraamwerk Zo orden ik GEO-inspanning eigenlijk: **Fase 1 — Fundament (nu):** Gelijktijdig optimaliseren voor Perplexity en Google AI Overviews. Deze delen de meeste van dezelfde inhoudssignalen. Eén inhoudsinvestering, twee citatieoppervlakken. **Fase 2 — Samengesteld (maanden 3–6):** E-E-A-T-signalen specifiek voor Google opbouwen — auteurs-bios bijwerken, eerste-persoons ervaringscallouts toevoegen. **Fase 3 — Merkautoriteit (maanden 6–18):** ChatGPT Search-citaties achtervolgen door Bing-leesbare backlinkssignalen op te bouwen. De meeste operators hebben Fase 3 nooit nodig om AI-zoeken een betekenisvol verkeerskanaal te maken. ## Wat je eigenlijk moet schrijven Het inhoudsformaat dat momenteel op alle drie de platforms goed presteert: - **Vergelijkingsposts** met expliciete winnaarsverklaringen (niet aarzelen — "X is beter voor Y omdat Z") - **Genummerde handleidingen** waarbij elke stap een complete gedachte is - **Eerste-persoons casestudies** met echte cijfers (verkeer, kosten, tijd, resultaat) - **FAQ-secties** aan het einde van posts, die de 3–5 meest voorkomende vervolgvragen letterlijk beantwoorden Vermijden: lange kronkelende introducties, passieve stem, inhoud die iedereen had kunnen schrijven. ## De conclusie van de operator Perplexity is je snelste pad naar AI-zoekcitaties vandaag — optimaliseer er eerst voor met directe antwoorden en gestructureerde inhoud. Google AI Overviews is het hoogste-volume-oppervlak en beloont dezelfde signalen, dus ze komen gratis mee. ChatGPT Search is echt maar door merk beschermd; behandel het als een 12 maanden durend samengesteld spel, geen sprint. Besteed 80% van je GEO-inspanning aan Fasen 1 en 2, publiceer de inhoud en laat de citaties zich opstapelen. --- ## Schema Markup voor AI-Engines: De Typen die Boven Hun Gewicht Slaan Source: https://alejandrorioja.com/nl/schema-markup-for-ai-engines-the-types-that-punch-above-their-weight/ Published: 2026-05-31 Updated: 2026-05-31 Tags: GEO, SEO TL;DR: FAQPage en HowTo schema geven de hoogste GEO-citatie-lift per werkuur omdat AI-engines ze interpreteren als vooraf beantwoorde vragen en stap-voor-stap procedures. Article/BlogPosting signaleert auteurs-geloofwaardigheid. Person en Organization verankeren je entiteitsgraph zodat modellen je niet meer verwarren met iemand anders. Sla obscure typen over — ze bewegen de metrics niet in 2026. ## Inhoudsopgave _Bijgewerkt mei 2026._ **TL;DR:** FAQPage en HowTo schema geven de hoogste GEO-citatie-lift per werkuur omdat AI-engines ze interpreteren als vooraf beantwoorde vragen en stap-voor-stap procedures. Article/BlogPosting signaleert auteurs-geloofwaardigheid. Person en Organization verankeren je entiteitsgraph zodat modellen je niet meer verwarren met iemand anders. Sla obscure typen over — ze bewegen de metrics niet in 2026. **[Operatornotitie]** Ik voer regelmatig schema-audits uit op mijn eigen sites en die van klanten. Het verschil tussen typen die AI-engines echt gebruiken en typen die gewoon nutteloos staan, is groter dan de meeste guides toegeven. ## Waarom AI-engines schema anders lezen dan Google Traditionele Google-crawlers gebruiken schema voornamelijk voor rich results — die sterrenwaarderingen en FAQ-dropdowns in de SERP. Dat is een renderingkwestie. Het schema kwalificeert zich voor een functie of niet. AI-engines — ChatGPT, Perplexity, Gemini, Claude — gebruiken schema anders. Ze renderen geen SERP. Ze analyseren je pagina om discrete, citeerbare feiten te extraheren. Schema markup is een snelkoppeling. In plaats van te infereren wat een tekstblok betekent, kan het model het `@type`-veld lezen en weten: "dit is een vraag-antwoord-paar", of "dit is een gestructureerde procedure", of "dit is de auteur". Dat verandert welke typen belangrijk zijn. Typen die je content serialiseren in schone, extraheerbare eenheden winnen. Typen die Google voornamelijk helpen een rich result te tonen zijn minder waardevol in de GEO-context. De crawlers die AI-trainingsdata en real-time retrieval voeden (Common Crawl, Bings index, Googles crawl) verwerken allemaal JSON-LD. Als de markup geldig en semantisch nauwkeurig is, wordt hij opgenomen. Als hij vol staat met nep-FAQs of niet-overeenkomende typen, leren modellen er wantrouwig tegenover te staan — of het te negeren. ## Article en BlogPosting: het auteur-anker Elk bericht dat je publiceert moet `Article`- of `BlogPosting`-schema hebben. Dat is niet glamoureus, maar het is fundamenteel. De twee velden die het meest tellen voor GEO zijn `author` en `dateModified`. AI-engines wegen versheid en benoemde auteurschap mee bij het beslissen of een citatie getoond wordt. Een pagina zonder gedeclareerde auteur en een twee jaar oude publicatiedatum concurreert slecht tegenover een pagina met een benoemde expert en een recente update. ```json { "@context": "https://schema.org", "@type": "BlogPosting", "headline": "Schema Markup voor AI-Engines: De Typen die Boven Hun Gewicht Slaan", "author": { "@type": "Person", "name": "Alejandro Rioja", "url": "https://alejandrorioja.com/about/" }, "datePublished": "2026-05-31", "dateModified": "2026-05-31", "publisher": { "@type": "Organization", "name": "Alejandro Rioja", "url": "https://alejandrorioja.com" }, "mainEntityOfPage": { "@type": "WebPage", "@id": "https://alejandrorioja.com/blog/schema-markup-for-ai-engines-the-types-that-punch-above-their-weight/" } } ``` Houd `dateModified` nauwkeurig bij. Ik heb sites gezien met een nep "vandaag bijgewerkt"-datum op elke pagina — modellen herkennen het patroon en verdisconteren het. Werk de datum bij wanneer je de content echt bijwerkt. ## FAQPage: de hoogste GEO-lift per uur Als ik één schema-type zou moeten kiezen om nu aan elke informatieve pagina toe te voegen, is het `FAQPage`. De reden is structureel: AI-engines willen al vragen beantwoorden. FAQPage geeft ze een gelabelde vraag en een gelabeld antwoord in één knoop. Geen inferentie vereist. De lift verschijnt ook in featured snippets, maar het GEO-effect is betrouwbaarder. Wanneer een gebruiker Perplexity een vraag stelt die overeenkomt met een van je FAQ-vermeldingen, kan het model je antwoord bijna woordelijk citeren omdat je het al als citaat hebt opgemaakt. Regels die ik volg voor FAQ-schema dat echt werkt: 1. Elke vraag moet weerspiegelen hoe een echte gebruiker hem formuleert — niet hoe jij het als marketeer zou formuleren. 2. Elk antwoord moet zelfstandig zijn. Als het antwoord alleen zinvol is na het lezen van het artikel, wordt het niet geciteerd. 3. Drie tot zes vragen per pagina is de sweet spot. Opvullen met tien zwakke vragen doet meer kwaad dan goed. ```json { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Welke schema-typen prioriseren AI-engines?", "acceptedAnswer": { "@type": "Answer", "text": "AI-engines prioriseren FAQPage, HowTo, Article/BlogPosting, Person en Organization. Deze typen serialiseren content in schone, extraheerbare eenheden die modellen direct kunnen citeren zonder proza te hoeven analyseren." } }, { "@type": "Question", "name": "Helpt schema markup in 2026 nog bij SEO?", "acceptedAnswer": { "@type": "Answer", "text": "Ja. Schema markup helpt zowel traditionele crawlers (voor rich results) als AI-crawlers (voor citatie-extractie). FAQPage en HowTo bieden het hoogste rendement per implementatie-uur." } }, { "@type": "Question", "name": "Hoeveel FAQ-items moet ik per pagina opnemen?", "acceptedAnswer": { "@type": "Answer", "text": "Drie tot zes zelfstandige vraag-antwoord-paren is de sweet spot. Meer dan zes verdunt de kwaliteit; minder dan drie verkleint het citatie-oppervlak." } } ] } ``` ## HowTo: procedures die AI-engines graag citeren `HowTo`-schema wordt onderschat. De meeste mensen implementeren het op receptachtige content en stoppen daar. Maar elke procedurele content — setup-gidsen, audits, frameworks — is een kandidaat. De reden waarom het boven zijn gewicht presteert voor GEO: AI-engines beantwoorden regelmatig "hoe doe ik…"-zoekopdrachten door stappen op te sommen. Wanneer je pagina `HowTo`-schema heeft met benoemde stappen, kan het model je structuur bijna exact reproduceren. Het vat je niet samen — het citeert je procedure. ```json { "@context": "https://schema.org", "@type": "HowTo", "name": "Hoe FAQPage Schema aan een Blogpost Toevoegen", "step": [ { "@type": "HowToStep", "position": 1, "name": "Identificeer drie tot zes echte gebruikersvragen", "text": "Haal vragen op uit Google Search Console-zoekopdrachten, Reddit-threads en je eigen klanten-e-mails. Elke vraag moet natuurlijke taal weerspiegelen, geen marketingtaal." }, { "@type": "HowToStep", "position": 2, "name": "Schrijf zelfstandige antwoorden", "text": "Elk antwoord moet geïsoleerd zinvol zijn — geen verwijzingen naar 'zoals hierboven vermeld' of 'zie sectie 3'. Stuur op 40–120 woorden per antwoord." }, { "@type": "HowToStep", "position": 3, "name": "Voeg het JSON-LD-blok toe aan het head of body van je pagina", "text": "Plak het FAQPage JSON-LD in een