You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
MAILCHIMP: Beim Sync nur von hitobito gemanagete Mailadressen aus Audience entfernen #2752
Als Verband mit mehreren Systemen und Tools
möchte ich den Nutzenden mehrere Wege bieten (auch ausserhalb von hitobito), sich für meine Mailchimp Audience anzumelden,
um niederschwellige Newsletter-Subscription-Formulare erstellen zu können.
Bisher löscht hitobito bei jedem regelmässigen Mailchimp Sync all die Mailadressen aus der Mailchimp Audience, welche nicht im hitobito-Abo sind. Falls über irgendeine andere Quelle Mailadressen in die Audience gekommen sind (z.B. über ein Formular auf einer Webseite, welches nicht an hitobito angebunden ist), dann werden diese Mailadressen bei jedem Sync von hitobito aus der Mailchimp Audience gelöscht.
Neu sollen diese fremd gemanageten Mailadressen nicht mehr von hitobito angefasst werden.
Tech-Spec
Umsetzung im Core
Neu soll hitobito jede Mailadresse, welche es auf Mailchimp synchronisiert, mit einem Tag"hitobito-mailing-list-#{list.id}" versehen.
Die Mailing List ID ist im Tag enthalten, da es derzeit in hitobito möglich ist, mehrere Abos in dieselbe Mailchimp-Audience synchronisieren zu lassen.
Irgendein Identifier der hitobito-Umgebung (z.B. Wagon-Name, hitobito-Base-URL, o.ä.) wird aktuell nicht dem Tag hinzugefügt. Dies wäre höchstens in extrem seltenen Edge Cases nützlich, wenn auf mehreren hitobito-Instanzen zufällig MailingLists mit derselben ID in dieselbe Mailchimp-Audience synchronisiert würden.
Beim Cleanup-Teil des Syncs sollen dann nur Mailadressen von Mailchimp entfernt werden, welche dieses Tag haben.
Abgrenzung Edge Case:
Mailadresse foo@bar.baz kommt zuerst via externes System in Mailchimp Audience, ohne Tag
Eine Person mit der Mailadresse foo@bar.baz wird auf hitobito in ein Abo hinzugefügt, welches mit dieser selben Mailchimp Audience verbunden ist
Beim nächsten Sync versucht hitobito, die Mailadresse foo@bar.baz inklusive Tag zur Audience hinzuzufügen. Dabei gibt Mailchimp die Meldung zurück, dass diese Mailadresse bereits in der Audience drin ist. Hitobito vergibt vorerst kein Tag an diese Mailadresse (weil es gemäss Abklärungen recht aufwändig1 wäre, diese Tags doch noch hinzuzufügen).
Folge: Falls die Person nun aus dem Abo entfernt wird (oder sich z.B. auf dem "Meine Abos" Tab austrägt), wird die Mailadresse beim nächsten Sync nicht aus der Mailchimp Audience entfernt (weil sie ursprünglich ja via eine andere Quelle als hitobito in die Audience kam). Was aber funktioniert ist der von Mailchimp eingefügte Unsubscribe-Link in einem versendeten Mail: Dieser führt direkt zu Mailchimp, wo die Person aus der Audience entfernt wird, und beim nächsten Sync von hitobito nach Mailchimp wird die Person mit MAILCHIMP: Unsubscribe korrekt behandeln #1930 auch aus dem hitobito-Abo entfernt.
Eine Migration für alle bestehenden Produktionssysteme ist möglich, da bisher niemand in den Audiences Mailadressen über andere Wege hinzufügen konnte: Beim ersten Sync nachdem dieses Feature aktiviert wird, können einfach nochmals einmalig (ev. manuell) alle Mailadressen aus der Audience entfernt werden. Von dann an müsste alles ganz normal funktionieren.
Die Migration ist nötig: Es gibt ein Zeitfenster zwischen dem letzten Mailchimp Sync mit dem alten Codestand (noch ohne dieses Feature) und dem ersten Sync mit dem neuen Codestand (mit diesem Feature). Jegliche Mailadressen, die während diesem Zeitfenster aus dem Abo entfernt werden, würden ohne Migration von hitobito nicht als hitobito-managed erkannt werden, und würden für immer in der Audience belassen werden. 2
Die Migration muss einmalig sein, und kann nicht als normalen, permanenten Teil des Sync-Features gebaut werden: Wir können natürlich nicht einfach bei jedem Sync alle nicht von hitobito gemanageten Mailadressen aus der Audience löschen, sonst wären wir wieder gleich weit wie vor diesem Feature.
Die Mailchimp API erlaubt es nicht, alle Emails mit einem bestimmten Tag abzurufen. Dafür haben wir aber bereits einen Helper: remote_tags, welcher einen Hash ausgibt, welcher jedes Tag auf eine Liste von Mailadressen mappt.
ToDo
Beim Sync in der subscribe_member_operation zusätzlich das gewünschte Tag "hitobito-mailing-list-#{list.id}" mitgeben (siehe Doku)
In obsolete_emails zusätzlich filtern, sodass nur Mailadressen zurückgegeben werden, welche auch in remote_tags["hitobito-mailing-list-#{list.id}"] enthalten sind
Für die Migration einen Rake Task erstellen
Iteriert über alle MailingLists, und führt für jede das Äquivalent von client.unsubscribe_members(client.fetch_members) aus (client ist der Synchronize::Mailchimp::Client aus dem Mailchimp Synchronizator)
Specs schreiben
CHANGELOG-Eintrag unter "unreleased" unten hinzufügen
Aufgleisen, dass nach dem nächsten Release auf jeder Umgebung der Migrations-Rake Task ausgeführt wird
Footnotes
Aufwändig wäre das, weil Mailchimp uns die Information, wer bereits in der Liste ist, erst im Batch Resultat gibt, welches ein temporär gültiger Link zu einer gezippten JSON-Datei ist. Dieses Resultat müsste man parsen, die betroffenen E-Mails extrahieren und in einem zweiten Batch Request das Tag setzen.
Abgeklärt aber gemäss Mailchimp-Dokumentation nicht möglich: Anstatt die neuen Personen mit POST (add member to list) zur Audience hinzuzufügen, auf PUT Requests (add or update list member) umsteigen. Grund: Der PUT-Endpoint unterstützt es nicht, direkt Tags hinzuzufügen. ↩
Eine Alternative wäre, direkt vor und nach dem Deployment je einen Mailchimp-Sync aller Abos anzustossen. Aber da wir bisher keinen pre-Deployment-Hook haben wäre auch das manuelle Arbeit, und zwar zwei Mal. ↩
Als Verband mit mehreren Systemen und Tools
möchte ich den Nutzenden mehrere Wege bieten (auch ausserhalb von hitobito), sich für meine Mailchimp Audience anzumelden,
um niederschwellige Newsletter-Subscription-Formulare erstellen zu können.
Bisher löscht hitobito bei jedem regelmässigen Mailchimp Sync all die Mailadressen aus der Mailchimp Audience, welche nicht im hitobito-Abo sind. Falls über irgendeine andere Quelle Mailadressen in die Audience gekommen sind (z.B. über ein Formular auf einer Webseite, welches nicht an hitobito angebunden ist), dann werden diese Mailadressen bei jedem Sync von hitobito aus der Mailchimp Audience gelöscht.
Neu sollen diese fremd gemanageten Mailadressen nicht mehr von hitobito angefasst werden.
Tech-Spec
"hitobito-mailing-list-#{list.id}"versehen.remote_tags, welcher einen Hash ausgibt, welcher jedes Tag auf eine Liste von Mailadressen mappt.ToDo
"hitobito-mailing-list-#{list.id}"mitgeben (siehe Doku)remote_tags["hitobito-mailing-list-#{list.id}"]enthalten sindclient.unsubscribe_members(client.fetch_members)aus (clientist derSynchronize::Mailchimp::Clientaus dem Mailchimp Synchronizator)Footnotes
Aufwändig wäre das, weil Mailchimp uns die Information, wer bereits in der Liste ist, erst im Batch Resultat gibt, welches ein temporär gültiger Link zu einer gezippten JSON-Datei ist. Dieses Resultat müsste man parsen, die betroffenen E-Mails extrahieren und in einem zweiten Batch Request das Tag setzen.
Abgeklärt aber gemäss Mailchimp-Dokumentation nicht möglich: Anstatt die neuen Personen mit POST (add member to list) zur Audience hinzuzufügen, auf PUT Requests (add or update list member) umsteigen. Grund: Der PUT-Endpoint unterstützt es nicht, direkt Tags hinzuzufügen. ↩
Eine Alternative wäre, direkt vor und nach dem Deployment je einen Mailchimp-Sync aller Abos anzustossen. Aber da wir bisher keinen pre-Deployment-Hook haben wäre auch das manuelle Arbeit, und zwar zwei Mal. ↩