Documentazione
WWU Withdrawal Button mette WooCommerce, FluentCart ed Easy Digital Downloads a norma con il pulsante di recesso online 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), guida passo-passo 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 | Cosa fa |
|---|---|
| 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 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; + il merge-tag
{{wwu.recesso_url}}per le email native FluentCart. - Easy Digital Downloads — pulsante sulla ricevuta d'acquisto e nelle righe della cronologia acquisti; + link 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 per contratto, 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 fail-safe: se lo stato non è determinabile, il pulsante resta visibile (mai nascosto per errore).
In Impostazioni → Subscriptions ci sono due interruttori, entrambi disattivi per default:
| Impostazione | Cosa fa |
|---|---|
| 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 rinnovi (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'API REST di sola lettura (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 cliente non viene mai esposto nell'API o nel webhook, e non esiste un endpoint per creare un recesso via API: il recesso resta un atto espresso dal consumatore.
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. FluentCart non permette ai plugin di aggiungere contenuto alle sue email in automatico: perciò Impostazioni → FluentCart mostra ora una breve guida opzionale 1-volta per inserire il merge-tag
nel template della ricevuta.
- 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). Include un'API REST di sola lettura (
wwu-wb/v1) autenticata con Password applicazione di WordPress e un webhook opzionale che invia un payload JSON firmato HMAC-SHA256 quando un recesso viene confermato. Privacy-first: niente IP cliente nel payload/API, secret mascherati in admin, test webhook incluso. Il plugin non consente di creare recessi via API.
- 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 per contratto, 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.