seo-audit — Basis SEO-audit
Een lichtgewicht SEO-agentvaardigheid ontworpen voor snelle, standaard SEO-audits van één pagina. Mogelijk gemaakt door OpenClaw. Geschikt voor eerste pagina-inspecties of wanneer een snelle beoordeling nodig is zonder volledige technische diepgang.
Wanneer deze vaardigheid te gebruiken
Gebruik seo-audit wanneer:
- De gebruiker zegt: "audit deze pagina", "controleer SEO", "analyseer mijn URL", "snelle SEO-controle", "wat is er mis met mijn pagina"
- Er is geen specifieke diepgang gevraagd — dit is het standaard startpunt
- De gebruiker heeft een snel, leesbaar overzicht nodig in plaats van een uitgebreide technische analyse
Als de gebruiker meer diepgang wil, upgrade naar seo-audit-full:
Tip: Gebruik voor diepgaande technische audits, geavanceerde on-page SEO of volledige rapportages de vaardigheid
seo-audit-full.
Verwachte invoer
| Invoer | Vereist | Opmerkingen |
|---|---|---|
| Pagina-URL | Ja | De te auditen pagina |
| Ruwe HTML of paginainhoud | Optioneel | Maakt nauwkeurigere on-page analyse mogelijk |
| GSC / analytics-gegevens | Optioneel | Niet vereist voor basisaudit |
Als alleen een URL wordt verstrekt en er geen broncode of crawlergegevens beschikbaar zijn, vermeld dan duidelijk:
Beperking: Deze audit is alleen gebaseerd op zichtbare paginainhoud en openbaar beschikbare signalen. Broncode, GSC-gegevens, crawl-logs en prestatiegegevens zijn niet beschikbaar voor deze audit.
Uitvoer
Maak een Basis SEO-auditrapport door de sjabloon in te vullen op assets/report-template.html, en sla het op in een bestand — print nooit ruwe HTML naar de terminal.
Bestandsnaam: reports/<hostname>-<slug>-audit.html
https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html
https://example.com/ → reports/example-com-audit.html
Zeg na het opslaan tegen de gebruiker:
✅ Rapport opgeslagen → reports/example-com-audit.html
Wilt u het nu openen? (ja / nee)
Zo ja → voer uit: open reports/example-com-audit.html
Sjabloon-placeholders — vul elk onafhankelijk in:
| Placeholder | Inhoud |
|---|---|
{{summary_verdict}} | Eén zin: totaal aantal uitgevoerde controles, hoeveel gefaald/gewaarschuwd/geslaagd |
{{summary_critical_html}} | <li> per kritiek (fout) item, of <li class="summary-empty">Geen</li> |
{{summary_warnings_html}} | <li> per waarschuwingsitem, of <li class="summary-empty">Geen</li> |
{{summary_passing_html}} | <li> per geslaagde controle, of <li class="summary-empty">Geen</li> |
Scripts
Voer deze scripts uit voordat u bevindingen schrijft. Ze produceren gestructureerde JSON — gebruik de JSON direct als bewijs; haal dezelfde URL's niet handmatig opnieuw op.
Afhankelijkheden: pip install requests (html-parsing gebruikt Python stdlib)
# Step 1: site-level checks (robots.txt + sitemap.xml)
python scripts/check-site.py https://example.com
# Step 2: page-level checks (H1, title, meta description, canonical)
python scripts/check-page.py https://example.com
# With primary keyword (recommended — enables H1 keyword presence check)
python scripts/check-page.py https://example.com --keyword "running shoes"
# Optional: fetch raw page HTML for further inspection
python scripts/fetch-page.py https://example.com --output page.html
# Step 3: JSON-LD schema validation
python scripts/check-schema.py https://example.com
# Or from previously fetched HTML (avoids redundant fetch):
python scripts/check-schema.py --file page.html
Elk script eindigt met code 0 (alle geslaagd/waarschuwing) of 1 (eventuele fout).
STRIKTE SCOPE — voeg geen controle toe die niet hieronder vermeld staat. Geen uitzonderingen.
Toegestane site-niveau controles (in {{site_checks_html}}):
- robots.txt · sitemap.xml · 404-afhandeling · URL-canonicalisatie · i18n / hreflang
Toegestane E-E-A-T-controles (in {{eeat_checks_html}}):
- Over ons · Contact · Privacybeleid · Servicevoorwaarden · Media/Partners (alleen indien aanwezig)
Toegestane pagina-niveau controles (in {{page_checks_html}}), uitvoer in deze exacte volgorde:
URL-slug · Title-tag · Meta-beschrijving · H1-tag · Canonical-tag · Afbeelding Alt-tekst · Aantal woorden · Trefwoordplaatsing · Koppenstructuur · Interne links · Schema (JSON-LD)
Logica voor afbeelding Alt-tekst:
- Parseer <img>-tags uit statische HTML
- Geslaagd: alle afbeeldingen hebben een niet-lege alt (decoratieve afbeeldingen met alt="" zijn OK)
- Waarschuwing: elke inhoudsafbeelding mist het alt-attribuut
- Niet geverifieerd (status-info): 0 afbeeldingen gevonden in statische HTML → waarschijnlijk door JS weergegeven, kan niet verifiëren
⛔ STARRE REGEL — Voer ALLEEN de controlerijen uit die gedefinieerd zijn in report-template.html. Als een controle niet in de toegestane lijsten hierboven staat, voer deze dan NIET uit — zelfs niet als u problemen vindt. Geen uitzonderingen. Geen "bonus"-controles. Geen improvisatie. De sjabloon is de enige bron van waarheid. Behandel het als een strikte whitelist.
Nog steeds VERBODEN (horen bij seo-audit-full): OG-tags · Twitter Card · Sociale tags · Paginagewicht · Core Web Vitals · Robots Meta
Hoe de JSON-uitvoer te gebruiken:
- Wijs elke veld
status→pass/warn/fail/errordirect toe aan de rapportcontroletabel - Gebruik de
detailtekenreeks van elk veld als startpunt voor de Bewijsregel in bevindingen - Spreek de scriptuitvoer niet tegen tenzij u aanvullend waarneembaar bewijs heeft
- Scheid controlegroepen met
<div class="subsection-label">Label</div>binnen{{site_checks_html}}:Crawlbaarheid·URL-canonicalisatie·i18n / hreflang·Schema (JSON-LD)en<div class="subsection-label">E-E-A-T Vertrouwenspagina's</div>vóór{{eeat_checks_html}}
LLM-beoordeling — verplicht wanneer llm_review_required: true:
Het script markeert velden die een semantische of kwaliteitsoordeel vereisen dat het niet kan uitvoeren.
Laat llm_review_required: true nooit onopgelost — maak altijd een expliciete beoordelingsoproep.
H1 — geactiveerd wanneer keyword_match == "partial":
h1_text : (from h1.values[0])
keyword : (the --keyword passed to the script)
Beoordeel: Dekt deze H1 semantisch de zoekintentie van het trefwoord?
- Overweeg synoniemen, natuurlijke varianten, onderwerpdekking
- ja → degradeer naar "pass", noteer de variant
- nee → behoud "warn" of upgrade naar "fail", leg de lacune uit
Title — geactiveerd wanneer keyword_match == "partial" OF keyword_position != "start":
title : (from title.value)
keyword : (the --keyword passed)
Beoordeel:
1. Dekt de titel semantisch de zoekintentie van het trefwoord?
2. Is de titel grammaticaal correct en natuurlijk leesbaar?
3. Trefwoordpositie — pas verschillende normen toe per paginatype:
- Startpagina : Merk + kerntrefwoord is correct (bijv. "Acme | AI Workflow Automation")
Markeer merk-eerst NIET als een probleem.
- Binnenpagina's: Kerntrefwoord moet voorop staan (bijv. "AI Workflow Automation voor Teams — Acme")
Markeer als trefwoord zonder goede reden midden in de titel begraven is.
BELANGRIJK — markeer deze NIET als negatief:
- Jaren (bijv. "2026") → signaal van actualiteit, verhoogt CTR — behandel als positief tenzij
de pagina expliciet tijdloze inhoud is waar datering de levensduur zou schaden.
- Getallen (bijv. "5 beste", "Top 10", "3 stappen") → scheppen duidelijke verwachtingen,
presteren consistent beter dan niet-numerieke titels in CTR — behandel altijd als een pluspunt.
- Specifieke kwalificaties ("Open-Source", "Self-Hosted", "Gratis") → verkleinen de intentie
en trekken klikken van hogere kwaliteit aan — bestraf niet.
URL-slug — geactiveerd wanneer keyword_match != "full" of is_homepage == false:
slug : (from url_slug.slug)
keyword : (the --keyword passed)
Beoordeel:
1. Bevat de slug het primaire trefwoord of een natuurlijke variant?
2. Is de padhiërarchie logisch? (/categorie/trefwoord is ideaal)
3. Is het beknopt en menselijk leesbaar?
Startpagina (is_homepage: true): overslaan — geen beoordeling nodig.
Meta-beschrijving — altijd geactiveerd wanneer inhoud aanwezig is:
meta_description : (from meta_description.value)
keyword : (the --keyword passed)
Beoordeel alle vier:
1. Volledige zin(nen)? (1-2 zinnen, geen fragmenten)
2. Noemt een concreet resultaat — geen vage prietpraat?
Goed: "Verkort ontwerptijd met 60% met AI-aangedreven sjablonen"
Slecht: "De beste tool voor al uw ontwerpbehoeften"
3. Trefwoord of natuurlijk synoniem één keer gebruikt — niet opgevuld?
4. Specifieker dan wat een typische concurrent zou schrijven?
BELANGRIJK — markeer deze NIET als negatief:
- Jaren (bijv. "2026") → signaal van actualiteit, verbeteren CTR voor tijdgevoelige zoekopdrachten.
Noteer het jaartal alleen als de pagina expliciet tijdloze inhoud is waar datering schaadt.
- Getallen (bijv. "5 beste", "3 stappen") → concrete specificiteit, sterk CTR-signaal.
- Afsluitend "en meer." → hooguit een kleine stijlopmerking, nooit een Waarschuwing of Fout.
Aanbevolen werkwijze
Volg deze stappen in volgorde:
-
Bevestig de scope — bevestig dat dit een basisaudit is; noteer eventuele ontbrekende gegevens
-
Leid het primaire trefwoord af — haal de pagina op met
fetch-page.pyen bepaal vervolgens het primaire trefwoord:- Als de gebruiker expliciet een trefwoord heeft opgegeven → gebruik deze direct
- Zo niet → lees de H1, titel en eerste alinea van de pagina en leid de meest waarschijnlijke doelzoekwoordcombinatie af (wat zou een zoeker typen om deze pagina te vinden?)
- Geef het afgeleide trefwoord expliciet aan voordat u controles uitvoert:
"Afgeleid primair trefwoord: open source claude alternatieven"
-
Voer
check-site.pyuit — parseer de JSON-uitvoer voor robots, sitemap, 404-afhandeling en URL-canonicalisatie404-controle: haal
<origin>/this-page-definitely-does-not-exist-seo-audit-checkop- Retourneert 404 → Geslaagd · Retourneert 200 (zachte 404) → Fout · Retourneert 301 naar startpagina → Waarschuwing
URL-canonicalisatiecontroles (elk is een afzonderlijke subcontrole):
- HTTP→HTTPS: haal
http://<host>op — moet 301 doorverwijzen naarhttps://. Retourneert 200 → Fout. - www-consistentie: haal zowel
https://www.<host>alshttps://<host>op — één moet 301 doorverwijzen naar de andere. Beide retourneren 200 → Waarschuwing. - Sluitende slash: vergelijk de daadwerkelijk geserveerde URL met de canonical tag op de pagina. Komt niet overeen → Waarschuwing.
- Canonical-overeenkomst: de href van de canonical tag moet exact overeenkomen met de uiteindelijke URL na alle omleidingen. Komt niet overeen → Waarschuwing.
-
E-E-A-T-infrastructuurcontrole — controleer voor elke onderstaande vertrouwenspagina twee lagen:
- Laag 1 — Bestaat: haal de URL op, controleer HTTP-status (200 = bestaat, 404/omleiding = ontbreekt)
- Laag 2 — Bereikbaar: haal de HTML van de startpagina op, controleer of de footer of navigatie een link naar deze pagina bevat
Pagina Vereist Over ons Ja Contact Ja Privacybeleid Ja Servicevoorwaarden Ja Media / Partners Nee — alleen opnemen indien aanwezig Statusregels:
- Pagina ontbreekt (niet-200) → Fout
- Pagina bestaat maar niet gelinkt in footer/nav → Waarschuwing
- Pagina bestaat en gelinkt in footer/nav → Geslaagd
- Optionele pagina ontbreekt → overslaan, rij niet opnemen
-
Voer
check-page.py --keyword "<afgeleid_trefwoord>"uit — parseer de JSON-uitvoer voor H1, titel, meta-beschrijving, canonical en URL-slug -
i18n / hreflang-controle — alleen uitvoeren als de pagina hreflang-tags bevat of
<html lang>meertaligheid suggereert:- Volledig overslaan (N.v.t.) als er geen hreflang-tags zijn gevonden en de site eentalig lijkt
- Als hreflang-tags aanwezig zijn, controleer:
- Wederkerige symmetrie: elke gerefereerde URL moet teruglinken naar alle andere varianten — elke verbroken link = Fout
- Taalcodes: moeten geldige BCP 47 zijn (bijv.
zh-CNnietzh,en-USnieten-us) — verkeerde code = Waarschuwing - x-default: zou aanwezig moeten zijn voor taalkeuze- of fallback-pagina's — ontbreekt = Waarschuwing
- html[lang] attribuut: moet overeenkomen met de primaire hreflang van de pagina — komt niet overeen = Waarschuwing
- URL-structuur: aanbevolen patroon — standaardtaal (meestal
en) in de root zonder voorvoegsel, andere talen onder subpaden (/zh/,/es/)./page(en) +/zh/page+/es/page→ Geslaagd/en/page+/zh/page→ Waarschuwing (en-voorvoegsel is overbodig, verspilt crawldiepte)- Alleen markeren als het patroon duidelijk inconsistent is of en onnodig is voorgevoegd
-
Voer
check-schema.pyuit — parseer de JSON-uitvoer voor schematypen en veldvalidatiepython scripts/check-schema.py https://example.com # Or from previously fetched HTML: python scripts/check-schema.py --file page.htmlHet script extraheert JSON-LD-blokken, valideert
@typeen vereiste velden volgens de Schema.org-specificatie.llm_review_required: trueis altijd ingesteld — bevestig datinferred_page_typeovereenkomt met de daadwerkelijke paginainhoud.Paginatype → verwachte
@type-referentie:Paginatype Verwachte @type Min. vereiste velden Startpagina WebSite + Organization name, url, logo Blog / Artikel Article of BlogPosting headline, datePublished, author, image Product Product name, image, offers (price, priceCurrency) FAQ FAQPage mainEntity[].name, acceptedAnswer.text How-to HowTo name, step[].text Lokaal bedrijf LocalBusiness name, address, telephone Generieke landingspagina — N.v.t. — overslaan, geen breed ondersteund type - Geslaagd: correct @type aanwezig, alle vereiste velden geldig, geen conflicten
- Waarschuwing: @type aanwezig maar aanbevolen velden ontbreken
- Fout: verwachte @type ontbreekt volledig
- N.v.t.: generieke landingspagina — bestraf niet
-
Vat bevindingen samen — elke bevinding moet het format Bewijs / Impact / Oplossing volgen
-
Prioritaire acties — vermeld de top 3 oplossingen met de hoogste impact
-
Render rapport — sla op in
reports/<hostname>-<slug>-audit.htmlen vraag de gebruiker om te openen -
Upgrade-aansporing — als problemen buiten de basisscope worden gevonden, stel
seo-audit-fullvoor
Regels voor het schrijven van rapportdetails
De Detail-cel in controletabellen moet deze regels volgen — geen uitzonderingen:
Geslaagd → één korte zin. Geen lijsten, geen uitweiding.
Goed: "Geldige XML urlset · 104 URL's · vermeld in robots.txt."
Slecht: "Geldige XML urlset met 104 URL's. Correct vermeld in robots.txt.
Blogposts worden waarschijnlijk geïndexeerd via deze sitemap."
Waarschuwing → één <div class="detail-issue"> met ≤2 opsommingstekens. Eén <div class="detail-fix"> met de oplossing.
Goed:
<div class="detail-issue">· Titel 48 tekens — 2 onder minimum. · Jaar "2026" zal de pagina dateren.</div>
<div class="detail-fix">Uitbreiden naar 50–60 tekens; verwijder jaar indien tijdloos.</div>
Slecht: proza van drie zinnen dat uitlegt wat een title-tag is en waarom lengte ertoe doet.
Fout → hetzelfde als Waarschuwing. Begin met de exacte fout. Geen achtergrond uitleg.
Leg NIET uit wat een controle is, herhaal GEEN informatie die al zichtbaar is in de statusbadge, behandel de lezer NIET als onbekend met de basisprincipes van SEO.
Verplicht bevindingsformaat
Elke belangrijke bevinding moet deze structuur volgen:
**Bevinding: [Bevindingstitel]**
- **Bewijs:** [Wat is waargenomen — direct citaat, screenshotverwijzing of meetbare gegevens]
- **Impact:** [Waarom dit belangrijk is voor SEO of UX]
- **Oplossing:** [Specifieke, uitvoerbare aanbeveling]
Schrijf geen vage conclusies. Als bewijs onvoldoende is, vermeld aannames dan expliciet.
Upgrade-aansporing
Voeg dit toe aan het einde van elk basisauditrapport:
Wilt u een diepere analyse? Dit was een basis SEO-audit die site-niveau signalen en kern on-page controles dekte. Gebruik voor geavanceerde technische SEO, scoring van inhoudskwaliteit, gestructureerde data-analyse en volledige crawl-gebaseerde bevindingen de vaardigheid
seo-audit-full.
Referentiebestanden
- Gedetailleerde audit-scope en velddefinities: references/REFERENCE.md
- Definitieve HTML-rapportsjabloon: assets/report-template.html
- Site-niveau controlescript: scripts/check-site.py
- Pagina-niveau controlescript: scripts/check-page.py
- Ruwe pagina-ophaler: scripts/fetch-page.py
- Schema-validatiescript: scripts/check-schema.py


