Docs

Code, menunamen en API-namen staan in het Engels, zoals in de code zelf.

Wavelynks, op één pagina

Wavelynks is een autonoom platform voor conversie-optimalisatie, met Echo, de AI-partner, die het werk doet. Een klein script past goedgekeurde varianten toe en meet anonieme analyses; de Echo Agent vindt problemen en stelt tests op; met Studio bouw en verfijn je varianten op je live pagina; en de resultatenmotor zegt je wat je live zet.

De cyclus: scannen → bouwen → goedkeuren → een geplande periode draaien → de winnaar live zetten of afronden → leren.

Installatie

Voeg één regel zo hoog mogelijk toe in de <head> van elke pagina. Je sitesleutel vind je onder Koppelingen.

index.html
<script src="https://www.wavelynks.com/echo.js" data-site="YOUR_SITE_KEY"></script>

Het script is bewust synchroon: bij een eerste bezoek verbergt het de pagina hoogstens ~900 ms terwijl varianten laden, en bewaart daarna de testinstellingen zodat volgende pagina’s wijzigingen toepassen voordat ze verschijnen, zonder flikkering. Gebruik Installatie controleren op de pagina Koppelingen om te zien of gebeurtenissen binnenkomen.

Shopify: Online Store → Themes → Edit code → layout/theme.liquid, plak direct na <head>. Next.js: een gewone <script> in de <head> van de root-layout. GTM: werkt, maar laadt later (wat flikkering).

Aankopen meten (Wavelynks Pixel)

Meld de omzet op je bevestigingspagina, zodat tests op geld gemeten worden, niet op klikken:

thank-you page
<script>
  window.echo = window.echo || [];
  echo.push(["purchase", { value: 84.50 }]);   // works before echo.js loads
</script>

Toevoegen aan het winkelmandje wordt vanzelf herkend bij winkelmandjes die /cart/add aanroepen (Shopify, WooCommerce, de meeste thema’s). Je kunt een doel ook op Paginabezoek zetten in Instellingen → Conversies, bijvoorbeeld elk pad dat begint met /checkout/thank-you.

JavaScript-API

browser
echo.track("newsletter_signup")              // custom goal (event mode)
echo.track("purchase", { value: 120 })         // purchase with revenue
echo.purchase({ value: 120 })                  // shorthand
echo.variant("exp_123")                        // → variant id this visitor sees, or null
echo.consent(true)                             // release events held for consent
echo.visitor                                   // anonymous visitor id

<button data-echo-goal="size_guide_open">Size guide</button>   // click goal, no JS

Debug elke pagina met ?echo_debug=1. Bekijk een conceptvariant op je live site met ?echo_preview=VARIANT_ID (de knop Voorbeeld in Studio maakt de link en een QR-code).

Targetingregels

Een targetinggroep is een herbruikbare set URL-regels. Elke regel luidt: pad wel / niet [operator] [waarde]. Combineer met EN / OF en nest groepen.

  • exact, simple: het pad is gelijk aan de waarde (querystrings worden altijd genegeerd)
  • starts_with, ends_with, contains
  • wildcard: /products/*, /collections/*/sale
  • regex: volledige reguliere expressies, hoofdletterongevoelig

Het bereikpaneel schat de bezoeken van de laatste 7 dagen en de geplande periode voordat je je vastlegt. Bredere groepen komen sneller tot een resultaat.

Hoe tests draaien

Elke A/B-test is een vaste, gelijke verdeling die aan het eind van een geplande periode gelezen wordt. De periode wordt vóór de start bepaald uit je echte verkeer:

  • 2 weken als de pagina’s ~5.000 bezoekers naar elke variant kunnen sturen, 4 weken als ze langer nodig hebben, en hoogstens 6 weken.
  • Cijfers blijven verborgen tot elke variant 350 bezoekers en 50 conversies heeft.
  • Er wordt geen koploper genoemd voordat de periode voorbij is. Gluren verhoogt het aantal fout-positieven.
  • Kans om te winnen (Bayesiaans, bèta-binomiaal), tegen je winnaarslat (standaard 95%; 80, 85 of 90% in Instellingen): op of boven de lat op conversie of omzet per bezoeker is een winnaar, iets eronder is veelbelovend, en het origineel wint als de kans van de variant onder 100% min de lat zakt.
  • Omzet per bezoeker telt zodra het origineel en de variant allebei 50 bestellingen hebben. Een variant die meer converteert maar minder per bezoeker oplevert, wordt nooit tot winnaar uitgeroepen.
  • Een duidelijke verliezer (minder dan 1% kans om te winnen) kan vroeg gestopt worden, maar pas na 7 dagen, zodat schommelingen tussen weekdagen het niet kunnen uitlokken.
  • De stijging wordt gemeld met een interval van 95%. Plan op de onderkant, niet op de puntschatting.
  • Uitsplitsingen per apparaat en kanaal verschijnen zodra elk segment 500 bezoekers per variant heeft. Zet alleen live waar het won.

De toewijzing is deterministisch (FNV-1a-hash van test + bezoeker, zoals in GrowthBook) en blijft bewaard in localStorage, zodat bezoekers dezelfde variant houden over pagina’s en bezoeken heen. Probeer de rekenhulpen om een test te plannen.

Studio & soorten wijzigingen

Varianten zijn lijsten DOM-bewerkingen die bovenop je originele pagina worden toegepast. Je code wordt nooit aangepast, en pauzeren draait alles meteen terug.

change types
text      replace an element's text
html      replace inner HTML
style     inline CSS on the element        { "background-color": "#1f9d47" }
attr      set an attribute                  href, src, aria-label…
hide      hide the element
insert    insert HTML  beforebegin | afterbegin | beforeend | afterend
css       add a global stylesheet           @media (max-width: 767px) { … }
move      move the element next to another
redirect  split-URL test

Klik in Studio om een element te selecteren, dubbelklik op tekst om ze ter plekke te bewerken, of beschrijf de wijziging aan de testagent. ⌘Z / ⇧⌘Z maken ongedaan en opnieuw; wijzigingen worden vanzelf bewaard.

Doelgroepen & advertenties

Een doelgroeppagina (een personalisatie) toont een aangepaste versie van een pagina aan één doelgroep, met een controlegroep (standaard 10%) die het origineel blijft zien, zodat je de stijging nog kunt meten. Doelgroepvelden: utm_source, utm_medium, utm_campaign, referrer, device, visitor (nieuw / terugkerend) en query.

De UTM-tags worden gelezen als een bezoeker aankomt en blijven het hele bezoek bewaard, zodat een bezoeker uit een advertentie zijn pagina houdt tijdens het rondkijken. Een link met een utm_-tag start een nieuwe toewijzing. Advertenties die in Wavelynks geschreven zijn, hebben hun eigen utm_campaign (één per advertentie), zodat de bezoeken en bestellingen van elke advertentie geteld worden en haar passende pagina precies haar bezoekers bereikt.

Enquêtes voor shoppers

Een enquête is één vraag (een antwoord kiezen, een score van 1–5, een score van 0–10 of de eigen woorden van de shopper), getoond door hetzelfde script, dus er hoeft niets anders geïnstalleerd te worden. Elke enquête heeft haar eigen moment (bij vertrekken, na een bestelling, na een tijdje of na scrollen, na toevoegen aan het winkelmandje), pagina’s, apparaten en bezoekers, hoe vaak dezelfde shopper haar mag zien, en haar uiterlijk.

  • Hoogstens één enquête per bezoek, nooit tijdens het afrekenen, en een enquête stopt voor een shopper zodra die geantwoord heeft (tenzij je anders kiest).
  • Shoppers zien de enquête in de taal van hun pagina (Engels, Nederlands, Frans, Duits, Spaans, Italiaans of Portugees) als je die hebt toegevoegd; anders in de taal die je als terugval kiest.
  • Antwoorden tellen mee voor redenen (prijs, verzending, maat, retour, vertrouwen, informatie, foto’s, betalen); een reden die vaak terugkomt wordt een testidee.

Bekijk een enquête op je live webshop voordat ze gepubliceerd is met ?echo_survey=SURVEY_ID (de knop “Bekijk het op je webshop” van de enquête maakt de link). Ze verschijnt meteen, en niets wat je daar antwoordt wordt geteld.

Privacy & toestemming

Het script bewaart alleen willekeurige ID’s en testtoewijzingen in eigen opslag: echo_<site>_vid, _sid, _asg, _exp, _cfg. Het plaatst geen cookies en verzamelt geen persoonsgegevens. Zet Wacht op toestemming voor analyse aan om gebeurtenissen vast te houden tot OneTrust (C0002), Google Consent Mode analytics_storage of echo.consent(true) toestemming geeft. Varianten worden nog steeds getoond, zodat de ervaring gelijk blijft.

Gebruik je een Content Security Policy, sta deze host dan toe voor script-src en connect-src.

MCP-server

Stel vragen over je webshop vanuit Claude, ChatGPT of elke MCP-client, en maak van het antwoord een concepttest. Maak een API-sleutel in Instellingen → API & MCP, en dan:

Claude Code
claude mcp add --transport http echo https://www.wavelynks.com/api/mcp \
  --header "Authorization: Bearer YOUR_KEY"

Tools: list_sites, list_experiments, get_experiment_results, get_page_scorecard, get_site_analytics, list_opportunities, create_experiment (altijd een concept, dat een mens moet starten).

Zelf hosten op gratis diensten

Wavelynks is één Next.js-app. Elke afhankelijkheid heeft een gratis niveau:

  • Hosting: Vercel Hobby (of elke Node-host)
  • Database: Neon Postgres (gratis niveau)
  • Inloggen: Better Auth (ingebouwd, e-mail + wachtwoord; optioneel GitHub/Google)
  • AI: optioneel. De regelmotor werkt zonder sleutel; voeg een Anthropic-sleutel toe om Claude te gebruiken.
  • E-mail: optioneel het gratis niveau van Resend voor wachtwoordherstel
terminal
npm install
cp .env.example .env.local      # set BETTER_AUTH_SECRET and DATABASE_URL (Neon)
npm run dev                     # runs migrations against your Neon database, then starts