SEO Cannibalization Detector: volledige gids
Detecteer en los de SEO-kannibalisatie van uw PrestaShop-winkel op via Google Search Console: installatie, configuratie, scans en 301-redirects.
SEO Cannibalization Detector verbindt zich alleen-lezen met uw Google Search Console-property, identificeert elke zoekopdracht waarop meerdere URL’s van uw PrestaShop-winkel elkaar kannibaliseren, en stelt een concrete actie voor: consolideren, 301-redirecten, differentiëren of monitoren. Deze documentatie behandelt de installatie, de configuratie van het Google-serviceaccount, het starten van uw eerste scan, het lezen van het rapport en het beheer van de redirects.
Vereisten
- PrestaShop 8.0 tot 9.x
- PHP 8.1 of hoger, met de extensies
openssl,curlenjson - Een Google Cloud-project (gratis account volstaat, geen krediet vereist)
- Een al geverifieerde Google Search Console-property voor het domein van uw winkel
echo extension_loaded('openssl') ? 'OK' : 'KO'; toe in een PHP-testbestand.
Installatie
- Download de ZIP
dfcannibalization-1.0.0.zipvanuit uw DataFirefly-klantomgeving. - Ga in de PrestaShop back-office naar Modules → Module Manager.
- Klik op Een module uploaden en selecteer de ZIP.
- Klik na de installatie op Configureren.
De module maakt 4 SQL-tabellen aan (scan, query, page, action), een admintabblad “DataFirefly Cannibalization” onder IMPROVE, en een uniek token voor de geplande scans.
Een Google-serviceaccount aanmaken
Een serviceaccount is een technisch Google-account waarmee uw winkel de Search Console-gegevens kan lezen zonder interactieve authenticatie te vragen. Het is gratis en beperkt tot alleen-lezen.
1. De Search Console API activeren
- Open console.cloud.google.com.
- Maak een nieuw project aan (bijv. “DataFirefly SEO”) of selecteer een bestaand project.
- Ga in het navigatiemenu naar API’s en services → Bibliotheek.
- Zoek Google Search Console API en klik op Activeren.
2. Het serviceaccount aanmaken
- Ga in hetzelfde menu naar API’s en services → Identificatiegegevens.
- Klik op Identificatiegegevens aanmaken → Serviceaccount.
- Geef het een duidelijke naam (bijv. “datafirefly-cannibalization”) en bevestig. De optionele stappen voor rollen en gebruikerstoegang kunt u overslaan.
3. De JSON-sleutel genereren
- Klik op het aangemaakte serviceaccount.
- Tabblad Sleutels → Een sleutel toevoegen → Een sleutel aanmaken.
- Selecteer het formaat JSON en bevestig. Het bestand wordt automatisch gedownload.
Het serviceaccount autoriseren in Search Console
Het serviceaccount heeft zijn eigen e-mailadres (zichtbaar in de JSON onder de sleutel client_email, bijv. datafirefly-cannibalization@project-123.iam.gserviceaccount.com). Het moet leestoegang krijgen op uw property.
- Open search.google.com/search-console.
- Selecteer uw property (URL-prefix of domain).
- Klik op Instellingen → Gebruikers en machtigingen.
- Klik op Een gebruiker toevoegen.
- Plak het
client_email-adres van het serviceaccount en kies de machtiging Beperkt (alleen-lezen). - Bevestig.
De module configureren
Ga terug naar de PrestaShop back-office, naar de configuratie van de module.
Serviceaccount en property
- Serviceaccount-JSON: open het gedownloade bestand, kopieer en plak de volledige inhoud in het veld.
- Site-URL (GSC-property): neem exact het in Search Console getoonde formaat over.
- Voor een URL-prefix-property:
https://www.voorbeeld.nl/(met de slash aan het einde). - Voor een domain-property:
sc-domain:voorbeeld.nl(zonder protocol, met het voorvoegselsc-domain:).
- Voor een URL-prefix-property:
Detectiedrempels
- Analyseperiode: 7 tot 490 dagen. 90 dagen is een goed compromis tussen versheid en statistisch volume.
- Minimumvertoningen: negeert zeer zwakke zoekopdrachten. Standaard 30. Zet op 10 als uw winkel recent is.
- Minimumklikken: klikdrempel per zoekopdracht om te worden geanalyseerd. Standaard 1. Zet op 0 om ook zoekopdrachten met vertoningen zonder klik op te nemen (nuttig voor jonge sites).
- Maximumpositie: negeert zoekopdrachten waar de beste URL voorbij deze positie staat. Standaard 30.
Automatische 301-redirects
Activeert de interceptie via de dispatcher-hook van PrestaShop. Schakel uit als u de redirects liever handmatig beheert in Verkeer en SEO → Redirects.
Klik op Opslaan en dan op GSC-verbinding testen. Slaagt de verbinding, dan toont de module een groen bericht.
Een scan starten
Klik op Nu een scan starten. De module:
- Bevraagt de Search Console API voor de geconfigureerde periode (paginering tot 200.000 regels).
- Groepeert de regels per zoekopdracht.
- Filtert volgens uw drempels (vertoningen, klikken, positie).
- Behoudt alleen zoekopdrachten met minstens 2 verschillende URL’s.
- Berekent de ernstscore en de aanbeveling.
- Slaat alles op in de database.
Voor een gemiddelde site (10.000 tot 50.000 pagina’s) duurt een volledige scan over 90 dagen tussen 30 seconden en 3 minuten.
Het rapport lezen
Open na afloop de scan vanuit het tabblad Scangeschiedenis. Het rapport somt elke gekannibaliseerde zoekopdracht op, met:
- Het trefwoord (de Google-zoekopdracht).
- De ernstscore als gekleurde stip (low / medium / high / critical).
- Het aantal concurrerende URL’s.
- De aanbeveling (REDIRECT 301, CONSOLIDATE, DIFFERENTIATE, MONITOR).
- De status (in afwachting, bekeken, opgelost, genegeerd).
Klik op een zoekopdracht voor het detail: de lijst met concurrerende URL’s met klikken, vertoningen, gemiddelde positie, CTR en paginatype (product, categorie, CMS, blog, enzovoort). De als “winnaar” geïdentificeerde URL wordt groen gemarkeerd.
De ernstscore begrijpen
De score gaat tot 100 en combineert 4 gewogen factoren:
- Aantal concurrerende pagina’s (max. 25 punten) — formule:
min((n-1)/3, 1) × 25. Vanaf 4 concurrerende URL’s is de factor maximaal. - Klikverdeling (max. 30 punten) — gebaseerd op een omgekeerde HHI-index. Een 50/50-kannibalisatie tussen twee URL’s is ernstiger dan een 95/5. Formule:
((1-HHI)/(1-1/n)) × 30. - Positieverschil (max. 30 punten) — gewogen op de positie van het beste resultaat. Bonus × 1.0 als beste positie ≤ 10, × 0.7 als ≤ 20, × 0.4 daarboven.
- Vertoningsvolume (max. 15 punten) — logaritmische schaal:
min(log10(impr+1)/4, 1) × 15.
Niveaus: low < 26, medium < 51, high < 76, critical ≥ 76.
De 4 aanbevelingen
REDIRECT 301
De module stelt deze actie voor wanneer één URL minstens 70% van de klikken pakt met een gemiddelde positie ≤ 15. Dat is de “winnende” URL: Google beschouwt haar duidelijk als het beste antwoord. De andere URL’s worden er met een 301 naartoe geredirect. De inhoud kan vóór de redirect redactioneel worden samengevoegd indien nodig.
CONSOLIDATE
De prestaties zijn verdeeld (geen duidelijke winnaar). Aanbeveling: de inhoud van de twee URL’s op één samenvoegen en de andere met een 301 redirecten. Dat werk is redactioneel, niet automatiseerbaar. De module identificeert het geval maar voert de samenvoeging niet voor u uit.
DIFFERENTIATE
De pagina’s zijn van verschillende types (bijvoorbeeld een productfiche en een blogartikel). De kannibalisatie wijst op een targetingprobleem van de title-/metatags eerder dan op een echt inhoudsconflict. Aanbeveling: de tags herwerken om verschillende zoekopdrachten te targeten (longtail op de blog, hoofdzoekopdracht op het product).
MONITOR
De score is laag (< 26). Geen dringende actie. De module houdt de zoekopdracht in het rapport maar klasseert ze als “te monitoren”.
Een 301-redirect toepassen
Vanuit het detail van een zoekopdracht met aanbeveling REDIRECT 301:
- Klik op de knop Als bron selecteren naast de te redirecten URL (die welke niet de winnaar is).
- De doel-URL (de winnaar) wordt automatisch vooringevuld.
- Klik op Redirect toepassen.
De regel wordt opgeslagen en onmiddellijk geserveerd via de hook actionDispatcherBefore. Prestaties: één enkele SELECT per PHP-FPM-worker dankzij een statische geheugencache.
curl -I https://uw-winkel.com/oude-url. U moet een HTTP/1.1 301 zien en een header Location: naar de nieuwe URL.
De actieve redirects beheren
Het tabblad Redirects 301 somt alle geplaatste redirects op met hun hitteller. U kunt:
- Een redirect uitschakelen zonder haar te verwijderen (nuttig om een terugkeer te testen).
- Een redirect definitief verwijderen.
- Het aantal hits zien sinds de aanmaak (meet de effectiviteit).
Geplande scans via cron
De module biedt een met een token beveiligde frontcontroller. De URL wordt in de moduleconfiguratie getoond in de vorm:
https://uw-winkel.com/index.php?fc=module&module=dfcannibalization&controller=cron&token=XXXX
Standaard Linux-cron
Bewerk op een Linux/Unix-server met SSH-toegang uw crontab:
crontab -e
Voeg bijvoorbeeld elke zondag om 23 u een scan toe:
0 23 * * 0 curl -s "https://uw-winkel.com/index.php?fc=module&module=dfcannibalization&controller=cron&token=XXXX" > /dev/null
Geplande taken OVH / o2switch / Infomaniak
Al deze hosters bieden een planner in hun back-office. Vul de volledige URL en de gewenste frequentie in. Voor de meeste winkels volstaat een wekelijkse scan ruimschoots.
Multistore
Alle tabellen bevatten een kolom id_shop. De scans zijn gescopet op de actieve winkel in de kiezer bovenaan de back-office. Elke winkel heeft haar eigen configuratie (serviceaccount, GSC-URL, drempels) en haar eigen scangeschiedenis.
Beheert u meerdere domeinen vanuit één back-office, maak dan een apart serviceaccount per property aan, of autoriseer hetzelfde serviceaccount op al uw Search Console-properties.
Probleemoplossing
“OpenSSL extension required”
Vraag uw hoster de PHP-extensie OpenSSL te activeren. Bij 99% van de moderne hostings is ze standaard ingeschakeld.
“Invalid service account JSON”
De geplakte JSON is onvolledig of beschadigd. Download de sleutel opnieuw vanuit de Google Cloud Console en plak haar volledig, zonder wijziging.
“Site URL must match exactly the GSC property”
Controleer het formaat in Search Console. Een URL-prefix-property schrijft u als https://www.voorbeeld.nl/ (slash aan het einde). Een domain-property als sc-domain:voorbeeld.nl (geen protocol, geen slash).
“403 User does not have sufficient permissions”
Het serviceaccount is niet in Search Console geautoriseerd, of het is op een andere property geautoriseerd. Controleer Instellingen → Gebruikers en machtigingen.
De scan draait maar vindt geen enkele kannibalisatie
Uw drempels zijn misschien te hoog voor uw volume. Probeer eerst de minimumvertoningen te verlagen naar 5 en de minimumklikken naar 0.
Een 301-redirect wordt niet geactiveerd
Controleer of (1) de optie “Automatische 301-redirects” daadwerkelijk in de configuratie is ingeschakeld, (2) de regel als actief is gemarkeerd in het tabblad Redirects 301, (3) de PrestaShop-cache is geleegd na het activeren van de module.
Verder gaan
- Reviewbeleid: grijp bij critical-zoekopdrachten binnen 7 dagen in. Bij high binnen 30 dagen. Bij medium in het kader van een kwartaalreview.
- Strategie 301 versus consolidatie: de 301-redirect draagt het PageRank over maar verliest de mogelijkheid van twee geïndexeerde pagina’s. Geef bij verschillende zoekintenties de voorkeur aan differentiatie.
- Bijzonder geval van productfiches: kannibaliseren twee zeer gelijkende varianten elkaar, voeg ze dan samen tot één product met varianten in plaats van twee aparte producten.