Dokumentation
WWU Withdrawal Button mette WooCommerce, FluentCart ed Easy Digital Downloads a norma con il Online-Widerrufsschaltfläche richiesto dalla Direttiva UE 2023/2673 (art. 54-bis Codice del Consumo). Pulsante statutario, modulo in due passaggi, ricevuta su supporto durevole, log immodificabile e marca temporale. Gratuito e open source (GPLv3).
Come funziona (in pratica)
Per il cliente è semplicissimo — quattro passaggi:
- Clic sul pulsante. Il cliente apre il suo ordine e clicca «Recedere dal contratto qui» — dall'area account, dal link nell'email d'ordine, oppure dalla pagina pubblica (senza account: cerca l'ordine con numero + email). La dicitura è quella esatta prevista dalla legge per ogni lingua.
- Modulo in due passaggi. Rivede da cosa sta recedendo (può spuntare solo alcuni prodotti — recesso parziale), poi conferma. Nessun motivo obbligatorio, nessun dark pattern.
- Ricevuta su supporto durevole. Appena conferma, riceve email + PDF + link permanente verificabile con cosa ha recesso e data/ora esatte. L'ordine passa a «recesso richiesto» e tu ricevi una notifica.
- Prova immodificabile. Ogni passaggio finisce in un log append-only con hash-chain e marca temporale (data certa). Tu poi gestisci il rimborso come sempre — registrato anch'esso come prova del rispetto dei 14 giorni.
Tutto il resto del plugin serve a rendere questo flusso corretto, facile da gestire e difendibile. In sintesi, cosa include (ogni voce ha la sua sezione qui sotto):
- Per il cliente: pulsante statutario multilingua ovunque serva (account, email, pagina pubblica con lookup ospiti, shortcode, blocco), Schritt-für-Schritt-Anleitung su tempi e rimborso, nota «perché esente» quando il pulsante è giustamente assente, certificato di verifica leggibile della ricevuta, recesso parziale per prodotto.
- Per te (commerciante): cruscotto di onboarding con checklist a un clic e test di consegna email, gestione richieste (stati lavorata/rimborsata, badge integrità della catena, reinvio ricevuta, rimborso registrato), pagina Conformità con countdown, etichette in uso e clausole pronte, ricevuta come vera email WooCommerce con anteprima, campo CSS personalizzato.
- Gestione legale intelligente: abbonamenti (un solo diritto per contratto, pulsante sull'ordine iniziale), esenzioni Art. 59 con cattura del consenso al checkout e conferma su supporto durevole, ambito di applicabilità per Paese (UE/SEE o sempre), gestione B2B.
- Prova, marche temporali & integrità: log immodificabile con hash-chain + ancoraggio gratuito OpenTimestamps (Bitcoin) o eIDAS RFC 3161 qualificato (Sectigo gratis o QTSP nazionali), retry automatico delle marche, rimborso loggato.
- Privacy & GDPR: IP anonimizzato nell'hash, IP completo cancellabile dopo una retention configurabile (default 10 anni), registro consensi esportabile in CSV, due clausole privacy pronte (legittimo interesse).
- Documenti & conformità: generatore del modulo tipo Allegato I-B e delle clausole per precontrattuale / Condizioni / Privacy da incollare — con il promemoria che installare il pulsante non basta, vanno aggiornati anche i tuoi T&C.
- Automazioni & sviluppatori: API REST di sola lettura + webhook firmato (HMAC) + 33 hook documentati per Zapier/Make/n8n/CRM/helpdesk, privacy-first (l'IP del cliente non è mai esposto).
- Piattaforme & compatibilità: WooCommerce (HPOS + legacy), FluentCart ed Easy Digital Downloads con un solo plugin; compatibile con Complianz, TranslatePress e i cache plugin (WP Rocket / LiteSpeed / W3TC).
Requisiti
| WordPress | 5.6+ (consigliato 6.x) |
|---|---|
| PHP | 7.4+ |
| E-commerce | WooCommerce (HPOS + Legacy), FluentCart oppure Easy Digital Downloads (3.0+) |
| Un plugin SMTP (es. FluentSMTP) per consegnare le ricevute |
Installazione
- Scarica
wwu-withdrawal-button.zip(il pacchetto ufficiale include la libreria PDF). - In WordPress: Plugin → Aggiungi nuovo → Carica plugin → seleziona lo ZIP → Installa ora (se esiste già scegli «Sostituisci l'attuale con il caricato»).
- Attiva. Il plugin crea da solo la pagina pubblica «Diritto di recesso» e le tabelle del log.
Configurazione
Vai su Withdrawal Button → Settings e procedi dall'alto verso il basso. Il Dashboard ha una checklist che diventa tutta verde quando sei a posto.
- Abilita la funzione di recesso.
- Dove si applica — «Solo UE/SEE» (minimo legale) o «Mostra sempre»; opzionale esclusione B2B (P.IVA).
- Consumer guidance — finestra di recesso in giorni (min 14; puoi concederne di più) e, se vuoi, un testo guida personalizzato.
- Receipt & evidence — allega PDF, email di notifica, marca temporale (OpenTimestamps gratis, o RFC 3161), retention, slug della scheda account.
- Email delivery — configura l'SMTP, fai il test, poi «Preview the acknowledgement email».
Tutte le impostazioni
| Impostazione | Was macht er? |
|---|---|
| Enable withdrawal function | Mostra il pulsante ai consumatori idonei. |
| Applicability mode | Solo UE/SEE · Sempre · Lista paesi custom. + toggle B2B. |
| Withdrawal period (days) | Finestra mostrata al cliente. Minimo 14, estendibile. |
| Custom guidance text | Sostituisce il testo guida predefinito (HTML base). Responsabilità del merchant. |
| Attach PDF receipt | Allega una copia PDF alla ricevuta (l'email è comunque il supporto durevole). |
| Notification email | Dove ricevere l'avviso delle nuove richieste. |
| Trusted timestamp | OpenTimestamps · RFC 3161 (endpoint + credenziali) · Nessuna. |
| Evidence retention (years) | Per quanto conservare il log (default 10). |
| My Account tab slug | Slug della scheda «Diritto di recesso» nell'area cliente. |
| Custom CSS | Personalizza ogni elemento grafico (riferimento classi/variabili incluso). |
| FluentCart | Auto (default) · Sempre · Off. In modalità Auto il plugin mostra il pulsante ma si fa da parte automaticamente se rileva un add-on di recesso nativo di FluentCart, così il cliente non vede mai due pulsanti. Riguarda solo le superfici consumer FluentCart; il cruscotto richieste e il log non sono modificati. |
Aggiorna i tuoi documenti legali (obbligatorio)
Installare il pulsante non basta per essere a norma. La Direttiva sui diritti dei consumatori (art. 6) impone di informare il consumatore su come esercita il recesso: con l'introduzione del pulsante, le tue Condizioni di vendita e le informazioni precontrattuali vanno aggiornate nell'articolo sul recesso per prevedere la nuova modalità con pulsante. Il plugin aggiunge il pulsante, ma non modifica i tuoi documenti pubblicati.
Per renderlo semplice, il plugin genera le clausole pronte da incollare — le trovi in Withdrawal Button → Conformità (e via shortcode [wwu_wb_info type="precontractual|terms|privacy"]):
- Informazioni precontrattuali — la clausola «Diritto di recesso» che cita esplicitamente il pulsante «Recedere dal contratto qui», oltre al modulo tipo (Allegato I-B) che resta obbligatorio.
- Condizioni di vendita — la clausola «Modalità di recesso»: il consumatore recede tramite il pulsante online o il modulo tipo, con avviso di ricevimento su supporto durevole e divieto di rendere il recesso più difficile dell'acquisto.
- Privacy — le clausole sul registro dei recessi e sulla prova del consenso alle esenzioni.
Dove appare il pulsante
- WooCommerce — area cliente: lista ordini, dettaglio ordine, scheda «Diritto di recesso»; + link aggiunto automaticamente dentro le email d'ordine WooCommerce (per gli ospiti).
- FluentCart — portale cliente: pagina «Diritto di recesso», voce nel menu, banner e pulsante nel singolo ordine. Per le email: FluentCart non consente ai plugin di aggiungere contenuto in automatico, quindi Impostazioni → FluentCart mostra una guida opzionale 1-volta per inserire il merge-tag
{{wwu.recesso_url}}nel template della ricevuta (3 passi). - Easy Digital Downloads — pulsante sulla ricevuta d'acquisto e nelle righe della cronologia acquisti; + link aggiunto automaticamente nell'email di ricevuta EDD.
- Su ogni piattaforma: pagina pubblica con lookup ospiti (numero ordine + email), e ovunque con gli shortcode o il blocco Gutenberg.
Shortcode & blocco
| Shortcode | Uso |
|---|---|
[wwu_wb_form] | Il modulo in due passaggi / selettore ordini. |
[wwu_wb_button order_id="…"] | Il solo pulsante per un ordine. |
[wwu_wb_status order_id="…"] | Lo stato della richiesta di un ordine. |
[wwu_wb_model_form lang="…"] | Il modulo tipo Allegato I-B. |
[wwu_wb_info type="precontractual|terms|privacy"] | Le clausole legali pronte. |
Blocco editor: «Withdrawal — self-service» (dynamic, server-rendered) per inserire la superficie ovunque nell'editor a blocchi.
Esperienza cliente
- Il cliente apre il suo ordine e clicca il pulsante statutario. Nel primo passaggio del modulo compare una checklist opzionale degli articoli dell'ordine: può selezionare solo i prodotti da restituire (recesso parziale, consentito dalla legge UE — Allegato I-B: «dei seguenti beni»). Se lascia la selezione vuota, il recesso riguarda l'intero ordine. Il recesso non è mai bloccato da questa scelta.
- Modulo in due passaggi (revisione → conferma), nessun dark pattern, nessun motivo richiesto.
- Alla conferma riceve subito un'attestazione di ricevimento via email (+ PDF + link verificabile), con l'elenco degli articoli selezionati; l'ordine passa a «recesso richiesto».
Gestione richieste
In Withdrawal Button → Requests: ogni richiesta con stato (Aperta / Lavorata / Rimborsata), badge integrità della catena, e azioni:
- Mark processed — segna come gestita (registrata nel log).
- Resend email — reinvia la ricevuta (utile dopo aver configurato l'SMTP).
- Refund order — apre la schermata rimborso WooCommerce. Il rimborso viene registrato nel log come prova del rispetto dei 14 giorni.
Marche temporali
Scegli in Receipt & evidence → Trusted timestamp:
| Provider | Note |
|---|---|
| OpenTimestamps | Gratis, ancorato a Bitcoin, nessun account (default). |
Sectigo /qualified | RFC 3161 eIDAS-qualificato, gratis, senza account. |
| QTSP nazionali | Aruba/InfoCert (IT), D-Trust (DE), Universign (FR), FNMT (ES), SwissSign (CH) — endpoint + credenziali. |
Esenzioni (Art. 59)
Alcuni prodotti/servizi non hanno diritto di recesso (beni su misura, deperibili, sigillati aperti, biglietti per eventi a data fissa, contenuti digitali ad accesso immediato con consenso, servizi già eseguiti…). In Impostazioni → Esenzioni tagghi prodotti/categorie per motivo statutario specifico, ciascuno con riferimento di legge e spiegazione in linguaggio semplice. Il diritto di recesso resta il default (prodotti digitali inclusi).
Quando un ordine è interamente esente, il pulsante di recesso non compare — ma il cliente non resta senza spiegazioni. Dalla 1.0.0-alpha.43, una nota breve e accurata riporta l'eccezione specifica applicata con il relativo riferimento normativo (es. «Contenuto digitale ad accesso immediato — Art. 16(1)(m) CRD / Art. 59(1)(o) Cod. Consumo»). La nota è mostrata sul modulo di recesso, nelle pagine account WooCommerce ed EDD e nel portale FluentCart. Il testo è editabile in Impostazioni → Guida al consumatore. Compare solo sugli ordini realmente esenti, mai su quelli ordinari; la visibilità del pulsante non cambia.
wwu_wb_consent_text. La cattura del consenso è ora attiva su WooCommerce (classico + a blocchi), FluentCart ed Easy Digital Downloads, con esenzioni anche per categoria. Dove la cattura non è disponibile il pulsante resta (fail-safe). Non nascondere mai il pulsante senza queste condizioni.Abbonamenti
La legge UE dà un solo diritto di recesso di 14 giorni vertraglich, che parte dalla conclusione del contratto (art. 9 Dir. 2011/83/UE = art. 52 Codice del Consumo). Un rinnovo non lo fa ripartire: è la continuazione dello stesso contratto, non un nuovo contratto a distanza. Quindi:
- Il pulsante compare solo sull'ordine iniziale dell'abbonamento (entro la sua finestra di 14 giorni).
- Sugli ordini di rinnovo il pulsante è nascosto — un unico controllo copre automaticamente tutte le superfici (area cliente, portale, email, shortcode, blocco).
- Funziona con WooCommerce Subscriptions, gli abbonamenti FluentCart e EDD Recurring. Il rilevamento del rinnovo è prudente e ausfallsicher: se lo stato non è determinabile, il pulsante bleibt sichtbar (mai nascosto per errore).
In Impostazioni → Subscriptions ci sono due interruttori, entrambi disattivi per default:
| Impostazione | Was macht er? |
|---|---|
| Mostra anche sui rinnovi | Off consigliato. Attivalo solo se un parere legale dice che uno specifico rinnovo fa ripartire il diritto. |
| Annulla l'abbonamento al recesso | Off. Se attivo, alla conferma del recesso ferma i rinnovi futuri. Il rimborso e l'eventuale pro-rata per il servizio già usato restano sempre manuali. |
FAQ
Basta installare il pulsante per essere a norma? No. Devi aggiornare anche le tue Condizioni di vendita e le informazioni precontrattuali nell'articolo sul recesso, per prevedere la nuova modalità con pulsante (art. 6 della Direttiva diritti dei consumatori). Il plugin genera le clausole pronte da incollare — vedi Aggiorna i tuoi documenti legali.
Posso dare più di 14 giorni? Sì — imposta «Withdrawal period» a piacere (≥14). Il testo mostrato si aggiorna.
Come funziona con gli abbonamenti? Il pulsante compare sull'ordine iniziale e sparisce sui Verlängerungen (un solo diritto di 14 giorni per contratto). Il recesso non è la disdetta: il cliente può sempre fermare i rinnovi futuri dal suo account, ma il recesso è il diritto di 14 giorni con rimborso. Vedi la sezione Abbonamenti.
L'email non parte? Configura un plugin SMTP e usa «Send test email». Non è la libreria PDF.
Funziona con i temi a blocchi / FSE? Sì: la pagina My Account di WooCommerce è ancora resa dallo shortcode classico, gli hook funzionano; c'è anche un blocco Gutenberg.
La legge si applica ai prodotti digitali (plugin, software, download)? Sì. L'obbligo del pulsante riguarda il professionista che vende online a consumatori UE, non il singolo prodotto — anche uno shop di plugin o di contenuti digitali è in scope. I prodotti digitali hanno i 14 giorni di recesso per default; il diritto si toglie solo con consenso espresso + presa d'atto + conferma su supporto durevole (art. 59 lett. o), che il plugin cattura al checkout. Le vendite B2B (con partita IVA) e ai consumatori extra-UE sono fuori scope.
È consulenza legale? No, è uno strumento tecnico di supporto alla conformità. Fai revisionare i tuoi documenti da un legale.
Per sviluppatori
Il plugin espone 33 hook pubblici documentati (action e filter) per personalizzare il flusso di recesso, i testi, la logica di visibilità del pulsante, la ricevuta e il log — senza modificare il core del plugin.
API REST & webhook (automazioni)
Dalla 1.0.0-alpha.44 il plugin offre un'REST-API (nur Lesezugriff) (namespace wwu-wb/v1, autenticazione con Password applicazione di WordPress) per elencare le richieste di recesso e verificare lo stato di un ordine, più un webhook in uscita firmato (HMAC-SHA256) che notifica il tuo endpoint nel momento in cui un recesso viene confermato — pronto per Zapier, Make, n8n, un CRM o un helpdesk. Privacy-first: l'IP del consumatore non viene mai esposto (solo un hash di riga per la verifica d'integrità). Non esiste — per scelta — un endpoint per erstellen un recesso (è la dichiarazione legale del consumatore). Superata una verifica di sicurezza dedicata prima del rilascio.
Changelog
Mantieni questa sezione allineata al docs/changelog/wwu-wb-CHANGELOG.md del repository.
- Promemoria: aggiorna anche i tuoi documenti legali. Installare il pulsante non aggiorna i documenti del tuo shop. La legge (art. 6 della Direttiva sui diritti dei consumatori) impone che le Condizioni di vendita e le informazioni precontrattuali descrivano come il consumatore recede — e ora questo include il nuovo pulsante online. Il plugin lo segnala ora con evidenza nel Cruscotto e nella pagina Conformità, apre per default le due clausole da incollare (precontrattuale + condizioni) e la clausola «Modalità di recesso» nomina ora esplicitamente il pulsante. Nessun cambiamento al flusso di recesso. Vedi Aggiorna i tuoi documenti legali.
- Link di recesso nelle email d'ordine — su tutte le piattaforme. Il link viene aggiunto automaticamente alle email cliente di WooCommerce e alla ricevuta email di Easy Digital Downloads (così il cliente raggiunge il recesso direttamente dall'email, come suggerisce il Considerando 37). FluentCart non permette ai plugin di aggiungere contenuto alle sue email in automatico: perciò Impostazioni → FluentCart mostra ora una breve guida opzionale (3 passi) per inserire lo shortcode
{{wwu.recesso_url}}nel template della ricevuta. Niente di invasivo e niente di obbligatorio: il recesso è sempre raggiungibile da area cliente/portale e pagina pubblica. Note di rilascio →
- Automazioni: API REST di sola lettura + webhook firmato. Nuova sezione Impostazioni → Integrazioni per collegare le richieste di recesso a sistemi esterni (Zapier, Make, n8n, CRM, helpdesk). (1) Un'REST-API (nur Lesezugriff) (
wwu-wb/v1) per elencare le richieste e verificare lo stato di un ordine, autenticata con una Password applicazione di WordPress. (2) Un webhook opzionale che invia una notifica firmata HMAC-SHA256 al tuo endpoint quando un recesso viene confermato. Privacy-first: l'IP del consumatore non è mai esposto (solo un hash di verifica). Nessun endpoint per erstellen un recesso, per scelta legale. Superata una verifica di sicurezza dedicata. Nessun cambiamento al flusso di recesso. Note di rilascio →
- Nota «perché esente» lato consumatore. Quando tutti gli articoli di un ordine rientrano in un'eccezione Art. 59 (es. contenuto digitale ad accesso immediato o servizio interamente eseguito, entrambi con consenso raccolto al checkout), il pulsante di recesso è assente. Il cliente vede ora una nota breve e accurata che riporta l'eccezione specifica con il riferimento normativo (es. «Contenuto digitale ad accesso immediato — Art. 16(1)(m) CRD / Art. 59(1)(o) Cod. Consumo»). Mostrata sul modulo di recesso, nelle pagine account WooCommerce ed EDD e nel portale FluentCart. Testo editabile in Impostazioni → Guida al consumatore. Compare solo sugli ordini realmente esenti — mai su quelli ordinari; la visibilità del pulsante non cambia. Note di rilascio →
- Recesso parziale per prodotto (consumer-facing). La legge UE consente di recedere anche da parte degli articoli di un ordine (Allegato I-B: «dei seguenti beni»). Il primo passaggio del modulo mostra ora una checklist opzionale: il consumatore seleziona i prodotti da restituire; lasciando vuoto, recede dall'intero ordine. La selezione appare sulla ricevuta su supporto durevole e nel cruscotto Richieste. Rimborso (totale o parziale) sempre manuale. Il recesso non è mai bloccato. Note di rilascio →
- Gestione FluentCart configurabile. Nuova impostazione Impostazioni → FluentCart con tre modalità: Auto (default) — mostra il pulsante ma cede automaticamente se rileva l'add-on di recesso nativo di FluentCart, così il cliente non vede mai due pulsanti; Sempre — mantiene sempre il nostro pulsante; Off — disabilita la gestione FluentCart. Riguarda solo le superfici consumer; admin e richieste esistenti non sono modificati. Note di rilascio →
- Abbonamenti gestiti correttamente (WooCommerce Subscriptions, FluentCart, EDD Recurring). La legge UE dà un solo diritto di recesso di 14 giorni vertraglich, alla conclusione: un rinnovo non lo fa ripartire. Il pulsante compare ora solo sull'ordine iniziale ed è nascosto sugli ordini di rinnovo (un unico controllo copre tutte le superfici). Due interruttori opt-in in Impostazioni → Subscriptions (mostra anche sui rinnovi · annulla l'abbonamento al recesso), entrambi off di default — rimborso e pro-rata restano manuali. Il cruscotto richieste segnala gli ordini di abbonamento con un promemoria. Rilevamento del rinnovo prudente e fail-safe (se incerto, il pulsante resta). Da testare con un plugin abbonamenti attivo. Vedi Abbonamenti.
- Merge-tag email FluentCart
{{wwu.recesso_url}}. Inserisci il link di recesso del singolo ordine dentro le email transazionali native di FluentCart (es. ricevuta d'ordine). Il team FluentCart ha confermato il contratto dell'hook; il tag è registrato nel selettore dell'editor email e si risolve in sicurezza (vuoto se nel contesto non c'è un ordine). Da testare su FluentCart reale. Nota: FluentCart ha annunciato una funzione di recesso UE nativa in arrivo.
- Audit di sicurezza completo dell'intero plugin — 0 critical, 0 high. SQLi, XSS, CSRF, controllo accessi/IDOR, file/deserializzazione, crittografia/integrità delle prove e dipendenza Dompdf tutti puliti. Fix: guard SSRF sull'endpoint RFC 3161 configurabile (blocca target interni / cloud-metadata / IPv6-loopback / CGNAT), rate-limit sugli endpoint di recesso, cap di lunghezza sugli input, mascheramento debug più stretto, pulizia cron alla disinstallazione. Nessun cambiamento per il cliente.
- EDD: il pulsante di recesso compare ora sulle pagine del cliente. Su Easy Digital Downloads il pulsante appare sulla ricevuta d'acquisto e in ogni riga della cronologia acquisti, e il link è aggiunto all'email di ricevuta EDD — parità piena con WooCommerce e FluentCart (prima EDD usava solo la pagina pubblica). Costruito su hook EDD 3.x verificati sulla sorgente ufficiale. Da testare su store EDD reale.
- Miglioramenti FluentCart verificati col team. La casella di consenso compare ora su
before_payment_methods(copre checkout standard, modale e a blocchi); le esenzioni FluentCart sono per categoria (tassonomiaproduct-categories, come WooCommerce ed EDD); le note di recesso/rimborso compaiono nella timeline attività dell'ordine FluentCart.
- Easy Digital Downloads (EDD 3.0+) supportato. Terza piattaforma dopo WooCommerce e FluentCart: pulsante di recesso, flusso prova ed esenzioni con cattura del consenso funzionano sugli store EDD, con esenzioni per categoria (download_category). Da testare su uno store EDD reale.
- Cattura del consenso anche sul Checkout a blocchi di WooCommerce (via la Additional Checkout Fields API ufficiale, WooCommerce 9.9+), parità con il checkout classico e con FluentCart. PHP puro, nessun build. + SPEC per la futura integrazione EDD.
- Impostazioni esenzioni ridisegnate (WWU UI Kit): motivi raggruppati (condizionati / incondizionati / sigillo) con tooltip, esempi, helper «Cosa vendi?», anteprima di cosa vede il cliente (casella + email) e pannello di stato. Completate le traduzioni IT/FR/ES/DE, incluse le etichette delle esenzioni che prima comparivano in inglese.
- Cattura del consenso su FluentCart. Le esenzioni condizionate (digitale immediato / servizio eseguito) ora raccolgono il consenso anche al checkout FluentCart, con email di conferma su supporto durevole — costruito su hook verificati sui doc ufficiali. Link «apri ordine» admin via l'URL nativo FluentCart.
- Esenzioni (Art. 59) — conferma su supporto durevole + prova, conservazione, GDPR. Per i casi condizionati il plugin invia ora al cliente un'email di conferma su supporto durevole che riproduce il testo del consenso accettato (costitutiva per il digitale, art. 59(1)(o)) e ne registra l'invio separatamente. I consensi conservati hanno una retention configurabile (default 10 anni) con una routine giornaliera che poi anonimizza l'IP; l'IP è configurabile e non finisce mai nel log immodificabile. Aggiunte una clausola privacy GDPR pronta (legittimo interesse) e una pagina "Consent records" con export CSV. Copy più chiara ovunque: i prodotti fisici non richiedono mai il consenso; il pulsante si nasconde solo dopo la cattura (fail-safe).
- Esenzioni (Art. 59) — cattura del consenso al checkout. Per i due casi condizionati (contenuto digitale ad accesso immediato; servizio già eseguito), il checkout WooCommerce mostra una casella di presa d'atto obbligatoria e salva il testo accettato (con hash SHA-256, data/ora e IP) sull'ordine come prova: il pulsante viene nascosto per quegli articoli solo dopo il consenso legittimo. Testo personalizzabile via
wwu_wb_consent_text. Checkout classico WooCommerce; checkout a blocchi e FluentCart in arrivo.
- Esenzioni (Art. 59) — tagging per motivo. Marca prodotti o categorie come esenti per uno specifico motivo statutario (su misura, deperibile, sigillato igienico, servizi a data fissa, digitale immediato, servizio eseguito…), ciascuno con riferimento di legge e guida in linguaggio semplice. Il diritto di recesso resta il default — inclusi i prodotti digitali — e i motivi condizionati mantengono il pulsante finché non viene catturato il consenso.
- Portale cliente FluentCart funzionante: pagina «Diritto di recesso» nell'account, voce nel menu laterale, pulsante nel singolo ordine e banner. Ogni hook è stato corretto sul contratto ufficiale FluentCart (verificato su dev.fluentcart.com) e la lista ordini legge i dati tramite le relazioni corrette (cliente, indirizzo). Risolve la pagina bianca e il pulsante mancante visti nei test dal vivo.
- Prima integrazione del portale cliente FluentCart + lista ordini idonei valida sia per WooCommerce che per FluentCart.
- Guida al consumatore (passo-passo, ovunque) + riferimento provider di marca temporale nei settings.
- Provider marca temporale RFC 3161 / eIDAS (Sectigo gratis qualificato + QTSP nazionali).
- Rimborso registrato nel log come prova; guida «cosa fare dopo una richiesta».
- Workflow di gestione richieste (stato, mark processed, resend, refund) + fix CSS lista.
- Lista ordini idonei, pagina di verifica leggibile, anteprima email, blocco Gutenberg.
- Cruscotto onboarding, integrazione email WooCommerce, diagnostica consegna email, fix bug rendering.
- MVP: pulsante statutario, modulo due-passaggi, ricevuta durevole, log immodificabile + OpenTimestamps, applicabilità per paese, multilingua IT/EN/DE/FR/ES, documenti legali, CSS personalizzabile.