|
| 1 | +# Flusso email professionale Prime Build |
| 2 | + |
| 3 | +## Architettura scelta |
| 4 | + |
| 5 | +```text |
| 6 | +Modulo sito + Turnstile |
| 7 | + | |
| 8 | + v |
| 9 | +Cloudflare Pages Function /contact |
| 10 | + |-- Resend --> [PRIMO CONTATTO] alla casella interna |
| 11 | + `-- Resend --> conferma al cliente + link Google Form |
| 12 | + | |
| 13 | + v |
| 14 | + Google Form di qualificazione |
| 15 | + | |
| 16 | + v |
| 17 | + notifica/risposta qualificata |
| 18 | +``` |
| 19 | + |
| 20 | +- **Indirizzo pubblico e Reply-To:** `preventivi@primebuild.website`. |
| 21 | +- **Destinazione reale:** la casella Gmail esistente, nascosta dietro Cloudflare Email Routing. |
| 22 | +- **Mittente automatico:** `Prime Build Preventivi <preventivi@primebuild.website>`. |
| 23 | +- Non usare `no-reply@`: impedisce una risposta naturale e comunica distanza proprio quando il cliente deve fidarsi. |
| 24 | +- `info@` è generico e riceve più spam; `supporto@` va riservato in futuro ai clienti con un servizio già attivo. |
| 25 | + |
| 26 | +Il primo messaggio resta disponibile, ma arriva con oggetto `[PRIMO CONTATTO]`: in Gmail può essere archiviato automaticamente sotto l'etichetta `Da qualificare`. La posta prioritaria sarà quindi la notifica di una risposta completa al Google Form. |
| 27 | + |
| 28 | +## Perché il Google Form va nella prima risposta automatica |
| 29 | + |
| 30 | +Il link inviato per email aggiunge un piccolo impegno e verifica che l'indirizzo sia raggiungibile. Chi compila il secondo passaggio ha già letto differenze e prezzo dei due preventivi. Non mostrare subito il link sul sito: annullerebbe questo filtro. |
| 31 | + |
| 32 | +Il form dovrebbe richiedere almeno: |
| 33 | + |
| 34 | +1. email usata nel primo contatto; |
| 35 | +2. servizio scelto: Base gratuito oppure Completo €25; |
| 36 | +3. budget massimo e indicazione se include monitor/periferiche; |
| 37 | +4. giochi, software e utilizzo principale; |
| 38 | +5. risoluzione e refresh rate desiderati; |
| 39 | +6. componenti già posseduti; |
| 40 | +7. preferenze o vincoli (dimensioni, rumore, Wi-Fi, estetica); |
| 41 | +8. tempistiche; |
| 42 | +9. acquisto/assemblaggio autonomo oppure servizio Prime Build; |
| 43 | +10. conferma di aver compreso cosa include il livello scelto. |
| 44 | + |
| 45 | +Evita upload di file e domande non necessarie. Non richiedere l'accesso Google: l'apertura del link dalla casella email è già un filtro sufficiente e il login farebbe perdere lead validi. |
| 46 | + |
| 47 | +## Setup manuale Cloudflare Email Routing |
| 48 | + |
| 49 | +Email Routing risulta già attivo sul dominio: sono presenti gli MX Cloudflare e l'SPF `include:_spf.mx.cloudflare.net`. Non eliminarli. |
| 50 | + |
| 51 | +1. Apri **Cloudflare → Email → Email Routing → Destination addresses**. |
| 52 | +2. Verifica la casella Gmail di destinazione, se non è già verificata. |
| 53 | +3. In **Routing rules → Custom addresses**, crea: |
| 54 | + - `preventivi@primebuild.website` → Gmail esistente; |
| 55 | + - facoltativo: `dmarc@primebuild.website` → Gmail esistente, per ricevere i report DMARC. |
| 56 | +4. Invia un messaggio esterno a `preventivi@primebuild.website` e verifica ricezione e risposta. |
| 57 | +5. Non attivare un catch-all: aumenta lo spam senza migliorare il servizio. |
| 58 | + |
| 59 | +### Regola legacy `no-reply@` |
| 60 | + |
| 61 | +`no-reply@primebuild.website` (con trattino) non compare nel codice né negli altri repository Prime Build. La versione precedente del sito usava soltanto `noreply@primebuild.website` (senza trattino) come mittente in uscita, e questa PR la sostituisce con `preventivi@primebuild.website`. Una regola Email Routing non è necessaria per spedire: serve solo a ricevere risposte. Si può quindi disattivare la regola `no-reply@`, attendere 7–14 giorni e poi eliminarla se non emergono messaggi inattesi. |
| 62 | + |
| 63 | +Non eliminare invece i record DNS MX/TXT di `noreply.primebuild.website`: sono il Return-Path tecnico verificato di Resend e non rappresentano una casella o una regola di inoltro. |
| 64 | + |
| 65 | +## Setup manuale Resend e DNS |
| 66 | + |
| 67 | +Sono già presenti il DKIM `resend._domainkey.primebuild.website` e il Return-Path tecnico `noreply.primebuild.website` con SPF/MX Amazon SES. Devono restare invariati e il dominio deve risultare **Verified** nella dashboard Resend. La creazione dell'indirizzo inoltrato `dmarc@primebuild.website` non crea il record DNS DMARC: sono due configurazioni distinte. |
| 68 | + |
| 69 | +1. Apri **Resend → Domains** e aggiungi o seleziona `primebuild.website`. |
| 70 | +2. Copia in **Cloudflare → DNS** esattamente i record DKIM, SPF e MX mostrati da Resend. |
| 71 | +3. Non sostituire gli MX Cloudflare all'apice e non creare un secondo SPF all'apice. In questa configurazione Resend usa `noreply.primebuild.website` come Return-Path, separato dall'indirizzo `no-reply@primebuild.website` e dall'SPF di Email Routing. |
| 72 | +4. Lascia i record email in modalità **DNS only** quando applicabile. |
| 73 | +5. Premi **Verify DNS Records** in Resend e attendi lo stato `Verified`. |
| 74 | +6. Aggiungi il record iniziale: |
| 75 | + |
| 76 | + ```text |
| 77 | + Type: TXT |
| 78 | + Name: _dmarc |
| 79 | + Value: v=DMARC1; p=none; rua=mailto:dmarc@primebuild.website; adkim=r; aspf=r; pct=100 |
| 80 | + ``` |
| 81 | + |
| 82 | + Dopo almeno 2–4 settimane di report senza mittenti legittimi non allineati, valuta `p=quarantine`. Non partire direttamente con `reject`. |
| 83 | +7. In **Resend → API Keys**, crea una chiave con sola autorizzazione di invio. Copiala una volta e non inserirla nel repository. |
| 84 | +8. Lascia disattivato il tracking di aperture/click salvo reale necessità: riduce trattamento dati e complessità privacy. |
| 85 | + |
| 86 | +## Variabili Cloudflare Pages |
| 87 | + |
| 88 | +Apri **Cloudflare → Workers & Pages → website → Settings → Variables and Secrets** e configura Production (e Preview solo per i test): |
| 89 | + |
| 90 | +| Nome | Tipo | Valore | |
| 91 | +|---|---|---| |
| 92 | +| `RESEND_API_KEY` | Secret | `re_...` | |
| 93 | +| `QUALIFICATION_FORM_URL` | Variable | URL HTTPS completo del Google Form | |
| 94 | +| `TURNSTILE_SECRET_KEY` | Secret | chiave Turnstile già in uso | |
| 95 | +| `MAIL_TO` | Variable/Secret | casella Gmail interna | |
| 96 | +| `MAIL_FROM` | Variable | `preventivi@primebuild.website` | |
| 97 | +| `MAIL_REPLY_TO` | Variable | `preventivi@primebuild.website` | |
| 98 | +| `EMAIL_STRICT` | Variable | `1` | |
| 99 | +| `ALLOWED_ORIGINS` | Variable | `https://primebuild.website` | |
| 100 | + |
| 101 | +La chiave Resend deve esistere soltanto lato Cloudflare. Non usare mai un nome `VITE_RESEND_API_KEY`: le variabili `VITE_*` finiscono nel JavaScript pubblico. |
| 102 | + |
| 103 | +Alternativa CLI per i secret: |
| 104 | + |
| 105 | +```bash |
| 106 | +npx wrangler pages secret put RESEND_API_KEY --project-name website |
| 107 | +npx wrangler pages secret put TURNSTILE_SECRET_KEY --project-name website |
| 108 | +``` |
| 109 | + |
| 110 | +Per sviluppo locale crea `.dev.vars` (ignorato da Git): |
| 111 | + |
| 112 | +```dotenv |
| 113 | +RESEND_API_KEY=re_xxx |
| 114 | +TURNSTILE_SECRET_KEY=xxx |
| 115 | +QUALIFICATION_FORM_URL=https://docs.google.com/forms/d/e/xxx/viewform |
| 116 | +MAIL_TO=casella-interna@example.com |
| 117 | +MAIL_FROM=preventivi@primebuild.website |
| 118 | +MAIL_REPLY_TO=preventivi@primebuild.website |
| 119 | +``` |
| 120 | + |
| 121 | +Dopo ogni variazione alle impostazioni, avvia un nuovo deploy Cloudflare. |
| 122 | + |
| 123 | +## Configurazione Google Form e Gmail |
| 124 | + |
| 125 | +1. Collega il Google Form a un Google Sheet. |
| 126 | +2. Attiva **Ricevi notifiche email per le nuove risposte** dal menu delle risposte/Sheet. |
| 127 | +3. Nel testo finale del Form usa: |
| 128 | + |
| 129 | + > Grazie, la richiesta è completa. Il team Prime Build potrà ora valutarla. L'invio del questionario non comporta acquisti automatici; eventuali passaggi successivi saranno comunicati via email. |
| 130 | +
|
| 131 | +4. In Gmail crea un filtro per gli oggetti che contengono `[PRIMO CONTATTO]`: applica l'etichetta `Da qualificare` e, se desiderato, ignora la Posta in arrivo. |
| 132 | +5. Lascia in Posta in arrivo le notifiche del Google Form: saranno i lead che hanno completato il percorso. |
| 133 | + |
| 134 | +## Copy della conferma automatica |
| 135 | + |
| 136 | +**Oggetto:** `Abbiamo ricevuto la tua richiesta | Prime Build` |
| 137 | + |
| 138 | +> Ciao {{nome}}, |
| 139 | +> |
| 140 | +> abbiamo ricevuto il tuo primo contatto. |
| 141 | +> |
| 142 | +> Per preparare una proposta adatta alle tue esigenze, completa il questionario: ci aiuterà a valutare budget, utilizzo, giochi o software, risoluzione, componenti già disponibili, preferenze e tempistiche. |
| 143 | +> |
| 144 | +> **Preventivo Base — gratuito** |
| 145 | +> Include l'analisi delle tue esigenze, una stima del costo complessivo e l'indicazione della fascia di configurazione più adatta. È sufficiente per capire che tipo di PC e quale livello di prestazioni potresti ricevere affidando a Prime Build la realizzazione e l'assemblaggio. |
| 146 | +> |
| 147 | +> **Preventivo Completo — €25** |
| 148 | +> Include la stessa analisi, con in più il modello esatto di ogni componente, i link di acquisto, i prezzi consigliati rilevati al momento della ricerca e una checklist completa di compatibilità. È pensato per chi vuole poter acquistare e assemblare la build in autonomia. |
| 149 | +> |
| 150 | +> Se dopo aver acquistato il Preventivo Completo decidi di affidare comunque a Prime Build l'assemblaggio, i €25 già pagati verranno sottratti dal costo della manodopera. |
| 151 | +> |
| 152 | +> I preventivi riflettono prezzi e disponibilità presenti nel momento in cui vengono preparati. Il mercato dei componenti può cambiare rapidamente e Prime Build non vende direttamente i singoli componenti. Se rileviamo un prezzo particolarmente alto, te lo comunichiamo con trasparenza e, quando ci sono indicazioni concrete di un possibile calo a breve, possiamo consigliarti di attendere. |
| 153 | +> |
| 154 | +> Se ci hai contattato per assistenza relativa a un servizio già in corso, puoi rispondere direttamente a questa email senza compilare il questionario. |
| 155 | +> |
| 156 | +> Team Prime Build |
| 157 | +
|
| 158 | +Il codice in `functions/contact.js` genera sia HTML sia testo semplice e inserisce il pulsante verso `QUALIFICATION_FORM_URL`. |
| 159 | + |
| 160 | +## Test prima del merge |
| 161 | + |
| 162 | +1. Configura routing, DNS, API key e URL del Form. |
| 163 | +2. Invia il modulo con una casella diversa da quella interna. |
| 164 | +3. Verifica: |
| 165 | + - Turnstile blocca invii privi di token; |
| 166 | + - arriva la notifica interna con Reply-To del cliente; |
| 167 | + - il cliente riceve HTML e testo semplice; |
| 168 | + - il pulsante apre il Form corretto; |
| 169 | + - rispondendo alla conferma si raggiunge `preventivi@primebuild.website`; |
| 170 | + - SPF, DKIM e DMARC risultano `PASS` nelle intestazioni del messaggio. |
| 171 | +4. In Cloudflare crea facoltativamente una regola di rate limiting su `POST /contact` (per esempio 5 richieste ogni 10 minuti per IP), senza sostituire Turnstile. |
0 commit comments