Waarom WordPress LMS-plugins falen op schaal: architectuurproblemen
Waarom WordPress LMS-plugins falen op schaal: Architectuurproblemen
Ik heb in de afgelopen 18 maanden drie WordPress LMS-installaties gemigreerd naar headless architecturen. Elk geval had dezelfde geschiedenis: alles werkte prima met een paar honderd studenten, het team vierde hun lanceermetrics, en ergens tussen de 500 en 2.000 gelijktijdige gebruikers stortte alles in. Trage paginalaadtijden. Mislukte quizinzendingen. Webhooks voor betalingen die uitliepen. Video's die zich in het oneindige bufferde.
Het WordPress LMS-ecosysteem -- LearnDash, LifterLMS, TutorLMS, Masteriyo, Masterstudy -- heeft werkelijk indrukwekkend werk gedaan om online onderwijs te democratiseren. Ik wil dat niet afwimpelen. Maar er is een plafond, en het is geen zacht plafond. Het is een harde architectuurmuur die ingebakken zit in hoe WordPress data, sessies en media verwerkt. Laten we dit uit elkaar halen.
Inhoudsopgave
- Het Monoliethprobleem: WordPress is hier nooit voor ontworpen
- Databasearchitectuur: Waar het allemaal misloopt
- De wp_postmeta Bottleneck
- Media en videaopslag: De ontbrekende infrastructuur
- Sessiebeheer en gelijktijdige gebruikers
- Beveiligingsoppervlak op schaal
- Echte prestatienummers: WordPress LMS versus Headless
- Wat daadwerkelijk op schaal werkt
- Wanneer WordPress LMS nog steeds logisch is
- Veelgestelde vragen

Het Monoliethprobleem: WordPress is hier nooit voor ontworpen
WordPress is een monolithische PHP-toepassing die elk verzoek door een enkele pijplijn verwerkt. Elke paginalaadtijd -- of het nu een eenvoudig blogbericht is of een complexe quiz met getimede inzendingen, voortgangstracering en voorwaardelijke logica -- gaat door dezelfde wp-load.php → wp-config.php → wp-settings.php → thema → plugin-initialisatieketen.
Voor een blog? Dat is prima. De overhead is verwaarloosbaar.
Voor een LMS die 1.000 studenten bedient die gelijktijdig quizzen nemen? Je initialiseert 30+ plugin-bestanden, laadt vertalingsreeksen, vuurt tientallen action hooks af, en voert een query uit op een relationele database -- bij elk verzoek. Er is geen manier om selectief alleen te laden wat de quiz-engine nodig heeft.
Zo ziet een typische WordPress LMS-aanvraagcyclus eruit:
HTTP-verzoek
→ PHP-FPM-proces gestart
→ WordPress kernbootstrap (~40-80ms)
→ Plugin-initialisatie - ALLE plugins (~50-200ms)
→ Thema-initialisatie (~20-60ms)
→ LMS-plugin-routekoppelingen (~10-30ms)
→ Databasequeries voor cursus-/les-/quizgegevens (~30-500ms)
→ Queries voor voortgangstracering (~20-100ms)
→ Sjabloonweergave (~30-80ms)
→ HTML-respons verzonden
Dat is 200-1.050ms voordat het cachen plaatsvindt. En het volgende is belangrijk -- de meeste LMS-interacties kunnen niet in cache worden opgeslagen. Quizinzendingen, voortgangstracering, inschrijvingscontroles, drip-contentberekeningen -- dit zijn allemaal gebruikersspecifieke, dynamische bewerkingen die paginacaching volledig bypassen.
Ik heb LearnDash-installaties geprofileerd met Query Monitor en New Relic. Een enkele lespagina met voortgangstracering, prerequisitcontroles en drip-contentlogica genereert tussen de 80 en 250 databasequeries. Dit is geen bug -- het is hoe de architectuur werkt.
Databasearchitectuur: Waar het allemaal misloopt
Dit is de worteloorzaak. Als u niets anders begrijpt over waarom WordPress LMS-plugins op schaal moeite hebben, begrijp dan dit gedeelte.
WordPress slaat bijna alles op in twee kernpatronen:
- Entity-tabellen (
wp_posts,wp_users,wp_comments) - Meta-tabellen (
wp_postmeta,wp_usermeta,wp_commentmeta)
De meta-tabellen gebruiken een Entity-Attribute-Value (EAV)-patroon. In plaats van speciale kolommen voor elk stuk gegevens, wordt alles als sleutel-waardeparen opgeslagen, gekoppeld aan een bovenliggende entity.
Zo ziet de voortgang van een enkele student in een cursus er uit in wp_usermeta met LearnDash:
-- Dit zijn echte meta_key-patronen van LearnDash
SELECT * FROM wp_usermeta WHERE user_id = 1234;
-- Retourneert rijen zoals:
-- meta_key: _sfwd-course_progress | meta_value: a:3:{s:7:"courses";a:12:{...}}
-- meta_key: _sfwd-quizzes | meta_value: a:8:{...}
-- meta_key: learndash_course_expired_1234 | meta_value: 1714003200
-- meta_key: course_points | meta_value: 450
-- ... mogelijk tientallen meer rijen per cursusvolgval
Merk op dat meta_value-kolom? Het is een LONGTEXT-veld dat geserialiseerde PHP-arrays bevat. Je kunt het niet indexeren. Je kunt er niet efficiënt in query's uitvoeren. Om erachter te komen welke studenten Les 7 van Cursus 3 hebben voltooid, moet de plugin:
- Alle gebruikers ingeschreven in Cursus 3 opvragen
- Hun geserialiseerde voortgangsgegevens ophalen
- Deserialiseren in PHP
- Doorlopen om Les 7-voltooiing te controleren
Dat is O(n) op het aantal ingeschreven studenten, uitgevoerd in PHP, voor wat een eenvoudige geïndexeerde opzoeking zou moeten zijn.
De wp_postmeta Bottleneck
Het wordt erger. Cursussen, lessen, onderwerpen, quizzen en vragen worden allemaal opgeslagen als aangepaste posttypen in wp_posts, met hun configuratie opgeslagen in wp_postmeta. Een enkele quiz met 20 vragen kan gemakkelijk 200+ rijen in wp_postmeta genereren.
Hier is de tabelstructuur:
CREATE TABLE wp_postmeta (
meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
post_id bigint(20) unsigned NOT NULL DEFAULT 0,
meta_key varchar(255) DEFAULT NULL,
meta_value longtext,
PRIMARY KEY (meta_id),
KEY post_id (post_id),
KEY meta_key (meta_key(191))
);
Twee indexen. Dat is alles. En de meta_key-index wordt afgekapt tot 191 tekens. Als je 500 cursussen hebt met elk 20 lessen, 5 quizzen per cursus en 10.000 ingeschreven studenten, kan je wp_postmeta-tabel gemakkelijk 2-5 miljoen rijen bereiken. Je wp_usermeta-tabel groeit nog sneller.
Ik heb WordPress LMS-installaties gezien met 15 miljoen rijen in wp_usermeta alleen. Op dat moment duren zelfs geïndexeerde queries honderden milliseconden omdat de tabel niet meer in de InnoDB-bufferpool past, en je raakt de schijf.
Een speciaal gebouwde LMS-database zou er totaal anders uitzien:
-- Zo ziet een juist LMS-schema eruit
CREATE TABLE course_progress (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
course_id BIGINT NOT NULL,
lesson_id BIGINT NOT NULL,
status ENUM('not_started', 'in_progress', 'completed') NOT NULL,
score DECIMAL(5,2),
completed_at TIMESTAMP,
INDEX idx_user_course (user_id, course_id),
INDEX idx_course_status (course_id, status),
INDEX idx_lesson_completion (lesson_id, status, completed_at)
);
Speciale kolommen. Juiste indexen. Geen serialisatie. Queries die tegen wp_usermeta 3 seconden zouden duren, duren hier 3 milliseconden.
Media en videaopslag: De ontbrekende infrastructuur
Dit is het probleem dat het LinkedIn-bericht van Great Opomu heeft benadrukt, en het is absoluut echt. WordPress LMS-plugins in 2026 missen nog steeds native integratie met cloudopslagproviders.
Dit is de typische stroom wanneer een instructeur een cursusvideo uploadt naar een WordPress LMS:
- Video wordt geüpload via WordPress-mediauploader
- PHP verwerkt de upload (geheugenbeperkt, time-outgevoelig)
- Bestand komt terecht in
/wp-content/uploads/op dezelfde server met WordPress - Video wordt vanuit die dezelfde server via Apache/Nginx geserveerd
Elk aspect hiervan is verkeerd voor schaal:
- Upload: PHP's standaard
upload_max_filesizeis 2MB. Zelfs verhoogd naar 512MB, je houdt een PHP-proces open voor de volledige uploadduur. - Opslag: Lokale schijf op een enkele server betekent geen CDN-distributie, geen redundantie, en je webserver's I/O-bandbreedte concurreert met videobezorgning.
- Bezorging: Een 2GB videobestand via Nginx op dezelfde doos serveren die quizinzendingen verwerkt betekent dat je PHP-FPM-workers uitgehongerd zijn voor resources.
Wat je echt nodig hebt:
Instructeur uploadt video
→ Voorsigned URL naar S3/DigitalOcean Spaces (bypasses WordPress volledig)
→ Transcodingpijplijn (AWS MediaConvert, Mux, enzovoort)
→ Adaptieve bitrategravarianten opgeslagen op cloudopslag
→ Geserveerd via CDN (CloudFront, Fastly, Bunny)
→ Ondertekende URLs met expiratie voor DRM
Sommige LMS-plugins zeggen je om Vimeo of YouTube-links in te sluiten. Dat werkt, maar het is een handmatige omzeiking, geen architectuur. Je verliest voortgangstracering binnen video's, kunt opeenvolgende weergave niet afdwingen, en je beheert inhoud via twee platforms.
Enterprise LMS-platforms als Skilljar, Intellum en Thinkific hebben deze infrastructuur ingebouwd. WordPress LMS-plugins niet omdat het WordPress-mediasysteem daar niet voor is ontworpen, en het eraan aanpassen zou praktisch inhouden dat je een afzonderlijke toepassing in een plugin bouwt.

Sessiebeheer en gelijktijdige gebruikers
WordPress gebruikt PHP-sessies of op cookie gebaseerde verificatie voor ingelogde gebruikers. Wanneer een student ingelogd is en aan een cursus werkt, bevat elk verzoek verificatie-overhead. Standaard slaat WordPress sessies op in de database.
Met 1.000 gelijktijdige studenten:
- 1.000 actieve sessies die
wp_usermetaraken voor sessietokens - Elk paginanavigatie-element triggert verificatie van inschrijving, voortgangscontroles en contenttoegangvalidatie
- Auto-save-functies voor quizzen (elke 30-60 seconden) creëren blijvende schrijflast
- WooCommerce-winkelwagen-/sessiegegevens (als gebruikt voor inschrijving) voegen nog een laag toe
Het PHP-FPM-procesmodel verergert dit. Elk gelijktijdig verzoek heeft zijn eigen PHP-FPM-werkproces nodig, meestal consumptie van 30-60MB RAM. Met 100 gelijktijdige verzoeken:
100 workers × 50MB gemiddeld = 5GB RAM alleen voor PHP
+ MySQL bufferpool: 2-4GB
+ OS-overhead: 1-2GB
= 8-11GB minimum voor 100 gelijktijdige gebruikers
Schaal dat naar 1.000 gelijktijdige gebruikers en je kijkt naar speciale infrastructuur die $500-1.000/maand kost alleen maar om het verkeer aan te kunnen. Een headless architectuur die dezelfde inhoud via een statische frontend met API-ondersteunde interacties serveert, kan 10x de belasting op een $50/maand-setup aan.
Ik heb een LearnDash-installatie loadgetest met Locust (op Python gebaseerde loadtest). Hier is wat er gebeurde:
| Gelijktijdige gebruikers | Gem. reactietijd | Foutpercentage | Server CPU |
|---|---|---|---|
| 50 | 380ms | 0% | 35% |
| 100 | 720ms | 0,2% | 58% |
| 250 | 1.800ms | 2,1% | 82% |
| 500 | 4.200ms | 8,7% | 97% |
| 1.000 | Timeout | 43% | 100% |
Dit was op een 4-core, 16GB RAM VPS met Redis-objectcaching, OPcache en Nginx fastcgi_cache (wat geen cache kon maken van ingelogde gebruikerspagina's). Geen goedkope setup.
Beveiligingsoppervlak op schaal
De 2026 WordPress Plugin Security Audit Guide van WebHostMost maakt een belangrijk punt: 71% van de bekendgemaakte plugin-beveiligingsproblemen bleven onopgelost binnen de eerste week van januari 2026. Deze statistiek zou iedereen die studentengegevens via WordPress verwerkt angst moeten aanjagen.
Een LMS op schaal verwerkt:
- Persoonlijke informatie: Studentennamen, e-mails, adressen
- Betalingsgegevens: Creditcards (meestal via Stripe/PayPal, maar sessietokens en bonnen leven in WordPress)
- Academische records: Cijfers, certificaten, voltooiingsgegevens
- Content-IP: Gesloten cursusmaterialen ter waarde van mogelijk miljoenen
Het beveiligingsoppervlak van een typische WordPress LMS-installatie omvat:
- WordPress core
- De LMS-plugin (LearnDash, LifterLMS, enz.)
- WooCommerce (voor betalingen)
- Een lidmaatschapsplugin (vaak MemberPress of Restrict Content Pro)
- Een formplugin voor aangepaste inschrijvingsstromen
- Een e-mailmarketingintegratie
- Een paginabouwer
- 5-10 aanvullende utiliteitsplugins
Dat zijn 10-15 onafhankelijk onderhouden codebasen, elk met zijn eigen updatecyclus, beveiligingspraktijken en potentiële beveiligingsproblemen. De Gravity Forms-supply-chain-compromis in juli 2026 toonde aan hoe zelfs premium, goed onderhouden plugins kunnen worden misbruikt.
Op schaal riskeer je niet alleen een verminkte website. Je riskeer een gegevensbreuk die duizenden studenten treft, met FERPA, GDPR en implicaties van statelijke privacywetten.
Echte prestatienummers: WordPress LMS versus Headless
Laat me concrete nummers delen van een migratie die we in laat 2025 hebben gedaan. De klant gebruikte een LearnDash + WooCommerce-setup met ongeveer 8.000 ingeschreven studenten en 120 cursussen.
| Maatstaf | WordPress + LearnDash | Headless (Next.js + aangepaste API) |
|---|---|---|
| Tijd tot eerste byte (TTFB) | 1,2-3,8s | 45-120ms |
| Lespaginalaadtijd | 3,5s | 0,8s |
| Quizinzending | 2,1s | 280ms |
| Capaciteit gelijktijdige gebruikers | ~300 | ~5.000+ |
| Maandelijkse hostingkosten | $380/mnd (beheerde WP) | $95/mnd (Vercel + PlanetScale) |
| Lighthouse Prestatiescore | 42 | 97 |
| Databasequeries per pagina | 120-250 | 2-5 (API-aanroepen) |
| Maandelijkse beveiligingspatches | 4-8 plugin-updates | 1-2 afhankelijkheidsupdates |
De headless-setup gebruikte Next.js voor de frontend (statisch gegenereerd waar mogelijk, server-weergegeven voor dynamische inhoud), een aangepaste REST API gebouwd met Node.js voor cursuslogica, PlanetScale voor de database met een juist relationaal schema, Mux voor videobezorging en Stripe rechtstreeks voor betalingen zonder WooCommerce als middelman.
Totale migratietijd: ongeveer 10 weken. Was het meer initieel werk dan het installeren van een plugin? Uiteraard. Maar de studentenvoltooiingspercentages van de klant gingen met 23% omhoog -- deels omdat pagina's sneller laadden, en deels omdat quizinzendingen niet meer uitliepen.
Als je een soortgelijke architectuur overweegt, heeft ons Next.js-ontwikkelingsteam dit soort migratie meerdere keren gedaan.
Wat daadwerkelijk op schaal werkt
Als je een LMS bouwt die meer dan een paar honderd gelijktijdige gebruikers moet serveren, zijn hier architecturen die daadwerkelijk standhouden:
Headless CMS + Aangepaste Frontend
Gebruik een headless CMS voor contentbeheer -- instructeurs krijgen nog steeds een vriendelijke bewerkingsinterface -- en bouw een aangepaste frontend in Next.js, Astro of vergelijkbaar. Cursuslogica leeft in een juiste backend-service met een goed ontworpen databaseschema.
Beste voor: Organisaties die volledige controle nodig hebben en unieke cursusmechanica hebben.
Beheerd LMS-platform + Aangepaste Frontend
Platforms als Thinkific, Teachable of Kajabi verwerken de backend (inschrijvingen, voortgang, betalingen, videohosting) terwijl je een aangepast-gebrande frontend bouwt via hun API's.
Beste voor: Teams die snel willen werken zonder infrastructuur te bouwen.
Hybride: WordPress voor inhoud, Ontkoppelde LMS-logica
Houd WordPress als inhoudsopslagplaats (het is werkelijk goed in contentbeheer) maar trek cursusgegevens via de REST API naar een afzonderlijk gehoste frontend. Verplaats inschrijving, voortgangstracering en quizlogica naar een speciale service.
Beste voor: Teams met bestaande WordPress-inhoud die een volledige migratie niet kunnen rechtvaardigen.
We hebben alle drie patronen gebouwd. De op Astro gebaseerde aanpak werkt bijzonder goed voor cursuscatalogi en marketingpagina's waar prestaties voor SEO van belang zijn, met dynamische LMS-functionaliteit verwerkt aan de clientzijde of via API-routes.
De Tech Stack Die Schaalt
Hier is een referentiearchitectuur die we met succes hebben gebruikt:
Frontend:
- Next.js 15 of Astro 5 (SSG voor openbare pagina's, SSR voor geverifieerde)
- Ingezet op Vercel of Cloudflare Pages
Backend API:
- Node.js met Hono of Fastify
- Ingezet op Railway of Fly.io
Database:
- PlanetScale of Neon (serverless Postgres)
- Juist relationaal schema met indexen
- Redis voor sessiebeheer en caching
Video:
- Mux of Cloudflare Stream
- Adaptieve bitrategraaf, ondertekende URLs, ingebouwde analyses
Betalingen:
- Stripe rechtstreeks (geen WooCommerce-laag)
Verificatie:
- Clerk, Auth.js of Lucia
Contentbewerking:
- Sanity, Payload CMS of Strapi voor instructeur-gerichte contentbeheer
Wanneer WordPress LMS nog steeds logisch is
Ik wil niet dogmatisch over dit onderwerp zijn. WordPress LMS-plugins werken werkelijk goed voor:
- Kleine cursusgebruiken: Onder de 500 studenten, onder de 20 cursussen. LearnDash of TutorLMS op fatsoenlijke hosting (Cloudways, Kinsta, RunCloud) zal je goed bedienen.
- Solo-makers: Als je één persoon bent die een cursus verkoopt, is de alles-in-één eenvoud van WordPress + LearnDash + WooCommerce moeilijk te kloppen. Je kunt in een weekend lanceren.
- Interne training: Kleine bedrijven die nalevingstraining uitvoeren voor 50-200 werknemers. De inzetten zijn lager, het verkeer is voorspelbaar.
- Budgetbeperkte startups: Wanneer je $200/maand hebt en iets nodig hebt dat volgende week draait, niet $20.000 en 10 weken voor een aangepaste build.
De problemen beginnen wanneer je zonder herarchitecturing verder probeert te schalen dan deze grenzen. En de marketing van het WordPress LMS-ecosysteem helpt niet -- "Exponentiële schaalbaarheid" claims op plugin-verkooppagina's stellen onrealistische verwachtingen in.
Als je niet zeker bent waar je in dit spectrum valt, neem contact met ons op en we geven je een eerlijke beoordeling. Soms is het antwoord werkelijk "stay met WordPress en optimaliseer je hosting." We zeggen je dat.
Veelgestelde vragen
Kan WordPress 10.000 studenten verwerken met een LMS-plugin? Technisch gezien ja -- maar het hangt sterk af van gelijktijdige gebruikers versus totale inschrijvingen. 10.000 ingeschreven studenten waarbij 50-100 gelijktijdig actief zijn? WordPress kan dat aan met Redis-objectcaching, een CDN en goed beheerde hosting. 10.000 studenten waarbij 1.000+ gelijktijdig actief zijn? Je raakt de architectuurmuren die in dit artikel worden beschreven. Alleen al de databasequeries voor voortgangstracering zullen de meeste setups overweldigen.
Wat is de grootste prestatieknelpunt in WordPress LMS-plugins?
De wp_usermeta en wp_postmeta-tabellen die het EAV-patroon (Entity-Attribute-Value) gebruiken. Geserialiseerde gegevens in LONGTEXT-kolommen kunnen niet worden geïndexeerd of efficiënt bevraagd. Naarmate de inschrijving groeit, lopen deze tabellen uit tot miljoenen rijen, en queries die snel waren met 100 studenten worden pijnlijk traag met 10.000. Geen hoeveelheid caching lost dit op voor geverifieerde, dynamische LMS-interacties.
Is LearnDash beter dan LifterLMS voor grootschalige cursussen? LearnDash is historisch beter geoptimaliseerd voor grotere installaties -- ze hebben meer werk gedaan aan queryoptimalisatie en hebben aangepaste databasetabellen voor sommige gegevens in recente versies geïntroduceerd. LifterLMS blijft meer WordPress-inheems in zijn gegevensopslag. Echter, beide raken dezelfde fundamentele plafond omdat ze nog steeds WordPress-plugins zijn die tegen dezelfde databasearchitectuur werken. Voor werkelijk grootschalige implementaties is geen van beide de juiste keuze.
Waarom missen WordPress LMS-plugins native cloud-opslag-integratie?
Omdat WordPress's mediaverwerking is gebouwd rond lokale bestandssysteemopslag via wp_handle_upload(). De volledige medialibliotheekapstractie veronderstelt dat bestanden in /wp-content/uploads/ wonen. Het inbouwen van native S3 of Mux-integratie zou praktisch inhouden dat je het mediasysteem van WordPress volledig bypast en parallelle infrastructuur bouwt -- wat architecturaal precies wat een afzonderlijke service of headless-platform doet.
Hoeveel kost het om van WordPress LMS naar een headless architectuur te migreren? Voor een typische migratie -- 50-200 cursussen, bestaande studentengegevens, betalingsgeschiedenis -- verwacht je $15.000-$50.000 en 8-14 weken met een ervaren team. Dit omvat databaseschemaontwerp, gegevensmigratiescripts, frontend-build, videplatformintegratie en betalingsheraansluitingen. Het klinkt duur vergeleken met een $199/jaar-plugin-licentie, maar de hostingbesparingen, verminderde onderhoudslast en verbeterde conversiesnelheden door betere prestaties betalen het meestal terug binnen 12-18 maanden. Controleer onze prijzenpagina voor meer specifieke schattingen.
Zijn er WordPress-plugins die het databaseschalingprobleem verhelpen?
Sommige plugins zoals ElasticPress (met Elasticsearch) of aangepaste oplossingen met Redis voor caching kunnen de symptomen maskeren. LearnDash heeft ook enkele aangepaste tabellen in recente versies geïntroduceerd om afhankelijkheid van wp_postmeta te verminderen. Deze helpen, maar het zijn pleister op een structureel probleem. Je voegt complexiteitlagen toe om een fundamenteel ontwerppatroon heen te werken in plaats van het aan te pakken. HyperDB kan helpen met leesreplica's, maar dat voegt operationele overhead toe die de meeste teams niet kunnen beheren.
Wat is het beveiligingsrisico van het runnen van een LMS op WordPress op schaal? Het primaire risico is het uitgebreide aanvalsoppervlak. Een typische WordPress LMS-installatie voert 10-15 plugins uit, elk onafhankelijk onderhouden. De Gravity Forms supply-chain-aanval van 2026 toonde aan dat zelfs premium-plugins kunnen worden gecompromitteerd. Op schaal verwerk je persoonlijke informatie, betalingstokens en academische records voor duizenden studenten. Een breuk triggert GDPR, FERPA of verplichtingen van statelijke privacywetten. Speciaal gebouwde systemen met minder afhankelijkheden en kleinere aanvalvlakken zijn inherent gemakkelijker te beveiligen.
Kan ik WordPress als headless CMS voor mijn LMS-inhoud gebruiken? Absoluut, en dit is vaak het beste middengat. WordPress is werkelijk uitstekend als contentbewerkingsinterface. Gebruik het headless via de REST API of WPGraphQL om cursusinhoud te beheren, bouw dan je frontend en LMS-logica afzonderlijk. Instructeurs houden de vertrouwde WordPress-editor, maar je krijgt een juiste architectuur voor de interactieve LMS-componenten. Ons headless CMS-ontwikkelingsteam heeft verschillende systemen gebouwd met exact dit patroon.