Popchef — Comment livrer 1 plat toutes les 5 secondes

An Unexpected Journey : de nos cuisines à votre bureau

François Vasnier
Jan 31, 2017 · 10 min read

Chez Popchef, on adore les bons plats faits maison. Nous faisons revivre des recettes que nous n’avions plus l’habitude de manger au travail ; ces recettes simples et équilibrées qui nous permettent d’affirmer que manger sainement au quotidien est à la portée de tous. Il reste un défi de taille : les livrer ! 🚴

Pour ma part je suis à la tête du pôle technique de Popchef qui compte aujourd’hui trois personnes. Outre la gestion de cette équipe, je suis chargé du backend et des algorithmes qui automatisent l’activité quotidienne. L’objectif de cette automatisation est simple : limiter le plus possible les interactions humaines pendant que votre commande passe de nos cuisines à votre bureau. L’enjeu clé est la scalabilité du modèle de Popchef, c’est-à-dire sa capacité à recevoir 10 fois plus de commandes sans nécessiter 10 fois plus de ressources humaines. L’objectif principal est de livrer votre déjeuner à l’heure et chaud, ce qui est le sujet de cet article.

Le parcours de votre plat

Concrètement, nos recettes sont cuisinées chaque matin dans une cuisine centrale située à l’extérieur de Paris. Chaque plat est ensuite acheminé minutieusement au sein de nos cuisines d’appoint situées au cœur de la capitale. C’est ce choix qui nous permet de vous proposer les meilleurs prix en centralisant la production, et le meilleur service de livraison en étant au plus proche de vos bureaux.

Schéma de notre cuisine externalisée et nos différentes cuisines d’appoint dans Paris

Lorsque vous arrivez sur le site, nous vous proposons une liste de créneau de 30 minutes dans lesquels nous nous engageons à vous livrer : 11h45–12h15, 12h15–12h45, etc..

En pratique, nous avons noté que vous choisissez de commander à l’avance votre déjeuner (en moyenne 1 à 2h avant le début de votre créneau de livraison). Cela représente un avantage pour nous puisque ça nous permet de mieux organiser les tournées de nos livreurs et de regrouper les commandes qui sont géographiquement proches.

Une fois que le début du créneau horaire approche, nous assignons la commande à un livreur : en général 10 à 15 minutes avant le début du créneau. La commande est préparée par le manager de la cuisine avant d’être placée dans le sac du livreur qui peut ainsi partir faire sa tournée. La tournée est constituée en général de 1 à 3 points de livraison et un livreur en effectuera en moyenne 4 par jour.

Le défi : livrer à l’heure

Notre promesse est de vous livrer un plat chaud dans un créneau de 30 minutes et nous savons, grâce à notre analyse des données, que ça compte pour vous. Il semble évident que si nous vous livrons en retard, votre perception de la qualité de service sera diminuée. Pour autant, c’est ce type d’intuition que nous souhaitons valider précisément grâce à l’étude des données disponibles.

Graphique du feedback en fonction du temps de livraison

Le graphique ci-dessus démontre l’importance d’une livraison effectuée à l’heure : le feedback moyen descend très rapidement en fonction du retard que nous avons sur votre livraison. À partir de ces données, nous connaissons donc précisément l’impact des retards sur votre satisfaction. C’est d’ailleurs grâce à vous tous que nous pouvons calculer ce type d’indicateur car vous êtes plus de 30% chaque jour à donner votre avis sur notre service et à nous fournir des pistes d’améliorations.

Pour vous aider à mieux comprendre cette problématique, sachez qu’il y a trois facteurs qui influencent l’heure à laquelle vous allez être livrés :

  • Le temps de préparation de votre commande
  • La vitesse de notre livreur dans ses livraisons
  • L’organisation de la tournée du livreur

Nous devons prendre en compte et optimiser chacun de ces trois facteurs pour être dans la mesure de vous livrer sur le créneau que vous avez choisi et vous permettre de déguster votre déjeuner dans les meilleures conditions possibles.

La clé : bien utiliser les ressources

Optimisation des tournées de nos livreurs

Le MDMTSP est un acronyme plutôt barbare qui fait référence à un problème mathématique bien connu : l’optimisation de trajets dans le contexte de multiples livreurs et multiples lieux de stockage. Chez Popchef, nous avons pris le parti de nous affranchir des multiples lieux de stockage en considérant chaque zone de manière indépendante : jamais un livreur de la cuisine du 15ème arrondissement ne viendra chercher une commande dans la cuisine du 16ème. Certes ce choix diminue globalement l’optimisation, mais en contrepartie il y a bien d’autres avantages tels que, sans être exhaustif, la rapidité d’exécution, la fiabilité des stocks et la gestion du matériel.

Schéma du MDMTSP

Le schéma ci-dessus montre un exemple de livraison chez Popchef. Le point central représente la cuisine d’appoint située dans Paris quand les autres points correspondent aux commandes de nos clients. L’idée est de réussir à livrer toutes les commandes à l’heure avec un nombre de livreurs qui reste fixe. Nous devons donc définir un ensemble de “Routes”, autrement appelées des tournées, que nos livreurs suivront dans un ordre bien précis. Pour pouvoir dessiner ces “Routes” nous devons estimer le temps que prendra chaque partie du trajet :

La vision du parcours d’un livreur dans notre backend. Le manager prépare le sac pendant que le livreur revient.
  • Le temps de préparation du sac : à partir de la taille de chacun des plats présents dans le sac du livreur et de la vitesse de préparation de chacun des managers des cuisines d’appoint, nous estimons le temps de préparation.
  • La distance à parcourir : afin de réaliser rapidement les calculs de distance, nous prenons la distance à vol d’oiseau à laquelle nous ajoutons 30% (1km à vol d’oiseau = 1,3km réel). Cette approximation nous donne une précision d’environ 90% et nous évite de multiples appels à Google Maps.
  • La vitesse du livreur : sur ce point nous avons étudié la vitesse moyenne de nos livreurs depuis le lancement de Popchef. Nous souhaiterions optimiser ce paramètre en affectant une vitesse à chaque coursier : certains de nos livreurs sont de véritables athlètes !
  • Le temps de dépôt de la commande : il y a un délai pour que chaque client vienne chercher sa commande au pied de l’immeuble, lequel est en moyenne de 1 à 2 minutes par commande.

En moyenne, la somme de ces approximations fonctionne, mais nous faisons souvent face à des “edge cases”, c’est-à-dire à des cas particuliers qui peuvent mettre en difficulté la livraison d’une commande. Si par exemple deux clients mettent un peu plus de temps à descendre et que notre estimation à vol d’oiseau est faussée par un parc, nous pouvons être sérieusement en retard sur le dernier point de livraison du livreur.

La dernière contrainte que nous devons respecter pour vous livrer parfaitement est la durée de la tournée. Afin de pouvoir garantir la livraison d’un plat chaud, nous devons limiter la durée des tournées de nos livreurs (entre la sortie de la cuisine et le dernier point de livraison) à environ 30 minutes. C’est là que nous nous différencions de certains de nos concurrents qui livrent froid et peuvent donc effectuer de plus grandes rotations de livreurs. D’ailleurs nous sommes contraints par la météo et la température extérieure : c’est plus difficile de garder un plat chaud quand il fait -6° ! Nous devons donc adapter la durée de nos tournées en fonction de ce paramètre.

Monitoring des créneaux et des zones

Evolution du “stress” de nos créneaux de livraison à travers le temps pour certaines zones

Cette page nous permet de visualiser en temps réel l’état de chacune de nos zones de livraison. Pour chaque zone et chaque créneau nous savons exactement combien de livreurs sont disponibles, combien de livraisons nous devons réaliser et nous pouvons donc estimer les retards sur les commandes. Nous calculons deux indicateurs sur cette page :

  • Le stress : cet indicateur est calculé suivant la formule suivante : Nbre de livraisons / Nbre de livreurs disponibles. Le calcul est donc relativement basique mais nous permet d’étaler les commandes sur les différents créneaux.
  • Le stress kilométrique : cet indicateur est calculé suivant la formule suivante, Somme de toutes les distances entre la cuisine et les différents points de livraison / Nbre de livreurs disponibles. Celui-ci est déjà plus précis et permet de mettre en avant certaines différences entre les zones (répartition géographique des commandes par exemple).

À gauche de ce tableau nous avons représenté chacune de nos zones et en haut chacun des créneaux disponibles. Il faut bien noter que les créneaux se superposent et qu’une seule livraison est comptabilisée sur deux créneaux.

Un niveau de stress maximum est défini pour chaque zone. Lorsque ce niveau est atteint, il vous devient alors impossible de commander sur ce créneau sauf si l’un de vos collègues a déjà commandé à la même adresse que la vôtre. Nous considérons qu’une telle commande supplémentaire n’est alors pas un problème puisqu’elle n’entraine pas une nouvelle livraison.

Graphique estimation heure de livraison

En plus de cette page de stress nous avons mis en place un système qui simule les livraisons. Chaque minute un serveur modélise l’ensemble des livraisons pour chacune des zones en se basant sur les résultats de l’algorithme d’optimisation de tournée. On obtient donc une image précise de l’heure à laquelle nous pensons pouvoir vous livrer vos commandes.

L’heure estimée de livraison en fonction du temps

Le code couleur permet de différencier le statut de la commande :

  • Jaune : la commande a été payée mais n’est pas encore prête à partir
  • Violet : un livreur a été assigné à la commande
  • Bleu : le livreur a pris en charge la commande et se dirige vers l’adresse

Ainsi cette commande a été payée aux alentours de 12h05 et nous simulons donc l’heure de livraison prévue en fonction de toutes les autres commandes. À 12h40 elle est assignée à un livreur et le manager de la cuisine prépare le sac. Dans ce cas précis le livreur a fait une autre livraison avant de se diriger vers le client, surperformé notre estimation et amélioré l’heure de livraison. Finalement le livreur prend en charge la commande, arrive sur place à 13h01 et marque la commande livrée à 13h04.

D’après ce graphique, nous étions donc capables d’estimer l’heure de livraison à plus ou moins 3 minutes et ce 1h avant la livraison. Ce n’est malheureusement pas toujours le cas (du tout) et il nous reste beaucoup de travail pour réussir à livrer tout le monde à l’heure.

Le chemin qu’il nous reste à parcourir

Nous avons mis en place un système d’information qui nous permet de traiter chaque commande mais nous vivons aujourd’hui une période de croissance qui nous empêche d’estimer précisément les ressources nécessaires à une livraison à l’heure pour chacun de nos clients.

Nous avons donc régulièrement des pics de retards qui diminuent votre satisfaction, ce qui m’amène à vous expliquer maintenant les défis qu’il nous reste à relever.

Optimiser : améliorer notre algorithme de routing

Il y a une grosse marge d’amélioration à effectuer sur notre algorithme qui permet de définir les tournées des livreurs. Aujourd’hui, il s’agit d’un algorithme relativement classique qui détermine quelle sera la route de chacun de nos coursiers.

Pour permettre la mise en place de nouveaux algorithmes, nous avons développé un système de simulation pour apprécier l’efficacité de chaque algorithme que nous concevons en phase de test. Il est ainsi possible de simuler l’algorithme sur les X derniers jours, les Y zones et voir précisément si celui-ci fait mieux concernant nos deux indicateurs clés : la qualité et le coût de la livraison.

Anticiper : accepter ou refuser une commande

Lorsqu’un client arrive sur le site, nous devons être en mesure de lui indiquer si nous sommes capables ou non de le livrer, le cas échéant, en lui précisant l’heure.

Il s’agit là de la principale difficulté à laquelle nous sommes confrontés, et aujourd’hui nous avons choisi d’y répondre avec le dashboard de stress que je vous ai présenté plus haut. Malheureusement, cette méthode ne fonctionne que partiellement et a tendance, dans certains cas, à refuser des commandes que nous aurions pu livrer tandis qu’elle accepte des commandes que nous ne pouvons pas livrer à l’heure.

L’indicateur de stress que nous calculons est plutôt simple, fonctionne surtout pour étaler les commandes sur différents créneaux et donc évite qu’elles ne soient concentrées sur les créneaux entre 12h00 et 13h00 qui sont fortement plébiscités.

Informer : prévenir le client le plus tôt possible du retard

Le système qui nous permet de simuler les livraisons ne fonctionne pas parfaitement lorsque la commande est encore dans la partie jaune (en attente d’un livreur). En moyenne, nous arrivons à prévoir l’heure de livraison de 50% des commandes à 5 minutes près.

Il y a donc de gros défis sur ce sujet :

  • Analyse statistique de toutes les données que nous avons collectées jusqu’à aujourd’hui (vitesse, attente des livreurs, etc).
  • Prévision des défaillances opérationnelles et définition d’un seuil de certitude pour les estimations.
  • Montée en charge de ce simulateur pour qu’il supporte lui aussi la croissance.

L’objectif final est simple : supprimer tous les pics de retards et les limiter à 5% des commandes maximum, quelles que soient les conditions dans lesquelles nous opérons. Et pour ça, nous avons besoin de vous ! 😀

Discutons ! 🍝 🚴

Je ne bosse plus chez Popchef ! Mais je serai ravi d’en discuter avec vous et voir comment je peux vous aider sur des problématiques similaires.

N’hésitez pas à m’envoyer un email à francois@dataheroes.fr ou à consulter mon profil sur Hopwork.

Thanks to Francois de Fitte.

François Vasnier

Written by

Freelance Node.js / Data Science