Herroepingsknop verplicht voor webshops vanaf 19 juni 2026

Steven | TrustYourWebsite · 20 april 2026 · Laatst bijgewerkt: mei 2026

Op 19 juni 2026 moet elke EU-webshop een duidelijk gelabelde herroepingsknop tonen op de klantaccount- of besteloverzichtpagina. Dit vereiste komt niet uit de Moderniseringsrichtlijn 2019/2161, zoals veel bronnen melden. De werkelijke bron is Richtlijn (EU) 2023/2673 van 22 november 2023, die een nieuw artikel 11a invoegt in de Richtlijn consumentenrechten 2011/83/EU. Ondanks de titel die verwijst naar financiele diensten op afstand, geldt artikel 11a horizontaal voor alle online B2C-overeenkomsten met een herroepingsrecht. Nederland heeft de omzettingsdeadline van 19 december 2025 niet gehaald. Het wetsvoorstel ligt bij de Tweede Kamer. Het verplichte knopopschrift in het Nederlands: "hier de overeenkomst ontbinden".

Staat de herroepingsinformatie op je webshop?

Onze scanner controleert of je webshop herroepingsinformatie, het modelformulier en de verplichte termijnen vermeldt.

Ik begrijp dat dit een technische scan is, geen juridisch advies, en ik accepteer de voorwaarden.

Scannen voor:

Wat artikel 11a precies vereist

Het nieuwe artikel 11a legt zes concrete vereisten op aan webshops die onder het herroepingsrecht vallen.

De handelaar moet een herroepingsfunctie aanbieden op zijn online interface. Dit is geen pdf-formulier of een e-mailadres. Het moet een interactieve functie zijn die de consument rechtstreeks kan gebruiken om de overeenkomst te ontbinden.

De knop moet het opschrift "hier de overeenkomst ontbinden" dragen, of een ondubbelzinnig alternatief. Acceptabele alternatieven zijn "hier koop herroepen" of "bestelling annuleren". De formulering moet helder zijn. Een knop met "contact opnemen" of "hulp nodig?" voldoet niet.

De knop moet zichtbaar en doorlopend beschikbaar zijn gedurende de volledige herroepingstermijn van 14 dagen. Dat betekent: op de besteloverzichtpagina of de klantaccountpagina, niet verstopt achter drie klikken.

De herroeping verloopt in een tweestappenproces. Stap 1: de consument klikt op de herroepingsknop en vult een verklaring in met naam, contractidentificatie en bevestigingskanaal. Stap 2: de consument klikt op "ontbinding bevestigen". Pas na die bevestiging is de herroeping geldig.

De handelaar moet de ontvangst bevestigen op een duurzaam medium (in de praktijk: een e-mail). De bevestiging moet onmiddellijk of snel na ontvangst worden verstuurd.

De bewijslast dat de herroeping wel of niet binnen de termijn is ingediend, ligt bij de handelaar. Geen bevestigingsmail gestuurd? Dan kun je niet bewijzen dat de herroeping te laat was.

Het herroepingsrecht in 14 dagen

Het herroepingsrecht geldt voor alle overeenkomsten op afstand en buiten de verkoopruimte gesloten B2C-overeenkomsten. De termijn van 14 dagen begint bij de ontvangst van de goederen (voor producten) of bij het sluiten van de overeenkomst (voor diensten).

Artikel 16 van de Richtlijn consumentenrechten kent uitzonderingen. Het herroepingsrecht geldt niet voor op maat gemaakte producten, geopende hygienische producten, verzegelde audio-/video-opnames of software waarvan de verzegeling is verbroken, bederfelijke waren en specifieke hotel-/transport-/vrijetijdsreserveringen met een vaste datum. Voor een uitgebreide uitleg van BW 6:230o, de acht uitzonderingscategorieen en de terugbetaaltermijn zie onze gids over het herroepingsrecht voor Nederlandse webshops.

De 12-maanden verlengingsregel is het grootste risico voor webshops die de knop niet implementeren. Als je de consument niet hebt geinformeerd over het bestaan en de plaatsing van de herroepingsknop, verlengt de herroepingstermijn naar 14 dagen plus 12 maanden. Tijdens die verlengde periode kun je als handelaar geen normale waardevermindering in rekening brengen voor gebruikte producten. Dat is een aanzienlijk financieel risico bij duurdere producten.

Stand van de omzetting in Nederland

Het wetsvoorstel voor de implementatie van artikel 11a draagt het nummer Kamerstuk 36 860 en is ingediend op 24 november 2025. Het voegt een nieuw artikel 6:230oa BW toe aan Boek 6 van het Burgerlijk Wetboek. De bestaande bepalingen over herroeping staan in de artikelen 6:230m, 6:230o en 6:230p BW.

Nederland heeft de omzettingsdeadline van 19 december 2025 niet gehaald. Het wetsvoorstel ligt bij de Tweede Kamer en is nog niet behandeld. De Autoriteit Consument & Markt (ACM) is de toezichthouder voor consumentenrecht. De Autoriteit Financiele Markten (AFM) is toezichthouder voor financiele diensten.

Wat betekent dit in de praktijk? Ondanks de gemiste deadline ben je als webshop verstandig om tegen 19 juni 2026 klaar te zijn. Consumenten kunnen zich mogelijk rechtstreeks op artikel 11a beroepen via richtlijnconforme interpretatie. De rechter past nationaal recht zoveel mogelijk uit in overeenstemming met de richtlijn, ook als de omzettingswet nog niet is aangenomen. In eerdere gevallen (Faccini Dori, C-91/92) heeft het Hof van Justitie directe werking van richtlijnen tegen particulieren weliswaar afgewezen, maar richtlijnconforme interpretatie is een ander instrument dat de rechter verplicht moet toepassen.

Realistisch risico

Het primaire risico is civielrechtelijk. De herroepingstermijn verlengt naar 14 dagen plus 12 maanden als je de consument niet over het bestaan en de plaatsing van de knop hebt geinformeerd. Tijdens die verlengde periode kun je geen waardevermindering in rekening brengen. Bij een product van 500 euro dat na 6 maanden wordt teruggestuurd, betekent dat volledige terugbetaling zonder aftrek.

Bestuursrechtelijke handhaving is mogelijk via de ACM. Boetes kunnen oplopen tot 4% van de jaaromzet bij grootschalige EU-dimensie-overtredingen onder artikel 24 van de Richtlijn consumentenrechten. In de praktijk signaleren toezichthouders dat ze eerst op herstel inzetten. De kans op een boete voor een individuele webshop die de knop een maand te laat implementeert, is klein. De kans op een verlengde herroepingstermijn bij een geschil met een consument is reeel.

Wat de scanner detecteert

De TrustYourWebsite scanner draait ECOM-02 op je webshop en signaleert pagina's zonder herroepings- of retourtekst en zonder links naar een herroepings-, retour- of voorwaardenpagina in een EU-taal. De check kijkt naar bodytekst en linkankers met meertalige patronen (Nederlands, Engels, Duits Widerrufsrecht, Frans rétractation, Italiaans recesso, Spaans desistimiento).

Wat ECOM-02 niet controleert, en dus handmatige verificatie vraagt:

  • Het exacte knopopschrift ("hier de overeenkomst ontbinden" of een ondubbelzinnig alternatief), er staat een toekomstige scannercheck op de planning.
  • Het tweestappenproces (verklaring → "ontbinding bevestigen").
  • De duurzame-medium-bevestiging per e-mail.
  • De doorlopende beschikbaarheid van de knop gedurende de volledige 14-dagentermijn.
  • Aanwezigheid en volledigheid van het modelformulier voor herroeping.

Scannerbevindingen zijn technische signalen, geen juridische verdicts. De scanner passeren betekent niet dat de knop, het formulier en de bevestigingsmail end-to-end werken, dat blijft een handmatige check.

Implementatie: knop + formulier per platform

De richtlijn beschrijft het resultaat, niet de implementatie. De vijf voorbeelden hieronder vervullen allemaal dezelfde zes vereisten van artikel 11a. Kies degene die past bij je stack, vertaal de labels naar de taal van je webshop en test elke stap met een proeforder voordat de deadline van 19 juni 2026 verstrijkt.

Alle voorbeelden gebruiken het exacte knopopschrift "hier de overeenkomst ontbinden". Wijzig je dit, gebruik dan een ander ondubbelzinnig alternatief, "hier koop herroepen" en "bestelling annuleren" zijn toegestaan, "neem contact op" is dat niet.

Shopify (Liquid)

Voeg dit snippet toe aan customers/order.liquid zodat de knop op elke klant-orderdetailpagina verschijnt:

{%- comment -%}
  Herroepingsknop — Richtlijn (EU) 2023/2673 Art. 11a, van kracht 19 juni 2026.
  Wordt alleen getoond voor bestellingen binnen de 14-dagentermijn.
{%- endcomment -%}
{%- assign window_seconds = 1209600 -%}
{%- assign order_age = 'now' | date: '%s' | minus: order.created_at | date: '%s' -%}
{%- if order_age < window_seconds and order.cancelled_at == blank -%}
  <a href="{{ shop.url }}/pages/herroepen?order={{ order.name | url_encode }}&email={{ order.email | url_encode }}"
     class="btn btn-primary herroepingsknop">
    Hier de overeenkomst ontbinden
  </a>
{%- endif -%}

Op /pages/herroepen (een gewone paginatemplate) render je het tweestappenformulier:

{% form 'contact' %}
  <h1>Overeenkomst ontbinden</h1>
  <p>Stap 2 van 2. Bevestig om je herroepingsverklaring te versturen.</p>

  <input type="hidden" name="contact[subject]" value="Herroeping — Art. 11a CRD" />

  <label>Je naam
    <input type="text" name="contact[name]" required />
  </label>

  <label>Ordernummer of contractidentificatie
    <input type="text" name="contact[order_id]" value="{{ request.query_params.order }}" required />
  </label>

  <label>Bevestigingsmailadres
    <input type="email" name="contact[email]" value="{{ request.query_params.email }}" required />
  </label>

  <button type="submit" name="contact[herroeping]" value="bevestigd">
    Ontbinding bevestigen
  </button>
{% endform %}

Bevestigingsmail: maak in Shopify Flow een workflow met trigger "Contact us form submitted" en de conditie subject contains "Herroeping". De actie is "Send email to customer" met het in het formulier ingevulde e-mailadres. Deze Flow-actie voldoet aan het duurzame-medium-vereiste van artikel 11a lid 5.

WooCommerce (PHP / hook)

Voeg het volgende toe aan functions.php van je childtheme of aan een eigen pluginbestand. De handler rendert de knop op de klant-orderdetailpagina en verwerkt de herroeping via een nonce-beveiligde POST:

<?php
// Render de knop op elke klant-orderdetailpagina.
add_action( 'woocommerce_order_details_after_order_table', 'tyw_render_herroepingsknop', 10, 1 );
function tyw_render_herroepingsknop( $order ) {
    if ( ! is_a( $order, 'WC_Order' ) ) {
        return;
    }
    $age = time() - $order->get_date_created()->getTimestamp();
    if ( $age > 14 * DAY_IN_SECONDS || $order->has_status( array( 'cancelled', 'refunded' ) ) ) {
        return;
    }
    $nonce = wp_create_nonce( 'tyw_herroep_' . $order->get_id() );
    ?>
    <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="tyw-herroepingsform">
        <input type="hidden" name="action" value="tyw_submit_herroeping" />
        <input type="hidden" name="order_id" value="<?php echo esc_attr( $order->get_id() ); ?>" />
        <input type="hidden" name="_wpnonce" value="<?php echo esc_attr( $nonce ); ?>" />
        <button type="submit" class="button">Hier de overeenkomst ontbinden</button>
    </form>
    <?php
}

// Verwerk de POST. Voor een echte tweestap-UX render je eerst een
// bevestigingspagina voordat deze handler de bestelling annuleert.
add_action( 'admin_post_tyw_submit_herroeping', 'tyw_handle_herroeping' );
add_action( 'admin_post_nopriv_tyw_submit_herroeping', 'tyw_handle_herroeping' );
function tyw_handle_herroeping() {
    $order_id = isset( $_POST['order_id'] ) ? (int) $_POST['order_id'] : 0;
    if ( ! $order_id || ! wp_verify_nonce( $_POST['_wpnonce'], 'tyw_herroep_' . $order_id ) ) {
        wp_die( 'Ongeldig verzoek', 400 );
    }
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        wp_die( 'Bestelling niet gevonden', 404 );
    }
    $order->update_status( 'cancelled', 'Herroepen door consument onder Art. 11a Rcr.' );

    wp_mail(
        $order->get_billing_email(),
        sprintf( 'Herroeping ontvangen voor bestelling %s', $order->get_order_number() ),
        sprintf(
            "Je herroeping van bestelling %s is ontvangen op %s.\n\nDe terugbetaling wordt binnen 14 dagen verwerkt.\n\nDeze e-mail is de duurzame-medium-bevestiging zoals vereist door artikel 11a lid 5 van de Richtlijn consumentenrechten.",
            $order->get_order_number(),
            current_time( 'mysql' )
        )
    );

    wp_safe_redirect( add_query_arg( 'herroeping', 'bevestigd', $order->get_view_order_url() ) );
    exit;
}

Voor een echte tweestap-UX (eerst "verklaring indienen", dan "ontbinding bevestigen") render je een tussenliggende template die GET ?order_id= ontvangt en het bevestigingsformulier toont. Pas op de tweede POST wordt de bestelling daadwerkelijk geannuleerd.

Lightspeed eCom (template + Apps API)

Lightspeed eCom (Lightspeed Retail X-Series) heeft geen server-side templatinghook voor willekeurige formulierverwerking. De compliant aanpak:

  1. Themetemplate: pas templates/customer/account/orders.rain aan (Rain-templating) zodat de knop op de orderoverzichtspagina verschijnt:
{% for order in orders %}
  <div class="order-row">
    <a href="/account/orders/{{ order.number }}">Bestelling {{ order.number }}</a>
    {% if order.age_seconds < 1209600 and order.cancelled == false %}
      <a href="/pages/herroepen?order={{ order.number | url_encode }}"
         class="btn btn-primary">Hier de overeenkomst ontbinden</a>
    {% endif %}
  </div>
{% endfor %}
  1. Herroepingspagina: maak /pages/herroepen met het tweestappenformulier. Submission gaat naar een kleine backend in eigen beheer (Node, PHP of een Cloudflare Worker) die:

    • Een PUT-aanroep doet op de Lightspeed eCom API PUT /orders/{id}.json met {"order":{"status":"cancelled"}}.
    • Een bevestigingsmail stuurt via je transactionele provider (Postmark / SendGrid / Mailgun).
  2. Auth: de backend gebruikt een API-key uit het Lightspeed-merchantpaneel met read+write-rechten op orders. Deze key staat niet in de storefront.

Geen backend mogelijk? Dan is het alternatief een statische pagina met mailto:-link en een ondubbelzinnig herroepingsformulier-PDF. Trager dan een knop maar voldoet aan artikel 11a lid 1 zolang het formulier interactief invulbaar is. Verifieer met Lightspeed-accountmanagement of een no-code app uit de Lightspeed App Store de eis afdekt.

Magento (Adobe Commerce)

Magento vraagt om een klein eigen module. Globale opzet:

  1. Block + template, render de knop op de orderview-pagina via app/code/Acme/Herroeping/view/frontend/layout/sales_order_view.xml:
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <body>
    <referenceContainer name="sales.order.info.buttons">
      <block class="Acme\Herroeping\Block\Button"
             name="acme.herroeping.button"
             template="Acme_Herroeping::button.phtml" />
    </referenceContainer>
  </body>
</page>

app/code/Acme/Herroeping/view/frontend/templates/button.phtml:

<?php
/** @var \Acme\Herroeping\Block\Button $block */
$order = $block->getOrder();
if ( ! $block->isBinnenTermijn( $order ) ) {
    return;
}
$action = $block->getUrl( 'herroeping/cancel/submit', [ 'order_id' => $order->getId() ] );
$key    = $block->getFormKey();
?>
<form action="<?= $block->escapeUrl( $action ); ?>" method="post">
    <input type="hidden" name="form_key" value="<?= $block->escapeHtml( $key ); ?>" />
    <button type="submit" class="action primary">Hier de overeenkomst ontbinden</button>
</form>
  1. Controller, app/code/Acme/Herroeping/Controller/Cancel/Submit.php valideert de form key, roept $this->orderManagement->cancel( $orderId ) aan, en triggert een transactionele e-mail via TransportBuilder. Voeg een eigen template toe onder view/frontend/email/herroeping_bevestigd.html met bewoordingen die aansluiten op artikel 11a lid 5.

  2. Tweestap-UX, toon eerst een bevestigingspagina voordat de controller de bestelling annuleert. Een flash-sessiebericht per order voorkomt dat een refresh een dubbele submission veroorzaakt.

Custom / headless (HTML + serverless)

Voor een eigen frontend zonder e-commerceframework, twee bestanden:

<!-- order-detail.html: knop -->
<form method="get" action="/herroepen">
  <input type="hidden" name="order" value="BES-2026-001" />
  <button type="submit">Hier de overeenkomst ontbinden</button>
</form>
<!-- /herroepen.html: bevestigingsstap -->
<form method="post" action="/api/herroeping">
  <input type="hidden" name="order" value="BES-2026-001" />
  <label>Je naam <input type="text" name="name" required /></label>
  <label>Bevestigingsmail <input type="email" name="email" required /></label>
  <button type="submit">Ontbinding bevestigen</button>
</form>
// api/herroeping.js (Vercel / Cloudflare / Netlify function)
export default async function handler(req) {
  if (req.method !== 'POST') return new Response('Methode niet toegestaan', { status: 405 });

  const form  = await req.formData();
  const order = form.get('order');
  const email = form.get('email');
  const name  = form.get('name');

  // 1. Registreer de herroeping in je database (id, tijdstip, kanaal).
  await db.herroepingen.insert({ order, name, email, at: new Date() });

  // 2. Annuleer de bestelling in je commerce-backend.
  await commerce.orders.cancel(order, { reason: 'Art. 11a Rcr.' });

  // 3. Duurzame-medium-bevestiging — Postmark / SendGrid / Resend.
  await mailer.send({
    to: email,
    subject: `Herroeping ontvangen voor bestelling ${order}`,
    text: [
      `Je herroeping van bestelling ${order} is ontvangen op ${new Date().toISOString()}.`,
      `De terugbetaling wordt binnen 14 dagen verwerkt.`,
      `Deze e-mail is de duurzame-medium-bevestiging zoals vereist door artikel 11a lid 5 van de Richtlijn consumentenrechten.`,
    ].join('\n\n'),
  });

  return Response.redirect(`/bestellingen/${order}?herroeping=bevestigd`, 303);
}

De serverless-functie is het schoonste patroon: de drie verplichtingen, annuleren, registreren, bevestigen, staan expliciet en zijn afzonderlijk testbaar.

Praktische checklist

VereisteWettelijke basisActie
Herroepingsfunctie op online interfaceArt. 11a lid 1Knop toevoegen op besteloverzicht/klantaccount
Opschrift "hier de overeenkomst ontbinden"Art. 11a lid 2Exacte of ondubbelzinnige tekst gebruiken
Zichtbaar en doorlopend beschikbaarArt. 11a lid 3Knop tonen gedurende volledige 14-dagentermijn
Tweestappenproces met bevestigingArt. 11a lid 4Naam, contractnummer, bevestigingsknop
Ontvangstbevestiging op duurzaam mediumArt. 11a lid 5Automatische bevestigingsmail sturen
Modelformulier herroeping beschikbaarBijlage I(B)PDF of inline formulier met vereiste velden
14-dagentermijn vermeld in voorwaardenArt. 9-10Termijn, beginpunt en uitzonderingen opnemen
Retourkostenpolicy vermeldArt. 14 lid 1Wie betaalt de retourkosten?

De deadline is niet het punt

De deadline van 19 juni 2026 is een datum op een kalender. Het punt is dat consumenten een blijvende, ondubbelzinnige uitweg krijgen. Webshops die proberen het herroepingsrecht te begraven door het formulier te verstoppen of de knop weg te laten, zijn precies degenen waarop de toezichthouder zich het eerst zal richten. De 12-maanden verlenging zorgt ervoor dat uitstel de handelaar meer kost dan de consument.

Gerelateerde guides


De herroepingsknop is één verplichting. Je webshop moet ook je KVK-nummer en BTW-nummer zichtbaar vermelden, en het ODR-platform is inmiddels opgeheven. Controleer je volledige webshopverplichtingen via onze AVG-checklist.

Wil je weten of de scanner ECOM-02 op jouw webshop afgaat? Start een gratis scan op TrustYourWebsite.com.

Dit artikel is technische analyse, geen juridisch advies. Raadpleeg een jurist voor advies over jouw specifieke situatie.

Deel dit artikel