Kort gezegd: Op een gigantische site is de eerste zoekvraag niet welke zoekwoorden — maar welke landingspagina's het adverteren rekenkundig kunnen dragen. Voer een GA4-export plus een sitecrawl in, bereken maxCPC = doel-CRR × CR × AOV per pagina en vergelijk dat met je echte gemiddelde CPC. Eruit rolt een gerangschikte TOP 100–200 bouwstapel, een fix-stapel met probleempagina's en een skip-stapel — nog voordat je één cent uitgeeft.
Wat je erin stopt, en wat je eruit krijgt
Je stopt er twee dingen in die je al bezit: een GA4-export van je landingspagina’s en een crawl van je site. Je krijgt er één ding voor terug — een gerangschikte lijst van de landingspagina’s die als eerste een zoekcampagne waard zijn, elk met de exacte max CPC die hij kan betalen, plus een nette “hier niet op bieden”-stapel voor de pagina’s waarvan de economie betaald zoeken verbiedt. Geen zoekwoordtool, geen onderbuikgevoel, geen “laten we Dynamic Search Ads gewoon aanzetten en zien wat er gebeurt.” Een spreadsheet die je vertelt waar je het budget op richt voordat je er één cent van uitgeeft.
Dat is het hele artikel. Hieronder draai ik de pipeline van begin tot eind en laat ik je bij elke stap het letterlijke ding zien dat het uitspuugt — de GA4-rijen, de max-CPC-rekensom op één regel, de crawl-extractietabel, de prioritering vóór en na het sorteren, en de probleempagina-diagnose die een pagina redt die iedereen anders zou verwijderen. De getallen zijn overal illustratief — vul je eigen in — maar de vormen zijn exact wat de tools teruggeven.
Waarom überhaupt een pre-flight uitvoeren? Omdat de standaardzet op een site met 10.000 URL’s is om een brede campagne op alles te richten en Google het te laten uitzoeken. Dat verbrandt budget op pagina’s die nooit zouden converteren, trekt je doel-ROAS los en vergiftigt de leerfase. Dit filter is de goedkoopste verzekering die je ooit zult kopen.
De pipeline in één kader
- Waar we naar op zoek zijn De landingspagina's die het waard zijn om te adverteren, gerangschikt
- Input GA4 landingspagina-export · een sitecrawl
- De ene formule maxCPC = doel-CRR × CR × AOV
- Wat je krijgt Een bouwstapel, een fix-stapel en een skip-stapel
Het ene getal dat alles bepaalt: max CPC
Elke landingspagina heeft een plafond — het maximale dat je voor een klik kunt betalen en nog steeds je doelefficiëntie haalt. Bereken dat per pagina en de hele prioritering rolt uit de wiskunde:
maxCPC = doel-CRR × CR × AOV
waarbij CRR (cost-revenue ratio — het Europese PNO, gelijk aan ACOS) het aandeel van de omzet is dat je bereid bent aan advertenties uit te geven, CR het conversiepercentage van de pagina is, en AOV de gemiddelde orderwaarde.
Een uitgewerkt voorbeeld, recht uit de formule. Een categoriepagina converteert op 2%, heeft een gemiddelde order van €1.000, en jij bent bereid 10% van de omzet aan advertenties uit te geven (een 10× ROAS):
maxCPC = 0,10 × 0,02 × €1.000 = €2,00.
Als je liever in ROAS denkt, herschikt hetzelfde zich tot maxCPC = CR × AOV / ROAS = 0,02 × 1.000 / 10 = €2,00. Hetzelfde getal, kies de vorm die je brein prettig vindt. (Illustratief voorbeeld.)
Die €2,00 is het oordeel. Vergelijk het met de echte gemiddelde CPC in je account voor die markt en de pagina sorteert zichzelf: ruim boven de gem. CPC → bouwen; eronder → hij kan zichzelf niet betalen; ver eronder → er niet eens aan denken. Alles wat volgt is gewoon dit getal voor elke pagina produceren, betrouwbaar, en het resultaat aflezen.
De pipeline in één oogopslag
Vijf stappen. Voor elke: wat je doet, waar je naar kijkt, en waarom — want elke stap bestaat om één specifieke vraag over een pagina te beantwoorden.
1 — Haal de landingspagina-economie uit GA4
Doe: per landingspagina exporteer je sessies, conversies, transacties en omzet; leid CR en AOV af. Waarom: dit is het vraag-en-geld-signaal — zonder dat is max CPC een gok. Je krijgt: één rij per pagina met de twee getallen die de formule opeet (CR en AOV).
2 — Crawl de site voor structuur
Doe: crawl elke pagina voor title, H1, breadcrumb-diepte en — de cruciale — hoeveel producten hij toont. Waarom: GA4 kent de economie maar niet de structuur; een pagina met twee producten op voorraad kan geen campagne dragen, hoe goed hij ook converteert. Je krijgt: de structurele spiegel van je GA4-rijen, plus een vlag voor dunne pagina’s.
3 — Join de twee, bereken max CPC
Doe: join GA4 + crawl op URL, draai de formule op elke rij, gooi dunne pagina’s eruit. Waarom: hier komen economie en structuur samen en wordt het oordeel berekenbaar. Je krijgt: elke pagina met een max CPC ernaast.
4 — Prioriteer: max CPC vs. echte gem. CPC
Doe: zet de max CPC van elke pagina naast de werkelijke gemiddelde CPC in je account of land, sorteer op speelruimte. Waarom: een max CPC betekent niets op zichzelf — alleen de kloof met wat klikken écht kosten bepaalt of een pagina kan betalen. Je krijgt: de TOP 100–200 bouwstapel, een fix-stapel en een skip-stapel.
5 — Diagnosticeer de probleempagina's
Doe: voor pagina’s die zouden moeten converteren maar dat niet doen, check je de prijsconcurrentie van de producten die ze als eerste tonen. Waarom: een lage CR op een pagina die zou moeten verkopen is meestal een merchandising-lek, geen vraagprobleem — en het is te fixen. Je krijgt: pagina’s gered uit de skip-stapel, terug in de bouwstapel, zodra ze écht kunnen converteren.
Nu dezelfde vijf stappen, één voor één, elk met het letterlijke ding dat het oplevert.
Stap 1 — De GA4-export, zoals hij binnenkomt
Je hebt geen fancy rapport nodig. In GA4: Verkennen → leeg → Vrije vorm, dimensie Landingspagina + query string, statistieken Sessies, Belangrijke gebeurtenissen / Conversies, Totale omzet. Voeg Transacties toe als je die hebt; anders komt AOV uit omzet ÷ conversies. Eén filter vooraf: sluit productdetailpagina’s uit en houd categorie- / collectiepagina’s over — je bepaalt waar je verkeer naartoe stuurt, en op de meeste sites zijn dat categorieën, niet individuele SKU’s. SKU’s ertussen mengen vertekent elke AOV en CR die je berekent.
Zo zien vier representatieve rijen eruit eenmaal geëxporteerd, met CR en AOV afgeleid:
Landing page Sessions Conv CR Revenue AOV
/cordless-vacuums 8,140 163 2.0% €68,460 €420
/winter-tyres 5,020 156 3.1% €28,080 €180
/sleeping-bags 12,300 135 1.1% €12,825 €95
/phone-cases 9,800 137 1.4% €2,192 €16
(Illustratief voorbeeld.) CR is conversies ÷ sessies; AOV is omzet ÷ conversies. Dat is de hele input die de formule uit GA4 nodig heeft — twee kolommen, CR en AOV, per pagina. Merk nu al op dat /sleeping-bags de meeste sessies in de set trekt en toch het slechtst converteert; onthoud dat even, het is later de interessante.
Stap 2 — De crawl, en de kolom die het werk doet
GA4 vertelde je hoe elke pagina presteert. Het kan je niet vertellen dat een pagina structureel hol is — een “categorie” met twee producten op voorraad, of een parametrische filterweergave die nooit een campagne zou moeten dragen. Daarvoor crawl je. Twee routes: laat een AI in vijf minuten een wegwerp-crawler voor je schrijven, of gebruik Screaming Frog met een custom XPath-extractie die je in zo’n drie minuten opzet (volledige mini-gids in de steal-box). Draai het in List mode op je set GA4-URL’s en het maalt op de achtergrond terwijl jij iets anders doet.
De ene kolom die zijn waarde verdient is het productaantal — hoeveel productkaarten de pagina daadwerkelijk rendert. Hier is de extractie-output gejoined aan dezelfde vier pagina’s, plus nog eentje die de crawl markeert:
URL Title H1 Products Breadcrumb
/cordless-vacuums Cordless Vacuums … Cordless Vacuums 48 Home>Floorcare>Vacuums
/winter-tyres Winter Tyres | … Winter Tyres 112 Home>Tyres>Winter
/sleeping-bags Sleeping Bags … Sleeping Bags 9 Home>Camping>Sleep
/phone-cases Phone Cases … Phone Cases 640 Home>Accessories>Cases
/clearance-2019 Clearance Clearance 0 Home>Clearance
(Illustratief voorbeeld.) De dunne-pagina-regel doet meteen zijn werk: /clearance-2019 toont 0 producten — een lege categorie waar GA4 nog steeds sessies tegen logt. Gooi elke pagina onder ~3 producten eruit voordat je prioriteert, en die spookpagina bereikt nooit de bouwstapel. Mini-voorbeeld, situatie → actie → resultaat: de crawl laat een “categorie” met nul levende producten zien → je sluit hem uit vóór de prioritering → je verspilt geen campagne (of een middag van een analist) aan een pagina zonder iets te verkopen.
Stap 3 — Join de twee, en de formule op één rij
Nu worden de twee datasets één. Join GA4 + crawl op URL en elke pagina draagt zowel zijn economie (CR, AOV) als zijn structuur (productaantal). Draai maxCPC = doel-CRR × CR × AOV langs de kolom. Kijk hoe het op één echte rij landt — /cordless-vacuums, doel-CRR 10%:
maxCPC = 0,10 × 0,020 × €420 = €0,84.
Eén regel, één plafond. Doe het voor alle vier de overlevers en je krijgt de max CPC per pagina waar de hele beslissing aan hangt:
Page CR AOV CRR maxCPC = CRR×CR×AOV
/cordless-vacuums 2.0% €420 10% 0.10 × 0.020 × 420 = €0.84
/winter-tyres 3.1% €180 12% 0.12 × 0.031 × 180 = €0.67
/sleeping-bags 1.1% €95 10% 0.10 × 0.011 × 95 = €0.10
/phone-cases 1.4% €16 10% 0.10 × 0.014 × 16 = €0.02
(Illustratief voorbeeld.) De doel-CRR kan per pagina verschillen als je marges dat doen — /winter-tyres draagt hier 12% omdat de categorie een lossere efficiëntie tolereert. Al het andere is mechanisch. Je hebt nu een max CPC voor elke pagina op de site; de volgende stap is de enige beoordeling die overblijft.
Stap 4 — Prioriteer: de sortering, vóór en na
Een max CPC betekent niets op zichzelf. €0,84 is royaal in de ene markt en onbetaalbaar in de andere — wat beslist is de kloof met wat een klik je écht kost. Haal dus je echte gemiddelde CPC per pagina (of per markt, als je niet op paginaniveau hebt) uit het Google Ads-account en zet de twee naast elkaar.
Vóór — de ruwe join, in welke volgorde GA4 hem ook uitspuugde, is onleesbaar als plan:
Page maxCPC avg CPC
/sleeping-bags €0.10 €0.45
/phone-cases €0.02 €0.35
/cordless-vacuums €0.84 €0.55
/winter-tyres €0.67 €0.40
Na — sorteer op speelruimte (maxCPC − gem. CPC) en dezelfde vier rijen worden een werkorder met het oordeel in de laatste kolom:
| Landingspagina | CR | AOV | Doel-CRR | maxCPC | gem. CPC | Oordeel |
|---|---|---|---|---|---|---|
| /cordless-vacuums | 2.0% | €420 | 10% | €0.84 | €0.55 | Nu bouwen |
| /winter-tyres | 3.1% | €180 | 12% | €0.67 | €0.40 | Nu bouwen |
| /sleeping-bags | 1.1% | €95 | 10% | €0.10 | €0.45 | Eerst fixen (probleempagina) |
| /phone-cases | 1.4% | €16 | 10% | €0.02 | €0.35 | Niet de moeite |
(Illustratief voorbeeld.) De getallen zijn verzonnen om het mechanisme te tonen — vul je eigen GA4-cijfers in. Elke maxCPC hier is gewoon doel-CRR × CR × AOV toegepast op de rij.
Twee rijen zijn overduidelijk. /cordless-vacuums kan €0,84 betalen tegen een markt van €0,55 — +53% speelruimte, bouwen. /winter-tyres idem. /phone-cases kan €0,02 betalen tegen €0,35; dat gaat in geen duizend jaar werken, laat hem weg en kijk niet meer om. Schaal dit van vier rijen naar tienduizend en de top van de gesorteerde lijst ís je TOP 100–200 — de pagina’s die je als eerste bouwt, gerangschikt op hoeveel ruimte ze hebben om te bieden.
De interessante is /sleeping-bags: maxCPC €0,10 tegen een markt van €0,45. Op papier “niet de moeite”. Maar het had de meeste sessies in de hele export en een categorie die duidelijk zou moeten verkopen. Een verdacht laag conversiepercentage op een pagina die zou moeten converteren is zelden een vraagprobleem. Het is een probleempagina — en probleempagina’s krijgen een diagnose, geen delete.
Stap 5 — Probleempagina’s: de diagnose, op een echte listing
Wanneer het conversiepercentage van een pagina ver onder ligt waar de categorie zou moeten landen, vraag dan waarom voordat je hem laat vallen. Bij e-commerce is het antwoord meestal de prijsconcurrentie van de producten die de pagina als eerste toont. De eerste 10–20 producten die een bezoeker ziet zijn de complete eerste indruk van de pagina; als dat je zwakste items qua waarde zijn, stort de CR in, ongeacht hoeveel vraag de pagina trekt.
Dus lees je de categorie precies zoals de klant dat doet — in zijn standaard sorteervolgorde — en check je de prijzen van de heldposities.
Lees de productmix van de categorie in sorteervolgorde
Haal de producten in /sleeping-bags op via hun product_type uit Google Merchant Center, in de standaard volgorde die de bezoeker daadwerkelijk krijgt. De top van de lijst is wat converteert (of niet).
Check de prijzen van de topposities tegen de markt
Neem de bovenaan getoonde producten en onderzoek live prijzen van concurrenten met DataForSEO — het serp/google/organic/live/advanced endpoint geeft de hele resultatenpagina terug (shopping-blokken met merchants en prijzen, organisch) als gestructureerde JSON voor ongeveer $0,0035 per query.
Herprijs of hersorteer, meet dan opnieuw
Als de heldposities te duur zijn, heb je twee hefbomen: herprijzen, of de categorie hersorteren zodat écht concurrerende producten vooroplopen. Houd dan de CR in de gaten. Pas zodra die stijgt, promoveer je de pagina van “probleem” naar de bouwstapel.
Zo ziet die diagnose er letterlijk uit op /sleeping-bags, de pagina die op maxCPC €0,10 zit. Top van de listing, jouw prijs vs. de goedkoopste concurrent die DataForSEO voor hetzelfde product vond:
Pos Product (first-listed) Your price Cheapest comp. Gap
1 AlpineLite 200 Down Bag €129 €99 +30%
2 TrekWarm Mummy −5°C €115 €112 +3%
3 BaseCamp Synthetic XL €89 €92 −3%
4 ValleyHike Junior €45 €47 −4%
(Illustratief voorbeeld.) Het lek zit precies bovenaan: het product dat 12.300 maandelijkse bezoekers als eerste tegenkomen, staat 30% boven het goedkoopste marktaanbod. Alles eronder is concurrerend — maar niemand scrolt voorbij een slechte eerste indruk. Mini-voorbeeld, situatie → actie → resultaat: heldproduct staat 30% boven de markt → verlaag de prijs naar €105 of hersorteer zodat het concurrerende BaseCamp en ValleyHike vooroplopen → CR herstelt richting de categorienorm → draai Stap 3 opnieuw, de maxCPC klimt van €0,10 af, en de pagina promoveert naar de bouwstapel.
Dit is de loop die de meeste bureaus nooit sluiten, omdat hij een grens overschrijdt die ze normaal niet aanraken. Het werk van de shop (prijzen, merchandising, sorteervolgorde) en het werk van het bureau (het verkeer inkopen) zijn dezelfde optimalisatieloop. Stem de één af zonder de ander en je biedt in een lek.
Na het filter: kiezen hoe je inkoopt
Pas nu — met de bouwstapel in handen — kies je het hoe: AI Max, Dynamic Search Ads, klassieke STAG, of een combinatie (breed + DSA in één campagne). Eén campagne of drie of vijf hangt af van de klant en het conversievolume — respecteer de ~30-conversies-per-campagne-regel voordat je opsplitst. Ik laat deze keuze bewust aan jou. Het punt van de hele pipeline is dat je hem na de economie maakt, niet ervoor.
Wat je ook kiest, de regel is hetzelfde: een nieuwe campagne mag nooit starten op slechte pagina’s. Zwakke landingspagina’s trekken je doel-ROAS los en vergiftigen de leerfase. Het pre-filter houdt de lancering uitsluitend gericht op pagina’s die zichzelf kunnen betalen — en van daaruit is het bouwen van de superstructuur (crawldata + zoekwoordenonderzoek per categorie via de Google Ads API, opgebouwd in golven per categorie, taal en volwassenheid) een eigen verhaal, en daar is er één over.
Het stuk dat terugkoppelt naar het manifest
Technisch gezien is hier niets nieuws aan. Je had de GA4-export, de crawl, de prijsscrape en de join vijf jaar geleden al kunnen draaien. Maar het zou een half jaar maatwerk-ontwikkeling zijn geweest, en iedereen met gezond verstand zou halverwege zijn afgehaakt. De reden dat ik het nu opschrijf, is dat dit met tools als Codex, Claude Code en de huidige generatie agents geen project meer is, maar een doodgewone dinsdag-workflow werd — een script dat je op een account richt en ‘s nachts laat draaien.
Dat is de hele verschuiving, en hij is van beide kanten tegelijk het duidelijkst: het prijzen-en-merchandising-werk van de e-shop en het advertentiewerk van het bureau klappen samen tot één loop die je eindelijk samen kunt afstemmen. De economie laat je hem sluiten.
Het stuk dat je kunt stelen
# 1) The ceiling on every landing page
maxCPC = target_CRR * CR * AOV
= CR * AOV / ROAS # same thing in ROAS form
# e.g. 0.10 * 0.02 * 1000 = €2.00 (10% CRR, 2% CR, €1000 AOV)
# 2) Screaming Frog custom extraction (~3 min, runs in background)
Configuration → Custom → Custom Extraction → Add
• Products on page XPath: count(//div[contains(@class,'product-card')])
extractor type: Function Value (count() returns a number)
• H1 XPath: //h1 → Extract Text
• Breadcrumb XPath: //nav[@aria-label='breadcrumb'] → Extract Text
Crawl (or List mode on your GA4 URL set) → export → join to GA4 by URL.
Drop any page with < ~3 products as a thin page before you prioritize.- Gebruik Function Value, niet Extract Text, voor het productaantal.
count()geeft een getal terug; de tekstextractor slikt het in. Dit is veruit de meest voorkomende reden dat de aantal-kolom leeg terugkomt. - Pas de productkaart-selector aan op de site. Rechtsklik op een producttegel → Inspecteren → pak de stabiele class. Krijg deze XPath één keer goed en het dunne-pagina-filter draait zichzelf.
- Filter productdetailpagina’s eerst uit de GA4-export. Je bepaalt waar je verkeer naartoe stuurt — categorie- en collectiepagina’s — niet individuele SKU’s. Ze ertussen mengen vertekent elke AOV en CR die je berekent.
- Diagnosticeer de probleempagina’s in sorteervolgorde. Haal de categorie op via
product_typein zijn standaard listingvolgorde en check de prijzen van de topposities — de eerste indruk converteert, niet het paginagemiddelde.
FAQ
Waarom maxCPC gebruiken in plaats van gewoon naar ROAS-doelen in Google Ads kijken?
Omdat Google’s tROAS pas reageert nadat je geld hebt uitgegeven aan leren. maxCPC is een filter vóór de lancering: het vertelt je, vóór één enkele klik, welke pagina’s rekenkundig kunnen adverteren. Je gebruikt het om te bepalen wát je bouwt; tROAS gebruik je om te draaien wat je gebouwd hebt.
Mijn CR en AOV schommelen flink van maand tot maand. Breekt dat de formule niet?
Gebruik een stabiel venster — 60 tot 90 dagen — en segmenteer op apparaat of markt als die wezenlijk verschillen. De formule hoeft niet tot op de cent te kloppen; hij sorteert pagina’s in stapels bouwen / fixen / skippen. Het gaat om speelruimte op grootteorde-niveau.
Heb ik echt Screaming Frog nodig, of kan AI gewoon de crawler schrijven?
Allebei werkt. Screaming Frog met een custom XPath-extractie is de no-code route en is écht in drie minuten opgezet. Een gescripte crawler is beter als je de data automatisch in een pipeline gejoined wilt hebben. Kies op basis van of dit een eenmalige audit is of een herhaalbare workflow.
Wat telt als een 'probleempagina' versus een pagina die ik gewoon moet skippen?
Een skip-pagina heeft van nature zwakke economie — lage AOV, lage intentie — dus de maxCPC is oprecht piepklein en zal dat altijd blijven (/phone-cases op €0,02). Een probleempagina zou moeten converteren — fatsoenlijke AOV, echte vraag, veel sessies — maar doet dat niet, meestal omdat de eerst-getoonde producten te duur zijn of slecht gesorteerd (/sleeping-bags op €0,10). Skip-pagina’s laat je weg; probleempagina’s fix je en meet je opnieuw.
Werkt dit alleen voor e-commerce?
De maxCPC-formule werkt overal waar je een conversiewaarde hebt — lead gen inbegrepen, waar AOV de leadwaarde wordt. De probleempagina-diagnose (Merchant Center product_type, prijzen van concurrenten, sorteervolgorde van categorieën) is specifiek voor e-commerce; probleempagina’s bij lead gen hebben hun eigen diagnose nodig, meestal frictie in het formulier of een mismatch in het aanbod.
Hoe hangt dit samen met AI Max en het einde van DSA?
Het zit upstream van die beslissing. Welk campagnetype je ook kiest — AI Max, de opvolger van DSA, klassieke STAG — het mag alleen ooit wijzen naar pagina’s die door dit filter kwamen. De strategiekeuze verandert hóé je inkoopt; de economie bepaalt wat überhaupt de moeite waard is om in te kopen.
CTA: Wil je de bouwstapel voor jouw site, gerangschikt op wat elke pagina écht kan betalen? Laten we het filter op je GA4 draaien.