Skip to main content

Otto Store Management

This is the installation and configuration guide for Otto Store Management, the module you downloaded from your ECOSIRE dashboard or the Odoo App Store. Everything on this page describes the otto_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.

Technical nameotto_store_management
Odoo versions17.0, 18.0, 19.0 (Community or Enterprise)
Current shipped version17.0 → 17.0.3.2.3, 18.0 → 18.0.3.2.3, 19.0 → 19.0.3.2.3
Price$499 USD — one-time, per Odoo version
Odoo module licenceOPL-1 (Odoo Proprietary License)
CategoryConnector

The module installs and runs standalone — nothing to unlock and no separate companion module to install first. Licensing is contractual: buying it entitles you to run the software and receive updates, per the licence terms above.

What's new in 3.2.3 — hardened against 36 known failure cases​

Version 3.2.3 is a reliability release. Every change below comes from a defect a real OTTO Market seller hit, and each one is covered by an executed test on Odoo 17, 18 and 19.

Figures you can trust

  • The dashboard window now includes both end days. The date range was built with a date-only upper bound against a timestamp column, so anything created during the closing day fell outside the window — "Today" showed yesterday's numbers, and the daily chart stopped one day short. Both are fixed.
  • Dashboard figures are scoped to your company and converted to your currency. The KPI queries read shared Odoo records in a way that bypasses the company rule, so on a multi-company database one company could be shown another company's totals. Totals are now converted into the company currency before they are summed and labelled; an order whose exchange rate is missing is excluded and counted rather than added at 1:1.
  • A failed sync no longer looks successful. Partial and failed runs used to advance the same "last sync" timestamp a clean run writes. The last successful sync now only moves on a successful run, and every attempt is recorded separately.
  • Sync counters describe the records, not the number of times you clicked. Re-running a product export used to inflate Total Products Synced without publishing anything new; the counters are now recomputed from the records.

Money

  • Settlements and refunds reach Odoo. OTTO reports its money through the Receipts interface. Gross sales, commission, fulfilment fees, the EPR levy and refunds are now reconciled into Finance → Settlements & Refunds, each amount in its own column and in the receipt's own currency, and returns are linked back to the order they refund.
  • Imported orders carry their marketplace currency instead of being booked in your company currency. A currency Odoo ships switched off (EUR on most databases) is activated so the order can be booked at all; a currency Odoo does not know fails that order closed, with the reason.
  • Shipping and every discount channel stay distinct, including a zero: a funding channel that was never mapped can no longer be confused with one that genuinely came through as zero.

Catalogue and operations

  • Multi-variant products publish one variation per variant. A product with variants used to publish only the parent SKU and silently drop the rest; a variant with no SKU is now reported by name.
  • Historical orders can be re-processed — after a mapping or exchange-rate correction, lines and totals are reconciled in place without duplicating the order.
  • The catalogue round-trips. Download the CSV template, fill it in, upload it back: products are matched by SKU and updated, with honest per-row accounting for anything that failed.
  • Two OTTO connections in one company no longer mix. The order identity check was keyed on the marketplace order id alone, so a second connection's order was treated as already imported and dropped.
  • OTTO identifiers are on the standard screens. The product, order and customer forms now carry an OTTO Market section, and the connector's own menus open the connector's restricted lists rather than the broad standard screens.
  • Otto URL and the sync cadence work. A configured base URL now reaches the API client, and the chosen frequency drives the sync schedule.
  • Credential material can no longer appear in a log, and the dashboard's dark theme, loading and error states are live and announced to assistive technology.
  • The dashboard charts open their records. Click a point on the revenue chart to see that day's orders; click a slice of the status chart to see the orders in that state.
  • Settlements have a full view suite — list, kanban grouped by entry type, pivot across every amount column, and a monthly net graph.

What the connector deliberately does not do. OTTO Market publishes no affiliate programme, no webhook API, no customer API and no image-resolution API. The module advertises none of them, and its regression suite proves each one fails clearly instead of pretending.

What's new in 3.2.2 — the confirmed outcome is actually applied​

Version 3.2.2 fixes the confirmation cycle 3.2.0 added and 3.2.1 repaired, and brings the Odoo 17 and Odoo 18 builds onto the same engine as Odoo 19.

  • A variation OTTO stored unchanged is now confirmed. OTTO answers a finished task's result lists in more than one shape, and one of them nests the SKU inside the variation (productVariation.sku). That shape was not resolved, so the unchanged list read as empty and those products were never marked confirmed. Both shapes resolve now, and the flat and nested forms are equally readable.
  • A rejected variation tells you what to fix. The product's error carried only "Rejected by OTTO product processing (task …)". OTTO's own reason — with the field it names, for example productDescription.title: must not be blank — is recorded against the product now. When OTTO gives no reason, the task reference stands in.
  • Return addresses use the route OTTO publishes. The returns-warehouse calls used /v2/returns/warehouses, which OTTO does not serve. The family is return addresses at /v2/returns-warehouse/addresses, with a /carriers sub-family; the connector uses those, and the two operations the client was missing — read one address and delete one — are implemented.
  • The queue workflow asks for the Otto Manager role. Processing, retrying and cancelling a queue decide whether a record is pushed to OTTO, so they are manager actions now rather than any user with the form button.
  • Multi-company safety on every connection lookup. The dashboard, status and sync endpoints resolved their OTTO connection with a search that carried no company filter, so on a database with more than one company you could be shown another company's connection. All three are company-scoped, the sync endpoint requires the Otto Manager role, and the dashboard names which connection its figures belong to.
  • The dashboard reads without writing. Opening it used to create its record on the fly, so two people opening it at the same time each inserted a row and recomputed every dependent figure.
  • Inventory push failures name the SKU. A failed availability batch recorded OTTO's message alone; the SKUs OTTO rejected are in the log and in the errors the caller receives, so the failure can be triaged without a support request.

The Odoo 17 and Odoo 18 packages are rebuilt from the Odoo 19 source in this release, so all three series ship the same behaviour and the same routes.

What's new in 3.2.1 — product-update tasks confirm their outcome​

Version 3.2.1 is a defect fix on the confirmation cycle that 3.2.0 introduced.

  • A finished product update no longer fails on its success path. After you push products to OTTO, the connector polls the export task and, once OTTO reports it DONE, reads that task's three result lists back. In 3.2.0 those read-back calls passed their arguments in the wrong order, so the moment a task completed successfully the poll raised TypeError instead of recording the outcome. The lists are now read with the arguments the helper declares, so a completed update is confirmed rather than crashed.

You only needed that release if you were on 19.0.3.2.0. The 17.0 and 18.0 builds did not carry this code at 3.2.1 — neither tree had the result-list read-back — and 3.2.2 below brings all three series onto the same engine.

What 3.2.0 added, for context​

  • Outcome confirmation. When a product export task finishes, the connector reads OTTO's succeeded, unchanged and failed variation lists for that task (GET /v5/products/update-tasks/{processUuid}/succeeded and /unchanged) and sets each product's Otto Sync Status to what OTTO actually accepted. Before this, every submitted product showed Synced as soon as it was sent — even when OTTO later rejected it. A rejected variation now shows Error with the task reference, and a variation OTTO stored unchanged is confirmed without a false error.
  • Lowercase task states. OTTO's pending / done spellings are handled the same as the uppercase ones, so polling follows the correct branch whichever casing the API answers with.
  • Partial reads survive. If one of a finished task's result lists cannot be read — a temporary rate limit on a single sub-resource, for example — the others are still read and applied, and the failed read is recorded on the task result instead of discarding the whole poll. Each variation status is applied in its own savepoint, so one malformed row cannot abort the remaining confirmations.

What 3.1.0 changed​

Version 3.1.0 removed the historical companion-module dependency. The module now installs and runs standalone: there is no second download to install first and nothing to unlock afterwards. Licensing is contractual, under the OPL-1 terms in the table above.

Requirements​

RequirementDetail
Odoo17.0, 18.0 or 19.0, Community or Enterprise. Self-hosted or Odoo.sh — Odoo Online (SaaS) cannot install third-party modules
Odoo appsbase, sale_management, stock, account, delivery, mail, web, product, contacts — Odoo installs any that are missing automatically
Python packagesrequests
Platform accountAn Otto Market partner account with API access

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 use the ZIP attached to your Odoo App Store purchase.

2. Extract into your addons path​

unzip otto_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/otto_store_management/__manifest__.py # sanity check

The module must end up as a single top-level otto_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
  1. Go to Apps and click Update Apps List (developer mode must be on).
  2. Search for Otto Store Management and click Install.
  3. Odoo pulls in the Odoo apps listed above automatically.

When the install finishes, a Otto menu appears in the main Odoo app switcher.

Configuration​

Connect to Otto​

Create a connection record on the otto.configuration model. The fields the module defines for the connection are:

FieldTechnical nameTypeRequired
Configuration NamenameCharYes
Client IDclient_idCharYes
Client Secretclient_secretCharYes
Partner IDpartner_idCharYes
Companycompany_idMany2oneYes
Sandbox ModesandboxBooleanNo
TimeouttimeoutIntegerNo
Otto URLotto_urlCharNo
MarketplacemarketplaceCharNo

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.

Sandbox Mode switches the client between OTTO's production host and its sandbox host. Turn it on while you are testing credentials, and off for live trading.

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.

Authentication is OAuth2 client credentials: the module exchanges client_id and client_secret for a bearer token at POST /v1/token. There is no refresh token — the client requests a new token when the current one expires. These are the credentials from OTTO's Partner Portal, not your portal login.

The module's own source contacts these hosts: api.otto.market, sandbox.api.otto.market. Your firewall must allow outbound HTTPS to them.

Scheduled actions​

The module installs 6 scheduled actions (Settings → Technical → Scheduled Actions):

Scheduled actionRuns everyEnabled on install
otto: Sync Products1 hourYes
otto: Sync Orders30 minutesYes
otto: Sync Customers6 hoursYes
otto: Sync Inventory15 minutesYes
otto: Test Connection1 dayYes
otto: Cleanup Old Logs1 dayYes

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.

OTTO signals rate limits with HTTP 429 and a Retry-After header; the module waits as instructed and retries rather than hammering the API.

Webhook and API endpoints your server exposes​

These are the HTTP routes this module adds to your Odoo instance. Only the public ones are reachable without an Odoo login.

EndpointAuthPurpose
/otto/webhookpublicWebhook receiver — see the note below; OTTO has no webhook push, so it rejects every delivery
/otto/api/statuslogged-in userconnection and sync status read by the dashboard
/otto/api/synclogged-in usertriggers a sync from the dashboard
/otto/dashboard/datalogged-in userdashboard KPI data
/otto/webhook is closed in this build — sync runs on the scheduled actions

The route exists and is publicly reachable, but it fails closed: otto.webhook._verify_signature() rejects every delivery and the endpoint answers HTTP 403. OTTO Market does not offer webhooks — polling is required — so no inbound payload to this route could be authentic. The module will not process an unauthenticated payload, so there is nothing to register in your OTTO Market seller portal today — there is no OTTO-side webhook setting to fill in. Leave the scheduled actions above enabled; they are how this build stays current.

Using the module​

The module's menu is laid out as:

  • Otto → Dashboard
  • Otto → Orders
  • Otto → Products
  • Otto → Customers
  • Otto → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
  • Otto → Configuration — Settings

A normal first run is:

  1. Save the connection record and confirm the module reports a successful connection before importing anything.
  2. Review the mapping records so imported data lands on the right Odoo records.
  3. 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.
  4. Watch the log records during the first full sync. Failures are recorded there rather than raised at the user.
  5. After your first product push, let the export task finish and re-read the product's Otto Sync Status. That status is OTTO's own verdict on each variation, so it is the check that tells you the catalog was really accepted.

Troubleshooting​

Syncing​

SymptomCause and fix
The connection will not validateRe-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). Check Sandbox Mode matches where the credentials were issued.
Nothing syncs even though the connection is fineThe 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-wayRead 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.
A product stayed on Synced after a rejected updateMove to 19.0.3.2.2. The 3.2.0 read-back could crash on a successful task (fixed in 3.2.1) and could not resolve a nested variation (fixed in 3.2.2); see What's new.
Records import but map to the wrong Odoo valuesFix the mapping records under the module's configuration, then re-run the import.
Duplicated products or customersRun the initial import once. If a first attempt half-finished, check the existing records before re-running rather than importing on top.
The requests library is requiredrequests is missing from Odoo's Python environment. Install it into the interpreter that runs Odoo.

Version history​

Odoo versionVersion you download today
17.017.0.3.2.2
18.018.0.3.2.2
19.019.0.3.2.2

ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.3.2.2 is the Odoo 19 build of module version 3.2.2. Your installed version is shown in Apps.

Support​