Skip to main content

Noon Store Management

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

Technical namenoon_store_management
Odoo versions17.0, 18.0, 19.0 (Community or Enterprise)
Current shipped version17.017.0.3.1.0, 18.018.0.3.1.0, 19.019.0.3.1.14
Price$499 USD — one-time, per Odoo version
Odoo module licenceLGPL-3
CategoryConnector
Licences are bound to one Odoo major version

A licence issued for Odoo 17 unlocks only the 17.0 download and only validates on an Odoo 17 database. It will not activate on 18 or 19, and those ZIPs will not appear in your dashboard. Buy the version you actually run — and if you later upgrade Odoo, you need the licence for the new version. This is enforced on both the download and the activation paths, so there is no way round it.

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, knowledge — Odoo installs any that are missing
ECOSIRE dependencyecosire_license_client — a separate free download, not bundled in this ZIP. See step 3
Python packagesrequests, PyJWT[crypto] (RS256 service-account login)
Platform accountA noon (or Namshi) seller account with unified Partner API access — a downloaded service-account credential .json, or OAuth 2.0 credentials
LicenceAn active ECOSIRE licence for this module and your Odoo version

Install the Python packages into the same interpreter that runs Odoo:

sudo -u odoo pip install requests "PyJWT[crypto]"

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 noon_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/noon_store_management/__manifest__.py # sanity check

The module must end up as a single top-level noon_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. Install the ECOSIRE licence client

noon_store_management declares ecosire_license_client as a hard dependency, so Odoo will refuse to install this module until the licence client is present in your addons path. The licence client is a separate, free module and is not bundled in this ZIP. Download it from your ECOSIRE dashboard alongside the connector and extract it the same way:

unzip ecosire_license_client_v*_*.zip -d /opt/odoo/addons/
If the licence client is not in your dashboard

The licence client is distributed separately from the connector archives. If you cannot see it in your downloads, email [email protected] with your licence key and we will send it to you — do not try to install the connector without it, because Odoo will simply refuse.

4. 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 Noon Store Management and click Install.
  3. Odoo pulls in ecosire_license_client and the Odoo apps listed above automatically.

Activate your licence

Where your licence key comes from

  • Bought on ecosire.com — the key is issued to your ecosire.com dashboard automatically at checkout; find it under your account's licences.
  • Bought on the Odoo App Store — create (or sign in to) your account at ecosire.com, then email [email protected] with the Odoo sales order reference from your purchase confirmation (the order slip Odoo sent you). We verify the purchase and issue the licence to your dashboard, usually the same day.

Before you activate

Set your instance's public URL first. The licence is bound to the domain derived from web.base.url, so activating with a placeholder value binds the licence to the wrong host:

  1. Turn on developer mode.
  2. Settings → Technical → System Parameters, find web.base.url.
  3. Set it to the real HTTPS URL your users browse to, e.g. https://erp.example.com.

Activate

  1. Go to Settings → ECOSIRE.COM → Activate License.
  2. Paste your licence key.
  3. Choose Noon Store Management in the module dropdown (it lists the installed ECOSIRE modules).
  4. Click Activate.

Settings → ECOSIRE.COM → License Status then shows, per module, the licence state, last-verified time, Odoo version, module version, support expiry, and whether an offline token is cached.

What the client sends

Activation and validation are HTTPS JSON calls to https://api.ecosire.com/api. Every request carries the same five fields:

{
"key": "ECO-XXXX-XXXX-XXXX-XXXX",
"module_name": "noon_store_management",
"domain": "erp.example.com",
"hw_fingerprint": "<sha256 of this installation's hardware/db identity>",
"odoo_version": "19.0"
}
EndpointUsed for
POST /api/licenses/activateFirst-time activation — binds the licence to this domain
POST /api/licenses/validateOngoing verification
POST /api/licenses/issue-tokenFetches the signed offline token used for the grace period
POST /api/licenses/deactivate-selfReleases this domain so the key can move to another database

The base URL is overridable through the ecosire.license.api_url system parameter. You do not need to change it.

Activation slots, and moving between databases

Each licence carries its own activation limit, and new licences default to a single domain. Some licences are issued with more. Do not assume a number — check Settings → ECOSIRE.COM → License Status, or the licence detail page in your ECOSIRE portal, for the limit on yours. Re-activating on a domain that is already bound is a no-op success, not a second slot.

  • To move a live licence to a different database, use Deactivate on the activation screen first; that releases the domain server-side so you can activate elsewhere.
  • Ten failed activation attempts within one hour trips a client-side rate limiter. Wait up to 60 minutes, or contact support — do not keep retrying a key you are unsure about.

Staying licensed after activation

A daily scheduled action, ECOSIRE License: Background Re-verification, re-checks the licence out of the request path, refreshes the cached offline token, and keeps the last-known-good timestamp fresh. Because of that, a transient network problem or a worker restart does not lock you out. Verification results are cached for five minutes, so a licence change can take a few minutes to show up.

If you see a hard rejection instead — LICENSE_NOT_FOUND, LICENSE_INACTIVE, LICENSE_EXPIRED, MODULE_MISMATCH, VERSION_MISMATCH or NOT_ACTIVATED_ON_DOMAIN — the grace period is deliberately not granted; fix the underlying problem. See Troubleshooting.

Configuration

What changed in 3.0 — unified Partner API (re-authentication required)

Version 3.0.0 rewrote the connector onto noon's unified Partner API Platform (shared by noon and Namshi), replacing the legacy static-bearer client. If you upgrade from a 2.x build, every configuration must be re-authenticated — the old Base URL / API Key / Bearer Token fields are deprecated no-ops (columns are preserved, so no data is lost, but they are no longer used). Later 3.0.x releases hardened every sync loop with per-record savepoint containment (3.0.7) and rewrote the App Store listing to state only shipped capabilities (3.0.8).

What's new in 3.1 — Noon OMS/FBN order sync and item-level finance pricing

This section describes the 19.0 build

The OMS/FBN order sync and finance-report pricing below ship from 19.0.3.1.1. The 18.0 and 17.0 builds are currently at 3.1.0, which carries only the dashboard accessibility/dark-mode rebuild described further down — the OMS/FBN sync engine has not been backported to 18.0/17.0 yet. If you are on 18.0 or 17.0, order import still works exactly as described under "Connect to noon or Namshi" (FBPI only); check Apps in your own database to see which patch you are on.

The FBPI endpoints described above are warehouse-scoped and only see orders placed under the FBPI program. From 3.1.1 the sync also pulls noon's official noon_noonoms_ordersexport report — the project-wide order export used by Noon OMS and Fulfilled-by-Noon (FBN) — so orders that FBPI cannot see (FBN fulfilment, project-wide OMS orders) are imported too, matched to a dedicated Noon Orders menu under Sales.

That OMS/FBN report carries no buyer PII and no line prices, so orders imported through it behave differently from a normal FBPI order:

  • Their Sales mirror is created as a draft and is never auto-confirmed — it triggers no stock move, delivery, or accounting entry.
  • Line prices start at zero with an explicit note ("this report does not expose buyer PII or line prices; amounts remain zero and this draft must not be invoiced without source pricing") — unless the finance report described below supplies a real price.
  • From 3.1.9, when your noon project also exposes the live item-level finance report (noon_financeweb_transactionviewreportonitemlevel), the sync matches its rows to the same order by exact order and item number and prices the mirror in the report's real currency (AED on ECOSIRE's connected UAE project) instead of leaving it at zero. Orders absent from the finance report stay at zero, honestly.
  • 3.1.12 fixed a pricing gap in that match: some finance rows book the item's value into a credit column (for example "Other Order Fees including VAT") instead of "Net Proceeds" — noon's own report still satisfies Total = Net Proceeds + <those columns>, so the sync now recovers the value from that identity instead of reporting zero. Fee-only rows (cancellations, returns) correctly remain zero — there is no item value to recover.
  • 3.1.13 added optional sales workflow automation per configuration, all OFF by default: auto-confirm completed orders once their real finance amounts arrived (delivered quantities are recorded and the automatic delivery transfer is cancelled, because noon fulfils the goods physically), auto-create draft customer invoices, and optionally auto-post them. Invoices default to draft because the finance amounts are noon gross values with no Odoo tax inferred — VAT treatment stays reviewable by your accountant. 3.1.13 also prices orders whose value arrives as a later order_update settlement correction instead of on the initial order row.
  • 3.1.14 added FBN (Fulfilled By Noon) inventory import: noon's fulfilment-centre stock is not reachable over the Partner API, so Operations → Import FBN Inventory loads the Seller Lab inventory export instead. One line per SKU, fulfilment centre and inventory type; customer returns are never counted as saleable; re-uploading the same export changes nothing; a stale export cannot overwrite fresher stock; and the import never creates stock moves, deliveries or journal entries.
Buyer identity on OMS/FBN orders

Noon does not publish buyer name, phone or address through the OMS/FBN order export or any other partner endpoint — this is a platform limitation, not something this connector can work around. Every OMS/FBN order mirror links to one explicit, clearly labelled privacy-protected marketplace buyer partner record instead of inventing or guessing a name. Real, per-order buyer detail is available only for orders placed through the FBPI program, fetched from noon's /fbpi/v1/fbpi-order/{order_nr}/customer-details/get endpoint — if that lookup fails or the order did not go through FBPI, the order keeps the shared privacy-protected buyer and the sync log records the reason at warning level (3.1.12) instead of staying silent.

3.1.0 also rebuilt the OWL dashboard: money now follows the Sales order's live currency (AED on the connected UAE project) instead of a hard-coded dollar sign, the headline KPI is labelled Gross Order Value to distinguish it from noon's post-fee net transaction amount, country cards and Top Products now read the same verified linked Sales orders and respect the selected date range, and the dashboard form was rebuilt on Odoo's stock accessible form vocabulary (WCAG 2.2 AA, keyboard-reachable KPI cards, dark-mode-aware charts). 3.1.7 added the multi-company record rules for the noon.order, noon.product and noon.customer shadow models (previously readable across companies on a multi-company database).

Connect to noon or Namshi

Create a connection record on the noon.configuration model — one per country and/or marketplace. The connection fields in the 3.x builds are:

FieldTechnical nameTypeNotes
Configuration NamenameCharrequired
Seller IDseller_idCharrequired
CountrycountrySelectionae / sa / eg — drives currency, warehouse and tax preflight routing
Companycompany_idMany2onerequired
MarketplacemarketplaceSelectionnoon or namshi — both route through the unified Partner API gateway
Authentication Modeauth_modeSelectionservice_account (primary) or oauth
Service-Account Credentialcredential_jsonTextpaste the downloaded service-account .json; key_id, project_code and the private key are parsed out on save
OAuth Access Tokenoauth_access_tokenCharOAuth mode only — sent as a Bearer header
User Agentuser_agentCharmandatory on every request; a default is provided
Sandbox ModesandboxBooleanroutes to the sandbox gateway

In service-account mode the client signs an RS256 JWT with your downloaded private key, logs in at /identity/public/v1/api/login and holds the returned session cookie; it re-authenticates once automatically on a 401 and honours Retry-After on 429 responses. The Test Connection wizard calls the authenticated whoami route and reports the real outcome.

The module contacts the marketplace-scoped gateways: noon-api-gateway.noon.partners (sandbox: noon-sandbox-api-gateway.noon.partners) and namshi-api-gateway.noon.partners for Namshi. Your firewall must allow outbound HTTPS to them.

The same record carries per-scope sync toggles (sync_products, sync_orders, sync_customers, sync_inventory, and their auto_sync_* counterparts). Leave anything you are not ready for switched off, and turn them on one at a time.

KSA and Egypt tax preflights

  • KSA (ZATCA Phase 2): the module refuses to process a KSA order until the customer's partner record carries a VAT registration number and CR number — both fields are added on the partner form by this module because Odoo's Saudi localization does not carry them. The refusal names the missing fields.
  • Egypt (ETA): Egypt orders require the customer's 14-digit ETA tax id; an invalid or missing id is refused before the operation runs.
  • Orders for other countries are untouched by these preflights.

Webhook and API endpoints your server exposes

EndpointAuthPurpose
/noon/webhookpublicInbound Event Notifications from noon. Verified by IP allowlist (noon's documented event source IPs, honouring the left-most public X-Forwarded-For), not by an HMAC signature; duplicate deliveries are deduplicated by message_id
/noon/api/statuslogged-in userconnection/sync status for the dashboard
/noon/api/synclogged-in usertriggers a sync from the dashboard
/noon/dashboard/datalogged-in userdashboard KPI data

Register your https://<your-odoo-host>/noon/webhook URL as an HTTPS event destination from Noon → Configuration → Webhooks — the module creates and updates the destination through the Event Notifications management API. Scheduled polling crons remain active as the fallback, so no order is missed if events do not arrive.

Honest capability boundaries

The following are deliberately not performed by this release, and the module says so at the point of use instead of failing silently: catalog product create/update push (access-gated by noon behind Tech-Team approval), settlement synchronization and automated journal-entry posting (the Partner API publishes no settlement endpoints — the noon.settlement ledger is a manually-fillable draft with a journal-entry link; this is separate from the item-level finance-report pricing described above, which prices Sales-order lines, not settlements), price synchronization (planned next wave), and coupon/customer bulk export (no verified endpoint).

This page documents the Odoo 19.0 build

The detail above was read from the 19.0.3.1.14 build. The Odoo apps it depends on, the scheduled actions and the menu layout can differ slightly between the 17.0, 18.0 and 19.0 builds, so check the values in your own database after installing rather than assuming this page matches your version exactly.

Troubleshooting

Licensing

Symptom / error codeCause and fix
VERSION_MISMATCHThe licence is for a different Odoo major version than the database you activated on. Licences are not transferable across Odoo versions.
MODULE_MISMATCHThe licence belongs to a different ECOSIRE module. Check you selected Noon Store Management (noon_store_management) in the activation dropdown.
NOT_ACTIVATED_ON_DOMAINThe database's web.base.url domain is not among the licence's activated domains. Activate on this domain, or deactivate the old one first.
LICENSE_EXPIRED / LICENSE_INACTIVEThe licence is past its expiry or has been suspended. Check the licence in your ECOSIRE portal.
LICENSE_NOT_FOUNDThe key does not exist. Keys are upper-cased before sending, so case is not the problem — re-copy it from your portal.
Activation limit reachedEvery slot on the licence is bound to a domain. Deactivate one first.
Too many failed activation attemptsTen failures in one hour. Wait up to 60 minutes.
Could not determine your Odoo instance domainweb.base.url is empty. Set it, then activate.
The requests library is requiredrequests is missing from Odoo's Python environment. Install it into the interpreter that runs Odoo.
Odoo refuses to install the moduleecosire_license_client is not in your addons path. See step 3.

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).
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.
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.

Version history

Odoo versionVersion you download today
17.017.0.3.1.0
18.018.0.3.1.0
19.019.0.3.1.14

ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.3.1.12 is the Odoo 19 build of module version 3.1.12. Your installed version is shown in Apps and in Settings → ECOSIRE.COM → License Status. The 3.0.0 release migrated the connector to the unified Partner API (re-authentication required after upgrading from 2.x); 3.0.7 added fleet-wide savepoint containment to every sync loop; 3.0.8 was a listing-truth pass with no functional change; 3.1.0 rebuilt the OWL dashboard for accessibility (WCAG 2.2 AA) and dark-mode support on all three Odoo versions.

Odoo 18.0 and 17.0 are currently one minor behind Odoo 19.0

18.0 and 17.0 are at 3.1.0 — the OWL dashboard rebuild only. The Noon OMS/FBN order sync and item-level finance pricing described under "What's new in 3.1" above (3.1.13.1.14) currently ship on the 19.0 build only and have not yet been backported to 18.0/17.0. Order import on 18.0/17.0 is FBPI-only until that backport lands — check Apps in your own database for the exact patch you are running.

Support