Bol.com Store Management
This is the installation and configuration guide for Bol.com Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the bolcom_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.
| Technical name | bolcom_store_management |
| Odoo versions | 17.0, 18.0, 19.0 (Community or Enterprise) |
| Current shipped version | 17.0 → 17.0.2.3.2, 18.0 → 18.0.2.3.2, 19.0 → 19.0.2.3.2 |
| Price | $599 USD — one-time, per Odoo version |
| Odoo module licence | OPL-1 (Odoo Proprietary License) |
| Category | Connector |
The module installs and runs standalone — there is no licence client to install and no activation key to enter. Your right to use the software is the OPL-1 licence that comes with your purchase; nothing phones home to unlock it.
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 — Odoo installs any that are missing automatically |
| Python packages | requests |
| Platform account | A Bol.com retailer account with API access (Client ID + Client Secret) |
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. Pick the file matching your Odoo version.
2. Extract into your addons path
unzip bolcom_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/bolcom_store_management/__manifest__.py # sanity check
The module must end up as a single top-level bolcom_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 Bol.com Store Management and click Install.
- Odoo pulls in the Odoo apps listed above automatically. No separate ECOSIRE module is needed.
When the install finishes, a Bol.com menu appears in the main Odoo app switcher.
Configuration
Connect to Bol.com
Create a connection record on the bolcom.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 |
| Company | company_id | Many2one | Yes |
| Marketplace | marketplace | Char | No |
| Bol.com URL | bolcom_url | Char | 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.bol.com, login.bol.com. Your firewall must allow outbound HTTPS to them.
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/bolcom/webhook.
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/bolcom/webhook | POST | Public (unauthenticated) | Receives Bol.com webhook deliveries. This is the URL to register as your notification destination in the Bol.com seller portal. |
/bolcom/webhook fails closed. A delivery is acknowledged only after an active webhook record
(model bolcom.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.
Internal endpoints
Three further JSON-RPC endpoints exist for the module's own UI. They require a logged-in Odoo session, so they are not something you expose or register anywhere:
| Endpoint | Purpose |
|---|---|
/bolcom/api/status | Connection state and the last sync time per data type (products, orders, customers). |
/bolcom/api/sync | Triggers a sync run (products, orders, customers or all) on demand — the same actions the scheduled actions run, still gated by the configuration checkboxes. |
/bolcom/dashboard/data | Feeds the dashboard: KPIs, sales trend, order-status breakdown, top products and recent activity, honouring the dashboard's period filter. With no active configuration it returns a friendly empty state. |
Scheduled actions
The module installs 6 scheduled actions (Settings → Technical → Scheduled Actions):
| Scheduled action | Runs every | Enabled on install |
|---|---|---|
| bolcom: Sync Products | 1 hour | Yes |
| bolcom: Sync Orders | 30 minutes | Yes |
| bolcom: Sync Customers | 6 hours | Yes |
| bolcom: Sync Inventory | 15 minutes | Yes |
| bolcom: Test Connection | 1 day | Yes |
| bolcom: 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:
- Bol.com → Dashboard — NL / BE tabs, KPI cards, sales trend and status charts, LVB replenishment widget
- Bol.com → Orders and Bol.com → Orders (NL/BE) — the NL/BE view is a kanban board grouped by bol.com order status, with filters for market, fulfilment method and status
- Bol.com → Products (two entries: your imported Odoo products, and the bol.com catalog records) and Bol.com → Categories
- Bol.com → Customers — with AVG (Dutch GDPR) consent tracking
- Bol.com → Logistics & LVB — LVB / SF Locations, Transporters, LVB Inbound Shipments, LVB Replenishment Forecasts
- Bol.com → Returns & Refunds — Returns, Refunds, Risk Flags
- Bol.com → Finance — Settlements (with V11 commission breakdowns per settlement line), Analytics (NL/BE), Daily Digests
- Bol.com → Automation — Workflows, Auto Workflow Rules
- Bol.com → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
- Bol.com → Configuration — Settings
A normal first run is:
- Save the connection record and confirm the module reports a successful connection (Test 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 result panel 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.
Quality checks that run while you work
Two checks on the catalog records help you catch listing problems before bol.com rejects them:
- Barcode preflight — the EAN/GTIN barcode is validated with the GS1 check-digit rule, and the result shows on the catalog record, so a mistyped barcode is visible immediately instead of failing on export.
- LVB eligibility — each catalog record shows whether the product is eligible for LVB (Logistiek via Bol, bol's fulfilment service), taken from the product template.
On the Transporters list, each transporter shows whether it exposes a self-fulfilled label API (PostNL, DHL for You, DHL, DPD NL). Only those transporters can return a shipping label programmatically; others ship with a bol.com-arranged label.
Packaging waste for Flanders (VLAREMA)
LVB inbound shipments carry a VLAREMA packaging flag and weight. Select shipments and run the VLAREMA summary action: it totals the packaging weight split between recyclable and non-recyclable material across the selected shipments — the two numbers the Flemish declaration asks for.
Auto-workflow per market
Under Automation → Auto Workflow Rules you can define, per market (NL / BE), whether orders are auto-confirmed, auto-invoiced, auto-delivered, and whether the draft invoice is posted (validated) right after it is created. When "validate payment" is enabled, the invoice does not linger in draft — the workflow posts it.
Import and export wizards
The import and export wizards stay open when the run finishes and show a result panel with per-run counts and any failures, instead of closing silently. Read that panel — it is the honest account of what happened, including partial failures.
Importing orders without API credentials
If you are not ready to hand over API credentials, orders can be brought in from a spreadsheet instead. Open Bol.com → Operations → Import Wizard, choose the order import and download the template, fill it in, and import the file back. Importing the same file twice updates the orders it already created rather than duplicating them, so a corrected sheet can simply be re-imported.
Orders imported this way are ordinary Odoo sales orders and carry the same Bol.com reference, connection and market columns as an API import.
Settlements: where the money went
A Bol.com settlement invoice is not one number. Under Bol.com → Finance → Settlements, each line is classified separately as a sale, a commission, a fixed fee, shipping, or a discount funded by bol.com or by you, and zero-value lines are kept rather than dropped. That is what lets you answer "who paid for this promotion" from the record instead of from the payout total.
A line type the module does not recognise is refused — it is never filed under a catch-all category, because a wrongly filed line is worse than a visible one. If a settlement refuses to import, the line type in the platform's own file is new; check the log for the code it named.
Correcting orders you already imported
A price, tax or exchange-rate correction can be re-applied to orders that are already in Odoo. Re-import the corrected payload and the affected orders are reconciled in place — the correction reaches the historic backlog instead of only future imports, and running it twice changes nothing the second time.
Currencies
Bol.com sends amounts in euro, and this module stores and shows them in euro — an amount is never rescaled behind your back. A figure in your company currency is a separate, rate-backed number: it appears only when an exchange rate is on record for the period, and it stays empty with the row flagged when no rate exists. An empty company-currency column means "no rate on record", never a 1:1 assumption.
Troubleshooting
| 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. One bad record no longer aborts the run — the other records still import — but the failure is recorded in the log. |
| 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. |
| Barcode flagged on the catalog record | The EAN/GTIN fails the GS1 check-digit test. Correct the barcode on the product before exporting the offer. |
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.3.2 |
| 18.0 | 18.0.2.3.2 |
| 19.0 | 19.0.2.3.2 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.3.2 is the Odoo 19 build of module version 2.3.2. Your installed version is shown in Apps.
Recent releases:
- 19.0.2.3.2 — the dashboard is comfortable to read again at normal text sizes, and it follows your Odoo dark theme instead of staying light inside dark surroundings. The Order Status ring draws rather than showing a colour legend above an empty area, a period with nothing in it says so in both charts, and a load that fails is announced with a Retry button. The Bol.com app bar is down to eight groups — Dashboard, Orders, Catalog, Customers, Logistics & LVB, Finance, Operations and Configuration — with no duplicated entries, and the Catalog and Customers lists keep their raw Bol.com identifiers out of the default mobile view.
- 19.0.2.3.1 — the dashboard, status and sync screens stay inside your own companies (a user of one company could previously be shown another company's connection and figures); the dashboard no longer falls into its error state over two unset dates; orders imported before 2.3.0 are attached to their connection on upgrade where the company runs exactly one.
- 19.0.2.3.0 — large order backlogs are no longer cut off at 50 orders (the order sync read only the first page and reported a clean run — if you have more than 50 open orders, your backlog in Odoo is incomplete and the next sync fills it in); a second connection no longer swallows the first one's orders; a failed sync no longer looks like a successful one; the dashboard's "today" figure now counts; cross-currency figures are no longer invented and money is no longer mislabelled; platform asset references now resolve to a real image; a Bol.com operator can no longer read your entire sales database; the Bol.com panel now appears on the standard Sales, Contacts and Inventory forms. Also added: manual order import from a spreadsheet, settlement line classification and reprocessing of corrections.
- 19.0.2.2.1 — the same customer can no longer be filed twice; five API calls were corrected against Bol.com's own published specification (product content, catalog search, subscription test, shipping-label quote).
- 19.0.2.1.1 — orders kanban board grouped by bol.com status with market / fulfilment / status filters; VLAREMA packaging summary on LVB inbound shipments; barcode preflight (GS1 check-digit) and LVB eligibility as live fields on catalog records; transporter label-API support shown from the transporter code; per-market auto-workflow now posts draft invoices when "validate payment" is on; import/export wizards keep their result panel open; export wizard options reduced to the ones the code honours.
- 19.0.2.1.0 — the module became fully standalone: the licence-client dependency was removed, so there is no activation key and no separate ECOSIRE module to install.
- 19.0.2.0.6 — sync hardening: a single bad record during a sync can no longer roll back or poison the rest of the run.