# Import Fournisseurs & Dropshipping pour PrestaShop 8 & 9

> Guide complet du module Import Fournisseurs & Dropshipping pour PrestaShop 8 et 9 : analyse automatique, sources multiples, éclatement des variantes, second axe de déclinaison, produits liés et gros catalogues.

- Page: <https://www.datafirefly.com/documentation/import-fournisseurs-dropshipping-prestashop/>
- Langue: fr
- Mis à jour le: 2026-09-18
- Autres langues: [en](https://www.datafirefly.com/en/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [es](https://www.datafirefly.com/es/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [de](https://www.datafirefly.com/de/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [it](https://www.datafirefly.com/it/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [pl](https://www.datafirefly.com/pl/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [pt](https://www.datafirefly.com/pt/documentation/import-fournisseurs-dropshipping-prestashop/index.md), [nl](https://www.datafirefly.com/nl/documentation/import-fournisseurs-dropshipping-prestashop/index.md)
- Index: <https://www.datafirefly.com/documentation/llms.txt>

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