eMAG Store Management
This is the installation and configuration guide for eMAG Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the emag_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.
| Technical name | emag_store_management |
| Odoo versions | 17.0, 18.0, 19.0 (Community or Enterprise) |
| Current shipped version | 17.0 → 17.0.2.1.2, 18.0 → 18.0.2.1.2, 19.0 → 19.0.2.1.2 |
| Price | $1,499 USD — one-time, per Odoo version |
| Odoo module licence | OPL-1 |
| Category | Connector |
| Served markets | Romania (eMAG.ro), Bulgaria (eMAG.bg), Hungary (eMAG.hu) |
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, portal, product, contacts, digest — Odoo installs any that are missing |
| Python packages | requests |
| Platform account | An eMAG Marketplace seller account with API access (API username and API password) |
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, then pick the file for the Odoo version you actually run. Each version is sold separately and the builds are not interchangeable.
2. Extract into your addons path
unzip emag_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/emag_store_management/__manifest__.py # sanity check
The module must end up as a single top-level emag_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 eMAG Store Management and click Install.
- Odoo pulls in the Odoo apps listed above automatically.
When the install finishes, an eMAG menu appears in the main Odoo app switcher.
Configuration
Connect to eMAG
Create a connection record under eMAG → Configuration → Instances. The fields the module defines for the connection are:
| Field | Technical name | Type | Required |
|---|---|---|---|
| Instance Name | name | Char | Yes |
| API Username | username | Char | Yes |
| API Password | password_key | Char | Yes |
| Company | company_id | Many2one | Yes |
| Market | market_code (or market_id) | Selection / Many2one | No — defaults to Romania |
| Vendor ID | vendor_id | Char | No |
| Shop URL | shop_url | Char | No |
| API Key | api_key | Char | No |
| Shared Secret | shared_secret | Char | No |
| Password | password | Char | No |
| API Base URL | api_base_url | Char | No — derived from the market |
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.
API Username and API Password are the credentials the connector sends (HTTP Basic, as eMAG documents). They are restricted to the system group, so an ordinary user cannot read them.
The market decides the host, the currency and the compliance pack. Three markets are served:
| Market | Host | Currency | Compliance |
|---|---|---|---|
| Romania | marketplace-api.emag.ro | RON | RO e-Factura |
| Bulgaria | marketplace-api.emag.bg | BGN | BG NRA |
| Hungary | marketplace-api.emag.hu | HUF | HU NAV Online Számla |
Poland is selectable but is not served. No HTTPS listener answers on marketplace-api.emag.pl and eMAG's own OpenAPI document publishes no .pl server, so the client refuses a Polish connection instead of failing every call silently. Leave the market on a served value.
The same record carries 3 automation switches — auto_confirm_order, auto_create_invoice, auto_validate_invoice. 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: marketplace-api.emag.ro, marketplace-api.emag.bg, marketplace-api.emag.hu. Your firewall must allow outbound HTTPS to them.
The one route the module serves itself
emag_store_management exposes a single HTTP route, and it is not an OAuth flow:
| Route | Method | Auth | What it does |
|---|---|---|---|
/emag/connect | GET | logged-in user | Redirects to the eMAG instance configuration form (optionally to one instance, via ?instance_id=<id>), so a link can take an operator straight to where the credentials are entered |
eMAG's Marketplace API authenticates with HTTP Basic (API username + API password). There is no authorization-code exchange and no access token to fetch, on any eMAG market domain.
Scheduled actions
The module installs 13 scheduled actions (Settings → Technical → Scheduled Actions):
| Scheduled action | Runs every | Enabled on install |
|---|---|---|
| eMAG: Sync Products | 30 minutes | Yes |
| eMAG: Sync Orders | 15 minutes | Yes |
| eMAG: Sync Customers | 60 minutes | Yes |
| eMAG: Sync Inventory | 10 minutes | Yes |
| eMAG: Process Queue Jobs | 5 minutes | Yes |
| eMAG: Import Payout Reports | 6 hours | Yes |
| eMAG: Import Refunds | 30 minutes | Yes |
| eMAG: Auto Risk Detection | 30 minutes | Yes |
| eMAG: Generate Analytics | 4 hours | Yes |
| eMAG: Webhook Health Check | 60 minutes | Yes |
| eMAG: Cleanup Old Logs | 24 hours | Yes |
| eMAG: Process Workflows | 10 minutes | Yes |
| eMAG: Daily Summary Report | 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:
- eMAG → Dashboard
- eMAG → Orders
- eMAG → Products
- eMAG → Customers
- eMAG → Finance — Refunds, Payouts
- eMAG → Analytics
- eMAG → Operations — Run Operations, Queue Jobs, Logs
- eMAG → Configuration — Instances, Carriers, Locations, Payment Gateways, Scheduled Actions, Webhooks, Markets (RO/BG/HU), Easybox Lockers (RO)
- eMAG → Compliance — RO e-Factura Reports
A normal first run is:
- Save the connection record and confirm the module reports a successful connection before importing anything. A failed test leaves the connection in the error state and shows you eMAG's own message.
- 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.
What the connector calls
The connector is bound to eMAG's published OpenAPI document (version 4.5.2). It calls 41 documented operations — orders, products and offers, stock, categories, AWB shipping labels, invoices and VAT reads, campaigns, smart deals and the returns/RMA webhook surface — and it calls nothing eMAG does not publish. An operation the platform does not serve is refused locally rather than sent and guessed at.
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.1.2 |
| 18.0 | 18.0.2.1.2 |
| 19.0 | 19.0.2.1.2 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.1.2 is the Odoo 19 build of module version 2.1.2. Your installed version is shown in Apps.
2.1.2
- The dashboard follows Odoo's dark theme. In dark mode the page, the cards and the chart labels now use dark colours instead of staying light.
- The Order Status chart draws. It could stay a blank circle with only its legend; both charts are now built from the loaded figures.
- Empty, loading and error states explain themselves. A period with no sales or orders says so inside each chart, the first load shows a placeholder layout instead of a row of zeroes, and a failed load shows an error at the top of the page with a Try again button.
- Lists fit a phone. Orders, customers, queue jobs, logs, payouts, webhooks and connections lead with short headers and a status badge; secondary columns sit behind the optional-columns toggle, and a long store name on the dashboard is shortened with an ellipsis.
- Analytics shows its figures. The analytics list now shows the period, dates, orders, sales, average order and status instead of the report name alone.
2.1.1
- eMAG OpenAPI 4.5.2 coverage — four campaign read operations added against the vendor's current document, and the catalogue reconciled with the live router so nothing is offered that eMAG answers 404 for.
- Courier accounts are company-scoped. A courier account now belongs to one connection and that connection's company, with the code unique per company. Previously the record rule filtered by an optional mapped delivery carrier, which hid every unmapped account from non-manager users.
- A failed connection test is recorded. A test that fails now leaves the connection in the error state and surfaces the platform's own message, instead of appearing to succeed.
- The dashboard no longer writes. Opening a dashboard period computed and assigned date fields on the connection record — a read that mutated data. The KPIs are now computed by a pure helper, and a bad custom period falls back without raising.
- Dead weight removed. ApexCharts was loaded on every backend page and used by nothing; it and two unreferenced data files are gone from the bundle.
- Click a chart and you get the records. Both dashboard charts now open the eMAG orders behind the point or segment you click, for the same period and connection the figure was computed from.
Troubleshooting
Connecting and syncing
| Symptom | Likely cause |
|---|---|
| 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). |
| The connection reports an authentication failure | eMAG rejected the API username/password combination. A 401 and a 403 are reported distinctly, so you can tell a wrong credential from a credential that lacks rights for that operation. |
| 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. |
| Sync reports throttling | The client already applies a sliding-window limit and retries a 429 for the wait the platform asks for. If you still see it, lengthen the interval rather than retrying harder. |
| 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. Re-imports update the record they created; a buyer is matched to the existing contact. |
| A connection in Poland fails every call | Poland is not served through this API. Switch the market to Romania, Bulgaria or Hungary. |