Cdiscount Store Management
This is the installation and configuration guide for Cdiscount Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the cdiscount_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.
| Technical name | cdiscount_store_management |
| Odoo versions | 17.0, 18.0, 19.0 (Community or Enterprise) |
| Current shipped version | 17.0 → 17.0.2.2.3, 18.0 → 18.0.2.2.3, 19.0 → 19.0.2.2.3 |
| Price | $499 USD — one-time, per Odoo version |
| Odoo module licence | OPL-1 (Odoo Proprietary License v1.0) |
| Category | Connector |
The module installs on its own. It declares no ECOSIRE licence module as a dependency and has no activation step: buying it and installing the ZIP is the whole procedure.
Requirements
| Requirement | Detail |
|---|---|
| Odoo | 17.0, 18.0 or 19.0, Community or Enterprise. Self-hosted or Odoo.sh — Odoo Online (SaaS) cannot install third-party modules |
| Odoo apps | base, sale_management, stock, account, delivery, mail, web, product, contacts, knowledge — Odoo installs any that are missing |
| Python packages | requests |
| Platform account | A Cdiscount/Octopia seller account with API credentials (Client ID, Client Secret, Seller ID) |
Install the Python packages into the same interpreter that runs Odoo:
sudo -u odoo pip install requests
Installation
1. Download the ZIP for your Odoo version
Sign in at ecosire.com and open your dashboard downloads, or download the build for your series from the Odoo App Store listing.
2. Extract into your addons path
unzip cdiscount_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/cdiscount_store_management/__manifest__.py # sanity check
The module must end up as a single top-level cdiscount_store_management/ directory with __manifest__.py directly inside it. If your ls check fails, the folder landed one level too deep or too shallow — move it so the path above resolves.
3. Restart Odoo and install
sudo systemctl restart odoo
- Go to Apps and click Update Apps List (developer mode must be on).
- Search for Cdiscount Store Management and click Install.
- Odoo pulls in the Odoo apps listed above automatically.
When the install finishes, a Cdiscount menu appears in the main Odoo app switcher.
Configuration
Connect to Cdiscount
Create a connection record on the cdiscount.configuration model. The fields the module defines for the connection are:
| Field | Technical name | Type | Required |
|---|---|---|---|
| Configuration Name | name | Char | Yes |
| Client ID | client_id | Char | Yes |
| Client Secret | client_secret | Char | Yes |
| Seller ID | seller_id | Char | Yes |
| Company | company_id | Many2one | Yes |
| Cdiscount URL | cdiscount_url | Char | No |
| Marketplace | marketplace | Char | No |
| Timeout (seconds) | timeout | Integer | No |
The fields marked Yes are enforced by the model — Odoo will not let you save the record without them. The technical name is the reliable identifier if your screen wording differs.
The same record carries 7 behaviour checkboxes — sync_products, sync_orders, sync_customers, sync_inventory, auto_sync_products, auto_sync_orders, auto_sync_customers. They gate what the module is allowed to do automatically once it is connected. Leave anything you are not ready for switched off, and turn them on one at a time.
The module's own source contacts these hosts: api.octopia-io.net (the Seller API) and
auth.octopia-io.net (the token endpoint). Your firewall must allow outbound HTTPS to both.
Public endpoints this module exposes
The connector serves one externally reachable endpoint. The path is relative to your Odoo base URL
(web.base.url), so the address you register on the platform looks like
https://erp.example.com/cdiscount/webhook.
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/cdiscount/webhook | POST | Public (unauthenticated) | Receives Cdiscount webhook deliveries. This is the URL to register as your notification destination in the Cdiscount seller portal. |
/cdiscount/webhook fails closed. A delivery is acknowledged only after an active webhook record
(model cdiscount.webhook, status active) verifies the delivery's signature against the raw request
body and headers. Anything that fails verification is answered HTTP 403 and nothing is processed
from it, so the endpoint being publicly reachable does not make it publicly usable. Rejected
deliveries are written to the Odoo log with the calling IP address.
Create and enable the webhook record — with its signing secret — before you register the URL on the platform; until one exists, every delivery is refused.
The module's dashboard and settings screens also call three session-authenticated endpoints. They are not public: each one requires a logged-in Odoo user and answers only for the companies that user may see.
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/cdiscount/api/status | POST | Odoo session | Returns the connection status and last-sync summary for the dashboard |
/cdiscount/api/sync | POST | Odoo session | Triggers a sync from the dashboard's quick actions |
/cdiscount/dashboard/data | POST | Odoo session | Serves the dashboard's KPI, chart and activity data |
Scheduled actions
The module installs 6 scheduled actions (Settings → Technical → Scheduled Actions):
| Scheduled action | Runs every | Enabled on install |
|---|---|---|
| cdiscount: Sync Products | 1 hour | Yes |
| cdiscount: Sync Orders | 30 minutes | Yes |
| cdiscount: Sync Customers | 6 hours | Yes |
| cdiscount: Sync Inventory | 15 minutes | Yes |
| cdiscount: Test Connection | 1 day | Yes |
| cdiscount: Cleanup Old Logs | 1 day | Yes |
Intervals above are the shipped defaults. Adjust them to your volume — but be aware that the platform, not Odoo, sets the API rate limits, and shortening a sync interval is the usual cause of throttling errors in the logs.
Using the module
The module's menu is laid out as:
- Cdiscount → Dashboard
- Cdiscount → Orders — the Odoo sale orders this connector created
- Cdiscount → Seller Orders — the orders as Cdiscount reports them, with the acceptance deadline and the Accept / Refuse / Cancel on Cdiscount actions
- Cdiscount → Returns — marketplace returns, with their state
- Cdiscount → Products
- Cdiscount → Customers
- Cdiscount → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
- Cdiscount → Configuration — Settings
A normal first run is:
- Save the connection record and confirm the module reports a successful connection before importing anything.
- Review the mapping records so imported data lands on the right Odoo records.
- Run a small import first — restrict it by date or by a handful of products — and check the results before letting the scheduled actions take over.
- Watch the log records during the first full sync. Failures are recorded there rather than raised at the user.
Troubleshooting
Syncing
| Symptom | Cause and fix |
|---|---|
| The connection will not validate | Re-check every required field in the table above. Most failures are a mistyped secret, or credentials created for a sandbox while the module points at production (or vice-versa). |
| Nothing syncs even though the connection is fine | The scheduled actions are disabled at the Odoo level, or Odoo's cron worker is not running. Check Settings → Technical → Scheduled Actions and that --max-cron-threads is greater than zero. |
| Sync starts then stops part-way | Read the module's log records for that run. Rate limiting and rejected field values are the two common causes; both are logged with the platform's own error text. |
| Records import but map to the wrong Odoo values | Fix the mapping records under the module's configuration, then re-run the import. |
| Duplicated products or customers | Run the initial import once. If a first attempt half-finished, check the existing records before re-running rather than importing on top. |
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.2.3 |
| 18.0 | 18.0.2.2.3 |
| 19.0 | 19.0.2.2.3 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.2.3 is the
Odoo 19 build of module version 2.2.3. Your installed version is shown in Apps.
What changed in 2.2.3
- Dark mode now covers the dashboard. In Odoo's dark mode the dashboard used to stay light; it now follows the dark theme like the rest of Odoo.
- The "Create Configuration" button on an empty dashboard displays correctly. Its "+" sign no longer spills out of the button.
- The Mapping wizard creates every mapping type from the screen. The category section now shows its Cdiscount field, and the payment, shipping, customer-group and attribute sections show their own fields instead of the order-status field. The fields each mapping needs are marked required.
- Cleaner Import, Export and Mapping wizards. The actions sit in the dialog footer beside Cancel, each dialog opens with one line of guidance, the store field shows a placeholder when empty, and the brand is written "Cdiscount" throughout titles, help texts and error messages.
- Empty Imported Products and Customers lists explain what to do. They point you to the Import Wizard or Sync Now, because records arrive from Cdiscount rather than being created by hand.
- The Sync Logs list stays readable on narrow screens. The key columns always show; the secondary counters, duration, store and user are optional columns you can switch on.
What changed in 2.2.2
- The platform contract is the vendor's own OpenAPI definition. Every call this module makes is reconciled against Octopia's published Seller API surface — 88 operations, 50 of which the connector implements on all three Odoo versions — so the contract, the code and this page describe the same integration.
- The Seller Orders screen gained kanban, pivot and graph views, grouped by state and by storefront, so the 48-hour acceptance queue and monthly revenue are readable without exporting.
- The dashboard now respects company boundaries. Its reads run with elevated rights, and they are bounded to the companies the logged-in user may see, so a multi-company database no longer shows one company's orders on another company's dashboard.
- A sync creates products again on Odoo 18 and 17. The product-identity refactor had dropped a model reference on those two series, so every new product failed inside its own savepoint and was counted as a failed record.
- The Seller Orders form opens on Odoo 17. The view referenced the module's security groups by short name, which 17.0 refuses; the references are now fully qualified on every series.
What changed in 2.2.1
- The platform calls were corrected against Octopia's own published OpenAPI definition of the
Seller API. The connection test and seller profile use
/sellers, the catalog uses/productswith its imports tracked on/products-integration-reports, stock updates go through/fulfillment-products, offers are read withPOST /offers/search, shipments are their own/outbound-shipmentsresource, discussion replies post toPOST /messages, report documents live under/reports/{reportId}/report-documents, and page numbers start at 1. - Cancellation is a request. Octopia Seller v2 has no per-order cancel route: Cancel on Cdiscount files a cancellation request that the marketplace answers.
- The return refund button is gone. Cdiscount publishes no seller-side refund operation, so refund in the Cdiscount seller portal and set the return's state to Refunded in Odoo.