Import de boutique vers Odoo — socle de migration (gratuit)
Store Migration Base for Odoo — import Shopify, WooCommerce, PrestaShop, Wix and eBay data into Odoo: products, variants, customers, orders, categories and images, with field mapping, a dry run, a rejection report and no duplicates on re-run. Le socle que les connecteurs de migration réutilisent.
Captures d'écran
-
Import de boutique vers Odoo — socle de migration (gratuit) — capture 1 -
Import de boutique vers Odoo — socle de migration (gratuit) — capture 2 -
Import de boutique vers Odoo — socle de migration (gratuit) — capture 3 -
Import de boutique vers Odoo — socle de migration (gratuit) — capture 4 -
Import de boutique vers Odoo — socle de migration (gratuit) — capture 5
Import de boutique vers Odoo — le socle
Relancer un import ne crée jamais de doublon. Un import interrompu repart où il s'est arrêté. Et vous savez ce qui a été refusé, ligne par ligne.
Reprendre un catalogue depuis Shopify, WooCommerce, PrestaShop, Wix ou eBay se fait presque toujours de la même façon : un tableur, une nuit blanche, et des doublons découverts trois semaines plus tard. Les modules d'import existants importent — ils ne migrent pas. Ils ne savent pas reprendre après une coupure, ils ne disent pas ce qu'ils ont refusé, et les relancer double le catalogue.
Ce module pose la mécanique une fois, et ne connaît aucune plateforme. C'est ce qui le rend testable de bout en bout sans aucun compte marchand — et c'est ce qui doit rester vrai.
Jamais de doublon, même en relançant
Chaque enregistrement importé garde l'identifiant qu'il portait dans sa boutique d'origine. Un second passage retrouve ce qui existe et le met à jour : il ne recrée rien. Ci-dessous, la même migration relancée : 0 créé, 6 inchangés. C'est la première promesse du module, et le premier de ses tests.
Le second passage ne crée rien : il reconnaît les six produits et les laisse en place.
Le rapport dit ce qui a été refusé, et pourquoi
Un import qui annonce « 18 412 produits importés » sur 20 000 sans dire où sont passés les 1 588 autres n'a pas fini son travail : il a déplacé le problème. Ici, une ligne par enregistrement, avec son identifiant d'origine, son intitulé, et — en cas de rejet — le champ fautif et la valeur reçue. Exportable en CSV.
« prix : « sur devis » n'est pas un nombre » — on corrige l'export, on ne devine pas.
La correspondance des champs est une donnée, pas du code
Quel champ de la source va vers quel champ Odoo, avec la conversion à appliquer et le caractère obligatoire. Modifiable dans l'écran, et vérifiée à la saisie : un champ Odoo inexistant est refusé sur-le-champ, et non au trois millième produit d'une migration nocturne.
Le jour où le marchand range la matière de ses bijoux dans un champ à lui, on ajoute une ligne — on ne réécrit pas un script.
Le registre : ce qui a déjà été importé, et où c'est allé
C'est ce registre qui rend l'import rejouable. Chaque ligne associe l'identifiant de la boutique d'origine à l'enregistrement Odoo correspondant, et un bouton mène à la fiche. Un produit supprimé à la main ? Le registre s'en aperçoit et le recrée au passage suivant — puis ne le dédouble plus.
La reprise reprend vraiment
Un import de vingt mille produits interrompu à douze mille repart à douze mille. Chaque étape range son curseur après chaque page réellement écrite — jamais avant, ce qui ferait sauter des enregistrements à la reprise.
Le mode essai écrit pour de vrai, puis annule
On rejoue tout — lecture, correspondance, écriture, et les contrôles d'Odoo — dans une transaction annulée. Vous obtenez le rapport complet sans qu'une seule ligne n'entre dans la base. Un essai qui se contenterait de simuler mentirait précisément là où l'on compte sur lui : une taxe absente, une devise inconnue, un champ rendu obligatoire par un autre module ne se devinent pas, ils se constatent. C'est l'état par défaut d'une nouvelle migration.
Utile seul, et extensible
Le socle lit les fichiers CSV et JSON, avec détection de l'encodage et du séparateur. Un commerçant qui a déjà exporté son catalogue n'a besoin de rien d'autre. Chaque plateforme marchande est ensuite apportée par un module satellite.
Chaque plateforme dit si son connecteur a été éprouvé contre un vrai service, ou non.
L’application en mouvement
Le module en marche, enregistré dans le vrai client Odoo 19 : dyo import ligne, dyo import ligne (fiche), dyo import tache puis dyo import migration. Ce n’est pas un montage — ce sont les trames du navigateur sur le module livré, pris sur sa propre base.
Vidéo MP4 — 50 ko, 1280 px, 3.3 s, 4 écrans. Une amorce animée est aussi livrée en GIF (31 ko, 560 px) pour les contextes qui n’affichent pas la balise vidéo.
Ce que le module ne fait pas
- Il ne se connecte à aucune boutique tout seul : chaque plateforme est apportée par un module satellite.
- Il ne fait pas de synchronisation permanente — c'est un outil de reprise, pas un connecteur de vente.
- Il ne transfère rien d'Odoo vers une boutique : il importe, il n'exporte pas.
DYONYSOS — Odoo 20 Community — LGPL-3
Ce que l'application ne fait pas
- Il ne se connecte à aucune boutique tout seul : chaque plateforme est apportée par un module satellite.
- Il ne fait pas de synchronisation permanente — c'est un outil de reprise, pas un connecteur de vente.
- Il ne transfère rien d'Odoo vers une boutique : il importe, il n'exporte pas.
Applications du magasin nécessaires
Aucune.
Modules Odoo Community utilisés
basemailproductsale
Applications qui la complètent
| Série | Version | État | Publiée le |
|---|---|---|---|
| 20.0 | 20.0.1.0.0 | Disponible | 02/10/2026 |
| 19.0 | 19.0.1.0.0 | Disponible |
Fiche générée depuis le code de l'éditeur (dépôt privé, branche 20.0) : le code source n'est pas publié.
Contrôle automatique du magasin (distinct de l'éditeur), appliqué à toutes les applications. Conforme.
| Contrôle | Résultat | Effet si absent |
|---|---|---|
| Manifeste lisible sans exécution | conforme | bloquant |
| Licence reconnue (LGPL-3) | conforme | bloquant |
| Aucune dépendance vers Odoo Enterprise | conforme | bloquant |
| Aucun import de code Enterprise | conforme | bloquant |
| Aucun en-tête de licence Enterprise | conforme | bloquant |
| Icône static/description/icon.png | conforme | déclasse |
| Description (static/description/index.html ou README) | conforme | déclasse |
| Tests automatisés (tests/test_*.py) | conforme | déclasse |
| Traduction française (i18n/fr.po) | conforme | info |
| Section « Ce que le module ne fait pas » | conforme | info |
| Titre de 70 caractères au plus (59 actuellement) | conforme | info |
| Résumé en français | conforme | info |
Guide utilisateur — Import de boutique vers Odoo (socle)
Ce module conduit une migration. Il ne sait parler à aucune boutique tout seul : chaque plateforme est apportée par un module satellite. Il sait en revanche lire un fichier CSV ou JSON, et cela suffit à s'en servir dès l'installation.
1. Le chemin le plus court
- Migration de boutique → Migrations → Nouveau.
- Choisissez la boutique d'origine. Si vous partez d'un export, prenez « Fichier CSV ou JSON ».
- Cochez le périmètre : ce que vous voulez reprendre.
- Déposez vos fichiers dans l'onglet Fichiers déposés, un par type, puis cliquez Analyser : le module affiche les colonnes qu'il a trouvées, l'encodage et le séparateur qu'il a détectés.
- Renseignez la correspondance des champs.
- Préparer, puis Lancer. Le mode essai est coché : rien n'entrera dans la base.
- Lisez le Rapport. Corrigez ce qui doit l'être.
- Décochez Mode essai, relancez. C'est fait.
2. Le mode essai, et pourquoi il n'est pas une simulation
En mode essai, le module fait réellement l'écriture dans Odoo, puis l'annule. C'est plus lent qu'un simple calcul, et c'est voulu : une taxe absente, une devise inconnue, un champ rendu obligatoire par un autre module installé chez vous ne se devinent pas. Ils se constatent.
Un essai qui se contenterait de simuler vous annoncerait trois mille créations, et la vraie migration en rejetterait trois cents. Ici, le rapport d'essai est le rapport que vous obtiendrez.
Aucune trace n'est laissée : ni produit, ni ligne au registre. Un essai ne « consomme » rien.
3. Relancer sans rien casser
C'est la promesse centrale du module, et elle n'a pas d'astérisque.
Chaque enregistrement importé est inscrit dans un registre — menu Suivi → Ce qui a déjà été importé — qui associe l'identifiant de la boutique d'origine à l'enregistrement Odoo correspondant. Au second passage, le module retrouve et met à jour. Il ne recrée rien.
Conséquences pratiques :
| Ce que vous faites | Ce qui se passe |
|---|---|
| Vous relancez la même migration | Rien n'est créé. Les enregistrements identiques sont comptés « inchangés ». |
| Le catalogue a bougé chez la source | Seuls les enregistrements modifiés sont mis à jour. |
| Vous supprimez un produit à la main | Il est recréé au passage suivant, puis ne se dédouble plus. |
| Vous videz le rapport | Le registre n'est pas touché : l'idempotence tient toujours. |
Ne supprimez le registre que si vous voulez réellement tout recréer. C'est le seul geste qui casse la garantie.
4. Reprendre un import interrompu
Chaque étape range son curseur après chaque page réellement écrite. Si un import de vingt mille produits s'arrête à douze mille — coupure réseau, quota de la plateforme, redémarrage du serveur —, il repart à douze mille.
- La migration passe en Suspendue et le message dit pourquoi.
- Corrigez la cause, puis cliquez Lancer : elle reprend au curseur.
- Le bouton Curseur à zéro, sur une étape, fait relire la source depuis le début. C'est sans danger : tout ce qui existe est mis à jour, rien n'est recréé.
5. Lire le rapport
Une ligne par enregistrement traité, y compris les inchangés — sans eux, vous ne pourriez pas prouver au second passage que rien n'a été dupliqué.
Les issues possibles :
| Issue | Ce que cela veut dire |
|---|---|
| Créé | L'enregistrement n'existait pas ; il a été créé. |
| Mis à jour | Il existait, et la source l'a modifié. |
| Inchangé | Il existait et n'a pas bougé. Rien n'a été réécrit. |
| Rejeté | Il n'est pas entré. Le motif et le détail disent pourquoi. |
Les motifs de rejet :
| Motif | Que faire |
|---|---|
| Identifiant de source absent | Nommez la colonne d'identifiant sur le fichier, ou corrigez l'export. Le module refuse de numéroter les lignes : un rang change au moindre tri et recréerait tout le catalogue. |
| Champ obligatoire manquant | Complétez l'export, ou renseignez une valeur par défaut dans la correspondance. |
| Valeur invalide | Le détail donne la valeur reçue. Corrigez-la, ou changez la transformation. |
| Enregistrement parent non importé | Importez d'abord le parent — le produit d'une variante, le client d'une commande — puis relancez. |
| Refusé par Odoo | Odoo a refusé l'écriture. Le message est le sien : il nomme le champ ou la contrainte. |
Exporter le rapport produit un CSV ouvrable directement dans un tableur français, accents compris.
6. La correspondance des champs
C'est le cœur du module. Chaque ligne dit : ce champ de la source va vers ce champ Odoo, avec cette transformation.
- Le champ Odoo est son nom technique (
name,list_price,default_code), pas son libellé. Il est vérifié dès l'enregistrement : un nom inexistant est refusé tout de suite. - La transformation ne se devine pas. Une colonne « prix » contenant « 12,50 € » n'est un nombre que si vous le dites.
- Obligatoire fait rejeter cette ligne-là, pas la migration.
- Une valeur par défaut remplace le vide, y compris sur un champ obligatoire : c'est le moyen d'importer un catalogue auquel il manque une colonne.
Transformations disponibles : aucune, texte, HTML vers texte brut, nombre décimal, nombre entier, oui/non, date, date et heure.
7. Fichiers CSV et JSON
- L'encodage est détecté : UTF-8 avec ou sans marque d'ordre des octets, Windows-1252, et latin-1 en dernier recours. La marque d'ordre des octets que pose Excel est retirée — sans quoi votre première colonne s'appellerait « id » et resterait introuvable.
- Le séparateur est détecté : virgule, point-virgule, tabulation, barre verticale.
- JSON : une liste d'objets, ou un objet enveloppant une liste sous n'importe
quel nom (
products,data,items…). - La colonne d'identifiant : le module cherche
id,identifiant,reference,ref,sku, puiscode. Si votre export la nomme autrement, dites-le dans le champ prévu.
8. La file d'attente
Les imports ne partent jamais depuis l'écran : ils passent par une file, servie par une tâche planifiée toutes les cinq minutes. C'est ce qui permet de lancer vingt mille produits sans bloquer Odoo. Le bouton Traiter maintenant fait avancer la migration sans attendre.
Trois règles gouvernent cette file, et elles sont volontairement strictes :
- Un lot pris porte son horodatage.
- Un lot échoué ne repart jamais tout seul : il faut cliquer Relancer.
- Un lot orphelin — resté en cours au-delà de trente minutes, parce que son processus est mort — est signalé et compté, jamais relancé. Pour le reprendre, il faut d'abord l'annuler : cela vous oblige à constater que vous abandonnez un travail dont on ignore où il s'est arrêté.
9. Qui a le droit de quoi
- Opérateur : prépare et conduit les migrations, dépose les fichiers, règle la correspondance, lit et exporte les rapports.
- Administrateur : en plus, déclare les plateformes et leurs accès, et purge le registre.
La frontière passe entre conduire et brancher. Brancher une plateforme, c'est décider à quelle boutique le serveur parle et avec quel jeton — ce qui ouvre le catalogue et la liste des clients d'un commerçant. Cela ne se délègue pas.
10. Ce que le module ne fait pas
- Il ne se connecte à aucune boutique sans son module satellite.
- Il ne synchronise rien en continu : c'est un outil de reprise.
- Il n'envoie rien d'Odoo vers une boutique.
Avis des clients connectés. Un avis noté par client ; l'éditeur peut y répondre. Connectez-vous pour laisser un avis.
- Éditeur
- DYONYSOS
- contact@omnifloo.com
- Clients Omnifloo
- Support inclus selon votre formule : centre d'aide.