Abandoned Mailchimp Basket: A Guide for the Lazy

Primero, un poco despotricando :) Tarde o temprano, cualquier tienda en línea tiene la cuestión de configurar una canasta abandonada. Las estadísticas y la sensación de pérdida de dinero chupando el estómago no ahorran a nadie.

Porcentaje de cestas abandonadas de 2006 a 2017


Porcentaje de cestas abandonadas de 2006 a 2017
Fuente

Porcentaje de cestas abandonadas para el primer trimestre de 2018 por industria:
Porcentaje de cestas abandonadas para el primer trimestre de 2018 por industria
Fuente

Al mismo tiempo, a pesar de las estadísticas generalmente disponibles, la mayoría de las tiendas en línea no utilizan las funciones disponibles y no conectan una cesta abandonada. Un reciente estudio "en casa" de EmailSoldiers muestra claramente que la mayoría de las tiendas no se preocupan en absoluto.

Estadísticas actuales de cestas abandonadas conectadas


Investigación de soldados por correo electrónico
Fuente

Al mismo tiempo, todos (y nosotros tampoco somos santos) nos ponemos al día con el tráfico, publicamos anuncios y creatividades, pero ni siquiera intentamos devolver a la persona que rompió en el último momento.

Pero en la primera iteración puede obtener un aumento en los pedidos utilizando una carta sin contenido dinámico, solo necesita configurarlo. Haga un esfuerzo solo una vez para que en el fondo traiga dinero, ¿no es esto un cuento de hadas?

Naturalmente, una carta con contenido dinámico en el que se extraen productos de la cesta puede funcionar mejor. O tal vez otro gatito con ojos tristes será más influyente para tu audiencia. O bien, lleva los productos recomendados a los productos en la canasta y observa que se compran con mayor frecuencia en cartas y aumenta el cheque promedio. O podrá obtener una serie de letras a partir de las cuales la conversión será aún mayor.

Puede mejorar y probar letras de una cesta abandonada a un ideal inalcanzable, pero cualquier letra configurada ya es incomparablemente mejor que nada.

Conversión para una cesta abandonada según RetailRocket


RetailRocket abandonó la conversión de la cesta
Fuente

Y así, el camarada Artem Aleksandrov y yo comenzamos la introducción de la canasta desde dos lados.

Implementación técnica


TOR para la integración


Describa brevemente la esencia de la tarea.

Tarea: conectar un carrito abandonado para el sitio xxx.xx con el servicio de correo Mailchimp

Repartimos todos los materiales necesarios.

Clave API: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-usXX

¿Dónde conseguir la llave?

¿Dónde conseguir la llave?

Damos un enlace a la documentación

ID de la hoja a la que conectamos la Tienda: XXXXXXXXXX

¿Dónde puedo obtener la identificación de la hoja?

¿Dónde puedo obtener la identificación de la hoja?

Se debe crear un servicio de correo por adelantado. Tan pronto como el servicio de correo recibe la solicitud de API, el mensaje se genera automáticamente y el destinatario se agrega a la cola para su envío.

Para nuestro caso, elegimos la siguiente lógica para enviar una cesta abandonada:
un usuario autorizado en el sitio agrega productos a la cesta, no completa la transacción y no completa el pedido, la cesta permanece sin cambios durante 1 hora. Después de eso, se envía una solicitud a Mailchimp, en la que se transmite el correo electrónico, la composición del pedido del usuario, las imágenes del producto, el precio de los productos y un enlace a la cesta del usuario.

Plantilla de diseño


Al crear la automatización para una cesta abandonada, el mailchim pregunta inmediatamente si habrá una o varias letras y sugiere elegir una tienda conectada.

Crear automatización para un carrito abandonado en Mailchimp

En las plantillas básicas, mch ofrece una opción de tres piezas:

Seleccione letras para una cesta abandonada de Mailchimp
  1. Cesta abandonada con bienes dinámicos
  2. Canasta abandonada con recomendaciones de comestibles (debe configurarse por separado)
  3. Cesta abandonada sin productos (solo una carta de texto)

En las mejores tradiciones, si tienes tiempo, puedes hacer la canasta tú mismo.

Los productos dinámicos sin estilos se ven así (olvídate de la sangría, aquí se muestran feos):

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

Parece que si cambia el número en la variable * | ABANDONED_CART: [$ total = 3] | * , entonces la letra mostrará una cantidad diferente de productos, pero no, al menos 5, al menos 100, el mch se niega a mostrar otra cantidad.

Y, lo que también es un poco extraño, la variable * | PRODUCTO: PRECIO | * se reemplaza con los valores de formato RUB288, y por alguna razón también es imposible cambiar esto, pero más sobre eso más adelante.

Para un cambio, tratamos de sustituir las variables con el número de juegos y con el costo total del pedido, que transmitimos a través de la API, pero el mailchimp aquí dijo que no. Bueno, que así sea.

Una palabra para el programador :)


Con mailchimp hubo una experiencia histórica de integración con su mandril de servicio de terceros, todo es simple y claro. Documentación muy amigable (por supuesto, en inglés), pero no hubo bordes ásperos y funcionó desde el primer puntapié.

Además, se ha introducido un mecanismo de suscripción a través de formularios especiales en nuestro sitio. Aquí, sentimos completamente el eufemismo y la ambigüedad de la documentación de mailchimp. El inglés no es un problema para un desarrollador experimentado, pero el conocimiento del dialecto klingon no está implícito por defecto.

Los datos iniciales son: el lenguaje php7 y el marco yii2, que ya ha crecido abrumadoramente con su ecosistema. Es decir Ya tenemos 6 pequeños proyectos que están tratando de usar componentes comunes tanto en el backend como en el front-end. En consecuencia, la implementación de cualquier tarea requiere resolver su proyecto de forma independiente, pero esto no implica independencia del marco, porque hay que pagarlo con horas humanas, de las cuales siempre hay escasez.

Habiendo recibido la tarea de integración, primero debemos mirar alrededor. ¿Qué se nos da? En primer lugar, el servicio de mailchimp con el que necesitas hacerte amigo. Vamos al github y vemos que hay muchas implementaciones. Pero la elección es simple: el paquete más popular de 1.5k estrellas ( drewm / mailchimp-api ).

El paquete proporciona un contenedor simple sobre la interacción de descanso con un mailchimp. Solo podemos adquirir esto con nuestra lógica.

En segundo lugar, se nos entrega documentación . Según la documentación, tenemos un recurso de Tienda con recursos anidados: Carrito, Cliente, Pedido, Producto, Regla de promoción. Para una cesta abandonada sin productos recomendados, solo necesitamos Producto, Carrito y Cliente. El carrito, a su vez, consiste en el conjunto de líneas del carrito, y el producto contiene variantes del producto.

Descomponemos la tarea de la siguiente manera:

  1. Subir datos de la tienda a las tiendas
  2. Descargue todos los productos que se pueden comprar en Productos
  3. Configure la carga de cestas con los usuarios en un horario

Ok, vamos En primer lugar, asumimos la esencia de la "tienda". Decidimos usar de inmediato la versión de prueba y combate de la tienda y, dependiendo de la variable de entorno responsable del modo de soltera / producto, trabajamos con una tienda o con otra.

Para descargar los datos de la tienda, llamamos a una solicitud posterior en / ecommerce / stores con el siguiente conjunto de parámetros:

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

Hay varias opciones más, pero todo depende de las necesidades. Porque no íbamos a utilizar los datos de contacto de la tienda en letras, no completamos los campos de teléfono, dirección, zona horaria, etc.
Pero nos esperaba una pequeña sorpresa. El campo money_format parece estar especialmente creado para poder presentar el precio en un formato conveniente para nosotros. Pero cuando se construye una plantilla de canasta abandonada, el mailchip sustituye obstinadamente RUB antes del número. Mailchimp, para!

Después de la descarga, podemos verificar los datos utilizando la solicitud get en la dirección / ecommerce / stores para ver todas las tiendas cargadas, o / ecommerce / stores / {id} para obtener datos en una tienda en particular.

Ahora puede agregar todos los demás datos, porque la Tienda es el punto raíz en nuestro árbol de datos, porque Subiremos todos los demás datos a una tienda específica.

Entonces, para que el MCH pueda sustituir bienes en una canasta abandonada, necesita alimentarlos. Para hacer esto, tenemos la dirección / ecommerce / stores / {store_id} / products, donde enviamos solicitudes posteriores para crear productos en el sistema.

 [ '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é es tan notable? Bueno, en primer lugar, cada producto debe consistir en al menos una oferta de producto. En esencia, Product es un contenedor para cargar ofertas de productos. Además, la identificación del producto y la oferta de productos pueden cruzarse, porque estos son recursos diferentes en la API de MCH.

Y aquí comenzó la subestimación de la documentación de MCH. Tenía que adivinar, aunque no fuera difícil, pero podías hacerlo normalmente, y no como siempre.

El campo del identificador se ha descrito como "el identificador de un producto". Ok, después de consultar, decidimos que esto es parte de la URL relacionada con el producto en sí (cnc). Pero esto se confirmó solo durante las pruebas.

También puede adjuntar una serie de imágenes al producto, pero decidimos que no sería útil para nosotros y, por lo tanto, solo la imagen principal se cargó tanto en el producto como en cada oferta de producto.

Y aquí tuvimos un problema, por alguna razón, los productos no aparecían en las plantillas de correo.

Comenzamos a cavar en el muelle de Producto. Y encontraron un campo de visibilidad con una lujosa descripción:

descripción del campo de visibilidad

Bueno, escribe String! ¿Y qué se puede transferir allí? ¿Por qué es imposible describir todos los significados posibles? Puedo enviar allí, por ejemplo, "¡muéstrame por favor!".

Afortunadamente hay una solicitud de ejemplo!

solicitar ejemplo

Bueno, esto no cancela el problema. No sé qué otros valores pueden ser útiles.

¡Todos se las arreglaron con esto! Ahora, el comercializador de correo electrónico puede verificar la disponibilidad de productos en el sistema mediante la creación de una plantilla con la participación de productos o todo a través de las mismas solicitudes de obtención que utilizan la consola.

A continuación, nos enfrentamos a la tarea de cargar cestas abandonadas en el MCH. Inicialmente, me vinieron a la mente 2 opciones:

  1. Cada vez que cambia la cesta (agregar / quitar productos), repetimos esta acción en MCH. De las desventajas, se sugiere inmediatamente una gran cantidad de solicitudes a un servicio externo.
  2. Una vez cada n minutos, observe las canastas que no han cambiado hace más de una hora. Luego los enviamos al MCH. Solo hay un problema: hacer un seguimiento de las canastas que se reanudaron después de que fueron al MCH.

Primero, solicitamos a nuestra base de datos (en lo sucesivo, DB) nuestros datos en una ventana de 1 hora a 3. ¿Por qué 3? Una hora después del último cambio, enviamos la cesta al sistema. En el MCH, el intervalo mínimo posible para enviar la cesta es de 1 hora. Por lo tanto, en teoría, después de 2 horas ± 5 minutos, se enviará una carta. Entonces 3 horas es un valor incluso con un margen.

Después de recibir los datos de la base de datos, hacemos una solicitud de obtención en la dirección / ecommerce / stores / {store_id} / carts. Por lo tanto, obtenemos todas las cestas que se encuentran en el sistema de comercio electrónico y están esperando su turno para enviar (o ya se han enviado). ¿Por qué necesitamos esto? Es necesario para la sincronización con nuestros datos. Enviaremos todas las cestas recibidas de la base de datos, pero debemos eliminar aquellas que ya no se encuentren en el rango de 1-3 horas. Después de 3x: datos ya irrelevantes. Hasta una hora: cestas que podrían renovarse nuevamente o hacer un pedido.

Para eliminar, solo necesitamos encontrar la diferencia entre las dos matrices / colecciones de cestas.
Después de recibir las cestas que deben eliminarse, enviamos una solicitud de eliminación / ecommerce / stores / {store_id} / carts / {cart_id}.

A continuación, tomamos las cestas para descargar y las enviamos por solicitud posterior al sistema en un ciclo.

Los parámetros de la cesta se parecen a esto:

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

Y nuevamente, nuestra rúbrica favorita es "adivina cómo funcionan estos campos". Por ejemplo, por el método de búsqueda científica, se reveló que es posible no crear un comprador con una solicitud por separado. Es necesario transferir el conjunto mínimo requerido de campos, y se creará automáticamente si no estaba en el sistema. En nuestro caso, nos limitamos a id, email, opt_in_status. El último parámetro es responsable del estado de suscripción del usuario en nuestra hoja. Si es cierto, esto significa que el estado está suscrito, de lo contrario transaccional.

La lista de productos se carga sin problemas a través de la matriz Cart Lines, que a su vez es un recurso de la entidad Cart. Es decir Podemos gestionar este conjunto por separado con solicitudes de descanso.

Bueno, eso es todo, ¿parece? Pero no

Al realizar la prueba, notamos que al enviar la misma canasta, se envía solo una vez. Aunque lo eliminamos del sistema y lo descargamos nuevamente. ¡Nada se dice en ninguna parte, ni una sola palabra! Como resultado, empíricamente, con la ayuda de alguna madre, tomamos como base la hipótesis de que una canasta con la misma identificación solo se puede enviar una vez.

Aquí estoy completamente de acuerdo con los creadores en que esta restricción nos evita enviar spam a los usuarios. ¡Pero escribe sobre eso! No necesitamos misiones, tenemos suficientes errores místicos en el código que escribimos.

Después de hacer todo esto, el MCH comenzó a enviarnos hermosas cartas sobre la canasta abandonada. Y luego apareció una segunda pregunta. Si el usuario arrojó la canasta y regresó de la carta a su propia cuenta, es decir, se le autorizó al momento de hacer clic en el enlace, luego ingresará a su canasta sin problemas. Y resulta que la carta dice "¡encendido! ¡recupera tu cesta! ", y cuando la cruzamos, decimos:" ¡Uy, algo se perdió! ¡No tocamos nada! ¡Es en sí mismo!

Se decidió codificar la composición de la cesta en una cadena y pasarla a checkout_url al enviar la cesta al MCH. Y cuando vaya al sitio, tome esta línea, decodifique y arroje todos los productos en la canasta, sin olvidar reiniciarla por completo antes de eso.

Por lo tanto, no importa a qué navegador le enviemos al usuario, él recibe su cesta, como prometimos. Lo único negativo es que solo puede iniciar sesión. Pero autorizar a través de un enlace es de mala educación, y de hecho es un negocio peligroso, en primer lugar para nuestros clientes.
Cual es el resultado? En principio, no hubo problemas particulares durante la implementación, ya que muy a menudo las respuestas de MCH ayudaron con errores relacionados con la validación de los campos transferidos. Pero habría incluso menos de ellos si normalmente describieran humanamente todas estas sutilezas del trabajo del MCH y describieran los campos con más detalle.

Configuración de informes en Google.


Para realizar un seguimiento del éxito de toda la operación, deberá configurar y ver periódicamente el informe en análisis. Imagine que todos, como los adultos, tienen un comercio electrónico conectado; de lo contrario, un milagro no funcionará :)

Para recopilar un nuevo informe para una cesta abandonada, vaya a "Mis informes":

Mis informes

Además "Agregar informe":

Agregar informe

Y después de eso agregamos los parámetros que rastrearemos. Decidimos que miraríamos la canasta abandonada en el contexto de las ciudades, es posible que tenga una visión diferente.

Para un mailchamp, la campaña estándar para una cesta abandonada es ABANDONED_CART_EMAIL, la sustituimos en el filtro y obtenemos un informe.

imagen

Eso es todo tenedores!

Ahora está configurado para enviar la cesta abandonada y un informe mediante el cual puede ver el escape de la misma. Y prueba, prueba, prueba! ;)

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


All Articles