Skip to main content

Jane Store Management

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

Odoo versions17.0, 18.0, 19.0 (Community and Enterprise)
Current shipped version19.0 → 19.0.1.1.1, 18.0 → 18.0.1.1.1, 17.0 → 17.0.1.1.1
Price$349 USD (one-time, per Odoo major version)
LicenceOPL-1 — no key is entered in Odoo
Module namejane_store_management
Read this before you install

Jane API access is partner-gated. The module talks to the Jane partner API, and it can only work if your organisation holds credentials issued under a Jane partnership agreement. If you do not yet have API credentials, nothing will sync — install it after your partnership is in place, not before.

There are two unrelated platforms called "Jane". This module integrates the Jane partner API (the platform whose API answers at api.iheartjane.com, which is where the module's API Base URL points by default). It does not integrate jane.com, the boutique flash-sale marketplace — that platform publishes no public seller API at all, so no module of ours can sync it. jane.com sellers fulfil through ShipStation; if that is your setup, you want a ShipStation integration rather than this module. See Which "Jane" is this? below.

Requirements​

  • Odoo 17.0, 18.0 or 19.0 (Community or Enterprise)
  • The Python requests package installed into the interpreter that runs Odoo
  • Jane partner API credentials: a Store ID, an Access Token / API Key, and — if you intend to receive webhooks — the Shared Secret your Jane partnership issued for signature verification
  • Odoo apps this module depends on: base, sale_management, stock, account, delivery, mail, web, portal, product, contacts, digest. Odoo installs these automatically; they only matter if one of them is missing from your addons path.

Installation​

  1. Download the ZIP for Odoo 19 from your ECOSIRE dashboard.
  2. Extract it into your Odoo addons path (the directory must contain a jane_store_management folder holding __manifest__.py).
  3. Restart the Odoo service.
  4. Go to Apps → Update Apps List, search for Jane Store Management, and install it. No ECOSIRE dependency and no activation key are needed.

If the module does not appear, confirm the addons path you extracted into is listed in your odoo.conf addons_path, then restart Odoo and update the apps list again.

Configuration​

Everything starts at Jane → Configuration → Instances.

1. Create the connection​

FieldWhat to enter
Instance NameA label you will recognise, e.g. Jane — Main Store
Store IDYour Jane store/dispensary identifier. This is also the {id} used in the documented /v1/dispensary/{id}/… routes
API Key / Access TokenThe token your Jane partnership issued. It is sent as Authorization: Bearer <token>
Shared SecretUsed to verify the HMAC signature on inbound webhooks. Only needed if you receive webhooks
API Base URLDefaults to https://api.iheartjane.com. Change it only if your partnership gave you a different host
CompanyThe Odoo company this connection belongs to

Credentials are only visible to Settings administrators (base.group_system) and are stored as password fields.

Press Connect to Jane (shown until the instance is connected) or Test Connection. Both check your API Key and Store ID against Jane, and the result is recorded on the record's State: a successful check sets it to Connected; a failed one sets it to Error and tells you why, so the failure is visible on the form after the dialog is dismissed rather than only while it is on screen.

2. Map your locations​

Jane → Configuration → Locations maps a Jane location to the Odoo warehouses it should use.

These are operator-entered records — the module does not discover locations from the API. Copy the location/dispensary ID from your Jane dashboard into Jane Location ID, give it a display name, and choose the Import Stock Warehouse and (where relevant) the warehouse Odoo should export stock from. Mark one location Primary if it should be the default when no location is specified.

3. Choose your options​

On the instance record you can also set a default warehouse, a discount product and a shipping product for imported lines and the payout journal. Imported orders arrive as quotations; you confirm and invoice them in Sales as usual (the module does not confirm or invoice them for you).

Running a sync​

Jane → Operations → Run Operations opens the operations wizard. It offers exactly the operations that are backed by a documented route:

OperationRoute it callsDirection
Import Products (dispensary menu)GET /v1/dispensary/{id}/menuJane → Odoo
Import OrdersGET /v1/ordersJane → Odoo
Export Stock LevelsPUT /v1/dispensary/{id}/inventoryOdoo → Jane

Order imports accept a date range; the range is passed to the API as created_after / created_before. Selecting an operation shows a short description of what it will do before you run it.

Imports are idempotent — re-running one updates the existing records rather than duplicating them — and every record is processed inside its own savepoint, so one bad record in a batch is counted and skipped instead of losing the whole run. The wizard reports what actually happened: processed, created, updated, skipped and failed counts.

A manual run that had failures is shown as a warning, and it does not move the instance's Last sync time forward: Last sync always means the last run that succeeded.

Imported orders​

Each imported order becomes an Odoo sale order with a Jane tab on its form showing the Jane order ID, the instance it came from and its payment and fulfilment status. You can search sale orders by Jane order ID from Sales. Tips are imported, including a tip Jane sends as total_tip_received when the order has no separate tip payment block.

An order is imported in its own currency. If that currency is not active in your Odoo database, or has no exchange rate, the order is not imported and is reported as failed — it is never stored as if it were in your company currency. Activate the currency (and its rate) and re-run the import.

Stock import is a deliberate no-op​

Jane → Operations inventory sync exports Odoo stock levels to Jane through the documented PUT route. The opposite direction — reading stock levels from Jane into Odoo — has no documented route, so the module does not invent one: the import side logs that it has nothing to call and stops. Stock changes reach Odoo through the webhook below.

Webhooks​

The module exposes four inbound endpoints for Jane to call:

PathPurpose
/jane/webhook/productProduct created / updated / deleted
/jane/webhook/orderOrder created / updated / fulfilled
/jane/webhook/customerCustomer created / updated
/jane/webhook/refundRefund created

Each request must carry an X-Jane-Hmac-SHA256 header containing the base64-encoded HMAC-SHA256 of the raw request body, computed with the Shared Secret on the instance, and an X-Jane-Shop-Domain header identifying the store so the module can resolve which instance the event belongs to. A request that fails either check is rejected and logged rather than processed.

Register these URLs with your Jane partnership. Configuration → Webhooks holds the webhook records and their delivery/health state; Operations → Logs records what arrived.

Scheduled actions​

Eight scheduled actions ship with the module. They are visible at Configuration → Scheduled Actions and all of them no-op cleanly when no connected instance exists, so an unconfigured install does not produce a stream of errors:

Scheduled actionWhat it does
Jane: Sync InventoryPushes Odoo stock levels to each mapped location
Jane: Process Queue JobsDrains the module's job queue
Jane: Auto Risk DetectionRuns the order risk scoring rules
Jane: Generate AnalyticsBuilds the daily, weekly and monthly analytics records
Jane: Webhook Health CheckFlags webhooks that have stopped delivering
Jane: Process WorkflowsApplies the configured automation rules
Jane: Daily Summary ReportSends the daily digest to Jane managers
Jane: Cleanup Old LogsTrims the log table

The dashboard​

Jane → Dashboard shows order, product, customer and queue counts, error counts, average order value and a sales chart, filtered by period (today / week / month / quarter / year and a custom range) and by instance. Amounts are converted into the company currency at each order's date before they are added up, so totals are never mixed across currencies. Every figure is computed from records in your own database — the dashboard does not call the API, and it respects the company and instance you select. On a fresh install with no data yet, the tiles read zero rather than showing a placeholder.

Which "Jane" is this?​

This deserves to be answered plainly, because the two platforms share a name and only one of them has an API.

The Jane partner API (what this module integrates). A partner-gated REST API reached at api.iheartjane.com. Access requires a partnership agreement; there is no self-service signup. If you have credentials from that partnership, this module is for you.

jane.com, the boutique marketplace (what this module does not integrate). jane.com's seller portal is dashboard-only — it publishes no public seller API, no OAuth and no webhooks for third parties. Sellers there list deals in the portal and typically ship through ShipStation, which is the integration substrate that platform actually offers. If you sell on jane.com, a ShipStation integration is the correct answer and this module will not help you.

If you are not sure which one you have: check whether you hold API credentials and what host they are issued for. If you have no API credentials, you have no API to integrate, and you should contact us before installing.

Honest capability boundaries​

We would rather tell you what a module does not do than have you discover it after you have configured it.

  • Access is gated, not licensed. Nothing here bypasses Jane's partner requirement. Without valid credentials every sync fails at the API boundary.
  • Only documented routes are called. The module calls the three routes in the operations table above plus the health probe. Where the platform's reference documents no route for a capability, the module does not invent one — it says so, in the code and on this page, and stops. A fabricated endpoint installs cleanly, passes its own tests and then does nothing against the real API, which is worse than an honest gap.
  • No response schemas are asserted. The module reads response fields defensively: it tries the key names the platform is known to use and skips a record it cannot map, counting it as skipped. It does not claim a schema the reference does not publish.
  • Stock import from Jane is not available, as described above — there is no read route for it.
  • Locations are entered by you, not discovered.
  • Loyalty, reservations, age verification, METRC compliance tags, reviews and sales reports are not implemented. The platform reference records these as partner-gated operations with no published request or response shapes; implementing them would mean guessing, so they are documented here as not built rather than half-built.

Troubleshooting​

Test Connection fails​

Read the state and the message on the instance record. Check, in this order:

  1. Store ID and API Key are both filled in. The test refuses to run without both, because a Bearer token with no store cannot address a store-scoped route.
  2. The token is current. Partner tokens expire; a test that worked last month can fail today for no other reason.
  3. The API Base URL is right. It defaults to https://api.iheartjane.com. A partnership that issued a different host must have it set here.
  4. Your server can reach the host. curl -sS -o /dev/null -w '%{http_code}\n' https://api.iheartjane.com/health from the Odoo host; a connection error here is a network or firewall issue, not a module one.

Orders or products import nothing​

An import that returns zero records almost always means the date range or the store ID, not the module. Re-run the order import with a wider range. For products, confirm the Store ID matches the location whose menu you expect — the menu route is store-scoped, so the wrong ID returns an empty menu rather than an error.

An order is reported as failed because of its currency​

The order's currency is not active in Odoo, or has no exchange rate for the order date. Activate the currency in Odoo's currency settings, add a rate, and re-run the order import.

Product images are not downloaded​

Images are fetched only from web addresses (http/https). A media reference that is not a web address is reported in the Odoo server log rather than fetched.

Webhooks arrive but nothing is processed​

The two headers are the usual cause: X-Jane-Shop-Domain must match the instance's Shop URL, and X-Jane-Hmac-SHA256 must be computed over the raw body with the same Shared Secret stored on the instance. Operations → Logs records every rejected delivery with the reason.

The dashboard is empty​

The dashboard reads your own records. With no imported orders there is nothing to chart, and this is the expected state on a fresh install. It is not a sign that the connection failed — check the instance state instead.

Version history​

This guide describes the current build on every series: 19.0, 18.0 and 17.0 now ship the same code.

  • 19.0.1.1.1 / 18.0.1.1.1 / 17.0.1.1.1 — Order and menu imports work: every record is counted as created, updated, skipped or failed instead of failing with an internal error. Connect to Jane now checks your credentials against Jane and sets the instance to Connected or Error. Stock export pushes stock instead of failing on every location. Tips sent as total_tip_received are kept. Orders in a currency that is not active or has no rate are refused instead of being stored 1:1, and dashboard and analytics totals are converted into the company currency. Imported sale orders carry their Jane identifiers on a Jane tab and are searchable from Sales. A manual run with failures is shown as a warning and no longer moves Last sync forward. Product images are stored correctly. The 18.0 and 17.0 builds are regenerated from the 19.0 code, so they also include every 1.1.0 fix below.
  • 19.0.1.1.0 / 18.0.1.1.0 / 17.0.1.1.0 — Connection testing records a failed test as Error on the instance and tells you why; previously the record kept reporting its old state. The operations wizard offers only the three documented operations and reports real processed/created/updated/skipped/failed counts. Location records are editable so the Locations screen can be filled in. The stock sync exports stock. Store listing and documentation rewritten to describe this module.
  • 19.0.1.0.13 / 18.0.1.0.13 / 17.0.1.0.13 — Every per-record import and sync step runs inside its own savepoint, so one record that fails is rolled back on its own and can no longer abort the rest of the run.

Support​