Skip to main content

Walmart Store Management

This guide describes walmart_store_management as it exists in the current ECOSIRE source and deployed sanitized demo.

Technical namewalmart_store_management
Odoo versions17.0, 18.0, 19.0, 20.0 (Community or Enterprise)
Current source version17.0 → 17.0.2.5.4, 18.0 → 18.0.2.5.4, 19.0 → 19.0.2.5.4, 20.0 → 20.0.2.5.4
Odoo code licenceOPL-1
CategoryConnector
Runtime licence dependencyNone

Requirements​

RequirementDetail
Odoo17.0, 18.0, or 19.0, Community or Enterprise. Odoo Online cannot install third-party modules.
Odoo appsbase, sale_management, stock, account, delivery, mail, web, product, contacts
Python packagerequests
Platform accountWalmart Marketplace seller/partner account with API access for the selected market

The connector is standalone. It has no ECOSIRE licence-client dependency and no runtime key check.

Install requests in the same Python environment that runs Odoo:

sudo -u odoo pip install requests

Installation​

  1. Download the ZIP matching your Odoo major version.
  2. Extract it into an Odoo addons path.
unzip walmart_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/walmart_store_management/__manifest__.py

The archive contains one top-level walmart_store_management/ directory. The __manifest__.py file must sit directly inside it.

  1. Restart Odoo.
sudo systemctl restart odoo
  1. In Apps, update the Apps list, search for Walmart Store Management, and install it. A Walmart app menu then appears.

Authentication and connection​

Walmart Marketplace uses OAuth 2.0 client credentials:

  1. The connector sends Basic client credentials to POST /v3/token.
  2. Walmart returns a short-lived access token.
  3. Marketplace calls carry that token in WM_SEC.ACCESS_TOKEN, alongside the required Walmart service, correlation, market, and version headers.

Do not convert the resource-call header into Authorization: Bearer. The current official Walmart guidance requires WM_SEC.ACCESS_TOKEN, and the credentialed contract record confirms that plain Bearer authentication returned 401.

See Walmart's Token API guide and authentication troubleshooting.

Create a configuration​

Open Walmart → Configuration → Settings and create a record.

LabelTechnical nameRequiredValues
Client IDclient_idYesWalmart-issued value
Client Secretclient_secretYesPassword-protected field
MarketmarketYesus, ca, mx, cl
Sandbox ModesandboxNoUS sandbox only
Fulfillment Typefulfillment_typeNosf, wfs, both

Use Test Connection after saving. The record reports connected only after Walmart accepts the real token and a one-row Global Orders probe. Leave automatic synchronization disabled until the connection and mappings are confirmed.

Executed and source-proven capability boundary​

AreaEvidence levelWhat can be claimed
OAuth token and headersCredentialed contract evidenceToken grant and WM_SEC.ACCESS_TOKEN resource authentication
ItemsCredentialed contract evidenceItems-family request completed successfully
Item taxonomy and Item SpecCredentialed request/response evidenceValid product-type discovery and current schema response handling
MP_ITEM feedsCredentialed request plus per-item result evidenceSubmit a feed, poll status, and read item-level success/error outcomes
Orders and buyersProvider-shaped automated testsPaginated order parsing and masked buyer derivation from documented order payload fields
Dashboard and access controlFresh-database automated tests plus public desktop/mobile smokeCompany-scoped KPIs, currency-aware values, route authorization, multi-company isolation, and read-only navigation across six walkthrough pages
Documented read familiesFresh-database automated tests (the pull action and its stored datasets)One action reads every documented read family and stores each answer verbatim against its route, with a rejected family costing only its own row

The current contract does not yet contain recorded live calls for 11 endpoint families: claims, fulfillment, insights, inventories, inventory, price, promo, report, reports, returns, and webhooks. The module may contain local records or guarded methods for some of these areas; do not treat their presence as provider-side proof.

Using the public demo​

The demo at walmart.demo.ecosire.com is a sanitized local walkthrough. Its configuration is deliberately not connected to a seller account. The read-only account can inspect the dashboard, products, orders, masked buyers, feed outcomes, and logs. Provider-facing schedules are disabled; imports, connection testing, and configuration remain manager-only.

Do not use Test Connection, Sync Now, export, feed-submission, fulfillment, return, webhook, or report actions in the public demo. A real integration walkthrough that uses a seller account requires credentials supplied through ECOSIRE's existing secure access channel and the seller's authorization.

Webhook subscriptions​

Webhooks are optional: the scheduled syncs keep data current without them. To let Walmart push events instead of waiting for the next scheduled run:

  1. Open Walmart → Operations → Webhooks (Walmart managers) and create a record for the event type you want, for example Order created.
  2. Keep Delivery Authentication on HTTP Basic authentication (the default; Walmart uses it for order, offer, Buy Box, inventory and report events) and enter the Shared Secret as username:password. Use WM_SEC HMAC signature only for seller-performance events; Odoo refuses it for any other event type.
  3. Click Create Subscription in Walmart, then Send Test Notification. Pause in Walmart, Resume in Walmart and Delete Subscription in Walmart act on the same subscription.
  4. Every delivery is listed under Walmart → Operations → Webhook Deliveries with Walmart's payload, its eventId and the outcome. Pull Webhook Subscriptions on the configuration reads what is registered in Walmart.

Walmart publishes no verifiable scheme for its general-purpose HMAC authentication option, so that option is not offered.

Routes​

RouteAuthenticationPurpose
/walmart/webhookPublic HTTP, authenticated per deliveryAccepts a Walmart delivery only when an active subscription authenticates it (HTTP Basic, or the WM_SEC signature for seller-performance events); otherwise answers 403 and uses nothing. An authenticated but unreadable delivery answers 400. The public demo does not register provider subscriptions.
/walmart/api/statusLogged-in Walmart userReads the current company configuration status.
/walmart/api/syncLogged-in Walmart managerTriggers only enabled synchronization operations for the current company.
/walmart/dashboard/dataLogged-in Walmart userReturns company-scoped local dashboard data and currency metadata.

Scheduled actions​

The module ships scheduled actions for product, order, buyer, inventory, feed-status, price/inventory export, connection-test, stock-state, and log-cleanup workflows. Every provider-facing action is also gated by configuration fields. Review them under Settings → Technical → Scheduled Actions before connecting a production account; disable any workflow outside the scope you have validated.

The bulk catalog-publish action ships inactive and must remain inactive until product mappings, Item Spec fields, feed version, and a rollback plan have been checked.

Troubleshooting​

SymptomCheck
Install fails on requestsInstall the package in Odoo's Python environment, then restart Odoo.
Module folder is not foundConfirm walmart_store_management/__manifest__.py is directly under an addons path.
Test Connection failsConfirm market, environment, credentials, scopes, and that sandbox credentials are not being used against production.
Walmart returns 401Obtain a fresh token and confirm it is sent in WM_SEC.ACCESS_TOKEN; do not substitute a plain Bearer header.
A feed is marked processed but products did not publishOpen the feed details and inspect every item ingestion outcome. A processed feed can still contain only item-level errors.
Nothing runs automaticallyCheck both the configuration toggles and Odoo scheduled-action state.
Dashboard shows the wrong currencyConfirm the current Odoo company has the intended currency, then refresh assets and the dashboard. Version 19.0.2.4.1 and later use company-currency metadata.

Version history​

Odoo versionCurrent source version
17.017.0.2.5.4
18.018.0.2.5.4
19.019.0.2.5.4
20.020.0.2.5.4

What changed in 2.5.4​

2.5.4 makes Walmart webhooks work and hardens the connector against the failure cases real stores hit. (2.5.2 and 2.5.3 were never published; their changes ship in 2.5.4.)

Walmart webhooks work. Walmart's event notifications used to be refused every time, so nothing they reported reached Odoo. Each delivery is now checked before anything happens: HTTP Basic credentials for order, offer, Buy Box, inventory and report events, or Walmart's WM_SEC signature for seller-performance events, inside a bounded replay window. A checked delivery runs the sync for the event Walmart actually sent, is processed once even when Walmart sends it again (one successful delivery per eventId), and is kept on a delivery log with Walmart's own payload. A delivery that cannot be checked is still answered with HTTP 403 and nothing in it is used. Subscriptions are created, paused, resumed, tested and deleted from Odoo, the event list is Walmart's own (existing records are moved over on upgrade), and a Walmart manager who is not a system administrator can create them. See Webhook subscriptions.

Each Walmart account keeps its own customers. Customer sync matches a Walmart customer only against contacts bound to the syncing store (then older unbound contacts), so a second Walmart account can never rewrite the first one's contact.

Imported records are bound to the store that produced them. Products, orders and buyers imported from Walmart now carry the store configuration they came from, and a re-import resolves against that binding before it falls back to older unbound rows. A seller running two Walmart accounts that expose the same SKU or order id no longer has one account's import overwrite the other's record.

The financials are complete and honest. Walmart reports order money as typed charges; shipping, tax and platform-, seller- and co-funded discounts are now stored as distinct values — including when they are zero, because "not charged" and "not captured" are different facts — with the raw breakdown preserved so an unfamiliar charge type stays recoverable. A cross-currency order whose currency has no exchange-rate evidence is refused rather than restated at parity, and the dashboard totals are grouped by the order's own currency: a currency that cannot be converted is named instead of being added at parity.

Settlement reports can be ingested and reconciled. Settlement lines carry shipping, discount and reward buckets distinct from commission, fees, tax and refunds; a report's own rows are classified with their raw type preserved; refund rows create reconcilable refund records; and a settlement whose lines do not explain its reported total, or which carries no currency, refuses to reconcile rather than rounding the difference away.

A historic order can be corrected. Re-importing an existing order used to mark it done and move on, so a mapping fix or a corrected exchange rate could never reach an order imported months ago. An existing order is now reprocessed in place, and its lines are matched and updated rather than duplicated.

A manual import template that round-trips. The import wizard can download a CSV template and import the populated file. The template's columns and the importer's columns are one definition, so the downloaded file can never omit a column the importer requires.

The current day is included in the dashboard totals, the store counters now describe the catalogue rather than the number of syncs, a rejected token request no longer echoes the credential back, and a bare image reference is resolved through the documented item endpoint rather than being fetched as if it were a URL.

Newly visible and newly refused. The marketplace identity and the sync, finance and imagery evidence are visible on the product, order and contact forms; Walmart item ids, SKUs, barcodes and order identifiers are searchable; and each connector action binds its own list view. Affiliate attribution, the affiliate wire contract and creator-profile refresh are refused explicitly with their reason — Walmart's Marketplace Seller API documents no affiliate or creator endpoint, so an empty result would have been indistinguishable from "there is no attribution data".

The dashboard's shortcuts open the right screens. The Orders, Products and Customers tiles pointed at screens that did not exist, so clicking them did nothing; they now open the imported orders, products and customers, and the Queue tile opens the pending queue records it counts. The Order Status chart is drawn from the real order data, both charts say so when there is nothing to plot, and loading and error states are shown at the top of the page with a Retry button. The dashboard also follows Odoo's dark theme and keeps the store name inside the header on a phone.

What changed in 2.5.0 and 2.5.1​

2.5.0 made the whole documented Walmart surface reachable from Odoo. Seller performance (returns, item-not-received, on-time delivery, valid tracking, seller response, cancellations, ship-from-location, on-time shipment, carrier-method accuracy), listing quality, item health, WFS inbound shipments and labels, MCS fulfilment orders, claims and their documents, returns overrides, the report centre, assortment recommendations, GTIN exemptions, lag time, rule exceptions, shipping reference data and the webhook subscription lifecycle each have a real, documented call behind them. The same release added:

  • a Walmart Connect (advertising) client for campaigns, ad groups, ad items, keywords, the Sponsored-Brands profile and media. Walmart Connect is a separate, partner-gated API; until those credentials are in place the client refuses the call and says exactly what is missing rather than returning an empty list;
  • the Pull Documented Datasets action and its screen. One button reads every documented read family and stores each answer verbatim against the route it came from. Walmart publishes no field schema for those reads, so the screen shows the provider's own answer rather than a column whose meaning would have been guessed;
  • the documented feedType (PRICE_AND_PROMOTION) and envelope for the bulk price feed, with the feed type validated before the request so a rejected feed never consumes one of the seller's hourly item slots;
  • company-currency formatting on the dashboard — the route now sends the company's currency symbol, position and decimal places.

2.5.1 fixes the Pull Documented Datasets button. It names seven families and calls each one by name; the reference-data family was named but had never been written, so the run failed the instant it reached that entry — after three families had already been pulled and stored, which made the families after it look as though Walmart had returned nothing. The reference family now exists and reads the seller's lag time, the current rule exceptions and Walmart's shipping reference data (ship nodes, shipping utilities, taxonomy departments, shipping templates), each stored verbatim like the other datasets, and a family Walmart rejects still costs only its own row.

Support​