Les rabais sur Shopify en 2023

Les rĂ©ductions sur Shopify ont toujours Ă©tĂ© un peu maladroites. Faciles Ă  utiliser et Ă  comprendre, mais pas assez flexibles pour faire quoi que ce soit d’extraordinaire. Le lancement de Shopify Functions pour les RĂ©ductions plus tĂŽt cette annĂ©e promettait de rĂ©soudre ce problĂšme une fois pour toutes. Cependant, son utilisation implique la crĂ©ation d’une application personnalisĂ©e, ce qui est bien plus complexe que mes bien-aimĂ©s, mais obsolĂštes Scripts Shopify. Et dans les deux cas, Shopify Plus Ă©tait nĂ©cessaire, ce qui n’est pas accessible Ă  tout le monde.

Il y a quelques semaines, j’ai dĂ©couvert une application publique qui utilise les Fonctions Shopify pour les RĂ©ductions en interne, et qui ouvre toute la logique des rĂ©ductions complexes Ă  tout le monde. Étant une application publique, elle peut aussi ĂȘtre utilisĂ©e sur tous les plans Shopify! Voici Discount Kit.

En plus d’utiliser les fonctionnalitĂ©s de rĂ©duction natives et de permettre aux marchands de rĂ©aliser des rĂ©ductions en volume de produits, des cadeaux avec achat et des objectifs de commande (ajoutĂ©s automatiquement au panier sans intervention du client!), elle ouvre les fonctionnalitĂ©s des Fonctions Shopify avec la fonction “RĂ©duction PersonnalisĂ©e”. J’ai eu la chance de participer Ă  la bĂȘta et, d’aprĂšs mes tests, cela fonctionne Ă  merveille!

Un exemple de rĂ©duction qui Ă©tait toujours impossible ou extrĂȘmement compliquĂ© pour le client Ă©tait d’avoir diffĂ©rentes rĂ©ductions sur diffĂ©rents produits dans le mĂȘme panier. C’Ă©tait possible depuis l’annĂ©e derniĂšre, lorsque la superposition de rĂ©ductions a Ă©tĂ© introduite, mais c’Ă©tait un enfer pour le client, qui devait entrer diffĂ©rents codes les uns aprĂšs les autres Ă  la caisse.

Les rĂ©ductions personnalisĂ©es vous permettent de le faire en 2 minutes. Point bonus : cela se fait dans l’interface de rĂ©duction rĂ©elle, donc vous n’avez pas Ă  jongler entre les rĂ©ductions natives et les rĂ©ductions d’applications! Voici Ă  quoi cela ressemble:

Maintenant, la stratĂ©gie d’application “Tout” est toujours en bĂȘta et a quelques bizarreries, comme n’afficher que le premier message. Je comprends que c’est une limitation de l’API de RĂ©ductions Shopify pour le moment, donc cela devrait ĂȘtre corrigĂ© prochainement. La rĂ©partition rĂ©elle de la rĂ©duction fonctionne bien, c’est ce qui compte!

Avec cela, je peux dire avec confiance que les rĂ©ductions ne sont plus un point faible sur Shopify. Cette application a toutes les fonctions de l’API de Fonctions de RĂ©duction avec une interface utilisateur Ă©lĂ©gante, et leur support est excellent. Elle peut Ă©galement ĂȘtre utilisĂ©e sur tous les plans Shopify, ce qui est gĂ©nial!

Une petite parenthĂšse pour les dĂ©veloppeurs (les non-dĂ©veloppeurs peuvent sauter cela), ils incluent Ă©galement une API JS cĂŽtĂ© client pour construire dessus. C’est encore une construction prĂ©liminaire et elle ne prend pas en charge les RĂ©ductions PersonnalisĂ©es (pour le moment), mais elle donne accĂšs Ă  toutes les rĂ©ductions actives lors d’un Ă©vĂ©nement nommĂ© ‘discount_kit:engine_result’. Voici Ă  quoi cela ressemble:

Avec cela, vous pouvez construire tout ce dont vous avez besoin en rapport avec l’affichage des rĂ©ductions dans le thĂšme, que ce soit pour afficher les rĂ©ductions disponibles dans le panier, les tableaux de rĂ©ductions en volume sur la page produit, ou n’importe quoi d’autre, vraiment. Les donnĂ©es sont lĂ !

Allez l’essayer pendant la pĂ©riode d’essai gratuite! Je parie que vous la garderez une fois celle-ci terminĂ©e.

Black Friday – Tactiques Classiques et alternatives pour 2021

Le Black Friday 2021 s’en vient. Le 26 novembre, pour ĂȘtre exact. Dans moins d’un mois. Populaire depuis 2012 au Canada, vos clients s’attendent Ă  une communication de votre part durant cette pĂ©riode.  

Moment crucial de l’annĂ©e pour tous les marchands en ligne, il est source d’angoisse profonde pour ceux mal prĂ©parĂ©s, et d’excitation pour ceux prenant de l’avance. Essayons de vous faire tomber dans le 2e camps avec ce petit article, oĂč je vous prĂ©senterai les tactiques « classiques Â» de cette promotion, ainsi que certaines tactiques alternatives pour se dĂ©marquer de la cohue.

Tout d’abord, le calendrier « officiel Â» de cette promotion :

  • Thanksgiving – Jeudi, 25 novembre
  • Black Friday – Vendredi, 26 novembre
  • La fin de semaine du Black Friday – Samedi et Dimanche, 27-28 novembre
  • Cyber Monday – Lundi, 29 novembre

Au Canada, le jeudi est moins important qu’aux États-Unis, puisque les Canadiens ne sont pas en congĂ© comme leurs voisins du Sud. Je l’inclus dans le calendrier pour ceux qui auraient des ventes importantes aux É-U, mais la tactique classique ne sera pas axĂ©e sur les ventes lors de cette journĂ©e.

Voici donc la tactique, le minimum Ă  rĂ©aliser pour votre Black Friday 2021! Celle-ci se concentre sur quatre canaux : email, social, direct et paid. Il s’agit ici du minimum, ce qui ne veux pas dire que vous ne pouvez pas faire plus! Nous discuterons de plusieurs idĂ©es plus loin.

La recette minimale pour un Black Friday réussi

Thanksgiving – Jeudi, 25 novembre

C’est le moment de crĂ©er de l’anticipation pour votre offre. Ne vendez pas le punch! Restez mystĂ©rieux, mais donnez assez d’indices pour que vos fans les plus fidĂšles aient une bonne idĂ©e de ce qui s’en vient.

Canal Email : Envoyez un teaser de votre offre du lendemain par courriel Ă  votre liste complĂšte. Si vous avez un segment VIP, vous pouvez ouvrir votre offre d’avance Ă  ce segment seulement.

Canal Social : Publiez le mĂȘme teaser sur tous vos canaux sociaux.

Canal Direct : Changez votre « Hero Image Â» de page d’accueil pour le teaser de votre offre.

Canal Paid : Amplifiez votre publication du canal social Ă  une audience de reciblage.

Black Friday & Fin de semaine – Vendredi, 26 novembre au dimanche 28 novembre

Canal Email : Envoyez votre offre Ă  votre liste complĂšte le vendredi, puis un rappel le samedi et le dimanche. Segmentez votre liste pour les rappels du samedi et du dimanche pour exclure ceux qui ont dĂ©jĂ  interagi avec vous (soit via une ouverture de courriel, un clic, ou un achat, dĂ©pendant si vous voulez ĂȘtre trĂšs agressifs ou non)

Canal Social : Publiez votre offre sur tous vos canaux sociaux, ainsi qu’un rappel le samedi et le dimanche. Si vous pouvez, ajoutez un sentiment d’urgence par une possibilitĂ© de rupture de stocks, de dĂ©lais de livraison, ou encore simplement en mentionnant que l’offre prends fin bientĂŽt.

Canal Direct : Changez votre « Hero Image Â» de page d’accueil pour celle de votre offre. N’oubliez pas de clairement indiquer la date de fin pour augmenter le sentiment d’urgence.

Canal Paid : Amplifiez votre publication du canal social Ă  une audience de reciblage. Si vous faites des publicitĂ©s d’acquisition Google Ads durant cette pĂ©riode, ajoutez votre code promo et date de fin comme Ad Extension sur vos publicitĂ©s texte, et mettez Ă  jour votre flux de donnĂ©es (si pas connectĂ© directement) dans le cas oĂč vous faites aussi du Google Shopping.

Cyber Monday – Lundi, 29 novembre

C’est le moment de faire une nouvelle offre, diffĂ©rente de celle que vous aviez durant la fin de semaine, et qui dure seulement durant la journĂ©e, une « flash sale Â».

Il faut faire attention, toutefois, de ne pas faire quelque chose de meilleur que ce que vous aviez durant la fin de semaine. En effet, cela crĂ©erait de la frustration chez votre clientĂšle. L’idĂ©al est de crĂ©er une offre qui est complĂ©mentaire et/ou distincte. Par exemple, si vous avez offert 25% de rabais sur tout en magasin (pas idĂ©al comme offre – voir plus loin) durant la fin de semaine, vous pourriez faire une offre d’un cadeau avec un achat minimal pour le lundi. Ainsi, quelqu’un qui a profitĂ© du 25% durant la fin de semaine pourrait acheter Ă  nouveau le lundi afin de profiter de la nouvelle offre.

Canal Email : Envoyez votre offre Ă  votre liste complĂšte. Si c’est pertinent, vous pouvez personnaliser le message entre les acheteurs de la fin de semaine et les non-acheteurs.

Par exemple, les acheteurs de la fin de semaine reçoivent un courriel avec le titre « Merci pour votre achat chez XYZ! Voici une nouvelle offre juste pour vous Â» alors que les non-acheteurs reçoivent un courriel avec le titre « Notre offre du Cyber Monday Ă  l’intĂ©rieur, valide aujourd’hui seulement! Â».

Canal Social : Publiez votre offre sur tous vos canaux sociaux. N’oubliez pas de mentionner que l’offre est valide aujourd’hui seulement.

Canal Direct : Changez votre « Hero Image Â» de page d’accueil pour celle de votre offre. N’oubliez pas de mentionner que l’offre est valide aujourd’hui seulement.

Canal Paid : Amplifiez votre publication du canal social Ă  une audience de reciblage. Si vous faites des publicitĂ©s d’acquisition Google Ads durant cette pĂ©riode, ajoutez votre code promo et date de fin comme Ad Extension sur vos publicitĂ©s texte, et mettez Ă  jour votre flux de donnĂ©es (si pas connectĂ© directement) dans le cas oĂč vous faites aussi du Google Shopping.

Qu’est-ce qu’une bonne offre?

Maintenant, avant d’aller dans les tactiques alternatives la grande question est, qu’est-ce qu’une bonne offre? Il est important d’y rĂ©flĂ©chir car vous serez en compĂ©tition avec toutes les autres offres sur le marchĂ©. GĂ©nĂ©ralement, je conseille de faire une ou des offres de 20-40% sur des catĂ©gories spĂ©cifiques, et des offres jusqu’à 50% sur des produits spĂ©cifiques. Par exemple, si vous ĂȘtes un marchand de vĂȘtements, vous pourriez offrir 20% sur une collection que vous vendez dĂ©jĂ  trĂšs bien, question de mousser ses ventes sans la dĂ©valuer, un 30% sur une collection que vous aimeriez voir bouger un peu plus, et un 40% sur la collection d’étĂ© qui, Ă©videmment Ă  l’automne, ne bouge pas du tout. Par-dessus tout ça, vous pouvez offrir du 50% sur des produits particuliers « DerniĂšre chance Â» qui ne reviendront jamais en stock.

Une chose Ă  ne pas faire, jamais au grand jamais, est d’offrir un rabais majeur « store-wide Â» – par exemple, offrir 50% de rabais sur tout. Je le spĂ©cifie car je le vois, mais cette tactique, bien qu’elle va Ă©videmment ramener des ventes, a deux faiblesses majeures. La premiĂšre, et la plus grave, est qu’elle envoie le message que votre marge de profit sur tous vos produits est assez grande pour vous permettre de les vendre Ă  moitiĂ© prix. Les consommateurs comprennent alors qu’ils surpaient pour votre produit, et leur perception de qualitĂ© en est grandement diminuĂ©e. Ensuite, offrir un « rabais sur tout Â», en termes de communication, ne dis pas c’est un rabais sur quoi, exactement. La rĂ©alitĂ© est que vos clients ne connaissent pas si bien vos produits. Toutefois, si vous faites un rabais sur une catĂ©gorie (Les pantalons de sport de marque XYZ Ă  20% de rabais!), vous venez de crĂ©er une association que la marque XYZ vends des pantalons de sport. Une occasion ratĂ©e si vous avez fait un rabais sur tout.

Maintenant que ce faux-pas est derriĂšre nous, il est toujours prĂ©fĂ©rable d’ĂȘtre crĂ©atif dans ses promotions, plutĂŽt que de toujours se retourner vers un pourcentage de rabais. Les « Buy X, Get Y Â» sont une bonne façon de se dĂ©marquer, en offrant un produit complĂ©mentaire. Par exemple :

  • Achetez une paire de lunettes, obtenez un traitement anti-rayures gratuit
  • Achetez des chaussures de sport, obtenez une sĂ©ance d’entrainement personnalisĂ©e de 30 minutes
  • Achetez un systĂšme de son, obtenez le cĂąblage gratuitement

Remarquez que ces offres ont l’avantage d’informer le client sur vos produits ou services complĂ©mentaires. Peut-ĂȘtre que le client du magasin de chaussures de sport n’avait aucune idĂ©e de l’existence d’un service d’entrainement personnalisĂ©. MĂȘme s’il ne profite pas de l’offre, vous aurez informĂ© vos clients de l’existence de ce service.

Si votre marque est axĂ©e sur le « social good Â» avec des valeurs environnementales, et que votre audience s’identifie bien Ă  cette valeur, vous avez probablement peur de les aliĂ©ner avec votre participation au Black Friday, qui est perçu (avec raison) comme la fĂȘte de la surconsommation. Une offre durant laquelle vous augmentez votre impact positif en mĂȘme temps que vous donnez un petit quelque chose au client pourrait alors ĂȘtre trĂšs efficace. Par exemple, une marque qui plante 10 arbres par chandail plantĂ© (tousse-tentree-tousse) pourrais offrir 10% de rabais sur sa collection de t-shirt, mais planter 50 arbres par t-shirt au lieu des 10 habituels. Une pierre deux coups : augmentation des ventes, augmentation des arbres, tout le monde y gagne!  

Enfin, lorsque vous Ă©laborez vos offres, ayez en tĂȘte l’objectif qu’il soit facile d’atteindre votre seuil de livraison gratuite[1]. Si votre seuil est assez Ă©levĂ©, vous pouvez aussi le baisser durant la pĂ©riode du Black Friday – n’oubliez pas de le communiquer!

Tactiques créatives pour se démarquer

Le problĂšme principal Ă  surmonter durant la fin de semaine du Black Friday est le bruit ambiant. Tout le monde crie sur les toits qu’ils ont la meilleure offre, et la compĂ©tition pour l’attention du consommateur est fĂ©roce. Durant cette fin de semaine (et mĂȘme la semaine avant), le prix du paid media ainsi que le nombre de courriels promotionnels envoyĂ©s augmentent de façon significative, et la portĂ©e organique sociale diminue. L’attention et le budget du consommateur, eux, restent toutefois fixe.

Voici certaines idĂ©es Ă  essayer cette annĂ©e, afin de tirer son Ă©pingle du jeu. Un bĂ©mol, toutefois – ces tactiques prennent toutes « de l’avance Â» sur l’évĂ©nement, et pourraient affecter vos ventes actuelles. En effet, les consommateurs vont reporter leur consommation s’ils s’attendent Ă  un rabais Ă  court terme.

Créer un événement Facebook pour le Black Friday

CrĂ©ez un Ă©vĂ©nement Facebook 2-3 semaines d’avance avec un teaser de votre offre, en spĂ©cifiant que les dĂ©tails seront rĂ©vĂ©lĂ©s le matin du Black Friday. Puis, mettez un budget de paid media en reciblage (et en acquisition si nĂ©cessaire) Ă  l’avance pour que les consommateurs rĂ©pondent qu’ils sont intĂ©ressĂ©s.

Cette tactique permet de crĂ©er de l’excitation pour l’offre Ă  venir, tout en profitant d’un paid media Ă  prix normal. De plus, Facebook va envoyer un push notification (gratis!) le jour de l’évĂ©nement Ă  tout ceux ayant rĂ©pondu qu’ils seraient prĂ©sents. Une bonne maniĂšre de sortir du lot Ă  plus petit prix!

Envoyer l’offre 24h d’avance aux abonnĂ©s SMS

Deux ou trois semaines Ă  l’avance, faites une campagne d’inscription aux SMS via des Lead Ads Facebook, un pop-up sur votre site, ainsi qu’un envoi Ă  votre liste de courriels, informant les clients qu’ils recevront vos offres du Black Friday 24h Ă  l’avance. Le taux d’ouverture des SMS frise les 100%, et sont encore peu utilisĂ©s de maniĂšre promotionnelle. Il s’agit du canal le plus direct pour traverser la cohue de communication du Black Friday.

Attention, toutefois – votre offre doit ĂȘtre communiquable de maniĂšre courte et prĂ©cise. Ce n’est pas le moment du roman-fleuve (comme ce billet!)

Faire une campagne « Sponsored Messages » sur Facebook Messenger

Deux ou trois semaines d’avance, crĂ©ez une publicitĂ© d’interaction avec vous sur Messenger, avec la promesse de connaitre votre offre Black Friday le jour mĂȘme et un teaser de cette offre. Vous pouvez faire une expĂ©rience sympathique via un chatbot, mais ce n’est pas requis. Vouis pouvez gĂ©rer les messages « Ă  la mitaine Â», aussi.

Puis, activez une campagne « Sponsored Messages Â» durant la fin de semaine du Black Friday pour informer tous les clients ayant interagi avec vous dans la derniĂšre annĂ©e (!!!), incluant ceux de la campagne mentionnĂ©e au paragraphe prĂ©cĂ©dent, de votre offre.

Ce placement est nouveau depuis cette annĂ©e, donc je n’ai pas encore eu l’occasion de l’essayer, mais il semble extrĂȘmement prometteur. J’ai hĂąte de l’utiliser!

Conclusion

Ce petit guide ne se veut ni exhaustif, ni universel. Toutefois, il donne une direction et des idĂ©es afin de faire de votre Black Friday 2021 un succĂšs! Avez-vous d’autres idĂ©es Ă  proposer pour cette annĂ©e? Laissez-les ci-dessous en commentaire!  


[1] Si vous n’offrez pas la livraison gratuite à partir d’un certain montant, ignorez ce guide et allez d’abord offrir ce must.

Créer un catalogue de produits multilangues sur Facebook via Shopify, grùce aux nouveaux Localized Language Feeds

Il n’y a pas si longtemps, il fallait crĂ©er un catalogue par langue pour utiliser toute la puissance des publicitĂ©s de produits dynamique (Dynamic Product Ads – DPA) dans un marchĂ© bilingue comme le QuĂ©bec.

Plus maintenant! Une nouvelle fonctionnalitĂ© lancĂ©e cette annĂ©e permet maintenant d’ajouter un feed supplĂ©mentaire au feed principal, qui vient remplaçer les valeurs affectĂ©es par la langue (ex. le titre, le lien, la description) tout en conservant les valeurs qui ne le sont pas (ex. le prix, les photos). En gros, c’est un simple « Join Â» sur le ID du produit, qui va ajouter l’information de langue au feed principal.

Malheureusement, la documentation de Facebook est dĂ©ficiente et ne donne des instructions que pour le tĂ©lĂ©versement d’un fichier csv statique. Pour ceux qui me connaissent, j’ai horreur des tĂąches manuelles, et je me suis donc lancĂ© dans la crĂ©ation d’un feed RSS via un template Shopify, qui afficherait les bonnes informations et qui serait mis-Ă -jour Ă  toutes les heures.

Le rĂ©sultat? Enfin, la possibilitĂ© de faire UN SEUL CRÉATIF dans UN SEUL AD SET dans UNE SEULE CAMPAGNE pour une publicitĂ© DPA qui va cibler un marchĂ© bilingue comme le QuĂ©bec, au lieu de le faire avec des catalogues diffĂ©rents, ce qui impliquait une duplication des campagnes pour ĂȘtre en mesure de cibler par langue. Vous n’aurez qu’à crĂ©er vos variations de langue dans l’option « Add Languages Â» du gestionnaire de publicitĂ©, et le tour sera jouĂ©!

PrĂȘts Ă  commençer? Attachez votre tuque, on se lance!

Pour suivre ce tutoriel, vous aurez besoin de :

  1. Shopify
  2. Langify V2 (Ne fonctionne pas sur V1, désolé!)
  3. Un catalogue de produit mis-à-jour via data feed (L’app Facebook fonctionne bien pour ça)

La premiĂšre Ă©tape est de crĂ©er votre feed de langue. Celui-ci va ĂȘtre créé Ă  l’aide d’un template et d’une collection personnalisĂ©e.

Allez dans l’éditeur de code Shopify, et crĂ©ez un nouveau template de collection. Dans celui-ci, copiez collez le code ci-dessous, compatible pour Anglais et Français seulement, mais c’est assez simple de rajouter des langues si nĂ©cessaires via la section <override>. Ce template est fortement inspirĂ© par l’article de blog « DIY Facebook Product Feed for Shopify Â»

{% layout none %}<?xml version="1.0"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
{%- paginate collection.products by 1000 -%}
{%- if shop.currency == 'CAD' -%}{%- assign CountryCode = 'CA' -%}{%- endif -%}
{%- assign PriceAdjustment = 1.0 -%}
{%- assign PriceAdjustmentEffectiveDate =  '20181226T080000-0500/20190102T235900-0800' -%}

<channel>
<title>{{ shop.name }} {{ collection.title | replace: '&', '&amp;' }}</title>
<link>{{ shop.url }}</link>
<description>{{ collection.description | strip_html }}</description>
{%- for product in collection.products -%} 
  {%- for variant in product.variants -%}
    {%- for option in product.options -%}
  	  {%- if option == 'Color' -%}{% capture Color %}{{ variant.options[forloop.index0] }}{% endcapture %}
  	  {%- elsif option == 'Size' -%}{% capture Size %}{{ variant.options[forloop.index0] }}{% endcapture %}
  	  {%- endif -%}
    {%- endfor -%}

<item>    
<override>{% if shop.locale contains "fr" %}fr_XX{% elsif shop.locale contains "en" %}en_XX{% endif %}</override>
<title>{{ product.title | strip_html | strip_newlines | replace: '&', '&amp;' }}{% unless product.title contains Color %} {{ Color | replace: '&', '&amp;' }}{% endunless %}</title>
<link>{{ shop.url }}{{ variant.url }}</link>
<description>{{ product.title | strip_html | strip_newlines | replace: '&', '&amp;' }} {{ variant.title | strip_html | strip_newlines | replace: '&', '&amp;' }} {{ product.description | replace: '</', ' </' | strip_html | strip_newlines | replace: '&', '&amp;' }}</description>
<g:item_group_id>{{ product.id }}</g:item_group_id>
<g:id>{{ variant.id }}</g:id>
{% unless Color == "" %}<g:color>{{ Color | strip_html | strip_newlines | replace: '&', '&amp;' }}</g:color>{% endunless %}
{% unless Size == "" %}<g:size>{{ Size | strip_html | strip_newlines | replace: '&', '&amp;' }}</g:size>{% endunless %}
<g:custom_label_0>{{ product.metafields.mm-google-shopping.custom_label_0 }}</g:custom_label_0>
<g:custom_label_1>{{ product.metafields.mm-google-shopping.custom_label_1 }}</g:custom_label_1>
<g:custom_label_2>{{ product.metafields.mm-google-shopping.custom_label_2 }}</g:custom_label_2>
<g:custom_label_3>{{ product.metafields.mm-google-shopping.custom_label_3 }}</g:custom_label_3>
<g:custom_label_4>{{ product.metafields.mm-google-shopping.custom_label_4 }}</g:custom_label_4>
</item>

  {% endfor %}
{% endfor %}
</channel>
</rss>
{% endpaginate %}

Sauvegardez votre nouveau template, puis allez ensuite crĂ©er une nouvelle collection. Ajoutez tous les produits de votre boutique Ă  la collection, puis choisissez le template que vous venez de crĂ©er :

Une fois que c’est fait, vous pouvez cliquer sur « View Â» pour ĂȘtre redirigĂ© vers l’url de votre nouveau data feed! La structure d’url ressemblera Ă  https://<DOMAIN>.<TLD>/collections/<NOM COLLECTION>. Vous pouvez faire un clic-droit et choisir « View Source Â» si vous voulez que votre fichier XML soit affichĂ© avec un formatage pour les humains.

Vous devez ensuite changer votre url en rajoutant le préfixe ou suffixe du choix de langue, ex.

https://fr.<DOMAIN>.<TLD>/collections/<NOM COLLECTION>

https://<DOMAIN>.<TLD>/fr/collections/<NOM COLLECTION>

Je rappelle que cette mĂ©thode ne fonctionne qu’avec Langify V2, qui va chercher les traductions avec l’API GraphQL. Possiblement que ça peut marcher avec d’autres apps qui utilisent GraphQL, mais je n’ai pas testĂ©.

Votre feed va ressembler Ă  ça :

Maintenant que vous ĂȘtes rendus la, vous devez aller ajouter votre feed dans votre gestionnaire de catalogue, sur le feed dĂ©jĂ  installĂ©. Vous allez dans vos Data Sources, puis cliquez sur Add New Feed, puis vous suivez les Ă©tapes aprĂšs « Add Language Information Â» oĂč les Ă©tapes seront les mĂȘmes qu’un feed standard. Vous verrez finalement apparaitre cet Ă©cran magique qui vous confirme que vous avez ajoutĂ© la localisation de la langue Ă  votre data feed :

Et bang! Juste comme ça, vous allez pouvoir simplifier vos campagnes publicitaires. Pour tous ceux qui ont de plus petits budgets, et qui sont souvent pris dans le « Learning Phase Â» de leurs Ad Sets, ça peut Ă©normĂ©ment aider Ă  la performance de vos publicitĂ©s, car tous votre budget ira dans un seul Ad Set, ce qui permettra Ă  Facebook de mieux optimiser selon votre objectif.

J’espĂšre que ce mini tutoriel vous viendra en aide! N’hĂ©sitez pas Ă  rĂ©pondre en commentaire si vous avez des questions.

Références:
Create a Country or Language Feed for a Catalog
https://www.facebook.com/business/help/2144286692311411?id=725943027795860
Localized Catalog Setup
https://developers.facebook.com/docs/marketing-api/catalog/localized-catalog/localized-catalog-setup/#feed-format-lang
Reference – Catalog – Supported Fields — Localized Catalogs
https://developers.facebook.com/docs/marketing-api/catalog/reference#loc-cat-fields
Reference – Catalog – Supported Feed Formats
https://developers.facebook.com/docs/marketing-api/catalog/reference#loc-cat-fields

Stratégie de marketing numérique pour PME

Qu’est-ce que le point de dĂ©part d’une stratĂ©gie de marketing numĂ©rique ? C’est d’abord de dĂ©terminer les Ă©tapes qu’on doit prendre afin d’atteindre un objectif prĂ©cis. En effet, la stratĂ©gie offre une direction Ă  l’implĂ©mentation de tactiques de marketing efficaces. Il faut se dire qu’il n’y a pas de mauvaise action de marketing (bon, peut-ĂȘtre que faire du keyword spamming avec du texte blanc sur fond blanc, ou du follow-unfollow sur Instagram n’est pas la meilleure idĂ©e), mais il y a toute la question du coĂ»t d’opportunitĂ©. Si on fait une chose, on est pas en train d’en faire une autre. Tiens, dans mon cas (mĂȘme si je ne suis pas une PME), je fais prĂ©sentement du marketing de contenu, mais je ne peux pas faire autre chose en mĂȘme temps (oups la comptabilitĂ© qui traine !).

Il faut donc prendre les actions qui auront le plus grand retour pour le plus faible effort en premier. On ne va pas implanter un CRM avant d’avoir fait de simples campagnes de marketing par courriel. On ne va pas essayer de vendre notre produit en France si on n’a pas saturĂ© notre marchĂ© au QuĂ©bec. Ainsi de suite ! Ca peut sembler Ă©vident, mais j’ai souvent vu des entreprises mettre « la charrue avant les bƓufs Â» et s’embourber dans des projets impossibles alors que la base n’était pas encore atteinte.

Sans plus tarder, je vous offre mon plan stratĂ©gique de base pour une entreprise avec une image de marque bien dĂ©finie et reconnue dans son domaine (je n’entre pas dans le brand buidling ici !) qui souhaite vendre un produit aux attributs peu diffĂ©renciĂ©s, et qui vĂ©hicule son avantage concurrentiel Ă  travers sa marque.

Le framework utilisé pour la réflexion

Pour crĂ©er une stratĂ©gie, j’utilise le modĂšle classique AIDA que tout le monde connait, intuitivement ou formellement, faisant partie de la famille des nombreux modĂšles de hiĂ©rarchie des effets. Celui-ci postule qu’un individu doit passer par quatres Ă©tapes avant de faire un achat : Awareness, Interest, Desire, Action – en français : Connaissance, IntĂ©rĂȘt, DĂ©sir, Action.

Le classique entonnoir de conversion selon le modĂšle AIDA – CC BronHiggs : Wikipedia

Ce modĂšle Ă©tant tellement vĂ©hiculĂ© partout, plusieurs personnes l’appliquent de maniĂšre inconsciente en rĂ©flĂ©chissant au chemin complet du consommateur. Une rĂ©flexion commune serait la suivante : je dois faire circuler ma marque devant un consommateur afin qu’il me connaisse. Une fois que le consommateur me connait, je peux intĂ©resser celui-ci de maniĂšre cognitive Ă  mon produit en lui prĂ©sentant ses avantages concurrentiels durables. Une fois qu’il est intĂ©ressĂ©, je peux m’adresser Ă  lui de maniĂšre affective de maniĂšre Ă  crĂ©er le dĂ©sir envers ma marque. Enfin, je peux l’amener Ă  l’action par des activitĂ©s promotionnelles, ou par des contacts rĂ©guliers dans l’espoir de l’atteindre au moment oĂč il est prĂȘt Ă  passer Ă  l’action.

Cette maniĂšre de penser semble tout Ă  fait logique et efficace. Il faut bien que le client connaisse notre entreprise avant d’ĂȘtre en mesure d’acheter ! Toutefois, pour une PME, ceci est fondamentalement faux pour une seule raison : il y a dĂ©jĂ  des clients sur le marchĂ© maintenant qui recherchent un produit comme le vĂŽtre pour rĂ©pondre Ă  leur besoin. Ils n’ont pas besoin de connaitre votre marque pour assouvir leur besoin, ils veulent rĂ©pondre Ă  celui-ci simplement, rapidement et Ă  bon prix. Ainsi, lorsqu’on dĂ©cide quoi faire dans notre stratĂ©gie marketing, il faut considĂ©rer l’effort et l’argent Ă  investir afin de rejoindre chacune des strates :

Un petit ajout qui change tout

En ajoutant cette dimension, on voit pourquoi une campagne massive d’image de marque devrait arriver en dernier. Si on n’a pas dĂ©jĂ  maitrisĂ© les autres Ă©tapes, ce sera un (dispendieux) coup d’épĂ©e dans l’eau. Ainsi, il faut travailler Ă  l’envers, en commençant par les consommateurs les plus propices Ă  acheter. Une fois qu’on a maitrisĂ© une strate, on passe Ă  la suivante. Mais avant tout, on doit mettre sa maison en ordre.

.Étape 0 : On pose le premier bloc formant la fondation de notre stratĂ©gie

Étape 0 : Analyser son site pour l’amĂ©liorer, implĂ©menter les analytiques de base, et mettre en place une campagne de remarketing

Avant toute chose, avant la moindre campagne de marketing, il faut s’assurer que notre pot de miel est efficace. Ça ne donne rien de rejoindre des clients potentiels si notre panier d’achat est brisĂ© ou difficile d’utilisation. On ne parle pas de Conversion Rate Optimization ici (CRO) – on assume qu’il n’y a pas assez de donnĂ©es pour le faire. Le A-B testing, c’est pour plus tard. On utilise plutĂŽt les principes de base de UX: diminuer la friction, organiser les Ă©lĂ©ments de navigation de maniĂšre logique, ou organiser les Ă©lĂ©ments visuels selon les principes de la Gestalt comme la proximitĂ© et la similaritĂ©. Demandez Ă  votre mĂšre de faire un achat sur votre site en disant tout ce qu’elle se dis elle-mĂȘme dans son monologue intĂ©rieur. Utilisez GTMetrix pour obtenir des suggestions afin d’augmenter la rapiditĂ© de votre site. Organisez votre navigation Ă  l’aide de la mĂ©thode des tris de carte. PrĂ©sentez vos produits simplement et professionnellement, autant au niveau du texte que des images.

Une fois que cela est fait, mettez en place Google Analytics. Difficile de juger du retour sur investissement de vos campagnes si celles-ci ne sont pas mesurĂ©es. Configurez le Enhanced E-Commerce correctement afin de savoir le taux de conversion de vos campagnes. Mettez en place des Events personalisĂ©s selon vos objectifs, et liez des Goals Ă  ceux-ci. Par exemple, vous pouvez avoir un Goal de cliquer sur le numĂ©ro de tĂ©lĂ©phone afin d’appeler votre entreprise, et assigner un valeur monĂ©taire Ă  celui-ci. Activez les Search Terms si votre site contient un moteur de recherche, afin de connaitre les dĂ©sirs de consommateurs qui visitent votre site. Installez le pixel Facebook afin d’avoir la possibilitĂ© de crĂ©er des audiences en fonction du comportement des visiteurs sur votre site.

Enfin, ne laissez pas les visiteurs actuels de votre site partir dans l’oubli. Si ces derniers visitent votre site, c’est qu’ils sont intĂ©ressĂ©s par votre produit Ă  court ou moyen terme. Mettez en place une campagne de remarketing via Facebook Ads (les dynamic product ads fonctionnent trĂšs bien) ainsi qu’une campagne de remarketing Google Display. La premiĂšre servira Ă  inciter Ă  l’action, alors que la deuxiĂšme servira Ă  rester top of mind et familier par le concept de mere exposure. Le ROI sur Facebook est trĂšs important et devrait ĂȘtre Ă©levĂ©. Le ROI sur Google Display l’est moins car son objectif est diffĂ©rent.

Une fois ces trois tĂąches accomplies, vous ĂȘtes prĂȘts Ă  passer Ă  la deuxiĂšme Ă©tape.

Étape 1 : On part Ă  la guerre

Étape 1 : Rejoindre les consommateurs prĂȘts Ă  acheter maintenant (Action)

Votre site est en ordre, les analytiques sont mise en place et vous ne laissez pas partir vos visiteurs sans un petit rappel de votre existence sur les autres sites qu’ils visitent. Bien ! Afin d’obtenir des rĂ©sultats Ă  court terme, vous ĂȘtes prĂȘts Ă  cibler les gens qui veulent rĂ©pondre Ă  leur besoin immĂ©diat par votre extraordinaire produit. Ici, c’est principalement une campagne de Search Ads et/ou Shopping sur Google (ou sur Bing, sur Amazon, sur Etsy, sur eBay ! Ca dĂ©pends de la cible ????) qui sera efficace.

L’idĂ©e est de convaincre les gens Ă  l’étape Action que vous ĂȘtes le meilleur fournisseur afin de rĂ©pondre Ă  leur besoin : vous avez le meilleur produit et le plus faible risque de dĂ©ception. Vous dĂ©montrez que vous avez le meilleur produit par une excellente description et des photos professionnelles, des commentaires d’acheteurs prĂ©cĂ©dents, ou l’aval d’experts dans le domaine. Vous diminuez le risque perçu en offrant la livraison gratuite ou Ă  faible coĂ»t, des retours faciles et une livraison rapide.

Étape 2 : On explore notre terrain de jeu

Étape 2 : Rejoindre les consommateurs Ă  l’étape de la recherche d’informations dans votre catĂ©gorie de produits (Desire)

C’est le moment de se dĂ©marquer des compĂ©titeurs comme Ă©tant la marque connaissant le mieux son sujet. Une stratĂ©gie de marketing de contenu et de SEO/SEM vous permettra de rĂ©pondre aux questions des clients qui ne sont pas encore prĂȘts Ă  acheter, mais qu’y s’y prĂ©parent en recherchant des informations. On ne s’attends pas nĂ©cessairement Ă  un grand ROI Ă  cette Ă©tape, mais plutĂŽt Ă  Ă©largir notre bassin de consommateurs Ă  l’étape Action. En effet, une fois qu’ils sont venus sur votre site, vous serez en mesure de les recibler jusqu’à ce qu’ils passent Ă  l’étape de l’achat. Comme le reciblage est toujours limitĂ© en fonction du nombre de visiteurs sur votre site, il faut donc trouver le moyen d’augmenter le nombre de visiteurs qualifiĂ©s.

Pensez aux questions que les clients en Ă©tape de recherche d’information se posent et, si ces questions semblent avoir de bons volumes de recherche, rĂ©pondez-y sur votre blogue. Faites des comparatifs des attributs de votre produit Ă  celui des concurrents, et faites une campagne SEM ciblant les mots-clĂ©s de la marque des concurrents. CrĂ©ez des tutoriels expliquant comment amĂ©liorer son expĂ©rience avec votre catĂ©gorie de produit. Faites tout ce qu’il faut pour dĂ©montrer votre expertise !

Étape 3: On construit notre village

Étape 3 : Rejoindre les consommateurs qui Ă©valuent diffĂ©rentes catĂ©gories de produits afin de rĂ©pondre Ă  leur besoin (Interest)

C’est l’étape de l’évaluation des alternatives et de la valeur attendue. Un consommateur Ă  cette Ă©tape se demande quel moyen il va utiliser afin de rĂ©pondre Ă  son besoin. Un exemple simple est une personne dĂ©sirant se dĂ©placer de MontrĂ©al Ă  QuĂ©bec. À cette Ă©tape, il se demande s’il devrait prendre sa voiture, l’autobus, l’avion ou le train. Si vous ĂȘtes un transporteur aĂ©rien, il faut donc convaincre les gens que votre alternative est la meilleure parmi les options possibles pour rĂ©pondre au besoin de voyager de MontrĂ©al vers QuĂ©bec. Pour une campagne vraiment gĂ©niale sur cette Ă©tape, jetez un Ɠil Ă  la campagne de Via Rail rĂ©alisĂ©e par TouchĂ© ! En comparaison, s’il avait Ă©tĂ© Ă  l’étape 2, le choix de prendre l’autobus Ă©tant dĂ©jĂ  Ă©tĂ© pris, l’objectif du consommateur est plutĂŽt de trouver la meilleure compagnie d’autobus, la moins chĂšre, la plus confortable, la plus fiable, parmi la catĂ©gorie des transports par autobus.

C’est une Ă©tape tricky Ă  cibler, qui demande souvent plus de moyens qu’une seule entreprise possĂšde. C’est pourquoi certains se regroupent afin d’augmenter leur puissance de frappe dans leur catĂ©gorie : Le Lait est un excellent exemple. L’objectif ici est de favoriser la consommation de lait par rapport aux autres alternatives de boissons. Allez voir leur site : on y vante les vertus du lait pour des dents saines, pour une peau en santĂ©, pour de bon os, etc. Tout cela dans l’espoir que, lorsque prĂ©sentĂ© devant l’option de boire un verre de lait ou un verre de Coke, les gens feront le choix du lait.

Pensez aux joueurs dans votre catĂ©gorie. Est-ce que ceux-ci seraient ouverts Ă  joindre leurs forces aux vĂŽtres afin de crĂ©er un regroupement pour favoriser la consommation de votre catĂ©gorie par rapport Ă  une autre ? Il n’est pas inaccessible de crĂ©er un microsite comme celui proposĂ© par Le Lait. Il est aussi pertinent de rĂ©flĂ©chir Ă  la maniĂšre d’intĂ©grer des activitĂ©s de marketing traditionnels Ă  votre stratĂ©gie de marketing numĂ©rique, comme une campagne de relations publiques, des Ă©vĂ©nements, un festival, etc. Je peux vous garantir qu’il n’y a rien de mieux pour le SEO que d’ĂȘtre l’organisateur d’un Ă©vĂ©nement Ă  grand dĂ©ploiement, et de mettre les efforts en relations publiques pour que les grands mĂ©dias en parlent. Amenez-en, des backlinks avec des DA de 90+ !

Étape 4 : On Ă©tend notre empire

Étape 4 : Devenez la marque la plus reconnue et la plus familiĂšre dans votre catĂ©gorie (Awareness)

Ici, on commence Ă  sortir pas mal des stratĂ©gies purement numĂ©riques. Demandez-vous quelle serait la meilleure maniĂšre de faire en sorte que, parmi les noms/logos de tous vos compĂ©titeurs, le vĂŽtre soit instantanĂ©ment reliĂ©e Ă  votre catĂ©gorie de produit. Encore plus difficile, imaginez les actions que vous auriez Ă  prendre afin qu’une personne, lorsqu’on lui demande un exemple de marque dans une catĂ©gorie, la vĂŽtre soit prĂ©pondĂ©rante. C’est la notion de rappel assistĂ© ou non assistĂ©, et probablement la meilleure mĂ©trique Ă  utiliser Ă  ce niveau. Au niveau numĂ©rique, une mĂ©trique comme le nombre de recherches organiques branded (contenant votre marque) additionnĂ©e au traffic direct peut ĂȘtre un bon indicateur d’une campagne d’Awareness qui fonctionne.

C’est ici qu’on ouvre les gros canons : on veut rejoindre le plus de gens possible, au plus faible CPM possible, le plus souvent possible sans dĂ©ranger. Sur ce dernier point, le sujet de la frĂ©quence optimale est vaste et, s’il vous intĂ©resse, je vous conseille cet article trĂšs accessible de Gerard J. Tellis dans le Journal of Advertising Research[i].  Les canaux numĂ©riques peuvent ĂȘtre utiles ici : on peut penser Ă  des campagnes de reach au CPM sur Facebook, des takeover de pages d’accueil de grands mĂ©dias, des pre-roll sur les sites de streaming comme tou.tv, ou encore l’achat programmatique de publicitĂ©s. On peut mĂȘme penser Ă  des campagnes
 oserai-je le dire
 virales ! J’adore la campagne de QuĂ©bec Original Un voyage jamais vu qui Ă©tait 100% numĂ©rique. On est clairement dans le branding touristique, avec comme objectif de faire connaitre le QuĂ©bec comme une destination possible dans le panier d’alternatives des chercheurs de voyages.

Toutefois, les canaux traditionnels sont presque toujours utilisĂ©s Ă  cette Ă©tape : tout le monde n’est pas sur Facebook (hĂ© non !). ConsidĂ©rant les coĂ»ts Ă©normes engendrĂ©s par ces stratĂ©gies, il est super important d’ĂȘtre crĂ©atif dans notre approche. SVP il faut que quelqu’un dise Ă  Corbeil ÉlectromĂ©nagers d’arrĂȘter de dĂ©penser des centaines de milliers de dollars dans des billboards poches. Soyez crĂ©atifs, fous, sortez des idĂ©es Ă©clatĂ©es ou engagez des gens qui en ont. Un bon exemple de campagne traditionnelle qui a misĂ© sur la crĂ©ativitĂ© et le punch est la campagne de ValĂ©rie Plante « L’homme de la situation Â» rĂ©alisĂ© par upperkut. Avec moins de moyens que son rival, elle a rĂ©ussi Ă  passer de pure inconnue Ă  mairesse de MontrĂ©al en quelques mois. Tout un accomplissement pour la crĂ©ativitĂ© !

Est-ce que je dois faire toutes les Ă©tapes ?

Évidemment que non. Il y a plein de PME qui bĂ©nĂ©ficieraient Ă©normĂ©ment de faire uniquement l’étape 0 et 1, sans jamais aller plus loin. En fonction de la grosseur du marchĂ©, du type d’entreprise, de sa catĂ©gorie de produit, il est peut-ĂȘtre plus efficace de faire seulement ces Ă©tapes, et de se concentrer sur d’autre chose par la suite comme le dĂ©veloppement de nouveaux produits, l’ouverture de magasins physiques, l’optimisation de ses opĂ©rations, la recherche d’investisseurs, etc. Il y a toujours une infinitĂ© de choses Ă  faire, et aucune n’est mauvaise ! Il faut seulement rĂ©flĂ©chir au coĂ»t d’opportunitĂ© de chacune de nos actions : si je fais une chose, je n’en fais pas une autre. Il faut parfois prendre un pas en arriĂšre et se poser la question : est-ce que je suis en train de faire la bonne chose pour maximiser le retour sur mon investissement d’effort et d’argent ? Si la rĂ©ponse est oui, vous ĂȘtes sur la bonne voie !

Est-ce que cela veut aussi dire qu’une stratĂ©gie ciblant directement l’Ă©tape 4 sans faire les autres Ă©tapes sera nĂ©cĂ©ssairement infructueuse? Évidemment que non. Toutefois, Ă  performance Ă©gale, une campagne de masse sera plus efficace si les Ă©tapes prĂ©cĂ©dentes ont Ă©tĂ© implantĂ©es. Prenons l’exemple d’une entreprise qui a la chance de passer aux Dragons (1M de tĂ©lĂ©spectateurs) et qui rĂ©ussi Ă  convaincre un dixiĂšme de pourcent de ces tĂ©lĂ©spectateurs Ă  visiter son site (10 000 personnes). Si son taux de conversion est de 3%, il peut espĂ©rer faire 300 ventes Ă  peu prĂšs sur le champ. S’il n’a pas mis les autres Ă©tapes en place, c’est tout ce qu’il obtiendra. Toutefois, s’il est passĂ© Ă  travers les autres Ă©tapes, il viendra de crĂ©er une audience de 10 000 personnes intĂ©ressĂ©es Ă  son produit qu’il pourra recibler par la suite Ă  l’Ă©tape 0. Pour ceux ne visitant pas le site sur le champ, il est probable qu’ils chercheront le produit (Ă©tape 1) ou de l’information sur le produit (Ă©tape 2) dans les jours suivants, ce qui augmentera les possibilitĂ©s de vente Ă  ces Ă©tapes. Enfin, il aura aussi montrĂ© la pertinence de sa catĂ©gorie par rapport Ă  d’autres afin de rĂ©pondre Ă  un besoin, ce qui augmentera les ventes provenant de l’Ă©tape 3. C’est pourquoi c’est souvent le branle-bas-de-combat lorsqu’une entreprise se prĂ©pare Ă  passer Ă  cette Ă©mission, il ne faut pas manquer sa shot!

Et vous, quelle est l’ordre dans lequel vous priorisez vos actions ? Avez-vous un autre framework que le miens ? Je suis curieux de connaitre votre opinion !


[i] Tellis, Gerard J., Effective Frequency: One Exposure or Three Factors?. Journal of Advertising Research, pp. 75-80, July-August 1997. Available at SSRN: https://ssrn.com/abstract=906019

Mailchimp

Les alternatives à Mailchimp – Mai 2019

Maintenant que Mailchimp a annoncĂ© la fin du lien avec Shopify, ainsi que son pivot stratĂ©gique vers une plate-forme complĂšte de CRM, plusieurs PME se demandent s’il est pertinent de trouver un nouveau logiciel de newsletter, aprĂšs avoir passĂ© tout ce temps Ă  apprendre comment utiliser Mailchimp. Évidemment, ces derniers comptent sur l’inertie de leurs utilisateurs actuels. Toutefois, malgrĂ© mon amour profond pour Mailchimp aprĂšs l’avoir utilisĂ© des annĂ©es, il est pertinent de réévaluer s’il est toujours le bon outil pour nous, considĂ©rant les changements fondamentaux de la plate-forme.

Je commencerai d’abord par expliquer en dĂ©tails les changements sur la plateforme Mailchimp. Puis, je proposerai diffĂ©rentes options pour vous aider Ă  prendre la meilleure dĂ©cision pour votre situation. Puis, je terminerai par mon choix chouchou. Afin de faire des comparaisons de prix, je prendrai l’exemple d’une entreprise qui possĂšde une liste de 10 000 abonnĂ©s, et qui envoie un courriel par semaine Ă  sa liste. Les conversions $USDĂ $CAD sont en date du 27 mai 2019.

Les changements Ă  la plateforme Mailchimp

Est-ce la réaction des gens chez Mailchimp?

Le premier changement a Ă©tĂ© la fin de la connexion native entre Mailchimp et Shopify afin de synchroniser les informations d’achats des clients pour analyser la performance, d’envoyer des courriels aux clients qui abandonnent leur panier, d’envoyer des notifications de suivi de commande par courriel, et d’avoir accĂšs aux produits de notre boutique dans l’éditeur de courriels. La raison de cette sĂ©paration provient du refus de Mailchimp Ă  la demande de Shopify de partager les informations de sa plateforme vers la leur. Difficile de dire qui est fautif dans cette histoire : je vous laisse juger par vous-mĂȘme avec la dĂ©claration de Mailchimp et la dĂ©claration de Shopify. MalgrĂ© cette guĂ©guerre, il y a heureusement une solution gratuite Ă  ce problĂšme avec ShopSync, qui permet de conserver l’intĂ©gration. ProblĂšme rĂ©glĂ© !

Le deuxiĂšme changement, plus majeur, est le pivot de Mailchimp d’une plateforme d’envoi de courriels Ă  une plateforme de CRM complĂšte. La premiĂšre Ă©tape de ce pivot est la restructuration de leurs Ă©chelles de prix : un contact est maintenant comptĂ©, qu’il soit abonnĂ© ou non Ă  l’envoi de courriels. Cela implique qu’il faut additionner votre liste de clients non abonnĂ©s, Ă  votre liste de courriels abonnĂ©s, Ă  votre liste de courriels dĂ©sinscrits. Une liste de 10 000 abonnĂ©s peut ainsi gonfler de façon importante (j’en ai vu quadrupler !), surtout si vous avez beaucoup d’activitĂ© d’acquisition de courriels, ce qui implique un plus gros churn qu’une acquisition organique. La logique derriĂšre ce changement est qu’il est possible de communiquer avec les membres d’une audience par d’autres moyens via Mailchimp, comme les audiences de retargeting Google et Facebook, par exemple. Toutefois, il s’agissait de fonctionnalitĂ©s qui existaient dĂ©jĂ  auparavant. Il est donc un peu Ă©trange, Ă  mon avis, de changer complĂštement sa structure de prix sans crĂ©er de nouvelles fonctionnalitĂ©s. 

Heureusement, pour les clients existants, la structure de prix reste la mĂȘme selon un systĂšme de « Legacy Pricing Â». La nouvelle structure de prix, beaucoup plus complexe qu’avant, s’applique Ă  tous les nouveaux comptes et Ă  tous les comptes inactifs depuis plus de 90 jours. En plus du gonflement dĂ» Ă  la nouvelle maniĂšre de compter un contact, le nombre de courriels envoyĂ©s par mois n’est plus illimitĂ©e non plus – il est maintenant ajustĂ© en fonction du plan choisi. La limite est de 10 courriels par mois par contact pour le plan « Essentials Â», 12 courriels par mois par contact pour le plan « Standard Â» et 15 courriels par mois par contact pour le plan « Premium Â». Quelqu’un qui roule beaucoup d’automatisations pourrait ainsi avoir Ă  payer encore plus que le montant mensuel prĂ©vu, car le dĂ©passement de la limite implique des frais supplĂ©mentaires. Les fonctionnalitĂ©s sont aussi maintenant restreintes en fonction du niveau de service choisi : il n’est mĂȘme plus possible de crĂ©er un template personnalisĂ© ou des automatisations avec le plan « Essentials Â».

À mon avis, considĂ©rant tous ces changements, Mailchimp n’est plus une plateforme attrayante pour un nouveau compte. Heureusement, le « Legacy Pricing Â» fait en sorte que les clients existants n’ont pas besoin de fuir au plus vite, mais qui sait si ce plan sera changĂ© ou retirĂ© dans le futur ? Je vous prĂ©sente donc maintenant les diffĂ©rentes options disponibles, en fonction de diffĂ©rentes situations.

Option 1 : Statu quo en ajoutant ShopSync pour Mailchimp

ShopSync et Shopify

Quelqu’un ayant investi beaucoup de temps dans son workflow Mailchimp, qui n’a pas les resources humaines ou monĂ©taires pour changer de plateforme, et qui est satisfait des fonctionnalitĂ©s existantes, pourrait dĂ©cider de rester sur Mailchimp. L’intĂ©gration avec ShopSync fonctionne bien, et le prix reste le mĂȘme. Parfois, la rĂ©alitĂ© est qu’on a bien d’autres chats Ă  fouetter : don’t fix what’s not broken. Toutefois, je conseillerais Ă  une entreprise qui fait ce choix de rester Ă  l’affĂ»t des « vraies Â» solutions de CRM comme Hubspot, et de planifier une intĂ©gration complĂšte de ses activitĂ©s de marketing dans ce genre de plateforme dans le futur, pour amĂ©liorer ses capacitĂ©s et son efficacitĂ©.

Avantages

  • NĂ©cessite peu d’efforts (15 minutes de rĂ©intĂ©gration)
  • Pas besoin d’apprendre un nouveau logiciel
  • La configuration existante est conservĂ©e

Inconvénients

  • Rester Ă  la merci d’un futur changement aux tarifs
  • Pas d’amĂ©lioration des capacitĂ©s de marketing
  • Pas de diminution des coĂ»ts

Prix

Pour une liste de 10 000 abonnés et un envoi par semaine

  • Legacy Pricing : 101$CAD/mois
  • Standard Plan : 133$CAD/mois

Option 2 : Diminuer les coĂ»ts avec Sendy et BeeFree

Interface purement utilitaire! Le composeur visuel est trÚs peu sophistiqué, mais BeeFree est à la rescousse.

Sendy et son complĂ©ment BeeFree sont les outils parfaits pour une entreprise qui dĂ©sire avoir des coĂ»ts minuscules, qui a la capacitĂ© technique d’installer une application auto-hĂ©bergĂ©e, et qui a seulement besoin d’une application d’envoi de courriels plutĂŽt qu’un CRM complet. À la place d’un modĂšle SaaS (Software-as-a-service), Sendy vends une licence d’utilisation pour une installation sur un serveur au coĂ»t unique de 59$USD, et agit ensuite comme back-end vers le service Amazon SES (Simple Email Service) qui a une structure tarifaire par courriel envoyĂ© : 1$USD par 10 000 courriels envoyĂ©s. La faiblesse de Sendy est que son Ă©diteur visuel n’est pas trĂšs performant, ce qui est rĂ©glĂ© avec BeeFree, la meilleure plateforme de crĂ©ation de courriels sur le marchĂ©. En plus, il existe une intĂ©gration gratuite afin de lier les deux logiciels. Enfin, il faut lier Sendy et Shopify, ce qu’il est possible de faire avec Zapier (payant si gros volume) ou avec un script gratuit qu’on hĂ©berge soit-mĂȘme – assez simple Ă  faire sur Google App Engine par exemple.

Avantages

  • Prix trĂšs, trĂšs bas
  • PossibilitĂ© de personnaliser le back-end selon ses besoins
  • Prix trĂšs bas (est-ce que j’ai dis que c’était pas cher ?)

Inconvénients

  • Interface un peu vieillotte
  • Pas de A/B testing
  • Automatisation limitĂ©e (Courriels de bienvenue seulement)
  • Il faut gĂ©rer notre hĂ©bergement pour le back-end

Prix

Pour une liste de 10 000 abonnés et un envoi par semaine

  • Frais unique de 79$CAD
  • 6$CAD/mois (No joke!!!)

Option 3 : Augmenter la sophistication de nos campagnes courriel avec Omnisend

L’interface d’Omnisend pour choisir l’objectif de notre automatisation

Évidemment, l’autre solution est de migrer vers une nouvelle plateforme hĂ©bergĂ©e dans le nuage. Il y en a des dizaines, en voici une liste trĂšs incomplĂšte :

Toutefois, mon choix personnel pour un marchand qui serait sur Shopify et qui cherche Ă  migrer de Mailchimp vers un autre service serait Omnisend. C’est clairement la plateforme qui s’intĂšgre le plus facilement avec Shopify : on aime les one-click install qui importe le opt-in de courriel et de SMS! Dans sa version « Lite Â», Ă  un prix similaire Ă  Mailchimp, elle offre plus de fonctionnalitĂ©s que Mailchimp comme l’envoi de SMS et un constructeur d’automatisations visuel. Elle offre aussi des plans plus avancĂ©s qui permettent de faire du marketing par SMS, Messenger, WhatsApp ou push notifications, et de crĂ©er des audiences personalisĂ©es Facebook et Google Ads. En plus, plusieurs template d’automatisations sont dĂ©jĂ  batis en fonction de l’objectif qu’on dĂ©sire atteindre, par exemple, crĂ©er une sĂ©rie de courriels de bienvenue, une sĂ©rie de courriels de paniers abandonnĂ©s, faire du cross-selling, ou rĂ©activer des abonnĂ©s. Encore mieux, elle offre un service de migration gratuit pour les marchands et un rabais de 50% pendant 3 mois et 20% pendant un an. TrĂšs agressif comme offre ! Sinon, si vous voulez le faire vous-mĂȘme, c’est trĂšs simple de mettre votre clĂ© API Mailchimp et d’importer vos listes. Maintenant, si vous dĂ©cidez de prendre cette option, vous devriez quand mĂȘme jeter un Ɠil aux autres logiciels avant de faire votre choix, mais le miens s’est arrĂȘtĂ© sur Omnisend. J’ai Ă©tĂ© particuliĂšrement impressionnĂ© par son deliverability : j’utilise Zoho qui est trĂšs trĂšs agressif dans le classement automatique des infolettres dans des dossiers, et les courriels provenant d’Omnisend atterrissent dans mon Inbox !

Avantages

  • SophistiquĂ© mais simple d’utilisation
  • IntĂ©gration parfaite avec Shopify, autant au niveau des clients que des produits
  • Permet d’ajouter des fonctionnalitĂ©s en fonction de nos besoins
  • Les triggers dans les automatisations peuvent ĂȘtre en fonction du comportement des contacts sur notre site, par pages ou produits vus, et mĂȘme par custom event !

Inconvénients

  • Les fonctionnalitĂ©s supplĂ©mentaires comme les push notifications, l’intĂ©gration Ă  Messenger et les audiences Facebook et Google Ads sont Ă  frais fixe, ce qui les rends un peu chĂšres pour une petite liste.
  • Pas de workflow conditionnel (Si c’est un must, regardez du cĂŽtĂ© de Klaviyo ou ActiveCampaign)

Prix

Pour une liste de 10 000 abonnĂ©s, un envoi par semaine, un paiement annuel et le forfait « Lite Â»

  • 55$CAD/mois les trois premiers mois
  • 88$CAD/mois les neuf mois suivants
  • 110$CAD/mois par la suite

VoilĂ , j’espĂšre que ce petit tour d’horizon vous sera utile ! Et vous, quelle est votre solution d’automatisation de marketing par courriel ?

TL :DR

  Mailchimp Sendy + BeeFree Omnisend
Sophistication 6/10 4/10 9/10
FacilitĂ© d’utilisation 8/10 5/10 10/10
Prix (10k user) 101-133$CAD 6$/mois (!!!) 110$
Intégrations 200 et + via API Via API seulement 30 et + via API
QualitĂ© de l’éditeur visuel 6/10 10/10 (BeeFree) 0/10 (Sendy) 10/10
Deliverability 9/10 9/10 10/10
Automatisations 7/10 4/10 9/10
Intégration native avec Shopify Oui avec ShopSync (Contacts et product views) Oui (Contacts seulement) Oui (Contacts et comportement des visiteurs)

Web Ă  QuĂ©bec 2019 – Jour 2 et 3

Une deuxiĂšme journĂ©e oĂč j’ai assistĂ© Ă  moins de confĂ©rences, car je devais prĂ©senter la mienne! Mais un jour 3 fantastique avec des confĂ©renciers de calibre mondial vraiment inspirants.

Martin Boucher et Marie-Anne Courchesne

Quelles sont les retombées concrÚtes de la stratégie de communication numérique du Québec?

On entre dans la modernité

Une confĂ©rence qui dĂ©but avec une grande question: comment passer de 800 sites distincts Ă  un seul site unifiĂ©? La rĂ©ponse… Un Ă  la fois! À l’aide d’une approche itĂ©rative, la petite Ă©quipe web de 20 personnes du gouvernement du QuĂ©bec a dĂ©veloppĂ© la premiĂšre version de quebec.ca, en six mois, entiĂšrement Ă  l’interne. Pour un site v1 avec 500 pages de contenu, c’est tout un accomplissement pour notre cher gouvernement qu’on croit souvent bien lent! L’arme secrĂšte? Une organisation du travail selon les principes agile.

Prochaine étape? Les 798 autres sites qui sont encore indépendants!

Faites un tour sur le nouveau site du gouvernement: https://www.quebec.ca/

Hugues Foltz

L’arrivĂ©e massive des technologies de rupture Ă  l’ùre du 4.0

Qu’est-ce qu’une innovation de rupture? Il s’agit d’une innovation qui a le pouvoir de renverser complĂštement les plus grands joueurs d’une industrie. Les exemples amenĂ©s sont multiples avec les classiques Tesla, Amazon, Uber et AirBnB, mais aussi d’autres moins connus comme Doctolib, en France, qui casse les barriĂšres entre un patient et son mĂ©decin, ou Lemonade qui chambarde la vitesse Ă  laquelle on peut reçevoir un paiement d’assurance.

Outre ces innovations, cette confĂ©rence a regardĂ© trĂšs loin dans le futur, imaginant une sociĂ©tĂ© ou les humains peuvent se recentrer sur ce qu’ils font de mieux: la crĂ©ativitĂ©, l’empathie et la gestion du flou. Selon lui, les emplois dĂ©bilitants et rĂ©pĂ©titifs seront automatisĂ©s sans aucun doute, d’ici 10 Ă  20 ans.

Visitez le site de Vooban: https://vooban.com/

Colin Megil

AI & the future of the political party

Une toute nouvelle façon de rĂ©flĂ©chir Ă  la maniĂšre d’engager les citoyens dans le processus politique: voici la solution offerte par la plate-forme pol.is. À l’aide d’une stratĂ©gie d’apprentissage machine, il est maintenant possible de compresser les opinions qualitatives de milliers de personnes en un rĂ©sumĂ© qui est possible Ă  comprendre pour nos Ă©lus. DĂ©jĂ  implantĂ© Ă  Taiwan, pol.is fait maintenant l’objet d’essais avec le gouvernement du Canada!

Visitez le site de pol.is: https://pol.is/

Simo Ahava

There’s data everywhere!

Simo, vĂ©ritable superstar du web analytique et de GTM en particulier, nous a prĂ©sentĂ© sa vision d’une Ă©quipe d’analytiques qui est en mesure d’offrir de hautes performances: une Ă©quipe avec des membres ayant une expertise dans l’utilisation des outils, d’autres membres avec une expertise du marchĂ© dans lequel Ă©volue l’entreprise, et une grande maturitĂ© de gens et de processus. C’est uniquement lorsque ces trois Ă©lĂ©ments se rejoignent dans une Ă©quipe que celle-ci travaillera ensemble Ă  atteindre leurs buts partagĂ©s. Et la meilleure maniĂšre d’organiser le travail? Avec la mĂ©thode Scrum, mĂȘme si celle-ci peut ĂȘtre malaisante au dĂ©but!

Points bonis accordĂ©s pour la montĂ©e de lait contre le concept un peu arriĂšrĂ© d’une session dans Google Analytics.

Visitez le site de Simo Ahava: https://www.simoahava.com/

Tim Wilson

Statistics Intuition for the Marketer (and Why It Matters)

Probablement ma confĂ©rence chouchou des trois journĂ©es, Tim a rĂ©ussi en 45 minutes Ă  expliquer les principes fondamentaux de l’analyse statistique, en plus de prĂ©senter l’ANOVA, les analyses post-hoc, la rĂ©gression linĂ©aire et les sĂ©ries temporelles. À mon avis, il s’agit d’un tour de force d’ĂȘtre en mesure d’expliquer ces mĂ©thodes d’une maniĂšre aussi claire et concise. Mais, outre ses explications limpides, il a mĂȘme proposĂ© un exemple d’application rĂ©elle de ces trois mĂ©thodes d’analyse statistique Ă  des donnĂ©es web.

À mon avis, les connaissances en statistiques sont une lacune gĂ©nĂ©ralisĂ©e en marketing numĂ©rique, que ce soit au niveau des pratiques ou des outils. EspĂ©rons que cette prĂ©sentation amorçe un petit vent de changement dans l’industrie!

Le profil LinkedIn de Tim Wilson: https://www.linkedin.com/in/tgwilson/

Dina Zielinski

A future for digital data in nature’s oldest storage device

ÇA c’est du Big Data!

Saviez-vous qu’il Ă©tait possible de stocker des donnĂ©es numĂ©riques dans de l’ADN? Moi non plus! Avec une toute premiĂšre Ă©tude sur le sujet en 1988, ce n’est que depuis 2007 que des recherches sĂ©rieuses sont entreprises sur cette mĂ©thode originale d’entreposer des donnĂ©es. Loin d’ĂȘtre prĂȘte Ă  une utilisation par les consommateurs Ă  cause de son prix Ă©levĂ©, 9000$US pour encoder et dĂ©coder 2Mo de donnĂ©es, une utilisation future pourrait ĂȘtre l’archivage des donnĂ©es les plus primordiales de l’humanitĂ© en raison de sa durĂ©e de vie de plus de 1000 ans dans des conditions d’archivage simples, et de sa densitĂ© d’information inĂ©galĂ©e.

Visitez le profil LinkedIn de Dina Zielinski: https://www.linkedin.com/in/dinazielinski/

Jean-François Renaud

Budget optimal en marketing numérique : utiliser les données

On revient sur terre aprĂšs la confĂ©rence sur le stockage des donnĂ©es dans l’ADN avec un sujet tout ce qu’il y a de plus plate (le principal intĂ©ressĂ© l’a qualifiĂ© comme tel) mais tellement important: combien de dollars dĂ©penser en marketing numĂ©rique. À l’aide d’une nouvelle mĂ©thode dĂ©velopĂ©e chez Adviso, le Delta Opportunity Index (DOI), il est maintenant possible d’ajuster les budgets publicitaires en fonction de la demande pour les produits et services offerts. Pourquoi vendre des motoneiges uniquement lors d’une seule campagne en novembre, alors qu’il y a de l’intĂ©rĂȘt pour celles-ci Ă  des niveaux diffĂ©rents toute l’annĂ©e? On comprends Ă  quel point Jean-François adore le always-on et n’aime pas vraiment les campagnes. Mais Ă  voir le succĂšs qu’il obtient pour ses clients, on comprends qu’il a un peu raison!

Visitez le profil LinkedIn de Jean-François: https://www.linkedin.com/in/jeanfrancoisrenaud/

Lisez l’article scientifique sur la mĂ©thodologie DOI:
https://lp.adviso.ca/doi-waq2019

Rémy Savard

Gatsby – Performances irrĂ©elles, sĂ©curitĂ© accrue et meilleure expĂ©rience de dĂ©veloppement Web

Je ne suis pas dĂ©veloppeur web, mais cette confĂ©rence a piquĂ© ma curiositĂ© car elle prĂ©sente une des nombreuses technologies permettant de dĂ©ployer un site sans serveur, hĂ©bergĂ© uniquement sur des CDN, ce qui les rends tellements rapides que ça en est effectivement un peu irrĂ©el. Ce que j’ai retenu de cette prĂ©sentation est qu’il est prĂ©sentement possible d’utiliser cette technologie tout en conservant le CMS auquel nous sommes habituĂ©s, comme WordPress, Magento ou Shopify. ConsidĂ©rant la performance hallucinante qu’il est possible d’atteindre, ça vaut la peine de faire un peu plus de recherches, particuliĂšrement pour les sites e-commerce oĂč chaque seconde de chargement diminue le taux de conversion. Pour voir un site e-commerce de plus de 50 000 pages utilisant cette technologie, jetez un oeil ici, et attachez votre tuque avec du duct tape avant:
https://www.danielwellington.com/

Pour le profil LinkedIn de Rémy Savard: https://www.linkedin.com/in/remysavard

Vitaly Friedman

Bringing Personality Back To The Web

En 2019, les sites web modernes n’ont plus de personalitĂ©. EnfermĂ©s dans les codes stylistiques créés par le responsive et les frameworks de type bootstrap, et la diminution de la friction Ă  tout prix, nous avons perdu ce qui Ă©tait original, surprenant et mĂ©morable du web d’autrefois. Il nous dis mĂȘme qu’il s’ennuie du Flash Player! Toutefois, tout n’est pas perdu, car plusieurs exemples de sites webs modernes mĂ©morables sont mis de l’avant:

http://dada-data.net – On ne comprends pas tout Ă  fait l’objectif du site, mais c’est une vĂ©ritable oeuvre d’art numĂ©rique.

https://www.sbs.com.au/theboat/ – Une bande dessinĂ©e numĂ©rique absolument fabuleuse.

https://www.bloomberg.com/features/elon-musk-goals/ – Ce qui arrive quand on donne 100% de la libertĂ© crĂ©ative aux designers.

J’ai trouvĂ© cette prĂ©sentation absolument superbe pour conclure une congrĂšs sur le numĂ©rique, car elle Ă©tait complĂštement Ă©clatĂ©e et donnait envie de faire les choses diffĂ©rement! Et ne s’agit-il pas la de la raison d’ĂȘtre d’un congrĂšs? Apprendre de nouvelles choses, et faire les choses mieux, mais aussi diffĂ©rentes des autres!

Visitez le site de Vitaly Friedman, Smashing Magazine:https://www.smashingmagazine.com/

Web Ă  QuĂ©bec – Jour 1

Je vous offre un aperçu des confĂ©rences auxquelles j’ai eu la chance d’assister lors de la premiĂšre journĂ©e du Web Ă  QuĂ©bec!

Aaron Draplin – Draplin Design Co

Une créativité complÚtement éclatée.

Le fondateur de Draplin Design Co, Aaron Draplin, nous as parlĂ© de sa vie et de la maniĂšre qu’il s’y est pris afin d’atteindre le style de vie qu’il dĂ©sire d’une maniĂšre trĂšs Ă©loquente.

Son style de design Ă©clatĂ©, trĂšs pop art, a Ă©tĂ© utilisĂ© dans des projets du gouvernement des États-Unis, par la campagne de Bernie Sanders et par la Nasa.

Jetez un oeil au site web de Draplin Design Co.

Ross Simmonds – Content isn’t King anymore

Quelques exemples de plate-formes de distribution.

Nous avons eu droit Ă  une dĂ©monstration expliquant pourquoi le contenu n’est plus roi, la distribution l’est! Des changements d’algorithmes continuels aux featured snippets qui gardent les visiteurs dans l’Ă©cosystĂšme de Google, Ross dĂ©montre qu’il est risquĂ© de garder tous ses oeufs dans le mĂȘme panier et qu’il est pertinent de diversifier sa distribution. Il dit ainsi que Content isn’t King anymore, distribution is. Il suggĂšre de trouver la communautĂ© intĂ©ressĂ©e par notre sujet, de crĂ©er un contenu pertinent pour elle, et de la diffuser dans cette communautĂ©.

Visitez le site de Ross Simmods: https://rosssimmonds.com/

Tin Kadoic – AirBnB

Designing designers time

C’est occupĂ©, un designer.

Le titre de “designer” prends un tout autre sens de nos jours, et est plus large que celui de designer graphique, web, ou UI/UX. Tin Kadoic nous explique qu’un designer doit prendre en main sa carriĂšre comme il designerait un produit, et qu’il doit ĂȘtre intentionel dans les aptitudes qu’il apprends. Il faut apprendre les Ă©lĂ©ments qui sont pertinents pour se rendre la oĂč l’on veut aller.

Il as aussi fait un dĂ©tour par sa vision d’un bon gestionnaire, en expliquant la diffĂ©rence entre un “Talker-Talker”, un “Talker-Maker” et un “Maker-Maker”. Il dit que les meilleurs gestionnaires sont les meilleurs contributeurs qui sont forcĂ©s de devenir gestionnaires afin d’arriver Ă  leur fins, donc des “Makers-Makers” qui deviennent “Talker-Makers”. Il n’avait pas beaucoup d’Ă©loges pour les “Talkers-Talkers”, toutefois!

Visitez le site web de Tin Kadoic: https://blackduke.com/

Daria Hvizdalova

AI != Robotics: Backend Enablement

Une confĂ©rence fascinante par cette ingĂ©nieure venue tout droit de la RĂ©publique TchĂšque, elle a fait la diffĂ©rence entre l’automatisation des processus humains (Robotic Process Automation – RPA), possible entiĂšrement par software, et l’automatisation industrielle, alliant software et hardware afin de remplacer l’humain dans des tĂąches trop dangereuses ou dans lesquelles l’humain est inneficient. Surprenament, les processus d’automatisation industrielle sont gĂ©nĂ©ralement de niveau 1, c’est Ă  dire que les robots sont uniquements programmĂ©s afin de dĂ©finir une tĂąche trĂšs spĂ©cifique, sans capacitĂ© d’adaptation ou de capteurs leur permettant de changer leur comportement en fonction de l’environnement. Elle a fait un mention des cobots, ces robots cohabitants avec les humains dans un cadre industriel, mais que ceux-ci n’Ă©taient pas encore trĂšs efficaces.

Elle a aussi prĂ©sentĂ© les diffĂ©rences entre un narrow AI, capable de faire une seule tĂąche (ex. jouer aux Ă©checs), et un broad AI, capable de raisonner et d’apprendre par lui-mĂȘme. Nous sommes encore loin du broad AI!

Visitez la page LinkedIn de Daria: https://www.linkedin.com/in/dariahvizdalova

Lea Pica

The PICA Protocolℱ: Your Prescription for Healthy, Actionable Data Storytelling

Il ne faut pas juste vomir des buzzwords

Lea Pica est une sommitĂ©e dans le monde du data storytelling. Elle nous as prĂ©sentĂ© son protocole de dĂ©tox des visualisations en entreprise Ă  travers son protocole PICA: Purpose, Insights, Context, Aesthetics. Pour avoir de l’impact, une visualisation doit avoir un but prĂ©cis, rĂ©pondre Ă  une question d’affaires. Elle doit amener un insight, un angle qui n’est pas visible immĂ©diatement Ă  partir des donnĂ©es. Celle-ci doit ĂȘtre analysĂ©e dans son contexte, c’est-Ă -dire qu’il faut vĂ©rifier s’il existe d’autres sources de donnĂ©es qui pourraient confirmer ou infirmer ce qui est prĂ©sentĂ©. Enfin, elle doit ĂȘtre prĂ©sentĂ© selon des critĂšres d’esthĂ©tismes bien prĂ©cis, afin que le message ne soit pas perdu dans le medium.

Visitez le site web de Lea Pica:http://leapica.com/

PrĂ©paration des donnĂ©es de l’article sur le tableau de bord automatisĂ©

Jean-Philippe Allard

6 avril, 2019

Provenance des données

Pour la boutique en ligne, j’ai utilisĂ© les donnĂ©es de l’annĂ©e 2017 provenant du Google Merchandise Store, que j’ai manuellement exportĂ©es en fichiers csv. Une meilleure mĂ©thode serait d’utiliser une des nombreuses librairies permettant d’accĂ©der au Analytics Reporting API. Toutefois, le demo account de Google Analytics ne permet pas l’accĂšs par API, donc tous les fichiers requis ont Ă©tĂ© exportĂ©s Ă  la mitaine.

Pour la boutique physique, j’ai créé un fichier d’exemple en modifiant extensivement des donnĂ©es d’un marchand du Royaume-Uni. Les donnĂ©es originales sont disponibles sur Kaggle.

J’ai aussi créé une page Kaggle pour les fichiers finaux de cette page.

Début du projet

Nous avons tout d’abord besoin des librairies suivantes:

  • tidyverse, une librairie de librairies contenant tout ce qu’on a besoin pour le data wrangling.
  • readr, une librairie plus intuitive et rapide pour lire les fichiers csv.
#Loading Packages
library(tidyverse)
library(readr)

La premiĂšre Ă©tape est d’importer les donnĂ©es. Ici Ă  partir d’un fichier local, mais il est aussi possible de faire des requĂȘtes http Ă  un fichier sur un serveur, ou des GET requests Ă  un API avec la librairie httr. Par dĂ©faut, read_csv ne va pas parser des colonnes contenant des lettres en tant que colonne de type numĂ©rique, afin d’éviter de perdre des donnĂ©es. Il faut ainsi le demander formellement pour enlever les signes de $ ou de %.

#Importer les données
Online_original <- read_csv("All_Transactions_SKU.csv", 
    skip = 6)
KEY_TransactionID_Date <- read_csv("KEY_TransactionID_Date.csv")
KEY_SKU_ProductName <- read_csv("KEY_SKU_ProductName_GOOGLE.csv", 
    skip = 6)
KEY_SKU_Category <- read_csv("KEY_SKU_Category_Google.csv", 
    skip = 6)
#Parser les colonnes avec des $ ou des %
Online_original$"Product Revenue" <- parse_number(Online_original$"Product Revenue")
Online_original$"Avg. Price" <- parse_number(Online_original$"Avg. Price")

KEY_SKU_Category$"Product Revenue" <- parse_number(KEY_SKU_Category$"Product Revenue")
KEY_SKU_Category$"Avg. Price" <- parse_number(KEY_SKU_Category$"Avg. Price")
KEY_SKU_Category$"Product Refund Amount" <- parse_number(KEY_SKU_Category$"Product Refund Amount")
KEY_SKU_Category$"Basket-to-Detail Rate" <- parse_number(KEY_SKU_Category$"Basket-to-Detail Rate")
KEY_SKU_Category$"Buy-to-Detail Rate" <- parse_number(KEY_SKU_Category$"Buy-to-Detail Rate")

KEY_SKU_ProductName$"Product Revenue" <- parse_number(KEY_SKU_ProductName$"Product Revenue")
KEY_SKU_ProductName$"Avg. Price" <- parse_number(KEY_SKU_ProductName$"Avg. Price")
KEY_SKU_ProductName$"Product Refund Amount" <- parse_number(KEY_SKU_ProductName$"Product Refund Amount")
KEY_SKU_ProductName$"Basket-to-Detail Rate" <- parse_number(KEY_SKU_ProductName$"Basket-to-Detail Rate")
KEY_SKU_ProductName$"Buy-to-Detail Rate" <- parse_number(KEY_SKU_ProductName$"Buy-to-Detail Rate")

KEY_TransactionID_Date$"Revenue" <- parse_number(KEY_TransactionID_Date$"Revenue")
KEY_TransactionID_Date$"Tax" <- parse_number(KEY_TransactionID_Date$"Tax")
KEY_TransactionID_Date$"Delivery" <- parse_number(KEY_TransactionID_Date$"Delivery")
KEY_TransactionID_Date$"Refund Amount" <- parse_number(KEY_TransactionID_Date$"Refund Amount")

Enfin, nous allons filtrer les données des différents fichiers importés afin de conserver un seul type de catégories (il y en avait trois qui se dupliquaients), des Transaction ID uniques pour les dates et des Product SKU uniques pour les informations sur les produits. Puis, nous allons joindre toutes les tables en une seule table contenant toutes les informations, et enfin, retirer les informations qui ne sont pas pertinentes.

#Filtrer les données de la table catégorie pour conserver uniquement un type de catégorie
KEY_SKU_Category <- filter(KEY_SKU_Category, 
                          `Product Category (Enhanced E-commerce)` == "Accessories"|
                          `Product Category (Enhanced E-commerce)` == "Android"|
                          `Product Category (Enhanced E-commerce)` == "Apparel"|
                          `Product Category (Enhanced E-commerce)` == "Backpacks"|
                          `Product Category (Enhanced E-commerce)` == "Bags"|
                          `Product Category (Enhanced E-commerce)` == "Bottles"|
                          `Product Category (Enhanced E-commerce)` == "Drinkware"|
                          `Product Category (Enhanced E-commerce)` == "Fun"|
                          `Product Category (Enhanced E-commerce)` == "Gift Cards"|
                          `Product Category (Enhanced E-commerce)` == "Google"|
                          `Product Category (Enhanced E-commerce)` == "Headgear"|
                          `Product Category (Enhanced E-commerce)` == "Housewares"|
                          `Product Category (Enhanced E-commerce)` == "Lifestyle"|
                          `Product Category (Enhanced E-commerce)` == "More Bags"|
                          `Product Category (Enhanced E-commerce)` == "Nest"|
                          `Product Category (Enhanced E-commerce)` == "Nest-Canada"|
                          `Product Category (Enhanced E-commerce)` == "Nest-USA"|
                          `Product Category (Enhanced E-commerce)` == "Notebooks & Journals"|
                          `Product Category (Enhanced E-commerce)` == "Office"|
                          `Product Category (Enhanced E-commerce)` == "Waze"
                          )

#Enlever les duplicatas de KEY_TransactionID_Date (Transaction ID 45426 et 33673, probablement des modifications manuelles à des commandes eronnées)
KEY_TransactionID_Date <- distinct(KEY_TransactionID_Date, `Transaction ID`, .keep_all = TRUE)

#Enlever les duplicatas de KEY_SKU_ProductName
KEY_SKU_ProductName <- distinct(KEY_SKU_ProductName, `Product SKU`, .keep_all = TRUE)

#Enlever les duplicatas de KEY_SKU_Category
KEY_SKU_Category <- distinct(KEY_SKU_Category, `Product SKU`, .keep_all = TRUE)

#Joindre les données de toutes les tables
Online_joined <- left_join(Online_original, KEY_TransactionID_Date, by = "Transaction ID")
Online_joined <- left_join(Online_joined, KEY_SKU_ProductName, by = "Product SKU")
Online_joined <- left_join(Online_joined, KEY_SKU_Category, by = "Product SKU")

#Conserver uniquement les colonnes pertinentes et les réorganiser
Online <- select(Online_joined, "Transaction ID", "Date", "Product SKU", "Product", "Product Category (Enhanced E-commerce)", "Quantity.x", "Avg. Price.x", "Revenue", "Tax", "Delivery" )

#Renommer les colonnes avec un indicateur de doublon maintenant qu'il n'est plus nécéssaire
colnames(Online)[colnames(Online)=="Quantity.x"] <- "Quantity"
colnames(Online)[colnames(Online)=="Avg. Price.x"] <- "Avg. Price"

Voila notre fichier d’exemple de transactions d’une boutique en ligne fin prĂȘt!

Création du fichier de magasin physique

ConsidĂ©rant que je rends publiques les donnĂ©es de cette exemple, je ne peux utiliser les donnĂ©es privĂ©es sur lesquelles je fais normalement ce genre de travail. J’ai donc dĂ©cidĂ© d’utiliser un fichier provenant de Kaggle, et de l’ajuster Ă  la situation prĂ©sente.

Nous allons tout d’abord lire notre fichier original “UK Retailer” provenant de Kaggle: https://www.kaggle.com/carrie1/ecommerce-data

#Lire le fichier original
Retail_original <- read_csv("UK retailer data.csv")
#Retirer les retours
Retail_clean <- Retail_original %>% filter(Quantity > 0)

Maintenant, nous allons modifier les dates d’achat afin d’obtenir uniquement des dates du 1ier janvier 2018 au 31 dĂ©cembre 2018, comme dans notre fichier e-commerce

#Nous chargeons la librairie lubridate qui permet de mieux jouer avec les dates
library(lubridate)
#Convertir la colone de type caractĂšres en type date, en enlevant l'information d'heure
Retail_clean$InvoiceDate <- as.Date(Retail_clean$InvoiceDate, format = "%m/%d/%Y")

#Ajouter 1 mois puis 6 ans, et retirer 1 journée à toutes les dates
Retail_clean$InvoiceDate <- Retail_clean$InvoiceDate %m+% months(1)
Retail_clean$InvoiceDate <- Retail_clean$InvoiceDate %m+% years(6)
Retail_clean$InvoiceDate <- Retail_clean$InvoiceDate %m-% days(1)

#Retirer tout ce qui n'est pas en 2017
Retail_clean <- Retail_clean %>% filter(InvoiceDate < "2018-01-01" & InvoiceDate > "2016-12-31")

Maintenant, nous allons simuler les quantités achetées et les stocker en attendant de les appliquer sur notre fichier.

#Visualiser les quantités achetées sur la boutique en ligne en retirant les outliers
freqs <- Online %>% group_by(Quantity) %>% tally()

#Enlever les outliers
freqs <- freqs %>% filter(Quantity <= 10)

#Visualiser
ggplot(data = freqs, aes(x = Quantity, y = n)) + 
  geom_point() +
  xlim(0, 10)
#Nous allons maintenant créer des chiffres aléatoires de quantité selon la distribution de la boutique en ligne pour nos données de magasin physique 

den <- density(Online$Quantity, na.rm = TRUE)

den_qty <- round(sample(Online$Quantity, 505882, replace=TRUE) + rnorm(505882, 0, den$bw), digits = 0)

den_qty <- as.data.frame(den_qty)

#Il faut remplacer les NA créés par l'arrondissement par 1...
den_qty <- den_qty %>% mutate(den_qty = if_else(is.na(den_qty), 1, den_qty))

#Voyons voir si la distribution semble similaire Ă  l'original...
freqs2 <- den_qty %>% group_by(den_qty) %>% tally()

#Enlever les outliers
freqs2 <- freqs2 %>% filter(den_qty <= 10)

ggplot(data = freqs2, aes(x = den_qty, y = n)) + 
  geom_point() +
  xlim(0, 10)
#Ça semble le cas! 

Nous allons maintenant joindre les donnĂ©es pour notre fichier fictif en conservant uniquement les colonnes Date – Stock Code et Invoice Number, et en utilisant nos donnĂ©es prĂ©cĂ©dentes pour les quantitĂ©s achetĂ©es. On simule un fichier avec trĂšs peu d’informations, que nous enrichirons dans l’exemple.

#Création du fichier
Retail <- data.frame(InvoiceNo = Retail_clean$InvoiceNo, InvoiceDate = Retail_clean$InvoiceDate, StockCode = Retail_clean$StockCode, Quantity = den_qty$den_qty, stringsAsFactors = FALSE)

Enfin, nous allons rĂ©duire le nombre de SKU dans le fichier Retail afin qu’il soit Ă©gal au nombre de SKUS du fichier Online, ce qui nous permettra de crĂ©er la clĂ© entre les deux fichiers dans l’exemple qui suivra.

#Compter le nombre de SKUs dans le fichier Online
nrow(as.data.frame(unique(Online$`Product SKU`)))
## [1] 1178
#1178 SKUs uniques. 

#Compter le nombre de SKUs dans le fichier Retail
nrow(as.data.frame(unique(Retail$StockCode)))
## [1] 3931
#3931 SKUs uniques. C'est trop!

#Il faut diminuer de prÚs du trois quart le nombre de SKUs du fichier Retail, mais on ne veut pas trop diminuer le nombre de transactions. Nous allons donc commencer par un clean-up des SKUs qui ont des variations à l'aide d'une lettre pour conserver uniquement des SKUs numérique.

Retail$StockCode <- str_replace(Retail$StockCode, "[a-zA-Z]\\b$", "")

#Combien de SKUs maintenant? 
nrow(as.data.frame(unique(Retail$StockCode)))
## [1] 3309
#3309 SKUs. Encore trop. 

#Enlevons les SKUs qui sont des erreurs (BANKCHARGES, POS, etc.) en retirant aussi la transaction au complet. 

Retail <- Retail %>% filter(str_detect(StockCode, "\\d\\d\\d\\d\\d"))

#On peut maintenant parser la colonne comme numérique car il n'y a plus de lettres

Retail$StockCode <- parse_number(Retail$StockCode)

#Combien de SKUs maintenant? 
nrow(as.data.frame(unique(Retail$StockCode)))
## [1] 3288
#3290 SKUs. Nous allons retirer des commandes de façon arbitraire pour atteindre notre objectif (il faut se rappeler que c'est uniquement un fichier d'exemple!)

#Créons un tableau avec nos SKUs uniques, afin de voir quels sont les 1178 premiers SKUS
unique_retail_SKUS <- as.data.frame(sort(unique(Retail$StockCode)))

#Les 1178 premiers SKUs sont situés de 10002 à 22314. Nous allons exclure toutes les lignes comportant des achats de SKUs à l'extérieur de cette plage. 

Retail <- Retail %>% filter(StockCode <= 22314)

#Combien de SKUs maintenant? 
nrow(as.data.frame(unique(Retail$StockCode)))
## [1] 1178
#1178 SKUs. Nous avons atteint notre objectif! 

Voila! Nos deux fichiers sont maintenants prĂȘts pour ĂȘtre utilisĂ©s dans l’exemple. Visitez le ici: Exemple de tableau de bord automatisĂ© avec R et Google Compute Engine

Exemple de tableau de bord automatisé

Jean-Philippe Allard

6 avril 2019

Bienvenue sur cet article avec les dĂ©tails techniques de ma confĂ©rence du Web Ă  QuĂ©bec. Nous allons coder ensemble afin d’éviter Ă  Bob de passer des heures Ă  chaque mois Ă  faire les mĂȘmes opĂ©rations dans Excel, afin de le libĂ©rer Ă  faire des activitĂ©s plus productives.

Contexte de l’exemple de code

Cet exemple est basĂ© sur les donnĂ©es rĂ©elles du Google Merchandise Store Demo Account de 2017 ainsi que d’un fichier lourdement modifiĂ© provenant de Kaggle. Toutes les manipulations pour crĂ©er ces fichiers sont dĂ©taillĂ©es dans mon autre article sur la prĂ©paration des donnĂ©es dans R. Malheureusement, confidentialitĂ© oblige, c’était la seule maniĂšre de crĂ©er un exemple accessible au public, car il y a trĂšs peu de donnĂ©es transactionnelles rĂ©elles disponibles au public.

Rappel du mandat

Bob est un analyste d’affaire trĂšs travaillant. Outre ses activitĂ©s rĂ©guliĂšres, il passe une journĂ©e par mois Ă  recueillir des donnĂ©es, les nettoyer, les analyser et les mettre en page, afin de faire une prĂ©sentation de 15 minutes aux dirigeants de l’entreprise pour laquelle il travaille, sur la performance de leur boutique en ligne et de leur boutique physique.

Cela fait deux ans qu’il prĂ©sente les mĂȘmes donnĂ©es de la mĂȘme façon, ce qui implique qu’il a passĂ© 192 heures (24 jours de 8h) Ă  refaire les mĂȘmes tĂąches rĂ©pĂ©titives afin de prĂ©senter des donnĂ©es durant 6 heures (24 prĂ©sentations de 15 minutes). Bob pense qu’il doit y avoir un meilleur moyen d’utiliser son temps. Il a raison!

Solution

Bob dĂ©cide qu’il va apprendre Ă  utiliser le langage de programmation R sur Datacamp. Il planifie apprendre ce langage 1h par jour en se rĂ©veillant 1h plus tĂŽt chaque matin. Il se dit qu’en un an au maximum, avec 250h de pratique (1h/jour, 5 jours par semaine, 50 semaines), il sera capable d’utiliser ce langage pour libĂ©rer son temps. Et il a raison.

Voici ce qu’il peut faire aprĂšs 250h de pratique. Nous sommes le 1ier janvier 2018 et Bob dĂ©cide d’utiliser le temps qu’il mettait auparavant Ă  produire son rapport Ă  la main, afin de crĂ©er des visualisations selon les meilleurs principes de la communication des donnĂ©es.

Importation et nettoyage des données

#Bob commence par charger les librairies qu'il a besoin. 

#Librairie readr pour charger ses fichiers rapidement et facilement.
library(readr)

#Librairie tidyverse, une librairie de librairies, permettant de mieux travailler avec le tidy data. 
library(tidyverse)

#Librairie lubridate qui permet de facilement travailler avec les dates.
library(lubridate)

#Librairie ggthemes, qui offre des préconfigurations de style de tableaux
library(ggthemes)

#Librairie permettant de contrĂŽler l'affichage des chiffres sur une visualisation
library(scales)

#Librairie pour gérer les fontes
library(extrafont)

#Bob va aussi déterminer la localisation des dates, pour affichage en français. 
Sys.setlocale("LC_TIME", "French")

Voici les cours Datacamp pour ces différentes librairies.

readr

tidyverse

lubridate

Maintenant, Bob lit ses fichiers et les transforme en objet dans R. Dans un contexte de production, ceux-ci seraient chargés via API ou par un connecteur de données. Mais pour garder cet exemple simple, Bob lit un fichier local sur son disque dur.

Si vous voulez avoir les fichiers de cet exemple, ils sont disponibles sur Kaggle.

#Lecture des fichiers
Online <- read_csv("Online.csv", col_types = cols(Date = col_date(format = "%Y%m%d")))
Retail <- read_csv("Retail.csv", col_types = cols(InvoiceDate = col_date(format = "%Y-%m-%d")))

#Bob vérifie la structure des fichiers afin de mieux orienter ses prochaines manipulations
glimpse(Online)
## Observations: 54,144
## Variables: 10
## $ `Transaction ID`                         <dbl> 48497, 48496, 48495, ...
## $ Date                                     <date> 2017-12-31, 2017-12-...
## $ `Product SKU`                            <chr> "GGOENEBQ079099", "GG...
## $ Product                                  <chr> "NestÂź Protect Smoke ...
## $ `Product Category (Enhanced E-commerce)` <chr> "Nest-USA", "Nest-USA...
## $ Quantity                                 <dbl> 4, 5, 1, 1, 1, 3, 1, ...
## $ `Avg. Price`                             <dbl> 80.52, 80.52, 151.88,...
## $ Revenue                                  <dbl> 316.00, 395.00, 149.0...
## $ Tax                                      <dbl> 34.44, 33.14, 12.06, ...
## $ Delivery                                 <dbl> 19.99, 6.50, 6.50, 6....
glimpse(Retail)
## Observations: 181,247
## Variables: 4
## $ InvoiceNo   <dbl> 536598, 536598, 536598, 536599, 536599, 536600, 53...
## $ InvoiceDate <date> 2017-01-01, 2017-01-01, 2017-01-01, 2017-01-01, 2...
## $ StockCode   <dbl> 21421, 21422, 22178, 20749, 21056, 21730, 21871, 2...
## $ Quantity    <dbl> 1, 2, 26, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 60, 2, 1, ...

Bob remarque que son fichier Retail, montrant les ventes des magasins physiques, n’est pas trĂšs complet par rapport Ă  son fichier Online. Il aimerait rajouter l’information sur les produits, leur prix de vente et leur catĂ©gorie Ă  son fichier Retail. Mais les codes de produit sont aussi diffĂ©rents! Il va donc falloir crĂ©er une “clĂ©â€ entre les “Product SKU” du fichier online et le “StockCode” du fichier retail.

Bob cherche donc Ă  trouver une liste de StockCode – Nom de produit, mais malheureusement, son entreprise n’a jamais cru bon de crĂ©er cette liste (Ă  se demander comment elle est toujours en affaires!). Comme Bob doit travailler avec ces contraintes, cela implique qu’il doit crĂ©er un fichier de “clĂ©â€ faisant le lien entre le SKU et le StockCode. Bob demande donc Ă  son stagiaire, GĂ©rard, de crĂ©er la concordance entre les 1179 Product SKU et les 1179 StockCodes. GĂ©rard, aprĂšs avoir sombrĂ© dans l’alcoolisme, lui livre le fichier suivant:

KEY_SKU <- read_csv("KEY_SKU.csv")

glimpse(KEY_SKU)
## Observations: 1,178
## Variables: 2
## $ `Product SKU` <chr> "GGOENEBQ079099", "GGOENEBQ079199", "GGOENEBQ084...
## $ StockCode     <dbl> 21421, 21422, 22178, 20749, 21056, 21730, 21871,...

Il s’agit de la concordance entre chaque StockCode et son Product SKU. Avec cette concordance, il devient possible de prendre les informations du fichier Online et de les appliquer au fichier Retail.

Il faut d’abord crĂ©er un fichier avec la liste des informations voulues par SKU, c’est-Ă -dire le nom du produit, sa catĂ©gorie, et son prix.

#On commence par créer un vecteur logique des SKUS dupliqués, qu'on rajoute comme une nouvelle colonne dans notre fichier Online. 
Online$dups <- duplicated(Online$`Product SKU`)

#On conserve uniquement les lignes non dupliquées
Product_list <- Online %>% filter(dups == FALSE)

#On conserve seulement l'information pertinente
Product_list <- Product_list[c("Product SKU", "Product", "Product Category (Enhanced E-commerce)", "Avg. Price")]

#On rajoute le stock code Ă  notre liste de produits
Product_list <- left_join(KEY_SKU, Product_list, by = "Product SKU")

#Notre liste de produits avec toutes les informations est prĂȘte! 
glimpse(Product_list)
## Observations: 1,178
## Variables: 5
## $ `Product SKU`                            <chr> "GGOENEBQ079099", "GG...
## $ StockCode                                <dbl> 21421, 21422, 22178, ...
## $ Product                                  <chr> "NestÂź Protect Smoke ...
## $ `Product Category (Enhanced E-commerce)` <chr> "Nest-USA", "Nest-USA...
## $ `Avg. Price`                             <dbl> 80.52, 80.52, 151.88,...
#On peut enlever la colonne dups de notre fichier Online
Online$dups <- NULL

#Et ensuite, rajouter toute l'information Ă  notre fichier Retail
Retail <- merge(Retail, Product_list, by = "StockCode", all.x = TRUE)
Retail <- arrange(Retail, InvoiceDate, InvoiceNo)

#Nous pouvons calculer le reste de l'information manquante: les revenus et les taxes. Nous calculons par ligne d'abord:
perLine <- Retail %>% mutate(RevenuePerLine = Quantity * `Avg. Price`, TaxPerLine = RevenuePerLine * 0.014975)

#Puis nous groupons les lignes par numéro de commande: 
perInvoiceNo <- perLine %>% group_by(InvoiceNo) %>% summarise(Revenue = sum(RevenuePerLine), Tax = sum(TaxPerLine))

#Puis nous joignons ces informations à nos données
Retail <- merge(Retail, perInvoiceNo, all.x = TRUE)

#Arrondissons le montant des taxes
Retail$Tax <- round(Retail$Tax, digits = 2)

#Et ajoutons des frais de livraison de 0
Retail <- Retail %>% mutate(Delivery = 0)

#On peut mĂȘme enlever le StockCode et travailler uniquement avec le Product SKU
Retail$StockCode <- NULL

#Notre fichier Retail possĂšde maintenant toutes les informations disponibles dans notre fichier Online! 
glimpse(Online)
## Observations: 54,144
## Variables: 10
## $ `Transaction ID`                         <dbl> 48497, 48496, 48495, ...
## $ Date                                     <date> 2017-12-31, 2017-12-...
## $ `Product SKU`                            <chr> "GGOENEBQ079099", "GG...
## $ Product                                  <chr> "NestÂź Protect Smoke ...
## $ `Product Category (Enhanced E-commerce)` <chr> "Nest-USA", "Nest-USA...
## $ Quantity                                 <dbl> 4, 5, 1, 1, 1, 3, 1, ...
## $ `Avg. Price`                             <dbl> 80.52, 80.52, 151.88,...
## $ Revenue                                  <dbl> 316.00, 395.00, 149.0...
## $ Tax                                      <dbl> 34.44, 33.14, 12.06, ...
## $ Delivery                                 <dbl> 19.99, 6.50, 6.50, 6....
glimpse(Retail)
## Observations: 181,247
## Variables: 10
## $ InvoiceNo                                <dbl> 536598, 536598, 53659...
## $ InvoiceDate                              <date> 2017-01-01, 2017-01-...
## $ Quantity                                 <dbl> 1, 2, 26, 2, 2, 2, 1,...
## $ `Product SKU`                            <chr> "GGOENEBQ079099", "GG...
## $ Product                                  <chr> "NestÂź Protect Smoke ...
## $ `Product Category (Enhanced E-commerce)` <chr> "Nest-USA", "Nest-USA...
## $ `Avg. Price`                             <dbl> 80.52, 80.52, 151.88,...
## $ Revenue                                  <dbl> 4190.44, 4190.44, 419...
## $ Tax                                      <dbl> 62.75, 62.75, 62.75, ...
## $ Delivery                                 <dbl> 0, 0, 0, 0, 0, 0, 0, ...

DerniÚre étape avant de faire nos analyses et nos visualisations: joindre les deux tableaux ensemble.

#Il faut d'abord renommer les colonnes pour qu'elles possĂšdent le mĂȘme nom d'un cĂŽtĂ© comme de l'autre. Ça nous simplifiera la vie. 
Retail <- Retail %>% rename("Transaction ID" = "InvoiceNo", "Date" = "InvoiceDate")

#On rajoute un colonne catégorielle à chaque tableau
Retail$Channel <- "Retail"
Online$Channel <- "Online"

#On joint
Full <- bind_rows(Online, Retail)

#Notre tableau complet est prĂȘt! 

Analyse des données

Maintenant que toutes nos données sont regroupées, il est trÚs facile de faire des statistiques descriptives en utilisant les fonctions de base de R ainsi que les fonctions group_by(), filter() et summarize() de dplyr.

#Exemple: On peut calculer le revenu total annuel par Canal de vente (Online ou Retail)
Full_unique <- Full %>% 
  filter(duplicated(Full$`Transaction ID`) == FALSE)

Revenue_by_channel <- Full_unique %>% 
  group_by(Channel) %>% 
  summarize(sum(Revenue))

Revenue_by_channel
## # A tibble: 2 x 2
##   Channel `sum(Revenue)`
##   <chr>            <dbl>
## 1 Online        4743705.
## 2 Retail       19019265.

Rappelons les données que nous voulons obtenir et présenter pour notre rapport:

  • Revenus par catĂ©gorie par mois
  • Croissance par catĂ©gorie MoM
  • Estimation des ventes pour le mois suivant
  • ScĂ©narios d’estimation des ventes en fonction du budget marketing

Nous allons produire et visualiser chacune de ces données. Débutons par créer un sommaire des revenus par canal, par catégorie, et par mois.

Revenus par mois par catégorie

#Créer la colonne "Mois-Année" qui va agir à titre de facteur de groupement
Full_unique$Mois_An <- format(as.Date(Full_unique$Date), "%Y-%m")

#Changer les vecteurs catégoriels en facteurs
Full_unique$`Product Category (Enhanced E-commerce)` <- as.factor(Full_unique$`Product Category (Enhanced E-commerce)`)
Full_unique$Mois_An <- as.factor(Full_unique$Mois_An)
Full_unique$Channel <- as.factor(Full_unique$Channel)

#Créer le sommaire des ventes par canal, mois et catégorie. 
Full_summary <- Full_unique %>%
  group_by(Channel, Mois_An, `Product Category (Enhanced E-commerce)`, .drop = FALSE) %>%
  summarize(sum(Revenue))

#On remplace les ventes non catégorisées par une catégorie "Autres"
Full_summary$`Product Category (Enhanced E-commerce)` <- as.character(Full_summary$`Product Category (Enhanced E-commerce)`)

Full_summary$`Product Category (Enhanced E-commerce)` <- Full_summary$`Product Category (Enhanced E-commerce)` %>% replace_na("Other")

Full_summary$`Product Category (Enhanced E-commerce)` <- as.factor(Full_summary$`Product Category (Enhanced E-commerce)`)

Maintenant que nous avons notre sommaire de ventes par canal, par catégorie et par mois, nous pouvons commençer à créer nos visualisations.

#Initialisation de la date. Dans un cadre réel, nous utiliserions Sys.Date(), mais ici, nous utilisons une date fixe pour notre exemple. 

sysdate <- as.Date(ymd_hms("2018-01-01 9:00:00"))

#Visualisation des ventes du dernier mois, par catégorie. 
ggplot(data = filter(Full_summary, Mois_An == format(as.Date(sysdate %m+% months(-1)), "%Y-%m")), aes(x = reorder(`Product Category (Enhanced E-commerce)`, `sum(Revenue)`), y = `sum(Revenue)`, fill = Channel)) +
  geom_col(position = "stack") +
  coord_flip() +
  theme_tufte() + 
  theme(legend.position = c(0.8, 0.15)) +
  scale_fill_manual(values = c("#2c7bb6", "#abd9e9")) +
  scale_y_continuous(labels = dollar) +
  theme(axis.title.x = element_text(family = "Arial", colour="#484848", size=12),
        axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
        axis.title.y = element_blank(),
        axis.text.y  = element_text(family = "Arial", colour="#484848", size=12), 
        legend.title = element_text(family = "Arial", colour="#484848", size=10), 
        legend.text  = element_text(family = "Arial", colour="#484848", size=9),
        plot.title   = element_text(family = "Arial", colour="#484848", size=16),
        plot.subtitle = element_text(family = "Arial", colour="#484848", size=10)) +
  labs(y = "Revenus (En $)",
       title = "Ventes par catégorie, par canal",
       subtitle = (paste("Mois de", format(as.Date(sysdate %m+% months(-1)), "%B %Y"), sep = " ")),
       fill = "Canal")

Maintenant, nous désirons obtenir la croissance des ventes par catégorie pour le dernier mois complet, comparé au mois précédent.

#Calcul de la croissance des ventes du dernier mois (Décembre) par rapport au mois précédent (Novembre)
Summary_current <- Full_summary %>% filter(Mois_An == format(as.Date(sysdate %m+% months(-1)), "%Y-%m"))
Summary_previous <- Full_summary %>% filter(Mois_An == format(as.Date(sysdate %m+% months(-2)), "%Y-%m"))
Summary_current$Growth <- (Summary_previous$`sum(Revenue)` - Summary_current$`sum(Revenue)`) / Summary_previous$`sum(Revenue)` * 100

#
Summary_current[is.na(Summary_current)] <- NA
Summary_current$Growth[is.infinite(Summary_current$Growth)] <- NA

#Visualisation de la croissance des ventes du dernier mois, en ligne, par catégorie. 
ggplot(data = filter(Summary_current, Channel == "Online" & !is.na(Growth)), aes(x = reorder(`Product Category (Enhanced E-commerce)`, Growth), y = Growth, fill = Growth > 0)) +
  geom_col() +
  coord_flip(ylim = c(-100, 100)) +
  theme_tufte() + 
  theme(axis.title.x = element_text(family = "Arial", colour="#484848", size=12),
        axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
        axis.title.y = element_blank(),
        axis.text.y  = element_text(family = "Arial", colour="#484848", size=12),
        plot.title   = element_text(family = "Arial", colour="#484848", size=16),
        plot.subtitle = element_text(family = "Arial", colour="#484848", size=10),
        legend.position = "none"
        ) +
  labs(y = "Variation MoM (en %)",
       title = "Variation des ventes mensuelles en ligne",
       subtitle = (paste("Mois de", format(as.Date(sysdate %m+% months(-1)), "%B %Y"), "par rapport Ă ", format(as.Date(sysdate %m+% months(-2)), "%B %Y"), sep = " "))) +
       scale_fill_manual(values=c("FALSE"= "#fdae61", "TRUE" = "#abd9e9"))
#Visualisation de la croissance des ventes du dernier mois, en magasin, par catégorie. 
ggplot(data = filter(Summary_current, Channel == "Retail" & !is.na(Growth)), aes(x = reorder(`Product Category (Enhanced E-commerce)`, Growth), y = Growth, fill = Growth > 0)) +
  geom_col()+
  coord_flip(ylim = c(-100, 100)) +
  theme_tufte() + 
  theme(axis.title.x = element_text(family = "Arial", colour="#484848", size=12),
        axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
        axis.title.y = element_blank(),
        axis.text.y  = element_text(family = "Arial", colour="#484848", size=12),
        plot.title   = element_text(family = "Arial", colour="#484848", size=16),
        plot.subtitle = element_text(family = "Arial", colour="#484848", size=10),
        legend.position = "none"
        ) +
  labs(y = "Variation MoM (en %)",
       title = "Variation des ventes mensuelles en magasin",
       subtitle = (paste("Mois de", format(as.Date(sysdate %m+% months(-1)), "%B %Y"), "par rapport Ă ", format(as.Date(sysdate %m+% months(-2)), "%B %Y"), sep = " "))) +
       scale_fill_manual(values=c("FALSE"= "#fdae61", "TRUE" = "#abd9e9"))

Maintenant que nous connaissons nos ventes et notre croissance par catĂ©gorie, nous aimerions faires des prĂ©visions pour le mois prochain afin d’établir un objectif de ventes.

Si vous voulez apprendre Ă  faire des modĂšles de sĂ©ries temporelles, voici l’excellent cours sur Datacamp: Forecasting using R par Rob J. Hyndman, le crĂ©ateur de la librairie forecast.

#Chargeons la librairie forecast qui permet de faire des modÚles prédictifs de série temporelle, et la librairie xts qui permet de créer des objets de type séries de dates plus facilement
library(forecast)
library(xts)

#Créons les revenus journaliers totaux, incluant les ventes en ligne et en magasin
Revenue_daily <- Full_unique %>% group_by(Date) %>% summarize(sum(Revenue))

#Et une série de dates pour construire notre objet xts
dates <- seq(as.Date("2017-01-01"), length = 365, by = "days")

#Convertissons cet objet en format xts
Revenue_daily <- xts(Revenue_daily$`sum(Revenue)`, order.by = dates)

#Créons notre modÚle prédictif de maniÚre automatique
model <- auto.arima(Revenue_daily, stepwise = FALSE)

#Faisons une prédiction pour le nombre de jours dans le mois actuel
fcast <- forecast(model, h = days_in_month(sysdate))

#On jette un oeil rapide à la prédiction et aux valeurs prédites
plot(fcast)
#Et aux prévisions moyennes
fcast$mean
## Time Series:
## Start = 366 
## End = 396 
## Frequency = 1 
##  [1] 100409.10  95617.85  82661.92  95286.51  98492.79  85303.40  91042.45
##  [8]  98923.06  88758.51  88421.40  97584.02  91933.86  87538.74  95362.89
## [15]  94152.09  88053.42  93077.02  95182.81  89395.81  91298.83  95155.73
## [22]  90978.02  90295.77  94414.55  92341.67  90062.89  93365.82  93227.23
## [29]  90410.92  92360.72  93573.34
#On crée notre tableau de données à visualiser
df <- data.frame(Bas = sum(fcast$lower[,1]), Moyen = sum(fcast$mean), `ÉlevĂ©` = sum(fcast$upper[,1]))
df_long <- gather(df, key = "Estimation", value = "value")

#On ajuste l'affichage des chiffres en $
dollar <- dollar_format(accuracy = 1, big.mark = " ", prefix = "", suffix = "$")

#On crée notre visualisation
ggplot(data = df_long, aes(x = Estimation, y = value, fill = Estimation, label = dollar(value))) +
  geom_bar(stat="identity", position = "dodge") +
  geom_text(hjust = 1.1, size = 5, color = "#ffffff") +
  coord_flip() +
  theme_tufte() +
  scale_y_continuous(labels = dollar) +
  scale_x_discrete(limits = c("ÉlevĂ©", "Moyen", "Bas")) +
  scale_fill_manual(values = c("#abd9e9", "#abd9e9", "#2c7bb6")) +
  labs(title = (paste("Estimation des ventes pour le mois de", format(as.Date(sysdate), "%B %Y"), sep = " ")),
       subtitle = "Calculé à l'aide d'un modÚle ARIMA automatique") +
  theme(
    axis.title.x = element_blank(),
    axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
    axis.title.y = element_blank(),
    axis.text.y  = element_text(family = c("Arial", "Arial Black", "Arial"), colour="#484848", size=12), 
    plot.title   = element_text(family = "Arial", colour="#484848", size=16),
    plot.subtitle = element_text(family = "Arial", colour="#484848", size=10),
    legend.position = "none"
) 

En utilisant uniquement un modĂšle de sĂ©rie temporelles, il y aura toujours une marge d’erreur assez importante. Toutefois, il est aussi possible de crĂ©er plutĂŽt un modĂšle de rĂ©gression linĂ©aire avec des erreurs ARIMA. Comme nous dĂ©sirons conaitre l’effet de la publicitĂ© sur nos ventes, nous allons crĂ©er ce type de modĂšle avec des donnĂ©es sur le budget publicitaire online et offline, et ensuite faire des prĂ©dictions par scĂ©narios.

#Commençons par importer un fichier avec les dépenses marketing par jour pour l'année 2017. 
Marketing_spend <- read_csv("Marketing_Spend.csv", 
    col_types = cols(`Offline Spend` = col_double(), 
        `Online Spend` = col_double(), X1 = col_date(format = "%Y-%m-%d")))

#On crée trois modÚles en ajoutant les budgets marketing comme régresseurs
model_spend_both <- auto.arima(Revenue_daily, stepwise = FALSE, xreg = cbind(Marketing_spend$`Online Spend`, Marketing_spend$`Offline Spend`))

model_spend_online <- auto.arima(Revenue_daily, stepwise = FALSE, xreg = Marketing_spend$`Online Spend`)

model_spend_offline <- auto.arima(Revenue_daily, stepwise = FALSE, xreg = Marketing_spend$`Offline Spend`)

#On observe le "fit" des modĂšles
summary(model_spend_both)
## Series: Revenue_daily 
## Regression with ARIMA(3,0,0) errors 
## 
## Coefficients:
##           ar1      ar2     ar3   intercept    xreg1   xreg2
##       -0.0879  -0.0553  0.0715  -24577.857  43.1001  2.6479
## s.e.   0.0523   0.0524  0.0529    2346.622   0.9302  0.7613
## 
## sigma^2 estimated as 190771248:  log likelihood=-3994.55
## AIC=8003.11   AICc=8003.42   BIC=8030.41
## 
## Training set error measures:
##                    ME  RMSE      MAE       MPE     MAPE      MASE
## Training set 8.370002 13698 11354.57 -12.31825 34.27963 0.3066989
##                      ACF1
## Training set -0.002404769
summary(model_spend_online)
## Series: Revenue_daily 
## Regression with ARIMA(3,0,0) errors 
## 
## Coefficients:
##           ar1      ar2     ar3   intercept     xreg
##       -0.0579  -0.0164  0.1133  -18797.216  44.0179
## s.e.   0.0527   0.0524  0.0531    1899.972   0.9144
## 
## sigma^2 estimated as 195942090:  log likelihood=-3999.95
## AIC=8011.9   AICc=8012.13   BIC=8035.3
## 
## Training set error measures:
##                   ME     RMSE      MAE       MPE     MAPE      MASE
## Training set 8.96493 13901.72 11577.88 -13.89588 34.22336 0.3127307
##                      ACF1
## Training set -0.008030993
summary(model_spend_offline)
## Series: Revenue_daily 
## Regression with ARIMA(0,1,4) errors 
## 
## Coefficients:
##           ma1      ma2     ma3     ma4     xreg
##       -0.9442  -0.1772  0.0047  0.1510  14.0375
## s.e.   0.0517   0.0723  0.0749  0.0534   1.6692
## 
## sigma^2 estimated as 1.224e+09:  log likelihood=-4323.92
## AIC=8659.84   AICc=8660.07   BIC=8683.22
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE     MAPE      MASE
## Training set 356.6522 34692.86 26926.26 -69.75817 96.22966 0.7273065
##                     ACF1
## Training set 0.005368986

Le modĂšle incluant les deux rĂ©gresseurs est supĂ©rieur (AIC plus faible). On remarque aussi que le budget de marketing offline a peu d’effet sur les ventes, avec un coefficient de seulement 2.64, comparĂ© Ă  un coefficient de 43.10 pour le budget de marketing online. Une autre chose intĂ©ressante est que le AIC du modĂšle incluant les rĂ©gresseurs est beaucoup plus faible que celui n’incluant pas les rĂ©gresseurs, ce qui indique que nous devrions ĂȘtre en mesure de faire des prĂ©dictions plus prĂ©cises.

Créons maintenant nos prédictions qui incluent le budget marketing prévu.

#Il faut d'abord créer des tableaux avec des scénarios d'augmentation de budgets en fonction des budgets du mois précédent.

Budget_same <- Marketing_spend %>% 
                filter(X1 <= (ceiling_date(as.Date(sysdate %m+% months(-1)), "month") - days(1)) & X1 >= as.Date(sysdate %m+% months(-1)))

Budget_higher_online <- Marketing_spend %>% 
                          filter(X1 <= (ceiling_date(as.Date(sysdate %m+% months(-1)), "month") - days(1)) & X1 >= as.Date(sysdate %m+% months(-1))) %>%
                          mutate(`Online Spend` = `Online Spend` * 1.25)

Budget_higher_offline <- Marketing_spend %>% 
                          filter(X1 <= (ceiling_date(as.Date(sysdate %m+% months(-1)), "month") - days(1)) & X1 >= as.Date(sysdate %m+% months(-1))) %>%
                          mutate(`Offline Spend` = `Offline Spend` * 1.25)

#On peut maintenant créer trois prédictions avec nos trois scénarios
fcast_same <- forecast(model_spend_both, xreg = cbind(Budget_same$`Online Spend`, Budget_same$`Offline Spend`), h = days_in_month(sysdate))

fcast_higher_online <- forecast(model_spend_both, xreg = cbind(Budget_higher_online$`Online Spend`, Budget_higher_online$`Offline Spend`), h = days_in_month(sysdate))

fcast_higher_offline <- forecast(model_spend_both, xreg = cbind(Budget_higher_offline$`Online Spend`, Budget_higher_offline$`Offline Spend`), h = days_in_month(sysdate))

#On jette un oeil à nos prédictions. Laquelle semble la plus intéressante? 
plot(fcast_same)
plot(fcast_higher_online)
plot(fcast_higher_offline)

Maintenant que nous avons nos prédictions avec nos trois scénarios, nous allons visualiser celles-ci. En premier lieu, nous allons refaire notre estimation précédente des ventes du mois avec notre nouveau modÚle plus précis.

#On crée notre tableau de données à visualiser
df_same <- data.frame(Bas = sum(fcast_same$lower[,1]), Moyen = sum(fcast_same$mean), `ÉlevĂ©` = sum(fcast_same$upper[,1]))
df_long_same <- gather(df_same, key = "Estimation", value = "value")

#On crée notre visualisation
ggplot(data = df_long_same, aes(x = Estimation, y = value, fill = Estimation, label = dollar(value))) +
  geom_bar(stat="identity", position = "dodge") +
  geom_text(hjust = 1.1, size = 5, color = "#ffffff") +
  coord_flip() +
  theme_tufte() +
  scale_y_continuous(labels = dollar) +
  scale_x_discrete(limits = c("ÉlevĂ©", "Moyen", "Bas")) +
  scale_fill_manual(values = c("#abd9e9", "#abd9e9", "#2c7bb6")) +
  labs(title = (paste("Estimation des ventes pour le mois de", format(as.Date(sysdate), "%B %Y"), sep = " ")),
       subtitle = "Budget de marketing identique au mois précédent", 
       caption = "Régression linéaire du budget marketing sur les ventes avec erreurs ARIMA\nNiveau de confiance 80%") +
  theme(
    axis.title.x = element_blank(),
    axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
    axis.title.y = element_blank(),
    axis.text.y  = element_text(family = c("Arial", "Arial Black", "Arial"), colour="#484848", size=12), 
    plot.title   = element_text(family = "Arial", colour="#484848", size=16),
    plot.subtitle = element_text(family = "Arial", colour="#484848", size=10),
    plot.caption = element_text(family = "Arial", colour="#484848", size=8),
    legend.position = "none"
) 

DĂ©jĂ  beaucoup plus prĂ©cis! Maintenant, nous allons crĂ©er une visualisation qu dĂ©montre les trois scĂ©narios dans un seul graphique, afin qu’il soit Ă©vident de la dĂ©cision Ă  prendre.

#On crée notre tableau de données à visualiser
df_budget <- data.frame(Budget = c("Identique", "25% de plus en ligne", "25% de plus hors ligne"), 
                        Moyen = c(sum(fcast_same$mean), sum(fcast_higher_online$mean), sum(fcast_higher_offline$mean)))

#On crée notre visualisation
ggplot(data = df_budget, aes(x = Budget, y = Moyen, fill = Budget, label = dollar(Moyen))) +
  geom_bar(stat="identity", position = "dodge") +
  geom_text(hjust = 1.1, size = 5, color = "#ffffff") +
  coord_flip() +
  theme_tufte() +
  scale_y_continuous(labels = dollar) +
  scale_fill_manual(values = c("#2c7bb6", "#abd9e9", "#abd9e9")) +
  scale_x_discrete(limits = c("25% de plus en ligne", "25% de plus hors ligne", "Identique")) +
  labs(title = (paste("Estimation des ventes pour le mois de", format(as.Date(sysdate), "%B %Y"), sep = " ")),
       subtitle = "En fonction d'une augmentation du budget marketing en ligne ou hors ligne", 
       caption = "Prédictions calculées à partir de la moyenne du modÚle de régression\n linéaire du budget marketing sur les ventes avec erreurs ARIMA") +
  theme(
    axis.title.x = element_blank(),
    axis.text.x  = element_text(family = "Arial", colour="#484848", size=12),
    axis.title.y = element_blank(),
    axis.text.y  = element_text(family = c("Arial Black", "Arial", "Arial"), colour="#484848", size=12), 
    plot.title   = element_text(family = "Arial", colour="#484848", size=16),
    plot.subtitle = element_text(family = "Arial", colour="#484848", size=10),
    plot.caption = element_text(family = "Arial", colour="#484848", size=8),
    legend.position = "none"
) 

DĂ©marrage de l’instance Google Compute Engine

Maintenant que nous avons tous les rapports que nous désirons envoyer chaque mois, il nous reste seulement deux étapes. La premiÚre est de créer une instance de RStudio dans Google Compute Engine, et la deuxiÚme est de créer un script dans cette instance qui enverra notre rapport chaque mois. Commençons par créer notre instance de RStudio dans Google Compute Engine avec la librairie googleComputeEngineR.

La premiĂšre Ă©tape est de crĂ©er un compte Google Compute Engine. Il faut ajouter une carte de crĂ©dit, mais l’utilisation d’un serveur f1-micro est gratuit. C’est amplement assez performant pour la tĂąche qu’on va lui demander une fois par mois.

Ensuite, il faut crĂ©er notre projet, puis aller chercher les dĂ©tails de notre “Service Account” en format JSON: API Manager -> Credentials -> Create credentials -> Service account key -> Key type = JSON. On ajoute ce fichier au dossier de travail de notre projet. À noter que c’est ce fichier JSON qui contient les informations d’accĂšs au compte GCE: il convient donc de bien le protĂ©ger.

Ensuite, il faut créer un fichier .Renviron dans notre dossier de travail (avec le bloc-note) qui sera chargé automatiquement lorsque la librairie sera activée. Ce fichier doit contenir les éléments suivants:

GCE_AUTH_FILE = "C:/My First Project-168c949fa5ac.json" #L'emplaçement du fichier JSON créé précédemment. 
GCE_DEFAULT_PROJECT_ID = "mineral-highway-236314" #Le project ID du "My First Projet" créé par Google lors de la création du compte, ou un autre projet si vous préférez. 
GCE_DEFAULT_ZONE = "us-east1-b" #L'emplaçement du serveur, qui devrait ĂȘtre celui-ci si vous vous connectez Ă  partir de la cote est. 

Ensuite, le code pour créer la nouvelle instance GCE est excessivement simple.

library(googleComputeEngineR)

vm <- gce_vm(template = "rstudio",
             name = "autoemailer", #Nom qu'on désire donner à l'instance
             username = "waq", #Nom d'utilisateur pour RStudio
             password = "qwertyiscool", #Mot de passe pour RStudio
             predefined_type = "n1-standard-1") #Type de serveur

Le f1-micro est le seul serveur gratuit, mais j’ai plutĂŽt utilisĂ© un n1-standard-1 Ă  environ 25$/mois car les librairies utilisĂ©es pour l’exemple dĂ©passaient la capacitĂ© de mĂ©moire du petit f1-micro.

PrĂ©paration de l’instance de machine virtuelle

Il faut d’abord installer les librairies qui ne sont pas incluses dans l’image de base. Mais avant cela, il faut installer java ainsi que rJava via le terminal de notre instance (Linux Debian 8) car ils sont une dĂ©pendance de la librairie mailR que nous utiliserons pour l’envoi de courriel.

sudo apt-get install default-jdk
sudo apt-get install r-cran-rjava
sudo R CMD javareconf

Maintenant, nous pouvons installer les librairies:

install.packages("cronR")
install.packages("ggthemes")
install.packages("extrafont")
install.packages("miniUI")
install.packages("forecast")
install.packages("xts")
install.packages("mailR")
install.packages("rJava")
install.packages("shiny")
install.packages("shinyFiles")

Et les activer:

library(rJava)
library(cronR)
library(miniUI)
library(mailR)
library(readr)
library(tidyverse)
library(lubridate)
library(ggthemes)
library(scales)
library(extrafont)
library(forecast)
library(xts)
library(shiny)
library(shinyFiles)

Ensuite, si on veut que les dates soient formattĂ©es correctement, il faut crĂ©er la locale fr_FR.UTF-8, encore une fois dans le terminal, avec l’application Ă  cet effet:

sudo dpkg-reconfigure locales

Et créer un fichier .Renviron avec les locales qui seront chargées au start-up de R:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=fr_FR.UTF-8

Et enfin, installer et activer le service cron dans le terminal

sudo apt-get install cron
sudo cron start

CrĂ©ation du script d’envoi de courriel automatique

J’ai d’abord créé une version abrĂ©gĂ©e du fichier actuel en format R Markdown, contenant uniquement les graphiques ainsi qu’une courte explication de ceux-ci. J’ai tĂ©lĂ©versĂ© ce fichier sur mon instance GCE directement via RStudio. Ensuite, il faut tĂ©lĂ©verser tous les documents que nous avons utilisĂ©s jusqu’ici. Le plus simple est de les copier via un fichier .zip qui sera automatiquement dĂ©compressĂ© Ă  l’arrivĂ©e.

Une fois que c’est fait, voici le script à utiliser:

#Créer le rapport en html à partir du fichier .rmd
rapport <- rmarkdown::render("Rapport_Mensuel.Rmd")

#Envoyer le courriel
mailR::send.mail(from = "[email protected]",
          to = "[email protected]",
          subject = "Rapport de performance du mois",
          body = "Rapport_Mensuel.html",
          html = TRUE,
          inline = TRUE,
          smtp = list(host.name = "smtp.gmail.com", port = 465, user.name = "[email protected]", passwd = "xxxxxxxx", ssl = TRUE),
          authenticate = TRUE,
          send = TRUE)

La toute derniĂšre Ă©tape est de sĂ©lectionner ce script dans l’onglet Tools –> Addins –> cronR afin de sĂ©lectionner la frĂ©quence dĂ©sirĂ©e!

Voila, vous reçevrez maintenant vos rapports dans votre boite courriel, toujours mis à jour, sans lever le petit doigt!

Un hybride entre le mealkit et l’Ă©picerie en ligne

Je lisais tantĂŽt un article sur la perte nette des MarchĂ©s Goodfood. C’est certainement impressionnant d’avoir plus que doublĂ© ses abonnĂ©s en un an (45 000 Ă  126 000!), mais combien de ceux-ci sont de rĂ©els abonnĂ©s que ne font pas que surfer les promotions? Il faut se questionner sur le modĂšle d’affaires mĂȘme d’une entreprise avec une perte nette de 4,9M sur un revenu de 29,6M – c’est-Ă -dire une perte de 20%. Ça fait toute une pente Ă  remonter avant d’ĂȘtre profitable!

Un KPI que je serais vraiment curieux de savoir pour les MarchĂ©s Goodfood (et tous les autres compagnies de mealkits, d’ailleurs!) est le LTV/CAC, qui permet de voir le ratio entre la valeur Ă  vie d’un client et son coĂ»t d’acquisition. Avec ses campagnes d’acquisition trĂšs agressives, je parie que celle des MarchĂ©s Goodfood est infĂ©rieure Ă  1. On conseille gĂ©nĂ©ralement de garder ce ratio entre 2 et 4.  Ă‡a prendra des poches profondes afin de faire vivre cette entreprise jusqu’à la rentabilitĂ©, qui ne pourra ĂȘtre atteinte que par une baisse importante des coĂ»ts d’acquisition, suivie d’une baisse de la croissance des abonnĂ©s, et Ă©videmment d’investisseurs mĂ©contents!

Je ne suis pas un fan du modĂšle d’affaire de l’offre de service actuelle des compagnies de mealkits. Je trouve que c’est beaucoup de main d’Ɠuvre peu productive, remplir des petits pots de vinaigre balsamique et emballer des oignons verts individuellement dans des sacs de plastique. Toutefois, quand on cherche plus loin, la vraie valeur des compagnies de mealkits, qui explique Ă©videmment leur popularitĂ©, n’est pas le produit lui-mĂȘme, c’est le convenience. Le cĂŽtĂ© pratique de ne pas avoir Ă  aller Ă  l’épicerie aussi souvent, mais surtout le fait de ne pas avoir Ă  choisir des recettes sur des sites web fragmentĂ©es pour ensuite les Ă©crire sur un papier qu’on va perdre, pour ensuite oublier la moitiĂ© des choses qu’on voulait acheter Ă  l’épicerie.

Les gros joueurs d’épicerie n’ont pas encore vu que c’était lĂ , la vĂ©ritable valeur de ces entreprises. Un seul joueur s’en approche, IGA, avec sa plate-forme de recettes en ligne qui permet de cocher les ingrĂ©dients manquants sur chaque recette qu’on sĂ©lectionne pour les mettre automatiquement dans le panier d’épicerie. Toutefois, deux problĂšmes majeurs ne permettent pas Ă  cette plate-forme de rayonner :

  1. La fonctionnalitĂ© elle-mĂȘme ne fonctionne pas : quand on essaie d’ajouter plusieurs produits au panier, seul le premier est ajoutĂ© Ă  titre de recherche qu’on doit ensuite choisir. Exemple, s’il faut acheter des pommes, il faut choisir le type de pommes. C’est trop de friction : il faudrait que le produit optimal pour la recette soit dĂ©jĂ  programmĂ© dans la recette, par exemple 2lbs de pommes Fuji ajoutĂ©es directement dans le panier d’achats.
  2. La plate-forme fonctionne seulement en achat simple plutĂŽt qu’en abonnement, ce qui fait qu’on doit rĂ©acquĂ©rir les utilisateurs constamment.

Il n’en faudrait pas beaucoup pour qu’IGA (ou un autre gros joueur) lance sa propre plateforme de mealkits personnalisĂ©e, et diffĂ©renciĂ©e des joueurs actuels :

  1. Une plate-forme oĂč on s’engage Ă  acheter de maniĂšre hebdomadaire, avec un paiement rĂ©current donnant droit Ă  la livraison gratuite, qui pourrait se transformer en carte-cadeau si la balance n’est pas utilisĂ©e et qu’on dĂ©cide d’arrĂȘter notre abonnement.  
  2. Une dizaine de recettes différentes proposées chaque semaine parmis lesquelles on peut en sélectionner le nombre de notre choix.
  3. Un systĂšme permettant de sĂ©lectionner uniquement les ingrĂ©dients qu’on a besoin pour chaque recette, sans ceux qu’on a dĂ©jĂ  : on oublie les oignons verts emballĂ©s individuellement alors qu’on en a dĂ©jĂ  pleins dans le frigo!
  4. Un systĂšme de suggestion des recettes de la semaine en fonction de ce qu’on a achetĂ© la semaine prĂ©cĂ©dente : si on a achetĂ© 5 lbs de patates la semaine passĂ©e, il doit en rester cette semaine, et le systĂšme pourrait mettre en valeur une recette comportant cet ingrĂ©dient qui est peut-ĂȘtre restant.

Il s’agirait lĂ  d’une excellente maniĂšre de fidĂ©liser une clientĂšle jeune et dynamique, attirĂ©e par la facilitĂ© des services de mealkits, Ă  un prix bien plus raisonnable par le modĂšle d’affaires mĂȘme. Ajoutez Ă  ça un vrai centre de distribution automatisĂ© Ă  la Tesco en Angleterre, les seuls joueurs qui font vraiment bien l’épicerie en ligne, et vous avez lĂ  un vrai modĂšle d’affaire qui ferait de vrais profits. Parions qu’avec ça, la part de marchĂ© abysmale de 1.3% de ventes en ligne de l’Ă©picerie au Canada[1] augmenterais rapidement!

Quelqu’un Ă©coute chez IGA, MĂ©tro, Sobeys?

[1] DonnĂ©es Nielsen – Q3 2018


UPDATE #1

J’ai reçu plusieurs messages par rapport Ă  ce billet. Voici une petite prĂ©cision que j’ai envoyĂ©e Ă  Judith Fetzer chez Cookit (mes prefs!)…

Salut Judith! Mon article n’a jamais Ă©tĂ© Ă©crit comme un attaque mais plutĂŽt comme une idĂ©e de plus-value Ă  ajouter Ă  l’offre existante des compagnies de mealkits. D’ailleurs, j’ai modifiĂ© le wording pour changer “ModĂšle d’affaires” par “Offre actuelle”. Le modĂšle d’affaire lui-mĂȘme est excellent, c’est l’offre qui pourrait ĂȘtre encore meilleure. Don’t get me wrong, tous ceux travaillant dans cette industrie sont au top de leur game, et ca doit ĂȘtre un dĂ©fi marketing hallucinant Ă  rĂ©aliser. Vous ĂȘtes fort probablement les leaders au niveau de la finesse du marketing. Et c’est aussi un dĂ©fi technique et logistique hallucinant. Je ne remet rien de ça en question! Ce que je trouve, c’est que c’est dommage d’avoir Ă  reçevoir en petites quantitĂ©s des ingrĂ©dients que j’ai probablement dĂ©jĂ , le fameux exemple du 10mL de vinaigre balsamique dans un cup de plastique. Si tu lis l’article jusqu’Ă  la fin, je propose une maniĂšre de mĂ©langer le concept du mealkit et de l’Ă©picerie en ligne, en amenant le meilleur des deux offres avec aucunes de leurs faiblesses. C’est un dĂ©fi technique Ă  rĂ©aliser, mais considĂ©rant ce que vous avez dĂ©jĂ  accompli, c’est clairement dans le domaine du possible. 

Maintenant, si on parle chiffres, ce qui me fait peur de cette industrie, c’est le churn hallucinant. En utilisant tes chiffres et en supposant une commande moyenne de 149$ (4 repas de 4 portions), on se retrouve avec un churn de 12% par semaine pour un LTV de 1200$. C’est Ă©norme! Ça veut dire qu’en une annĂ©e, sur 1000 inscrits, il reste… une personne. OĂč vont les 999 autres? Retournent-ils Ă  l’Ă©picerie traditionnelle ou Ă  l’offre marketing allĂ©chante du concurrent? C’est difficile Ă  dire. Toutefois, nous sommes un petit marchĂ©, et l’acquisition de clients va frapper un mur un moment donnĂ©. Pour GoodFood, le sujet original de mon article, il faut souhaiter qu’ils deviennent profitables avant de frapper ce mur la, sinon le churn exponentiel va leur rentrer dedans. Si tu veux en parler plus en dĂ©tails, je suis pas la pour basher. J’ai juste eu une idĂ©e qui ne s’applique pas Ă  mon industrie et je voulais la partager, mais je l’ai peut-ĂȘtre fait un peu maladroitement 🙂

UPDATE #2

Cet article a vraiment explosĂ© par rapport Ă  l’analyse du churn, mĂȘme si le sujet principal de l’article Ă©tait plutĂŽt une idĂ©e d’extension d’offre de service… Il faut quand mĂȘme que je fasse un mea culpa! J’ai gĂ©rĂ© des services d’abonnements oĂč les stats Ă©taient faites mensuellement et ou le churn Ă©tait trĂšs faible. Dans ces cas, assumer un churn linĂ©aire peux fonctionner, c’est mĂȘme une façon trĂšs conservatrice d’analyser ses donnĂ©es, et ca a le mĂ©rite d’ĂȘtre trĂšs simple Ă  calculer.

Toutefois, dans le cas d’un churn plus Ă©levĂ© et de stats calculĂ©es de maniĂšre hebdomadaires, la game change complĂštement car Ă  ce moment, la courbe exponentielle est trop Ă©levĂ©e. J’ai eu la chance que Daniel McCarthy, Assistant Professeur en Marketing Ă  Emory University’s Goizueta School of Business, vienne commenter sur mon billet LinkedIn. Il est une sommitĂ©e mondiale dans cette industrie! Il suggĂšre de calculer le churn en deux segments, l’un a churn Ă©levĂ© et l’autre Ă  churn faible, Ă  l’aide de donnĂ©es secondaires de cartes de crĂ©dit provenant de Second Measure. Comme je n’ai pas accĂšs Ă  ce genre de donnĂ©es secondaires, j’ai pensĂ© faire un modĂšle exponentiel double, avec un churn qui diminue chaque semaine pour la cohorte originale. M. McCarthy a spĂ©cifiĂ© que ce genre de modĂšle Ă©tait un peu moins performant que celui Ă  double segments de donnĂ©es secondaires, mais serait tout de mĂȘme valide. Le modĂšle naif (sans donnĂ©es) avec une diminution du churn hebdomadaire de 5% semble mieux fitter avec les donnĂ©es fournies par Judith: LTV de 1200$, commande moyenne de 82$, pour un churn semaine 1 d’un peu oins de 7%, mais qui diminue rapidement ensuite, pour laisser environ 25% de utilisateurs Ă  la fin d’un an qui devraient coller pour de bon, avec un churn de moins de 0.5% Ă  la fin de l’annĂ©e pour cette cohorte:

La logique est qu’un client qui a gardĂ© le service pendant 1 an est clairement qualifiĂ© pour ce genre de service. C’est vraiment plus intuitif qu’un churn linĂ©aire. C’est aussi plus complexe, mais vraiment nĂ©cĂ©ssaire pour une frĂ©quence comme celle-ci. Ça donne une idĂ©e du dĂ©fi d’analyse de donnĂ©es de cette industrie, ce n’est qu’une preuve de plus que ceux qui oeuvre dans ce domaine sont vraiment au top. Chapeau!

Quand j’aurai un peu de temps libre, je vais faire un modĂšle sur de vraies donnĂ©es pour voir si un modĂšle exponentiel double va avoir un bon fit, et ainsi Ă©viter le besoin de donnĂ©es secondaires. Je ferai un autre article de blog sur le sujet! Si vous ĂȘtes curieux comme moi, allez lire les articles de M. McCarthy sur le sujet. C’est ce que je vais faire de ce pas!