# Set up your Project for InStore Set up your Project to use with commercetools InStore. commercetools InStore [modifiable modules](/instore/implement-instore/modules/working-with-instore-modules.md) use Composable Commerce resources by referencing Composable Commerce resource `key` attributes. You must ensure that applicable resources you use have a value set in the `key` attribute. ## API Clients commercetools InStore uses API Clients to connect to your Project. Every time you alter your Project connection information, you must create a replacement API Client to reflect the change. See [Create an API Client](/instore/implement-instore/integrate-with-instore/create-an-api-client-for-instore.md). ## Taxes For tax calculations, modifiable modules use the `Platform` [Tax Mode](/api/carts-orders-overview.md#tax-modes). You must define the [Tax Rates](/search.md?urn=ctp:api:type:TaxRate) for each country, and optionally, for each state or region where there are InStore locations. You must set the [Tax Categories](/api/projects/taxCategories.md#taxcategory) for each Product offered in the InStore POS. For external tax calculations, you must create a custom module to handle the cart and checkout. If you use tax-inclusive pricing with external taxing, you might also need to customize the catalog. ## Shipping Methods Modifiable modules create Carts that are configured for [Multiple Shipping Methods](/api/shipping-delivery-overview.md#multiple-shipping-methods). This configuration supports mixed Cart functionality, which means the Cart includes both take-with and ship-to Orders. Carts and Orders require a Shipping Method. Since all InStore-generated Carts and Orders use the same key, [create a Shipping Method](/search.md?urn=ctp:api:endpoint:/{projectKey}/shipping-methods:POST) with `key` set to `in-store`. Typically, this Shipping Method has no cost associated with it because it is used for take-with orders. To support different fulfillment methods, you can define additional Shipping Methods. If multiple fulfillment methods are available for an InStore order, eligible Shipping Methods are determined by the [Cart Location](/search.md?urn=ctp:api:endpoint:/{projectKey}/shipping-methods/matching-cart-location:GET). ## Languages and currencies Locales used in the Product Catalog, Customer, Cart, Order, and more should be configured in the Project. Each value in the `LocalizedText` fields is passed through to the InStore POS and set on the Order and Receipt. Each InStore tenant is configured for a single currency. A Project supports multiple currencies—you can use one Project for multiple InStore tenants, but each InStore tenant can be configured to use only one Project. ## Product Projection Search Barcode scanning and product discovery use the [Product Projection Search](/api/projects/product-projection-search.md) API. To use Product Projection Search, you must [activate](/api/projects/product-projection-search.md#activate-the-product-projection-search-api) it in your Project. ## Customer Search Customer lookup uses the [Customer Search](/api/projects/customer-search.md) API. To use Customer Search, you must be [activate](/api/projects/project.md#change-customer-search-status) it in your Project. ## Product catalog InStore requires specific [Attribute](/search.md?urn=ctp:api:type:Attribute) configuration on all [Product Types](/api/projects/productTypes.md) in a Project. To be discoverable in the InStore POS, each product variant/SKU must include the following Product Type attribute definitions and values. ### Barcodes The InStore scan-to-cart functionality requires an Attribute that contains unique values matching the alphanumeric representations of barcodes. The Attribute must be of type `Text` and the `isSearchable` field set to `true`. If the product catalog includes Product Variants that are not available in InStore or don’t have barcode values, the `isRequired` field must be set to `false`. If a Product Variant/SKU does not have this value set, it will not be discoverable by the scan-to-cart functionality. ```json title="Example of single-barcode-value Attribute" { "name": "barcode", "label": { "en": "barcode" }, "inputTip": { "en": "Alphanumeric barcode (string) used for InStore scan lookups." }, "isRequired": false, "type": { "name": "text" }, "attributeConstraint": "Unique", "isSearchable": true, "inputHint": "SingleLine", "displayGroup": "Other" } ``` Since multiple alphanumeric identifiers can be used for each SKU, the Attribute can alternatively be a set of text attributes. ```json title="Example of a set of text attributes" { "name": "barcodeSet", "label": { "en": "Barcode Set" }, "inputTip": { "en": "Set of alphanumeric barcode (strings) used for InStore scan lookups." }, "isRequired": false, "type": { "name": "set", "elementType": { "name": "text" } }, "attributeConstraint": "Unique", "isSearchable": true, "inputHint": "SingleLine", "displayGroup": "Other" } ``` ### Receipt text InStore receipts draw localized text directly from the `receipt-text` attribute on the Product Variant. You must define this attribute and provide localized values for each Product Variant sold in a locale. For constraints on the values of this field, see [Mapping Custom Fields in InStore](/instore/implement-instore/integrate-with-instore/map-custom-fields.md). ```json title="Example of a receipt text attribute" { "name": "receipt-text", "label": { "en": "Receipt Text" }, "inputTip": { "en": "SKU level text to be shown on the receipt" }, "isRequired": false, "type": { "name": "ltext" }, "attributeConstraint": "None", "isSearchable": false, "inputHint": "SingleLine", "displayGroup": "Other" } ``` ## Related pages - [Area overview page with navigation](/instore.md) - [Previous page: Create an API Client for InStore](/instore/implement-instore/integrate-with-instore/create-an-api-client-for-instore.md) - [Next page: Add Types and Custom Fields to your Project](/instore/implement-instore/integrate-with-instore/types-and-custom-fields.md) - [Search documentation and API specs](/search.md)