Horizon Hotels reorders the same room-electronics kit every month: a fixed set of TVs, kettles, and chargers across dozens of properties. Rebuilding that basket by hand each time is the friction B2B buyers want to remove. In commercetools, the Shopping List is the resource that makes standard baskets, saved templates, and quick reorder workflows possible. In B2B, it becomes a shared, permissioned resource within a Business Unit. For the full Shopping List API lifecycle, including CRUD, querying, and concurrency, see the Implement carts and shopping lists path.
Why Shopping Lists are a core B2B resource
In B2C a Shopping List is often a personal wishlist. In B2B it does heavier work:
- Procurement templates: a standing basket the buyer reorders on a cadence (Horizon Hotels' monthly kit).
- Project lists: a basket assembled over time for a specific job (Pacific Property Group building a per-development list).
- Shared lists: one Associate curates the list, another places the order, reflecting the split between who specifies and who buys in a procurement team.
The shared case is what makes Shopping Lists a B2B modeling concern rather than a convenience feature: access to a list must follow the buyer organization's roles, not just the individual who created it.
The My and Others permission model
Shopping List access in B2B is governed by Associate permissions, which come in My and Others pairs. This is the same model you designed roles around in Configure associate access. My permissions apply to lists the Associate owns; Others permissions apply to lists owned by other Associates in the Business Unit.
Shopping List permissions follow the same action pairs for viewing, creating, updating, and deleting Shopping Lists. Each action has a
My permission for Shopping Lists owned by the Associate and an Others permission for Shopping Lists owned by other Associates in the Business Unit. For the complete list of permission enum values, see Permission.To model a shared purchasing list where a procurement lead curates and a buyer orders, give the buyer role
ViewOthersShoppingLists so the buyer can read the lead's lists, and keep curation permissions (CreateMyShoppingLists, UpdateMyShoppingLists) on the lead's role.Others does not imply My. Granting
ViewOthersShoppingLists lets an Associate see other people's lists but not their own; for that they also need ViewMyShoppingLists. Design each role with both halves of the pair in mind; omitting My is a common cause of "I can see everyone's lists but not mine" support tickets.Creating a Shopping List as an Associate
B2B Shopping Lists are created through the
as-associate endpoint, scoped to a Business Unit. The platform enforces the relevant permission server-side, using the same Permission Gate you met in Module 2.POST /{projectKey}/as-associate/{associateId}/in-business-unit/key=horizon-hotels/shopping-lists HTTP/1.1
Content-Type: application/json
{
"name": { "en-AU": "Monthly room-electronics kit" },
"lineItems": [
{ "sku": "ZET-TV-43", "quantity": 12 },
{ "sku": "ZET-KETTLE-1L", "quantity": 12 },
{ "sku": "ZET-USBC-65W", "quantity": 24 }
]
}
Two details matter for B2B:
- The endpoint requires the
manage_shopping_lists:{projectKey}OAuth scope, and the Associate's role must include the matching permission (CreateMyShoppingListsorCreateOthersShoppingLists). Without it the platform returns403 Forbidden. - The
businessUnitis taken from the URL path. AnybusinessUnitfield in the request body is ignored, so the list always belongs to the Business Unit you addressed.
Shopping Lists can also be scoped to a Store through the in-store endpoints, which keeps a buyer's lists within the same commercial context as their Carts and Orders.
From list to Cart to order
A Shopping List is a template, not an order. To buy, you convert the list into a Cart with the
addShoppingList update action, which copies every Line Item from the list onto the Cart in one call.POST /{projectKey}/as-associate/{associateId}/in-business-unit/key=horizon-hotels/carts/{cartId} HTTP/1.1
Content-Type: application/json
{
"version": 1,
"actions": [
{
"action": "addShoppingList",
"shoppingList": { "typeId": "shopping-list", "key": "monthly-room-electronics" },
"distributionChannel": {
"typeId": "channel",
"key": "horizon-hotels-pricing"
}
}
]
}
The
distributionChannel on the action is the link to Configure B2B pricing: it sets the buyer's distribution Channel on every Line Item added from the list, so each item resolves the buyer's negotiated Channel-scoped Price rather than an unscoped one. Pass the same Channel the buyer's Store carries, and the reorder lands at the right price automatically.This list-to-Cart conversion is also the entry point to the quote flow. For large or custom orders, a buyer can build a list, convert it to a Cart, and then raise a Quote Request from that Cart for negotiation. You will follow the full quote lifecycle in the Implement B2B purchase flows module.
Key takeaways
- In B2B, Shopping Lists model procurement templates, project lists, and shared lists where one Associate curates and another orders.
- Shopping List access uses paired
My/Otherspermissions; Others never implies My, so design both halves into each role. - Create B2B Shopping Lists through the
as-associateandin-business-unitpath segments; the Business Unit comes from the path and anybusinessUnitin the body is ignored. - Convert a list to a Cart with the
addShoppingListaction, passing the buyer'sdistributionChannelso Line Items resolve the negotiated Price. - A list converted to a Cart is also the starting point for a Quote Request in the Implement B2B purchase flows module.