SHEIN Store Management
This is the installation and configuration guide for SHEIN Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the shein_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.
| Technical name | shein_store_management |
| Odoo versions | 17.0, 18.0, 19.0 (Community or Enterprise) |
| Current shipped version | 17.0 → 17.0.2.0.0, 18.0 → 18.0.2.0.1, 19.0 → 19.0.2.0.2 |
| Price | $499 USD — one-time, per Odoo version |
| Odoo module licence | LGPL-3 |
| Category | Connector |
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
| 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, knowledge — Odoo installs any that are missing |
| ECOSIRE dependency | ecosire_license_client — a separate free download, not bundled in this ZIP. See step 3 |
| Python packages | requests |
| Platform account | A SHEIN account with API access |
| Licence | An 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
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 shein_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/shein_store_management/__manifest__.py # sanity check
The module must end up as a single top-level shein_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
shein_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/
The licence client is distributed separately from the connector archives. If you cannot see it in your downloads, email info@ecosire.com 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
- Go to Apps and click Update Apps List (developer mode must be on).
- Search for SHEIN Store Management and click Install.
- Odoo pulls in
ecosire_license_clientand the Odoo apps listed above automatically.
When the install finishes, a SHEIN menu appears in the main Odoo app switcher.
Activate your licence
How to obtain a licence key
The steps below activate a key you already hold. This is how you get one in the first place.
- Create an ECOSIRE account at ecosire.com, using the email address you want the licence issued to. Your keys and your downloads both live in that account's dashboard.
- Buy the module — either directly on ecosire.com, or from the Odoo App Store.
- Bought on ecosire.com? The key is issued to your dashboard automatically once the order completes. Nothing else to do.
- Bought on the Odoo App Store? Send us proof of purchase: email
info@ecosire.comfrom the same address as your ecosire.com account, with the Odoo sales-order slip or order reference (the purchase receipt Odoo emails you at checkout). The App Store does not tell ECOSIRE who bought what, so this is how we match your purchase to your account. - We issue the key to your dashboard, next to the ZIP for your Odoo version, in the form
ECO-XXXX-XXXX-XXXX.
The key is issued against the Odoo major version you bought — see the warning at the top of this page. Tell us which version you run when you send proof of purchase, so we issue the right one.
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:
- Turn on developer mode.
- Settings → Technical → System Parameters, find
web.base.url. - Set it to the real HTTPS URL your users browse to, e.g.
https://erp.example.com.
Activate
- Go to Settings → ECOSIRE.COM → Activate License.
- Paste your licence key.
- Choose SHEIN Store Management in the module dropdown (it lists the installed ECOSIRE modules).
- 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": "shein_store_management",
"domain": "erp.example.com",
"hw_fingerprint": "<sha256 of this installation's hardware/db identity>",
"odoo_version": "19.0"
}
| Endpoint | Used for |
|---|---|
POST /api/licenses/activate | First-time activation — binds the licence to this domain |
POST /api/licenses/validate | Ongoing verification |
POST /api/licenses/issue-token | Fetches the signed offline token used for the grace period |
POST /api/licenses/deactivate-self | Releases 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
Connect to SHEIN
Create a connection record on the shein.configuration model. The fields the module defines for the connection are:
| Field | Technical name | Type | Required |
|---|---|---|---|
| Configuration Name | name | Char | Yes |
| App ID | app_id | Char | Yes |
| App Secret | app_secret | Char | Yes |
| Caller ID | caller_id | Char | Yes |
| Company | company_id | Many2one | Yes |
| Access Token | access_token | Char | No |
| Shein URL | shein_url | Char | No |
| Marketplace | marketplace | Char | No |
| Primary Region | shein_region | Selection | No |
| Webhook Secret | webhook_secret | Char | No |
| Webhook URL | webhook_url | 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 11 behaviour checkboxes — sync_products, sync_orders, sync_customers, sync_inventory, auto_sync_products, auto_sync_orders, auto_sync_customers, enable_us_market, enable_eu_market, enable_mena_market, enable_latam_market. 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: openapi-portal.sheincorp.com, open.sheincorp.com, openplatform.sheincorp.com, openapi-portal-eu.sheincorp.com, openapi-portal-latam.sheincorp.com, openapi-portal-mena.sheincorp.com. Your firewall must allow outbound HTTPS to them.
Public endpoints: the webhook receivers
The module registers two publicly reachable HTTP routes. They are the only endpoints served without an Odoo login, and they do not do the same thing — use the second one.
| Endpoint | Method | Auth | Use it? |
|---|---|---|---|
/shein/webhook/<config_id> | POST | public (no Odoo session) | Yes — the HMAC-validated receiver |
/shein/webhook | POST | public (no Odoo session) | No — legacy receiver, rejects everything |
The receiver to register
Register the /shein/webhook/<config_id> form in the SHEIN Seller Hub portal. The trailing segment is the database id of the shein.configuration record, so each connection has its own URL. You do not have to build it by hand — the configuration record carries a read-only Webhook URL field (webhook_url) that composes it for you from web.base.url, e.g. https://erp.example.com/shein/webhook/3. Copy it from there; that guarantees it matches the record you are configuring.
Set the Webhook Secret (webhook_secret) on the same configuration record before you register the URL:
Signature validation only runs when webhook_secret is set. If you leave it blank, the endpoint accepts and queues unsigned payloads from anyone who can reach your instance. Always set a secret, and use the same value in the SHEIN portal.
With a secret configured, the receiver validates the inbound HMAC-SHA256 signature taken from the X-Shein-Signature header (it also accepts X-Signature) against the raw request body. What it answers:
| Response | Meaning |
|---|---|
200 ok | Signature accepted; the event is queued |
401 invalid signature | The HMAC did not match your configured secret |
404 unknown configuration | No shein.configuration with that id — check the URL's trailing number |
400 invalid json | The body was not parseable JSON |
An accepted delivery is not processed inside the request. It is written to the shein.inbound.event queue and acknowledged immediately (the ACK budget is 10 seconds, so SHEIN never times out waiting for Odoo to do the work). The scheduled action SHEIN: Dispatch Inbound Webhooks then drains that queue every minute and runs the handlers. If events pile up in the queue, check that this scheduled action is still active before suspecting the portal.
The legacy route, which fails closed
The unnumbered /shein/webhook route is the older receiver and it rejects every delivery on purpose. No inbound delivery-signature scheme is pinned for SHEIN on that path in ECOSIRE's platform contract, so rather than trust an unsigned payload it fails closed: HTTP 403 with {"status": "rejected", "message": "signature verification failed"}, and nothing is processed. Do not register this URL in the Seller Hub.
The module's remaining routes — /shein/api/status, /shein/api/sync and /shein/dashboard/data — are internal JSON-RPC endpoints used by the module's own screens. They require a logged-in Odoo user and are not part of your external setup.
Scheduled actions
The module installs 8 scheduled actions (Settings → Technical → Scheduled Actions):
| Scheduled action | Runs every | Enabled on install |
|---|---|---|
| shein: Sync Products | 1 hour | Yes |
| shein: Sync Orders | 30 minutes | Yes |
| shein: Sync Customers | 6 hours | Yes |
| shein: Sync Inventory | 15 minutes | Yes |
| shein: Test Connection | 1 day | Yes |
| shein: Cleanup Old Logs | 1 day | Yes |
| SHEIN: Daily Digest | 1 day | Yes |
| SHEIN: Dispatch Inbound Webhooks | 1 minute | 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:
- SHEIN → Dashboard
- SHEIN → SHEIN Orders
- SHEIN → Orders
- SHEIN → Products
- SHEIN → SHEIN Products
- SHEIN → Customers
- SHEIN → SHEIN Buyers
- SHEIN → After-Sales — Returns, Refunds, Risk Flags
- SHEIN → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
- SHEIN → Finance — Settlements, Daily Analytics, Daily Digest
- SHEIN → Configuration — Settings, Onboarding Wizard, Master Data, Automation
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
Licensing
| Symptom / error code | Cause and fix |
|---|---|
VERSION_MISMATCH | The licence is for a different Odoo major version than the database you activated on. Licences are not transferable across Odoo versions. |
MODULE_MISMATCH | The licence belongs to a different ECOSIRE module. Check you selected SHEIN Store Management (shein_store_management) in the activation dropdown. |
NOT_ACTIVATED_ON_DOMAIN | The 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_INACTIVE | The licence is past its expiry or has been suspended. Check the licence in your ECOSIRE portal. |
LICENSE_NOT_FOUND | The key does not exist. Keys are upper-cased before sending, so case is not the problem — re-copy it from your portal. |
| Activation limit reached | Every slot on the licence is bound to a domain. Deactivate one first. |
| Too many failed activation attempts | Ten failures in one hour. Wait up to 60 minutes. |
| Could not determine your Odoo instance domain | web.base.url is empty. Set it, then activate. |
The requests library is required | requests is missing from Odoo's Python environment. Install it into the interpreter that runs Odoo. |
| Odoo refuses to install the module | ecosire_license_client is not in your addons path. See step 3. |
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. |
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.0.0 |
| 18.0 | 18.0.2.0.1 |
| 19.0 | 19.0.2.0.2 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.0.2 is the Odoo 19 build of module version 2.0.2. Your installed version is shown in Apps and in Settings → ECOSIRE.COM → License Status.