Skip to content

MAILCHIMP: Unsubscribe korrekt behandeln #1930

Description

@carlobeltrame

Aktuelles Verhalten

Abos in hitobito können zu MailChimp synchronisiert werden. Wenn dann später Newsletter via MailChimp versendet werden, dann enthalten diese einen Link "Unsubscribe", um sich von der Liste abzumelden.

Wenn eine Person diesen Link anklickt, wird sie im innerhalb von Mailchimp als abgemeldet vermerkt. Ein "Anmelden" via hitobito Mailchimp sync ist für diese Mailadresse nicht mehr möglich.

Falls die E-Email weiterhin im Abo enthalten wird, retourniert der Mailchimp sync folgende Antwort:

{
  "status_code": 400,
  "operation_id": null,
  "response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"<email> was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}"
},

Das Synchronisieren zeigt dann den Status "Teilweise", oder in gewissen Fällen noch schlimmer keine konkreten Zustand sondern {:unchanged=>"Unverändert", :success=>"Aktualisiert", :partial=>"Teilweise", :failed=>"Fehlgeschlagen"} an:
Screenshot 2022-11-30 at 16-11-25 hitobito - Monitoring

Gewünschtes Verhalten

Hitobito sollte erkennen, wenn MailChimp verhindert, dass abgemeldete Personen wieder zur Liste hinzugefügt werden, und entweder diese Personen vom Abo entfernen, oder zumindest den MailChimp Sync trotzdem als erfolgreich markieren.

Schritte zu reproduzieren

Siehe oben. Leider nicht ganz einfach zu reproduzieren ohne MailChimp Account.

  1. Finde eine MailingList die ein Mitglied hat welches in diesen Fehler läuft. Z.B. Multitenancy glaj-vd, Abo mit ID 3 hat 1 solche Person.
  2. MailchimpSynchronizationJob.new(<id der betroffenen MailingList>).perform auf dieser Umgebung
  3. Im Log-Output suchen nach einem Batch welcher den Output "errored_operations"=> <irgendwas grösseres als 0> produziert hat
  4. Den Google Storage API Link response_body_url anklicken (muss sofort geschehen, dieser Link wird nach wenigen Minuten ungültig), herunterladen und entzippen
  5. Im JSON den Eintrag / die Einträge finden welche "status_code": 400, und "response": "{\"title\":\"Forgotten Email Not Subscribed\" haben

Eine solche JSON-Response-Datei ist für den Moment unter https://files.puzzle.ch/apps/files/files/6958308?dir=/swe/projects/SAC_SchweizerAlpenClub/Hitobito/7_Verschiedenes abgelegt.

Eventuel einfacher lokal mit dem hitobito Account (aus Cryptopus) eine neue Liste anlegen, sync und unsubscribe durchführen.

Screenshots, weiterer Kontext

Eine beispielhafte JSON-Response-Datei von MailChimp ist für den Moment unter https://files.puzzle.ch/apps/files/files/6958308?dir=/swe/projects/SAC_SchweizerAlpenClub/Hitobito/7_Verschiedenes abgelegt.

Tech Spec

  • Umsetzung im Core
  • In einem serialisierten Array-Feld auf MailingList sollen all diejenigen Mailadressen abgespeichert werden, welche sich bei MailChimp unsubscribed haben.
  • Beim Mailchimp Sync werden diese unsubscribten Mailadressen ignoriert
  • Es dürfen nicht ganze Personen aus der MailingList entfernt werden, da eine Person in hitobito mehrere Mailadressen haben kann und weil dieselbe Mailadresse gleichzeitig mehreren Personen in der MailingList gehören kann (als additional_email, oder via Elternzugang). Ausserdem können Personen in hitobito jederzeit temporär aus einem Abo rausfliegen und wieder dazukommen, aber in der verbundenen Mailchimp Audience ist die Mailadresse für immer ausgeschlossen.
  • Da wir die fehlenden Mailadressen immer via Batch Operation bei Mailchimp eintragen, gibt es keine bessere Möglichkeit um das Resultat von einzelnen failenden Operations abzurufen, als effektiv die gezippte JSON-Datei vom Google Storage Link abzurufen und zu parsen.
  • Ziel ist es, dass die partial 400er Errors, die Mailchimp uns wegen diesem Thema zurückgibt, in hitobito nicht mehr zu einem "Teilweise" Status auf dem Mailchimp Sync führen (dies ist der Teil den wir als Bug ansehen)

ToDos

  • Neue Datenbankspalte serialize :mailchimp_forgotten_emails, Array auf MailingList anlegen (ähnlich wie hier)
  • In Synchronize::Mailchimp::Synchronizator#missing_subscribers zusätzlich die Mailadressen in mailchimp_forgotten_emails der MailingList ausschliessen
  • In Synchronize::Mailchimp::Synchronizator#subscribe_members aus dem Resultat von der Batch Operation das Feld response_body_url herauslesen. Dann folgendes machen, alles immer noch im Rahmen des Jobs:
  • Die ZIP-Datei von dieser response_body_url herunterladen
  • Einzige enthaltene Datei ./*.json entzippen (Dateiname ist jedes Mal anders, Bsp. noejtv88ky.json)
  • JSON-Datei parsen, dabei kommt ein Array von Objekten raus. Beispiele für ein solches Objekt:
    {
      "status_code": 400,
      "operation_id": null,
      "response": "{\"title\":\"Forgotten Email Not Subscribed\",\"status\":400,\"detail\":\"foobar@redacted.com was permanently deleted and cannot be re-imported. The contact must re-subscribe to get back on the list.\",\"instance\":\"\"}"
    },
    {
      "status_code": 200,
      "operation_id": null,
      "response": "<redacted for brevity>"
    },
    {
      "status_code": 400,
      "operation_id": null,
      "response": "{\"title\":\"Member Exists\",\"status\":400,\"detail\":\"foobar2@redacted.ch is already a list member. Use PUT to insert or update list members.\",\"instance\":\"\"}"
    },
  • Diejenigen Response-Objekte finden welche status_code 400 haben, und deren title "Forgotten Email Not Subscribed" ist
  • Das detail Attribut dieser Objekte parsen: Gleich am Anfang müsste eine Mailadresse stehen
  • Diese Mailadresse in die mailchimp_forgotten_emails der MailingList hinzufügen (bisherige Einträge weiterhin drin lassen)
  • Für jedes so verarbeitetes JSON-Objekt die response["errored_operations"] bzw. den failed Counter im Sync Result um 1 verringern und response["finished_operations"] bzw. den finished Counter um 1 erhöhen
  • Specs schreiben (so gut es geht mit all diesem Overhead...)
  • Sicherstellen, dass diese Fälle
  • CHANGELOG-Eintrag unter "unreleased" unten hinzufügen

Activity

  1. carlobeltrame commented on May 28, 2024

    @carlobeltrame
    MemberAuthor

    Dieses Issue steht aktuell im Widerspruch mit der Bemerkung zuunterst hier in der user documentation.

    EDIT: Die user_documentation liegt hier aktuell effektiv falsch. Die falsche Aussage wurde in hitobito/user_documentation#7 von der Community contributet. Nach der Umsetzung dieses Issues wird es sich dann endlich so verhalten wie in der Dokumentation beschrieben.

  2. removed their assignment
    on Aug 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions