Bouton de rétractation obligatoire en Belgique dès juin 2026
Steven | TrustYourWebsite · 20 avril 2026 · Dernière mise à jour : mai 2026
Le 19 juin 2026, chaque e-commerce dans l'UE devra afficher un bouton de retractation clairement identifie sur la page de compte client ou de suivi de commande. Cette obligation provient de la Directive (UE) 2023/2673 du 22 novembre 2023, qui insere un nouvel article 11a dans la Directive relative aux droits des consommateurs 2011/83/UE. L'article 11a s'applique horizontalement a tous les contrats B2C en ligne avec un droit de retractation. La Belgique a rate le delai de transposition du 19 decembre 2025. Le libelle obligatoire du bouton en francais: "renoncer au contrat ici".
Ce que l'article 11a exige
Six exigences concretes. Le professionnel doit proposer une fonction de retractation sur son interface en ligne. Le bouton doit porter le libelle "renoncer au contrat ici" ou un equivalent non ambigu ("resilier ici le contrat"). Il doit etre visible et accessible en permanence pendant le delai de 14 jours.
Le processus se fait en deux etapes. Le consommateur clique sur le bouton, remplit une declaration (nom, identifiant du contrat, canal de confirmation) puis clique sur "confirmer la retractation". Le professionnel accuse reception par e-mail. La charge de la preuve de la ponctualite de la retractation incombe au professionnel.
Le droit de retractation: 14 jours
Le droit de retractation s'applique aux contrats a distance et aux contrats hors etablissement B2C. Le delai de 14 jours commence a la reception des biens ou a la conclusion du contrat pour les services.
Les exceptions figurent dans le CDE, articles VI.53. Produits sur mesure, produits d'hygiene descelles, supports audio/video descelles, denrees perissables et reservations a date fixe sont exclus.
La regle de prolongation de 12 mois constitue le risque principal. Si le consommateur n'a pas ete informe de l'existence et de l'emplacement du bouton, le delai passe a 14 jours plus 12 mois. Pendant cette periode, aucune depreciation ne peut etre deduite.
Contenu numerique sans support materiel
Selon l'art. VI.53, 13° CDE, le droit de retractation pour le contenu numerique sans support materiel s'eteint sous trois conditions cumulatives: (a) consentement prealable expres, (b) reconnaissance de la perte du droit de retractation et (c) confirmation par l'entreprise conformement a l'art. VI.46, par. 7.
Concretement, l'e-mail de confirmation post-achat (sur support durable) doit reprendre le texte de la renonciation. Une case a cocher au moment du paiement ne suffit donc pas si l'e-mail envoye ensuite ne confirme pas ce consentement et cette reconnaissance.
Transposition en Belgique
Les regles belges de retractation figurent dans le Code de droit economique (CDE) Livre VI, articles VI.45 et suivants (droit de retractation), VI.47 (14 jours + prolongation de 12 mois) et VI.49 plus Annexe 2 (formulaire type). Pour une explication complete du delai de 14 jours, des exceptions et des obligations de remboursement, voir notre guide sur le droit de retractation pour les e-commerces belges.
La Belgique a rate le delai du 19 decembre 2025. La transposition n'est pas finalisee en avril 2026. Le SPF Economie (Inspection economique) est l'autorite competente.
L'interpretation conforme oblige le juge a interpreter le droit national en conformite avec la directive, meme avant l'adoption de la loi de transposition.
Risque realiste
Le risque principal est civil: prolongation du delai de retractation a 14 jours plus 12 mois. Des sanctions administratives sont possibles via le SPF Economie, mais les autorites privilegient d'abord la mise en conformite.
Ce que le scanner detecte
Le scanner TrustYourWebsite execute ECOM-02 sur votre boutique et signale les pages qui ne contiennent ni texte de retractation/remboursement, ni lien vers une page de retractation/retour/conditions, dans aucune langue de l'UE. La verification examine le corps du texte et les ancres de liens via des motifs multilingues (francais retractation, neerlandais herroeping, anglais withdrawal, allemand Widerrufsrecht, italien recesso, espagnol desistimiento).
Le scanner execute egalement ECOM-02b (comparaison du libelle exact du bouton de l'article 11a avec la formulation imposee par la directive selon la langue de la page — severite HIGH sur les chemins client / commandes) et ECOM-02c (presence du formulaire type de retractation sous forme de telechargement ou de formulaire integre).
Ce que le scanner ne verifie toujours pas (controle manuel requis):
- Le processus en deux etapes (declaration → "confirmer la retractation") de bout en bout.
- L'accuse de reception sur support durable (e-mail).
- La disponibilite permanente du bouton pendant tout le delai de 14 jours.
Les resultats sont des signaux techniques, pas des verdicts juridiques. Passer les scanners ne dispense pas de tester le processus en deux etapes et la boucle de confirmation de bout en bout.
Implementation: bouton + formulaire par plateforme
La directive decrit le resultat, pas l'implementation. Les cinq exemples ci-dessous remplissent ensemble les six exigences de l'article 11a. Choisissez la stack qui correspond, traduisez les libelles a la langue de la boutique et testez chaque etape avec une commande de test avant le 19 juin 2026.
Tous les exemples utilisent le libelle exact "renoncer au contrat ici". Si vous le changez, prenez un autre equivalent non ambigu, "resilier le contrat ici" est acceptable, "contactez-nous" ne l'est pas.
Shopify (Liquid)
Snippet a placer dans customers/order.liquid pour que le bouton apparaisse sur chaque page de detail de commande client:
{%- comment -%}
Bouton de retractation — Directive (UE) 2023/2673 Art. 11a, en vigueur 19 juin 2026.
Le contexte belge releve du CDE Livre VI (voir au-dessus).
{%- 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/retractation?order={{ order.name | url_encode }}&email={{ order.email | url_encode }}"
class="btn btn-primary bouton-retractation">
Renoncer au contrat ici
</a>
{%- endif -%}
Sur /pages/retractation (template de page standard), le formulaire en deux etapes:
{% form 'contact' %}
<h1>Renoncer au contrat</h1>
<p>Etape 2 sur 2. Confirmez pour envoyer votre declaration de retractation.</p>
<input type="hidden" name="contact[subject]" value="Retractation — Art. 11a CRD / Art. VI.47 CDE" />
<label>Votre nom
<input type="text" name="contact[name]" required />
</label>
<label>Numero de commande ou identifiant du contrat
<input type="text" name="contact[order_id]" value="{{ request.query_params.order }}" required />
</label>
<label>E-mail de confirmation
<input type="email" name="contact[email]" value="{{ request.query_params.email }}" required />
</label>
<button type="submit" name="contact[retractation]" value="confirmee">
Confirmer la retractation
</button>
{% endform %}
Dans Shopify Flow, creez un workflow declenche par "Contact us form submitted" avec la condition subject contains "Retractation". L'action "Send email to customer" envoie l'accuse de reception a l'adresse renseignee dans le formulaire. Ce mail constitue la confirmation sur support durable exigee par l'article 11a paragraphe 5 et l'article VI.46 § 7 CDE.
WooCommerce (PHP / hook)
A ajouter dans functions.php du theme enfant ou dans un petit plugin:
<?php
add_action( 'woocommerce_order_details_after_order_table', 'tyw_render_bouton_retractation', 10, 1 );
function tyw_render_bouton_retractation( $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_retract_' . $order->get_id() );
?>
<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" class="tyw-retractation-form">
<input type="hidden" name="action" value="tyw_submit_retractation" />
<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">Renoncer au contrat ici</button>
</form>
<?php
}
add_action( 'admin_post_tyw_submit_retractation', 'tyw_handle_retractation' );
add_action( 'admin_post_nopriv_tyw_submit_retractation', 'tyw_handle_retractation' );
function tyw_handle_retractation() {
$order_id = isset( $_POST['order_id'] ) ? (int) $_POST['order_id'] : 0;
if ( ! $order_id || ! wp_verify_nonce( $_POST['_wpnonce'], 'tyw_retract_' . $order_id ) ) {
wp_die( 'Requete invalide', 400 );
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
wp_die( 'Commande introuvable', 404 );
}
$order->update_status( 'cancelled', 'Retractation par le consommateur — Art. 11a CRD / VI.47 CDE.' );
wp_mail(
$order->get_billing_email(),
sprintf( 'Retractation recue pour la commande %s', $order->get_order_number() ),
sprintf(
"Votre retractation de la commande %s a ete recue le %s.\n\nLe remboursement sera traite dans un delai de 14 jours.\n\nCet e-mail constitue la confirmation sur support durable exigee par l'article VI.46 § 7 CDE et l'article 11a paragraphe 5 de la Directive relative aux droits des consommateurs.",
$order->get_order_number(),
current_time( 'mysql' )
)
);
wp_safe_redirect( add_query_arg( 'retractation', 'confirmee', $order->get_view_order_url() ) );
exit;
}
Pour un vrai parcours en deux etapes, intercalez une page de confirmation avant l'execution de l'annulation.
Lightspeed eCom (template + Apps API)
Lightspeed eCom n'expose pas de hook serveur pour le traitement de formulaires. Demarche conforme:
- Template du theme: modifiez
templates/customer/account/orders.rain:
{% for order in orders %}
<div class="order-row">
<a href="/account/orders/{{ order.number }}">Commande {{ order.number }}</a>
{% if order.age_seconds < 1209600 and order.cancelled == false %}
<a href="/pages/retractation?order={{ order.number | url_encode }}"
class="btn btn-primary">Renoncer au contrat ici</a>
{% endif %}
</div>
{% endfor %}
-
Page de retractation:
/pages/retractationavec le formulaire en deux etapes. La soumission arrive sur un backend que vous controlez (Node, PHP, Cloudflare Worker) qui appellePUT /orders/{id}.jsonde l'API Lightspeed eCom avec{"order":{"status":"cancelled"}}, puis envoie l'accuse de reception via votre fournisseur transactionnel. -
Auth: cle API du panneau marchand Lightspeed, en lecture + ecriture sur les commandes, restreinte au backend.
Pas de backend disponible? Une page statique avec lien mailto: et un formulaire-type interactif (PDF editable) satisfait l'article 11a paragraphe 1, a condition que la confirmation sur support durable (votre e-mail sortant) suive.
Magento (Adobe Commerce)
Module dedie avec layout + block + controller. Layout app/code/Acme/Retractation/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\Retractation\Block\Button"
name="acme.retractation.button"
template="Acme_Retractation::button.phtml" />
</referenceContainer>
</body>
</page>
Template:
<?php
/** @var \Acme\Retractation\Block\Button $block */
$order = $block->getOrder();
if ( ! $block->dansDelai( $order ) ) {
return;
}
$action = $block->getUrl( 'retractation/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">Renoncer au contrat ici</button>
</form>
Le controller annule la commande et declenche un e-mail transactionnel via TransportBuilder avec un template personnalise qui mentionne l'article 11a paragraphe 5 / VI.46 § 7 CDE.
Custom / headless (HTML + serverless)
<!-- order-detail.html: bouton -->
<form method="get" action="/retractation">
<input type="hidden" name="order" value="CMD-2026-001" />
<button type="submit">Renoncer au contrat ici</button>
</form>
<!-- /retractation.html: etape de confirmation -->
<form method="post" action="/api/retractation">
<input type="hidden" name="order" value="CMD-2026-001" />
<label>Votre nom <input type="text" name="name" required /></label>
<label>E-mail de confirmation <input type="email" name="email" required /></label>
<button type="submit">Confirmer la retractation</button>
</form>
// api/retractation.js (Vercel / Cloudflare / Netlify function)
export default async function handler(req) {
if (req.method !== 'POST') return new Response('Methode non autorisee', { status: 405 });
const form = await req.formData();
const order = form.get('order');
const email = form.get('email');
const name = form.get('name');
await db.retractations.insert({ order, name, email, at: new Date() });
await commerce.orders.cancel(order, { reason: 'Art. 11a CRD / VI.47 CDE' });
await mailer.send({
to: email,
subject: `Retractation recue pour la commande ${order}`,
text: [
`Votre retractation de la commande ${order} a ete recue le ${new Date().toISOString()}.`,
`Le remboursement sera traite dans un delai de 14 jours.`,
`Cet e-mail constitue la confirmation sur support durable exigee par l'article VI.46 § 7 CDE et l'article 11a paragraphe 5 de la Directive relative aux droits des consommateurs.`,
].join('\n\n'),
});
return Response.redirect(`/commandes/${order}?retractation=confirmee`, 303);
}
La fonction serverless rend les trois obligations, annuler, enregistrer, confirmer, explicites et testables separement.
Checklist pratique
| Exigence | Base legale | Action |
|---|---|---|
| Fonction de retractation | Art. 11a / Art. VI.45 CDE | Ajouter le bouton |
| Libelle "renoncer au contrat ici" | Art. 11a al. 2 | Texte exact ou equivalent |
| Visible et accessible en permanence | Art. 11a al. 3 | Bouton visible pendant 14 jours |
| Processus en deux etapes | Art. 11a al. 4 | Declaration + confirmation |
| Accuse de reception par e-mail | Art. 11a al. 5 | E-mail automatique |
| Formulaire type disponible | Annexe 2 CDE | PDF ou formulaire en ligne |
| Delai de 14 jours mentionne | Art. VI.47 CDE | Delai et exceptions |
| Politique de retour mentionnee | Art. VI.50 CDE | Qui paie les frais de retour? |
Le consommateur obtient une sortie claire
La deadline du 19 juin 2026 est une date. Le point fondamental est que les consommateurs obtiennent une voie de sortie permanente et non ambigue. La prolongation de 12 mois fait en sorte que le report coute plus cher au professionnel qu'au consommateur.
Guides associes
- Herroepingsknop voor Belgische webshops (NL), page jumelle neerlandophone avec les memes exemples de code.
- Withdrawal button for Irish webshops (EN), version anglophone de reference.
- Widerrufsbutton im Onlineshop (DE), version allemande, demarcation avec le bouton § 312k BGB Kündigung.
- Widerrufsbutton pour webshops autrichiens (AT), version autrichienne sous le regime FAGG.
- Numero d'entreprise sur votre site belge, obligation CDE adjacente a verifier en meme temps.
Lancez un scan TrustYourWebsite gratuit pour voir si ECOM-02 declenche sur votre boutique aujourd'hui.
Cet article est une analyse technique, pas un avis juridique. Consultez un juriste pour un avis adapte a votre situation.
Vérifiez votre site web maintenant
Analysez votre site web pour les problèmes de E-commerce et plus de 30 autres vérifications.
Lancer le check gratuitGuides pour votre site web
Déclaration de confidentialité Belgique : RGPD et APD
Declaration de confidentialite site web Belgique: les 14 mentions obligatoires de l'article 13 RGPD, Recommandation APD 01/2025 et checklist PME 2026.
Mentions légales site web Belgique : obligations CDE
Les mentions legales obligatoires pour les sites belges. CDE Livre XII Art. XII.6, numero BCE, obligation bilingue et controle SPF Economie.
Bandeaux cookies: dark patterns interdits en Belgique 2026
Les 12 dark patterns de bandeaux cookies selon la taxonomie CEPD. Decision APD Mediahuis, amende Google EUR 325M CNIL et ce que le scanner detecte apres refus.