Skip to main content

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 nametargetplus_store_management
Odoo versions17.0, 18.0, 19.0 (Community or Enterprise)
Current shipped version17.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 licenceOPL-1
CategoryConnector
No licence key, no activation step

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​

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, portal, product, contacts, digest — Odoo installs any that are missing
Python packagesrequests
Platform accountA Target Plus seller account. Target Plus is invite-only: sellers are onboarded by Target and cannot self-register
API accessA Target+ Seller API key, issued from Seller Dashboard → Integrations
Public HTTPS addressOnly 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​

  1. Buy the module for your Odoo version on the Odoo Apps Store and download it from there.

  2. 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 check

    If the ls check fails, the module folder ended up one level too deep — move it up so __manifest__.py sits directly inside targetplus_store_management/.

  3. Restart Odoo: sudo systemctl restart odoo.

  4. 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:

LabelTechnical nameWhat to enter
Instance NamenameAny name, e.g. Target Plus — Production (required)
Targetplus Shop URLshop_urlYour store identifier (required). Entered with or without https://
API Keyapi_keyThe Target+ Seller API key (x-api-key) from Seller Dashboard → Integrations
Client Secretshared_secretShared secret used to verify incoming webhook signatures. Only needed for webhooks
API Versionapi_versionv4 (default). Target+ retired the v3 endpoints on 2026-07-31
Sandbox Modesandbox_modeTick 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.

URLMethodPurpose
/targetplus/webhook/productPOSTReceives product events (products/*)
/targetplus/webhook/orderPOSTReceives order events (orders/*)
/targetplus/webhook/customerPOSTReceives customer events
/targetplus/webhook/refundPOSTReceives refund and return events (refunds/*, returns/*)
/targetplus/installGETStarts the optional OAuth authorization (see below)
/targetplus/callbackGETCompletes the optional OAuth authorization (see below)

Receiving webhook events​

A webhook request is accepted only when it carries both:

  • an X-Targetplus-Shop-Domain header that matches an instance's Targetplus Shop URL; and
  • an X-Targetplus-Hmac-SHA256 header 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:

  1. Set the system parameter web.base.url to your public HTTPS address (Settings → Technical → System Parameters). Target+ only delivers to HTTPS URLs, and the module refuses to register a webhook without one.
  2. Open Targetplus → Configuration → Webhooks, create a record and pick the event (Webhook Action).
  3. 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.
  4. 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 actionRuns every
Targetplus: Sync Products30 minutes
Targetplus: Sync Orders15 minutes
Targetplus: Sync Customers60 minutes
Targetplus: Sync Inventory10 minutes
Targetplus: Process Queue Jobs5 minutes
Targetplus: Import Payout Reports6 hours
Targetplus: Import Refunds30 minutes
Targetplus: Auto Risk Detection30 minutes
Targetplus: Generate Analytics4 hours
Targetplus: Webhook Health Check60 minutes
Targetplus: Cleanup Old Logs24 hours
Targetplus: Process Workflows10 minutes
Targetplus: Daily Summary Report1 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:

  1. Test Connection until the instance reads connected (in Sandbox Mode first, if you have sandbox credentials).
  2. Map your locations and review the instance defaults so imported orders land on the right warehouse, pricelist and journal.
  3. Run a small import first from Operations → Run Operations and check the results before letting the scheduled actions take over.
  4. 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​

SymptomCause and fix
Test Connection failsRe-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 fineThe 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-wayRead 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 runweb.base.url is not an HTTPS address, or the chosen event (inventory, fulfillment) has no receiving endpoint.
Webhook events are logged as Invalid signatureThe 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 ErrorTarget+ no longer lists the subscription. Click Create Webhook again to re-register it.
A location mapping cannot be savedYou are on a build earlier than 19.0.2.2.0, where the Location ID was read-only. Upgrade the module.

Version history​

Odoo versionVersion you download today
17.017.0.2.2.0
18.018.0.2.2.0
19.019.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 Z import 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-key from 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.

Support​