/docs
pSEO Wizard documentatie
Alles wat je nodig hebt om van je website naar gepubliceerde pagina's te gaan: hoe de wizard werkt, hoe je de pagina's zonder code op je site zet en wat je doet als iets niet werkt.
Laatst bijgewerkt: september 2026
/how-it-works
Hoe het werkt
De wizard heeft vijf stappen. Tot je betaalt, kun je elke stap nog aanpassen.
- 01
Plak je website
We lezen je homepage en een paar belangrijke pagina's (diensten, prijzen, menu, over ons, contact) en herkennen je soort bedrijf. Voeg de kernfeiten toe die elke pagina moet gebruiken.
- 02
Kies een patroon
Kies de vorm van je zoekopdrachten, bijvoorbeeld „{Dienst} in {Stad}” of „{Product} voor {Doelgroep}”, en een paginasjabloon.
- 03
Vul de waarden in
Noteer de diensten, steden of doelgroepen die je wilt combineren. Elke combinatie wordt een pagina. Richt je je op plaatsen, dan controleren we of die passen bij hoe je je klanten bedient.
- 04
Genereer
Genereer eerst je gratis pagina. Ben je tevreden, betaal dan voor de rest (minimaal 10 pagina's) en de pagina's worden een voor een geschreven.
- 05
Publiceer of download
Stuur de pagina's naar WordPress, Shopify, Webflow of WooCommerce, of download ze als HTML-bestanden die klaar zijn om te uploaden.
/html-export
Je pagina's downloaden
In stap 5 geeft Bundel downloaden je een ZIP-bestand met alles wat je nodig hebt om de pagina's overal te hosten:
dist/Per pagina een kant-en-klaar HTML-bestand met ingebouwde opmaak, dus het ziet er goed uit zonder andere bestanden.dist/index.htmlEen eenvoudige lijst van al je pagina's, met links.sitemap.xmlEen sitemap die je kunt indienen in Google Search Console.data/Dezelfde pagina's als JSON (titel, slug, metabeschrijving en HTML), voor ontwikkelaars.
Zo zet je ze online
- Pak het bestand uit.
- Upload de bestanden uit dist/ naar je hosting, het liefst in een map /blog, bijvoorbeeld met het bestandsbeheer van je host of via FTP.
- Open één pagina in je browser om te controleren en dien daarna sitemap.xml in bij Google Search Console.
/json
JSON voor ontwikkelaars
De download bevat je pagina's ook als data, zodat je ze vanuit je eigen app kunt serveren. data/wizard-data.json is een array met één object per pagina:
| Veld | Type | Inhoud |
|---|---|---|
title | string | De paginatitel in de zoekresultaten, maximaal 60 tekens. |
meta_description | string | De metabeschrijving onder de titel in de zoekresultaten. |
h1 | string | De hoofdkop van de pagina. |
body_html | string | Het volledige HTML-document: head, inline CSS, gestructureerde gegevens en de „Lees ook”-links. Serveer het zoals het is. |
slug | string | Het laatste deel van de pagina-URL, bijvoorbeeld plumber-in-camden. |
keywords | object | De waarden voor deze pagina, één per variabele in je patroon. |
status | string | Altijd „success” voor pagina's in de export. |
locale | string | De taalcode van de pagina, bijvoorbeeld en of ar. |
data/content.json bevat dezelfde pagina's met drie extra namen die sommige tools verwachten: content (gelijk aan body_html), plus metaDescription en description (allebei gelijk aan meta_description).
Voorbeeld van een pagina-object (body_html ingekort)
{
"title": "Plumber in Camden | Example Plumbing",
"meta_description": "Same-day plumbing in Camden: boiler service from £89 and leak repairs by Gas Safe registered engineers.",
"h1": "Plumber in Camden",
"body_html": "<!DOCTYPE html><html lang=\"en\" dir=\"ltr\"><head>…</head><body>…</body></html>",
"slug": "plumber-in-camden",
"keywords": { "Service": "Plumber", "Area": "Camden" },
"status": "success",
"locale": "en"
}Serveer de pagina's vanuit je app
Stuur body_html als volledig antwoord voor de URL van de pagina. Zet het niet in je eigen layout: head, stijlen en gestructureerde gegevens zitten er al in. Kies het voorbeeld voor jouw stack:
Statische hosting (zonder framework)
# Put the exported pages under /blog on any static host
unzip your-site-bundle.zip -d export
mkdir -p public/blog
cp export/dist/*.html public/blog/
# /blog/plumber-in-camden.html works now. For /blog/plumber-in-camden,
# turn on "clean URLs" (Netlify, Vercel, Cloudflare Pages) or, on nginx:
location /blog/ {
try_files $uri $uri.html =404;
}Next.js
import pages from '@/data/wizard-data.json';
export async function GET(_req: Request, { params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const page = pages.find(p => p.slug === decodeURIComponent(slug));
if (!page) return new Response('Not found', { status: 404 });
return new Response(page.body_html, {
headers: { 'Content-Type': 'text/html; charset=utf-8' }
});
}Astro
---
import pages from '../../data/wizard-data.json';
export function getStaticPaths() {
return pages.map(page => ({ params: { slug: page.slug }, props: { page } }));
}
const { page } = Astro.props;
---
<Fragment set:html={page.body_html} />Nuxt
import pages from '~~/data/wizard-data.json';
export default defineEventHandler((event) => {
const slug = decodeURIComponent(getRouterParam(event, 'slug') ?? '');
const page = pages.find(p => p.slug === slug);
if (!page) throw createError({ statusCode: 404 });
setHeader(event, 'Content-Type', 'text/html; charset=utf-8');
return page.body_html;
});PHP (Laravel)
use Illuminate\Support\Facades\Route;
Route::get('/blog/{slug}', function (string $slug) {
$pages = json_decode(file_get_contents(storage_path('app/wizard-data.json')), true);
$page = collect($pages)->firstWhere('slug', $slug);
abort_unless($page, 404);
return response($page['body_html'])
->header('Content-Type', 'text/html; charset=utf-8');
});Houd „Lees ook”-links en /blog-URL's werkend
- Links tussen pagina's volgen de URL-structuur uit stap 3: /blog/{slug}, of /{prefix}/blog/{slug} met een taalvoorvoegsel. Serveer elke pagina op precies dat pad op de website uit stap 1, dan kloppen de links en de gestructureerde gegevens van de pagina zonder aanpassingen.
- Staan je pagina's op een ander pad, bewerk de HTML dan niet met de hand. Elke „Lees ook”-link heeft een data-pseo-link-attribuut met de slug van de doelpagina, zodat je ze allemaal in één keer kunt herschrijven:
read-also.js // Each "Read also" link carries data-pseo-link="<slug>" const html = page.body_html.replace( /href="[^"]*"(\s+data-pseo-link="([^"]+)")/g, (_, attr, slug) => `href="/guides/${slug}"${attr}` ); - De HTML-bestanden in dist/ linken daarentegen naar elkaar als {slug}.html. Upload ze samen in dezelfde map (bij voorkeur /blog) en ze blijven werken, met of zonder nette URL's.
- Importeer alle pagina's van een campagne tegelijk. Een link naar een pagina die je niet hebt geïmporteerd, geeft een 404: de HTML-export haalt die links voor je weg, en in je eigen app kun je links overslaan waarvan de slug niet in je data staat.
- Verander een slug niet meer als de pagina live staat. Moet het toch, voeg dan een 301-redirect toe van het oude naar het nieuwe adres.
/publish
Publiceren zonder code
Koppel je site in stap 5 en wij versturen de pagina's voor je. Je hebt maar één keer een sleutel van je platform nodig; de stappen hieronder laten zien waar je die vindt.
WordPress
De pagina's komen binnen als conceptberichten, zodat je ze kunt controleren voordat ze live gaan.
- Open in je WordPress-beheer Gebruikers → Profiel en scrol naar Applicatiewachtwoorden.
- Typ een naam zoals „pSEO Wizard”, klik op Nieuw applicatiewachtwoord toevoegen en kopieer het wachtwoord dat verschijnt. Het wordt maar één keer getoond.
- Kies in stap 5 WordPress en vul je siteadres, je WordPress-gebruikersnaam en dat applicatiewachtwoord in (niet je gewone inlogwachtwoord).
- Klik op Publiceren en open daarna Berichten → Concepten in WordPress om de pagina's te controleren en te publiceren.
Shopify
De pagina's worden als gepubliceerde artikelen toegevoegd aan de blog die je kiest.
- Open in je Shopify-beheer Instellingen → Apps en verkoopkanalen → Apps ontwikkelen en maak een app aan.
- Zet onder Admin API-bereiken configureren read_content en write_content aan, sla op en klik op App installeren.
- Open API-inloggegevens en kopieer het Admin API-toegangstoken. Het begint met shpat_.
- Kies in stap 5 Shopify, vul je winkeladres (jouwwinkel.myshopify.com) en het token in, kies een blog en klik op Publiceren.
Webflow
De pagina's worden als items in een CMS-collectie toegevoegd en gaan live zodra je je site opnieuw publiceert.
- Maak in de Webflow Designer een CMS-collectie aan (bijvoorbeeld „Gidsen”) met een rich-textveld Post Body en een tekstveld Post Summary. Het blogsjabloon van Webflow heeft ze allebei al.
- Open de sjabloonpagina van de collectie en koppel de naam en Post Body aan je layout.
- Maak een API-token aan onder Site-instellingen → Apps & integraties → API-toegang.
- Kies in stap 5 Webflow, plak het token, kies de site en de collectie, klik op Publiceren en publiceer daarna je site in Webflow.
WooCommerce
De pagina's worden als conceptproducten toegevoegd, handig voor pagina's over iets wat je verkoopt.
- Open in je WordPress-beheer WooCommerce → Instellingen → Geavanceerd → REST API en klik op Sleutel toevoegen.
- Geef de sleutel lees-/schrijfrechten en kopieer de consumer key (ck_…) en consumer secret (cs_…).
- Kies in stap 5 WooCommerce, vul je winkeladres en beide sleutels in, klik op Publiceren en controleer de concepten onder Producten.
Wix
Er is nog geen directe koppeling met Wix, maar je kunt de pagina's zelf toevoegen.
- Download je pagina's in stap 5 (zie „Je pagina's downloaden” hierboven).
- Voeg in de Wix Editor een nieuwe pagina toe, daarna Code insluiten → HTML insluiten, en plak de volledige inhoud van het .html-bestand van één pagina.
- Stel in Wix de URL en de SEO-titel van de pagina zo in dat ze overeenkomen. Zoekmachines lezen ingesloten HTML minder goed dan gewone pagina's, dus WordPress, Shopify of Webflow scoren meestal beter.
/pricing
Prijzen & betalen
Je betaalt één keer per pagina. Er is geen abonnement en elk account krijgt de eerste pagina gratis.
| Pagina's | Prijs per pagina |
|---|---|
| 1–500 | US$ 0,30 |
| 501–1.500 | US$ 0,25 |
| 1.501–3.500 | US$ 0,20 |
| 3.501+ | US$ 0,15 |
- De prijzen zijn gestaffeld: elke prijs geldt alleen voor de pagina's in die schijf. Voorbeeld: 600 pagina's kosten 500 × $ 0,30 + 100 × $ 0,25 = $ 175.
- Betaalde bestellingen bevatten minimaal 10 pagina's. Er zijn geen kortingen of kortingscodes.
- Pas je een betaalde campagne aan, dan gaat het bedrag voor pagina's die nog niet gemaakt zijn als tegoed terug naar je account, voor je volgende bestelling.
- Betalingen lopen via Dodo Payments, onze Merchant of Record. Het accepteert kaarten en lokale betaalmethoden en rekent eventuele btw bij het afrekenen.
/facts
Zo blijven de pagina's kloppen
Zoekmachines en klanten straffen pagina's af die dingen verzinnen. Deze regels gelden voor elke pagina:
Feiten komen van je website
Prijzen, diensten, reviews en cijfers komen alleen van je website en uit de kernfeiten die je invult. Een cijfer dat niet op je website staat, wordt van de pagina gehaald.
Elke pagina is anders
Elke pagina krijgt een eigen plan en afgeronde pagina's worden met elkaar vergeleken. Een pagina die te veel op de andere lijkt, wordt opnieuw geschreven.
Eerlijk over locaties
Komen klanten naar jou, dan waarschuwen we je voor plaatsen die ver weg liggen. Ga jij naar je klanten, dan zeggen de pagina's dat je het gebied bedient, nooit dat je er een vestiging hebt.
Gepubliceerd onder /blog
Standaard komen de pagina's in een map /blog, zodat een groot aantal nieuwe pagina's los staat van de rest van je site.
/help
Problemen oplossen
- WordPress zegt dat de inloggegevens onjuist zijn (401 of 403)
- Gebruik een applicatiewachtwoord, niet je gewone wachtwoord, samen met je WordPress-gebruikersnaam (niet je e-mailadres). Sommige beveiligingsplugins blokkeren de WordPress REST API; sta die toe voor je gebruiker en probeer het opnieuw.
- Shopify maakt geen verbinding
- Gebruik het Admin API-toegangstoken dat met shpat_ begint en geef de app de bereiken read_content en write_content. Installeer de app na het wijzigen van de bereiken opnieuw en kopieer het nieuwe token.
- Een pagina geeft 404 na het uploaden
- Controleer of het bestand in de map staat die de URL van de pagina verwacht (bijvoorbeeld /blog/) en of het taalvoorvoegsel dat je in stap 3 hebt ingesteld bij je site past.
- Knoppen gaan naar de verkeerde pagina
- Knoppen gaan naar de doel-URL uit stap 1, of naar de passende pagina op je site (reserveren, menu, prijzen, contact) als die bestaat. Stel de doel-URL in vóór het genereren; bij bestaande pagina's pas je de link aan in de pagina-editor in stap 4.
Kom je er niet uit? Mail naar support@wizardseo.co, dan helpen we je.