Catch Store Management
This is the installation and configuration guide for Catch Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the catch_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.
| Technical name | catch_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 (17.0, 18.0 and 19.0) |
| Odoo module licence | OPL-1 |
| Category | Connector |
This release is repair and polish. Nothing about your configuration changes and there is no re-sync to run.
- The Export and Mapping wizards show their fields again. Both dialogs opened with section headings and nothing underneath them, so an export or a mapping could not be configured at all. Export now shows the configuration, what to send (products, stock levels) and the per-run limit, and says plainly that Catch orders and customers are imported, not pushed. Mapping shows both sides of the selected mapping type with the required fields marked.
- Catch is spelled as a name in the wizard titles — Export to Catch, Catch Mapping — instead of in lower case.
- The Order Status chart draws. The doughnut was built empty and then updated, which left its legend sitting over a blank area. Charts are now drawn from the loaded figures after the page renders, and a period with no orders says "No orders yet" instead of showing an empty chart.
- The dashboard follows Odoo's dark mode. Odoo serves dark mode as a separate stylesheet bundle, and the dashboard was only listening for a theme attribute Odoo never sets. A dark stylesheet now ships in that bundle, so the dashboard matches the rest of your Odoo.
- The first load, an empty period and a failed load each say what they are. The dashboard opens with skeleton cards instead of zeros that read as real figures; an empty period points you at Sync Now; a load that fails shows its message at the top of the page with Try again and Settings.
- A long store name no longer runs off a phone screen — it is truncated to one line in the header.
- The Import wizard's configuration field spans the dialog, so a long store name is no longer clipped.
Every one of these came from a real customer report, and each now has a test that proves it. The ones an operator will notice:
- Orders are no longer imported at a guessed exchange rate. If Catch reports a currency Odoo cannot price — unknown, archived, or with no rate for the order's date — the order is refused and recorded instead of being written at 1:1.
- Two Catch accounts can no longer collide on one order. Order identity is scoped to the account it came from, so a second store reusing an order id gets its own sale order.
- A partial or failed run no longer reports the account as up to date. The "last synced" stamps only advance on a clean run; a run that skipped or failed rows stays a warning and leaves the stamp alone.
- Imported orders carry their money and their identifiers — source currency, payment state, shipping, shipping tax and discount recorded separately (a zero discount stays a stated zero), plus the carrier, buyer reference and the marketplace order, shipment and invoice references.
- Product sync no longer drops what Catch sends — description, brand and image reference are kept, and variant identifiers are preserved on the product.
- Masked buyer details are never stored as a contactable email, and the order explains that the marketplace masked them.
- The dashboard states the currency it is showing instead of always using a dollar sign.
- The Orders screen opens the connector's own list and form, not the full sales screen.
- Cancelling a queue is a Catch Manager action, exactly like starting a sync; scheduled jobs are unaffected.
- The dashboard is faster on a large order history: revenue, average order value and the sales trend are computed by the database instead of loading every order, and the trend chart counts Catch orders only.
- The dashboard charts open what they count. Click a day on the revenue trend and the Catch orders behind that day open; click a segment of the order-status ring and the orders in that state open. Each uses the same definition the number on screen is counted with.
- The listing ships only the assets the store page uses — the cover, the icon and the eight screenshots. The stale legacy image set that earlier builds carried is gone.
Odoo 17 and 18 ship the same code as Odoo 19. Until 2.2.1 the 17.0 and 18.0 builds
used an API client that pointed at an address Catch does not serve, so they could not connect at
all, and their product, order and inventory sync had been removed rather than finished. Both builds
now carry everything 2.2.0 brought to Odoo 19: the real Catch address and Authorization header,
working Sync Products / Sync Orders / Sync Inventory / Push Stock, a Test Connection that reports
what Catch actually answered, the repaired Test Connection and Import wizards, the scheduled
actions (shipped switched off), and the Catch URL field for the staging environment. Screens
whose actions Catch's API cannot serve say so by name instead of failing or reporting a
success that never happened.
In a database with several companies, the dashboard and the status panel only ever show the Catch connection of the companies you are working in. Both screens read the connection with elevated rights — they must, so that a user who cannot edit settings can still see sync health — and that path previously had no company filter, so one company's user could see another company's connection details, order and customer counts, sync log and queue. Every one of those reads is limited to your companies.
Starting a sync is a Catch Manager task: the Sync buttons are hidden from other users and the sync methods refuse them. Your scheduled actions are unaffected.
On Odoo 19 the dashboard's Sync button had stopped working — it called an endpoint that build had lost. It is restored on every version, with the same company filter and manager check as everything else.
Every build from 2.1.0 onward installs and runs on its own: there is nothing to activate, register or unlock. If you are running a build older than 2.1.0, download the current build for your Odoo version from your ECOSIRE dashboard.
Each Odoo major version is a separate product: your purchase entitles you to the download for the Odoo version you bought. Buy the version you actually run, and if you later upgrade Odoo you need the build for the new version.
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 |
| ECOSIRE dependency | None — the module installs on its own |
| Python packages | requests |
| Platform account | A Catch account with API access |
| Licence | Your purchase for this module and your Odoo version |
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. You will only be offered the file matching your licence's Odoo version — that is expected, see the warning above.
2. Extract into your addons path
unzip catch_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/catch_store_management/__manifest__.py # sanity check
The module must end up as a single top-level catch_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 Catch Store Management and click Install.
- Odoo pulls in the Odoo apps listed above automatically. No ECOSIRE dependency is needed.
When the install finishes, a Catch menu appears in the main Odoo app switcher.
Configuration
Connect to Catch
Create a connection record on the catch.configuration model. The fields the module defines for the connection are:
| Field | Technical name | Type | Required |
|---|---|---|---|
| Configuration Name | name | Char | Yes |
| API Key | api_key | Char | Yes |
| Seller ID | seller_id | Char | Yes |
| Company | company_id | Many2one | Yes |
| Catch URL | catch_url | Char | No |
| Marketplace | marketplace | 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 the sync toggles — sync_products, sync_orders, sync_customers, sync_inventory — plus auto_sync_customers, which is the one that puts a lane on a schedule: the catch: Sync Customers scheduled action only picks up configurations with Auto Sync Customers switched on. Products, orders and inventory are driven from the Operations wizards and the configuration's own actions in this release, not from a schedule. Leave anything you are not ready for switched off, and turn them on one at a time.
The module's own source contacts this host: api.catch.com.au. 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/catch/webhook.
Catch does not push webhooks. The platform's own API contract provides no webhook registration route, so this module keeps your data current by polling on the scheduled actions below. There is no notification URL to register in your Catch seller portal, and nothing to open on your firewall for inbound traffic.
The /catch/webhook route exists only to refuse such deliveries safely. It fails closed: a
delivery is verified against the raw request body and headers, no Catch-originated delivery can
pass that verification, and everything that fails is answered HTTP 403 and never processed.
Rejected deliveries are written to the Odoo log with the calling IP address. If you have been
given a webhook URL by another system, do not point it here — it will be refused, by design.
The module's other routes are internal JSON-RPC endpoints that its own screens call:
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/catch/api/status | POST (JSON-RPC) | Logged-in Odoo user | Connection and sync status for the status panel |
/catch/api/sync | POST (JSON-RPC) | Logged-in Odoo user | Starts a sync from the dashboard's Sync button; refuses users without Catch Manager rights |
/catch/dashboard/data | POST (JSON-RPC) | Logged-in Odoo user | The dashboard's KPI payload |
All three require a logged-in Odoo user with access to the module, so none is reachable from the internet and none is part of your Catch seller-portal setup. There is nothing to register and nothing to open on your firewall for them.
Scheduled actions
The module installs 2 scheduled actions (Settings → Technical → Scheduled Actions):
| Scheduled action | Runs every | Enabled on install | What it does |
|---|---|---|---|
| catch: Sync Customers | 6 hours | Yes | Syncs customers for every active configuration with Auto Sync Customers on |
| catch: Cleanup Old Logs | 1 day | Yes | Trims the module's own sync-log records |
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.
Product, order and inventory synchronization in this release is operator-driven: run it from Catch → Operations (Import Wizard, Export Wizard) or from the actions on the configuration record. If you need those on a timer, create your own scheduled action calling the same method, or contact support.
Using the module
The module's menu is laid out as:
- Catch → Dashboard
- Catch → Orders
- Catch → Products
- Catch → Customers
- Catch → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
- Catch → 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
Installing
| Symptom | Cause and fix |
|---|---|
| Odoo does not list the module after Update Apps List | The folder is at the wrong depth in your addons path. __manifest__.py must sit directly inside catch_store_management/. |
The requests library is required | requests is missing from Odoo's Python environment. Install it into the interpreter that runs Odoo. |
| An order was refused: "No exchange rate from … to …" | The order's currency has no rate in Odoo for that date. Add it under Accounting → Configuration → Currencies, then sync again. The connector refuses rather than importing at 1:1, which would misstate every amount on the order. |
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. |
| The dashboard still shows "last synced" as old after a sync | That run was partial — some records were skipped or failed, and the log says so. A partial run deliberately does not move the timestamp, so the next attempt is not pushed a full interval away. Clear the cause in the log and run it again. |
| A user cannot see the Sync buttons, or a sync is refused | Starting a sync needs the Catch Manager group. Ask an administrator to add the user to it. |
| A customer's name or email shows asterisks | Catch masked that buyer's details in the payload it released to you. The module stores them exactly as received and never unmasks them; the order's history explains this. Contact the buyer through the Catch seller portal. |
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.2.2 |
| 18.0 | 18.0.2.2.2 |
| 19.0 | 19.0.2.2.2 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.2.2 is the Odoo 19 build of module version 2.2.2. Your installed version is shown in Apps.