# Product Selections Manage individual Store assortments through Product Selections. Product Selections can be used to manage individual assortments for different sales channels. For example, if you like to run multiple brand sites, sell your products in different countries, or operate a network of brick-and-mortar stores. This feature is useful for all those cases, in which the entire product catalog needs to be segmented into assortments that fit the respective sales channel. Learn more about using Product Selections to build company-specific B2B catalogs in our self-paced [Design B2B catalogs](/learning-model-b2b-commerce/design-b2b-catalogs/company-specific-product-catalogs.md) module. The maximum number of SKUs per Product Selection matches the [Product Variants](/api/projects/products.md#productvariant) limit per Product. This is a soft limit that can be increased per Project after a performance impact review. See [Limit increase guidance](/api/limit-increase-guidance.md#product-and-pricing-model-limits). Two modes of Product Selections are available for specifying a subset of your Project's product catalog. In both modes, you specify each Product individually, but you either include the Products or exclude them explicitly, whichever is more convenient for you. - Individual: each Product that should be part of the Product Selection is added explicitly. - IndividualExclusion: each Product that should **not** be part of the Product Selection is excluded explicitly. Product Selections allow you to control the availability of a Product assortment by [activating or deactivating](/api/projects/stores.md#change-product-selection-active) the respective Product Selection for a specific [Store](/api/projects/stores.md). Your shop frontend then [queries only those Product Projections](/urn?urn=ctp%3Aapi%3Aendpoint%3A%2F%7BprojectKey%7D%2Fin-store%2Fkey%3D%7BstoreKey%7D%2Fproduct-projections%2F%7Bid%7D%3AGET) that are scoped to the corresponding Store. Currently, the [Product Projection Search API](/api/projects/product-projection-search.md) does not provide Store-specific search requests that are scoped to certain Product Selections, but with the [Product Search API](/api/projects/product-search.md#keyword-fields) you can query if a Product belongs to a specific Product Selection or Store. Currently, [Product Variant Selections](/api/projects/product-selections.md#productvariantselection) are not supported. To learn more, see the [Model assortments with Product Selections](/tutorials/product-selections.md) tutorial. The guide [Populating a Store-specific external search](/tutorials/store-specific-external-search.md) explains how to integrate an external search service to populate a search index per store. Alternatively, you can populate one search index per Product Selection. This approach allows you to preview upcoming assortments, such as the summer collection in a fashion store, before publishing them to your customers. The following diagram shows the relationship of the Product Selection entity to other entities on the commerce APIs. ![Product Selections related to Stores and Products](https://docs.commercetools.com/api/images/stores/product-selections-relationships.png) Our recommended workflow when using Product Selections is the following: 1. create initial set of Products with their Variants. 2. create Product Selections. 3. assign Products and optionally Product Variants to the Product Selections. Treat the `sku` values as immutable identifiers. Finalize SKUs before assigning Products or Variant Selections to Product Selections to avoid background recalculation of `ProductSelectionAssignments` when the Product is published. After you have created a Product Selection and added Products and Variants to it, you can go ahead and assign it to one or several [Stores](/api/projects/stores.md#add-product-selection). You can then control the availability of a Product Selection via [activation or deactivation](/api/projects/stores.md#change-product-selection-active) of the Product Selection. In case you have product assortments that are shared among Stores like ![assortment overlap](https://docs.commercetools.com/api/images/stores/assortment-overlap.png) we recommend creating a separate, shared Product Selection for the Products that the Stores have in common: ![Separate Product Selection](https://docs.commercetools.com/api/images/stores/shared-product-selection.png) To find out which Products belong to a particular Product Selection, use the [Query Products assigned to a Product Selection](/api/projects/product-selections.md#query-products-assigned-to-a-productselection) endpoints. For the opposite case, meaning to find out the Product Selections a particular Product belongs to, use the [Query Product Selections for a Product](/urn?urn=ctp%3Aapi%3Aendpoint%3A%2F%7BprojectKey%7D%2Fproducts%2F%7Bid%7D%2Fproduct-selections%3AGET) endpoints. ## Representations #### ProductSelection [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelection). #### ProductSelectionDraft [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionDraft). #### ProductSelectionPagedQueryResponse [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionPagedQueryResponse). #### ProductSelectionReference [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionReference). #### ProductSelectionResourceIdentifier [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionResourceIdentifier). #### ProductSelectionMode [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionMode). #### ProductSelectionProductPagedQueryResponse [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionProductPagedQueryResponse). #### ProductsInStorePagedQueryResponse [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductsInStorePagedQueryResponse). #### ProductSelectionAssignment Specifies which Product is assigned to which ProductSelection. The entire [ProductSelectionAssignment](/api/projects/product-selections.md#productselectionassignment) is deleted automatically with [eventual consistency](/api/general-concepts.md#eventual-consistency) if all of the [SKUs have been removed](/api/projects/products.md#set-sku) from a [ProductVariantSelection IncludeOnly](/api/projects/product-selections.md#productvariantselection-includeonly) or from a [ProductVariantExclusion](/api/projects/product-selections.md#productvariantexclusion). For [ProductVariantSelection IncludeAllExcept](/api/projects/product-selections.md#productvariantselection-includeallexcept) only the `variantSelection` of the ProductSelectionAssignment is deleted in such case, meaning that all SKUs of the respective Product are included then. The above also applies if the Product Variants with the corresponding SKUs have been [removed from their Product](/api/projects/products.md#remove-productvariant). [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionAssignment). #### AssignedProductSelection [type definition](/api/projects/product-selections.md?urn=ctp:api:type:AssignedProductSelection). #### AssignedProductSelectionPagedQueryResponse [type definition](/api/projects/product-selections.md?urn=ctp:api:type:AssignedProductSelectionPagedQueryResponse). #### AssignedProductReference [type definition](/api/projects/product-selections.md?urn=ctp:api:type:AssignedProductReference). #### ProductVariantSelection Polymorphic base type that determines if a Product Selection can [include only](/api/projects/product-selections.md#productvariantselection-includeonly) specified SKUs or [include all except](/api/projects/product-selections.md#productvariantselection-includeallexcept) specified SKUs. A background process takes care that SKUs changed or deleted on published Products are removed from the `skus` field of the ProductVariantSelection automatically, making sure no [ProductSelectionAssignment](/api/projects/product-selections.md#productselectionassignment) contains any outdated SKU. Staged changes to SKUs do not affect the ProductVariantSelection. ##### ProductVariantSelection IncludeOnly [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductVariantSelectionIncludeOnly). ##### ProductVariantSelection IncludeAllExcept [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductVariantSelectionIncludeAllExcept). #### ProductVariantExclusion [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductVariantExclusion). ## Get ProductSelection ### Get ProductSelection by ID [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/\{id}:GET). ### Get ProductSelection by Key [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/key=\{key}:GET). ## Query ProductSelections [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections:GET). ## Query Products assigned to a ProductSelection ### by ProductSelection ID By default, the response does not include the `total` field. To get `total` included, pass the query parameter `withTotal` set to `true`. [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/\{id}/products:GET). ### by ProductSelection Key By default, the response does not include the `total` field. To get `total` included, pass the query parameter `withTotal` set to `true`. [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/key=\{key}/products:GET). ## Query Products assigned to active ProductSelections in a Store [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/in-store/key=\{storeKey}/product-selection-assignments:GET). ## Check if ProductSelection exists ### Check if ProductSelection exists by ID [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/\{id}:HEAD). ### Check if ProductSelection exists by Key [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/key=\{key}:HEAD). ### Check if ProductSelection exists by Query Predicate [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections:HEAD). ## Create ProductSelection [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections:POST). ## Update ProductSelection ### Update ProductSelection by ID [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/\{id}:POST). ### Update ProductSelection by Key [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/key=\{key}:POST). ## Update actions #### Add Product This action is available only for Product Selections with `Individual` [ProductSelectionMode](/api/projects/product-selections.md#productselectionmode). [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionAddProductAction). #### Exclude Product This action is available only for Product Selections with `IndividualExclusion` [ProductSelectionMode](/api/projects/product-selections.md#productselectionmode). [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionExcludeProductAction). #### Set Variant Selection This action is available only for Product Selections with `Individual` [ProductSelectionMode](/api/projects/product-selections.md#productselectionmode). [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionSetVariantSelectionAction). #### Set Variant Exclusion This action is available only for Product Selections with `IndividualExclusion` [ProductSelectionMode](/api/projects/product-selections.md#productselectionmode). [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionSetVariantExclusionAction). #### Remove Product [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionRemoveProductAction). #### Set Key [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionSetKeyAction). #### Change Name [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionChangeNameAction). #### Set Custom Type [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionSetCustomTypeAction). #### Set CustomField [type definition](/api/projects/product-selections.md?urn=ctp:api:type:ProductSelectionSetCustomFieldAction). ## Delete ProductSelection ### Delete ProductSelection by ID [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/\{id}:DELETE). ### Delete ProductSelection by Key [endpoint definition](/api/projects/product-selections.md?urn=ctp:api:endpoint:/\{projectKey}/product-selections/key=\{key}:DELETE). ## Related pages - [Area overview page with navigation](/api.md) - [Previous page: Product Projections](/api/projects/productProjections.md) - [Next page: Product Tailoring](/api/projects/product-tailoring.md)