Headless en decoupled Drupal

Drupal als contentmotor achter elke frontend.

Van architectuuradvies tot API-laag: ik bouw headless en decoupled Drupal-oplossingen die schaalbaar en onderhoudbaar blijven.

Bespreek je architectuur

Headless en decoupled Drupal

Headless Drupal is een architectuurkeuze, geen upgrade.
Drupal levert de content als data via een API en een aparte applicatie zet die om in pagina's.
Dat is zinvol bij meerdere kanalen of een frontend-stack die er al staat en verspilling bij één website met een redactie die zelf pagina's samenstelt.
Ik breng in kaart welk deel decoupled moet, koppel dat met JSON:API of GraphQL en laat de rest staan waar het hoort.

Wat betekent headless Drupal?

Headless Drupal betekent dat Drupal geen HTML meer aan de bezoeker levert, maar gestructureerde data aan een laag die de weergave verzorgt.
Headless en decoupled worden door elkaar gebruikt en daar beginnen veel projecten fout, want er zitten twee varianten onder met een verschillend prijskaartje.

Fully decoupled

Bij fully decoupled is Drupal alleen nog contentmodel, workflow en redactieomgeving.
Alle publieke HTML komt uit een aparte applicatie, doorgaans een JavaScript-framework met server-side rendering.
Daar staat tegenover dat je zelf opbouwt wat de themalaag normaal meelevert: routing, metatags, canonicals, sitemap, redirects, foutpagina's, taalwissel en preview.
Twee codebases, twee deploypijplijnen, twee upgradepaden.

Eén Drupal-bron die meerdere frontends bedient

Progressively decoupled

Bij progressively decoupled blijft Drupal de pagina renderen en neemt een JavaScript-component alleen dat stuk over waar interactiviteit iets oplevert: een zoekinterface met facetten, een configurator, een kaart.
De redactie houdt preview en layout en de semantiek en SEO-basis van de rest van de pagina blijven in Drupal.
Voor de meeste sites is dit de betere keuze, want je betaalt alleen voor de complexiteit die je echt nodig hebt.

Wanneer kies je voor headless Drupal?

Headless is zinvol wanneer de frontend meer dan één afnemer heeft, of al bestond voordat Drupal in beeld kwam.
De aanleiding zit dan buiten de website zelf.
Die afweging werk ik punt voor punt uit in headless Drupal: wanneer wel en wanneer niet.

  • ✓ Je levert dezelfde content aan een website, een mobiele app en een derde kanaal en wil niet drie keer redigeren.
  • ✓ Je hebt al een frontend-stack en een team dat daarin werkt en Drupal komt erbij als contentbron.
  • ✓ Frontend en backend worden door gescheiden teams of leveranciers gebouwd, met een API als afspraak tussen beide.
  • ✓ Een deel van je interface is een applicatie en geen pagina en dat hoort niet in een Twig-template.

Wanneer headless vooral kosten toevoegt

Headless maakt een site ook niet automatisch sneller.
Een gecachte Drupal-pagina achter een CDN is vaak sneller dan een bundel die na het laden nog data ophaalt.
Snelheid komt uit caching, beeldformaten en de hoeveelheid code die de browser krijgt, niet uit de architectuurkeuze; waar die winst in Drupal zit, staat in Core Web Vitals voor Drupal.
Lijkt je situatie hierop, dan zeg ik dat, ook als het budget al klaarligt.

JSON:API of GraphQL?

JSON:API is de standaardkeuze, want die zit in core en vraagt geen extra bouwwerk.
Het is sinds Drupal 8.7 onderdeel van core, volgt de JSON:API-specificatie en staat standaard in read-only.
Elke entiteit en bundel krijgt een endpoint zonder dat je iets moet definiëren en met sparse fieldsets en include haal je in één verzoek op wat een pagina nodig heeft.

GraphQL zit niet in core.
Het is een contrib-module; in de huidige 5.x-reeks (4.x is nog een onderhoudsbranch) definieer je het schema zelf in code.
Dat is meer werk vooraf en levert een koppeling die je volledig in de hand hebt, wat betaalt wanneer clients heel verschillende doorsnedes van dezelfde content nodig hebben.

Keuze tussen JSON:API en GraphQL bij headless Drupal
Onderwerp JSON:API GraphQL
Status In core sinds 8.7 Contrib-module, 5.x (4.x in onderhoud)
Opzetwerk Aanzetten en rechten instellen Schema zelf definiëren in code
Query's Vaste vorm per resource, filters via parameters Client kiest per verzoek de velden
Caching GET, dus cachebaar in Drupal en op een CDN Meestal POST naar één endpoint
Kies bij Eén of twee clients Clients met afwijkende datavragen

De koppeling is zelden het moeilijkste deel.
Het contentmodel is dat.
Een model dat in Drupal prima werkt kan over een API onbruikbaar zijn, omdat de betekenis in de themalaag zit in plaats van in de velden.

Wat headless doet met je redactie

Layout Builder is het tweede knelpunt.
Die werkt met render arrays en HTML, niet met gestructureerde data, dus over een API krijg je geen bruikbare layoutboom terug.
Je kiest dus: Drupal blijft renderen, of je laat vrije paginaopbouw vallen en werkt met een vast componentcontract.
Dat tweede geeft een consistentere site, maar is een inperking voor wie gewend is te schuiven.

Daarnaast vallen contextuele links en inline bewerken weg en komt er één vraag bij: wie zorgt dat de frontend opnieuw bouwt of zijn cache leegt wanneer een redacteur op publiceren duwt.
Zonder die afspraak staat je site uren achter op je redactie.

Wat headless doet met SEO

Headless is niet slecht voor SEO, maar elk automatisme dat Drupal normaal gratis levert moet je expliciet overnemen.
Hier lopen decoupled projecten stille schade op, want het valt pas op als de posities zakken.

  • Rendering: server-side rendering is geen optie maar een voorwaarde, want een pagina die volledig in de browser wordt opgebouwd hangt af van wat de zoekmachine wil renderen.
  • Statuscodes: een client-side app geeft makkelijk een 200 terug op een pagina die niet bestaat en redirects uit de Redirect-module bereiken de bezoeker niet meer.
  • Metadata: titels, descriptions, canonicals, hreflang en structured data moeten over de API meereizen tot in de head.
  • Sitemap en URL's: sitemap en padaliassen zitten in Drupal, dus je frontend houdt dezelfde URL's aan of je verliest je geschiedenis.
  • Core Web Vitals: LCP, INP en CLS meten wat de browser krijgt en een grote bundel maakt die cijfers slechter.

Geen reden om headless af te schieten, wel om het volwaardig te begroten.
Meer daarover bij technische SEO en frontend performance.
Zet je een bestaande site om, dan verandert je URL-structuur vaak mee en is dit ook een migratievraagstuk.

Toegankelijkheid verhuist mee naar de frontend

De toegankelijkheid die Drupal in core meebrengt geldt alleen voor wat Drupal zelf rendert, dus in een fully decoupled opzet begin je in de frontend van nul.
Dat weegt zwaarder dan vroeger: de European Accessibility Act, richtlijn 2019/882, is van toepassing sinds 28 juni 2025.
Of hij op jou van toepassing is hangt af van je sector en je aanbod: hij viseert onder andere webshops, bankieren, vervoer en e-boeken, met een uitzondering voor micro-ondernemingen die diensten leveren.
Voor overheidssites geldt richtlijn 2016/2102 en de nationale omzetting.
Laat de precieze verplichting juridisch aftoetsen.
Technisch werk je in beide gevallen naar WCAG 2.2 niveau AA en EN 301 549.

De problemen die ik in decoupled frontends terugvind zijn steeds dezelfde vier.
Bij client-side routing verspringt de focus niet en hoort een schermlezergebruiker niet dat er een nieuwe pagina is.
De documenttitel blijft die van de vorige pagina.
Foutmeldingen uit client-side validatie staan los van hun veld.
En modals houden de focus niet vast, dus je komt met het toetsenbord achter het venster terecht.

Een componentbibliotheek die zichzelf toegankelijk noemt lost dat niet op, want het gedrag ontstaat in hoe je de componenten aan elkaar knoopt.
Testen blijft handwerk met toetsenbord en schermlezer naast tools als Lighthouse en axe DevTools.
De aanpak staat bij digitale toegankelijkheid.

Op welke Drupal-versie bouw je een headless backend?

Op Drupal 11, de huidige stabiele reeks, vandaag 11.4.x.
Drupal 10 bereikt end of life op 9 december 2026 en 10.6.0 is de laatste minor release, dus een nieuw traject op 10 starten betekent binnen de drie maanden upgraden.
Drupal 12 komt uit in de week van 7 december 2026, dezelfde week als die end of life en is nu nog niet beschikbaar.
Dat pad is planbaar, want securityreleases komen op vaste momenten en een minor ongeveer om het half jaar.
De afhankelijkheden van je frontend volgen dat tempo niet en die kost ontbreekt vaak in de begroting.

Mijn aanpak: afbakenen, koppelen, vastleggen

  1. Afbakenen. Vastleggen welk deel decoupled moet en welk deel niet, op basis van de kanalen, de teams en de redactie.
    Resultaat: een architectuurkeuze met de gevolgen voor preview, SEO en toegankelijkheid erbij, in plaats van een framework dat al gekozen was.
  2. Koppelen. Het contentmodel API-bruikbaar maken, JSON:API of GraphQL inrichten, rechten en authenticatie regelen en de cachestrategie plus de invalidatie bij publiceren afspreken.
    Het previewpad hoort hier, niet in een restlijst na livegang.
  3. Vastleggen. Een componentcontract tussen backend en frontend, documentatie van de endpoints en tests op de koppeling, zodat je eigen team het kan overnemen.

Ik werk meer dan tien jaar met Drupal, voor universiteiten, overheid en industrie en stap in de bestaande Git-flow en conventies in plaats van er een werkwijze naast te zetten.
Eerder werk staat bij de projecten, onder meer de case van Brighteye.

Wat kost een headless Drupal-traject?

Mijn tarief is 75 tot 95 euro per uur of 650 tot 800 euro per dag, exclusief btw, lager bij lange trajecten en terugkerende klanten.
Belgische Drupal-freelancers afficheren op Malt tussen 400 en 600 euro per dag met een mediaan rond 550 euro, de bredere Belgische IT-freelancemarkt zit rond 710 euro per dag en voor Nederland noemt Freelance.nl 70 tot 90 euro per uur.

Wat een headless traject duurder maakt dan hetzelfde project met een Drupal-thema is geen opslag op het uurtarief, maar de extra scope: een tweede applicatie, preview opnieuw bouwen en de SEO- en toegankelijkheidslaag die je anders meekrijgt.
Progressively decoupled blijft dichter bij een normale bouw.
De opbouw staat bij mijn tarieven en samenwerkingsvormen en gaat het om een nieuw platform zonder decoupled frontend, kijk dan bij Drupal architectuur en ontwikkeling.

Twijfel je of headless bij jouw situatie past?

Leg je situatie voor via het contactformulier: de kanalen die je bedient, de frontend die er al staat en wat je redactie vandaag zelf doet.
Ik bekijk je aanvraag en geef binnen 24 uur een eerlijk beeld van wat headless oplevert en wat het kost, ook wanneer het antwoord is dat je het niet nodig hebt.

Veelgestelde vragen

Wat is headless Drupal?

Headless Drupal is een opzet waarin Drupal de content beheert en als gestructureerde data aanbiedt via een API, terwijl een aparte applicatie de pagina's rendert.
De koppeling loopt meestal over JSON:API, dat sinds Drupal 8.7 in core zit, of over GraphQL als contrib-module.
Contentmodel, rechten en workflow blijven in Drupal, maar de weergavelaag is niet langer zijn verantwoordelijkheid.

Wat is het verschil tussen fully decoupled en progressively decoupled?

Bij fully decoupled levert Drupal geen enkele publieke pagina meer en komt alle HTML uit een aparte frontend.
Bij progressively decoupled blijft Drupal renderen en wordt alleen een component overgenomen, zoals een zoekinterface of een configurator.
Het verschil bepaalt wat je opnieuw bouwt: bij de eerste preview, routing, metadata en toegankelijkheid, bij de tweede alleen die component.
Voor één website met een actieve redactie volstaat de tweede meestal.

Is JSON:API of GraphQL de beste keuze voor Drupal?

JSON:API voor de meeste projecten, want die zit in core, vraagt geen schemawerk en levert GET-verzoeken die je in Drupal en op een CDN kan cachen.
GraphQL is interessant wanneer clients sterk verschillende doorsnedes van dezelfde content nodig hebben, maar je definieert het schema dan zelf in code.
Beide staan of vallen met je contentmodel, dus dat is de keuze die eerst goed moet zitten.

Wanneer heb je headless Drupal niet nodig?

Bij één publieke website met een redactie die zelf pagina's samenstelt en zonder frontend-stack die er al staat.
Dan bouw je in een aparte applicatie opnieuw wat Drupal al levert: routing, metatags, redirects, foutpagina's, taalwissel en preview en je betaalt dat twee keer, bij de bouw en in het onderhoud.
Wil je toch een stuk interface als applicatie, dan is progressively decoupled bijna altijd de betere keuze, want dan zet je alleen dat ene component apart.

Is headless Drupal slecht voor SEO?

Niet per definitie, maar het legt de verantwoordelijkheid bij jou in plaats van bij Drupal.
Server-side rendering is een voorwaarde, statuscodes en redirects moeten in de frontend correct blijven en metatags, canonicals, hreflang en structured data moeten over de API meereizen tot in de head.
Gaat een van die vier mis, dan publiceer je pagina's die werken maar niet indexeerbaar zijn.
In een Drupal-thema krijg je dat grotendeels vanzelf.

Kan mijn redactie nog een preview zien in een headless opzet?

Ja, maar je bouwt die zelf.
Drupal rendert preview normaal met het eigen thema en dat bestaat niet meer in een fully decoupled opzet, dus de frontend heeft een eigen previewroute nodig die ongepubliceerde revisies geauthenticeerd ophaalt.
Hetzelfde geldt voor Layout Builder: die levert HTML in plaats van gestructureerde data, dus vrije paginaopbouw ruil je meestal in voor een vast componentcontract.

Wat kost headless Drupal?

Meer dan hetzelfde project met een Drupal-thema en het verschil zit niet in mijn uurtarief maar in de scope: een tweede applicatie met eigen afhankelijkheden en deploys, een previewpad dat je zelf bouwt en de SEO- en toegankelijkheidslaag die een thema meelevert.
Progressively decoupled blijft dichter bij een normale bouw, omdat je alleen dat ene component apart zet.
Mijn uur- en dagtarief en de samenwerkingsvormen staan op mijn tarievenpagina.

Een vraag over dit onderwerp?

Beschrijf kort je situatie, dan laat ik weten wat er speelt en wat het zou kosten. Zonder offertetraject.

Privacybeleid

Wie we zijn
Dit beleid geldt voor David Porschmann (freelance webdeveloper). 
Contact: support@porschmann.be.

Welke gegevens we verwerken
Naam, e-mail, bedrijfsnaam (optioneel) en je bericht/aanvraag. Bij websitebezoek verwerken we ook beperkte technische gegevens (zoals IP-adres en browser) voor beveiliging en analytics.

Waarom we je gegevens verwerken (rechtsgrond)

  • Om je vraag te beantwoorden of een offerte te bezorgen (toestemming of precontractuele noodzaak).

  • Voor administratie en facturatie bij samenwerking (contractuele noodzaak).

  • Voor beveiliging en foutopsporing (gerechtvaardigd belang).

Bewaartermijnen
Inzendingen via het contactformulier: maximaal 24 maanden. Klantdossiers en facturatie: volgens wettelijke bewaartermijnen.

Delen met derden
We delen je gegevens niet met derden, behalve met verwerkers die ons helpen de website te hosten, e-mail te versturen of administratie te doen. Met deze partijen zijn verwerkersovereenkomsten gesloten.

Jouw rechten
Recht op inzage, correctie, verwijdering, beperking, overdraagbaarheid en het intrekken van toestemming. 
Mail ons op support@porschmann.be.

Beveiliging
We nemen passende technische en organisatorische maatregelen om je gegevens te beschermen.

Cookies en analytics
Korte uitleg over gebruikte tools (bv. Matomo/Clarity/GA) en link naar cookie-verklaring indien van toepassing.

Contact
Vragen over dit beleid? 
support@porschmann.be.