Target Plus Store Management
Target Plus Store Management connects a Target Plus (Target+) seller account to Odoo through the Target+ Seller API v4. This page is the installation and configuration guide for the module. Everything below describes the targetplus_store_management module as it ships today.
| Technical name | targetplus_store_management |
| Odoo versions | 17.0, 18.0, 19.0 (Community or Enterprise) |
| Current shipped version | 17.0 → 17.0.2.2.0, 18.0 → 18.0.2.2.0, 19.0 → 19.0.2.2.0 |
| Price | $499 USD — one-time, per Odoo version |
| Odoo module licence | OPL-1 |
| Category | Connector |
The module installs and runs on its own. There is no separate licence module to download and nothing to activate after installing. Since 19.0.2.2.0 the former licence add-on requirement is removed completely, and existing installations keep working after the upgrade.
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, portal, product, contacts, digest — Odoo installs any that are missing |
| Python packages | requests |
| Platform account | A Target Plus seller account. Target Plus is invite-only: sellers are onboarded by Target and cannot self-register |
| API access | A Target+ Seller API key, issued from Seller Dashboard → Integrations |
| Public HTTPS address | Only if you use webhooks (19.0): Target+ delivers events to HTTPS URLs only |
Install the Python package into the same interpreter that runs Odoo:
sudo -u odoo pip install requests
Installation
-
Buy the module for your Odoo version on the Odoo Apps Store and download it from there.
-
Extract it into your addons path:
unzip targetplus_store_management-*.zip -d /opt/odoo/addons/ls /opt/odoo/addons/targetplus_store_management/__manifest__.py # sanity checkIf the
lscheck fails, the module folder ended up one level too deep — move it up so__manifest__.pysits directly insidetargetplus_store_management/. -
Restart Odoo:
sudo systemctl restart odoo. -
Go to Apps, click Update Apps List (developer mode must be on), search for Target Plus Store Management and click Install.
When the install finishes, a Targetplus menu appears in the main Odoo app switcher.
Configuration
Connect to Target Plus
Open Targetplus → Configuration → Instances and create a record (model targetplus.instance). The connection fields are:
| Label | Technical name | What to enter |
|---|---|---|
| Instance Name | name | Any name, e.g. Target Plus — Production (required) |
| Targetplus Shop URL | shop_url | Your store identifier (required). Entered with or without https:// |
| API Key | api_key | The Target+ Seller API key (x-api-key) from Seller Dashboard → Integrations |
| Client Secret | shared_secret | Shared secret used to verify incoming webhook signatures. Only needed for webhooks |
| API Version | api_version | v4 (default). Target+ retired the v3 endpoints on 2026-07-31 |
| Sandbox Mode | sandbox_mode | Tick before the first connection to talk to the Target+ sandbox |
The connector authenticates every call with the API key in the x-api-key header. It calls https://api.target.com/plus_seller_api/v4 in production and https://api-stage.target.com/plus_seller_api/v4 in Sandbox Mode. The API Password and Access Token fields are legacy fields: the Seller API does not use them, so leave them empty.
When the fields are filled in, click Test Connection. The record's status moves to connected only when Target+ answers successfully — do not run a first import until it does.
The same record carries the automation checkboxes Auto Confirm Orders, Auto Create Invoice and Auto Validate Invoice. They gate what the connector does automatically once it is connected. Leave anything you are not ready for switched off, and turn them on one at a time. The form also holds the defaults imported orders use: company, warehouse, pricelist, journal, salesperson, and the shipping and discount products.
Locations
Targetplus → Configuration → Locations maps Target+ ship-from locations to your Odoo warehouses. The Seller API does not list your locations, so you maintain this mapping from the location reference in the Target+ Seller Dashboard. On 19.0.2.2.0 all location fields are editable; earlier builds had the Target+ Location ID read-only, so a new mapping could not be saved from the form.
What the 19.0 connector covers
The 19.0 build addresses all 54 operations of the Target+ Seller API v4 contract, including:
- listings and listing variants, inventory and prices;
- orders, order line updates, shipments, and customer invoice download;
- returns and refunds, payouts;
- shipping templates (list, create, update) and approved carriers;
- feeds, the category tree, item attributes, UPC lookup, compliance requirements and the variation-theme schema;
- on-time-ship and returns-rate reports, the seller user roster, and promotions (list and submit items);
- webhook subscriptions (list, create, delete).
Calls are paced under the Target+ limit of 100 requests per minute per seller; throttled requests are retried after the platform's Retry-After delay.
Since 2.2.0 the 17.0, 18.0 and 19.0 builds carry the same feature set.
Webhooks and public endpoints
The module serves six public URLs on your Odoo address. Four receive webhook events; two belong to an optional OAuth handshake you do not need for the Seller API.
| URL | Method | Purpose |
|---|---|---|
/targetplus/webhook/product | POST | Receives product events (products/*) |
/targetplus/webhook/order | POST | Receives order events (orders/*) |
/targetplus/webhook/customer | POST | Receives customer events |
/targetplus/webhook/refund | POST | Receives refund and return events (refunds/*, returns/*) |
/targetplus/install | GET | Starts the optional OAuth authorization (see below) |
/targetplus/callback | GET | Completes the optional OAuth authorization (see below) |
Receiving webhook events
A webhook request is accepted only when it carries both:
- an
X-Targetplus-Shop-Domainheader that matches an instance's Targetplus Shop URL; and - an
X-Targetplus-Hmac-SHA256header holding the base64 HMAC-SHA256 of the request body, signed with that instance's Client Secret.
Anything else is refused and logged. An accepted event is not processed inside the request: it becomes a queue job, which the Process Queue Jobs scheduled action runs, and a line is written to Targetplus → Operations → Logs.
Registering webhooks (19.0)
On 19.0.2.2.0, webhook subscriptions are registered on Target+ itself:
- Set the system parameter
web.base.urlto your public HTTPS address (Settings → Technical → System Parameters). Target+ only delivers to HTTPS URLs, and the module refuses to register a webhook without one. - Open Targetplus → Configuration → Webhooks, create a record and pick the event (Webhook Action).
- Click Create Webhook. The module posts the subscription to Target+ with the matching delivery URL from the table above, and stores the delivery URL and the platform's subscription id on the record.
- Delete Webhook unsubscribes it on Target+. Test Webhook sends a signed sample payload to your own delivery URL.
Inventory and fulfillment events have no receiving endpoint in this module, so the module refuses to subscribe to them rather than point Target+ at a URL that does not exist. The hourly Webhook Health Check marks a webhook as Error when Target+ no longer lists its subscription.
On builds earlier than 2.2.0 for 17.0 and 18.0, Create Webhook only prepared the record locally. Every build also imports through the scheduled polling jobs, so webhooks are optional.
The OAuth endpoints
/targetplus/install and /targetplus/callback, and the Connect to Targetplus button on the instance form, implement an OAuth authorization-code handshake for stores on a *.mytargetplus.com domain. The Target+ Seller API does not use OAuth: it authenticates with the API key alone, so you do not need these endpoints or the button. Both URLs answer only for a store domain that matches a configured instance, verify the request's HMAC against the instance's Client Secret, and check a one-time state value before they store anything.
Scheduled actions
The module installs 13 scheduled actions (Settings → Technical → Scheduled Actions), all enabled on install:
| Scheduled action | Runs every |
|---|---|
| Targetplus: Sync Products | 30 minutes |
| Targetplus: Sync Orders | 15 minutes |
| Targetplus: Sync Customers | 60 minutes |
| Targetplus: Sync Inventory | 10 minutes |
| Targetplus: Process Queue Jobs | 5 minutes |
| Targetplus: Import Payout Reports | 6 hours |
| Targetplus: Import Refunds | 30 minutes |
| Targetplus: Auto Risk Detection | 30 minutes |
| Targetplus: Generate Analytics | 4 hours |
| Targetplus: Webhook Health Check | 60 minutes |
| Targetplus: Cleanup Old Logs | 24 hours |
| Targetplus: Process Workflows | 10 minutes |
| Targetplus: Daily Summary Report | 1 day |
Intervals above are the shipped defaults. Adjust them to your volume — but Target+, not Odoo, sets the API rate limit, and shortening a sync interval is the usual cause of throttling errors in the logs.
Using the module
The Targetplus menu is laid out as:
- Targetplus → Dashboard
- Targetplus → Orders
- Targetplus → Refunds
- Targetplus → Products
- Targetplus → Customers
- Targetplus → Payouts
- Targetplus → Analytics
- Targetplus → Operations — Run Operations, Queue Jobs, Logs
- Targetplus → Configuration — Instances, Locations, Payment Gateways, Scheduled Actions, Webhooks, Compliance
A normal first run is:
- Test Connection until the instance reads connected (in Sandbox Mode first, if you have sandbox credentials).
- Map your locations and review the instance defaults so imported orders land on the right warehouse, pricelist and journal.
- Run a small import first from Operations → Run Operations and check the results before letting the scheduled actions take over.
- Watch the Logs view during the first full sync. Every sync writes a log line; one failing record is rolled back on its own and logged, without stopping the rest of the run.
The Compliance view under Configuration tracks Target's item-compliance requirements (brand authorization, CA Prop 65 and the category-specific item data).
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| Test Connection fails | Re-check the API key. Most failures are a mistyped key, or sandbox credentials used while Sandbox Mode is off (or the reverse). |
| 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 Logs view for that run. Rate limiting and rejected field values are the two common causes; both are logged with the platform's own error text. |
| Create Webhook refuses to run | web.base.url is not an HTTPS address, or the chosen event (inventory, fulfillment) has no receiving endpoint. |
| Webhook events are logged as Invalid signature | The instance's Client Secret does not match the secret Target+ signs with, or the shop-domain header does not match the Targetplus Shop URL. |
| A webhook shows Error | Target+ no longer lists the subscription. Click Create Webhook again to re-register it. |
| A location mapping cannot be saved | You are on a build earlier than 19.0.2.2.0, where the Location ID was read-only. Upgrade the module. |
Version history
| Odoo version | Version you download today |
|---|---|
| 17.0 | 17.0.2.2.0 |
| 18.0 | 18.0.2.2.0 |
| 19.0 | 19.0.2.2.0 |
ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.2.0 is the Odoo 19 build of module version 2.2.0. Your installed version is shown in Apps.
17.0.2.2.0 · 18.0.2.2.0 · 19.0.2.2.0
The 17.0 and 18.0 builds now carry everything listed for 19.0.2.2.0 below. Fixed on all three:
- Sync All from the dashboard imports products, orders and customers again (it failed on every run before), and the last-sync time only moves after a run without errors.
- Sync logs mask API keys, secrets, bearer tokens, buyer e-mail addresses and phone numbers as
[REDACTED]. - The Target+ order number is stored and searchable; the order and delivery forms show a Target Plus tab with the order number, store, payment and fulfilment status, fulfilment id and tracking.
- Product import keeps the listing description, brand and category, files new products under the matching Odoo category, and imports listing images.
- The Operations wizard's order inputs (specific IDs, From/To dates, unshipped only, skip existing) are honoured.
- Masked buyer details are never used to match an existing contact; each buyer stays tied to one contact by the Target+ buyer id.
- Zero-cost shipping lines are kept on the order.
- A payout or order in a currency with no exchange rate is refused instead of being counted one-to-one; analytics convert each order from its own currency.
- Returns are imported page by page from Target+ and linked to their orders without duplicates.
- Orders whose timestamp ends in
Zimport on Odoo 17 (the date was cut to the year before). - Dashboard: errors show at the top, placeholders while loading, and a dark-mode stylesheet.
19.0.2.2.0
- Full Target+ Seller API v4 coverage: 54 operations, up from 34 (listing variants, order line updates, invoice download, shipping templates, carriers, feeds, reports, user roster, promotions, item attributes, UPC lookup, category tree, variation themes, webhook subscriptions).
- Webhook subscriptions are registered on Target+ (create, delete, hourly health check); the delivery URL and subscription id are stored on the record.
- Sandbox Mode checkbox on the instance.
- Location mappings can be created and edited from the form.
- The licence add-on requirement is removed; the module installs and runs standalone.
- Sync log Created / Updated timestamps come from Odoo again.
- Instance help texts describe the real authentication (
x-api-keyfrom Seller Dashboard → Integrations).
17.0.2.0.9 · 18.0.2.0.9 · 19.0.2.0.9
- Every per-record sync, import and action loop is isolated: one bad record is rolled back alone and logged, instead of aborting or silently undoing the whole run.
2.0.8 (all three versions)
- Uses the Target+ Seller API v4 client as the only API contract.
- Hardened credential fields and logging.
- Dashboard filters no longer change the stored instance while you read it.
- Analytics no longer show visitor or satisfaction figures when no real traffic or feedback source is connected.