Send Fulfillment Email
POST/api/walmart/:integrationInstance/wfs/inbound-shipments/:shipment/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.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Authentication: Requires Bearer token.
Fields:
- subject (string, required, max 255): the final subject line (tokens substituted server-side).
- body (string, required): the final HTML body (tokens substituted server-side).
- cc (string[], optional, nullable, each a valid email): additional CC recipients.
- attach_prep_sheet (boolean, optional, default true): attach the prep & pack sheet CSV (unit mix, prep requirements, kitting) — included when the shipment has lines.
- attach_receiving_label (boolean, optional, default false; the compose dialog pre-checks it whenever a receiving label is available): attach the WFS receiving label PDF, fetched live from Walmart at send time. Silently skipped if the shipment is a source placeholder or the live fetch fails.
- attach_carrier_label (boolean, optional, default false; the compose dialog pre-checks it whenever a carrier is booked): attach the WFS carrier / pickup label PDF, fetched live from Walmart at send time. Silently skipped if no carrier is booked or the live fetch fails.
- from_mode (string, optional, nullable, one of: merchant, system): sender-identity override. 'merchant' sends From the store's own domain (needs the SPF/DKIM setup in email_from_dns_setup); 'system' sends via SKU.io with the operator as Reply-To. Null = the tenant's default (email_from_default_mode).
Requires the integrations.update permission.
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden
Response Headers
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.