Panier Mailchimp abandonné: un guide pour les paresseux

D'abord, un peu délirant :) Tôt ou tard, toute boutique en ligne se pose la question de mettre en place un panier abandonné. Les statistiques et le sentiment de perte d'argent en suçant l'estomac n'épargnent personne.

Pourcentage de paniers abandonnés de 2006 à 2017


Pourcentage de paniers abandonnés de 2006 à 2017
Source

Pourcentage de paniers abandonnés pour le premier trimestre de 2018 par industrie:
Pourcentage de paniers abandonnés pour le premier trimestre de 2018 par industrie
Source

Dans le même temps, malgré les statistiques généralement disponibles, la plupart des boutiques en ligne n'utilisent pas les fonctionnalités disponibles et ne connectent pas un panier abandonné. Une récente étude «à domicile» d'EmailSoldiers montre clairement que la plupart des magasins ne s'en soucient pas du tout.

Statistiques actuelles pour les paniers abandonnés connectés


Recherche de soldats
Source

Dans le même temps, tout le monde (et nous aussi, nous ne sommes pas des saints) rattrape le trafic, publie des publicités et des créations, mais n'essaye même pas de rendre la personne qui s'est cassée au dernier moment.

Mais dans la première itération, vous pouvez obtenir une augmentation des commandes en utilisant une lettre sans contenu dynamique, il vous suffit de la configurer. Ne faites un effort qu'une seule fois pour qu'en arrière plan cela rapporte de l'argent - n'est-ce pas un conte de fées?

Naturellement, une lettre au contenu dynamique dans lequel les marchandises du panier sont tirées peut fonctionner mieux. Ou peut-être qu'un autre chaton aux yeux tristes aura plus d'influence sur votre public. Ou vous tirez les marchandises recommandées vers les marchandises dans le panier et voyez qu'elles sont achetées plus souvent à partir de lettres et augmentez le chèque moyen. Ou vous aurez la possibilité de créer une série de lettres à partir de laquelle la conversion sera encore plus importante.

Vous pouvez améliorer et tester des lettres d'un panier abandonné vers un idéal inaccessible, mais toute lettre une fois configurée est déjà incomparablement meilleure que rien.

Conversion pour un panier abandonné selon RetailRocket


Conversion de panier abandonné RetailRocket
Source

Et donc, le camarade Artem Aleksandrov et moi avons commencé l'introduction du panier de deux côtés.

Implémentation technique


TOR pour l'intégration


Décrivez brièvement l'essence de la tâche.

Tâche: connecter un panier abandonné pour le site xxx.xx avec le service de messagerie Mailchimp

Nous distribuons tout le matériel nécessaire.

Clé API: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-usXX

Où trouver la clé?

Où trouver la clé?

Nous donnons un lien vers la documentation

ID de la feuille à laquelle nous connectons le magasin: XXXXXXXXXX

Où puis-je obtenir l'ID de la feuille?

Où puis-je obtenir l'ID de la feuille?

Un service de messagerie doit être créé à l'avance. Dès que la demande d'API est reçue par le service de mailing, le message est généré automatiquement et le destinataire est ajouté à la file d'attente pour l'envoi.

Pour notre cas, nous avons choisi la logique suivante pour l'envoi d'un panier abandonné:
un utilisateur autorisé sur le site ajoute des marchandises au panier, ne termine pas la transaction et ne termine pas la commande, le panier reste inchangé pendant 1 heure. Après cela, une demande est envoyée à Mailchimp, dans laquelle un e-mail, la composition de la commande de l'utilisateur, des images de produits, le prix des marchandises et un lien vers le panier de l'utilisateur sont transmis.

Modèle de mise en page


Lors de la création de l'automatisation d'un panier abandonné, le mailchim demande immédiatement s'il y aura une lettre ou plusieurs et suggère de choisir un magasin connecté.

Créer une automatisation pour un panier abandonné dans Mailchimp

Dans les modèles de base, mch propose un choix de trois pièces:

Sélectionnez des lettres pour un panier Mailchimp abandonné
  1. Panier abandonné avec des produits dynamiques
  2. Panier abandonné avec recommandations d'épicerie (doit être configuré séparément)
  3. Panier abandonné sans marchandise (juste une lettre texte)

Dans les meilleures traditions, si vous avez le temps, vous pouvez composer vous-même le panier.

Les produits dynamiques sans styles ressemblent à ceci (oubliez l'indentation, ils sont laids ici):

<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> 

Il semblerait que si vous modifiez le nombre dans la variable * | ABANDONED_CART: [$ total = 3] | * , alors la lettre affichera une quantité différente de marchandises, mais non, mettez au moins 5, au moins 100, le mch refuse d'afficher une autre quantité.

Et, ce qui est également un peu étrange, la variable * | PRODUCT: PRICE | * est remplacée par des valeurs de format RUB288, et pour une raison quelconque, il est également impossible de changer cela, mais plus à ce sujet plus tard.

Pour changer, nous avons essayé de substituer des variables au nombre de jeux et au coût total de la commande, que nous transmettons via l'API, mais le mailchimp ici a dit non. Eh bien, tant pis.

Un mot au programmeur :)


Avec mailchimp, il y a eu une expérience historique d'intégration avec leur mandrill de service tiers, tout y est simple et clair. Documentation très sympathique (bien sûr, en anglais), mais il n'y avait pas de bords rugueux et cela a fonctionné dès le premier coup de pied.

De plus, un mécanisme d'abonnement via des formulaires spéciaux a été introduit sur notre site. Ici, nous avons pleinement ressenti l'euphémisme et l'ambiguïté de la documentation de mailchimp. L'anglais n'est pas un problème pour un développeur expérimenté, mais la connaissance du dialecte Klingon n'est pas implicite par défaut.

Les données initiales sont: le langage php7 et le framework yii2, qui a déjà connu une croissance écrasante avec son écosystème. C'est-à-dire Nous avons déjà 6 petits projets qui essaient d'utiliser des composants communs à la fois sur le backend et le front-end. En conséquence, la mise en œuvre de toute tâche nécessite de résoudre son projet de manière indépendante, mais cela n'implique pas l'indépendance du cadre, car il faut le payer avec des heures humaines, dont il y a toujours une pénurie.

Ayant reçu la tâche de l'intégration, nous devons d'abord regarder autour de nous. Qu'est-ce qui nous est donné? Tout d'abord, le service mailchimp avec lequel vous devez vous lier d'amitié. Nous allons dans le github et voyons qu'il y a beaucoup d'implémentations. Mais le choix est simple - le package le plus populaire de 1,5 k étoiles ( drewm / mailchimp-api ).

Le package fournit un wrapper simple sur l'interaction de repos avec un mailchimp. Nous ne pouvons l'acquérir qu'avec notre logique.

Deuxièmement, nous recevons de la documentation . Sur la base de la documentation, nous avons une ressource Store avec des ressources imbriquées: panier, client, commande, produit, règle de promotion. Pour un panier abandonné sans produits recommandés, nous n'avons besoin que du produit, du panier et du client. Le chariot, à son tour, se compose de l'ensemble de lignes du panier et le produit contient des variantes de produit.

Nous avons décomposé la tâche comme suit:

  1. Charger les données du magasin dans les magasins
  2. Téléchargez tous les produits achetables sur Produits
  3. Configurer le chargement des paniers avec les utilisateurs selon un calendrier

Ok, allons-y. Tout d'abord, nous prenons l'essence du «magasin». Nous avons décidé d'utiliser immédiatement la version test et combat de la boutique et, selon la variable d'environnement responsable du mode maiden / prod, nous avons travaillé soit avec une boutique soit avec une autre.

Pour télécharger les données du magasin, nous frappons à une demande de publication sur / ecommerce / stores avec l'ensemble de paramètres suivant:

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

Il existe plusieurs autres options, mais tout dépend des besoins. Parce que nous n'allions pas utiliser les coordonnées du magasin dans des lettres, nous n'avons pas rempli les champs téléphone, adresse, fuseau horaire, etc.
Mais une petite surprise nous attendait. Le champ money_format semble être spécialement créé pour la possibilité de présenter le prix dans un format qui nous convient. Mais lors de la construction d'un modèle de panier abandonné, la puce électronique remplace obstinément RUB avant le numéro. Mailchimp, arrêtez!

Après le téléchargement, nous pouvons vérifier les données en utilisant la requête get à l'adresse / ecommerce / stores pour voir tous les magasins chargés, ou / ecommerce / stores / {id} pour obtenir des données sur un magasin particulier.

Vous pouvez maintenant ajouter toutes les autres données, car le magasin est le point racine de notre arbre de données, car nous téléchargerons toutes les autres données dans un magasin spécifique.

Donc, pour que L'HME puisse remplacer les marchandises dans un panier abandonné, il doit nourrir ces marchandises. Pour ce faire, nous avons l'adresse / ecommerce / stores / {store_id} / products, où nous envoyons des post-demandes de création de produits dans le système.

 [ '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', ], ], ] 

Qu'est-ce qui est si remarquable? Eh bien, premièrement, chaque produit doit comprendre au moins une offre de produit. En substance, le produit est un conteneur pour le chargement des offres de produits. De plus, l'ID du produit et de l'offre de produits peut se recouper, car ce sont des ressources différentes dans l'API MCH.

Et c'est là que la sous-estimation de la documentation de L'HME a commencé. Je devais deviner, même si ce n'était pas difficile, mais vous pouviez le faire normalement, et pas comme toujours.

Le champ poignée a été décrit comme «la poignée d'un produit». Ok, après consultation, nous avons décidé que cela faisait partie de l'URL liée au produit lui-même (cnc). Mais cela n'a été confirmé que lors des tests.

Vous pouvez également joindre un tableau d'images au produit, mais nous avons décidé qu'il ne nous serait pas utile et que seule l'image principale était chargée à la fois sur le produit et sur chaque offre de produit.

Et ici, nous avons eu un problème, pour une raison quelconque, les marchandises n'apparaissaient pas dans les modèles de diagramme de courrier.

Nous avons commencé à creuser dans le quai pour le produit. Et ils ont trouvé un champ de visibilité avec une description luxueuse:

description du champ de visibilité

Eh bien, tapez String! Et que peut-on y transférer? Pourquoi est-il impossible de décrire toutes les significations possibles?! Je peux y envoyer, par exemple, "montrez-moi les pls!".

Heureusement, il existe un exemple de demande!

exemple de demande

Eh bien, cela n'annule pas le problème. Je ne sais pas quelles autres valeurs peuvent être utiles.

Tout le monde a fait face à ça! Désormais, le responsable du marketing par e-mail peut vérifier la disponibilité des produits dans le système en créant un modèle avec la participation des produits ou tout au long des mêmes requêtes get à l'aide de la console.

Ensuite, nous sommes confrontés à la tâche de charger des paniers abandonnés dans l'HME. Au départ, 2 options me sont venues à l'esprit:

  1. Chaque fois que vous changez le panier (ajouter / supprimer des marchandises), nous répétons cette action dans MCH. Parmi les inconvénients - un grand nombre de demandes à un service externe se suggère immédiatement.
  2. Toutes les n minutes, regardez les paniers qui n'ont pas changé depuis plus d'une heure. Ensuite, nous les envoyons à L'HME. Il n'y a qu'un seul problème: garder une trace des paniers qui ont été repris après leur passage à l'HME.

Tout d'abord, nous demandons à notre base de données (ci-après dénommée la DB) nos données dans une fenêtre de 1 heure à 3. Pourquoi 3? Une heure après le dernier changement, nous envoyons le panier au système. Dans l'HME, l'intervalle minimum possible pour l'envoi du panier est de 1 heure. Par conséquent, en théorie, après 2 heures ± 5 minutes, une lettre sera envoyée. Donc 3 heures est une valeur même avec une marge.

Après avoir reçu les données de la base de données, nous faisons une demande d'obtention à l'adresse / ecommerce / stores / {store_id} / carts. Ainsi, nous obtenons tous les paniers qui se trouvent dans le système de commerce électronique et attendent leur tour d'envoyer (ou ont déjà été envoyés). Pourquoi en avons-nous besoin? Il est nécessaire pour la synchronisation avec nos données. Nous enverrons tous les paniers reçus de la base de données, mais nous devons supprimer ceux qui ne sont plus dans la plage de 1 à 3 heures. Après 3x - données déjà non pertinentes. Jusqu'à une heure - des paniers qui pourraient être renouvelés à nouveau ou passer une commande.

Pour supprimer, il suffit de trouver la différence entre les deux tableaux / collections de paniers.
Après avoir reçu les paniers à supprimer, nous envoyons une demande de suppression / ecommerce / stores / {store_id} / carts / {cart_id}.

Ensuite, nous prenons les paniers à télécharger et les envoyons par post-requêtes au système dans un cycle.

Les paramètres du panier ressemblent à ceci:

 [ '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/ panier = 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, ], ], ] 

Et encore une fois, notre rubrique préférée est «devinez comment ces champs fonctionnent». Par exemple, par la méthode de piquer scientifique, il a été révélé qu'il est possible de ne pas créer un acheteur avec une demande distincte. Il est nécessaire de transférer l'ensemble minimal de champs requis, et il sera automatiquement créé s'il n'était pas dans le système. Dans notre cas, nous nous sommes limités à id, email, opt_in_status. Le dernier paramètre est responsable de l'état de l'abonnement utilisateur dans notre fiche. Si c'est vrai, cela signifie que l'état est souscrit, sinon transactionnel.

La liste des produits est chargée sans problème via le tableau Cart Lines, qui à son tour est une ressource de l'entité Cart. C'est-à-dire nous pouvons gérer séparément cet ensemble avec des demandes de repos.

Eh bien, c'est tout, semble-t-il? Mais non.

Lors des tests, nous avons remarqué qu'envoyant le même panier, il n'est envoyé qu'une seule fois. Bien que nous l'avons supprimé du système et téléchargé à nouveau. Rien n'est dit nulle part, pas un seul mot! En conséquence, empiriquement, avec l'aide d'une mère, nous avons pris comme hypothèse qu'un panier avec le même identifiant ne peut être envoyé qu'une seule fois.

Ici, je suis entièrement d'accord avec les créateurs que cette restriction nous évite de spammer les utilisateurs. Mais écris à ce sujet! Nous n'avons pas besoin de quêtes, nous avons assez de nos erreurs mystiques dans le code que nous écrivons.

Après avoir fait tout cela, L'HME a commencé à nous envoyer de belles lettres sur le panier abandonné. Et puis une deuxième question est apparue. Si l'utilisateur a jeté le panier et est revenu de la lettre sur son propre compte, c'est-à-dire qu'il a été autorisé au moment de cliquer sur le lien, il rentrera sans problème dans son panier. Et il s'avère que la lettre dit «on! prenez votre panier! », et quand nous le traversons, nous disons:« Oups, quelque chose a été perdu! Nous n'avons rien touché! C'est lui-même! "

Il a été décidé de coder la composition du panier en une chaîne et de la transmettre à checkout_url lors de l'envoi du panier au MCH. Et quand vous allez sur le site, attrapez cette ligne, décodez et jetez toutes les marchandises dans le panier, sans oublier de le réinitialiser complètement avant cela.

Ainsi, quel que soit le navigateur auquel nous envoyons l'utilisateur, il obtient son panier, comme nous l'avions promis. Le seul point négatif est qu'il ne peut que se connecter. Mais autoriser via un lien est une mauvaise manière, et c'est en effet une entreprise dangereuse, tout d'abord pour nos clients.
Quel est le résultat? En principe, il n'y a pas eu de problème particulier lors de la mise en œuvre, car très souvent les réponses MCH ont permis de corriger les erreurs liées à la validation des champs transférés. Mais il y en aurait encore moins s'ils décrivaient normalement humainement toutes ces subtilités du travail de L'HME et décrivaient les champs plus en détail.

Configuration du rapport dans Google.Analytics


Pour suivre le succès de l'ensemble de l'opération, vous devrez configurer et consulter périodiquement le rapport dans l'analyse. Imaginez que tout le monde, comme les adultes, ait un commerce électronique connecté, sinon un miracle ne fonctionnera pas :)

Pour collecter un nouveau rapport pour un panier abandonné, accédez à "Mes rapports":

Mes rapports

"Ajouter un rapport":

Ajouter un rapport

Et après cela, nous ajoutons les paramètres que nous suivrons. Nous avons décidé de regarder le panier abandonné dans le contexte des villes, vous avez peut-être une vision différente.

Pour un mailchamp, la campagne standard pour un panier abandonné est ABANDONED_CART_EMAIL, nous le remplaçons dans le filtre et obtenons un rapport.

image

Ce sont toutes des fourchettes!

Vous êtes maintenant configuré pour envoyer le panier abandonné et un rapport par lequel vous pouvez regarder l'échappement de celui-ci. Et test, test, test! ;)

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


All Articles