PS PrestaShop Intermédiaire

Import Fournisseurs & Dropshipping pour PrestaShop 8 & 9

Installer, configurer et automatiser l'import multi-fournisseurs (CSV, XML, JSON), les marges, les déclinaisons et la synchronisation du stock.

Mis à jour Version du module 1.4.0

Présentation

Le module Import Fournisseurs & Dropshipping (nom technique dfsupplierfeed) importe et synchronise automatiquement les catalogues de vos fournisseurs dans PrestaShop 8 et 9. Il gère plusieurs fournisseurs et plusieurs flux aux formats CSV, XML et JSON, applique vos règles de marge, construit les déclinaisons, relie les produits entre eux, synchronise le stock par cron, et arbitre les doublons EAN13 entre sources grâce à une priorité par fournisseur.

Le module ne remplace pas l’import CSV natif de PrestaShop (fait pour un chargement manuel unique) : il industrialise des imports récurrents depuis plusieurs sources, avec marges, déclinaisons et synchronisation automatiques.

Installation

  1. Depuis le back-office, allez dans Modules > Gestionnaire de modules, puis Téléverser un module.
  2. Sélectionnez le fichier dfsupplierfeed.zip et validez.
  3. Une fois installé, cliquez sur Configurer.

À l’installation, le module crée cinq tables (dfsf_supplier, dfsf_feed, dfsf_rule, dfsf_product, dfsf_log) et génère un jeton de cron unique.

Vue d’ensemble de l’interface

  • Dashboard — compteurs et alerte sur les flux dont l’import est en cours.
  • Suppliers — fournisseurs et priorités.
  • Feeds — flux, analyse, correspondance des champs et options.
  • Margin rules — règles de calcul des prix de vente.
  • Logs — historique détaillé des imports.
  • Settings & Cron — réglages généraux, gros catalogues, URLs de cron.

Étape 1 — Créer vos fournisseurs

Dans l’onglet Suppliers, ajoutez un fournisseur avec :

  • Nom du fournisseur.
  • Priorité — entier, 1 étant la priorité la plus forte. Elle tranche les doublons EAN13.
  • Actif — un fournisseur inactif est ignoré par le cron.
  • Créer le fournisseur natif PrestaShop — recommandé : remplit aussi le coût d’achat dans product_supplier.

Attribuez les meilleures priorités (chiffres les plus bas) aux fournisseurs les plus fiables ou les moins chers : ce sont eux qui « posséderont » les produits partagés.

Étape 2 — Créer le flux et laisser le module analyser

Dans l’onglet Feeds, créez le flux avec son fournisseur, son type de source (URL distante ou fichier local situé dans le répertoire de la boutique) et son format. Enregistrez, puis cliquez sur le bouton loupe de la ligne du flux.

Le module télécharge un échantillon et affiche le items_path détecté pour les flux XML et JSON, la liste de tous les champs réellement présents avec des valeurs d’exemple, et une correspondance complète pré-remplie modifiable avant application.

Les colonnes photo numérotées (image_1, image_2…) sont regroupées automatiquement, les colonnes de tailles empaquetées, de couleur et de références liées sont reconnues, et les noms de colonnes identifiés en français, anglais, espagnol, allemand et italien avec un contrôle de cohérence sur les valeurs.

Vérifiez toujours la proposition avant de l’appliquer. Beaucoup de fournisseurs livrent un prix de vente conseillé là où le module attend un coût d’achat : la marge serait alors appliquée par-dessus un prix déjà marginé.

Étape 3 — La correspondance des champs

La correspondance est un objet JSON reliant les colonnes ou nœuds du flux à des champs normalisés. Les 21 champs canoniques sont :

name reference ean13 mpn cost quantity description description_short category manufacturer weight tax_rate image images group_reference attributes variants_stock variants_ean variants_reference variant_attribute related

Seul reference ou ean13 est obligatoire : ce sont les deux clés de rapprochement. Une ligne sans l’un ni l’autre est rejetée.

Plusieurs sources pour un même champ

La valeur d’un champ peut être une liste. Un fournisseur qui répartit ses photos sur plusieurs colonnes se mappe ainsi :

{
  "fields": {
    "reference": "id",
    "name": "name",
    "cost": "wholesale_price",
    "images": ["image_1", "image_2", "image_3", "image_4"]
  }
}

Pour le champ images, toutes les colonnes renseignées sont importées. Pour tout autre champ, c’est la première valeur non vide qui est retenue, ce qui permet d’écrire une chaîne de repli : "cost": ["prix_promo", "prix_net"].

CSV

Reliez chaque champ à un en-tête de colonne, ou à un index de colonne à partir de 0 lorsque les en-têtes sont inexploitables. Le délimiteur est détecté automatiquement, les champs multilignes entre guillemets sont gérés, et les formats 1 234,56 comme 1,234.75 sont acceptés.

{
  "fields": {
    "name": "product_name",
    "reference": "sku",
    "ean13": "ean",
    "cost": "price",
    "quantity": "stock",
    "category": "category",
    "image": "image_url"
  }
}

Une ligne dont le nombre de colonnes ne correspond pas à l’en-tête est rejetée et comptée en erreur. C’est le seul traitement sûr d’un séparateur non échappé dans un champ texte : sans ce contrôle, toutes les valeurs suivantes seraient décalées et importées en silence.

XML

items_path désigne le nœud répété, à n’importe quelle profondeur. Les chemins des champs sont relatifs à ce nœud, et @nom lit un attribut.

{
  "items_path": "products/product",
  "fields": {
    "reference": "@sku",
    "name": "title",
    "ean13": "ean",
    "cost": "pricing/wholesale",
    "quantity": "stock/quantity",
    "image": "images/image"
  }
}

Les chemins étant relatifs à l’article, une valeur présente uniquement sur un nœud ancêtre ne peut pas être lue : la navigation .. n’existe pas.

JSON

items_path utilise la notation pointée jusqu’au tableau d’articles. Un segment numérique lit une entrée de tableau : images.0 est la première image. Laissez items_path vide si le fichier commence directement par [.

{
  "items_path": "data.products",
  "fields": {
    "reference": "sku",
    "name": "name",
    "ean13": "barcode",
    "cost": "prices.cost",
    "quantity": "inventory.available",
    "image": "images.0"
  }
}

L’onglet Feeds contient seize exemples commentés couvrant les structures les plus courantes.

Étape 4 — Définir vos marges

Dans l’onglet Margin rules, chaque règle calcule le prix de vente HT à partir du coût d’achat HT :

  • Pourcentage — coût × (1 + valeur/100).
  • Coefficient — coût × valeur.
  • Addition fixe — coût + valeur.

Un arrondi psychologique optionnel s’applique ensuite : x.99, x.95, x.90 ou arrondi à l’entier supérieur.

Portée et résolution

Une règle peut viser un fournisseur, une catégorie, les deux, ou être globale. La plus spécifique gagne, dans cet ordre : fournisseur + catégorie, puis fournisseur seul, puis catégorie seule, puis règle globale. Les règles de catégorie s’appliquent aussi aux sous-catégories. Sans aucune règle, la marge par défaut des réglages est utilisée.

La priorité EAN entre sources

Quand le même ean13 apparaît dans plusieurs flux :

  • le fournisseur dont la priorité est la meilleure possède le produit ;
  • les autres sources sont ignorées pour cette référence ;
  • si un fournisseur mieux priorisé apporte ensuite cet EAN, il reprend automatiquement la propriété.

Les déclinaisons

Deux structures de flux sont gérées.

Une ligne par variante

Activez Construire les déclinaisons et mappez group_reference (identique pour toutes les variantes d’un même produit) et attributes (les options, par exemple Taille:M|Couleur:Rouge). Les séparateurs |, , et ; sont acceptés entre les paires, : et = entre le nom et la valeur.

Une ligne par produit, tailles empaquetées dans une colonne

C’est la structure la plus répandue chez les grossistes textile et lingerie :

sizes_stock : EU 70C | FR 85C:4,EU 70D | FR 85D:2,EU 75A | FR 90A:1
ean_codes   : EU 70C | FR 85C:5901741925360,EU 70D | FR 85D:5901741925377

Activez Éclater les variantes empaquetées et mappez variants_stock, plus variants_ean et variants_reference si le flux les fournit. Le module découpe la ligne en une déclinaison par taille et apparie stock, EAN et référence par libellé. Trois réglages accompagnent la case : le nom du groupe d’attributs (Taille par défaut), le séparateur entre les entrées (,) et le séparateur entre le libellé et la valeur (:).

Le découpage libellé/valeur se fait sur la dernière occurrence du séparateur, donc un libellé comme EU 70C | FR 85C reste lisible. Les paires construites ainsi ne repassent pas par l’analyse de chaîne, ce qui évite toute collision avec les séparateurs présents dans les libellés.

Cochez la case avant le premier import. Si vous importez d’abord sans elle, les produits sont créés sans group_reference : en activant l’éclatement ensuite, le module ne retrouve pas ces parents et en crée de nouveaux, ce qui double votre catalogue. Si cela vous arrive, supprimez les produits créés et videz les curseurs depuis le panneau Maintenance.

Un second axe depuis une colonne du flux

Beaucoup de fournisseurs livrent la couleur dans une colonne distincte, alors que les tailles sont empaquetées. Reliez variant_attribute à cette colonne :

{
  "fields": {
    "reference": "id",
    "name": "name",
    "cost": "wholesale_price",
    "variant_attribute": "color",
    "variants_stock": "sizes_stock",
    "variants_ean": "ean_codes"
  }
}

Chaque déclinaison du produit gagne alors un second axe, sous le groupe d’attributs de la colonne supplémentaire défini sur le flux (Couleur par défaut). Vous obtenez des combinaisons Taille et Couleur, exploitables par les filtres à facettes.

Chaque ligne du flux étant un produit d’une seule couleur, le groupe Couleur ne porte qu’une valeur par produit. Les coloris ne sont pas fusionnés en une fiche unique à choix de couleur : pour naviguer entre eux, utilisez les produits liés ci-dessous.

Produits liés

Quand le flux liste les autres coloris ou les modèles associés dans une colonne de références, cochez Importer les produits liés et mappez related :

{
  "fields": {
    "reference": "id",
    "related": "other_colors"
  }
}

La colonne contient une liste de références fournisseur séparées par des virgules. Les liens sont créés comme accessoires PrestaShop, et apparaissent donc dans le bloc de produits liés de votre thème.

La résolution a lieu une fois le flux entièrement lu, car une référence pointe très souvent vers un produit situé plus loin dans le fichier. Trois comportements à connaître :

  • une référence pointant vers le produit lui-même est ignorée, ce qui est fréquent puisque beaucoup de fournisseurs listent le groupe complet sur chaque membre ;
  • une référence pointant vers un produit absent du flux est ignorée sans compter comme erreur : sur un export filtré par catégorie, ce cas représente couramment un cinquième des références ;
  • les accessoires existants ne sont jamais supprimés, donc les liens que vous ajoutez à la main survivent aux imports. En contrepartie, un regroupement modifié par le fournisseur laisse d’anciens liens en place.

Le nombre de liens créés apparaît dans le message de fin d’import et dans la colonne dédiée du journal.

Ce que le flux a le droit d’écraser

Cinq cases par flux déterminent les champs synchronisés : prix, stock, nom, descriptions, images. Par défaut seuls les prix et le stock sont cochés.

Si vous retravaillez les fiches pour le référencement, décochez le nom et les descriptions après le premier import : sinon le passage de cron suivant écrasera votre travail.

Produits retirés du catalogue fournisseur

Chaque flux choisit son comportement : ne rien faire, mettre le stock à zéro, désactiver, ou les deux. L’action s’applique à la fin d’un import complet terminé, et uniquement aux produits que ce flux avait créés ou reliés.

En dropshipping, « mettre le stock à zéro » est le choix le plus sûr : le produit n’est plus vendable mais conserve son URL et son référencement.

Catégories et devises

Le champ category accepte un nom simple ou un chemin complet, par exemple Maison > Bureau > Chaises. Le séparateur est configurable par flux, et l’option Créer les catégories manquantes crée les niveaux absents. Un chemin commençant par le séparateur, comme /FEMME/Lingerie, est correctement interprété.

Si le fournisseur facture dans une autre devise, sélectionnez-la sur le flux : les coûts sont convertis vers la devise par défaut de la boutique avant application des marges.

Gros catalogues

Les flux sont lus en streaming : la mémoire consommée ne dépend pas de la taille du fichier. Le traitement est découpé en lots reprenables. Deux réglages, dans l’onglet Settings & Cron :

  • Point de reprise tous les N articles (2000 par défaut).
  • Budget de temps par passe (120 s par défaut) — l’appel cron suivant reprend exactement au même article.

Un très gros catalogue demande simplement plusieurs passages de cron et se termine tout seul. Le fichier téléchargé est mis en cache tant que l’import n’est pas terminé.

L’éclatement multiplie le volume : un flux de 7 300 produits à variantes produit plus de 33 000 déclinaisons, donc environ 41 000 objets créés au premier import complet. Prévoyez plusieurs passages et testez sur une boutique de recette avant la production.

Lancer un import manuellement

  • Import complet (icône lecture) — met à jour les produits liés et crée les manquants si le flux l’autorise.
  • Sync stock (icône rafraîchir) — met à jour uniquement prix et quantités des produits déjà liés.

Depuis le back-office, une passe est limitée à 45 secondes pour ne pas dépasser le délai du serveur web.

Automatiser avec le cron

# Synchro stock toutes les heures
0 * * * * curl -sL "https://votreboutique.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=VOTRE_TOKEN&mode=stock" > /dev/null

# Import complet chaque nuit
30 3 * * * curl -sL "https://votreboutique.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=VOTRE_TOKEN&mode=full" > /dev/null

Paramètres optionnels : &id_feed=N pour ne traiter qu’un flux, &budget=600 pour autoriser une exécution plus longue.

Si vous régénérez le jeton dans les réglages, mettez à jour vos tâches cron : l’ancienne URL renverra une erreur 403.

Réglages généraux

  • Produits créés actifs immédiatement — désactivé par défaut.
  • Désactiver les produits en rupture chez le fournisseur, avec réactivation au retour du stock.
  • Marge par défaut quand aucune règle ne correspond.
  • Rétention des journaux et purge automatique.
  • À la désinstallation — supprimer les données ou tout conserver.
  • Vider le cache des flux et les curseurs dans le panneau Maintenance.

Suivi et journaux

L’onglet Logs liste chaque exécution : flux, mode, articles traités, créés, mis à jour, ignorés, en erreur, disparus, liens produits créés, indicateur de complétude avec point de reprise, temps d’exécution et détail des premières erreurs.

Dépannage

« Malformed CSV row: 23 columns instead of 22 »

La ligne contient un séparateur ou un guillemet non échappé dans un champ texte. Elle est rejetée pour éviter d’importer des valeurs décalées.

« Feed file not found or outside shop directory »

Pour une source fichier, le chemin doit pointer vers un fichier lisible situé dans le répertoire de la boutique.

L’analyse ne trouve pas d’articles

Renseignez items_path manuellement dans la correspondance, puis relancez l’analyse.

Les produits sont créés mais invisibles en front

C’est le comportement par défaut : les produits créés sont désactivés.

Les déclinaisons ne sont pas créées

Vérifiez que la case correspondante est cochée, que les champs nécessaires sont mappés (group_reference et attributes, ou variants_stock), et que les séparateurs correspondent au fichier.

Mon catalogue a doublé après avoir activé l’éclatement

L’import a été lancé avant que la case soit cochée. Supprimez les produits créés par ce flux, videz les curseurs, puis relancez.

Peu ou pas de produits liés créés

Les liens ne sont résolus qu’à la fin d’un import complet terminé : sur un gros flux traité en plusieurs passes, ils n’apparaissent qu’au dernier passage. Vérifiez aussi que les références de la colonne correspondent bien au champ mappé sur reference.

Les prix semblent trop élevés ou trop bas

Vérifiez si le flux fournit des coûts TTC, si la devise est correcte, quelle règle de marge s’applique, et que le champ mappé sur cost est bien un coût d’achat.

L’import ne va jamais au bout

C’est normal sur un très gros flux : il progresse par passes. La colonne Statut indique l’article de reprise.

Compatibilité

  • PrestaShop 8.0 à 9.x, PHP 7.4 à 8.3.
  • Sans override du cœur PrestaShop.
  • Multiboutique : les produits créés sont associés aux boutiques du contexte.
  • Interface traduite en français et en anglais.
Cette page vous a-t-elle été utile ?

Toujours bloqué ? Contactez le support