Verlassener Mailchimp Basket: Ein Leitfaden für die Faulen

Zuerst ein bisschen schimpfen :) Früher oder später hat jeder Online-Shop die Frage, einen verlassenen Korb einzurichten. Statistiken und das Gefühl, dass verlorenes Geld im Magen saugt, verschonen niemanden.

Prozentsatz der verlassenen Körbe von 2006 bis 2017


Prozentsatz der verlassenen Körbe von 2006 bis 2017
Quelle

Prozentsatz der verlassenen Körbe für das erste Quartal 2018 nach Branchen:
Prozentsatz der verlassenen Körbe für das erste Quartal 2018 nach Branchen
Quelle

Gleichzeitig nutzen die meisten Online-Shops trotz der allgemein verfügbaren Statistiken die verfügbaren Funktionen nicht und verbinden keinen verlassenen Warenkorb. Eine kürzlich von EmailSoldiers durchgeführte "Home" -Studie zeigt deutlich, dass sich die meisten Geschäfte überhaupt nicht darum kümmern.

Aktuelle Statistiken für verbundene verlassene Körbe


EmailSoldiers Research
Quelle

Gleichzeitig holen alle (und auch wir sind keine Heiligen) den Verkehr auf, schalten Anzeigen und Motive, versuchen aber nicht einmal, die Person zurückzugeben, die im letzten Moment pleite war.

In der ersten Iteration können Sie jedoch eine Erhöhung der Bestellungen mit einem Brief ohne dynamischen Inhalt erzielen. Sie müssen ihn nur konfigurieren. Bemühen Sie sich nur einmal, damit es im Hintergrund Geld bringt - ist das nicht ein Märchen?

Natürlich kann ein Brief mit dynamischem Inhalt, in den Waren aus dem Warenkorb gezogen werden, besser funktionieren. Oder vielleicht hat ein anderes Kätzchen mit traurigen Augen mehr Einfluss auf Ihr Publikum. Oder Sie ziehen die empfohlenen Waren zu den Waren im Warenkorb und stellen fest, dass sie häufiger aus Briefen gekauft werden, und erhöhen den durchschnittlichen Scheck. Oder Sie können eine Reihe von Buchstaben erstellen, aus denen die Konvertierung noch größer wird.

Sie können Briefe von einem verlassenen Korb zu einem unerreichbaren Ideal verbessern und testen, aber jeder einmal konfigurierte Brief ist bereits unvergleichlich besser als nichts.

Umrechnung für einen verlassenen Warenkorb nach RetailRocket


RetailRocket hat die Korbkonvertierung aufgegeben
Quelle

Und so begannen Genosse Artem Aleksandrov und ich, den Korb von zwei Seiten einzuführen.

Technische Umsetzung


TOR für die Integration


Beschreiben Sie kurz das Wesentliche der Aufgabe.

Aufgabe: Verbinden Sie einen verlassenen Warenkorb für die Site xxx.xx mit dem Mailchimp-Mailingdienst

Wir geben alle notwendigen Materialien aus.

API-Schlüssel: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-usXX

Woher bekomme ich den Schlüssel?

Woher bekomme ich den Schlüssel?

Wir geben einen Link zur Dokumentation

ID des Blattes, mit dem wir den Store verbinden: XXXXXXXXXX

Wo kann ich die Blatt-ID bekommen?

Wo kann ich die Blatt-ID bekommen?

Ein Mail-Service muss im Voraus erstellt werden. Sobald die API-Anfrage beim Mailing-Service eingeht, wird die Nachricht automatisch generiert und der Adressat zum Senden in die Warteschlange gestellt.

Für unseren Fall haben wir die folgende Logik zum Senden eines verlassenen Warenkorbs gewählt:
Ein autorisierter Benutzer auf der Website fügt dem Warenkorb Waren hinzu, schließt die Transaktion nicht ab und schließt die Bestellung nicht ab. Der Warenkorb bleibt 1 Stunde lang unverändert. Danach wird eine Anfrage an Mailchimp gesendet, in der E-Mail, Zusammensetzung der Bestellung des Benutzers, Produktbilder, Warenpreis und ein Link zum Warenkorb des Benutzers übertragen werden.

Layoutvorlage


Beim Erstellen einer Automatisierung für einen verlassenen Warenkorb fragt der Mailchim sofort, ob ein oder mehrere Buchstaben vorhanden sind, und schlägt vor, ein verbundenes Geschäft auszuwählen.

Erstellen Sie in Mailchimp eine Automatisierung für einen verlassenen Warenkorb

In den Grundvorlagen bietet mch eine Auswahl von drei Teilen:

Wählen Sie Buchstaben für einen verlassenen Mailchimp-Korb aus
  1. Verlassener Korb mit dynamischer Ware
  2. Verlassener Korb mit Lebensmittelempfehlungen (muss separat konfiguriert werden)
  3. Verlassener Korb ohne Waren (nur ein Textbrief)

In den besten Traditionen können Sie, wenn Sie Zeit haben, den Korb selbst zusammenstellen.

Dynamische Produkte ohne Stile sehen ungefähr so ​​aus (Einrückung vergessen, sie werden hier hässlich angezeigt):

<table> <tbody> *|ABANDONED_CART:[$total=3]|* <table> <tbody> <tr> <td> <a href="*|CART:URL|*" title="*|PRODUCT:TITLE|*" target="_blank"> <img src="*|PRODUCT:IMAGE_URL|*"> </a> </td> <td> *|PRODUCT:TITLE|* — *|PRODUCT:PRICE|* </td> </tr> </tbody> </table> *|END:ABANDONED_CART|* </tbody> </table> *|END:ABANDONED_CART|* </tbody> </table> 

Es scheint, dass, wenn Sie die Nummer in der Variablen * | ABANDONED_CART: [$ total = 3] | * ändern, der Brief eine andere Warenmenge anzeigt, aber nein, mindestens 5, mindestens 100, der mch weigert sich, eine andere Menge anzuzeigen.

Und was auch ein wenig seltsam ist, die Variable * | PRODUCT: PRICE | * wird durch RUB288-Formatwerte ersetzt, und aus irgendeinem Grund ist es auch unmöglich, dies zu ändern, aber dazu später mehr.

Zur Abwechslung haben wir versucht, Variablen durch die Anzahl der Spiele und die Gesamtkosten der Bestellung zu ersetzen, die wir per API übermitteln, aber der Mailchimp sagte hier nein. Nun, so sei es.

Ein Wort an den Programmierer :)


Bei Mailchimp gab es eine historische Erfahrung mit der Integration in den Service-Mandrill von Drittanbietern. Dort ist alles einfach und klar. Sehr freundliche Dokumentation (natürlich auf Englisch), aber es gab keine Ecken und Kanten und es funktionierte vom ersten Kick an.

Außerdem wurde auf unserer Website ein Abonnementmechanismus über spezielle Formulare eingeführt. Hier haben wir die Untertreibung und Mehrdeutigkeit der Mailchimp-Dokumentation voll gespürt. Englisch ist für einen erfahrenen Entwickler kein Problem, aber die Kenntnis des klingonischen Dialekts ist standardmäßig nicht impliziert.

Die ersten Daten sind: die PHP7-Sprache und das YII2-Framework, das mit seinem Ökosystem bereits überwältigend gewachsen ist. Das heißt, Wir haben bereits 6 kleine Projekte, die versuchen, gemeinsame Komponenten sowohl im Backend als auch im Frontend zu verwenden. Dementsprechend erfordert die Umsetzung einer Aufgabe die unabhängige Lösung ihres Projekts, dies bedeutet jedoch keine Rahmenunabhängigkeit, da man muss dafür mit menschlichen Stunden bezahlen, von denen es immer einen Mangel gibt.

Nachdem wir die Aufgabe der Integration erhalten haben, müssen wir uns zuerst umschauen. Was ist uns gegeben? Erstens den Mailchimp-Service, mit dem Sie sich anfreunden müssen. Wir gehen zum Github und sehen, dass es ziemlich viele Implementierungen gibt. Aber die Wahl ist einfach - das beliebteste Paket mit 1,5.000 Sternen ( drawm / mailchimp-api ).

Das Paket bietet einen einfachen Wrapper für die Interaktion mit einem Mailchimp. Das können wir nur mit unserer Logik erreichen.

Zweitens erhalten wir Dokumentation . Basierend auf der Dokumentation verfügen wir über eine Store-Ressource mit verschachtelten Ressourcen: Warenkorb, Kunde, Bestellung, Produkt, Promo-Regel. Für einen verlassenen Warenkorb ohne empfohlene Produkte benötigen wir nur Produkt, Warenkorb und Kunde. Der Warenkorb besteht wiederum aus dem Warenkorbsatz, und das Produkt enthält Produktvarianten.

Wir haben die Aufgabe wie folgt zerlegt:

  1. Laden Sie die Speicherdaten in die Speicher hoch
  2. Laden Sie alle käuflichen Produkte unter Produkte herunter
  3. Richten Sie das Laden von Körben mit Benutzern nach einem Zeitplan ein

Ok, lass uns gehen. Zunächst übernehmen wir die Essenz des "Ladens". Wir haben uns entschlossen, sofort die Test- und Kampfversion des Geschäfts zu verwenden, und je nach Umgebungsvariable, die für den Jungfern- / Produktmodus verantwortlich ist, haben wir entweder mit einem Geschäft oder mit einem anderen gearbeitet.

Um Geschäftsdaten herunterzuladen, klopfen wir auf eine Post-Anfrage unter / ecommerce / store mit den folgenden Parametern:

 [ 'id' => 'dev.***.ru', 'list_id' => '****', 'name' => '*** - test', 'domain' => 'dev.***.ru', 'email_address' => 'admin@***.ru', 'currency_code' => 'RUB', 'primary_locale' => 'ru', 'money_format' => '₽', ] 

Es gibt mehrere weitere Optionen, aber alles hängt von den Anforderungen ab. Weil Wir wollten die Kontaktdaten des Geschäfts nicht in Briefen verwenden. Wir haben die Felder Telefon, Adresse, Zeitzone usw. nicht ausgefüllt.
Aber eine kleine Überraschung erwartete uns. Das Feld money_format scheint speziell für die Darstellung des Preises in einem für uns geeigneten Format erstellt worden zu sein. Beim Erstellen einer verlassenen Korbvorlage ersetzt der Mailchip jedoch hartnäckig RUB vor der Nummer. Mailchimp, hör auf!

Nach dem Download können wir die Daten mithilfe der Get-Anfrage unter der Adresse / E-Commerce / Stores überprüfen, um alle geladenen Stores anzuzeigen, oder / E-Commerce / Stores / {id}, um Daten zu einem bestimmten Store abzurufen.

Jetzt können Sie alle anderen Daten hinzufügen, da der Store der Stammpunkt in unserem Datenbaum ist, weil Wir werden alle anderen Daten in ein bestimmtes Geschäft hochladen.

Damit der MCH Waren in einem verlassenen Korb ersetzen kann, muss er diese Waren füttern. Dazu haben wir die Adresse / ecommerce / store / {store_id} / products, an die wir Post-Requests zum Erstellen von Produkten im System senden.

 [ 'id' => '742', 'title' => '', 'handle' => 'kastrulya', 'url' => 'http://***.ru/catalog/kastrulya/', 'description' => ' —    .  ,       .  ,        !           !', 'type' => '', 'vendor' => '  ', 'image_url' => 'http://***.ru/images/742/product.png', 'variants' => [ [ 'id' => '742', 'title' => '', 'url' => 'http://***.ru/catalog/kastrulya/', 'price' => 890, 'sku' => 'KA453', 'inventory_quantity' => 1000, 'image_url' => 'http://***.ru/images/742/product.png', 'visibility' => 'visible', ], ], ] 

Was ist so bemerkenswert? Zunächst muss jedes Produkt aus mindestens einem Produktangebot bestehen. Im Wesentlichen ist Produkt ein Container zum Laden von Produktangeboten. Darüber hinaus kann sich die ID des Produkts und des Produktangebots überschneiden, da dies unterschiedliche Ressourcen in der MCH-API sind.

Und hier begann die Untertreibung der MCH-Dokumentation. Ich musste raten, auch wenn es nicht schwierig war, aber man konnte es normal machen und nicht wie immer.

Das Handle-Feld wurde als "Handle eines Produkts" beschrieben. Ok, nach Rücksprache haben wir entschieden, dass dies Teil der URL ist, die sich auf das Produkt selbst bezieht (cnc). Dies wurde jedoch nur während der Tests bestätigt.

Sie können dem Produkt auch eine Reihe von Bildern hinzufügen. Wir haben jedoch entschieden, dass dies für uns nicht nützlich ist. Daher wurde nur das Hauptbild sowohl in das Produkt als auch in jedes Produktangebot geladen.

Und hier hatten wir ein Problem, aus irgendeinem Grund erschien die Ware nicht in den Mailchart-Vorlagen.

Wir begannen, in das Dock für Produkt zu graben. Und sie fanden ein Sichtfeld mit einer luxuriösen Beschreibung:

Sichtbarkeitsfeldbeschreibung

Geben Sie String ein! Und was kann dort übertragen werden? Warum ist es unmöglich, alle möglichen Bedeutungen zu beschreiben ?! Ich kann dort zum Beispiel "zeig mir bitte!" Senden.

Zum Glück gibt es eine Beispielanfrage!

Beispiel anfordern

Nun, dies hebt das Problem nicht auf. Ich weiß nicht, welche anderen Werte nützlich sein könnten.

Jeder hat das geschafft! Jetzt kann der E-Mail-Vermarkter die Verfügbarkeit von Waren im System überprüfen, indem er eine Vorlage unter Beteiligung von Waren oder alle über dieselben Abrufanforderungen über die Konsole erstellt.

Als nächstes stehen wir vor der Aufgabe, verlassene Körbe in den MCH zu laden. Zunächst kamen 2 Optionen in den Sinn:

  1. Jedes Mal, wenn Sie den Warenkorb wechseln (Waren hinzufügen / entfernen), wiederholen wir diese Aktion in MCH. Von den Minuspunkten bietet sich sofort eine Vielzahl von Anfragen an einen externen Dienst an.
  2. Beobachten Sie alle n Minuten Körbe, die sich vor nicht mehr als einer Stunde geändert haben. Dann schicken wir sie zum MCH. Es gibt nur ein Problem - den Überblick über die Körbe zu behalten, die nach dem Besuch des MCH wieder aufgenommen wurden.

Zuerst fordern wir in unserer Datenbank (im Folgenden als DB bezeichnet) unsere Daten in einem Fenster von 1 Stunde bis 3 an. Warum 3? Eine Stunde nach der letzten Änderung senden wir den Warenkorb an das System. Im MCH beträgt das minimal mögliche Intervall für den Versand des Warenkorbs 1 Stunde. Daher wird theoretisch nach 2 Stunden ± 5 Minuten ein Brief gesendet. 3 Stunden sind also auch mit einem Spielraum ein Wert.

Nachdem wir die Daten aus der Datenbank erhalten haben, stellen wir eine Abrufanforderung an die Adresse / ecommerce / store / {store_id} / carts. Auf diese Weise erhalten wir alle Körbe, die sich im E-Commerce-System befinden und darauf warten, dass sie an die Reihe kommen (oder bereits gesendet wurden). Warum brauchen wir das? Es ist für die Synchronisation mit unseren Daten notwendig. Wir senden alle aus der Datenbank empfangenen Körbe, müssen jedoch diejenigen löschen, die nicht mehr im Bereich von 1 bis 3 Stunden liegen. Nach 3x - schon irrelevante Daten. Bis zu einer Stunde - Körbe, die erneut erneuert oder bestellt werden können.

Zum Löschen müssen wir nur den Unterschied zwischen den beiden Arrays / Sammlungen von Körben finden.
Nach Erhalt der Körbe, die gelöscht werden müssen, senden wir eine Löschanforderung / ecommerce / store / {store_id} / carts / {cart_id}.

Als nächstes nehmen wir die Körbe zum Download und senden sie per Post-Anfragen in einem Zyklus an das System.

Die Korbparameter sehen ungefähr so ​​aus:

 [ 'id' => '1207', 'customer' => [ 'id' => '25', 'email_address' => 'email@example.com', 'opt_in_status' => false, ], 'currency_code' => 'RUB', 'order_total' => 1597, 'checkout_url' => 'http://***.ru/cart/abandoned/?cart=eyJpdGVtcyI6eyI1OTgwIjoxLCIzNDA0IjoxLCI3NzMiOjEsIjkwNTgiOjEsIjkwOTEiOjEsIjE4ODciOjEsIjc4NCI6MSwiNTExMSI6MSwiODA1MyI6MSwiMTk0MSI6MSwiNTQ0NSI6MSwiNzk1NCI6MywiOTA2NyI6NCwiOTA2NSI6NCwiNzg0MyI6MSwiOTA2NiI6M30sInByb21vY29kZSI6bnVsbH0%253D', 'lines' => [ 0 => [ 'id' => '123', 'product_id' => '5980', 'product_variant_id' => '5980', 'quantity' => 1, 'price' => 841, ], 1 => [ 'id' => '124', 'product_id' => '3404', 'product_variant_id' => '3404', 'quantity' => 1, 'price' => 756, ], ], ] ? //***.Ru/cart/abandoned/ Warenkorb = eyJpdGVtcyI6eyI1OTgwIjoxLCIzNDA0IjoxLCI3NzMiOjEsIjkwNTgiOjEsIjkwOTEiOjEsIjE4ODciOjEsIjc4NCI6MSwiNTExMSI6MSwiODA1MyI6MSwiMTk0MSI6MSwiNTQ0NSI6MSwiNzk1NCI6MywiOTA2NyI6NCwiOTA2NSI6NCwiNzg0MyI6MSwiOTA2NiI6M30sInByb21vY29kZSI6bnVsbH0% 253D', [ 'id' => '1207', 'customer' => [ 'id' => '25', 'email_address' => 'email@example.com', 'opt_in_status' => false, ], 'currency_code' => 'RUB', 'order_total' => 1597, 'checkout_url' => 'http://***.ru/cart/abandoned/?cart=eyJpdGVtcyI6eyI1OTgwIjoxLCIzNDA0IjoxLCI3NzMiOjEsIjkwNTgiOjEsIjkwOTEiOjEsIjE4ODciOjEsIjc4NCI6MSwiNTExMSI6MSwiODA1MyI6MSwiMTk0MSI6MSwiNTQ0NSI6MSwiNzk1NCI6MywiOTA2NyI6NCwiOTA2NSI6NCwiNzg0MyI6MSwiOTA2NiI6M30sInByb21vY29kZSI6bnVsbH0%253D', 'lines' => [ 0 => [ 'id' => '123', 'product_id' => '5980', 'product_variant_id' => '5980', 'quantity' => 1, 'price' => 841, ], 1 => [ 'id' => '124', 'product_id' => '3404', 'product_variant_id' => '3404', 'quantity' => 1, 'price' => 756, ], ], ] 

Und wieder ist unsere Lieblingsrubrik "rate mal, wie diese Felder funktionieren". Beispielsweise wurde durch die Methode des wissenschaftlichen Stocherns festgestellt, dass Sie keinen Käufer mit einer separaten Anfrage erstellen können. Es ist erforderlich, den minimal erforderlichen Satz von Feldern zu übertragen, und dieser wird automatisch erstellt, wenn er nicht im System vorhanden war. In unserem Fall haben wir uns auf id, email, opt_in_status beschränkt. Der letzte Parameter ist für den Status des Benutzerabonnements in unserem Blatt verantwortlich. Wenn es wahr ist, bedeutet dies, dass der Status abonniert ist, andernfalls transaktional.

Die Produktliste wird problemlos über das Cart Lines-Array geladen, das wiederum eine Ressource der Cart-Entität ist. Das heißt, Wir können dieses Set separat mit Restanfragen verwalten.

Nun, das ist alles, wie es scheint? Aber nein.

Beim Testen haben wir festgestellt, dass derselbe Warenkorb nur einmal gesendet wird. Obwohl wir es aus dem System entfernt und erneut heruntergeladen haben. Nichts wird irgendwo gesagt, kein einziges Wort! Infolgedessen haben wir empirisch mit Hilfe einer Mutter die Hypothese zugrunde gelegt, dass ein Korb mit derselben ID nur einmal gesendet werden kann.

Hier stimme ich den Erstellern voll und ganz zu, dass diese Einschränkung uns vor Spam-Nutzern bewahrt. Aber schreib darüber! Wir brauchen keine Quests, wir haben genug von unseren mystischen Fehlern in dem Code, den wir schreiben.

Nachdem wir das alles getan hatten, begann der MCH, uns schöne Briefe über den verlassenen Korb zu schicken. Und dann erschien eine zweite Frage. Wenn der Benutzer den Warenkorb geworfen und vom Brief auf sein eigenes Konto zurückgekehrt ist, dh zum Zeitpunkt des Klickens auf den Link autorisiert wurde, wird er problemlos in seinen Warenkorb gelegt. Und so stellt sich heraus, dass der Brief „on! Nimm deinen Korb zurück! “und als wir ihn überqueren, sagen wir:„ Ups, etwas ist verloren gegangen! Wir haben nichts angefasst! Es ist selbst! "

Es wurde beschlossen, die Zusammensetzung des Warenkorbs in eine Zeichenfolge zu kodieren und beim Senden des Warenkorbs an den MCH an checkout_url zu übergeben. Und wenn Sie auf die Website gehen, fangen Sie diese Zeile, dekodieren Sie und werfen Sie alle Waren in den Warenkorb, ohne zu vergessen, sie vorher vollständig zurückzusetzen.

Unabhängig davon, an welchen Browser wir den Benutzer senden, erhält er seinen Warenkorb, wie wir es versprochen haben. Das einzig Negative ist, dass er sich nur einloggen kann. Die Autorisierung über einen Link ist jedoch ein schlechtes Benehmen und in der Tat ein gefährliches Geschäft, vor allem für unsere Kunden.
Was ist das Ergebnis? Grundsätzlich gab es während der Implementierung keine besonderen Probleme, da die MCH-Antworten sehr oft bei Fehlern im Zusammenhang mit der Validierung der übertragenen Felder hilfreich waren. Aber es würde noch weniger von ihnen geben, wenn sie normalerweise alle diese Feinheiten der Arbeit des MCH menschlich beschreiben und die Felder detaillierter beschreiben würden.

Berichtseinrichtung in Google.Analytics


Um den Erfolg des gesamten Vorgangs zu verfolgen, müssen Sie den Bericht in Analytics konfigurieren und regelmäßig anzeigen. Stellen Sie sich vor, jeder hat wie Erwachsene E-Commerce verbunden, sonst funktioniert ein Wunder nicht :)

Um einen neuen Bericht für einen verlassenen Warenkorb zu sammeln, gehen Sie zu "Meine Berichte":

Meine Berichte

Weiter "Bericht hinzufügen":

Bericht hinzufügen

Danach fügen wir die Parameter hinzu, die wir verfolgen werden. Wir haben beschlossen, den verlassenen Korb im Kontext von Städten zu betrachten. Vielleicht haben Sie eine andere Vision.

Für einen Mailchamp lautet die Standardkampagne für einen verlassenen Warenkorb ABANDONED_CART_EMAIL. Wir ersetzen ihn im Filter und erhalten einen Bericht.

Bild

Das sind alles Gabeln!

Jetzt sind Sie so konfiguriert, dass Sie den verlassenen Korb und einen Bericht senden, anhand dessen Sie den Auspuff von dort aus beobachten können. Und testen, testen, testen! ;)

Source: https://habr.com/ru/post/de421393/


All Articles