marketing

Lead capture multi-step

Form lead in più step con progress bar, validazione per step, salvataggio parziale lato server e ripresa via link/cookie. Conversion rate superiore al form monolitico.

Cosa fa questo modulo

Modulo «Lead capture multi-step»: form di acquisizione lead suddiviso in 2–8 step logici (es. 1.problema 2.budget 3.tempistica 4.contatti) con **progress bar** percentuale, **validazione per step** prima di avanzare, **salvataggio parziale server-side** ad ogni transizione step (no «chiudo browser e perdo tutto»), **ripresa sessione** via link magico in mail o cookie tracking, ottimizzato per **conversion rate** superiore al classico form monolitico unico (best practice form design: form lunghi convertono 2-3x meglio se spezzati in step brevi con micro-commitment progressivo — effetto «sunk cost» psicologico che incentiva completamento). Differenza chiave da #8104 form-contatti-lead (form semplice singola pagina): qui flusso multi-step con persistenza intermedia, branching condizionale (rispondi A → step diverso da rispondi B), micro-animazioni transizione, capacità di ripresa async, ottimizzato per qualificazione lead complessa (preventivi articolati, lead B2B con discovery, onboarding self-serve). Modello dati: tabella `lead_forms` (id, slug univoco per URL `/forms/{slug}`, nome interno, titolo pubblico, descrizione introduttiva, schema_steps JSON definizione completa step+campi (versionabile per A/B test), submit_redirect_url post-completamento, integrations JSON destinazioni (mail admin, webhook Slack/Teams/Make/Zapier/n8n, CRM HubSpot/Pipedrive/Salesforce, mailing list Mailchimp/Brevo), branding (colore primario, logo_url, font, testi CTA personalizzati), attiva_bool, expires_at nullable per form temporanei campagna, lead_count_cache per stats, conversion_rate_cache, created_at/updated_at), tabella `lead_submissions` (id, lead_form_id FK, session_token uuid univoco per ripresa cross-device, current_step int 1..N, status enum `in_progress`/`completed`/`abandoned`/`expired`, dati_step_1 JSON, dati_step_2 JSON, …, dati_step_N JSON oppure unico `dati_steps` JSON keyed by step, completed_at nullable, abandoned_at nullable da cron se inattivo, last_activity_at per timeout, source_url referrer, utm_source/medium/campaign/term/content per attribuzione, ip_address+user_agent (GDPR: hash o purge dopo X gg), device_type (mobile/tablet/desktop), email_for_recovery nullable (raccolta al primo step contatti per consentire recovery anche se step finali non completati), recovery_email_sent_count, recovery_email_last_sent_at, recovered_at se ripresa via mail, marketing_consent_bool + privacy_consent_bool + timestamp consensi, created_at/updated_at), tabella `lead_form_steps` opzionale (id, lead_form_id FK, ordine int, titolo, sottotitolo, campi JSON con tipologie e validazioni, condizione_visibilita JSON per branching, cta_avanti_label, cta_indietro_label, illustration_url) — alternativa a schema_steps JSON unico (split per editing UI admin più ergonomico). Tipologie campo supportate per step: text, email, tel (con maschera internazionale e validazione formato), number, textarea, select (dropdown), radio (visualizzazione card cliccabili grandi per touch mobile), checkbox (singolo consenso o multi-select), date (con date-picker), date-range, slider (es. budget 1k-100k con steps), rating stelle (es. urgenza 1-5), file upload (allegato preventivo esistente con drag-drop + preview + size limit + mime whitelist), address (autocomplete Google Places / OSM Nominatim), color picker, signature (firma digitale touch per consenso esteso), captcha (Cloudflare Turnstile o hCaptcha invisibile per anti-bot senza UX friction). Validazione per step: prima di avanzare al successivo, validazione client-side (instant feedback inline campo per campo) + server-side autoritativa (POST AJAX `/forms/{slug}/step/{n}` con sessione token, validation rules Laravel custom per form, ritorno errori per campo + mantenimento dati già inseriti), bypass step indietro permesso senza re-validazione (cliente vuole correggere step precedente). Branching condizionale: schema step supporta `next_step_rules` (es. step 1 «sei azienda o privato?» → privato salta step 2 «P.IVA», azienda invece la richiede), rendering dinamico campi visibili in base a risposte precedenti (es. step 3 mostra campo «numero dipendenti» solo se step 1 = azienda), grafo step non-lineare ma sempre con progress percentuale coerente calcolata su path effettivo cliente non su totale step astratto. Progress bar: componente UI in alto sticky con step list orizzontale (step completati green check, step corrente highlighted, step futuri grigi inattivi), percentuale numerica `Step 3 di 5 (60%)`, breadcrumb cliccabile per tornare indietro a step già completato (ma blocco avanti se step intermedi mancanti), animazione fluida transizione tra step (slide laterale o fade) per percezione momentum, micro-celebrazione visiva a ogni step completato (checkmark animato + sound opzionale toggleable) per dopamine hit psicologico che incentiva completamento. Salvataggio parziale server-side: ogni `next step` POST salva immediatamente `dati_step_{n}` in DB anche se utente chiude browser dopo, session_token persiste in cookie HttpOnly 30gg + localStorage per resilienza, ripresa al rientro stessa device riprende automaticamente da step corrente, se device diversa o cookie pulito client può inserire email collegata e ricevere link magico ripresa (`/forms/{slug}/resume/{token}`). Ripresa via mail magic link: se al step 1 cliente fornisce email + checkbox «invia link ripresa», sistema invia immediatamente mail con link univoco per riprendere da qualsiasi device anche giorni dopo, mail #8331 da template (subject «Continua dove avevi lasciato — {nome_form}», corpo personalizzato con preview step corrente e CTA grande). Recovery abbandonati: cron `php artisan leads:detect-abandoned` quotidiano marca `abandoned_at` per submission inattive > 24h, cron `php artisan leads:send-recovery-mail` invia sequenza email recovery se `email_for_recovery` presente (-1gg copy soft «hai dimenticato di completare», -3gg copy urgency «scade tra X giorni l opportunità», -7gg ultimo tentativo con eventuale sconto/incentivo per finire), tracking aperture/click via UTM su link + pixel tracking per misurare ROI recovery. Anti-spam e quality: rate limit submission per IP/session (max 5 form completion/h per IP per stesso form), honeypot field nascosto graficamente ma compilato da bot, Cloudflare Turnstile/hCaptcha invisible solo se score sospetto, validazione email con DNS MX check (libreria `egulias/email-validator`), validazione telefono via lib `libphonenumber` per formato internazionale, blacklist domini disposable (mailinator/guerrillamail/etc), blacklist parole spam in textarea, IP block list per abuse repeat. UX mobile-first: ogni step pensato per single-screen mobile senza scroll inutile, font-size 16px+ per evitare zoom auto iOS, input touch-friendly (radio/checkbox grandi 44x44 tap target Apple HIG), autocomplete browser per email/tel/address, autocapitalize/autocorrect appropriati per campo, keyboard input type mobile corretto (`tel`/`email`/`number`/`decimal`) per evocare tastiera giusta su mobile, transition step rapida con haptic feedback (vibrate API) per percezione tangibile avanzamento. Frontend rendering: componente Livewire `<x-lead-capture-form :form="$form" />` embed in qualsiasi pagina del sito o uso standalone su URL dedicato `/forms/{slug}` con landing page minimal full-screen senza distrazioni navigation, supporto embed iframe per uso cross-site (clienti Footility che incorporano form Footility-hosted nel proprio sito), supporto popup/modal trigger da CTA pagina marketing («Richiedi preventivo» → modal con form multi-step), supporto exit-intent popup (rileva mouse verso chiusura tab → mostra form con offerta last-chance), supporto sticky CTA mobile (footer bar fisso «Inizia richiesta» per conversion mobile). Backend admin: CRUD form con builder visuale drag-drop step+campi (no-code: admin crea form senza dev), datatable Livewire #8327 submissions con filtri (form, status, range date, source UTM, device, completed/abandoned), dettaglio submission con tutti dati raccolti + timeline azioni (step1 completed at, step2 at, abandoned at, recovery mail sent, …), export #8328 submissions CSV/Excel/PDF per import in CRM esterno o report stakeholder, A/B test versioni form (admin clona form, modifica step/copy, 50/50 traffic split, sistema misura conversion rate per variante e suggerisce winner statisticamente significativo), report aggregati (conversion rate per step — quale step ha più drop-off è leverage point ottimizzazione, average completion time, source attribution top performer, device breakdown, recovery effectiveness rate). Integrazioni outbound: ad ogni `submission completed`, fan-out a destinazioni configurate per form — mail #8331 ad admin/sales con sintesi lead, mail conferma a lead con prossimi passi e SLA risposta, webhook outbound POST JSON a endpoint configurabile (Make/Zapier/n8n/custom) per inserimento automatico in CRM (HubSpot/Pipedrive/Salesforce/Notion via API), notifica Slack/Teams canale sales («Nuovo lead: {nome} {azienda} budget {range}»), aggiunta a lista Mailchimp/Brevo con tag specifico form per nurturing successivo, creazione opportunità deal in CRM con valore stimato da step budget, assegnazione auto ad agente sales via round-robin o territoriale. Eventi business: `LeadFormStarted`/`LeadFormStepCompleted`/`LeadFormCompleted`/`LeadFormAbandoned`/`LeadFormRecovered` per analytics dashboard funnel conversion + drop-off per step + tempo medio per step + abandonment rate per step (identifica step problematico con UX da semplificare). GDPR e compliance: checkbox privacy obbligatorio sblocca submit con link a privacy policy aperto in modal/nuova tab, checkbox marketing consenso separato (granulare opt-in newsletter vs solo richiesta preventivo), timestamp + IP + user-agent dei consensi storicizzati immutabili per prova legale (`lead_consents` audit log), diritto oblio cliente via endpoint `/forms/{slug}/delete-my-data` con token email-verified (cancellazione hard submission + anonimizzazione log), retention configurabile per form (es. submission incomplete purge dopo 90gg, complete dopo 24 mesi salvo richiesta esplicita conservazione lead). API REST per headless: `POST /api/forms/{slug}/start` ottiene session_token + schema step 1, `POST /api/forms/{slug}/step` con token+step_number+dati salva e ritorna step successivo, `GET /api/forms/{slug}/submission/{token}` recupera stato corrente (per resume), `POST /api/forms/{slug}/complete` finalizza con captcha+consensi, autenticazione anonima session-based o API token per integrazioni server-to-server (es. mobile app nativa che usa stesso backend lead). Performance: caching schema form serializzato (cambia raramente, invalidate on update), debounce salvataggio step se utente cambia idea rapidamente (batch updates), prefetch step successivo per transizione istantanea percepita, lazy-load campi pesanti (es. file upload widget caricato solo a step file), Core Web Vitals LCP <1.5s landing page form per ridurre abbandono pre-step1. Comandi artisan: `php artisan leads:detect-abandoned`, `php artisan leads:send-recovery-mail`, `php artisan leads:purge-expired {--older-than-days=}`, `php artisan leads:export {form-slug} {--from=} {--to=} {--format=csv|xlsx|pdf}`, `php artisan leads:sync-crm {provider}` (re-sync submission falliti push CRM esterno), `php artisan leads:report-conversion {form-slug} {--month=}` (report mensile per stakeholder), `php artisan leads:detect-spam` (scan submission con pattern spam per quarantena manuale). Casi d uso workspace: Footility (form qualificazione lead consulenza moduli marketing — step 1 settore, step 2 problema, step 3 budget, step 4 contatti — invece di form unico con 12 campi che converte poco), Holiday Self Drive (form prenotazione veicolo step 1 città+date, step 2 tipo veicolo+extra, step 3 contatti+pagamento → integrato con #8324 caparra), Klabhouse (form iscrizione corsi step 1 livello attuale studente, step 2 obiettivo formativo, step 3 corso suggerito da risposte branching, step 4 contatti genitore), gestionali (form discovery cliente B2B step 1 settore, step 2 dimensione azienda, step 3 pain points multi-select, step 4 contatti — sales pre-qualificato), the-body-code/realpilates (form onboarding nuovo cliente step 1 obiettivo, step 2 livello fitness, step 3 disponibilità slot, step 4 contatti → integrazione #8323 calendario per booking diretto), mscarichi (form preventivo step 1 tipo servizio, step 2 volume m³, step 3 indirizzo+data, step 4 contatti → preventivo automatico con #8318 catalogo prezzi), prontointervento (form richiesta intervento step 1 categoria problema, step 2 urgenza con slider, step 3 indirizzo+orario disponibile, step 4 contatti → dispatching auto a tecnici per zona). Estensioni future: AI conversational form (al posto di form classico, chatbot step-by-step domanda-risposta con LLM che adatta domande successive in base a contesto raccolto — feel più umano, conversion rate ancora superiore per lead complessi), AI lead scoring automatico (modello su pattern submission storica predice qualità lead 0-100 e routing automatico ad agente sales appropriato per fascia), AI summary lead per sales (genera mini-brief vendite con punti chiave + obiezioni anticipate + suggerimenti pitch da risposte raccolte, risparmio tempo onboarding lead per agente), video step (al posto di form testuale step può chiedere registrazione video 30s «raccontaci il tuo problema» con upload diretto S3 + trascrizione AI #8337), voice step (registrazione audio risposta libera con trascrizione + sentiment analysis), screen sharing step (cliente richiede aiuto live durante form e launchabile Zoom/Meet call immediato), survey post-completion (NPS o feedback UX immediato post-submit per ottimizzare form), gamification (badge collezionabili per ogni completion, riferimenti amico con incentivi), embeddable widget cross-site con white-label per agenzie che rivendono form Footility ai propri clienti finali. Differenza da Typeform/Tally/Jotform: qui Laravel-native con piena ownership dati (no vendor lock-in/no monthly fee per submission, no problemi GDPR USA-hosting), integrato con stack workspace (CRM gestionali, mail #8331, audit #8330, datatable #8327, export #8328, calendario #8323, catalogo prezzi #8318/#8319), brandizzabile completamente senza «Powered by», embed sicuro sui propri domini senza tracking third-party. Costo: 0.5 giorno setup migrazioni `lead_forms` + `lead_submissions` + opzionale `lead_form_steps` + audit consensi, 1 giorno `LeadFormService` con logica step navigation + branching condizionale + validazione per step + salvataggio parziale + session_token management, 0.5 giorno rendering Livewire componente step-by-step con progress bar + transizioni animate + breadcrumb cliccabile, 0.5 giorno campi UI tipologie (text/email/tel/select/radio/checkbox/date/slider/file/address/signature/captcha) riusabili come blade components, 0.5 giorno persistence intermedia step-by-step + ripresa sessione cookie/localStorage + magic link mail #8331 per cross-device, 0.5 giorno builder admin form visuale drag-drop step+campi (no-code per non-dev), 0.5 giorno datatable submissions con filtri+dettaglio+export #8328 + report aggregati conversion funnel, 0.5 giorno integrazioni outbound webhook + mail + Slack + CRM esterni (HubSpot/Pipedrive/Notion), 0.5 giorno A/B test versioni form con metriche conversion per variante, 0.5 giorno cron detect-abandoned + send-recovery-mail + UTM tracking + analytics events, 0.5 giorno GDPR (consensi audit, diritto oblio endpoint, retention configurabile), 0.5 giorno API REST per headless mobile/cross-site + sicurezza captcha+honeypot+rate limit+blacklist, 0.5 giorno testing flussi (multi-step, branching, abandon+resume cross-device, recovery mail, A/B test, integrazioni outbound, edge cases validazione, accessibility a11y screen reader, mobile UX). Dipendenze: Laravel Livewire per componente step reattivo, mailer #8331 per recovery+confermare lead, opzionale #8330 audit log consensi GDPR, opzionale #8327 datatable admin submissions, opzionale #8328 export CSV/Excel/PDF, opzionale #8331 template mail recovery, opzionale #8323 calendario per integrazione booking slot, opzionale #8324 caparra se form sfocia in prenotazione con anticipo, opzionale Cloudflare Turnstile/hCaptcha per captcha invisible, opzionale libphonenumber + DNS check email per validazione qualità.

Esempi d'uso

  • marketing

Disponibile nei pacchetti