WebBlocks Campaigns
Requisiti
Versione pacchetto documentato: 0.7.0. WebBlocks CMS ^1.45.5; PHP >=8.3.
A WebBlocks CMS Plug-in per inviare un'e-mail basata su modelli al proprio elenco clienti, con nome, indirizzo e altri campi compilati per destinatario.
Consenso e motivo per cui la soppressione è separata
Il consenso viene registrato per canale. I messaggi di marketing e quelli operativi sono cose diverse: qualcuno che rinuncia alla pubblicità deve comunque ricevere "la tua fattura è in scadenza", quindi un flag costringerebbe a scegliere tra inviare spam alle persone che hanno rinunciato e nascondere i messaggi di cui hanno bisogno.
Eciascun contatto registra perché può essere scritto: la base, da dove proviene, quando e per il consenso esplicito l'esatta dicitura concordata. Un'importazione registra lo stesso contro se stessa, quindi "perché questo indirizzo è qui" ha una risposta un anno dopo.
Il registro di soppressione è una tabella a sé stante, codificata per indirizzo anziché per contatto e nessuna importazione la tocca mai. Questo è ciò che rende sicura questa sequenza: qualcuno annulla l'iscrizione, l'operatore successivamente cancella l'elenco e reimporta il foglio di calcolo originale e la persona annullata non ritorna. Rilasciare un indirizzo è l'unica via d'uscita ed è intenzionale.
Il consenso viene sempre e solo aumentato da un'importazione, mai ridotto: un ritiro sopravvive a una reimportazione e un'importazione di un cliente esistente non declassa qualcuno già con consenso esplicito.
Importazione
Carica, mappa, anteprima, conferma. Non viene scritto nulla fino all'ultimo passaggio e ogni riga rifiutata viene segnalata con il relativo numero di riga nel file di origine in modo che l'operatore corregga il foglio di calcolo anziché indovinare cosa è stato eliminato.
I file separati da punto e virgola e una distinta base UTF-8 vengono letti senza problemi, perché questo è ciò che producono le esportazioni di fogli di calcolo tedeschi e turchi. Viene suggerita una mappatura delle colonne e mai applicata da sola: indovinare che mappa i nomi sul campo email è peggiore di non indovinare, perché sembra che abbia funzionato.
Una cella vuota è un'assenza, non un valore. Una reimportazione colma le lacune e non cancella ciò che è già presente.
Scrittura di un modello
{{ first_name }} assume il valore. {{ first_name | Kunde }} dice cosa appare quando manca, che è la differenza tra "Ciao Ada" e "Ciao ,", il modo in cui viene ricordata una stampa unione.
I valori uniti vengono sottoposti a escape in HTML; il modello no. Il modello è tuo, i valori provengono da un foglio di calcolo.
Due cose vengono controllate prima di poter inviare un test:
- An blocchi di campo sconosciuti.
{{ firstname }}dove il campo èfirst_nameviene visualizzato come vuoto per il destinatario ogni e appare perfettamente a posto nell'editor. I campi disponibili derivano dai contatti effettivamente importati, quindi l'errore di battitura è rilevabile. - A Avvertenza fallback mancante. Si tratta di un giudizio, non di un errore: "Ciao" senza nome a volte è esattamente corretto.
L'anteprima esegue il rendering rispetto a un contatto reale anziché a dati inventati, perché i dati inventati sono sempre ben formati e pertanto non dimostrano nulla. Un invio di prova consegna le stringhe già renderizzate, quindi ciò che arriva è ciò che una campagna invierebbe, con il prefisso [TEST].
Invio in corso
A accoppia un modello con un elenco e dichiara che tipo di messaggio è:
- Commercialeè pubblicità. Raggiunge solo i contatti il cui consenso consente la pubblicità e il relativo modellodoverecontenere
{{ unsubscribe_url }}— altrimenti la coda viene rifiutata. - Operativoriguarda un contratto esistente. Non si tratta di pubblicità, quindi la disattivazione del marketing non la trattiene e non è necessario alcun collegamento per annullare l'iscrizione.
L'accodamento non invia. Materializza il set di destinatari: un invio richiede ore e derivarlo dall'elenco a metà esecuzione consentirebbe a una modifica di cambiare silenziosamente a chi viene scritto. Quindi cron fa il lavoro:
php artisan webblocks-campaigns:dispatch
Eogni esecuzione invia un batch per campagna, limitato dalla dimensione batch per sito e dal limite orario. Questo è il punto: un invio in blocco effettuato attraverso l'SMTP di un host condiviso è il modo in cui un dominio di invio viene bloccato e ci vogliono mesi per annullarlo.
L'istantanea non è attendibile. La soppressione e il consenso vengono ricontrollati per ogni destinatario al momento dell'invio, quindi qualcuno che annulla l'iscrizione un'ora in un ciclo di due ore non riceve il resto. La pausa viene riletta tra un batch e l'altro e interrompe immediatamente la corsa.
Annullamento sottoscrizione
Ogni messaggio commerciale porta un collegamento creato da un token per destinatario, quindi un opt-out registra quale campagna lo ha richiesto. Viene impostata anche l'intestazione List-Unsubscribe, poiché la sua assenza è uno dei segnali che smistano la posta in massa nello spam.
Il GET mostra una pagina di conferma e il POST fa il lavoro: i client di posta e le apparecchiature di sicurezza seguono i collegamenti senza richiesta, quindi agire su GET annullerebbe l'iscrizione delle persone che non hanno mai fatto clic. Un secondo clic dice "hai annullato l'iscrizione" invece di fallire.
List-Unsubscribe-Post (one-click) viene deliberatamente pubblicizzato not: chiede al client di eseguire il POST senza un token CSRF, che il CMS rifiuta con un 419. Rivendicare una funzionalità che fallisce è peggio che non rivendicarla.
Un annullamento dell'iscrizione scrive due record: una soppressione, che è assoluta e sopravvive alla reimportazione, e una revoca del consenso sul contatto, che è ciò che vede un operatore e ciò che evidenzia che il sito si è interrotto quando richiesto.
Lettura del risultato
Il registro di invio elenca ogni destinatario con il suo stato e il motivo che sta dietro, filtrabile. Sopra di esso, sono raggruppati i motivi di salto e fallimento: "412 saltato" non è perseguibile, mentre "390 soppresso, 22 consenso ritirato" è una rassicurazione o un compito.
È possibile ritentare gli errori; i salti non possono. Un salto era una decisione e riprovare lo ripeteva o lo sovrascriveva: il secondo è il modo in cui qualcuno che ha rinunciato riceve nuovamente la posta. I destinatari sottoposti a nuovo tentativo vengono sottoposti agli stessi controlli di consenso e soppressione di tutti gli altri.
Settings
Per sito: dimensione batch, limite orario, nome e indirizzo del mittente, risposta. I limiti sono il motivo per cui esiste il batching: un invio in blocco effettuato tramite l'SMTP di un host condiviso è il modo in cui un dominio di invio viene bloccato e ciò richiede mesi per essere annullato. Lo schermo dice chiaramente anche quando la posta in uscita è inutilizzabile, quindi una campagna piena di skip non viene confusa con un bug.
Rimbalza
I rifiuti sono classificati in tre modi e solo uno di essi sopprime:
Significa
Sopprime
Indirizzo morto
"nessun utente simile", "dominio non trovato"
Sì, subito
Temporaneo
casella di posta piena, greylist, tariffa limitata
Solo dopo ripetuti guasti
Rifiutato dal destinatario
spam, policy, SPF/DKIM/DMARC, inoltro negato
Mai
La terza riga è il punto centrale dell'intera funzionalità. Questi rifiuti arrivano con codici 5xx permanenti e sembrano identici a una casella di posta morta, ma riguardano l'invio di your, non il destinatario. La loro soppressione eliminerebbe i clienti validi a causa di un errore di reputazione o di configurazione, in modo silenzioso, una campagna alla volta. I casi ambigui si risolvono nel non sopprimere: mantenere un indirizzo morto costa un rimbalzo, sopprimerne uno attivo costa un cliente.
La classificazione avviene al momento dell'invio in seguito all'errore SMTP, quindi non necessita di webhook, di casella di posta con percorso di ritorno e di integrazione con il provider: funziona con qualsiasi mezzo di trasporto già utilizzato dal sito.
Ogni rifiuto viene conservato come storia, non solo come soppressione. Una soppressione non può dire perché o quanto spesso, e senza di essa una serie di rifiuti del destinatario è invisibile. La schermata Problemi di consegna avvisa quando viene visualizzato il motivo e indica cosa controllare.
Installa
composer plugin:build
Quindi installa l'artefatto tramite System → Plugins nell'amministrazione CMS. Installazione dei plugin disabilitata; abilitare esplicitamente dopo aver esaminato.
Convenzioni
handle webblocks-campaigns
settings namespace webblocks_campaigns
database prefix webblocks_campaigns_
admin routes /webadmin/plugins/webblocks-campaigns
public routes /plugins/webblocks-campaigns
route names webblocks.plugins.webblocks_campaigns.*
permissions webblocks-campaigns.view, .manage, .send, .settings
send è separato da manage di proposito: modificare una bozza e rilasciarla a duemila persone sono atti diversi e un'organizzazione dovrebbe essere in grado di concederne uno senza l'altro.
Raccogli abbonati con il doppio opt-in
Aggiungi il blocco di registrazione a una pagina e scegli l'elenco di destinazione, l'intestazione, l'introduzione, la formulazione del consenso e il campo del nome facoltativo. Una richiesta crea una sottoscrizione in sospeso. Il destinatario deve utilizzare il collegamento di conferma inviato via email e confermare prima che l'indirizzo diventi inviabile. I collegamenti di conferma scadono dopo sette giorni.
Il plugin registra la dicitura del consenso mostrata al momento dell'iscrizione. Una conferma può revocare l'annullamento dell'iscrizione o il mancato recapito; non sovrascrive un reclamo di spam o un blocco manuale dell'operatore. I nomi dei contatti esistenti vengono conservati.