<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dolibarr.org/index.php?action=history&amp;feed=atom&amp;title=Module_psimport_EN</id>
	<title>Module psimport EN - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dolibarr.org/index.php?action=history&amp;feed=atom&amp;title=Module_psimport_EN"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;action=history"/>
	<updated>2026-11-02T07:29:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66658&amp;oldid=prev</id>
		<title>Grandoc: /* Other languages */</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66658&amp;oldid=prev"/>
		<updated>2026-07-10T09:26:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Other languages&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:26, 10 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l202&quot;&gt;Line 202:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 202:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Module_psimport_FR|Documentation en français du module psimport]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[Module_psimport_FR|Documentation en français du module psimport]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Module_psimport_DE|Deutsche Dokumentation für das Modul psimport]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Module_psimport_ES|Documentación en español del módulo psimport]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* [[Module_psimport_IT|Documentazione in italiano del modulo psimport]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[fr:Module_psimport_FR]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[fr:Module_psimport_FR]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[de:Module_psimport_DE]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[es:Module_psimport_ES]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[it:Module_psimport_IT]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki_test:diff::1.12:old-66649:rev-66658 --&gt;
&lt;/table&gt;</summary>
		<author><name>Grandoc</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66649&amp;oldid=prev</id>
		<title>Grandoc at 09:10, 10 July 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66649&amp;oldid=prev"/>
		<updated>2026-07-10T09:10:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:10, 10 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l93&quot;&gt;Line 93:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 93:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Usage==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Usage==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[File:psimport_admin.png|center|thumb|800px|Import management]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Execution order===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Execution order===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki_test:diff::1.12:old-66646:rev-66649 --&gt;
&lt;/table&gt;</summary>
		<author><name>Grandoc</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66646&amp;oldid=prev</id>
		<title>Grandoc: Created page with &quot;Category:Modules Category:AtooNet  =Module psimport=  ==Overview==  &#039;&#039;&#039;psimport&#039;&#039;&#039; is a module for Dolibarr ERP/CRM published by [https://www.atoo-net.com Atoo-Net]....&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_psimport_EN&amp;diff=66646&amp;oldid=prev"/>
		<updated>2026-07-10T08:45:50Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/index.php?title=Category:Modules&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:Modules (page does not exist)&quot;&gt;Category:Modules&lt;/a&gt; &lt;a href=&quot;/index.php?title=Category:AtooNet&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:AtooNet (page does not exist)&quot;&gt;Category:AtooNet&lt;/a&gt;  =Module psimport=  ==Overview==  &amp;#039;&amp;#039;&amp;#039;psimport&amp;#039;&amp;#039;&amp;#039; is a module for Dolibarr ERP/CRM published by [https://www.atoo-net.com Atoo-Net]....&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Modules]]&lt;br /&gt;
[[Category:AtooNet]]&lt;br /&gt;
&lt;br /&gt;
=Module psimport=&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;psimport&amp;#039;&amp;#039;&amp;#039; is a module for Dolibarr ERP/CRM published by [https://www.atoo-net.com Atoo-Net].&lt;br /&gt;
&lt;br /&gt;
It bundles command-line tools to &amp;#039;&amp;#039;&amp;#039;migrate a PrestaShop shop into Dolibarr&amp;#039;&amp;#039;&amp;#039;: categories, third parties/addresses, products (with resolved VAT and cover image), downloadable files of virtual products, image galleries and orders. The migration relies on PrestaShop&amp;#039;s REST Webservice API, with intermediate staging tables (&amp;lt;code&amp;gt;llx_psimport_*&amp;lt;/code&amp;gt;) that let you inspect and fix data before the final import into Dolibarr, and replay an import without hitting the API again.&lt;br /&gt;
&lt;br /&gt;
All products are imported as a &amp;#039;&amp;#039;&amp;#039;service&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;Product::TYPE_SERVICE&amp;lt;/code&amp;gt;), since they are dematerialized modules, regardless of the type set on the PrestaShop side.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Property!!Value&lt;br /&gt;
|-&lt;br /&gt;
|Author||Philippe Grand — Atoo-Net&lt;br /&gt;
|-&lt;br /&gt;
|Version||1.0&lt;br /&gt;
|-&lt;br /&gt;
|License||GNU GPL v3+&lt;br /&gt;
|-&lt;br /&gt;
|Dolibarr minimum||v24.0&lt;br /&gt;
|-&lt;br /&gt;
|PHP minimum||v8.1&lt;br /&gt;
|-&lt;br /&gt;
|PrestaShop supported||v1.6 to 9.x (Webservice API)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Why use psimport?==&lt;br /&gt;
&lt;br /&gt;
psimport lets you bring all the data of an existing PrestaShop shop into Dolibarr, without a direct connection to PrestaShop&amp;#039;s MySQL database (except for one optional, one-off step for downloadable files). Every step goes through a staging table you can review before the final import.&lt;br /&gt;
&lt;br /&gt;
===Use cases===&lt;br /&gt;
&lt;br /&gt;
====Full migration of a PrestaShop shop====&lt;br /&gt;
Retrieve categories, third parties/addresses, products (with VAT resolved via PrestaShop&amp;#039;s tax rule groups) and orders, via the REST Webservice API, with no extra install on the PrestaShop side beyond enabling the Webservice.&lt;br /&gt;
&lt;br /&gt;
====Review before the final import====&lt;br /&gt;
Each resource is first fetched into a staging table (&amp;lt;code&amp;gt;llx_psimport_*&amp;lt;/code&amp;gt;) where the data can be inspected and corrected before the actual import into Dolibarr. This avoids hitting the PrestaShop API again in case of error.&lt;br /&gt;
&lt;br /&gt;
====Targeted replay after fixing errors====&lt;br /&gt;
Every staging row carries a status (&amp;lt;code&amp;gt;import_status&amp;lt;/code&amp;gt;). Rows in error can be reset to &amp;quot;to import&amp;quot; (the &amp;quot;Reset errors&amp;quot; button, or an SQL query) and replayed, without re-importing everything from scratch.&lt;br /&gt;
&lt;br /&gt;
====Retrieving downloadable module files====&lt;br /&gt;
PrestaShop&amp;#039;s Webservice API does not expose the files attached to &amp;quot;Virtual/downloadable products&amp;quot; (a limitation confirmed by the official PrestaShop/PrestaShop#27834 GitHub ticket). A &amp;quot;bridge&amp;quot; PrestaShop module shipped with psimport works around this, read-only.&lt;br /&gt;
&lt;br /&gt;
====Full product image gallery====&lt;br /&gt;
Beyond the cover image (fetched together with the product), psimport can also retrieve each product&amp;#039;s full image gallery via the &amp;lt;code&amp;gt;products/{id}/images&amp;lt;/code&amp;gt; API sub-endpoint.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirements on the PrestaShop side&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
#Enable the Webservice: &amp;#039;&amp;#039;&amp;#039;Advanced Parameters &amp;gt; Webservice &amp;gt; Enable PrestaShop&amp;#039;s webservice&amp;#039;&amp;#039;&amp;#039; → Yes&lt;br /&gt;
#Create an API key (&amp;quot;Add a new webservice key&amp;quot;) with GET permissions on: &amp;lt;code&amp;gt;categories&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;customers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;addresses&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;countries&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;products&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;images&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tax_rule_groups&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tax_rules&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;taxes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;orders&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;order_details&amp;lt;/code&amp;gt;&lt;br /&gt;
#Note down the site URL and the generated API key&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Requirements on the Dolibarr side&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
#Enabled modules: Third parties, Products, Services, Categories, Orders, Invoices&lt;br /&gt;
#Enable the &amp;#039;&amp;#039;&amp;#039;psimport&amp;#039;&amp;#039;&amp;#039; module in &amp;#039;&amp;#039;&amp;#039;Home → Setup → Modules/Applications&amp;#039;&amp;#039;&amp;#039; (&amp;quot;Others&amp;quot; family)&lt;br /&gt;
&lt;br /&gt;
Enabling the module automatically creates the staging tables &amp;lt;code&amp;gt;llx_psimport_*&amp;lt;/code&amp;gt; through Dolibarr&amp;#039;s standard module activation mechanism — no manual SQL import is needed.&lt;br /&gt;
&lt;br /&gt;
The psimport module has &amp;#039;&amp;#039;&amp;#039;no menu and no permission&amp;#039;&amp;#039;&amp;#039;. Its only screen is the configuration page (Setup &amp;gt; Modules/Applications &amp;gt; psimport &amp;gt; wrench icon), where you enter the PrestaShop shop URL and the Webservice API key (constants &amp;lt;code&amp;gt;PSIMPORT_API_URL&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PSIMPORT_API_KEY&amp;lt;/code&amp;gt;), used by default by the CLI scripts when no parameter is passed on the command line. The whole migration is then driven from the command line via the scripts in the &amp;lt;code&amp;gt;scripts/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
===PrestaShop API connection===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Constant!!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;PSIMPORT_API_URL&amp;lt;/code&amp;gt;||Base URL of the PrestaShop Webservice API (e.g. &amp;lt;code&amp;gt;https://www.yourshop.com/api&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;PSIMPORT_API_KEY&amp;lt;/code&amp;gt;||PrestaShop Webservice API key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting: HTTP 403 on the API (hosting behind Cloudflare)===&lt;br /&gt;
&lt;br /&gt;
If the connection test (or any &amp;lt;code&amp;gt;fetch-*&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;import-*&amp;lt;/code&amp;gt; script) fails with an error like &amp;lt;code&amp;gt;HTTP 403 Forbidden&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;with an empty response body&amp;#039;&amp;#039;&amp;#039; and no redirection detected, while the same call succeeds in a browser, the block is probably not coming from PrestaShop but from an upstream application firewall (Cloudflare, ModSecurity, etc.) rejecting the request before it ever reaches the site.&lt;br /&gt;
&lt;br /&gt;
Case encountered and confirmed on a &amp;#039;&amp;#039;&amp;#039;Cloudflare (Free plan)&amp;#039;&amp;#039;&amp;#039; hosting: Cloudflare&amp;#039;s free &amp;#039;&amp;#039;&amp;#039;Bot Fight Mode&amp;#039;&amp;#039;&amp;#039; detects the module&amp;#039;s cURL calls (no browser, no JS, non-standard User-Agent) as bot traffic and responds with a &amp;quot;Managed Challenge&amp;quot; — which shows up on the module side as an empty-body 403.&lt;br /&gt;
&lt;br /&gt;
To confirm: in the Cloudflare dashboard, &amp;#039;&amp;#039;&amp;#039;Security &amp;gt; Analytics &amp;gt; Events&amp;#039;&amp;#039;&amp;#039;, filter on the last few minutes after a fresh test. If the blocked entry shows &amp;#039;&amp;#039;&amp;#039;Service = &amp;quot;Bot fight mode&amp;quot;&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Action = &amp;quot;Managed Challenge&amp;quot;&amp;#039;&amp;#039;&amp;#039;, this is the case.&lt;br /&gt;
&lt;br /&gt;
On the Free plan, this Bot Fight Mode &amp;#039;&amp;#039;&amp;#039;cannot be selectively bypassed per URL path&amp;#039;&amp;#039;&amp;#039;. The only option is to disable the toggle &amp;#039;&amp;#039;&amp;#039;globally&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;Security &amp;gt; Settings &amp;gt; &amp;quot;Bot fight mode&amp;quot;&amp;#039;&amp;#039;&amp;#039; → Off while running the import scripts, then re-enable it afterwards if needed.&lt;br /&gt;
&lt;br /&gt;
On a paid Cloudflare plan (Pro and above), Super Bot Fight Mode allows a finer bypass via a &amp;quot;Skip&amp;quot; Security Rule targeted at &amp;lt;code&amp;gt;/api*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
===Execution order===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# 1. Categories&lt;br /&gt;
php scripts/fetch-categories.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-categories.php 0&lt;br /&gt;
&lt;br /&gt;
# 2. Customers + addresses&lt;br /&gt;
php scripts/fetch-customers.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-customers.php 0&lt;br /&gt;
&lt;br /&gt;
# 3. Products (VAT resolved via tax_rules_groups, cover image downloaded)&lt;br /&gt;
php scripts/fetch-products.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-products.php https://www.yourshop.com/api ABCDEF... 0&lt;br /&gt;
&lt;br /&gt;
# 4. Downloadable module files (requires the &amp;quot;Psimport Bridge&amp;quot; PrestaShop module)&lt;br /&gt;
php scripts/fetch-product-files.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-product-files.php https://www.yourshop.com/api ABCDEF... 0&lt;br /&gt;
&lt;br /&gt;
# 4b. Full product image gallery&lt;br /&gt;
php scripts/fetch-product-images.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-product-images.php https://www.yourshop.com/api ABCDEF... 0&lt;br /&gt;
&lt;br /&gt;
# 5. Orders (configure $importable_state_ids and $payment_module_map at the top of the script before the first run)&lt;br /&gt;
php scripts/fetch-orders.php https://www.yourshop.com/api ABCDEF... 0 0&lt;br /&gt;
php scripts/import-orders.php 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Common parameters:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt; = 0 to fetch/import everything, or a number to test on a sample&lt;br /&gt;
*&amp;lt;code&amp;gt;clean_all_before_fetch&amp;lt;/code&amp;gt; = 1 to empty the staging table before a new fetch (default 0 = accumulate/update)&lt;br /&gt;
&lt;br /&gt;
===Replaying an import after fixing errors===&lt;br /&gt;
&lt;br /&gt;
Each staging table has an &amp;lt;code&amp;gt;import_status&amp;lt;/code&amp;gt; column:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; = to import&lt;br /&gt;
*&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; = successfully imported (&amp;lt;code&amp;gt;fk_dolibarr&amp;lt;/code&amp;gt; holds the id of the created Dolibarr object)&lt;br /&gt;
*&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; = in error (details in &amp;lt;code&amp;gt;import_error&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
To replay only the rows in error after fixing them, use the &amp;quot;Reset errors&amp;quot; button in the Import management tab, or:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
UPDATE llx_psimport_product SET import_status = 0 WHERE import_status = 2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then rerun the matching import script.&lt;br /&gt;
&lt;br /&gt;
===Downloadable module files===&lt;br /&gt;
&lt;br /&gt;
PrestaShop&amp;#039;s Webservice API &amp;#039;&amp;#039;&amp;#039;does not expose&amp;#039;&amp;#039;&amp;#039; &amp;quot;Virtual/downloadable product&amp;quot; files (confirmed by official GitHub ticket PrestaShop/PrestaShop#27834 and several PrestaShop forum threads). This is worked around by a &amp;quot;bridge&amp;quot; PrestaShop module installed once on the shop.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Recommended: Psimport Bridge module&amp;#039;&amp;#039;&amp;#039; (one-click, like every other import):&lt;br /&gt;
&lt;br /&gt;
#Install the module shipped in &amp;lt;code&amp;gt;bridge/psimportbridge/&amp;lt;/code&amp;gt; on your PrestaShop shop (upload the zip from the back office, or copy it via FTP/SFTP into &amp;lt;code&amp;gt;modules/&amp;lt;/code&amp;gt; then install it)&lt;br /&gt;
#No extra configuration needed: it reuses the same Webservice API key already set (&amp;lt;code&amp;gt;PSIMPORT_API_KEY&amp;lt;/code&amp;gt;)&lt;br /&gt;
#In the &amp;#039;&amp;#039;&amp;#039;Import management&amp;#039;&amp;#039;&amp;#039; tab, use the &amp;#039;&amp;#039;&amp;#039;↓ Fetch&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;→ Import&amp;#039;&amp;#039;&amp;#039; buttons on the &amp;quot;Product files&amp;quot; row, exactly like every other resource&lt;br /&gt;
#Once the migration is done, the module can be safely uninstalled (read-only, no database or disk writes on PrestaShop)&lt;br /&gt;
&lt;br /&gt;
This module only allows downloading files already referenced in &amp;lt;code&amp;gt;ps_product_download&amp;lt;/code&amp;gt; (protects against arbitrary file reads).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alternative&amp;#039;&amp;#039;&amp;#039; (if the bridge module cannot be installed): a manual CSV export of &amp;lt;code&amp;gt;ps_product_download&amp;lt;/code&amp;gt; from phpMyAdmin/Adminer, plus a local copy of PrestaShop&amp;#039;s &amp;lt;code&amp;gt;download/&amp;lt;/code&amp;gt; folder, then &amp;lt;code&amp;gt;php scripts/import-product-files.php /path/to/export.csv /path/to/download/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Full product image gallery===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;fetch-product-images.php&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;import-product-images.php&amp;lt;/code&amp;gt; retrieve &amp;#039;&amp;#039;&amp;#039;all&amp;#039;&amp;#039;&amp;#039; images of each PrestaShop product (not just the cover), via the &amp;lt;code&amp;gt;products/{id}/images&amp;lt;/code&amp;gt; Webservice sub-endpoint, into a dedicated staging table &amp;lt;code&amp;gt;llx_psimport_productimage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Points to check on the first run:&lt;br /&gt;
&lt;br /&gt;
*Each image&amp;#039;s position in the Dolibarr gallery is derived from the order returned by the API — visually check the order after import and manually reorder if needed&lt;br /&gt;
*To avoid showing the same picture twice (cover + gallery), exact duplicates are detected and silently skipped&lt;br /&gt;
*The exact shape of the JSON response can vary depending on the PrestaShop version: test first with &amp;lt;code&amp;gt;limit=5&amp;lt;/code&amp;gt; on a sample&lt;br /&gt;
&lt;br /&gt;
===Checks after each step===&lt;br /&gt;
&lt;br /&gt;
#Inspect the content of the &amp;lt;code&amp;gt;llx_psimport_*&amp;lt;/code&amp;gt; tables (data consistency, correctly resolved VAT)&lt;br /&gt;
#In the Dolibarr UI, check: category tree, third-party records (address, contact), product sheets (price excl./incl. tax, VAT, image, attached file), orders (lines, totals, status)&lt;br /&gt;
#Compare counts (number of categories/customers/products/orders) between PrestaShop, the staging table, and Dolibarr&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
===Do I need direct access to the PrestaShop MySQL database?===&lt;br /&gt;
No. The whole migration goes through PrestaShop&amp;#039;s REST Webservice API, except for one optional, one-off step (manual CSV export) if the bridge module cannot be installed for downloadable files.&lt;br /&gt;
&lt;br /&gt;
===Which PrestaShop versions are compatible?===&lt;br /&gt;
From PrestaShop 1.6 to 9.x, via the standard Webservice API. The bridge module (on the PrestaShop side) declares this compatibility range itself.&lt;br /&gt;
&lt;br /&gt;
===What should I do if a resource partially fails to import?===&lt;br /&gt;
Fix the underlying data (in the staging table or on the PrestaShop side), reset the rows in error to &amp;lt;code&amp;gt;import_status = 0&amp;lt;/code&amp;gt; (the &amp;quot;Reset errors&amp;quot; button or an SQL query), then rerun only the matching import script.&lt;br /&gt;
&lt;br /&gt;
===The connection test fails with a 403 even though the URL works in a browser===&lt;br /&gt;
See the [[#Troubleshooting: HTTP 403 on the API (hosting behind Cloudflare)|HTTP 403 troubleshooting]] section: this is usually an application firewall (Cloudflare Bot Fight Mode) blocking cURL calls, not PrestaShop itself.&lt;br /&gt;
&lt;br /&gt;
===Does the Psimport Bridge module modify data on PrestaShop?===&lt;br /&gt;
No, it is read-only: no database or disk writes on PrestaShop, and it only allows downloading files already referenced in &amp;lt;code&amp;gt;ps_product_download&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[https://www.atoo-net.com Atoo-Net — Module publisher]&lt;br /&gt;
*[https://framagit.org/grandoc/psimport Module repository]&lt;br /&gt;
*[https://wiki.dolibarr.org/index.php/Module_UltimateMarketPlace_EN Module UltimateMarketPlace]&lt;br /&gt;
&lt;br /&gt;
==Other languages==&lt;br /&gt;
&lt;br /&gt;
* [[Module_psimport_FR|Documentation en français du module psimport]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Module_psimport_FR]]&lt;/div&gt;</summary>
		<author><name>Grandoc</name></author>
	</entry>
</feed>