Retour aux projets

Boutique de landing pages

Boutique de landing pages

Une boutique en paiement à la livraison pensée pour le trafic publicitaire marocain : une landing page par campagne, faite pour transformer un clic sur une publicité en commande confirmée depuis un téléphone. Elle tourne sous Next.js 16 et React 19 — des pages produit rendues côté serveur avec, derrière, un formulaire de commande à trois champs — et elle a été portée route par route depuis l’application Flask sur laquelle la boutique tournait d’abord, en conservant les mêmes URL pour que les campagnes en cours ne s’aperçoivent de rien.

Résultats

Chiffre d’affaires encaissé
69 564 DHChiffre d’affaires encaissé
Colis livrés
659Colis livrés
Taux de livraison
72 %Taux de livraison
Restant impayé
0 DHRestant impayé
Tableau de bord logistique de Maroc Games : 69 564 DH de chiffre d’affaires, 659 colis livrés et 72 % de taux de livraison sur les 284 derniers jours.

Chiffres de Maroc Games sur 284 jours, relevés dans le tableau de bord logistique où arrivent les commandes.

Démonstration

Une page produit en ligne sur mobile — Maroc Games, le premier client de la boutique, qui vend des modèles réduits au 1:24.

Dans la boutique

  • Une route dynamique, tous les produits

    app/products/[product] génère chaque landing page depuis une fiche produit — photos, variantes, prix et argumentaire. Une nouvelle campagne est une donnée, pas un déploiement.

  • Porté, pas refondu

    Le gestionnaire de commande, les chargeurs de produits et la redirection d’accueil reprennent leurs originaux Flask : les URL publicitaires en ligne ont continué de fonctionner pendant la réécriture.

  • Telegram fait office de système de commande

    Le paiement à la livraison ne demande ni panier ni compte : une commande validée devient un message formaté sur le téléphone du client, horodaté à l’heure de Casablanca.

  • Conversions rattachées, rien de divulgué

    Téléphone et nom sont hachés en SHA-256 dans la redirection de remerciement : une vente se rattache à la campagne qui l’a financée sans donnée personnelle dans une URL.

  • Variantes et offres groupées

    Noire, blanc ou rouge, et une offre à l’unité ou par deux — 299 DH l’une, 550 DH les deux — choisies juste au-dessus du formulaire.

  • Trois champs, sans compte

    Nom, quartier et ville, numéro de téléphone. Ni e-mail, ni mot de passe, ni panier — la façon dont l’e-commerce marocain convertit vraiment.

  • Pensée mobile d’abord

    Le trafic publicitaire arrive sur téléphone : en-tête fixe, galerie défilante, boutons à portée de pouce, et des images préoptimisées servies sans retraitement.

Comment ça marche

Maroc Games vend des voitures miniatures de collection, et chaque campagne publicitaire a besoin de sa propre page. Plutôt que d’en construire une à la main par produit, la boutique génère chaque landing page à partir d’une fiche produit — photos, variantes de couleur, prix, offres groupées et argumentaire de vente sont tous des données : mettre un nouveau produit en ligne, c’est une fiche, pas un redéploiement.

Le front-end React tient dans une seule route dynamique. app/products/[product] lit la fiche du produit côté serveur et renvoie du HTML fini : un acheteur en données mobiles reçoit donc la page elle-même, et non un bundle qui doit ensuite aller chercher quoi afficher ; la racine redirige vers le produit par défaut, comme le faisait l’original. Les images produit sont déjà optimisées en webp et avif et sont servies telles quelles au lieu d’être retraitées à chaque requête — sur une page dont tout le métier est de s’afficher vite sur un téléphone en réseau cellulaire, c’est l’essentiel du budget de performance.

Le tunnel de commande est la partie qui devait être exacte, parce que c’est là qu’est l’argent. Un seul POST vers /api/order valide les trois champs, horodate la commande à l’heure d’Africa/Casablanca et pousse un message formaté sur le téléphone du client via Telegram — pour une activité en paiement à la livraison, cette notification est le système de commande : le client la lit et rappelle l’acheteur pour confirmer avant toute expédition. La route répond ensuite par une redirection vers la page de remerciement du produit, porteuse des empreintes SHA-256 du téléphone et du nom ainsi que d’un identifiant externe dérivé — la conversion peut donc être rattachée côté serveur sans qu’aucune donnée personnelle ne circule dans une URL.

Rien de tout cela n’a commencé en React. La boutique était d’abord une application Flask sur cPanel — MySQL derrière les produits et les commandes, l’API Conversion Meta pour remonter les conversions côté serveur plutôt que de se fier au pixel navigateur, Apache devant via passenger_wsgi — et c’est elle qui a prouvé que le modèle fonctionnait. La reconstruire en Next.js fut un portage, pas une refonte, et le code le dit là où ça compte : le gestionnaire de commande est porté depuis le point d’entrée du formulaire Flask, les chargeurs de produits et de pages de remerciement reprennent ses fonctions load_product_data, et la redirection d’accueil reprend son home(). Mêmes URL, mêmes pages de remerciement, mêmes horodatages de Casablanca — c’est la seule raison pour laquelle les campagnes en cours, qui pointaient sur ces liens, ont pu continuer pendant la bascule.

Tout ce qui est visible d’emblée sert à conclure la vente : un bandeau « quantité limitée » fixé en haut, l’ancien prix barré à côté du prix en MAD, un badge livraison gratuite, et des boutons Acheter répétés entre les photos produit pour que l’appel à l’action ne soit jamais à plus d’un scroll. Ni compte client, ni panier à abandonner — l’acheteur choisit une couleur et une offre, remplit trois champs et valide la commande.

Architecture

Schéma d’architecture de la boutique Maroc Games : à gauche, le téléphone de l’acheteur parcourant la landing page, le choix de variante, le formulaire de commande et la page de remerciement ; au centre, le serveur Next.js avec l’App Router, le chargeur de produits lib/data.js, la route /api/order et son hachage SHA-256 ; à droite, les fiches produit et pages de remerciement en JSON, l’API du bot Telegram et les régies publicitaires ; et en bas, une bande décrivant l’application Flask sur cPanel dont l’ensemble a été porté.

Le téléphone de l’acheteur à gauche, le serveur Next.js au centre, le contenu et les services externes à droite — et en bas, la boutique Flask dont tout cela a été porté. Cliquer sur le schéma pour l’ouvrir en taille réelle.

Stack technique

Next.js 16React 19App RouterFlaskPythonMySQLMeta Conversion APIcPanel
Dépôt privé