Skip to main content

Walmart

📄️Create WFS Inbound Shipment

Create a WFS inbound shipment from SKU.io — send the chosen SKUs/quantities into Walmart Fulfillment Services from a **warehouse OR a supplier** (exactly one). SKU.io enriches each SKU with the GTIN/UPC + description Walmart requires, generates a unique inboundOrderId, builds Walmart's Create-Inbound-Shipment-Order payload (returnAddress from the chosen warehouse's or supplier's address + orderItems), POSTs it to Walmart (POST /v3/fulfillment/inbound-shipments), and persists the shipment(s) Walmart returns — Walmart may split one inbound order across fulfillment centers, so `data` is an array. Typically driven from the inbound builder or the WFS Replenishment grid's cart ('Send to WFS').

📄️Cancel Inbound Shipment

Cancel a WFS inbound shipment. This cancels the WHOLE inbound order on Walmart and marks every local shipment sharing that inbound order as CANCELLED (Walmart splits one inbound order across FCs, and cancel is order-level). Any materialized source document (Warehouse Transfer / Purchase Order) is unwound first, and source-stock reservations are released so the stock is sellable again. Walmart rejects the cancel once the shipment is receiving, closed, or already cancelled.

📄️Set Source

Set (or confirm) the definitive source of an inbound shipment — a warehouse OR a supplier (exactly one). Used to resolve an imported inbound, confirm an auto-matched one, or re-point an existing one. Unwinds any document already materialized against the old source (throws/blocks if it has already shipped), drops the prior source reservation, marks the link confirmed, and re-reserves against the new warehouse (a no-op when supplier-sourced or when there are no SKU intent lines).

📄️Void WFS Inbound Carrier Rate Quote

Void the carrier rate quote / booking for an inbound shipment. No request body. Accepts an optional `mode` query parameter (PARCEL or LTL, defaults to PARCEL) identifying the transport mode the quote was created under — Walmart requires it on the void call. Scoped to the integration instance (404 if the shipment belongs to another instance). An unknown mode returns a 422 validation error; a Walmart-side rejection returns a 422 carrying Walmart’s own reason. Requires a Bearer token.

📄️Preview Fulfillment Email

Render the operator's edited subject/body with the live tokens substituted, without sending anything — powers the compose dialog's preview pane. Tokens {{reference}} (the WFS shipment id), {{portal_link}} (a clickable anchor to the secure fulfilment portal), and {{instructions}} (the rendered prep instructions) are resolved server-side; the subject is treated as plain text, the body as HTML. Returns 422 if no fulfilment packet has been built for this shipment yet.

📄️Send Fulfillment Email

Send the operator-composed portal invite to the resolved 3PL/supplier recipient (a 3PL warehouse's address email, or the supplier's PO email), substituting the {{reference}}/{{portal_link}}/{{instructions}} tokens server-side, then (once the email is queued) flip the packet status to Sent (sets sent_at). The recipient is resolved server-side — it is not accepted from the request. Returns 422 if no packet has been built, or if no recipient email is configured for the source (add one to the 3PL warehouse address / supplier before emailing). The recipient check runs immediately (422 when none is configured); the send itself runs in the background because the label PDFs are fetched live from Walmart. The response returns the fulfilment packet as it stood when the send was queued, plus tracked_job_log_id for following the background job; fetch the packet again once the job completes to see the Sent status.

📄️Set Item Lag Times

Set the lag time of one or more Walmart SKUs. Each SKU is recorded as a pin (automation never changes it) and every pending change is sent at once as a manual lag-time feed, within Walmart's 6 feeds per day. Returns the push run; feedId is the Walmart feed id. When no feed slot is left the pins are still saved, run is null and skipped_reason says when they will go. SKUs that are not listings of this integration are returned in unknown_skus; if none is a listing the request fails with 422.

📄️List Walmart Fulfillments

Get a paginated list of completed fulfillments for sales orders that originated from this Walmart integration instance — both those already submitted to Walmart and those still pending. Each entry includes tracking details, carrier and shipping method, the linked sales order and Walmart order identifiers, the fulfilling warehouse, and a `sync_status` of submitted or pending. `shipping_method_display` is the shipping method's full name, carrier first (for example `UPS Ground`); when a fulfillment records no shipping method it falls back to the free-text carrier saved on the fulfillment, then to the method the order originally requested, and is `null` if none of those exist.

📄️List Pending Walmart Fulfillments

Get a paginated list of completed fulfillments that have not yet been submitted to Walmart. Pickup fulfillments and fulfillments on cancelled orders are excluded. Results are ordered newest first. These are the fulfillments that the automatic sync (every 10 minutes) or a manual submit call will send to Walmart. `shipping_method_display` is the shipping method's full name, carrier first (for example `UPS Ground`); when a fulfillment records no shipping method it falls back to the free-text carrier saved on the fulfillment, then to the method the order originally requested, and is `null` if none of those exist.

📄️List WFS Replenishment Suggestions

Replenishment grid as a full-featured, server-side list view: one row per WFS SKU with its WFS position (available/inbound summed across ship nodes), demand velocity (units/day from matched-product sales over the velocity window), and the suggested quantity to send (velocity x coverage horizon - net WFS position, case-pack rounded). Supports search, advanced filter_groups, sorting, and pagination — all applied server-side over the computed columns. Returns a Laravel LengthAwarePaginator. Requires a Bearer token.

📄️List WFS Replenishment Candidates

WFS candidate intelligence as a full-featured, server-side list view: seller-fulfilled Walmart listings NOT yet in WFS that sell enough on the Walmart channel (>= candidate_min_units in the velocity window) to warrant sending into WFS. Ranked by Walmart-channel volume by default, with a suggested initial ship quantity (velocity x coverage, nothing on hand yet). Supports search, advanced filter_groups, sorting, and pagination — all applied server-side over the computed columns. Returns a Laravel LengthAwarePaginator. Empty when the instance has no linked sales channel. Requires a Bearer token.

📄️Send WFS Inbound Shipping Details Email (stage 2)

Stage 2 of the two-stage handoff: send the carrier / pickup details the stage-1 invite promised. The WFS carrier label only exists once a Preferred Carrier is booked against the shipment, so it cannot ride along with the initial email. Uses its own tenant-editable template (wfs_inbound_shipping_details) and attaches the late-stage documents. Does NOT restamp sent_at — that timestamp is the 3PL turnaround clock and belongs to stage 1. Requires the stage-1 email to have been sent (packet.sent_at set) AND late-stage paperwork to exist (packet.can_send_shipping_details true). Same body fields as the stage-1 send.

📄️Portal — Download WFS Unit-Mix Spreadsheet (CSV, public)

PUBLIC. Downloads the unit-mix spreadsheet (CSV) for the WFS inbound shipment so the 3PL / supplier can reconcile what to pack. Columns: SKU, Product, GTIN/UPC, Qty, Packing, Units per case, Unit weight, Unit dimensions, Prep services — plus a Kitting Work Order section when the shipment contains kits. Streamed as text/csv with filename wfs-unit-mix-<shipmentId>.csv. Returns 404 if the portal token is invalid or has been revoked.

📄️List MCF Orders

Paginated WFS MCF orders for an integration instance. Supports free-text search (filter[search] spans customer_order_no + customer_order_id), advanced filters via filter_groups (columns: customer_order_no, customer_order_id, status, created_at), and sorting (allowed: id, customer_order_no, customer_order_id, status, created_at, updated_at; default -created_at). `can_cancel` is true while the order still has items and is not yet CANCELLED/SHIPPED/DELIVERED. Returns a Laravel LengthAwarePaginator. Requires a Bearer token.

📄️Create WFS Removal

Prepare a removal (status draft) from the integration's WFS inventory — several SKUs with units each, and the method: `return_to_seller` (needs `seller_warehouse_id`, one of your own warehouses) or `disposal`. Every SKU must be at WFS with at least the requested units available (summed across ship nodes); a violation is a 422 naming the SKU and its available units. Assigns the removal's reference (RMV-<instance>-<n>). Submit the same items and units in Seller Center, then record its removal order id with Mark WFS Removal Submitted. Requires a Bearer token.

📄️Receive Walmart Webhook

Receive a Walmart WFS webhook delivery. No Bearer auth — the secret path token is the credential. The body shape is whatever Walmart sends; the receiver classifies the delivery into a coarse bucket (inbound / inventory / return / order / unknown) by keyword-matching the `eventType` (or `topic`/`type`) field, persists it, and dispatches a resync. An unrecognised event type triggers a full WFS resync so nothing is missed. Always acks 2xx on success so Walmart does not retry; unknown tokens return 404.