# Welcome to the fabric Developer Portal Source: https://developer.fabric.inc/home fabric’s API-first platform gives developers the control and flexibility to easily build from scratch or integrate with the existing stack, to compose the perfect commerce experiences. export function openSearch() { document.getElementById('search-bar-entry').click(); }

Welcome to fabric's Developer Portal

Here you'll find API references, developer guides, UI navigation guides, and release notes.

Centralized source of order, inventory, and warehouse information.
Receive and track inventory across networks and locations.
Build fulfillment rules sets to direct orders to different fulfillment locations.
Centralized source for all products.
Launch, operate, and scale a curated assortment of products with unlimited dropship suppliers.
Launch, operate, and scale your product assortment across channels with your retailer partners.
Streamline cart management and checkout with multi-cart support, seamless transitions, and unified experiences.
Manage your pricing, promotions, and coupons in one place.

What’s new at fabric?

***
# API Authentication Source: https://developer.fabric.inc/v3/getting-started/api-guides/api-authentication fabric APIs use [System Apps](/v3/platform/settings/api-apps/creating-system-app), which employ [OpenID Connect's Client Credential Flow](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4) for API authentication. ## System App Authentication System App authentication is the process by which a system application verifies its identity and obtains authorization to access specific APIs or services. System Applications, also called System Apps, are specialized software applications designed to perform automated tasks and system-level functions. System Apps don't authenticate end-users and aren't associated with user pools, hence these API applications aren't intended for direct use by shoppers for storefront authentication. System Apps only facilitates secure and efficient system-level interactions with fabric APIs. System Apps are commonly deployed in enterprise contexts, including systems such as Enterprise Resource Planning (ERP), Order Management Systems (OMS), Warehouse Management Systems (WMS) and Storefronts. A System App uses OpenID Connect to obtain an access token referred to as a system token: 1. The System App possesses a unique identifier called a [client ID](/v3/platform/settings/api-apps/getting-system-app-credentials) and a confidential [client secret](/v3/platform/settings/api-apps/getting-system-app-credentials). 2. To start authentication, the system app sends a request to an authorization server, providing its client ID and client secret. 3. If the provided client ID and client secret are valid, the authorization server issues an access token referred to as a system token to the System App.\ This system token serves as the key for the system app to make authorized requests to APIs or services, representing the system during interactions. System Apps use this token for all subsequent fabric API calls. ## Related Resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/getting-started/authentication-v3/systems-apps/getting-started-with-sysapps) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # API Overview Source: https://developer.fabric.inc/v3/getting-started/api-guides/api-overview The API reference guide provides comprehensive documentation on the API endpoints offered by Commerce fabric Inc, also known as fabric. This guide details how to use these endpoints and assists users in integrating fabric's capabilities into their ecommerce solutions, enabling developers and businesses to leverage the full potential of the platform. ## Audience and Purpose This documentation is designed for system integrators, developers, and merchant users. The aim is to provide these users with detailed information on how to effectively integrate, use, and adapt the fabric platform for their specific ecommerce needs. ## Terms and Conventions In the API reference guide , the term *we* refers to fabric. The term customers may have different meanings depending on the context. Customer is used to denote the consumers of fabric's products and services and is also used to imply the service Customer, which is used to manage information for both individual customers and organizations with whom you conduct business, including any contracts in place. The term *customers*, when lowercase, typically refers to the users of fabric's products. However, in certain contexts where it's capitalized, it indicates [fabric’s Customers](/v3/platform/customers/overview) feature. The term *product* denotes any item or service available for sale. However, in specific contexts, it directly refers to fabric’s [Product Catalog](/v3/product-catalog/api-reference/product-catalog/products-api---overview) APIs. For all other terms used in fabric, see the [Glossary](/v3/getting-started/copilot/glossary). ## fabric Commerce Platform **fabric** is a cloud-native, headless, API-first ecommerce platform offering a comprehensive suite of APIs and applications that help you build your ecommerce store with flexibility, scalability, and speed. With a separate sales channel for front-end and backend processing systems, fabric Commerce Platform provides developers with the flexibility to build, integrate, and maintain highly personalized B2C or multi-channel commerce experiences with precision. **fabric Commerce Platform** supports multiple geographical regions. For each tenant, accounts and stores are created in a specific region. However, tenants can also have one account to maintain multiple regions. For evaluating fabric commerce platform and other fabric products [click here](https://live.copilot.fabric.inc/onboarding/signup) to sign up for a free trial and set up your environment and credentials. ## Related Resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [API Apps](/v3/platform/settings/api-apps/api-apps) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # API References Source: https://developer.fabric.inc/v3/getting-started/api-guides/api-references fabric APIs are based on Representational State Transfer (REST) architectural principles and follow the OpenAPI 3.0 standard. You can connect to the APIs using fabric tools, or call individually from other systems to build custom solutions of any size or configuration. fabric provides the following APIs: * [Cart and Checkout](/v3/cart-and-checkout/api-reference/carts-v3/overview)(CnC): fabric's service for the management of online shopping carts, including items and configuration of shipping, fulfillment, and payment options to ensure a smooth checkout experience for your customers. [Cart collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/cart.json) and [checkout collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/checkout.json) are available for you to download. * [Identity](/v3/getting-started/authentication-v3/concepts): Identity API allows you to manage user roles and permissions to ensure secure and personalized access to your storefront or e-commerce systems. [Identity collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/identity.json) is available for you to download. * [Offers](/v3/offers/api-reference/offers/offers--3-0-0): fabric’s pricing and promotions engine with tools to manage price lists, item prices, and discounts.. [Offers collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/offers.json) is available for you to download. For more information about offers, see the [Offers Overview](/v3/offers/api-reference/offers/offers--3-0-0), [Pricing](/v3/offers/api-reference/offers/prices/overview), [Promotions](/v3/offers/api-reference/offers/promotions/overview), and [Coupons](/v3/offers/api-reference/offers/coupons/overview) sections. * [Orders](/v3/orders-and-inventory/api-reference/orders/orders--3-0-0): fabric's API for centralized order, inventory, and warehouse information. Orders API supports order placement, allocation, handling back orders and pre-orders, exporting data, generating invoices, creating and managing shopping lists, sending notifications, handling cancellations and returns, order tracking, fraud checks, updating payment status, creating appeasements, creating and managing shipments, shipping methods, and more. [Orders collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersAllocations.json) is available for you to download. * [Product Catalog](/v3/product-catalog/api-reference/product-catalog/products-api---overview): Product Catalog API enables you to efficiently manage your product catalog to ensure accurate and up-to-date information across all your sales channels. [Product Catalog collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ProductCatalogAttributes.json) is available for you to download. * [Inventory](/v3/orders-and-inventory/api-reference/inventory/inventory--3-0-0): fabric's API for tracking inventory across networks and locations. [Inventory collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/inventory.json) is available for you to download. ### Related Resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # Example Source: https://developer.fabric.inc/v3/getting-started/api-guides/example ### Make your first API request This section provides you the instructions to use the [Create Attribute](/v3/product-catalog/api-reference/product-catalog/attributes/create-attribute) endpoint. With this endpoint, you can create attributes that can be assigned to a product or category. #### Prerequisites: * Generate the access token by following the instructions in the [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis). * Get the `x-fabric-tenant-id` by following the instructions in the [Getting the Account ID](/v3/platform/settings/account-details/getting-the-account-id). #### Procedure 1. Open your preferred API testing tool or command-line interface. 2. To run the following API call, set the following headers in the request with the corresponding values and add the payload as in the example: * `x-fabric-tenant-id`: Replace `` with your fabric tenant ID. * `Authorization`: Replace `` with the access token obtained from the previous steps. * `Content-Type`: Set this header to `application/json`. ```bash curl --location 'https://api.fabric.inc/v3/product-attributes' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "20063", "localizedProperties": { "en-US": { "name": "demo_en_us_attribute" } }, "description": "Demo_attribute", "type": "TEXT", "target": "PRODUCT", "isLocalizable": false, "validation": { "isMandatory": false, "subType": "SMALL_TEXT", "customValidationFormula": "" } }' ``` Note that this payload is an example. You can edit it as required. 3\. Send a POST request to the `https://api.fabric.inc/v3/product-attributes` endpoint.\ A response with the status code 200 is returned with the following information: ```bash { "id": "", "name": "", "description": "", "isLocalizable": , "target": "", "type": "", "validation": { "isMandatory": , "subType": "", "customValidationFormula": "", "isManualOverwrite": }, "updatedAt": "", "createdAt": "", "updatedBy": "" } ``` ### Related Resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # Getting Started with fabric APIs Source: https://developer.fabric.inc/v3/getting-started/api-guides/getting-started-with-fabric-apis This topic will provide instructions to start using fabric’s APIs to build unique and flexible shopping experiences for your customers. fabric recommends [Postman](https://www.postman.com/downloads/) as the API client. ### API URL The base URL, which is also called `fabric-base-url`, `https://api.fabric.inc/v3/{product}` is the standard URL to which the requests are sent for all fabric APIs. ### Prerequisites Before you can start using fabric’s APIs: * **Get your trial account:** Reach out for a trial account with fabric and to get your environment and credentials set up for you. This will help you set up your Copilot account. * **Access to your Copilot Account:** Ensure you have the credentials to access your Copilot account; if you don't have an account, reach out. Once you have an account, you can add other team members for effective collaboration. * [Get the API collection that you want to use](/v3/getting-started/api-guides/api-references): Ensure you have access to the API collection for the product you want to try. * Ensure that a [system app is created](/v3/platform/settings/api-apps/creating-system-app) for your account. You must have admin rights to create a system app in Copilot. * Download the [Postman](https://www.postman.com/downloads/) client. ### Procedure 1. **Log in** to your Copilot account. 2. In the left menu, click **Settings > Developer Tools**. 3. Click **API Apps**. * The API Apps page is displayed. This page provides a list of apps created in your account. The **app type** field specifies whether the application is a user app or system app. 4. Click the name of a system app that's already created for your account.\ The details of the system app are displayed. 5. Make a note of the following settings: * **Authorization URL:** A unique URL of each fabric merchant, common across all system apps defined for a single merchant. * **Client ID:** Public identifier of an app. * **Client Secret:** The Secret known only to your application and the authorization server used to authenticate the app.\ These values are required for authentication of your system app and to start using the APIs. For more information about these settings, see the [API Apps](/v3/platform/settings/api-apps/api-apps) page. 6. In the following code sample for the /token endpoint, replace the `{{authURL}}`, `{{clientId}}`, and `{{clientSecret}}` with the corresponding values from step 5: ```shell curl --location --request POST '{{authURL}}/v1/token' --header 'accept: application/json' --header 'cache-control: no-cache' --header 'content-type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=client_credentials' --data-urlencode 'scope=s2s' --data-urlencode 'client_id={{clientId}}' --data-urlencode 'client_secret={{clientSecret}}' ``` 1. Log in to the Postman client. 2. To generate an access token, do the following steps: 1. In the left menu, click **Import**. 2. Import the code sample from Step 6. 3. Run the `/token` endpoint. ```js { "token_type": "Bearer", "expires_in": 600, "access_token": "eyJraWQiOiIt...", "scope": "s2s" } ``` 3. Make a note of the access token.\ The access token is used to authenticate all your API requests. The token expires after 10 minutes. You must generate a new access token to continue using the API endpoints. 4. [Make your first API request](/v3/getting-started/api-guides/making-your-first-api-request). ### Related resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [Authentication Concepts](/v3/getting-started/authentication-v3/concepts) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # Identifiers Source: https://developer.fabric.inc/v3/getting-started/api-guides/identifiers ## Identifiers in fabric APIs This topic explains how fabric uses `sku`, `itemId`, `pricelineId`, and `inventoryId` as methods of identification with fabric APIs. In general, fabric uses `sku` to specify a product because it's used across all domains. However, other identifiers are also used in certain API services. fabric recommends avoiding `itemId` in V3 API implementations. However, `itemId` is still supported and used in V2. The following table provides a list of all identifiers used across different services and the corresponding services: | **Identifier** | **Description** | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `sku` | This identifier is used across all services, such as [Product Catalog](#product-catalog), [Offers](#offers), [Carts](#carts), [Orders](#orders), and [Inventory](#inventory). | | `itemId` | This identifier is used in [Offers](#offers), [Carts](#carts), [Orders](#orders), and [Inventory](#inventory). The [Product Catalog](#product-catalog) service doesn't use `itemId`. In [Carts](#carts), a user-generated `itemId` is used, separate from the `itemId` used in other services. | | `priceListId` | This identifier is used in [Offers](#offers) and [Carts](#carts). | | `inventoryId` | This identifier is used only in [Inventory](#inventory). | ## Product catalog ### Storage keeping unit (SKU) `sku` is entered by the user when adding a product into product catalog. In product catalog, a `sku` is an unique identifier for a specific product. You can perform several key actions to manage products and their lifecycle. The `sku` is the preferred method for managing products. It allows you to monitor, publish, and unpublish products. The following table shows examples of operations in Product catalog that are supported using `sku`: | **Operations** | **Descriptions** | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | | [Retrieve a product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-product-by-sku) | View the details of a single product, including its attributes and variants. | | [Retrieve products](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-product-by-sku) | Get a paginated list of products, including items, bundles, or variants, with their attributes and variants. | | [Update product attributes](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/update-product-attributes-by-sku) | Replace all existing product attributes. | | [Partially update product attributes](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/update-product-attributes-by-sku) | Modify specific product attributes without affecting others. | | [Delete product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/delete-product-by-sku) | Remove a product from the catalog, with an option to delete associated variants. | | [Publish product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/publish-product-by-sku) | Change a product’s status from "Draft" to "Published." | | [Retrieve published product](/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-published-product-by-sku) | Get the details of a published product for display on your Storefront. | ## Offers ### Storage keeping unit (SKU) fabric's Offers APIs enable you to manage prices and create various types of discounts and promotions using `sku`. The following are some examples of operations in Offers that are supported using `sku`: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | | [Set the price of an item](/v3/offers/api-reference/offers/prices/create-price) | When creating a price for an item, `sku` or `itemId` can be used as an identifier in the request body. | | [Retrieve price of an item](/v3/offers/api-reference/offers/prices/get-price-by-sku) | When retrieving the default price for an item, `sku` can be used as an identifier if `priceListId` isn't specified. | | [Delete price of an item](/v3/offers/api-reference/offers/prices/delete-price-by-sku) | When removing an items price, `sku` can be used as an identifier if `priceListId` isn't specified. | | [Retrieve product and price details](/v3/offers/api-reference/offers/priced-products/get-product-and-price-details-by-sku) | When retrieving a products price, details, or any additional information, `sku` can be used as an identifier. | ### Item ID fabric's Offers APIs enable you to manage prices and create various types of discounts and promotions using `itemId`. The following are some examples of operations in Offers that are supported using `itemId`: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | [Set the price of an item](/v3/offers/api-reference/offers/prices/create-price) | When creating a price for an item, `sku` or `itemId` can be used as an identifier in the request body. | | [Retrieve price of an item](/v3/offers/api-reference/offers/prices/get-price-by-itemid) | When retrieving the default price for an item, `itemId` can be used as an identifier if `priceListId` isn't specified. | | [Delete price of an item](/v3/offers/api-reference/offers/prices/delete-price-by-itemid) | When removing an items price, `itemId` can be used as an identifier if `priceListId` isn't specified. | | [Retrieve product and price details](/v3/offers/api-reference/offers/priced-products/get-product-and-price-details-by-product-item-id) | When retrieving a products price, details, or any additional information, `itemId` can be used as an identifier. | ### Price list ID Offers API creates a `priceListId` when generating a price list, which includes generic information such as currency. The `priceListId` is used to identify entities that specify how the items should be priced. The following are some examples of how `priceListId` is utilized: | **Operations** | **Descriptions** | | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | [Create price list](/v3/offers/api-reference/offers/price-lists/create-price-list) | When creating price list for an item, `priceListId` is automatically generated and is used to identify different price lists. | | [Create promotion](/v3/offers/api-reference/offers/promotions/create-promotion) | If the `priceList` is eligible, a promotion is created for the item. | | [Retrieve SKUs in a price list](/v3/offers/api-reference/offers/priced-products/get-product-and-price-details-by-product-item-id) | In a given price list, all associated `sku` and `productItemId` values are returned in the response body. | | [Retrieve priced products](/v3/offers/api-reference/offers/priced-products/get-priced-products) | If `priceListId` is sent in the request body, all items belonging to the price list are returned in the response body. | ## Carts ### Storage keeping unit (SKU) The Carts API allows you to add, update, and remove items, and those items can be identified by `sku`, from the storefront cart. When creating a checkout, the system uses the `cartId` to identify all items using `sku` in the specific cart. While `sku` isn't used in the path parameter for Carts endpoints, it's used in the request body. The following shows examples of operations where you use `sku` in the request body and view it in the response body: | **Operations** | **Descriptions** | | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | [Create a line item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) | Adds a line item to the cart using `sku`. | | [Update a line item](/v3/cart-and-checkout/api-reference/carts-v3/items/update-items) | Updates a line item in the cart to a new item by referencing the `sku`. | | [Retrieve a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/get-cart) | In the cart details, you can view the line items and their associated `sku` values. | ### Item ID The Carts endpoint creates a cart-specific `itemId`, also referred to as `lineItemId`. You can use the `itemId` to add an item to the corresponding `cartId` and adjust prices. The following are some examples of operations in Carts that are supported using `itemId`: | **Operations** | **Descriptions** | | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | | [Add an item into the specified cart](/v3/cart-and-checkout/api-reference/carts-v3/items/items) | Manually enter the `itemId`, which can then be used in other cart endpoints. | | [Update an item in the specified cart](/v3/cart-and-checkout/api-reference/carts-v3/items/items) | Update item details within a specific cart using `lineItemId`. | | [Adjust price of the item in the specified cart](/v3/cart-and-checkout/api-reference/carts-v3/item-adjustments/create-item-adjustments) | Adjust the prices of an item in the specified cart. | ### Price list ID The Carts API uses `priceListId` to calculate prices and evaluate discounts for individual products and carts. This ensures accurate pricing when items are added to a cart. The following are some examples of how `priceListId` is utilized: | **Operations** | **Descriptions** | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | [Add an item into the specific cart](/v3/cart-and-checkout/api-reference/carts-v3/items/items) | When a line item is added to the cart, the respective `priceListId` is included to identify the cart's price. | | [Update an item in the specified cart](/v3/cart-and-checkout/api-reference/carts-v3/items/items) | When a line item is updated, the price is also adjusted. | ## Orders ### Storage keeping unit (SKU) When creating or modifying an order, you can add one or more `sku` by selecting a network and channel, a network and channel, which enables browsing for all the available `sku`. Only `sku` with an "Available" stock status and availability greater than or equal to one can be added to an order. You can select more than one `sku` at once and specify the quantity for each. Orders display `sku` information, including `sku`, price per unit, quantity, and availability. `sku` is used as unique identifier for items in an order. Order details typically show `sku`, quantity, and total cost for each item. The following are some examples of when `sku` is used to verify that orders contain the correct items: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **[Create a new order](/v3/orders-and-inventory/api-reference/orders/orders/create-new-order)** | When creating a new order, the item’s `sku` and `itemId` are used to verify that the correct item is processed. | | **[Search for backorders or preorders](/v3/orders-and-inventory/api-reference/orders/backorders-preorders/search-for-backorders-or-preorders-by-query)** | After searching for backorders or preorders, you can use the `sku` to verify that the correct items are included in the order. | | **[Search for allocation](/v3/orders-and-inventory/api-reference/orders/allocations/search-for-allocations-by-query)** | One of the filter criteria for searching inventory allocation is `sku`. | | **[Create a new shipment](/v3/orders-and-inventory/api-reference/orders/shipments/create-new-shipment)** | To fulfill an order and ship it, the items that are set to ship can be identified by `sku`. | ### Item ID When creating or modifying an order, you can add one ore more `sku` by selecting a network and channel, and then browsing available `itemId`. Only `itemId` with an "Available" stock status and availability greater than or equal to one can be added to an order. You can select more than one `itemId` at once and specify the quantity for each. Orders display `itemId` information, including `itemId`, price per unit, quantity, and availability. `itemId` is used as a unique identifier for items in an order. Order details typically show `itemId`, quantity, and total cost for each item. The following are some examples of when `itemId` is used to verify that orders contain the correct items: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **[Create a new order](/v3/orders-and-inventory/api-reference/orders/orders/create-new-order)** | When creating a new order, the item’s `sku` and `itemId` are used to verify that the correct item is processed. | | **[Search for backorders or preorders](/v3/orders-and-inventory/api-reference/orders/backorders-preorders/search-for-backorders-or-preorders-by-query)** | After searching for backorders or preorders, you can use the `itemId` to verify that the correct items are included in the order. | | **[Search for allocation](/v3/orders-and-inventory/api-reference/orders/allocations/search-for-allocations-by-query)** | One of the filter criteria for searching inventory allocation is `itemId`. | | **[Create a new shipment](/v3/orders-and-inventory/api-reference/orders/shipments/create-new-shipment)** | To fulfill an order and ship it, the items that are set to ship can be identified by `itemId`. | ## Inventory ### Storage keeping unit (SKU) When you create inventory, the `sku` is stored as a native value. During network setup, you can apply conditional rules to include specific SKUs and configure safety stock levels to maintain optimal inventory availability. Inventory networks also aggregate `sku` quantities across various locations. Even if `sku` isn't directly referenced in some endpoints, they play a crucial role in the background. The following are some examples of operations in Inventory that are supported using `sku`: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | **[Create inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/create-inventory)** | Create inventory using a combination of location number, channel ID, and either `sku` or `itemId`. | | **[Add new property to an existing inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/update-inventory-by-adding-new-property)** | By using `sku` to identify inventory, you can add a new property or update an existing one by specifying it in the request body. | | **[Find inventory of specific items](/v3/orders-and-inventory/api-reference/inventory/inventory/find-inventory-of-specific-items-in-a-specific-region)** | Search for all items in the location specified in the request body that match the `sku` in the request body. | | **[Create inventory network](/v3/orders-and-inventory/api-reference/inventory/networks/create-inventory-network)** | Creates an inventory network. Although `sku` isn’t used directly, it’s utilized within the network to monitor item quantities. | ### Item ID When you create inventory, the `itemId` is stored as a native value. During network setup, you can apply conditional rules to include a specific `itemId` and configure safety stock levels to maintain optimal inventory availability. Inventory networks also aggregate `itemId` quantities across various locations. Even if `sku` isn't directly referenced in some endpoints, they play a crucial role in the background. The following are some examples of operations in Inventory that are supported by `itemId`: | **Operations** | **Descriptions** | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | **[Create inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/create-inventory)** | Create inventory using a combination of location number, channel ID, and either `sku` or `itemId`. | | **[Add new property to an existing inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/update-inventory-by-adding-new-property)** | By using `itemId` to identify inventory, you can add a new property or update an existing one by specifying it in the request body. | | **[Find inventory of specific items](/v3/orders-and-inventory/api-reference/inventory/inventory/find-inventory-of-specific-items-in-a-specific-region)** | Search for all items in the location specified in the request body that match the `itemId` in the request body. | | **[Create inventory network](/v3/orders-and-inventory/api-reference/inventory/networks/create-inventory-network)** | Creates an inventory network. Although `itemId` isn’t used directly, it’s utilized within the network to monitor item quantities. | Shipping Method Association: `itemId` are used to determine which items are associated with specific shipping methods. ### Inventory ID `inventoryId` is used to track inventory to manage and track product stock across different locations, channels, and items. Inventory is the only domain that uses `inventoryId`. The following are some examples of how `inventoryId` is utilized: | **Operations** | **Descriptions** | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | [Create inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/create-inventory) | The system automatically generates a unique `inventoryId` when you create new inventory for a `sku`. | | [Change inventory counters](/v3/orders-and-inventory/api-reference/inventory/inventory/adjust-inventory-counters) | Adjust inventory counters by passing the `inventoryId` in the request body. | | [Update inventory with a new property](/v3/orders-and-inventory/api-reference/inventory/inventory/update-inventory-by-adding-new-property) | Verify that the correct inventory was updated by checking the `inventoryId` in the response body after the update. | # Making your first API request Source: https://developer.fabric.inc/v3/getting-started/api-guides/making-your-first-api-request When making calls to fabric APIs, you must use the following HTTP headers to provide context. * **`--header`**: This flag is used to include headers in the request. The most commonly used headers in fabric APIs are: * **`x-fabric-tenant-id`**: This is a custom header used by the API to identify the tenant making the request. You can [find the tenant-id](/v3/platform/settings/account-details/getting-the-account-id) in Copilot. * **`Content-Type: application/json`**: This tells the server that the data being sent in the request is in JSON format. * **`Authorization: Bearer`**: This is the authorization token used to authenticate the request. You must pass the access token generated from the system app. * **`x-fabric-channel-id`**: This is a custom header, used to identify the channel through which the request is being made. This is primarily used for a multichannel use case. Usually, the default value is 12 (US). fabric API responses are in JSON format. #### Prerequisites Before you can start using fabric APIs: * Generate the access token by following the instructions in the [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) section. * Get the x-fabric-tenant-id by following the instructions in the [Getting the Account ID](/v3/platform/settings/account-details/getting-the-account-id) section. #### Procedure The following steps use [Create attribute](/v3/api-reference/product-catalog/attributes/create-attribute) as an example: 1. Log in to Postman client. 2. In the left menu, click **Import** The import window will display. 3. In the import window, copy and paste the following code: ```bash curl --request POST \ --url https://api.fabric.inc/v3/product-attributes \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer ' \ --header 'x-fabric-tenant-id: ' \ --data '{ "name": "Category datetime example", "isLocalizable": false, "target": "CATEGORY", "type": "DATETIME", "validation": { "isMandatory": false, "isManualOverwrite": false, "formula": "", "dateFormat": "MM/DD/YYYY" } }' ``` 4. To populate the headers, click the **Headers** tab and do the following: * To enter **`Authorization: Bearer`**, replace **Bearer \** with the access token you generated from [Getting Started with fabric APIs](/v3/api-reference/getting-started/getting-started-with-fabric-apis) section. * To enter **`x-fabric-channel-id`**, replace **\** with the tenant-id you obtained from [Getting the Account ID](/v3/guides/settings/account-details/getting-the-account-id) section. 5. Click **Send**. ## Related Topics * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # Security and Compliance Source: https://developer.fabric.inc/v3/getting-started/api-guides/security-and-compliance Learn how we protect customer data, user data, and the reliability of our commerce services and applications. We use an SRE (Site Reliability Engineering) team to manage, maintain, and operate our security policies and procedures. We also use secure engineering and quality assurance practices to ensure ongoing security compliance. fabric’s core product is hosted on Amazon Web Services (AWS) cloud infrastructure that supports security standards and compliance certifications which could help our customers satisfy compliance requirements for virtually every regulatory agency around the globe. Additionally, fabric holds following compliance certifications / attestations and self assessment questionnaires: * SOC 2 Type I * SOC 2 Type II * PCI DSS (SAQ - A) fabric doesn't process / store credit card information directly. Instead, third party payment gateways (PCI compliant) are used to handle payment transactions. We can supply certificates, insurance policies, and security playbooks on request. ## Access Control Management All access to fabric infrastructure is based on RBAC and the principle of least privilege. We manage access control logging at the user level for console and CLI actions. This log allows us to trace code-level commits and offers traceable and auditable protocols for code-level commits, along with actions to manage code between environments. Additionally, all access to the fabric AWS environment is only provided through Multi-Factor Authentication (MFA). fabric leverages industry recognized hashing, encryption and salting mechanisms to protect all credentials stored in the environment. To secure user credentials, TLS is used to encrypt the requests and responses throughout the login process and credential information is encrypted at rest using server side encryption. Credentials are verified by the comparison of a salted hash of the password using a high-computational effort hashing algorithm (such as bcrypt) against a persisted value and calls to the login API are rate limited to protect against brute force attacks. User account is disabled after 10 unsuccessful login attempts. Logged in users are provided with a JSON Web Token that proves the user’s identity and contains claims that will be used to authorize subsequent requests. The token is signed with fabric’s private key as described in [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519), allowing the integrity of the token to be evaluated by receiving systems. ## Data and Asset Protection fabric leverages security tools, processes and cloud native services to protect the infrastructure, including: * DDOS protection * WAF protection * Bot configuration and IP whitelisting * Performing Static Application Security Testing (SAST) through tools integrated into the CI/ CD pipeline * Code reviews to protect against OWASP Top 10 vulnerabilities and more * EDR (Endpoint Detection and Response) tool for user workstations and cloud instances The SRE team at fabric has a data loss recovery plan for all systems in place. In addition to this, we: * Store all customer-related information on secure cloud accounts * Only allow SRE personnel to grant access to cloud accounts and all digital data * Deploy the Storefront with a dedicated managed database as a VPC (Virtual Private Cloud) * Employ secure, multi-zonal replication and encryption of data * Protect data transfer with SSE (Server-Side Encryption) * Retain data only for a month after the end of the contract * Accept a request from you to delete your data * Only work with third parties who meet our security and insurance conditions ## Incident Response Management We actively monitor all logs, reports, and alerts to detect threats. Our incident response team is available 24/7/365 on an on-call schedule for global coverage. In case of an incident, the SRE team recreates or verifies the suspected issue. Then, we bring the appropriate resources together to address the incident. Our standard priority-based incident response SLA is provided below. Here, P1 refers to the highest priority and P4 the lowest. * First email response within 30 minutes * Follow up responses every hour until the issue is resolved * SLA: as soon as possible * Report issue by phone * First email response within 30 minutes * Second follow up response within 6 hours * SLA: 2-3 business days * Report issue by email only * First email response within 30 minutes * Second follow up response within business 2-3 days * SLA: 5-7 business days * Report issue by email only This policy may be customized at your request as part of the MSA and onboarding process. ## Vulnerability Assessment fabric’s continuous vulnerability management program consists of two pillars: * Deep integration into fabric’s CI/CD Pipeline * Scheduled vulnerability scans of deployed code We create and run automated security unit tests on each code change before the deployment. To identify vulnerabilities, we also perform a security scan every four weeks. We rate vulnerabilities as critical, high, medium, and low. Critical and high vulnerabilities are acted upon within 3 to 7 days, medium within 14 days, and low within 30 days. Periodic secure coding audits and external penetration tests follow the security scan. During the security review, a trained reviewer analyzes the code for potential security flaws. The analysis is based on standards of the OWASP Security Knowledge Framework. # Using Developer Portal Source: https://developer.fabric.inc/v3/getting-started/api-guides/using-developer-portal [The developer portal](https://developer.fabric.inc/) provides API definitions that include working code examples and the ability to make authenticated API requests directly within the documentation. This section provides step-by-step instructions on how to make API calls from the developer portal. #### Prerequisites * Install the [Postman](https://www.postman.com/downloads/) client. * Generate the access token by following the instructions in the [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) section. * Get the `x-fabric-tenant-id` by following the instructions in the [Getting the Account ID](/v3/platform/settings/account-details/getting-the-account-id) section. ### Procedure 1. Go to the [fabric Developer Portal](https://developer.fabric.inc/). 2. To try an API endpoint, go to the corresponding page.\ For example, to add an attribute go to the [Create Attribute](/v3/api-reference/product-catalog/attributes/create-attribute) page. You can click the **Examples** menu in the request field to view request examples with data. 3. To run the API request, do the following: * In the **Bearer** field in the right pane, enter the access token. * In the **BODY PARAMS** section, enter the required setting for each parameter. * In the **Headers** section, enter the required setting for each parameter. * In the right pane, click **Try it**. The response is displayed in JSON format. You can also click the Examples menu in the right pane to see different response examples. ### Related Resources * [Getting Started with fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis) * [API Authentication](/v3/getting-started/api-guides/api-authentication) * [Glossary](/v3/getting-started/copilot/glossary) * [Getting System App Credentials](/v3/platform/settings/api-apps/getting-system-app-credentials) * [fabric support](https://support.fabric.inc/hc/en-us/requests/new) * [License](https://fabric.inc/api-license) * [Demo Request](https://fabric.inc/demo-request) # Authorize user apps with and without PKCE Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/authentication-endpoints/authorize-user-app-with-and-without-pkce authentication_v3 get /oauth2/default/v1/authorize Use this endpoint to authenticate user apps using fabric Identity. When calling this endpoint, the immediate response will be a browser redirect to the hosted Login page configured in fabric Identity. After successful authentication of the user on the hosted Login page, fabric Identity will redirect back to the user app using the provided `redirect_uri`. This endpoint supports both authorization code flow with and without Proof of Code Exchange (PKCE).
**Note**: This endpoint isn't required for system app authentication (refer to `/token` endpoint instead) # Fetch access token Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/authentication-endpoints/fetch-access-token authentication_v3 post /oauth2/{authServerId}/v1/token This endpoint allows apps to fetch access tokens. For user apps, use this endpoint after the `/authorize` endpoint and the subsequent callback. For user apps this endpoint supports generation of access token from authorization code or from refresh token, sent in the previous `authorize` endpoint's callback. For system apps this endpoint can directly be used to get an access token, no prior `/authorize` end point call is needed.
NOTE: Fetching a token for a system app via the browser on our developer portal WILL NOT WORK as browser requests to the token endpoint must use PKCE. Instead, send the request through a server side/native method and ensure the 'Origin' header isn't present. # Authentication Endpoints Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/authentication-endpoints/overview These APIs allow apps to authenticate themselves or their end users with fabric Identity. The objective of these APIs is to return an access token to apps, which can then be used to invoke other fabric APIs. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/identity.json) # Concepts Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/concepts ### App All API clients calling any of the fabric platform APIs are logically defined within fabric Identity as **apps**. Each app needs to secure an access token from fabric Identity before invoking other fabric APIs. ### Authentication **Authentication** is the mechanism of validating the identity of an app or its end user with fabric Identity. Once the app or end user is confirmed, fabric Identity generates and signs an access token. This access token is used by apps as a [bearer token](https://datatracker.ietf.org/doc/html/rfc6750) to call fabric platform APIs. ### Authorization **Authorization** is the mechanism that restricts access to certain APIs after successful authentication. fabric Identity supports role-based access control of all its platform APIs. This means applications and application end users can be assigned the necessary roles to access only required fabric platform APIs. ### Access Control If users are who they say they're (authentication), and they have permission to access resources (authorization), **access control** verifies that the user has permission to access the requested resource. ### Authentication/Authorization/Access Control Example Pat E. Smith and Sandy Beaches both have reservations at the fabric Arms hotel. Pat, however, is a member of the hotel’s loyalty program, and will have a deluxe room, with access to the fabric Lounge, while Sandy has reserved a regular room. Pat and Sandy show up at the same time to check in. The front desk agents ask them for their driver’s licenses to make sure they're who they say they are. This is **authentication**. While preparing the key cards for the two guests, the hotel system **authorizes** Pat for access to a specific deluxe room, the fabric Lounge, and the hotel’s exercise room. It also **authorizes** Sandy for access to a specific standard room, and the hotel’s exercise room. Once made and programmed, Pat and Sandy receive their key cards. Pat and Sandy go to their individual rooms, and their key cards provide access to their rooms. Pat goes down to exercise, and the key card reader on the exercise room acknowledges that the key card has been authorized for that room. Sandy, who is a bit of a rebel, tries to get into the fabric Lounge. The key card reader on the lounge door sends the card info to the **access control** server, which determines that Sandy doesn't have access, and Sandy isn't allowed in the lounge. ### App Types App types help determine how apps authenticate with fabric Identity and use its features. ![User App vs System App](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/user-app-vs-sys-app.png "User App vs System App") A **user app** uses fabric Identity to authenticate its end users. Based on the flow selected (*Authorization Code Flow* or *Authorization Code Flow with PKCE*), the app needs a client ID and optionally a client secret. A user app relies on the login page hosted by fabric Identity to log in its end users. This is suitable for e-commerce apps that direct their authentication and authorization needs to fabric Identity. fabric Identity provides several out-of-the-box features for such applications; this allows developers to focus on the user commerce experience, rather than on user login, authentication, and authorization. A **system app** generates an access token to identify itself using a client ID and client secret. These apps don't use fabric Identity to authenticate their end users; rather they use system-to-system communications with fabric APIs. Typical use cases include applications like ERP, OMS, and WMS making calls to fabric APIs to update inventory, change pricing rules, refund orders, etc. ### User Pools **User pools** help developers provide single sign-on capability to their applications' end users. ![User Pools](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/user-pools.png "User Pools") Before using fabric Identity to implement single sign-on, it's important to define user pools and associate the pools with one or more user app. User apps in the same user pool can validate the access token of any logged-in pool user, allowing SSO within that pool. New users registering themselves in a user app (for example, shopper self-registration in the ecommerce app) will be created in the user pools associated with the user app. Apps can then use the user's access token to switch between user apps within the same user pool. As system apps don't authenticate any end users, they're not associated with user pools. ### Access Token An **access token** is a [signed JWT token](https://en.wikipedia.org/wiki/JSON%5FWeb%5FToken) provided to an app after successful authentication by fabric Identity. After an access token that has been provided to a user app for an individual end user has been successfully authenticated, it will be referred to as a **user token**. An access token provided to a system app serves the app itself, rather than an end user, and is referred to as a **system token**. User tokens and system tokens should be authentication Bearer tokens when invoking fabric platform APIs. By default, user tokens are valid for 30 minutes. Once a user's access token is expired, a user app can get a new access token for the end user by using the refresh token. This avoids requiring the logged-in end user to go through the login page again. By default, system tokens are valid for 10 minutes. Once expired, system apps must reauthenticate and generate a new access token. Refresh tokens aren't generated for system apps. ### Refresh Token A **refresh token** is a [signed JWT token](https://en.wikipedia.org/wiki/JSON%5FWeb%5FToken) received by a user app, along with the access token. A user app uses the refresh token to get a new access token once the previous token expires, without having the end user go to a login page again. Every time a refresh token is used to get a new access token, a new refresh token is also generated. This token should be stored by the app and should be treated as sensitive as an access token itself. ### OpenID Connect **OpenID Connect** is an established standard based on OAuth 2.0, which defines authentication flows specific to the needs of cloud based applications. Please refer to [OpenID Connect](https://openid.net/connect/) for further details. fabric Identity supports the following flows within OpenID Connect: * *Authorization Code Flow with PKCE*: Recommended for all **web app** apps * *Client Credential Flow*: For all **headless** apps For devices and applications that don't support PKCE, fabric Identity supports the regular *Authorization Code Flow (without PKCE)*. However, this option is recommended only when the app has a [backend for frontend](https://medium.com/mobilepeople/backend-for-frontend-pattern-why-you-need-to-know-it-46f94ce420b0) pattern implemented. # Getting Started with System Apps Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/system-apps/getting-started-with-system-apps Create a system app with fabric Identity and ensure the following details are available before starting the authentication flow. `client-id` - A unique ID that represents the system app, and is required for OpenID Connect authentication flows. `client-secret` - An app-specific secret that allows fabric Identity to validate the system app. This secret is mandatory for system apps to integrate with fabric Identity. `Authorization Url` - The fabric Identity HTTP endpoint that the system app communicates with to get its access token. Every fabric merchant is provided with a unique URL. Currently, fabric customers don't have a self-service capability to create the system app and get the `client-id`, `client-secret`, and `Authorization Url` by themselves. Contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new) for help in creating these. # System App Authentication Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/system-apps/system-app-authentication A system app uses OpenID Connect's [Client Credential Flow](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4) to obtain an access token referred to as **system token**. Before starting, ensure the necessary app credentials and URLs are available as mentioned in the [Getting Started](/v3/api-reference/authentication-v3/authentication-endpoints/fetch-access-token) guide. ### Getting system token In the [Client Credential Flow](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4), get an access token by calling the `/token` endpoint: `curl --location --request POST '${Authorization Url}/v1/token' \ --header 'accept: application/json' \ --header 'authorization: Basic ' \ --header 'cache-control: no-cache' \ --header 'content-type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'scope=s2s' ` The `authorization:` header in the request above is determined per [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic%5Faccess%5Fauthentication) where the `client-id` and `client-secret` are used as *username* and *password*, respectively. `Authorization Url` is a unique URL of each fabric merchant. It's common across all system apps defined for a single merchant. fabric Identity returns the access token in the following response: `{ "token_type": "Bearer", "expires_in": 600, "access_token": "eyJraWQiOiIt...", "scope": "s2s" } ` `access_token` is the system token generated by fabric Identity and is used by the system app for all subsequent fabric API calls. System token expiration is set to 10 minutes (600 seconds) by default. Once the token expires, the API client is expected to generate another access token using the same HTTP call shown above. ### Using system token Upon receiving a valid access token, the API client can call any fabric API by specifying the `access_token` as the [Bearer token](https://datatracker.ietf.org/doc/html/rfc6750) in the `authorization` header: `curl --location --request GET '${fabric Endpoint Url}/v1/product' \ --header 'accept: application/json' \ --header 'authorization: Bearer ${access_token}' \ --header 'cache-control: no-cache' \ ` # Best Practices for Customizing Login Flows Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/user-apps/best-practices-for-customizing-login-flows fabric Identity supports only the Okta hosted login page for customizing and styling. Here are some best practices that fabric recommends when customizing the login flows. ### Login page domain name Use a subdomain of the user app's actual domain to host the login page. For example, if the user app is hosted on the domain `example.com`, use a subdomain such as `login.example.com` for the Okta org. Because the hosted login page is a redirect from the user app, making it appear under a subdomain increases the end users' confidence to provide their credentials on the login page. The Okta org domain name is also used in email communications sent to the user (welcome email, forgot password email, etc.). Make sure you test these flows during development to ensure that they're redirecting the user to the intended login page. ### Common SSO branding The hosted login page is the same for all user apps within a single user pool. Hence, if the same user pool allows single sign on for users across multiple brands, the login page should be styled and themed as a common entry point for all of the brands. ### Minimize non-login related customizations within the login page Okta uses inline JavaScript to customize its hosted login page. This allows developers to customize the login page to implement custom functionality. fabric recommends that the customizations are limited only to the user app's login functionality. For example, while it's possible to have dynamic headers and footers on the login page (by making a `fetch` call), they're not recommended on the login page because they're not related to login functionality. Instead, use static headers and footers on the login page. ### Use a separate user pool for each environment served by the same fabric merchant A single fabric Copilot merchant can support multiple user pools. If the development team is using a single sandbox for both development and staging environments of a user app, ensure that two separate user apps are created in separate user pools of the same merchant. By default, fabric Identity creates one user pool per fabric merchant. Additional user pools can be created upon request. ### Implement custom validation when extending the self-registration form Okta allows extending the user registration form to request additional details from the user during signup. For these additional fields, ensure that you implement the necessary validations in the custom login page. While Okta supports designating which of these additional details are mandatory, it can't validate field format or value. For example, it can't, by itself, validate if an entered ZIP code is a valid ZIP code. Currently, the only field types allowed are `string`, `number`, `boolean`, and `integer`. ### Understand how Okta's Sign-In Widget works Most login customization can be done by setting the appropriate configurations on Okta's Sign-In Widget, or by providing callback handlers to this widget. The API for this is documented [here](https://github.com/okta/okta-signin-widget#api-reference). fabric strongly recommends that app developers read this documentation before creating custom login pages. # Customizing Customer Login Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/user-apps/customizing-customer-login fabric Identity uses [Okta](https://www.okta.com/) for managing users, login pages, and several account management flows. In fabric Identity, a separate [Okta organization](https://developer.okta.com/docs/concepts/okta-organizations/) (org) is created for every user pool. By default, a new Okta org is created for each merchant in fabric, associated with that merchant's default user pool. Upon request, additional user pools - and Okta orgs - can be created for any merchant. Using Okta allows app developers to customize several aspects of user login and management. This section describes customizations to individual Okta orgs. ### Login Page When using user apps, the user login page is hosted by the fabric-provisioned Okta org. This login page uses simple HTML that leverages the Okta sign-in widget, and allows app developers to add additional customizations. Customization examples include: * Changing the host name of the login page to use a merchant's specific sub-domain. * Styling the login page and the sign-in widget to any custom theme using CSS. As it's plain HTML, any additional headers and footers can also be included in the login page to align with the storefront. * Including any additional login or remote calls by embedding JavaScript within the HTML page * Writing hooks into the Okta sign-in widget, which further allows Okta to handle events within the login flow. Currently, fabric supports only Okta's hosted login page. See [this page](https://help.okta.com/en/prod/Content/Topics/Settings/custom-okta-hosted-sign-in-page.htm) for further details on customizations available. ### Password Policies By default, fabric Identity applies the following password policy for end users of the user app: * Minimum of 8 character length * At least one upper case letter, one lower case letter, one number * The password shouldn't have any part of the user's name * The password shouldn't be one of the last 4 passwords (when resetting) * The user locks out by 10 unsuccessful attempts. Okta allows defining custom password policies that can customized for password strength, password aging, and lockout behavior. All of these are possible with Okta's simple configuration. More details can be found [on this page](https://help.okta.com/en-us/Content/Topics/Security/policies/configure-password-policies.htm). ### Self-Service Registration Okta allows end users to register themselves through an email verification process. This can be enabled as a feature flag on Okta and is enabled by default for new merchants within fabric. Additional details of the end users can be requested by customizing the registration form. When using fabric customer APIs, these details are also available for the new customer record created for the self-registered user. See [this page](https://help.okta.com/en/prod/Content/Topics/users-groups-profiles/usgp-self-service.htm) for further instructions on how to customize the registration form. ### Support for Social Login Storefronts often need to support social logins using Meta (formerly Facebook), Google, etc. Okta's in-built support for all major social media logins makes it easy for app developers to include this in their designs. See [this page](https://developer.okta.com/docs/concepts/identity-providers/) for instructions on how to integrate social logins with the login page. ### Email Templates Okta provides the ability to customize auth-related emails sent to end users according to a merchant's branding and styling. It allows simple branding changes by defining foreground and background color schemes, including merchant logos, and customizing the sender email ID. For extensive customizations, it also provides an HTML-based template editor for individual emails. fabric Identity supports the following emails sent through Okta: * Registration * Email verification * User activation * Forgot password Please contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new) to get access to Okta org in order to perform these customizations. # Getting Started with User Apps Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/user-apps/getting-started-with-user-apps fabric Identity provides a default user pool for all user apps created by a particular merchant. If the developers need to separate the user app end users, new user pools can be created and associated with the respective user apps. Before integrating a user app with fabric Identity, determine the authentication scenario for the app by answering the following questions: * Does this user app need to share end users with other apps? If so, have the necessary user pools been created? * Which flow will the user app use? * *Authorization Code Flow with PKCE*: fabric recommends using this flow for all user applications unless there is no PKCE support available within a specific device or browser. * *Authorization Code Flow*: This is the classic [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1%5F0.html#CodeFlowAuth) mentioned in the OpenID Connect specification. It should be used only if PKCE flow isn't supported in the app environment. This flow requires a [backend-for-frontend](https://samnewman.io/patterns/architectural/bff/) layer within the user app that, in turn, integrates with fabric Identity. * What's the user app's domain name? This is required for fabric Identity to whitelist the application's `redirect-url`, which is required as part of the authentication flow. Once these questions are answered, create a user app to represent the actual app being built, and provide the user pool, authorization flow, and app domain details determined above. If you need new user pools, create them before creating the user apps. Before integrating with fabric Identity, ensure the following details are available for each user app : `client-id` - A unique ID that represents the user app, and is required for OpenID Connect authentication flows. `client-secret` - An app-specific secret that allows fabric Identity to validate the user app. This is required only if the user app will use the classic [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1%5F0.html#CodeFlowAuth) defined in the OpenID Connect specification. `Authorization Url` - The fabric Identity HTTP endpoint that the user app communicates with to get its access token. Currently, fabric customers don't have self-service capability to create user pools and user apps by themselves. Contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new) for help in creating these. # Migrate Existing Users to a User App Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/user-apps/migrate-existing-users-to-a-user-app fabric's customers often need to migrate existing users from their current IDP solutions to fabric Identity. This can be achieved by using the *bulk user import feature* available in fabric Identity. To help perform the import, provide fabric Identity with a CSV file containing the following details about each user. | Column Name | Is Mandatory | Comments | | ------------ | ------------ | --------------------------------------- | | `id` | Yes | Row identifier in the CSV | | `firstName` | Yes | User's first name | | `lastName` | Yes | User's last name | | `middleName` | No | User's middle name | | `email` | Yes | User's email address | | `login` | Yes | User's login ID (usually email address) | Note: * Column names in the CSV file must match those above. * User uniqueness is based on email. * This process doesn't support passwords. If users have additional fields to be imported, please refer to fabric's [Customer API documentation](/v3/api-reference/customers/customer-profile/add-a-new-customer). ### End user experience Following successful bulk user import, the end users must use the forgot password flow (available from the login page) to reset their passwords. fabric recommends that the login page be customized to prompt the users about the security solution change, and to use the forgot password flow to reset their passwords. Currently, this bulk user import can be performed only by fabric, upon request. Contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new) for help with user imports. # User App Authentication Source: https://developer.fabric.inc/v3/getting-started/authentication-v3/user-apps/user-app-authentication A user app can authenticate with fabric Identity in one of two ways: * [Authorization Code Flow with PKCE](https://datatracker.ietf.org/doc/html/rfc7636) * [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1%5F0.html#CodeFlowAuth) ### Using Authorization Code Flow with PKCE (recommended) This flow requires the following parameters (for more information, see the [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) guide): `client-id` - A unique ID that represents the user app, and is required for OpenID Connect authentication flows. `Authorization Url` - The fabric Identity HTTP endpoint that the user app communicates with to get its access token. Once these are available, you can build the authentication flow as depicted below: ![Authentication Flow with PKCE](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/auth-flow-with-pkce.png "Authentication Flow with PKCE") **1. Generate PKCE `code-verifier` and `code-challenge`** In this step, the single page app or mobile app, represented by the respective user app in fabric Identity, generates a `code-verifier`, which you will use to generate the `code-challenge`. These codes ensure that the access token returned by fabric Identity (step 8) is returned to the correct requestor. `code-verifier`: Random URL-safe string of at least 43 characters. [Click here](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1) for more details. `code-challenge`: Base64 URL-encoded SHA-256 hash of the `code-verifier`. The app should store the `code-verifier` securely to be used later (step 6). The `code-challenge` is sent earlier in the call to the `/authorize` endpoint (step 2). **2. Authorization code request with `code-challenge` to `/authorize`** In this step, the app should send a GET request to fabric Identity's `/authorize` endpoint and load the GET URL into the `window.location`. This allows fabric Identity to send a browser redirect, and take the end user to the hosted login page. This is a representation of the URL that should be constructed and loaded into `window.location`: ``` https://${Authorization Url}/v1/authorize?client_id=${client-id}&response_type=code&scope=openid&redirect_uri=${redirect-uri}&state=${state}&code_challenge_method=S256&code_challenge= ``` * `Authorization Url`: The URL made available upon creating a user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `client-id`: A unique ID that represents the user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `redirect-uri`: The URI that fabric Identity redirects to after successful authentication. This should be a URI of the requesting user app and should contain a temporary authorization code (see step 5). The app should use the query parameters on the `redirect-uri` to complete the authentication flow with fabric Identity. * `state`: An opaque value (can be a random string) the app uses to maintain state between the request and callback from fabric Identity. This parameter is typically used for preventing cross-site request forgery. [Click here](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1) for more information. * `code_challenge`: An SHA256 hash of the `code-verifier`. [Click here](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2) for more details. **3. fabric Identity sends 302 redirect to authentication prompt** As a response to step 2, fabric Identity sends a redirect to the client browser to bring up the hosted login page. This hosted login page can also be configured for social logins, sign-up, and forgot-password links. **4. Enter credentials and provide consent** End users provide their credentials for authentication. If requested to do so, they will also indicate consent to have fabric Identity share their basic profile information with the calling app. **5. Authorization code response returned to the specified redirect URI** After a successful login, fabric Identity redirects the end user to the `redirect-uri` defined in step 2. As part of this redirect, fabric Identity sends the following additional details as query parameters: * `code`: A temporary authorization code which will be returned to fabric Identity along with `code-verifier` to get an access token. * `state`: The same `state` sent by the app to fabric Identity in step 2. **6. Send authorization code with `code-verifier`** Once the app receives the redirect from fabric Identity, it validates that the `state` field matches the one sent in step 2. After validation, the app fetches an access token by using the `code` to make a POST request to fabric Identity. Example of the POST request (represented as a curl command): ```bash curl --request POST \ --url https://${Authorization Url}/v1/token \ -H 'accept: application/json' \ -H 'content-type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code' -d 'client_id=${client-id}' -d 'redirect_uri=${redirect-uri}' -d 'code=${code}' -d 'code_verifier=${code-verifier}' ``` * `Authorization Url`: The URL made available upon creating a user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `client-id`: A unique ID that represents the user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `redirect-uri`: The same URI that the app originally sent to fabric Identity in step 2. * `code`: The authorization code received by the app in step 5. * `code-verifier`: The original `code-verifier` generated by the app in step 1. **7. Validate `code-verifier`** Once the POST request is received by the `/token` endpoint, fabric Identity validates the `code-verifier` by computing its SHA256 value, and verifying that against the `code-challenge` the app sent in step 2. If successfully validated, the endpoint returns the response, which includes the access token (next step). **8. Respond with access token** Upon successful `code-verifier` validation, fabric Identity returns the response with the access token: ```json { "access_token": "eyJhbGciOiJ...", "expires_in": 3600, "id_token": "eyJhbGciOiJI...", "refresh_token": "cBMrwDsXRwPqVmCQx7I5IX0jQ9-Lc_zHOgYeab1xZm4" "scope": "openid offline_access", "token_type": "Bearer" } ``` The `access_token` returned in the response above is a [user token](/v3/api-reference/authentication-v3/concepts#access-token) that has a default expiration of 30 minutes (3600 seconds). This token is used by the app as a [bearer token](https://datatracker.ietf.org/doc/html/rfc6750) to access fabric APIs. The response also contains a `refresh_token`, which the app can use to fetch a new `access_token` when previous one expires. **9. Request fabric platform API access using access token as bearer token** The app can now invoke any fabric API using the `access_token` received in the previous step. This token is sent in the `Authorization` header as a `Bearer` token, which is then validated by the fabric API. App developers can use third-party libraries ([Click here](https://www.npmjs.com/package/js-pkce) for an example) to achieve the authentication flows described above. ### Using Authorization Code Flow fabric recommends using authorization code flow only when lacking browser support for PKCE. Also, as this flow needs the user app to pass the `client-secret`, it's essential that the app implements a backend for frontend (BFF) layer to exchange tokens with fabric Identity. Ensure the following parameters are available before getting started with this authentication flow (for more information, see the [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-user-apps) guide): `client-id` - A unique ID that represents the user app, and is required for OpenID Connect authentication flows. `client-secret` - An app-specific secret that allows fabric Identity to validate the user app. `Authorization Url` - The fabric Identity HTTP endpoint that the user app communicates with to get its access token. Once these are available, you can build the authentication flow as depicted below: ![Authentication Flow](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/auth-code-flow.png "Authentication Flow without PKCE") **1. Authorization code request to /authorize** In this step, the app should send a GET request to fabric Identity's `/authorize` endpoint and load the GET URL into the `window.location`. This allows fabric Identity to send a browser redirect, and take the end user to the hosted login page. This is a representation of the URL that should be constructed and loaded into `window.location`: ``` https://${Authorization Url}/oauth2/default/v1/authorize?client_id=${client-id}&response_type=code&scope=openid&redirect_uri=${redirect-uri}&state=${state} ``` * `Authorization Url`: The URL made available upon creating a user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `client-id`: A unique ID that represents the user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-userapps) for more details. * `redirect-uri`: The URI that fabric Identity redirects to after successful authentication. This should be a URI of the requesting user app and should contain a temporary authorization code (see step 4). The app should use the query parameters on the `redirect-uri` to complete the authentication flow with fabric Identity. * `state`: An opaque value (can be a random string) the app uses to maintain state between the request and callback from fabric Identity. This parameter is typically used for preventing cross-site request forgery. [Click here](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1) for more information. * `code_challenge`: An SHA256 hash of the `code-verifier`. [Click here](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2) for more details. **2. fabric Identity sends 302 redirect to authentication prompt** As a response to step 1, fabric Identity sends a redirect to the client browser to bring up the hosted login page. This hosted login page can also be configured for social logins, sign-up, and forgot-password links. **3. Enter credentials and provide consent** End users provide their credentials for authentication. If requested to do so, they will also indicate consent to have fabric Identity share their basic profile information with the calling app. **4. Authorization code response returned to the specified redirect URI** After a successful login, fabric Identity redirects the end user to the `redirect-uri` defined in step 1. As part of this redirect, fabric Identity sends the following additional details as query parameters: * `code`: A temporary authorization code which will be returned to fabric Identity. This code would be used in step 5 and 6 to finally fetch the access token. * `state`: The same `state` sent by the app to fabric Identity in step 1. **5. Send authorization code to BFF** The browser component of the user app sends the `code` (received in step 4) to the BFF (backend for frontend) component of the app. This is done so that browser loading JS files can avoid having the `client-secret` visible to the end user. This is a custom implementation done by the developer, as it's a call between the browser and the BFF layer of their user app. **6. Send `client-secret` to fetch access token** The BFF layer of the user app sends the `code` (received in step 5) along with the `client-secret` to authorization server. Upon validating the `client-secret`, the authorization server sends the access token in the response of this call. Following is an example of the POST request that's made by the BFF layer to the authorization server: ```bash curl --request POST \ --url https://${Authorization Url}/v1/token \ -H 'accept: application/json' \ -H 'content-type: application/x-www-form-urlencoded' \ -H 'Authorization: -d 'grant_type=authorization_code' -d 'redirect_uri=${redirect-uri}' -d 'code=${code}' ``` * `Authorization Url`: The URL made available upon creating a user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-user-apps) for more details. * `client-id`: A unique ID that represents the user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-user-apps) for more details. * `client-secret` - An app-specific secret that allows fabric Identity to validate the user app. * `redirect-uri`: The same URI that the app originally sent to fabric Identity in step 2. * `code`: The authorization code received by the app in step 5. Upon successful validation of `client-secret`, fabric Identity returns the response that includes the access token: ```json { "access_token": "eyJhbGciOiJ...", "expires_in": 3600, "id_token": "eyJhbGciOiJI...", "refresh_token": "cBMrwDsXRwPqVmCQx7I5IX0jQ9-Lc_zHOgYeab1xZm4" "scope": "openid offline_access", "token_type": "Bearer" } ``` The `access_token` returned in the response above is a [user token](/v3/api-reference/authentication-v3/concepts#access-token) that has a default expiration of 30 minutes (3600 seconds). This token is used by the app as a [bearer token](https://datatracker.ietf.org/doc/html/rfc6750) to access fabric APIs. The response also contains a `refresh_token`, which the app can use to fetch a new `access_token` when previous one expires. **7. Send the access token to save in session storage** This is a custom implementation done by the developer ensuring that the access token is saved on the end user's session store within the browser so that it can be used by the user app in all subsequent calls to fabric APIs. **8. Request fabric platform API using access token as bearer token** The app can now invoke any fabric API using the `access_token` received in the previous step. This token is sent in the `Authorization` header as a `Bearer` token, which is then validated by the fabric API. ### Refresh Access Token User tokens generated by fabric Identity have a default expiration of 30 minutes. Refresh tokens, on the other hand are longer-living tokens and can be used to retrieve new access tokens without asking the end user to login again. For security reasons, every time a refresh token is used to get a new access token, the previous refresh token is discarded and a new one is created. Refresh tokens are also discarded if not used for seven days. If a refresh token expires, the app can follow the previous authentication flow and have the end user login again. Sample call to get a new access token from a refresh token: ```bash curl --location --request POST 'https://${Authorization Url}/v1/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=refresh_token' \ --data-urlencode 'redirect_uri=${redirect-uri}' \ --data-urlencode 'scope=offline_access openid' \ --data-urlencode 'refresh_token=${refresh-token}' \ --data-urlencode 'client_id=${client-id}' ``` * `Authorization Url`: The URL made available upon creating a user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-user-apps) for more details. * `client-id`: A unique ID that represents the user app. See [Getting Started](/v3/api-reference/authentication-v3/user-apps/getting-started-with-user-apps) for more details. * `redirect-uri`: The same URI that the app originally sent to fabric Identity in step 2. * `refresh-token`: Refresh token received by the app along with the access token. Sample response sent from fabric Identity for the refresh request: ```json { "token_type": "Bearer", "expires_in": 3600, "access_token": "eyJraWQiO...", "scope": "offline_access openid", "refresh_token": "jSdVOtddMk8HMHP...", "id_token": "eyJraWQ..." } ``` The response contains both a new `access_token` and a new `refresh_token`. # Adding Team Members Source: https://developer.fabric.inc/v3/getting-started/copilot/adding-team-members ### Overview fabric users with administrator privileges can invite new users to their organization’s fabric account by adding the new user’s email address in the **User Management** page in Copilot. Adding a new user involves setting their role, which controls their level of access. This is called role-based access control. By assigning roles, you can prevent unintended changes or data entry errors. There are many different roles that are specific to different fabric products. Prior to adding any users, it's recommended to read through the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control) topics. ### Related Topics * [Inviting Users](/v3/platform/settings/user-management/inviting-users) * [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control) * [Product Catalog Roles](/v3/platform/settings/rbac/role-based-access-control-products-roles) * [Experiences Roles](/v3/platform/settings/rbac/role-based-access-control-experiences-roles) * [Offers Roles](/v3/platform/settings/rbac/role-based-access-control-offers-roles) * [Orders and Inventory Roles](/v3/platform/settings/rbac/role-based-access-control-orders-roles) * [Customers Roles](/v3/platform/settings/rbac/role-based-access-control-customers-roles) # Copilot Overview Source: https://developer.fabric.inc/v3/getting-started/copilot/copilot-overview Copilot is the web-based user interface to access the features in the fabric commerce platform. The suite of applications available via Copilot provide solutions to manage digital commerce needs directly, using online forms and prebuilt web components thereby reducing dependence on technical development resources and custom code. These applications can be used as individual components that can be launched quickly and easily, regardless of your existing infrastructure, capabilities, or third-party partnerships. ### Prerequisites You will need an active account to access Copilot. Contact your Copilot system administrator or fabric Customer Success Representative to obtain these credentials. ### Authentication Users must be invited to Copilot by a system administrator. Once invited, they will receive an email containing a link to Copilot. On first log in, the user will set their password. Subsequent logins will require the Account ID, user email, and password for credentials. ### Navigation Users navigate through Copilot applications using the left navigation. This navigation remains at the left-hand side of the page for easy access. Click the double-carat icon at the bottom-left to expand and contract the left navigation. Users navigate within each Copilot application using navigation panels on the left-hand side of each individual application. # Product Catalog AI Source: https://developer.fabric.inc/v3/getting-started/copilot/fabric-ai/catalog-ai Product Catalog AI is [fabric AI’s](/v3/guides/get-started/fabric-ai/overview) specialized functionality for **Product Catalog**, designed to help retailers optimize and maintain high-quality product data. By providing targeted insights and recommendations, Product Catalog AI enables merchandisers to enhance product visibility, align content with brand and SEO standards, and ensure accurate, engaging product information across channels. ## Key Capabilities ### Product description analysis Product Catalog AI evaluates product descriptions using a set of proprietary criteria to surface content to users that's non-optimized. Some of the evaluation criteria used includes: accuracy, clarity, SEO, and unique merchant preferences such as tone of voice. A detailed analysis is shown to the user with a score of 'Good' or 'Poor' for each criteria, as well as a written explanation for how each score was determined. This analysis of descriptions is done in real time, reduces manual efforts by days, if not weeks, and helps merchandising teams focus on products that need optimization. ### Content generation Product Catalog AI generates optimized product descriptions tailored to your industry, brand voice, and SEO requirements. For example, if you sell home decor, Product Catalog AI can update a generic description, such as "A stylish lamp for your living room" into "Elevate your living space with this modern table lamp featuring a sleek brushed metal finish and adjustable brightness—perfect for creating a cozy ambiance." These improvements help you create compelling content more efficiently. ### Automated Workflows Product Catalog AI gives the user quick actions such as 'Apply Suggestion' to automatically navigate the user to the appropriate page to implement the recommended content. It makes analyzing, generating, and updating descriptions a breeze so merchandising teams can push their updated product data to all sales channels immediately. ## Use Case A merchandiser at a home furnishings retailer receives a report that shows sales for the *decorative mirrors* category of products are under-performing, particularly in regards to SEO. They suspect the issue might lie with the product descriptions and metadata, but lack the time for a manual review. ### Using Product Catalog AI The merchandiser uses Product Catalog AI to analyze the decorative mirrors category. 1. The merchandiser sends a custom query: *How can I improve the SEO and conversion rates for decorative mirrors?* 2. The Product Catalog AI evaluates the category’s product descriptions and provides actionable insights in the following areas: * Product descriptions are too generic and lack relevant keywords. * Product Catalog AI generates custom descriptions that match the retailer’s brand voice and are optimized for SEO best practices. 1. After reviewing the recommendations, the merchandiser applies the updates with a single click. The updated descriptions are published to sales channels in real-time to boost the category’s SEO rankings, driving more organic traffic to the retailer’s site. Improved product visibility might lead to increased customer engagement and higher conversion rates, addressing the initial issue efficiently. ## Related Topics * [fabric AI Overview](/v3/getting-started/copilot/fabric-ai/overview) * [Fulfillment AI](/v3/getting-started/copilot/fabric-ai/fulfillment-ai) # Fulfillment AI Source: https://developer.fabric.inc/v3/getting-started/copilot/fabric-ai/fulfillment-ai Fulfillment AI is [fabric AI’s](/v3/getting-started/copilot/fabric-ai/overview) assistant for optimizing order fulfillment and inventory processes. Designed to streamline operations and enhance decision-making, Fulfillment AI helps retailers address distribution inefficiencies and shipping issues while reducing costs and improving customer satisfaction. Fulfillment AI offers a proactive, data-driven approach to managing complex fulfillment workflows by providing actionable insights and recommendations tailored to your unique inventory and order fulfillment needs. ## Key Capabilities ### Improve order consolidation rate Fulfillment AI helps consolidate orders effectively by analyzing fulfillment patterns and identifying opportunities to combine shipments. This reduces the frequency of split shipments and minimizes shipping costs. ### Reduce overselling By monitoring real-time inventory levels, Fulfillment AI ensures accurate stock availability across all sales channels. It identifies potential overselling risks and allows users to take corrective actions, such as reallocating stock or adjusting order limits, to maintain customer trust and satisfaction. ### Update fulfillment rules and inventory quickly Fulfillment AI streamlines operational adjustments by offering users the ability to modify fulfillment rules and inventory settings directly within Copilot. This flexibility allows users to respond quickly to changing conditions, such as supply chain disruptions or shifts in demand, without requiring extensive manual intervention. ## Use Case A national retailer specializing in electronics relies on fabric to manage its distributed fulfillment network, which includes regional warehouses and physical stores. During a peak sales period, the retailer notices a spike in split shipments and delayed orders in certain regions. These inefficiencies are increasing shipping costs and putting delivery timelines at risk, potentially impacting customer satisfaction and eroding profit margins. ### Using Fulfillment AI The retailer’s operations manager uses Fulfillment AI to investigate the root causes of delayed shipments and high split order rates. Fulfillment AI identifies a combination of low inventory levels in key locations and inefficient allocation rules as the primary issues. It suggests the following solutions: * De-prioritize under-performing locations. * Reallocate inventory to regions with higher demand. In addition, Fulfillment AI proactively identifies SKUs contributing to the inefficiencies and provides tailored recommendations to adjust stock levels and allocation rules. The operations manager reviews and applies the recommendations directly within Copilot. Fulfillment AI ensures that all updates meet predefined schema requirements and are implemented in real-time. ### Outcome By using Fulfillment AI, the retailer reduces split shipments, improves order lead times, and lowers overall shipping costs. These improvements enhance customer satisfaction and optimize operational efficiency, helping the retailer maintain a competitive edge during high-demand periods. ## Related Topics * [fabric AI Overview](/v3/getting-started/copilot/fabric-ai/overview) * [Product Catalog AI](/v3/getting-started/copilot/fabric-ai/catalog-ai) # Overview Source: https://developer.fabric.inc/v3/getting-started/copilot/fabric-ai/overview fabric AI is an innovative business assistant that analyzes real-time data, identifies issues, and offers tailored solutions to provide actionable insights for retailers to streamline operations, optimize workflows, and improve decision-making. fabric AI's natural language interface in Copilot allows users to ask their own questions, or select from prompts, such as *Which locations could be impacting my margins?* or *Which products need improved SEO descriptions?* to uncover and address potential issues before they escalate. ## Transforming Workflows fabric AI's interface is accessible directly from Copilot's homepage. After navigating to modules such as **Product Catalog**, **Orders**, or **Inventory**, fabric AI shifts to the right panel. With fabric AI as an assistant through every phase of operational workflows, users can: * **Interact with operational data:** Access and explore data to gain insights and implement changes directly within the system. * **Analyze and optimize workflows:** Gain actionable insights to improve fulfillment performance, product content, order, and inventory management. * **Automate repetitive tasks:** Reduce manual effort with recommendations and content generation. * **Respond in real time:** Address issues and make informed decisions quickly, using real-time data and insights to minimize disruptions and improve outcomes. ## Use Case A home furnishings retailer uses fabric to manage their product catalog, inventory, and fulfillment operations across its network of stores and distribution centers. The retailer specializes in high-quality furniture and decor. Their business success depends on optimizing product visibility, maintaining efficient inventory levels, and ensuring seamless order fulfillment to meet customer expectations. ### Identifying challenges During a weekly review, the merchandising team notes lagging SEO performance for several products, affecting site traffic and sales. At the same time, the fulfillment team observes an uptick in canceled orders and delayed deliveries, particularly in one region. ### Using fabric AI The teams begin by using Product Catalog AI to analyze the SEO performance of their products by asking *Which products need SEO improvements?* Product Catalog AI evaluates their products and identifies a list of under-performing products with issues such as generic descriptions, missing keywords, and inconsistent metadata. Next, they use Fulfillment AI to investigate the causes behind fulfillment inefficiencies by asking *What’s driving fulfillment issues this week?* Fulfillment AI pinpoints a cluster of stores in one region contributing to high bounce rates due to inventory shortages and performance inconsistencies. fabric AI provides tailored recommendations for both areas: * **Catalog optimization:** Product Catalog AI uncovers a popular dining table SKU identified as having poor SEO. It generates an optimized description aligned with the retailer’s branding and provides actionable metadata corrections to improve visibility. These updates are approved and published immediately. * **Fulfillment rule updates:** Fulfillment AI suggests creating a new inventory rule to prioritize high-performing locations and adjusting order orchestration rules to prevent delays. The new rule is applied with a single click, ensuring orders are routed more efficiently. ### Unlocking new opportunities With the immediate challenges addressed, fabric AI proactively identifies additional opportunities for growth. For example, it suggests expanding the product offering by adding matching chairs to the dining table category. It also recommends ongoing monitoring of fulfillment performance metrics to ensure continued optimization and identify future improvements. It also helps the retailer overcome operational hurdles while unlocking strategic opportunities. By combining insights from Catalog AI and Fulfillment AI, the teams improve product visibility, enhance fulfillment efficiency, and ensure customer satisfaction. These capabilities enable the retailer to maintain seamless operations, boost revenue, and uncover new growth opportunities—all while saving time and resources through AI-driven automation. ## fabric AI Rules fabric AI uses a rules-based framework to govern operational processes such as inventory allocation, fulfillment logic, and product data optimization. By leveraging AI-driven insights and predefined logic, fabric AI dynamically updates rules to improve efficiency, reduce errors, and enhance performance. The fabric AI rules framework operates through a structured process: * **Data Analysis:** fabric AI collects and evaluates operational data to identify inefficiencies and opportunities for improvement. Metrics and sub-metrics are tailored to each domain, such as fulfillment performance or product content quality. * **Rule Evaluation and Suggestion:** Existing rules are assessed against operational performance and predefined thresholds. fabric AI provides actionable updates to enhance efficiency and maintain consistency. * **Implementation:** Users can review and apply fabric AI’s suggestions directly in Copilot. Changes are validated for accuracy and implemented in real time, ensuring seamless integration into workflows. ## Related Topics * [Product Catalog AI](/v3/getting-started/copilot/fabric-ai/catalog-ai) * [Fulfillment AI](/v3/getting-started/copilot/fabric-ai/fulfillment-ai) # Feature Descriptions Source: https://developer.fabric.inc/v3/getting-started/copilot/feature-descriptions [Copilot](/v3/getting-started/copilot/copilot-overview) is the web-based user interface to access fabric's features, which are also called applications or products. These features enable operators to manage their digital commerce needs directly, using online forms and prebuilt web components thereby reducing dependence on technical development resources and custom code. * [Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview): fabric's powerful product information management system that enables complete product catalog administration to ensure accurate and up-to-date information across sales channels. * [Offers](/v3/offers/user-guides/offers/overview): fabric’s pricing and promotions engine with tools to manage price lists, item prices, and discounts. * [Orders](/v3/orders-and-inventory/user-guides/orders/overview): fabric's solution for centralized order, inventory, and warehouse information. Orders supports order placement, allocation, handling of back orders and pre-orders, exporting data, generating invoices, creating and managing shopping lists, sending notifications, handling cancellations and returns, order tracking, fraud checks, updating payment status, creating appeasements, creating and managing shipments, shipping methods, and more. * [Inventory](/v3/orders-and-inventory/user-guides/inventory/overview): fabric's resource for tracking inventory across networks and locations. # Glossary Source: https://developer.fabric.inc/v3/getting-started/copilot/glossary ## A ### Access control A method to verify that the user has permission to access the requested resource. ### Access token A signed JSON web token provided to an application after successful authentication by fabric Identity. It serves as a Bearer token when starting fabric platform APIs. ### Account The primary entity through which the commerce solutions are delivered to the fabric product customers. It acts as the dedicated repository for all their data. Customers have the option to create multiple accounts for different purposes, ensuring data segregation. When you log in to Copilot, you gain access to the specific contents of the account belonging to the customer of fabric products. This customer refers to the user of fabric products and not the customers of stores using fabric services. ### Account ID A custom header used by the API to identify the tenant making the request, found in the Copilot application. Tenant ID is required to access any of fabric’s endpoints. Related Terms: * [Tenant ID](#tenant-id) ### [Allocation](/v3/orders-and-inventory/api-reference/orders/allocations/overview) The record specifying the locations from which an order is fulfilled, allowing retailers to manage order allocations. ### App All API clients or applications that call any of the fabric platform APIs. Each application requires a bearer token authentication to interact with other fabric APIs. For example, Order Management System (OMS) or Enterprise Resource Planning (ERP). ### App name The name of the application. ### App type The type of the application, such as [system app](#system-app) or [user app](#user-app). The app type helps you determine the authentication process. ### [Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/attributes) A specific characteristic, quality, or feature of a product or category, used to describe, classify, or differentiate items within a system or platform. fabric Product Catalog supports two types of attributes, such as [product attributes](/v3/guides/product-catalog/attributes/product-attributes-overview) and [category attributes](/v3/guides/product-catalog/attributes/category-attributes-overview). ### [Attribute groups](/v3/product-catalog/user-guides/product-catalog/settings/attribute-groups-overview) A collection of product attributes that helps categorize products into various semantic groups based on meaning and purpose, allowing for easier management and organization of products in the catalog. ### Authentication The mechanism of validating the identity of an application or its end user with fabric Identity. After validating the identity, fabric Identity generates and signs an access token, used as a bearer token to call fabric platform APIs. ### Authorization A method to restrict access to certain APIs after successful authentication, supporting role-based access control of fabric's platform APIs. ## B ### Base price The regular amount that a merchant charge shoppers to purchase an item. These are specified within a [price lists](#price-lists). ### Base URL The standard URL to which the requests are sent for all fabric APIs. Related terms: * [Location](#location) ## C ### Cart and Checkout (CnC) fabric's service for the management of online shopping [carts](/v3/cart-and-checkout/api-reference/carts-v3/overview), including items and configuration of shipping, fulfillment, and payment options. ### Categories [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview), also called hierarchies or nodes, form a hierarchical tree structure to organize items and services into a group. Related terms: * [Hierarchy](#hierarchy) * [Node](#node) ### Channel A specific avenue or method through which a merchant sells their products or services. It indicates the source of a sale and can include various options such as web storefronts, retail stores, mobile apps, or other platforms. ### [Client ID](/v3/platform/settings/api-apps/getting-system-app-credentials) A unique ID that represents the [system app](#system-app), and is required for OpenID Connect authentication flows. ### [Client secret](/v3/platform/settings/api-apps/getting-system-app-credentials) An app-specific secret that allows fabric Identity to validate the app. This secret is mandatory for [system apps](#system-app) to integrate with fabric Identity. ### Collections [Collections](/v3/product-catalog/user-guides/product-catalog/collections/collections) create a representational categorization of products and are primarily used by merchants for short-term marketing campaigns. ### [Copilot](https://live.copilot.fabric.inc/) The web-based user interface to access all fabric applications. ### [Counters](/v3/orders-and-inventory/api-reference/inventory/counters/overview) Inventory positions such as, available, in-transit, on-hand, or other custom positions ### [Coupons](/3/offers/user-guides/offers/coupons/overview) Discounts on items, carts, or shipping that are applied to qualified purchases when shoppers provide a valid coupon code during the checkout process. ### Customer The user of fabric products. ### Customer organization A customer organization, also called a customer org, is a customer entity that can encompass multiple accounts or tenants. It provides a structure for managing multiple accounts within a single organization. ## E ### Endpoint The API communications channel, which is a specific URL or address in a web service or API, where client applications can access or interact with the service to retrieve or send data. Related terms: * [Resource](#resource) ## F ### fabric Customer fabric service that allows you to manage information for the customers and organizations you do business with, including the contracts you may have with them. ### fCP fabric Commerce Platform (fCP) offers a range of features to manage various aspects of your storefront, including merchandising, pricing, promotions, inventory, order processing, and shopper data. For your business operations, you can interact with fCP through fabric's administration interface called [Copilot](https://live.copilot.fabric.inc/). ## H ### Header This flag is used to include headers in the API request. The most commonly used headers in fabric APIs are described in the Getting Started with fabric API section. ### Hierarchy A tree structure to organize items and services into a group. Related terms: * [Category](#categories) * [Node](#node) ## I ### [Inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/overview) A repository of product availability for order fulfillment. ### Item A standalone service or commodity sold individually. An item is also referred to as a product. ### Item variant A different version of a base product. An item variant is also referred to as a child product. Related Terms: * [Variant](#variants) ## L ### Location The standard URL to which the requests are sent for all fabric APIs. Related Terms: * [Base URL](#base-url) ## M ### Mapping Mapping, also called [attribute mapping](/v3/product-catalog/api-reference/product-catalog/attributes-mapping/overview), provides you the flexibility to create attributes with your preferred names. ### Merchant The paying customer who uses fabric's services. ### Multichannel A merchant who sells their products or services through multiple sales channels, which could encompass web, retail, mobile, and other diverse avenues, for reaching customers. ### Multi use [Multi-use coupon code](#multi-use-coupon-code) ### Multi-use coupon code A coupon code that can be used by multiple customers up to the specified limit. ### Multitenant An infrastructure model used by fabric to manage multiple customers, the users of fabric products, on shared infrastructure, including shared compute and storage resources. ## N ### Network A group of locations that share inventory. ### Node A tree structure to organize items and services into a group. Related terms: * [Category](#categories) * [Hierarchy](#hierarchy) ## O ### Offer A combination of items, their respective prices, and any relevant discounts that a shopper can avail of. Offers remain valid for a limited duration and expires after that. ### [Offers](/v3/offers/api-reference/offers/offers--3-0-0) fabric’s pricing and promotions engine with tools to manage price lists, item prices, and discounts. ### OpenID Connect An established standard based on [OAuth 2.0](https://oauth.net/2/), defining authentication flows specific to cloud-based applications. ### [OMS](/v3/guides/orders/overview) fabric’s Order Management System (OMS), also called as fabric Orders, is a distributed order management (DOM) platform that helps retailers manage the order fulfillment process and provide inventory details, order fulfillment, and customer service. ### [Orders](/v3/orders-and-inventory/api-reference/orders/orders/overview) [OMS](#oms) ## P ### [Price lists](/v3/offers/api-reference/offers/price-lists/overview) A collection of items and their assigned prices with start and end date and time for each price record. ### [Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview) A single [product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/products-api), also referred to as an item, is a service or a stand-alone item sold individually. Bundles are combinations of two or more products sold exclusively together or as individual products depending on the configuration. Within fabric, Product Catalog is used to denote the entire end-to-end product information management system. ### [Promotions](/v3/offers/api-reference/offers/promotions/overview) Discounts on items, carts, or shipping that are applied automatically if the required conditions are met. ### [RBAC](/v3/platform/settings/rbac/role-based-access-control) [Role-Based Access Control (RBAC)](/v3/platform/settings/rbac/role-based-access-control). With role-based access control in fabric, you can control and limit the access to information and actions based on the roles assigned to the users. ### Redemption The instance when a shopper uses a coupon code to make a purchase. Redemptions help track coupon limits across the site or per customer and are associated with specific orders. ### Resource The API communications channel, which is a specific URL or address in a web service or API, where client applications can access or interact with the service to retrieve or send data. Related terms: * [Endpoint](#endpoint) ## S ### Sale price The lowest amount that a merchant can charge shoppers to purchase an item without a promotion or coupon. These are specified within a [price list](#price-list). ### Scratch [Scratch item](#scratch-item) ### Scratch Item An item that's designated as unavailable within an order due to various reasons such as being damaged, out of stock, not found, or on hold. ### [Segment](/v3/offers/api-reference/offers/segments/overview) A group of customers that share similar characteristics, such as loyalty status, demographics, location, or device type. ### SKU Stock Keeping Unit (SKU). A unique identifier for each item that can be purchased or sold. Each variant of a product will also have a unique SKU to differentiate it from other variations of the same product. ### Shopper A shopper refers to the end user or consumer who interacts with a merchant's products or services, such as the storefront. ### Single-use [Single-use coupon code](#single-use-coupon-code) ### Single-use coupon code Large numbers of unique coupon codes that can be used once by an individual shopper. ### Stacking Stacking refers to the ability to combine multiple discounts on a single item, cart, or shipping, increasing the total savings for the shopper. Merchants can configure promotions and coupons to either allow stacking or prevent it. ### Store A physical retail location for brick-and-mortar merchants or a web store. A web store represents a digital storefront where products or services are displayed and sold. ### System app A [system app](/v3/platform/settings/api-apps/creating-system-app) (short for system application) is a software application that generates an access token to establish its identity by utilizing a [client ID](#client-id) and [client secret](#client-secret). Unlike regular [user apps](#user-app), system apps don't rely on fabric Identity for authenticating end users. Instead, they employ system-to-system communication with fabric APIs to fulfill their intended functionalities and services. ## T ### Tenant A customer or organization that uses fabric to manage and sell their products or services, typically through multiple channels. ### [Tenant ID](/v3/platform/settings/account-details/getting-the-account-id) A custom header used by the API to identify the tenant making the request, found in the Copilot application. Tenant ID is required to access any of fabric’s endpoints. Related Terms: * [Account ID](#account-id) ## U ### User pool The user directory where user credentials are stored. ### User app A [user app](/v3/platform/settings/api-apps/creating-user-app) (short for user application) is a software application that uses the fabric identity service to authenticate end users. ## V ### Variants A different version of a base product. An item variant is also referred to as a child product. Related Terms: * [Item variant](#item-variant) ## W ### Webhooks The feature that sends real-time notifications to a designated URL when merchants subscribe to fabric events. # Terms and Conventions Source: https://developer.fabric.inc/v3/getting-started/copilot/terms-and-conventions In the User Guide , the term *we* refers to fabric. The term *customers* may have different meanings depending on the context. Customer is used to denote the consumers of fabric's products and services and is also used to imply the service Customer, which is used to manage information for both individual customers and organizations with whom you conduct business, including any contracts in place. The term customer, when lowercase, typically refers to the users of fabric's products. However, in certain contexts where it's capitalized, it indicates fabric’s [Customer](/v3/platform/customers/overview) feature. The term product denotes any item or service available for sale. However, in specific contexts, it directly refers to fabric’s product information management tool, called [Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview). For all other terms used in fabric, see the [Glossary](/v3/getting-started/copilot/glossary). # Inventory Setup Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/inventory-setup This document is intended for merchants and their SI (System Integrator) partners who want to set up inventory. It describes the rules and procedures to set up inventory as per the business need. To set up inventory: 1. [Create Location](#create-location) 2. [Update Product Information](#update-product-information-optional) 3. [Create a Network](#create-a-network) 4. [Create or Update Inventory](#create-or-update-inventory) Refer to the following sections for additional information: * [Search Inventory](#query-inventory) * [Rules for Updating Counter Quantity](#rules-for-updating-counter-quantity) **General Rules:** * If you are using a third-party product information management system other than fabric’s Product Catalog, you must provide product details to fabric in a `.csv` file. For details, see the [Update Product Information](#updateproductinfo) section. If you are already using fabric’s Product Catalog to maintain product information, ignore this step. * To create or update inventory, you must provide `sku`, `itemId`, `location`, `channelId`, and `counters`. You can provide other details to configure the inventory based on your requirements. For details, see the [Create Inventory](#create-or-update-inventory) section. * If you are using only the *Inventory service* of fabric (not the entire OMS service), you must mention allocated and shipped counter quantities to update inventory. If you are using fabric’s OMS to manage inventory and order fulfillment, allocated and shipped counter quantities will be taken care of automatically. * Use the `onHand` counter to represent the inventory quantity that's currently in stock for selling. Per the `onHand` counter value passed in the request body, `availableToPurchase` (the virtual counter) quantity is calculated, based on the formula `onHand - allocated - shipped - safetyStock`. `safetyStock` is also subtracted if you include `safetyStock` value while creating inventory. * Subscribe to any of the inventory webhook events to get a notification for inventory updates. For sample curl and other details, see [List of Webhook Events](/v3/orders-and-inventory/api-reference/orders/developer-guide/list-of-webhook-events). ### Create location **API Mapping:** POST/v3/locations Using the `POST/v3/locations` endpoint, you can create records for your stores, with details including postal code, hours of operation, BOPIS enabled, and other custom attributes that are applicable to your business. **Request Sample:** ```JSON { "locationNumber": 23, "name": "Seattle Store", "isActive": true, "address": { "addressLine1": "123 Main St.", "addressLine2": "Suite 100", "addressLine3": "Seventh floor", "addressLine4": "Attention: Pat E. Kake", "city": "Seattle", "region": "WA", "postalCode": "98121", "countryCode": "US", "type": "Home", "contacts": [ { "type": "OFFICE", "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": [ { "number": "0281923712", "type": "MOBILE" } ], "name": { "firstName": "Pat", "middleName": "E", "lastName": "Kake" } } ] }, "type": "DC", "services": { "brand": "WHBM", "channel": "Frontline" }, "operatingHours": [ { "day": "SUNDAY", "hours": [ { "open": "10", "close": "20", "type": "PICK_UP" } ] } ], "coordinates": { "type": "Point", "coordinates": [ -122.3493, 47.6205 ] }, "attributes": { "isReturns": "true" } } ``` **Response Sample:** ```JSON { "locationId": "9372919a8219e8", "locationNumber": 23, "name": "Seattle Store", "isActive": true, "address": { "addressLine1": "123 Main St.", "addressLine2": "Suite 100", "addressLine3": "Seventh floor", "addressLine4": "Attention: Pat E. Kake", "city": "Seattle", "region": "WA", "postalCode": "98121", "countryCode": "US", "type": "Home", "contacts": [ { "type": "OFFICE", "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": [ { "number": "0281923712", "type": "MOBILE" } ], "name": { "firstName": "Pat", "middleName": "E", "lastName": "Kake" } } ] }, "type": "DC", "createdAt": "2022-05-25T07:58:30.996Z", "updatedAt": "2022-05-25T07:58:30.996Z", "operatingHours": [ { "day": "SUNDAY", "hours": [ { "open": "10", "close": "20", "type": "PICK_UP" } ] } ], "coordinates": { "type": "Point", "coordinates": [ -122.3493, 47.6205 ] } } ``` ### Update Product Information (Optional) **Note:** This step is required if you are using product management software other than fabric's Product Catalog. If you are using fabric's Product Catalog to maintain your product data, this step isn't required as product data will automatically be imported to the Catalog Connector. **API Mapping:** * Use the `PUT/products/{id}` endpoint for updating a single product by ID. * Use the `PUT/products` endpoint for updating multiple products. **Sample request to update a single product:** ```JSON { "sku": "XP-123345", "categoryId": "QWE1234CCVFDDERW21", "type": "ITEM", "attributes": [ { "id": "6d7329dfd5288b0011332311", "value": "blue" } ], "parentProduct": { "id": "AASSBCC12334FCD12334V" }, "bundleProducts": [ { "sku": "XP-123345", "quantity": 2 } ], "variants": [ { "id": "AASSBCC12334FCD12334V" } ], "localizedProperties": { "en-US": { "attributes": [ { "id": "W123333RRTT555y1", "value": "blue" } ] }, "en-IN": { "attributes": [ { "id": "W123333RRTT555AA", "value": "blue" } ] } } } ``` **Sample response for updating a single product:** ```JSON { "id": "5g7329dfd5288b00113323p7", "sku": "QWERTTY56DDFFVVV", "type": "ITEM", "isActive": true, "hasDraft": true, "hasLive": true, "status": "LIVE", "attributes": [ { "id": "227329dfd5288b0011332315", "name": "Color", "type": "string", "isDeleted": false, "value": "blue", "isInherited": true } ], "localizedProperties": { "en-US": { "attributes": [ { "id": "637329dfd5288b0011332354", "name": "Color", "type": "string", "isDeleted": false, "value": "blue", "isInherited": true } ] }, "en-IN": { "attributes": [ { "id": "8f7329dfd5288b0011332334", "name": "Colour", "type": "string", "isDeleted": false, "value": "blue", "isInherited": true } ] } }, "variants": [ { "id": "967329dfd5288b0011332356" } ], "categoryId": "7f7329dfd5288b0011332378", "createdAt": "2021-09-14T22:10:30.618Z", "updatedAt": "2021-09-14T22:10:30.618Z" } ``` ### Create a network **API Mapping:** POST/v3/inventory-networks * Network refers to a group of locations with a group of SKUs in each location. * You can create a network to map inventories for the created networks. A network code is generated for the created network. You can mention the network code while creating or updating inventories for a specific network. * You can configure safety stock quantities for a network while creating a network. Additionally, you can configure safety stock and low stock quantities while creating or updating inventories for a specific network. **Request Sample:** ```JSON { "code": "DC", "name": "Distribution Center", "safetyStock": 10, "description": "network-mar6th", "lowStock": 10, "rule": { "locationData.type": "Store", "locationData.attributes.safetyStock": 10, "locationData.isActive": true, "productData.attributes.brand": "ABC", "productData.attributes.isSoldOnline": true } } ``` **Response Sample:** ```{ "code": "DC", "name": "Distribution Center", "safetyStock": 10, "description": "network-mar6th", "lowStock": 10, "rule": { "locationData.type": "Store", "locationData.attributes.safetyStock": 10, "locationData.isActive": true, "productData.attributes.brand": "ABC", "productData.attributes.isSoldOnline": true }, "createdAt": "2022-08-01T18:03:28.483971941Z", "updatedAt": "2022-08-01T18:03:28.483971941Z" } ``` ### Create or update inventory **API Mapping:** * *POST/v3/inventories:* Create inventory * *Post/v3/inventories/action/find-and-update:* Update inventory either by replacing existing property value or by adding a new value to an existing property. 1. Set the `infiniteInventory` parameter to `true` to configure unlimited quantities of inventory. 2. Use `customAttributes` to define any custom attribute that suit your business use case. For example, you can set BOPIS (Buy Online Pickup In Store) to `true` if you are willing to allow shoppers to buy online and pick up an item from the store (based on location number). 3. If you provide values for `backOrderLimit` and `preOrderLimit` while creating inventory, `availableBackorder` and `availablePreorder` virtual-counters are displayed in the response object with the same values as provided in the request body. 4. Configure values for `safetyStock` and `lowStock` fields while creating or updating inventory for better inventory management. **Rules for updating counter quantity:** * Use the `onHand` counter to represent the inventory quantity that's currently in stock for selling. Based on the `onHand` counter value as passed in the request body, `availableToPurchase` quantity is calculated based on the formula `onHand - allocated - shipped` and displayed in the response object. * (Not required if you are using the Order module of fabric OMS) Use the “allocated” counter to represent inventory that's sent to warehouses for fulfillment (only the warehouse can cancel the order at this point). * (Not required if you are using the Order module of fabric OMS) Use the “shipped” counter to represent inventory that's marked as shipped by the warehouse (at this stage in the life-cycle the order can only be returned). * Use “backorderReserve” and “preOrderReserve” counters (under counter object) to represent inventory quantity that's permitted for backorder (reserve for restock) or pre-order (inventory quantity on launch date). **Sample request to create or update inventory:** ```JSON { "sku": "SKU123", "itemId": 12345, "locationNum": 999, "channelId": "channel1", "vendorId": "vendor1", "counters": { "onHand": 100, "allocated": 20, "shipped": 10 }, "infiniteInventory": true, "backOrderDate": "2022-10-21T14:28:06.968Z", "preOrderDate": "2022-10-21T14:28:06.968Z", "backOrderLimit": 50, "preOrderLimit": 40, "safetyStock": 10, "lowStock": 0, "networkCode": "ShipToHome",(get inventory by network) "customAttributes": { "isRetrun": true, "isBopis": true }, "networkCounters": { "softReserve": 10 }, } ``` **Response sample for creating or updating inventory:** ```JSON { "sku": "SKU123", "itemId": 12345, "locationNum": 999, "channelId": "channel1", "vendorId": "vendor1", "counters": { "onHand": 100, "allocated": 20, "shipped": 10 }, "infiniteInventory": true, "backOrderDate": "2022-10-21T14:28:06.968Z", "preOrderDate": "2022-10-21T14:28:06.968Z", "backOrderLimit": 50, "preOrderLimit": 40, "safetyStock": 10, "lowStock": 0, "networkCode": "ShipToHome",(get inventory by network) "customAttributes": { "isRetrun": true, "isBopis": true }, "networkCounters": { "softReserve": 10 }, "virtualCounters": { "availableToPurchase": 60, "availableBackorder": 50, "availablePreorder": 40 } } ``` ### Query inventory After you successfully create an inventory, you can query for inventory information either using the Copilot user interface or using the `POST/v3/inventories/actions/find` endpoint. * While searching for inventory information, you must include SKU and network code (if you have created a network) as query parameters to get the “Available to Purchase” information. * While searching for an inventory of type BOPIS (Buy Online Pickup In Store), you must include SKU, `locationNum`, and `channelId` to get information for BOPIS. **Sample request:** ```JSON { "skus": [ "SKU1" ], "itemIds": [ 127122871 ], "locationNumbers": [ 12 ], "locationTypes": [ "DC" ], "segments": [ "B2B_Special" ], "region": "North America", "networkCodes": [ "4" ] } ``` **Sample response:** ```JSON { "pagination": { "limit": 10, "offset": 1, "count": 1000 }, "data": [ { "inventoryId": "723910d81723", "sku": "SKU1", "itemId": 12345, "locationNumber": 12345, "region": "North America", "channelId": "channel_xyz", "vendorId": "vendor1", "createdAt": "2022-08-01T18:03:28.483971941Z", "updatedAt": "2022-08-01T20:03:28.483971941Z", "leadTime": "5 days", "type": "primary", "hasInfiniteInventory": false, "backorderShipmentAt": "2022-08-01T20:03:28.483971941Z", "preorderShipmentAt": "2022-08-01T20:03:28.483971941Z", "backorderLimit": 50, "preorderLimit": 40, "safetyStock": 10, "lowStock": 10, "networkCode": "ShipToHome", "counters": { "onHand": 100, "allocated": 10, "shipped": 20 }, "customAttributes": { "isBopis": true }, "networkCounters": { "softReserve": 10 }, "virtualCounters": { "availableToPurchase": 60 } } ] } ``` ### Rules for updating counter quantity * **In stock:** Use the `onHand` counter in the request body to represent inventory that's currently available in the location to sell. * **In Stock for BOPIS (Buy Online Pickup In Store) for an SKU in a specified radius of zip code or postal code:** * Use the `onHand` counter to represent in-stock inventory. * Define BOPIS using the `customAttribute` field while creating or updating inventory. * Zip code or postal code is identified based on the location number. A location number is generated for a location for which you provide all details such as name, address, type, zip or postal code, and more information while creating the location using the `create location` endpoint. * **In Stock for BOPIS in a specified store:** * Use the `onHand` counter to represent in-stock inventory. * Define BOPIS using the `customAttribute` field while creating or updating inventory. A specific store is identified by the location number. * **Adjust inventory records by increasing or decreasing counter quantity:** * Use the `onHand` counter to represent in-stock inventory. * Use the `POST/v3/inventories/actions/find-and-adjust-inventory-counters` endpoint to adjust counter quantity. You can provide the SKU, location, and counter quantity in the request payload to adjust the `onHand` counter quantity. Counter quantity accepts both positive and negative values. Based on the value you specify in the request payload for the counter quantity, the original counter quantity is either decreased or increased. For example, if the original counter quantity is 100, and you specify the counter quantity as "-10" in the request payload, then the updated `onHand` counter becomes 90. * **Displaying Backorder, Preorder, Safety Stock, and Low Stock on Website:** * If the `availableToPurchase` value is greater than zero, then calculate if the `availabletoPurchase` quantity is greater than the `safetyStock` value. * If `availableToPurchase` quantity is greater than 0, then display the item as **in-stock**. * If `availableToPurchase` quantity is equal to 0 and `availableBackorder` is greater than 0, then display the item as **in-stock-for-backorder**. * If *Available* and *Backorder* are both out of stock, and `availableToPreorder` is greater than 0, then display the item as **in-stock-for-preorder**, else display the item as **out-of-stock**. * If the item is a `Backorder` or `Preorder` item, then display the expected restock date (backorderDate) or expected product launch date (preOrderDate) # List of Webhook Events Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/list-of-webhook-events ## Overview Webhooks are a mechanism for an application to send automated, real-time notifications without the need to call REST API endpoints. fabric's Order Management System (OMS) provides a list of webhook events using which you can create event subscriptions for Create, Read, Update, and Delete (CRUD) operations that take place in fabric OMS (also called fabric Orders). As a merchant, you can configure specific webhook events, such as inventory creation, order creation, order cancellation, and more to receive event-specific information. ## List of Webhook Events The following are the different services of fabric Orders along with the various webhook events provided by each service: * [Inventory Service](#inventory-service) * [Order Service](#order-service) * [Notification Service](#notification-service) * [Allocation Service](#allocation-service) * [Shipment Service](#shipment-service) * [Package Tracking Service](#package-tracking-service) * [Fraud Service](#fraud-service) * [Invoice Posting Service](#invoice-posting-service) * [Crossborder Service](#crossborder-service) * [Export Service](#export-service) ### Inventory Service **Source Name:** `INVENTORY_SERVICE` **Event Types:** 1. `INVENTORY_CREATE` 2. `INVENTORY_UPDATE` 3. `INVENTORY_BULK` 4. `INVENTORY_NETWORK_UPDATED` **curl example:** ```CURL curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "INVENTORY_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "INVENTORY_CREATE", "INVENTORY_UPDATE" // List of events to subscribe ] }' ``` ### Order Service **Source name:** `ORDER_SERVICE` **Event Types:** 1. `ORDER_CREATE` 2. `ORDER_HOLD_CROSSBORDER` 3. `ORDER_HOLD_FRAUD` 4. `ORDER_HOLD_CSR` 5. `ORDER_CONFIRMED` 6. `ORDER_CANCELLED` (only for full-order-canceled) 7. `ORDER_PARTIALLY_RETURNED` 8. `ORDER_RETURNED` (only for full Order returned) 9. `ORDER_SHIPPED` (once all items are shipped) 10. `EXCHANGE_PENDING` 11. `EXCHANGE_TO_SHIPMENT` 12. `ORDER_CANCELLATION_COUPON_REVERSAL` **curl example:** Following is a *curl* example to subscribe to `ORDER_CREATE`. Change the event name, or add an array of events to subscribe to different order events, as mentioned under *event types* under order service. ```CURL curl --location --request POST 'api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "ORDER_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "ORDER_CREATE" // List of events to subscribe ] }' ``` ### Notification Service **Source Name:** `NOTIFICATION_SERVICE` **Event Types:** 1. `SINGLE_ITEM_ORDER_CONFIRMATION_EMAIL` 2. `MULTI_ITEM_ORDER_CONFIRMATION_EMAIL` 3. `BOPIS_ORDER_CONFIRMATION_EMAIL` 4. `SHIPPING_CONFIRMATION_EMAIL` 5. `BOPIS_ORDER_READY_FOR_PICKUP` 6. `BOPIS_ORDER_COMPLETED` 7. `BOPIS_REMINDER_EMAIL` 8. `BACKORDER_NOTIFICATION_EMAIL` 9. `BACKORDER_30_DAYS_CONSENT_TO_DELAY_EMAIL` 10. `BACKORDER_53_DAYS_CONSENT_TO_DELAY_EMAIL` 11. `BACKORDER_CANCEL_EMAIL` 12. `BACKORDER_AUTH_DECLINE_EMAIL` 13. `ORDER_CANCELLATION_EMAIL_WEBCSC_ORDER_ITEM_CANCEL` 14. `ORDER_CANCELLATION_EMAIL_WEBCSC_ORDER_CANCEL` 15. `ORDER_CANCELLATION_EMAIL_LOCATE_ORDER_ITEM_CANCEL` 16. `RETURN_NOTIFICATION_EMAIL` 17. `REFUND_NOTIFICATION_EMAIL` 18. `APPEASEMENT_NOTIFICATION_EMAIL` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "NOTIFICATION_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "SINGLE_ITEM_ORDER_CONFIRMATION_EMAIL" "MULTI_ITEM_ORDER_CONFIRMATION_EMAIL" // List of events to subscribe ] }' ``` ### Allocation Service **Source name:** `PPS_SERVICE` **Event Types:** 1. `ALLOCATION_RETURN` 2. `ALLOCATION_CREATE_SDD` 3. `ALLOCATION_CREATE_BOPIS` 4. `ALLOCATION_CREATE_SHIP` 5. `ALLOCATION_CREATE_GIFTCARD` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "PPS_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "ALLOCATION_CREATE_SHIP" // List of events to subscribe ] }' ``` ### Shipment Service **Source Name:** `SHIPMENT_SERVICE` **Event Types:** 1. `SHIPMENT_CREATED` 2. `SHIPMENT_CANCELLED` 3. `GIFTCARD_ACTIVATE` 4. `PICKUP_CREATED` 5. `PICKUP_COMPLETED` 6. `SHIPMENT_UPDATE` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "SHIPMENT_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "SHIPMENT_CREATED" // List of events to subscribe ] }' ``` ### Package Tracking Service **Source Name:** `PACKAGE_TRACKING_SERVICE` **Event Types:** 1. `ORDER_CREATE_IN_PTS` 2. `ORDER_CANCELLED_IN_PTS` 3. `SHIPMENT_CREATE_IN_PTS` 4. `SHIPMENT_CANCELLED_IN_PTS` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "PACKAGE_TRACKING_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "ORDER_CREATE_IN_PTS" // List of events to subscribe. PTS refers to Package Tracking Service. ] }' ``` ### Fraud Service **Source Name:** `FRAUD_SERVICE` **Event Types:** 1. `FRAUD_CANCEL` 2. `FRAUD_RELEASE` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "FRAUD_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "FRAUD_RELEASE" // List of events to subscribe. ] }' ``` ### Invoice Posting Service **Source Name:** `INVOICE_POSTING_SERVICE` **Event Types:** 1. `INVOICE_POSTING` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "INVOICE_POSTING_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "INVOICE_POSTING" // List of events to subscribe. ] }' ``` ### Crossborder Service **Source Name:** `CROSSBORDER_SERVICE` **Event Types:** 1. `CROSS_BORDER_VALIDATION` **curl example** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "CROSSBORDER_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "CROSS_BORDER_VALIDATION" // List of events to subscribe. ] }' ``` ### Export Service **Source Name:** `EXPORT_SERVICE` **Event Types:** 1. `EXPORT_ORDER_INITIATED` 2. `EXPORT_ORDER_COMPLETED` 3. `EXPORT_ORDER_ERROR` 4. `EXPORT_ALLOCATION_INITIATED` 5. `EXPORT_ALLOCATION_COMPLETED` 6. `EXPORT_ALLOCATION_ERROR` 7. `EXPORT_SHIPMENT_INITIATED` 8. `EXPORT_SHIPMENT_COMPLETED` 9. `EXPORT_SHIPMENT_ERROR` 10. `EXPORT_INVOICE_INITIATED` 11. `EXPORT_INVOICE_COMPLETED` 12. `EXPORT_INVOICE_ERROR` 13. `EXPORT_LOCATION_INITIATED` 14. `EXPORT_LOCATION_COMPLETED` 15. `EXPORT_LOCATION_ERROR` 16. `EXPORT_INVENTORY_INITIATED` 17. `EXPORT_INVENTORY_COMPLETED` 18. `EXPORT_INVENTORY_ERROR` 19. `EXPORT_NETWORK_INITIATED` 20. `EXPORT_NETWORK_COMPLETED` 21. `EXPORT_NETWORK_ERROR` 22. `EXPORT_SHIPPING_METHODS_INITIATED` 23. `EXPORT_SHIPPING_METHODS_COMPLETED` 24. `EXPORT_SHIPPING_METHODS_ERROR` 25. `EXPORT_AGGREGATED_NETWORK_INITIATED` 26. `EXPORT_AGGREGATED_NETWORK_COMPLETED` 27. `EXPORT_AGGREGATED_NETWORK_ERROR` **curl example:** ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "EXPORT_SERVICE", // This will change based on service to be subscribed "format": "application/json", "requestType": "POST", "events": [ "EXPORT_ORDER_INITIATED" "EXPORT_ORDER_COMPLETED" // List of events to subscribe. ] }' ``` # Importing order and inventory data Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/order-and-inventory-import This document is intended for merchants and System Integrator (SI) partners who want to migrate or import inventory and order data. ## Prerequisites * Ensure that you have **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. * Ensure that you have a valid [Authorization Token](/v3/getting-started/api-guides/getting-started-with-fabric-apis) to provide in the header. When generating an authorization token, ensure that the API System App that you are using to generate the token has the correct role assigned. If a token doesn't have the correct role, the following error is returned: ```json { not a valid key=value pair (missing equal-sign) in Authorization header: {token} } ``` * If you have fabric **Products Catalog** enabled for your organization, ensure that you [create and update the product catalog](https://developer.fabric.inc/v3/api-reference/product-catalog/developer-guide#import-product-data-through-bulk-import) before importing inventory. If you are using product management software other than fabric’s Product Catalog, you must import your product data using the [Products endpoint](/v3/product-catalog/api-reference/product-catalog/general-product-operations/add-products). * Ensure that you have at least one [fulfillment location](/v3/orders-and-inventory/api-reference/orders/developer-guide/inventory-setup#create-location), such as a Distribution Center (DC). ## Process To import inventory, you must create an inventory CSV file. Once you have filled in the CSV file, you can upload it to the `inventory-imports` endpoint. With the file uploaded, fabric process's the CSV file and populates your inventory. With your baseline inventory populated, you're ready to update the counters onHand, allocated, and shipped for each location. This populates your total available to purchase amount for each product and populates the inventory for each location. * [Import Inventory](#importing-inventory) To import orders, you must create an orders JSON file. Once you have completed the JSON file, you can upload it to the `oms-imports` endpoint. With the file uploaded, fabric process's the JSON file and populates your orders. * [Import Orders](#importing-orders) ## Importing Inventory Before using the `inventory-imports` endpoint, you must download and update the **Update** CSV file template. This file is uploaded in a subsequent API call. ### Step 1: Download the CSV template file 1. Log in to fabric Copilot. 2. In the left menu, click **Inventory**. The **Manage inventory** tab is displayed. 3. Click **Import**. The **Import CSV file to add or edit your inventory** window is displayed. Two templates are provided. 4. Click **Template: Update**. The **inventory\_update.csv** file is downloaded. ### Step 2: Update the CSV template file The **inventory\_update.csv** file contains a number of columns with optional fields, such as preorder and backorder dates. These fields are set to **Null** by the system if left blank. The following values are required: | Field | Description | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | **SKU** | The stock keeping unit. | | **Item ID** | The fabric item ID generated after a successful import of a product. This is required only if you use fabric Product Catalog. | | **Location Number** | A unique value used to identify the location such as a DC. Products can have multiple locations associated with their inventory. | | **Channel ID** | The sales channel ID. | ### Step 3: Create the `importId` The `inventory-imports` endpoint is used to create the `importId` and returns a `uploadFileUrl`. The `uploadFileUrl` is used to upload the CSV file from [step 2](#step-2-update-the-template-csv-file) that populates your inventory levels. **POST Request**: ```Bash curl --location --request POST 'https://api.fabric.inc/api/v3/inventory-imports/' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-channel-id: 12' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --header 'Authorization: {authToken} \ --data '{ "fileName": "C:/Users/Fabric/Downloads/Inventory_Import.csv", "type": "INVENTORY" }' ``` **Response**: ```Bash { "importId": "1716414052775_CUsersFabricDownloadsInventory_Import", "uploadFileUrl": "{AWS S3 upload URL}" } ``` ### Step 4: Upload the template file Use the `uploadFileUrl` value, which is returned in [step 3](#step-3-create-the-importid), and send a **PUT** request with the template file. Note: No authorization token is required for this step. If you use Postman, click the URL to automatically open the request in a new tab. Remember to change the request from GET to PUT and in the body of the request click the binary option followed by providing your inventory CSV file. ```Bash curl --location --request PUT '{AWS S3 upload URL}' \ --header 'Content-Type: text/csv' \ --data '@/C:/Users/Fabric/Downloads/Inventory_Import.csv' ``` A successful response returns a 200 status. ### Step 5: Check the upload status Ensure that you have the `importId` value from the response in [Step 3](#step-3-create-the-importid). You can check your inventory upload status by making a **GET** request to the `inventory-imports/{importId}` endpoint. **GET Request**: ```Bash curl --location --request GET 'https://api.fabric.inc/api/v3/inventory-imports/1716408181352_Inventory_Import' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-channel-id: 12' \ --header 'Accept: application/json' \ --header 'Authorization: {authToken}' ``` **Response**: ```Bash { "importId": "1716414052775_CUsersFabricDownloadsInventory_Import", "type": "bulk", "statusCode": "COMPLETED", "attributes": { "isTrueUp": false }, "createdAt": "2024-05-22T20:03:01Z", "updatedAt": "2024-05-22T20:03:02Z", "originalFileUrl": "{AWS S3 upload URL}", "importCount": { "uploaded": 1, "processed": 1, "error": 0 } } ``` On the **Manage inventory** page mentioned in [step 1](#step-1-download-the-template-csv-file), the **Available To Purchase** column for each SKU is updated. Note that you may need to refresh your browser to see the update. ### Step 6: Update inventory counters After importing your inventory, update the default counters for **onHand**, **allocated**, and **shipped** for each product. Custom counters are supported and can be created using the [Counters API](/v3/orders-and-inventory/api-reference/inventory/counters/create-counter) endpoint. **PUT Request**: ```Bash curl --location --request PUT 'https://api.fabric.inc/v3/inventories/actions/find-and-adjust-inventory-counters' \ --header 'Authorization: Bearer {authorizationToken}' \ --header 'Content-Type: application/json' \ --header 'x-fabric-channel-id: 12' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "inventoryId": "664fabec0f0853fe68e2bea8", "sku": "123456", "itemId": 12332, "locationNumber": 90012, "counters": { "allocated": 50, "onHand": 200, "shipped": 20 } }' ``` **Response**: With the inventory counters updated, the fabric virtual counter also updates the SKU's **Available To Purchase** value. In the following example, the value is updated to 130: ```JSON { "inventoryId": "664e51c60f0853fe681fc3e6", "sku": "123456", "itemId": 12332, "locationNumber": 90012, "channelId": "12", "createdAt": "2024-05-22T20:12:54.082+00:00", "updatedAt": "2024-05-24T22:03:51.903+00:00", "backorderLimit": 0, "preorderLimit": 0, "safetyStock": 0, "lowStock": 0, "counters": { "allocated": 50, "onHand": 200, "shipped": 20 }, "customAttributes": {}, "networkCounters": {} } ``` ## Importing orders Before using the `oms-imports` endpoint, you must create a JSON file containing all your order information in a specific format. The JSON file is used to provide a centralized source for order, inventory, and warehouse information, enabling you to receive, track, and fulfill customer orders. ### Step 1: Create the JSON file containing your orders Note that each line in the JSON file represents one order. If you want to import 1000 orders , the file should have exactly 1000 lines with each line representing an order object. If you save the JSON file with an extension that makes it more readable or expands the object to more than one line, the upload fails. This section provides a JSON example that shows a single order object formatted to be readable. The following sample code includes examples of potential custom attributes and is designed to illustrate the best-case scenario, offering a comprehensive order view: ```JSON Example Order { "orderId": "o11213873041", "orderNumber": "132279859", "orderDate": "2023-07-02T07:13:26", "cancellationDate": "", "channelId": "12", "cartId": null, "type": "WEB", "subType": "Domestic", "employeeId": "", "retail": { "locationNum": "90012" }, "orderSubTotal": 197.88, "originalSubTotal": 197.88, "orderDiscount": 52.64, "originalDiscounts": 52.64, "adjustmentTotal": 0.00, "originalAdjustmentTotal": 0.00, "feeTotal": 0.00, "originalFeeTotal": 0.00, "taxTotal": 7.99, "appeasementTotal": 0.00, "originalTaxTotal": 7.99, "returnTotal": 0.00, "cancelTotal": 0.00, "invoiceTotal": 153.23, "orderTotal": 153.23, "originalOrderTotal": 153.23, "currency": "USD", "statusCode": "ORDER_SHIPPED", "statusDescription": "ORDER_SHIPPED", "attributes": { "createdDate": "2023-03-24T07:22:24", "tracking-hash": "", "isMigrated": true }, "fees": [], "appeasements": [], "discounts": [ { "quantity": 1, "amount": 30.00, "unit": null, "value": 0.00, "promoId": "promo30359324", "promoCode": null, "promoTitle": "Loyalty Offer", "type": "Order Discount", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 }, { "quantity": 1, "amount": 7.64, "unit": null, "value": 5.00, "promoId": "PASSPORT", "promoCode": null, "promoTitle": "Passport", "type": "Order Discount - Percent Off", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 }, { "quantity": 1, "amount": 15.00, "unit": null, "value": 0.00, "promoId": "promo31919319", "promoCode": null, "promoTitle": "BIRTHDAY ONLY", "type": "Order Discount", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 } ], "customer": { "name": { "first": "Joe", "middle": null, "last": "Madison" }, "email": "Joe.madison@gmail.com", "phone": { "number": "2075224290", "type": "MOBILE" }, "userId": "C1108401952", "accountId": "1108401952", "employeeId": "", "company": null }, "payments": [ { "paymentCounter": 1, "paymentDate": "2023-07-02T07:13:26", "billToId": "pg12906396079", "paymentIdentifier": { "cardIdentifier": "4284", "expirationYear": "2025", "expirationMonth": "11", "paymentId": "pg12906396079", "fabricPaymentReference": "pg12906396079" }, "paymentProvider": "CNP", "paymentToken": { "token": "5243662388273181", "paymentType": null }, "paymentMethod": "applePay", "authAmount": 153.23, "chargedAmount": 153.23, "refundAmount": 0.00, "currency": "USD", "conversion": 1, "paymentStatus": "AUTHORIZED", "billToAddress": { "name": { "first": "Joe", "middle": null, "last": "Madison" }, "email": "Joe.madison@gmail.com", "phone": { "number": "2075224290", "type": "MOBILE" }, "address1": "11 Beryl Loop", "address2": null, "address3": null, "address4": null, "city": "Topsham", "state": "ME", "country": "USA", "postalCode": "04086", "type": null, "latitude": null, "longitude": null }, "attributes": { "requestedDate": "2023-07-02T11:13:27", "expirationMonth": "11", "expirationYear": "2025", "cardIdentifier": "4284", "lastFour": "4284", "referenceId": "8825362745964734", "authCode": null, "authExpirationDate": null, "softDecline": null, "payerId": null, "paypalToken": null, "_comment": "Fields related to amazon pay", "authorizedAmount": null, "captureAmount": null, "captureCurrencyCode": null, "captureReferenceId": null, "amazonAuthorizationId": null, "amazonOrderReferenceId": null, "authorizationCurrencyCode": null, "authorizationReferenceId": null, "captureNow": null, "sellerAuthorizationNote": null, "softDescriptor": null, "sellerCaptureNote": null, "transactionTimeout": null, "amazonCaptureId": null, "refundAmount": null, "refundCurrencyCode": null, "refundReferenceId": null, "sellerRefundNote": null, "_comment1": "Fields related to credit card", "cnpTxnId": "ps1159357855", "accountNumber": null, "cardType": "MasterCard", "checkoutId": null, "expirationDate": "11-2025", "omniToken": "5243662388273181", "orderSource": "applePay", "payPageRegId": null, "_comment2": "Fields related to gift card", "paymentRequests": [ { "transactionId": null, "paymentId": null, "customProperties": null, "gatewaySettings": null, "cardDetails": { "giftCardNumber": null, "giftCardPin": null }, "amount": 153.23, "transactionTimestamp": "2023-07-02T11:13:27", "paymentMethod": null, "gatewayId": null } ], "_comment3": "Fields related to AfterPay", "token": null, "afterPayOrderNumber": null, "tenderTypeId": "51", "invoiceNumber": null }, "partialCapture": false, "finalCapture": true } ], "returns": [], "items": [ { "lineItemId": "ci100596348648", "lineItemNumber": "4", "itemId": "12332", "sku": "123456", "channelId": "12", "title": "Test Product OMS", "type": "ShipToHome", "isBackorder": false, "isPreorder": false, "orderedQuantity": "1", "backOrderedQuantity": 0, "pendingShippedQuantity": 0, "pendingShippedBackOrderQuantity": null, "shippedQuantity": 1, "deliveredQuantity": 0, "invoiceQuantity": 1, "cancelledQuantity": 0, "pendingReturnQuantity": 0, "processingReturnQuantity": 0, "rejectedReturnQuantity": 0, "returnedQuantity": 0, "reshippedQuantity": 0, "quantityInStatus": { "created": 0, "pendingShipped": 0, "shipped": 1, "returned": 0, "cancelled": 0, "hold": 0, "delivered": 0 }, "shipToId": "sg12601324493", "itemUnitPrice": 74.25, "itemSubTotal": 74.25, "originalItemSubTotal": 74.25, "itemFeeTotal": null, "originalFeeTotal": 0.00, "itemShippingTotal": null, "originalShippingTotal": null, "appeasementTotal": null, "itemDiscountsTotal": 19.79, "originalDiscounts": 19.79, "itemAdjustmentTotal": 0.00, "originalItemAdjustmentTotal": 0.00, "itemTaxTotal": 2.99, "originalTaxTotal": 2.99, "itemTotal": 57.45, "originalItemTotal": 57.45, "outstandingItemTotal": null, "originalOutstandingItemTotal": null, "invoiceTotal": 57.45, "currency": "USD", "associateId": "", "fees": [], "appeasements": null, "returns": [], "taxCode": "200231531", "taxDetail": [ { "type": "CITY", "value": 0.00 }, { "type": "COUNTY", "value": 0.00 }, { "type": "STATE", "value": 2.99 }, { "type": "COUNTRY", "value": 0.00 }, { "type": "DISTRICT", "value": 0.00 }, { "type": "OTHER", "value": 0.00 } ], "discounts": [ { "quantity": 1, "amount": 11.27, "unit": null, "value": 0.00, "promoId": "promo30359324", "promoCode": null, "promoTitle": "Loyalty Offer", "type": "Order", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 }, { "quantity": 1, "amount": 2.88, "unit": null, "value": 5.00, "promoId": "PASSPORT", "promoCode": null, "promoTitle": "Passport", "type": "Order", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 }, { "quantity": 1, "amount": 5.64, "unit": null, "value": 0.00, "promoId": "promo31919319", "promoCode": null, "promoTitle": "BIRTHDAY ONLY", "type": "Order", "invoiceQuantity": 1, "returnQuantity": 0, "cancelQuantity": 0 } ], "adjustments": [], "attributes": { "style": "570348729", "colorCode": "001", "colorDescription": "Black", "image": "https://www.fabric-demo.com/Product_Images/570348729_001.jpg?imgPolicy=domSmall", "title": "Knit Woven Mix Maxi Tank Dress", "productUrl": "https://www.fabric-demo.com/store/product/Knit-Woven-Mix-Maxi-Tank-Dress/570348729?color=001", "size": "2 (12/14-L)", "giftMessage": [ { "giftTo": "", "giftFrom": "", "giftMessage": "", "giftBox": "false", "giftWrap": "false", "giftBoxPrice": 0.00 } ], "isDonation": false, "isGiftCard": false, "isFinalSale": false, "effectiveTaxRate": 0.0550 }, "exchangeQuantity": 0, "refundAmount": -2.99, "cancelledAmount": 0.00, "lineOrderStatus": "SHIPPED", "gifting": false, "donation": false } ], "shipInfo": [ { "shipToId": "sg12596229905", "taxCode": "200231531", "locationNum": "", "pickup": [], "shipToAddress": { "name": { "first": "Debbie", "middle": null, "last": "Dionne" }, "email": "Joe.madison@gmail.com", "phone": { "number": "2075224290", "type": "MOBILE" }, "address1": "11 BERYL LOOP", "address2": "", "address3": "", "address4": null, "city": "TOPSHAM", "state": "ME", "country": "USA", "postalCode": "04086-3603", "type": null, "latitude": null, "longitude": null }, "taxDetail": [ { "type": "CITY", "value": 0.00 }, { "type": "COUNTY", "value": 0.00 }, { "type": "STATE", "value": 0.00 }, { "type": "COUNTRY", "value": 0.00 }, { "type": "DISTRICT", "value": 0.00 }, { "type": "OTHER", "value": 0.00 } ], "discounts": [], "shipMethod": "Parcel Post Delivery", "shipToType": "SHIP_TO_ADDRESS", "shipToPrice": 0.00, "shipToDiscount": 0, "shipToTaxTotal": 0.00, "shipmentInstructions": null, "attributes": { "giftMessage": [] }, "isInvoiced": true }, { "shipToId": "sg12593859245", "taxCode": "200231531", "locationNum": "", "pickup": [], "shipToAddress": { "name": { "first": "Debbie", "middle": null, "last": "Dionne" }, "email": "Joe.madison@gmail.com", "phone": { "number": "2075224290", "type": "MOBILE" }, "address1": "11 BERYL LOOP", "address2": "", "address3": "", "address4": null, "city": "TOPSHAM", "state": "ME", "country": "USA", "postalCode": "04086-3603", "type": null, "latitude": null, "longitude": null }, "taxDetail": [ { "type": "CITY", "value": 0.00 }, { "type": "COUNTY", "value": 0.00 }, { "type": "STATE", "value": 0.00 }, { "type": "COUNTRY", "value": 0.00 }, { "type": "DISTRICT", "value": 0.00 }, { "type": "OTHER", "value": 0.00 } ], "discounts": [], "shipMethod": "Parcel Post Delivery", "shipToType": "SHIP_TO_ADDRESS", "shipToPrice": 0.00, "shipToDiscount": 7.95, "shipToTaxTotal": 0.00, "shipmentInstructions": null, "attributes": { "giftMessage": [] }, "isInvoiced": true }, { "shipToId": "sg12601324493", "taxCode": "200231531", "locationNum": "", "pickup": [], "shipToAddress": { "name": { "first": "Joe", "middle": null, "last": "Madison" }, "email": "Joe.madison@gmail.com", "phone": { "number": "2075224290", "type": "MOBILE" }, "address1": "11 BERYL LOOP", "address2": "", "address3": "", "address4": null, "city": "TOPSHAM", "state": "ME", "country": "USA", "postalCode": "04086-3603", "type": null, "latitude": null, "longitude": null }, "taxDetail": [ { "type": "CITY", "value": 0.00 }, { "type": "COUNTY", "value": 0.00 }, { "type": "STATE", "value": 0.00 }, { "type": "COUNTRY", "value": 0.00 }, { "type": "DISTRICT", "value": 0.00 }, { "type": "OTHER", "value": 0.00 } ], "discounts": [], "shipMethod": "Parcel Post Delivery", "shipToType": "SHIP_TO_ADDRESS", "shipToPrice": 0.00, "shipToDiscount": 0, "shipToTaxTotal": 0.00, "shipmentInstructions": null, "attributes": { "giftMessage": [] }, "isInvoiced": true } ], "auditLogs": [], "notes": [], "createdAt": "2023-03-24T07:22:24", "updatedAt": "2023-07-05T03:31:53" } ``` ### Step 2: Retrieve the `importId` and upload URL The `oms-imports` endpoint is used to create the `importId` and returns a `uploadFileUrl`. The `uploadFileUrl` is used to upload the JSON file from [step 1](#step-1-create-the-json-file-containing-your-orders). ```Bash curl --location --request GET 'https://api.fabric.inc/api/v3/oms-imports' \ --header 'X-Fabric-Tenant-Id: {tenantId}' \ --header 'X-Fabric-Channel-Id: 12' \ --header 'Content-Type: application/json' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer {authorizationToken}' \ --data '{ "fileName": "C:/Users/Fabric/Downloads/example_order.json", "module": "ORDER", "type": "BULK" }' ``` **Response**: ```Bash { "importId": "6650def0104f907ac98275de", "uploadFileUrl": "{AWS S3 Upload URL}", "fileName": "example_order.json", "module": "ORDER", "type": "BULK", "statusCode": "INITIATED", "createdAt": "2024-05-24T18:39:44Z", "updatedAt": "2024-05-24T18:39:44Z" } ``` ### Step 3: Upload the JSON file Use the `uploadFileUrl` value, which is returned in [step 2](#step-2-retrieve-the-importid-and-upload-url), and send a **PUT** request with the template file. Note: No authorization token is required for this step. If you use Postman, click the URL to automatically open the request in a new tab. Remember to change the request from GET to PUT and in the body of the request click the binary option followed by providing your inventory CSV file. ```Bash curl --location --request PUT '{AWS S3 upload URL}' \ --header 'Content-Type: application/json' \ --data '@/C:/Users/Fabric/Downloads/example_order.json' ``` A successful response returns a 200 status. ### Step 4: Check the status of the import Ensure that you have the `importId` value from the response in [Step 2](#step-2-retrieve-the-importid-and-upload-url). You can check your order upload status by making a GET request to the `oms-imports/{importId}` endpoint. **GET Request**: ```Bash curl --location --request GET 'https://api.fabric.inc/api/v3/oms-imports/{importId}' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-channel-id: 12' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer {authorizationToken}' ``` **Response**: Depending on the number of orders being imported, this process can take up to 20 minutes to complete. Batches of up to 1 million imports are supported at a time. The `statusCode` value is set to **INITIATED** until the process completes. ```JSON { "importId": "6670898e85d8c162c403f4d3", "fileName": "example_order_2.json", "module": "ORDER", "type": "BULK", "statusCode": "COMPLETED", "createdAt": "2024-06-17T19:07:58Z", "updatedAt": "2024-06-17T19:11:30Z", "originalFileUrl": "{AWS S3 Upload URL}" } ``` ### Step 5: Use the order number to retrieve an order To verify the orders are imported, make a GET request to the `orders/order-number/{orderNumber}` endpoint using one of the imported order numbers. **Request**: ```BASH curl --location --request GET 'https://api.fabric.inc/api/v3/orders/order-number/{orderNumber}' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-channel-id: 12' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer {authorizationToken}' ``` A successful response returns a 200 status with an order object in the payload. ## Related Resources * [Developer Guide Overview](/v3/orders-and-inventory/api-reference/orders/developer-guide/overview) * [Inventory Setup Guide](/v3/orders-and-inventory/api-reference/orders/developer-guide/inventory-setup) * [Product Catalog Developer Guide](/v3/product-catalog/api-reference/product-catalog/developer-guide/introduction) * [Counters API Endpoint](/v3/orders-and-inventory/api-reference/inventory/counters/overview) * [Locations API Endpoint](/v3/orders-and-inventory/api-reference/inventory/locations/overview) * [Inventory API Endpoint](/v3/orders-and-inventory/api-reference/inventory/inventory/overview) # Order Exchange Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/order-exchange Using the exchange functionality of fabric's Orders service, the Customer Service Representatives (CSR) can exchange an order item. Exchange is essentially `a return + a new item shipment`, and this phase integrates the *returns service* with the *exchange service*. **General Rules:** * Exchange functionality doesn't have a separate endpoint, and uses the return service for performing order exchanges. * Exchange for an item is identified by the `exchange` `boolean` field on the return payload. * For an exchange, if the item can't be shipped due to being out of stock, but the item returned for the exchange is processed, then the amount for the returned line items must be refunded. * Refunding and payment due to the price difference between the original and replacement items aren't handled by the returns or exchange service. This information must be sent by the requester during the pending return flow. **Workflow:** The exchange functionality has two flows: * [Exchange items are shipped when the return is received](#exchange-items-are-shipped-when-the-return-is-received) * [Exchange items are shipped irrespective of the item being received](#exchange-items-are-shipped-irrespective-of-the-item-being-received) ### Exchange items are shipped when the return is received * The `returnType` parameter is set to ` Received` * The `exchange` parameter is set to `true` * The `initiateReshipment` parameter is set to `true` for items * The returns service gets a “PENDING” return request flagged as an exchange. * The returns service notifies the exchange service about the exchange. * The exchange service broadcasts that the exchange is pending. * The returns service gets a “RECEIVED” return request. * The exchange service updates the order document by changing the status of the replacement item to be shipped. * The exchange service broadcasts that the exchange is sent to the Shipment service. * Allocation service handles inventory updates and shipping. * If the client POSTs the return received, then: * ship the new item * disable refunding for the original item * If the client initiates an exchange for a *pending return*, then the network inventory is reserved at the time the exchange is created. From there, fabric OMS awaits until the item `returnType` “RECEIVED” is posted by the client. If the client receives the item to be returned then, * ship the new item * disable refunding for the original item **sample curl:** ```JSON curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: YOUR_ACCOUNT_ID_HERE' \ --header 'x-site-context: {"stage":"sandbox","account":"YOUR_ACCOUNT_ID_HERE","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ { "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": true "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "RECEIVED", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "exchange": { "refund": { "amount": 34.56, "currency": "USD", "conversion": 1 }, "items": [ { "itemId": 1234, "sku": "P1234", "quantity": 10, "itemUnitPrice": 10, "initiateReshipment": true } ], "isRefundingDisabled": true }, "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` ### Exchange items are shipped irrespective of the item being received * Exchange for an item is identified by the `exchange` boolean field on the return payload. * The requester sets `initiateReshipment` to `true` at the first moment of the exchange, indicating the immediate shipping of the replacement item regardless of the return status (received or pending). In this case, the allocation service will be triggered at the end of the pending return flow. * The administrator ships the new item without the distribution center receiving the item and disables refunding for the original item. **sample curl:** ```JSON curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: YOUR_ACCOUNT_ID_HERE' \ --header 'x-site-context: {"stage":"sandbox","account":"YOUR_ACCOUNT_ID_HERE","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ { "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": true "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "RECEIVED", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "exchange": { "refund": { "amount": 34.56, "currency": "USD", "conversion": 1 }, "items": [ { "itemId": 1234, "sku": "P1234", "quantity": 10, "itemUnitPrice": 10, "initiateReshipment": true } ], "isRefundingDisabled": true }, "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` # Order Fulfillment Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/order-fulfillment fabric’s Orders service simplifies complex order management and fulfillment processes after an order is created either by using any checkout service or at the Point of Sale (POS). With fabric's Orders service, merchants can: * Create a unified commerce experience by importing all orders in real time to a single application. * Cancel, return, and exchange orders. * Handle tasks such as invoicing, shipment tracking, backorders, and other use cases. * Use the endpoints to create orders, initiate post-order process workflows, and manage order-related data, such as setting the estimated delivery date and ship-by date. Additionally, merchants can set fulfillment location information to view what facility orders were allocated for the fulfillment. ### Workflow The following provides a basic workflow of fabric's Orders service for the orders created using a checkout service: 1. Merchants create an Order and upload details to fabric's Orders service after shoppers complete the payment process at the checkout stage. 2. fabric Orders sends a notification for different order updates, using the Notification APIs, to shoppers and merchants. 3. fabric Orders allocates the order, using allocation APIs, to the shopper's nearest warehouse or facility for inventory confirmation, and shipping of the product. 4. Order is then picked, packed, and shipped. 5. Merchant and shopper are notified of the delivery being shipped. 6. The order is completed when it reaches the shopper’s delivery address. ### Set up Order Tracking for an Order Created Using a Checkout Service After an order is created, for the order to drop to the warehouse, merchants must set up webhook subscriptions to fabric's Orders events for better order management. * [Workflow](#workflow) * [Set up Order Tracking for an Order Created Using a Checkout Service](#set-up-order-tracking-for-an-order-created-using-a-checkout-service) * [Step 1: Set up a webhook subscription to OMS events](#step-1-set-up-a-webhook-subscription-to-oms-events) * [Step 2: Create an Order and Upload it to fabric OMS](#step-2-create-an-order-and-upload-it-to-fabric-oms) * [Step 3: Integrate OMS with Warehouse Management System (WMS)](#step-3-integrate-oms-with-warehouse-management-system-wms) * [Step 4: Integrate OMS with Fraud Service](#step-4-integrate-oms-with-fraud-service) * [Step 5: Create Shipment for the Allocations](#step-5-create-shipment-for-the-allocations) * [Optional Steps:](#optional-steps) #### Step 1: Set up a webhook subscription to OMS events 1. Use webhook endpoint (`POST/v3/oms-webhooks`) to set up webhook subscriptions to [various order events](/v3/api-reference/orders/developer-guide/list-of-webhook-events#order-service) so that when an order is created or updated, fabric OMS automatically starts the post-order processes, and sends notifications for the subscribed events. 2. Once an order is allocated to a warehouse, the webhook that you have configured, sends a notification mentioning an allocation ID. Following is a **curl example** for subscribing to allocation events: ```shell curl --location --request POST 'https://api.fabric.inc/v3/oms-webhooks' \ --header 'Authorization: Bearer {token}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw '{ "target": "https://webhook.site/83834d4c-9736-4cba-b32b-e6b6d75a6683", "protocol": "HTTP", "source": "ORDER_SERVICE", // This will change based on service to be subscribed "apiVersion": "1.0.0", "format": "application/json", "requestType": "POST", "events": [ "ORDER_CREATE" "ORDER_SHIPPED" // List of events to subscribe ] }' ``` To subscribe to any other events of fabric Orders, mention the respective source name and events that you want to subscribe for. For details, see [List of Webhook Events](/v3/api-reference/orders/developer-guide/list-of-webhook-events#order-service). #### Step 2: Create an Order and Upload it to fabric OMS Use the `POST/v3/orders` endpoint to create an order through any integrated checkout service that you are using. * The `orderNumber` field that's passed during order creation is a string. * For Cash On Delivery (COD) orders, provide `paymentMethod` as ‘CASH\_ON\_DELIVERY’, and `chargedAmount` as ‘0’ under the payment object while creating an order. **Request Sample** ```json { "orderNumber": "309019176", "orderedAt": "2022-05-12T09:30:31.198Z", "adjustmentTotal": 123.45, "adjustments": [ { "adjustmentCounter": 1, "amount": 2.4, "attributes": { "number": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "cancelQuantity": 2, "invoiceQuantity": 10, "notes": "Any additional info", "quantity": 2, "reasonCode": "RFC", "returnQuantity": 1, "subReasonCode": "Late shipping" } ], "cartId": "b03b72dc-78d8-4ea4-90fc-2fe6a1fe6569", "type": "WEB", "subtype": "INTERNATIONAL", "employeeId": "62272e917b12209e68751d94", "retail": { "locationNumber": 334, "cashierId": "C-123", "registerId": "113", "transactionId": "328942333412" }, "orderSubtotal": 123.45, "orderDiscount": 1.23, "feeTotal": 12.34, "taxTotal": 12.34, "orderTotal": 146.9, "currency": "USD", "statusCode": "ORDER_CREATED", "statusDescription": "Order Created", "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckStatus": "UPDATED" }, "fees": [ { "name": "STATE", "taxCode": "FR01", "rateType": "PERCENTAGE", "rate": 10, "amount": 34.56, "currency": "USD", "attributes": { "additionalProp1": {}, "additionalProp2": {}, "additionalProp3": {} }, "invoicedAmount": 34.56 } ], "discounts": [ { "quantity": 2, "amount": 2.4, "unit": "AMOUNT_OFF", "value": 2, "promotionId": "HNY2022", "promotionCode": "HNY2022", "promotionName": "New Year", "type": "promotion" } ], "customer": { "name": { "firstName": "Alex", "middleName": "E", "lastName": "Doe" }, "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": { "number": "123-456-7890", "type": "MOBILE" }, "userId": "62272e917b12209e68751d94", "accountId": "62272e917b12209e68751d94", "employeeId": "62272e917b12209e68751d94", "company": "Demo Inc", "address": { "name": { "firstName": "Alex", "middleName": "E", "lastName": "Doe" }, "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": { "number": "123-456-7890", "type": "MOBILE" }, "addressLine1": "123 Main St.", "addressLine2": "Suite 100", "addressLine3": "Seventh floor", "addressLine4": "Attention: Pat E. Kake", "city": "Seattle", "region": "WA", "postalCode": "98121", "countryCode": "US", "type": "Home", "latitude": 47.6205, "longitude": -122.3493 } }, "payments": [ { "paymentCounter": 1, "paidAt": "2022-01-27T16:15:58-05:00", "paymentIdentifier": { "cardIdentifier": "3456", "expirationYear": "2029", "expirationMonth": "12", "paymentId": "62272e917b12209e68751d94", "fabricPaymentReference": "f886c96c-5f65-11ed-9b6a-0242ac120002" }, "paymentProvider": "stripe", "paymentToken": { "token": "pi_34tr6787rt", "paymentType": "VISA" }, "paymentMethod": "CREDIT_CARD", "authorizedAmount": 123.2, "chargedAmount": 60, "currency": "USD", "paymentStatus": "Paid", "authorizationExpirationDate": "2022-01-27T16:15:58-05:00", "billToAddress": { "name": { "firstName": "Alex", "middleName": "E", "lastName": "Doe" }, "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": { "number": "123-456-7890", "type": "MOBILE" }, "addressLine1": "123 Main St.", "addressLine2": "Suite 100", "addressLine3": "Seventh floor", "addressLine4": "Attention: Pat E. Kake", "city": "Seattle", "region": "WA", "postalCode": "98121", "countryCode": "US", "type": "Home", "latitude": 47.6205, "longitude": -122.3493 }, "attributes": { "referenceId": "4DY41894J2904533S", "payerId": "M7AWTK3YK3B46", "captureCurrencyCode": "USD" } } ], "items": [ { "lineItemId": "b03b72dc-78d8-4ea4-90fc-2fe6a1fe6569", "lineItemNumber": 1, "itemId": 1234, "sku": "P1234", "segment": "P1234", "vendorId": "P1234", "itemName": "Item", "type": "WEB_SHIP", "itemSubtype": "Borderfree", "orderedQuantity": 60, "uom": "EA", "shipToId": "b03b72dc-78d8-4ea4-90fc-2fe6a1fe6569", "itemUnitPrice": 10, "itemSubtotal": 600, "itemFeeTotal": 10, "itemDiscountsTotal": 10, "itemTaxTotal": 10, "itemTotal": 10, "currency": "USD", "employeeId": "62272e917b12209e68751d94", "fees": [ { "name": "STATE", "taxCode": "FR01", "rateType": "PERCENTAGE", "rate": 10, "amount": 34.56, "currency": "USD", "attributes": { "additionalProp1": {}, "additionalProp2": {}, "additionalProp3": {} } } ], "taxCode": "FR01", "taxDetails": [ { "name": "STATE", "taxCode": "FR01", "rateType": "PERCENTAGE", "rate": 10, "amount": 34.56, "currency": "USD", "attributes": { "additionalProp1": {}, "additionalProp2": {}, "additionalProp3": {} } } ], "discounts": [ { "quantity": 2, "amount": 2.4, "unit": "AMOUNT_OFF", "value": 2, "promotionId": "HNY2022", "promotionCode": "HNY2022", "promotionName": "New Year", "type": "promotion" } ], "attributes": { "style": "570223020", "colorCode": "001", "isDonation": "false" }, "isBackorder": true, "isPreorder": true, "isDonation": true } ], "shipInfo": [ { "shipToId": "b03b72dc-78d8-4ea4-90fc-2fe6a1fe6569", "taxCode": "FR01", "locationNumber": "123", "pickups": [ { "name": { "firstName": "Alex", "middleName": "E", "lastName": "Doe" }, "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": { "number": "123-456-7890", "type": "MOBILE" }, "pickupType": "PRIMARY" } ], "shipToAddress": { "name": { "firstName": "Alex", "middleName": "E", "lastName": "Doe" }, "email": "[[email protected]](/cdn-cgi/l/email-protection)", "phone": { "number": "123-456-7890", "type": "MOBILE" }, "addressLine1": "123 Main St.", "addressLine2": "Suite 100", "addressLine3": "Seventh floor", "addressLine4": "Attention: Pat E. Kake", "city": "Seattle", "region": "WA", "postalCode": "98121", "countryCode": "US", "type": "Home", "latitude": 47.6205, "longitude": -122.3493 }, "taxDetails": [ { "name": "STATE", "taxCode": "FR01", "rateType": "PERCENTAGE", "rate": 10, "amount": 34.56, "currency": "USD", "attributes": { "additionalProp1": {}, "additionalProp2": {}, "additionalProp3": {} } } ], "shipMethod": "Parcel post delivery", "shipToType": "SHIP_TO_ADDRESS", "estimatedShipDate": "2022-05-12T09:30:31.198Z", "estimatedDeliveryDate": "2022-05-12T09:30:31.198Z", "shipToPrice": 20, "shipToDiscount": 12.6, "discounts": [ { "quantity": 1, "amount": 2.99, "unit": "AMOUNT_OFF", "value": 10, "promotionId": "SHIPFREE", "promotionCode": "SHIPFREE", "promotionName": "Free Shipping" } ], "shipToTaxTotal": 12.6, "shipmentInstructions": "Handle with care", "isInvoiced": true, "attributes": { "giftMessage": "[]" } } ] } ``` #### Step 3: Integrate fabric OMS with Warehouse Management System (WMS) Integrate fabric OMS with the WMS that you use to check the movement of inventory to fulfill orders. By integrating OMS with WMS, you allow the WMS to listen to allocation events that you created in the first step. Based on the shopper's location, fabric OMS allocates orders to the nearest warehouse. To integrate OMS with the WMS you use, either: 1. You (retailers) develop the integration software to communicate with fabric OMS, and maintain the integration layer on your own. 2. Or, you (retailers) use a third-party integration software that's developed to communicate with fabric OMS. For example, Bascom develops integration software for fabric OMS. #### Step 4: Integrate OMS with Fraud Service Use fraud endpoints to integrate OMS with Fraud service #### Step 5: Create Shipment for the Allocations Configure integration service with fabric OMS in such a way that integration service uses the create shipment endpoint (POST/v3/allocations/search) to ship the order to the shopper's address after a warehouse is allocated with order details. #### Optional Steps: Search [orders](/v3/api-reference/orders/orders/find-orders) or [allocation](/v3/api-reference/orders/allocations/search-for-allocations-by-query) for additional information. **Get Allocations by orderId** You can get allocations by orderId using the [POST/v3/allocations/search](/v3/api-reference/orders/allocations/search-for-allocations-by-query) endpoint. **curl example:** ```JSON curl --location --request POST 'https://api.fabric.inc/v3/allocations/search?offset=0&limit=10' \ --header 'Authorization: {{accessToken}}' \ --header 'x-site-context: {"account":"63310842f37ee100111e9fe3"}' \ --header 'Content-Type: application/json' \ --data-raw ' { "sort": "-allocation.createdAt", "filters": [ { "field": "allocation.items.orderId", "value": "Order_*", "condition": "EQ" }, { "field": "allocation.items.itemId", "value": [ "Item_1122", "Item_2233" ], "condition": "IN" } ] }' ``` **Search Order allocation by allocationId** Use the [`GET/allocations/{allocationId}`](/v3/api-reference/orders/allocations/get-allocation-by-id) endpoint to get order allocation details by `allocationId`. # Order Return Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/order-return An order or portion of an order is eligible for return if: * It's fulfilled. * The items to be returned aren't previously returned. * The item’s `eligible` property is set to `false` in [check order return eligibility](/v3/api-reference/orders/returns/order-return-by-order-number) API response. * The item aligns with fabric's return policy. **General Rules:** * Return for an item is identified by the `exchange` boolean (`exchange` is set to `false`) field on the [return payload](/v3/api-reference/orders/returns/order-return-by-order-number). * Return for an order is validated for eligibility based on the orderId and lineItemId. * Charged amount in the [payments object](/v3/api-reference/orders/orders/create-new-order) of the order document shouldn't be null to process the refund. * Use the [`POST/v3/orders/{orderId}/actions/submit-return-request`](/v3/api-reference/orders/returns/order-return-by-order-id) endpoint to initiate order return by order ID. * You can also use the [`POST/v3/orders/order-number/{orderNumber}/actions/submit-return-request`](/v3/api-reference/orders/returns/order-return-by-order-number) endpoint to initiate order return by order number. * Order status should be one of: `ORDER_DELIVERED`, `ORDER_SHIPPED`, `ORDER_PARTIALLY_SHIPPED`, `ORDER_PARTIALLY_DELIVERED`, `ORDER_PARTIALLY_RETURNED`,\ `ORDER_PARTIALLY_CANCELLED`, `PICKUP_COMPLETE`. * The `lineOrderStatus` should be one of: `PENDING_EXCHANGE`, `RETURN_PROCESSING`, `PARTIALLY_CANCELLED`, `PARTIALLY_REFUNDED`,`PARTIALLY_CANCELLED_REFUNDED`,`VALID`, `PENDING_RETURN`, `ORDER_LINE_VALID`, `SHIPPED`, `PARTIALLY_SHIPPED`, `PARTIALLY_ALLOCATED`, `DELIVERED`, `PARTIALLY_DELIVERED`, `PARTIAL_RETURN`. * [Initiate a return when an item is pending to be received at the distribution center](#initiate-a-return-request-when-an-item-is-pending-to-be-received-at-the-distribution-center) * [Item reaches the distribution center and is processed for return](#item-reaches-the-distribution-center-and-is-processed-for-return-or-reject) * [Create a return when the item is received at the distribution center for return](#create-a-return-when-an-item-is-received-or-accepted-for-return) ### Initiate a return request when an item is pending to be received at the distribution center When a shopper or a customer service agent creates a return request, but the item isn't received at the distribution center: 1. Set `returnType` to `PENDING` in the request payload while using the `POST/v3/orders/{orderId}/actions/submit-return-request` endpoint to create a return. * `lineOrderStatus` will be updated to `RETURN_PENDING` for the line item of an order ID. Merchants can get the order details, along with the order status, by calling the `GET/v3/orders/{orderId}` endpoint. * `RETURN_PENDING` webhook event is triggered if the merchant has subscribed to the event. The target URL of the subscription payload is notified. **sample curl** ```json curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: MERCHANT_ACCOUNT_ID' \ --header 'x-site-context: {"stage":"sandbox","account":"MERCHANT_ACCOUNT_ID","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": false "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "PENDING", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` #### Item reaches the distribution center and is processed for return or reject * When an item reaches the distribution center, use the `POST/v3/orders/{orderId}/actions/submit-return-request` endpoint to set `returnType` to `PROCESSING` in the request payload. * `lineOrderStatus` will be updated to `RETURN_PROCESSING` for the line item of the order ID. You can get the order details, along with the order status, by calling the `GET/v3/orders/{orderId}` endpoint. * At this stage, the customer service agent at the warehouse or the distribution center does the quality checks such as, if the item is in good condition to return if the item matches the original order, etc. After a thorough inspection, the CSR can accept or reject the return request. * `RETURN_PROCESSING` webhook event is triggered if the merchant has subscribed to the event. The target URL of the subscription payload is notified about the event. **sample curl:** ```json curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: MERCHANT_ACCOUNT_ID' \ --header 'x-site-context: {"stage":"sandbox","account":"MERCHANT_ACCOUNT_ID","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": false "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "RECEIVED", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` * If customer service agent rejects the return request for any reason, they must use the `POST/v3/orders/{orderId}/actions/submit-return-request` endpoint to set `returnType` to `REJECTED`. * Provide proper reason and sub-reasons for rejecting the return request. * `lineOrderStatus` is updated to `RETURN_REJECTED` for the line item of the order ID. You can get the order details, along with the order status, by calling the `GET/v3/orders/{orderId}` endpoint. * `RETURN_REJECTED` webhook event is triggered if the merchant has subscribed to the event. The target URL will be notified of the event. **sample curl:** ```json curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: MERCHANT_ACCOUNT_ID' \ --header 'x-site-context: {"stage":"sandbox","account":"MERCHANT_ACCOUNT_ID","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": false "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "REJECTED", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` ### Create a return when an item is received or accepted for return * Use `POST/v3/orders/{orderId}/actions/submit-return-request` endpoint, and set `returnType` to `received`. * The amount received for return will be validated based on the invoiced amount for the item. If validation fails for any reason, an error message will be returned. * If a refund for returned item is successful, the response for the order return endpoint (POST/api/v2/order/return) will display `refundStatus` as `SUCCESSFUL`. * If all the quantity of line items are returned: * `lineOrderStatus` (return status at item level) will be updated to `RETURNED`. * `statusCode` (return status at order level) will be updated to `ORDER_RETURNED`. * If some of the quantities of line items are returned: * `lineOrderStatus` (return status at item level) will be updated to `PARTIALLY_RETURNED`. * `statusCode` (return status at order level) will be updated to `ORDER_PARTIALLY_RETURNED`. * If the refund failed for any reason, the response for the order return endpoint (POST/api/v2/order/return) will display `refundStatus` as `REFUND_FAILED`. * `RETURN_NOTIFICATION_EMAIL` and `REFUND_NOTIFICATION_EMAIL` webhook events are triggered if the merchant has subscribed to the events, and details are sent to the merchant. **sample curl:** ```json curl --location --request POST 'https://api.fabric.inc/v3/orders/orderId/actions/submit-return-request' \ --header 'tenant-key: MERCHANT_ACCOUNT_ID' \ --header 'x-site-context: {"stage":"sandbox","account":"MERCHANT_ACCOUNT_ID","date":"2022-11-24T10:36:54.603Z","channel":"12"}' \ --header 'Authorization: Bearer YOUR_AUTH_TOKEN_HERE' \ --header 'Content-Type: application/json' \ --data-raw '{ "returnedAt": "2022-07-11T15:03:14.642Z", "isExchange": false "credits": [ { "type": "GIFT_CARD", "source": "CSR", "amount": 21.5, "currency": "USD", "paymentCounter": 1, "attributes": { "giftCardNumber": "XlQZTmFDFtPFGMxJP6oiAqN3vo+qKZ" }, "reasonCode": "EC", "subReasonCode": "ACC", "employeeId": "12312232", "note": "Credit request initiated", "policyCode": "RC1" } ], "employeeId": "62272e917b12209e68751d94", "source": "CSR", "totalRefundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "reasonCode": "Incorrect item", "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "items": [ { "returnType": "RECEIVED", "orderLineItemId": "1", "shipmentId": "62b37697c67b204dd18a7465", "shipmentLineId": "12", "quantity": 1, "scannedAt": "2022-07-11T15:03:14.642Z", "reasonCode": "Incorrect order", "subReasonCode": "Incorrect specification", "refundAmount": 21.5, "refunds": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "fees": [ { "type": "FEE", "name": "RETURN_FEE", "reason": "Return fee", "amount": 34.56 } ], "isPolicyOverride": true } ], "attributes": { "fraudStatus": "FRAUD_PASS", "fraudCheckSessionId": "59f1d2b88de74aef96d3ec900ad548e0" } } ``` # Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/developer-guide/overview fabric's Order Management System (OMS), also referred to as fabric Orders, is a distributed order management (DOM) platform that helps retailers manage the order fulfillment process and provide inventory details, order fulfillment, and customer service. As retailers, not only can you receive, track, and fulfill customer orders across sales channels, you can allow customers to track their orders, route orders through warehouses based on the customer’s location, and more. This document provides details related to inventory creation, management, rules to configure inventory that suits your business needs, order orchestration, order exchange logic, and more information about fabric's Orders service. **Note:** In this document, the terms 'fabric Orders' and 'fabric OMS' are used interchangeably. * [Getting Started](#getting-started) * [Core Concepts](#core-concepts) * [Location](#location) * [Inventory](#inventory) * [Network](#network) * [Counter](#counter) * [Virtual Counter](#virtual-counter) * [Inventory Features](#inventory-features) * [Order Features](#order-features) * [Using fabric OMS](#using-fabric-oms) * [Prerequisites](#prerequisites) * [Generate Authorization Token](#generate-authorization-token) ### Workflow The following workflow diagram illustrates how fabric's Order Management System (also called fabric Orders) works: ![OMS Workflow Diagram](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/oms-workflow-diagram.jpg) ### Getting Started fabric's Orders service supports modern distributed commerce models, including buy-online-pickup-in-store (BOPIS), ship-to-store (for store pick up or replenishment), and store fulfillment (as mini distribution centers) models. It not only offers network aggregation for enterprise-level inventory visibility but also enables retailers to modify order fulfillment logic without the need for coding, thereby reducing the burden on developer resources. ### Core Concepts fabric OMS consists of two independent data orchestration modules: **Inventory** and **Orders**. The following are some of the other core concepts that are used while creating or updating inventory: #### Location Create a location, using [location APIs](/v3/orders-and-inventory/api-reference/inventory/locations/overview), for which you want to create an inventory or update inventory. You must provide a unique location number while creating a location. Use this location number to manage inventory. You can also create custom location attributes for a location by location number while creating or updating inventories. The following are two examples of location attributes: * BOPIS- to enable buy online and pick up in-store policy for a specific location. * Return- to enable inventory return policy for a warehouse in a specific location. #### Inventory Inventory refers to the goods and products for sale. Inventory endpoints let you: * Bulk import inventory from other sources to fabric OMS using the bulk import feature in Copilot or using the bulk import endpoint. * Create or update inventory records, set up inventory availability rules, and set inventory quantities (using the counter object) to display an accurate available-to-purchase quantity using the Copilot UI or by using API. See Create Inventory section for more information. * You can query the inventory of a specific item (by itemId), and in a specific region by SKU and postal code. For details, refer to the [Inventory](/v3/orders-and-inventory/api-reference/inventory/locations/overview) endpoints. #### Network A Network is a group of locations that share inventory. Using [network APIs](/v3/orders-and-inventory/api-reference/inventory/networks/delete-network-by-code), you can create custom networks (for example, ‘shipToHome’) to manage inventory within a specified set of locations. Use network endpoints to aggregate the quantity of the SKU in the “On Hand” and “Reserved” counter for a specified set of locations (warehouses or stores). You can specify “Safety Stock” inventory values for a network. #### Counter Counter refers to the position of the inventory, such as on-hand, allocated, shipped, etc. Using counter APIs, you can create any custom counter to suit your business needs. As per the on-hand counter quantity you pass in the request body while creating or updating inventory, `availableToPurchase` virtual-counter quantity is calculated based on the formula `onHand - allocated - shipped`. If you create a custom counter and mention it while creating or updating inventory, those custom counter quantities are also subtracted to calculate the `availableToPurchase` virtual counter quantity. From the left-side navigation pane, refer to *Orders > Developer Guide > Inventory Setup > Rules for Updating Counter Quantity* for more information on how to use counters while creating or updating inventory. #### Virtual Counter Virtual Counter refers to the inventory quantity that's available to sell by calculating the difference between available inventory and reserved for-purchase inventory. It helps prevent over-promising of inventory by subtracting the reserved-for-purchase inventory count from the in-warehouse inventory count. Use the “availableToPurchase” virtual counter with the formula `On Hand - Reserved - Backordered - Ordered - Acknowledged - Safety Stock` so that the virtual counter returns your physical inventory minus the reserved quantity. ### Inventory Features The inventory module of fabric OMS lets merchants: * Bulk imports inventory from all external sources of truth such as Warehouse Management System (WMS), Inventory Management System (IMS), or any other Point of Sale (POS). * Get the real-time quantity that's readily available to sell. * Create a network (group of locations) to aggregate inventory at different locations for a group of SKUs. * Create location attributes, such as `isReturn` (indicates if the location supports the return of sold items) or BOPIS (indicates if shoppers can buy the item online and pick it up in-store). These attributes represent inventory availability at a location level for omnichannel use cases. * Create safety stock to prevent overselling. * Flag stock levels of the item on the Product Description Page (PDP). * Set a backorder date that indicates the expected date of restocking. * Set a pre-order date that indicates the expected product launch date. ### Order Features Using fabric's Orders service, merchants can: * Integrate the order creation with any external 3rd party checkout service or POS. * Validate the order using integrated product and fraud services. Uses fraud endpoints to validate orders. * Automatically reserve products for the created order, and decrements inventory as orders are updated. * Allocate orders to locations (warehouses) that are nearest to the customer location. * Allocate orders to facilities in the order of the assigned facility rank. * Check if the order is a gift card or donation type, based on how merchants configure orders during the order creation. * Create shipment using POST `/api/v3/shipments` endpoint to write split allocations into distributed records for each parcel fulfilling the order. * Create invoices related to shipments capturing the payment at the time of order shipment and recording the transaction details. * Cancel orders to release the payment intent authorization for order lines in eligible statuses. * Return the order and refund the payment capture for order lines that are returned, excluding fees and shipment. * Create order appeasements, by manually refunding an arbitrary amount less than the captured amount per order line. * Exchange orders, by creating a zero-dollar order for a sku variant related to the return of an order line. * Audit Trails, by recording all actions (updates) on each of the 4 records- order, allocation, shipment, and invoice. * Set up webhooks, by subscribing to event types for third-party workflow triggering. * Create notifications, by triggering 18 different customer notification event types from order events. * Track packages, by posting updates from shipment tracking services to fabric OMS. ### Using fabric OMS * [Prerequisites](#prerequisites) * [Generate Authorization Token](#generate-authorization-token) #### Prerequisites 1. **Authorization token:** You must provide an access token while making an API request. fabric OMS supports both Identity v1 and Identity v2 approaches to getting access tokens. See the [Generate Authorization Token](#generateauthtoken) section to generate an authorization token using Copilot. 2. **Product data(optional):** You must provide product details if you are using a 3rd party product management system other than fabric’s Product Catalog, also referred to as fabric Product Catalog. fabric OMS needs product details such as name, description, image, and other related details for which you want to create inventory. 3. **Inventory data:** You must provide sku, itemId, location, channelId, and counters indicating factual quantities of products across all locations. Location includes physical stores, warehouses, in transit, and any third-party suppliers. #### Generate Authorization Token To generate an authorization token: 1. Log in to Copilot with your fabric credentials. 2. Navigate to Orders. 3. Right-click, and then click **Inspect**. 4. Navigate to the **Application** tab. 5. Under **Session Storage**, click the Copilot URL and find a value for `accessToken`. 6. This `accessToken` value is the authorization token you must use while calling fabric Offers APIs. **curl example:** ``` curl --location --request POST 'https://api.fabric.inc/v3/locations' \ --header 'x-site-context: {"date":"2021-11-11T21:48:47.769Z","channel":12,"account":"5f689caa4216e7000750d1ef","stage":"stg02"}' \ --header 'Authorization: eyJraWQiOiItOWxOcTZVcmR3bl9tNFJ2bDd1a2RMN0NUOUNndXIya3VJXzNjUnhnaG…' \ --data-raw ‘’ ``` **Note:** In the above example, `account` refers to the Copilot account ID. # Getting Started with Exports Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/exports/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Exports** API supports exporting data of different modules such as Orders, Locations, Allocations, Inventory, Invoices, Networks, Shipping\_Methods, and Aggregated\_Networks. fabric's Exports API lets you export module-specific data (saved in JSON format in the database) to a zip file. These zip files contain different CSV files where: * Each field of a single JSON schema is a file header (also called column title) in the CSV file * Each item of the JSON schema is a row in the CSV file The data, in the database, are arranged as nested objects and arrays which are complex to use. fabric's Exports API simplifies the data of a single object by segregating them into multiple CSV files (by specific identifiers) for ease of use. The following are the module (fabric service) names and its generated CSV files: 1\. Orders: order (exported by item), discount, logs, notes, payments, shipInfo\ 2\. Allocations: allocation, logs\ 3\. Shipments: shipment\ 4\. Shipping\_Methods: shipping\_methods\ 5\. Locations: location\ 6\. Invoices: invoice, appeasements, discounts, payments\ 7\. Inventory: inventory. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersExports.json) # Get uploaded file status and details Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/imports/get-uploaded-file-status-and-details imports.openapi get /oms-imports/{importId} Get uploaded file status and details by specifying `importId`. # Get uploaded files that match specified criteria Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/imports/get-uploaded-files-that-match-specified-criteria imports.openapi post /oms-imports/search Get uploaded files that match specified criteria. Returned as paginated records. # Getting Started with Imports Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/imports/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: `` | License: [fabric API License](https://fabric.inc/api-license) fabric **Imports** API supports importing data of different modules such as Orders, Invoices, and Shipments. fabric's **Imports** API lets you import module-specific bulk JSON in text file format in order to save these documents in fabric's databases. Each row in an uploaded text file represents a single JSON schema. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersImports.json) # Upload bulk file to import data Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/imports/upload-bulk-file-to-import-data imports.openapi post /oms-imports Upload bulk file by specifying file name. Successfully uploading the file triggers the import process, which is an event-driven extraction of the file's data to update the respective resource's system. # Orders (3.0.0) Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders--3-0-0 Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric Orders enable you to receive, track, and fulfill customer orders across sales channels, allow customers to track their orders, route orders through warehouses based on the customer’s location, and more. Orders is designed to streamline and simplify order management and fulfillment processes during and after an order is created. ## Role-Based Access Control (RBAC) fabric Copilot provides the ability to restrict the access of different users to information and actions available to them through roles. For more information and instructions on how to set up these controls, see the [RBAC](/v3/platform/settings/rbac/role-based-access-control-orders-roles) documentation. ## Integration Examples **Allocation with fabric Orders:** After creating an order using fabric Orders service, the orders service sends a request to fabric’s Allocation module for order allocation. Allocation calls Order Fulfillment Logic (OFL) and OFL rules to get the location number where the inventory is available based on the currently defined OFL rule system. After completion, OFL provides the necessary information to the Allocation service, and Allocation calls the inventory service to reserve items as needed, adjusting your inventory counters in real-time. The Order fulfillment process is set up by integrating your existing fulfillment systems, such as a Warehouse Management System (WMS), with fabric's Allocation APIs. This integration enables allocation-related events to start fulfillments in external systems, and allows external systems to make callbacks to the fabric Allocation APIs. **Shipments & Tracking with fabric Orders:** fabric's Shipment APIs ensure that shipments are created for allocations. These APIs enable the warehouse or any external fulfillment system to generate shipments associated with the allocated orders. Additionally, you can set up shipment tracking updates for orders by integrating your carrier tracking service with the Shipment Tracking APIs. These APIs enable the external carrier tracking service, such as ParcelLab, to post shipment events. With the order created, shipped, and tracking enabled, you can manage the order. This includes Cancellations, Appeasements, Exchanges, Credits, Returns, and more using the Orders APIs or [Manage Orders in Copilot](/v3/orders-and-inventory/user-guides/orders/order-management/overview) UI as needed. **Notifications with fabric Orders:** Optionally, you can configure email updates for order transactions by integrating your preferred email service with the Notification APIs. This integration enables fabric Orders to deliver real-time email notifications for specific order update events. **Fraud with fabric Orders:** To establish fraud prevention, you can integrate your preferred fraud service with the Fraud APIs. These APIs primarily allow for hold and release actions on the order, providing an effective means of preventing fraudulent activities. ## Benefits * **Customer Lifetime Value (CLTV)**: Manage the customer lifetime vale through omnichannel orders. With all your data in one place, improve customer service by reducing call volume, average handle time, and increase support satisfaction. Improve order orchestration by reducing split shipments, OOS cancellations, and increasing on time delivery rate. As a multi-brand and multi-channel retailer, improve order processing time, reduce inventory cancellations, and subsequently increase support satisfaction. * **Sell-through Rate (STR)**: You can increase sell-through rate by unifying and improving the Buy Online and Pickup in Store (BOPIS) experience, ship from store experience, and improved store inventory management. * **Storefront Conversion Rate (CVR)**: Using real-time inventory coupled with backorder and preorder capabilities, you can increase sell-through rate, website conversion, and site merchandiser operational efficiency. Additionally, you can optimize your inventory and fulfillment by reducing split shipments, OOS cancellations, and increasing on time delivery rate. ## Example Use Cases * **Exporting Sales and Reports Data**: Using fabric Orders export API, you can export data to be utilized for business intelligence or store the data externally as needed. The exports service flattens the JSON structure into columns, so that an external columnar database, such as an SQL database, can easily ingest the data. Exports can also be generated in fabric Copilot for ad-hoc analysis. * **Fulfilling Backorders & Preorders**: During the order creation process within fabric Orders service, backorders and preorders are identified and flagged accordingly. This enables the backorder and preorder service to store these orders in a dedicated backorder queue. Fulfillment of these orders follows a *first in, first out* approach as inventory becomes available for the backorders. Additionally, consent to delay operations are implemented based on your configuration of backorder settings. Orders that exceed the specified backorder service level require customer consent to proceed with the delay. fabric triggers the consent to delay notification based on your configuration, and updates regarding consent to delay are managed through the consent to delay API endpoint. * **Omnichannel Store Fulfillment**: You can maximize return on existing investments in physical locations, such as brick and mortar stores, by connecting ecommerce sales to store inventories that are eligible for direct-to-consumer shipments. By bringing store inventory into the fulfillment network, you can expand capacity for ecommerce sales and increase the available assortment for online shoppers. * **Optimized Order Fulfillment Logic**: Using fabric's Order Fulfillment Logic (OFL) you can configure how orders are handled for different items, locations, sales, shipping types, and more. For example, multi-location fulfillment allows you to allocate orders to specific fulfillment locations based on factors, such as shipping type, geographic distance, and inventory availability. This flexibility enables efficient order processing and reduces shipping times. For same-day delivery optimization, fabric's geolocation feature can be utilized. It considers the customer's location and searches for inventory networks within a set distance that can fulfill the order the fastest. This feature can be configured with specific boundaries and inventory balancing options to ensure the fastest possible delivery. Split shipment management is another key feature, allowing orders to be fulfilled from multiple locations when necessary. This can be set up at both the order and item level, with options to allow partial fulfillment. This functionality is particularly useful when dealing with complex inventory situations or when aiming to optimize delivery times for multi-item orders. ## Related topics * [Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview) * [Inventory](/v3/orders-and-inventory/user-guides/inventory/overview) * [Inventory API reference](/v3/orders-and-inventory/api-reference/inventory/inventory--3-0-0) * [Orders API developer guides](/v3/orders-and-inventory/api-reference/orders/developer-guide/order-and-inventory-import) # Orders FAQ Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders-faq-s #### How can I insert fees, discounts, and taxes at the order level and item level? * To insert fees, discounts, and taxes at item level, include the details in the `_items_ array` while creating an order. * To insert fees, discounts, and taxes at order level, include the details outside the *items* array while creating an order. For details, see the request payload of [Order Create](/v3/orders-and-inventory/api-reference/orders/orders/create-new-order). #### How does the fabric Orders module manage customer data security and privacy? fabric’s REST APIs are protected with OpenID Connect (OIDC) along with the identity introspector mechanism. In OIDC, identity information is communicated using JSON Web Tokens (JWTs). The data in fabric is stored in both MongoDB and S3. The MongoDB data is isolated per tenant in fabric Orders (also called OMS). You must create an [AWS configuration rule](https://aws.amazon.com/blogs/security/how-to-use-aws-config-to-monitor-for-and-respond-to-amazon-s3-buckets-allowing-public-access/) to ensure that the AWS S3 Bucket doesn't have public access. For example, one shouldn't be able to run: ```shell curl https://inventory-oms-refresher-prod01.s3.amazonaws.com/chicosprod/export/store/FabricStoreInventorySync%5FCHO%5F2023-06-15T08-31-00-827090592Z.csv ``` Whenever data is requested, fabric will generate a S3 presigned URL to ensure secure access. #### What's the primary use case of the fabric Orders service? The fabric Order service is designed to streamline and simplify order management and fulfillment processes during and after an order is created either by using a checkout service or at the Point of Sale (POS). It contains features to simplify advanced configurations in addition to the standard post order operations and fulfillment workflow rules engine capabilities common to the functionalities and jobs supported by most Enterprise Order Management and Distributed Order Management Systems. #### What are the key features of the fabric Orders module? Backorder and Preorder, simplified configuration interfaces for setting post order validation and customer service policies, Customer Service and Returns Management operational interfaces, Digital Security and Role based access, Dropship integration and fulfillment, Incident Management, Fulfillment Rule Setting. #### How can I get started with the fabric Orders module? If you are using fabric Orders with fabric Store Fulfillment and fabric Inventory, you can start creating orders using the [order create endpoint](/v3/orders-and-inventory/api-reference/orders/orders/create-new-order) after inventory is set up. Alternatively, you can disable inventory reservation for order fulfillment by contacting [fabric support](https://support.fabric.inc/hc/en-us/requests/new). #### How does fabric Orders (also called OMS) handle the order fulfillment process? Once order is created using fabric Orders service, it sends request to fabric’s Allocation module for order allocation, then Allocation calls Order Fulfillment Logic (OFL), OFL rules get the location number where the inventory is available, and responds back to Allocation, and Allocation calls inventory to reserved items for the location number received from OFL. Order fulfillment process is set up by integrating your existing fulfillment systems, such as the Warehouse Management System (WMS), with the Allocation APIs of the fabric Orders module. This integration enables allocation-related events to start fulfillments in external systems, and it allows external systems to make callbacks to the fabric Allocation APIs. Shipment APIs ensure that shipments are created for allocations. These APIs enable the warehouse or any external fulfillment system to generate shipments associated with the allocated orders. You can establish the configuration for transactional email updates regarding orders by integrating your preferred email service with the Notification APIs of the fabric Orders module. This integration enables fabric Orders to start real-time email notifications for specific order update events. To establish fraud prevention of orders, you can integrate your preferred fraud service with the Fraud APIs of fabric’s Order module. These APIs primarily allow for hold and release actions on the order, providing an effective means of preventing fraudulent activities. You can set up shipment tracking updates for orders by integrating your carrier tracking service with the Shipment Tracking APIs of fabric’s Orders module. These APIs enable the external carrier tracking service, such as ParcelLab, to post shipment events. #### Can fabric Orders handle orders from multiple channels? Yes, the order create API can be integrated with systems such as web storefront, POS, and other sales channels. This integration enables the posting of orders to a centralized application database, ensuring a single source of truth for all orders. When dealing with multi-brand orders that require separation of customer service and operational workflows, the `channel` field in the `order.channel` and `order.items.channel` JSON objects allows creating orders with separate groupings. #### How does fabric’s Orders service manage returns and exchanges? When processing returns using fabric’s Orders module, the result can be either a pending return for tracking purposes or an immediate completion of the return process for the order. An order or items of an order are eligible for return if: 1. It has been fulfilled 2. The items to be returned haven't been previously returned 3. The item's eligible property isn't set to false in the check order return eligibility API response, which is configured using the Return Policies interface. Return requests can be initiated using either the order ID or the order number as identification. The response object specifies refund amount, return fees to subtract from the refund, and reason codes for the return. If a refund for a returned item is successful, the response for the order return endpoint will display `refundStatus` as SUCCESSFUL. If the refund fails for any reason, the response for the order return endpoint will display `refundStatus` as REFUND\_FAILED. Order details can be accessed by calling the [return endpoints](/v3/orders-and-inventory/api-reference/orders/returns/overview). Exchange requests within fabric are initiated using the same [return endpoints](/v3/orders-and-inventory/api-reference/orders/returns/overview) provided that the `isExchange` flag must be set to `true`. #### How does fabric’s Orders module handle payment processing? fabric Orders module can either be used to orchestrate payment operations, or payments can be disabled for the system. This is currently only configured by fabric Support during the onboarding process. #### How does fabric’s Orders module manage tax calculations for different regions? fabric Orders doesn't manage tax calculation. Taxes must be calculated by the client by using tax calculation services external to fabric, during update operations to the order. #### Can I customize the interface and workflows within fabric’s Orders module to fit my business needs? Yes, fabric provides the flexibility to customize the interface and workflows to support your business needs. An use case is creation of an order after shoppers complete the checkout process involves minimal data validation. * You can configure data validation settings in the [attributes interface](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes), so that orders with invalid attributes or values can be flagged immediately after order placement. * You can also configure the validation process for post-order updates, such as returns, exchanges, cancellations, appeasements, and pickups, using Policies in Copilot. This enables you to obtain eligibility information for these operations on a per-order basis and customize the workflow associated with these operations.\ **Note:** For information on the process of returning and canceling orders, refer to the guide that explains [canceling SKUs](/v3/orders-and-inventory/user-guides/orders/order-management/cancel-skus) and the Orders [Cancellation API](/v3/orders-and-inventory/api-reference/orders/cancellations/overview). * You can manage backorder fulfillment settings such as the consent to delay workflow using the [backorder settings API](/v3/orders-and-inventory/api-reference/orders/backorders-preorders/overview). * Setting up integrations using the webhooks and integration-related APIs enables the notification of various order updates to shoppers, efficient allocation of orders to the most suitable warehouse or facility for inventory confirmation and product shipping, as well as the provision of shipment tracking updates. #### How does fabric’s Orders module support my customer service team? fabric’s customer service operations can be used either in the Copilot interface or within your existing customer service and relationship management application. fabric Orders doesn't currently offer native support for case management. However, retailers using a customer service application can choose to use fabric Copilot alongside their existing customer service application, or embed fabric Orders APIs for handling cancellations, returns, exchanges, appeasements, and other supported order updates directly within their CSR application. #### Does fabric’s Orders module help generate sales and performance reports? Yes, you can perform export operations using the export API, which can be utilized through integration for business intelligence and storing the data in external data warehouses. The exports service flattens the JSON structure into columns such that an external columnar database such as an SQL database can ingest the data. Exports can also be generated using Copilot for ad-hoc analysis. #### How does fabric’s Orders module handle international orders and shipping? fabric Orders module includes the Crossborder API with basic hold and release functions for your external applications to manage the crossborder fulfillment process. The fabric databases also support all UTF-8 languages and support ISO 4217 currency codes during order create and update operations. These currencies and languages will reflect in any read operation through API or Copilot. There are no additional international order functions than these. #### How's customer information stored and managed in the fabric Orders module? Customer information is stored within the order JSON, and any bulk updates to customer data must be performed using the standard order update functions. The fabric Orders module doesn't maintain customer data in a separate collection. Additionally, a customer [edit API](/v3/platform/api-reference/customers/customer-self/overview) is available for client web applications, simplifying the process of updating customer data within orders. #### Does fabric’s Orders module support order migration from my existing platform? Yes, fabric Orders provides a set of [import APIs](/v3/orders-and-inventory/api-reference/orders/developer-guide/order-and-inventory-import) to manage the order import process, primarily to support post-order operations on orders that may be required after transition from your current order services to fabric Orders. #### How does fabric’s Orders module manage backorders and preorders? During the order creation process within fabric Orders, backorders and preorders are identified and flagged accordingly. This enables the Backorder and Preorder service to store these orders in a dedicated backorder queue. Fulfillment of these orders follows a "first in, first out" approach as inventory becomes available for the backorders. Additionally, consent to delay operations are implemented based on the configuration of backorder settings. Orders that exceed the specified backorder service level require customer consent to proceed with the delay. fabric triggers the consent to delay notification based on the merchant's configuration, and updates regarding consent to delay are managed through the consent to delay endpoint. #### How does the fabric Orders module integrate with fabric Inventory? By default, fabric Orders is designed to seamlessly integrate with fabric Inventory module for new users. Users of both modules get the advantage of real time updates ensuring that inventory availability is automatically updated as orders are fulfilled. fabric provides the flexibility to its customers to disable fabric Orders and use fabric Inventory as a standalone module, as well as disable fabric Inventory and use fabric Orders as a standalone module. To disable or re-enable a module, please contact [fabric Support](https://support.fabric.inc/hc/en-us/requests/new). The benefits of using modules independently are primarily for the purpose of implementing the strangler pattern, where the transition process occurs gradually on a service-by-service basis. # Add items to shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-method-items/add-items-to-shipping-method shipping-methods.openapi post /shipping-methods/{shippingMethodId}/actions/add-items You may want to offer different shipping options for items based on their weight and dimensions, or you may want to offer promotional shipping rates based on order value, customer loyalty, etc.

This endpoint lets you add items to an existing shipping method so that shoppers can see the options.

# Delete items from shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-method-items/delete-items-from-shipping-method shipping-methods.openapi post /shipping-methods/{shippingMethodId}/actions/delete-items Certain items may need to be removed from a shipping method when they're discontinued, new shipping restrictions are imposed on hazardous items, or when they're not eligible for current promotions.

Using this endpoint, you can delete one or more items from the given shipping method.

# Get item IDs for given shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-method-items/get-item-ids-for-given-shipping-method shipping-methods.openapi get /shipping-methods/{shippingMethodId}/items You may want to determine what items are in a specific shipping method, to calculate shipping costs, verify the eligibility of items for specific shipping methods, or display the list of items to shoppers during the checkout process.

This endpoint is used to get item IDs for a given shipping method.

# Get shipping methods Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-method-items/get-shipping-methods shipping-methods.openapi post /shipping-methods/actions/filter-by-item-id You may need to periodically review shipping methods associated with an item, either to answer related queries or to verify they're up to date.

This endpoint gets shipping methods for the given item ID.

# Create shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-methods/create-shipping-method shipping-methods.openapi post /shipping-methods On your storefront, shipping methods determine how products are delivered to your customers. Some of the common shipping methods are domestic, international, free shipping, and express delivery.

This endpoint is used to create a new shipping method. In the response, you will also get a shipping method ID, which will be required for subsequent calls to get, update, and delete this shipping method.

# Delete shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-methods/delete-shipping-method shipping-methods.openapi delete /shipping-methods/{shippingMethodId} When a particular shipping service is discontinued or certain shipping methods have become redundant or non-compliant with existing regulations, you may want to remove them so they're not shown to shoppers.

This endpoint deletes a shipping method by ID.

# Find shipping methods Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-methods/find-shipping-methods shipping-methods.openapi post /shipping-methods/search At checkout, customers choose their preferred shipping method based on delivery timelines and costs. Moreover, it may be necessary for you to review available shipping methods to ensure they're current and accurate. To support these scenarios, you must get the latest shipping methods.

This endpoint gets shipping methods based on given filter conditions.

# Get shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-methods/get-shipping-method shipping-methods.openapi get /shipping-methods/{shippingMethodId} When an order is placed, the selected shipping method is stored as part of order details. You may need to review them for order related queries.

This endpoint gets details of a single shipping method by ID.

# Update shipping method Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipping-methods/update-shipping-method shipping-methods.openapi put /shipping-methods/{shippingMethodId} To comply with legal regulations and for other purposes, it may be necessary to update shipping rates or delivery timelines.

With this endpoint, you can update shipping details by ID. This completely replaced existing information.

# Add or update items in a shopping list Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-list-items/add-or-update-items-in-a-shopping-list lists.openapi post /lists/{listId}/actions/add-or-update-list-items Once a shopping list is created, shoppers can add new item to it or update existing ones. This endpoint is used to add and update items in a list.

- If the specified `sku` is not in the list, a new item is added to the list with the given `quantity`.
- If the specified `sku` is already in the list, its current quantity is updated based on the given `incQuantity`.

**Note**: At least one item must be in the request body.

# Delete items from shopping list Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-list-items/delete-items-from-shopping-list lists.openapi post /lists/{listId}/actions/delete-list-items Over time, shoppers' preferences may change, or they might have added an item to their shopping list by mistake.

This endpoint lets your shopper remove one or more products from the specified shopping list.

# Get shopping list and its items Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-list-items/get-shopping-list-and-its-items lists.openapi get /lists/{listId}/actions/get-list-details By specifying list ID, you can get shopping list details along with its items. # Get shopping list items by list ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-list-items/get-shopping-list-items-by-list-id lists.openapi get /lists/{listId}/list-items Shoppers may periodically review their shopping list to check for discounts or when they are ready to make a purchase.

This endpoint gets a paginated list of items by list ID. You can refine the results by specifying `offset` and `limit`. When they are not specified, you will get up to 10 records.

# Get shopping lists of a user along with associated items Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-list-items/get-shopping-lists-of-a-user-along-with-associated-items lists.openapi get /lists/users/{userId}/actions/get-list-details-with-items Shoppers may periodically review their shopping lists and their associated items.

This endpoint gets shopping lists and associated items. For each list, you can view list ID, list name, user ID, list type, notes, custom attributes, items count, times of list creation and list update, as well as item details.

# Create shopping list Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/create-shopping-list lists.openapi post /lists Shoppers often choose to save their desired products in shopping lists to purchase later when they are ready or to take advantage of discounts when they are available.

This endpoint creates a new shopping list. The response includes a list ID, which is required for subsequent calls to get, update, or delete this shopping list.

**Note**: Items can't be added when the shopping list is initially created. To add items, use the *Add items to list* endpoint - `POST /lists/{listId}/actions/add-or-update-list-items`.

# Delete a shopping list by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/delete-a-shopping-list-by-id lists.openapi delete /lists/{listId} Shoppers need to remove unwanted or irrelevant shopping lists. With this endpoint, they can delete a list by list ID. # Get a shopping list by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/get-a-shopping-list-by-id lists.openapi get /lists/{listId} Get details of a shopping list by ID, along with the number of items in it. # Get shopping lists of a user Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/get-shopping-lists-of-a-user lists.openapi get /lists/users/{userId} Shoppers may want to periodically review their shopping lists and ensure they are up to date.

This endpoint gets a paginated response of shopping lists by user ID. For each list, you can view user ID, list ID, list name, type, notes, custom attributes (if any), as well as time of list creation and update.

**Note**:
1. You can refine the results by specifying `offset` and `limit`. When they are not specified, you will get up to 10 records.
2. To view items in a list, refer to *Get lists with items* endpoint - `GET /lists/users/{userId}/actions/get-list-details-with-items`.

# Getting Started with Lists Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Shopping Lists** API is a multi-tenant service that allows your shoppers to manage their shopping lists for future purchases. Shoppers can create lists, add items to lists, update lists and list items, as well as delete unwanted lists and items. Shopping lists are a popular e-commerce feature allowing shoppers to save desired products for future purchase. It not only helps to minimize shopping cart abandonment but also provides valuable insights into product popularity. In addition, shoppers who maintain shopping lists can be engaged in targeted marketing campaigns, enhancing customer engagement and satisfaction. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersLists.json) # Update a shopping list by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shopping-lists/update-a-shopping-list-by-id lists.openapi put /lists/{listId} Shoppers like to update their shopping lists and keep them relevant.

By specifying list ID, this endpoint lets your shoppers update their shopping list details such as list name, list type, notes, and custom attributes.

# Create a Network Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/create-a-network This topic covers the process for creating a new network used to fulfill orders and sort inventory. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Creating a Network 1. In the left menu, click **Inventory** > **Networks**. The **Manage Networks** page is displayed. 2. Click **Create Network**. The **Create Network** page is displayed. ### Adding basic information 1. In the **Network Name** field, enter a name. fabric suggests that you provide a descriptive and unique name for each network. For example, *NA Fulfillment STH Network*. 2. (Optional) In the **Description** field, provide a description. 3. In the **Select type of Network** field, select one of the following: * [Single Network](#creating-a-single-network): To create conditional rules, products, and locations for an individual network. * [Multiple Networks](#creating-a-new-multi-network): To group existing networks together to form a new network. ### Creating a single network In the **Setup your Rules** section, you must create rules. These rules are used to match items and locations to a network. 1. In the **Attribute type** field, select one of the following: * **Product**: Applies rules that search for product attributes in your product catalog and adds matching products to your network. * **Location**: Applies rules that search for locations based on the defined location attributes and adds matching locations to your network. 2. In the **Attribute name** field, select an attribute name. 3. In the **Contains** field, select a condition. 4. In the **Add Value** field, enter an attribute value. To add values, type the value and press enter. Multiple values are supported. For example, if you want to add only *North America* locations to a network, you can select the **Attribute type** `Location` to add locations to your network. To filter what locations are going to be added, select an **Attribute name** such as `channelId` with the operator `Contains`, and the value `NA`. This adds any locations with a `channelId` containing `NA` to the network. 1. (Optional) You can add an additional rule condition by clicking **Add condition**. This condition is an **AND** condition. To add an **OR** condition, click **Add Rule**. 2. In the **Add Inventory Availability** section, use the **Safety Stock Quantity** field to enter the number of units you want to reserve. Safety stock is a quantity of inventory kept on hand to protect against uncertainties in demand or supply. The actual safety stock for a network is the sum of the network-level safety stock plus the aggregated safety stock for every location in the network. The low stock level field is used to trigger alerts or actions when inventory for a product or in a location falls below the specified threshold. This prevent stockouts and helps maintain optimal inventory levels. 1. In the **Define low stock level** section, enter the number of units to trigger a low stock alert. ### Creating a new multi network The **Multiple Networks** option allows you to add multiple **Single Networks** together to form a new network. For example, if you recently expanded to ship international, you can differentiate North America, Asia, Europe and other continents by combining them into a new network. This network can then be referenced during inventory and order fulfillment instead of needing to individually list each single network. 1. In the **Single Network** field, select a network. 2. Click **Add**. The network is added to the table. Continue to add networks as needed. If you want to edit a network's **Safety Stock** or **Low Stock** levels, you must select the network from the **Manage Networks** page and edit it. Editing a **Single Network** that's apart of **Multiple Networks** will update its settings and rules across networks. # Creating a Location Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/create-location Locations are used to fulfill orders This topic covers the process for creating a new location used to fulfill orders. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Creating a Location 1. In the left menu, click **Inventory** > **Locations**. The **Locations** page is displayed. 2. Click **Create Location**. The **Create Location** page is displayed. By default, all new locations are assigned **Active** status. Locations with an **Active** status are part of your inventory network, while those with an **Inactive** status aren't. 1. You can remove a location from your inventory network by changing the **Active** toggle setting to **InActive**. ### Adding basic information 1. In the **Location Name** field, enter a name. fabric suggests that you provide a descriptive and unique name for each location. For example, *Washington large item warehouse*. 2. In the **Location Number** field, enter a location number. 3. In the **Location type** field, select one of the following options: * **Store** * **Distribution Center** (DC) Two different location types are available, **Store** and **Distribution Center** (DC). 4. In the **Coordinate 1** and **Coordinate 2** fields, enter the location's longitude and latitude coordinates. The coordinates are used for geolocation during order allocation. The longitude value must fall between *-180* and *180*, and the latitude value must be between *-90* and *90*. For example, Coordinate 1 can be set to *-122.3493* and Coordinate *2* set to *47.6205*. ### Adding an operating schedule The **Operating Schedule** sections contains an **Operating Hours** tab, where you can add the location’s hours with the option with separate hours for store operation and curbside pickup. 1. (Optional) To enable specific operating hours, click the **Enable specific operating hours (optional)** field. The **Select working days** and **Store hours and curbside pickup are the same** fields are displayed. 2. In the **Select working days** field, choose the days you want to set as working days. For each selected day, **Operating hours** and **Operation location** fields are displayed. 3. In the **Operating hours** fields, select the opening and closing hours. Clicking the operating hours field opens a menu with increments of 30 minutes starting at 12:00 AM. 4. In the **Operating location** field, select one of the following options: * **Store and Curbside Pickup** * **Store only** * **Curbside pickup only** * **Closed** 5. (Optional) To have separate hours for **Curbside** and **Store**, click the plus (`+`) icon. A new blank day is added where you can select different **Operating hours** and a different **Operating location**. Selecting the copy icon clones the day, and selecting the delete icon deletes the row. ### Capacity limits You can optionally set the maximum number of allocations that a location can process at one time. By default, capacity limits are disabled. Disabling the capacity limit allows the location to be assigned unlimited allocations for fulfillment, until inventory is unavailable. 1. To set a capacity limit, click **Enable capacity limit (optional)**. The **Default Capacity Limit** field is displayed. 2. Enter the capacity limit. ### Contact & address In the **Contact & Address** section, fill out the information for a primary contact for the location, as well as, the location’s physical address. All fields are optional except for **Region** which is required. After updating the capacity limits, you can click **Create** to create the location or proceed to adding **Custom Attributes**. ## Custom Attributes Clicking the **Custom Attributes** tab opens the **Additional Attributes** section for the **Create Location** page. When you want to reference locations in network rules during fulfillment, you can assign attributes, such as a region, to each location. This prevents fulfillments from taking place in the wrong region. For example, a retailer might have warehouses in the United States, Europe, and Mexico. This retailer can create a *North America* network that references all locations in North America using the *location* attribute. When fulfilling orders, the fulfillment ruleset will ensure that the region matches the location with inventory preventing costly fulfillments outside North America. 1. To add custom attributes, click the **Add custom attributes** field. A list of location attributes is displayed. When creating an order attribute, you are asked to provide a section. Only the attributes for the location section are displayed. You can create a new location attribute by following the instructions in the [Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes) section. 2. Select the attributes that you want to add. Clicking an attribute displays a checkmark next to it and adds it to the **Add custom attribute** field. 3. Click **Add**. 4. Depending on the attributes that are selected, enter the required attribute value. For example, if you select **location**, a **location** field is displayed, and you can enter your location’s address. This attribute can then be referenced when creating an [order fulfillment ruleset](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/create-a-new-rule-set-ui). # Exporting Locations Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/export-locations The export record CSV files consist of locations, scheduled outages, and temporary capacity override data. The exported data is based on the filters currently applied to the **Locations** table, which consists of the location number, name, address, status, and capacity. You can export records for particular locations by applying the necessary filters to refine the results before exporting. These records can be used by your internal systems or third-party tools. ## Prerequisites * Ensure that you have **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Exporting Location Records 1. In the left menu, click **Inventory** > **Locations**. The **Locations** page is displayed. 2. Click **Export**. The **Export** window is displayed. Each export type displays how many locations, scheduled outages, or temporary capacity plans are available. The results depend on the filters applied and the locations displayed based on those filters. 3. Select one of the following export types: * **Locations data**: Displays the number of locations found within your filter parameters. Select this option to export data containing all location attributes and store hours. * **Scheduled outages**: Displays the number of locations with scheduled outages found within your filter parameters. Select this option to export all outage attributes such as `outageId`, `OutageNumber`, `locationNumber`, schedule dates, and the `reasonCode`. * **Temporary capacity plans**: Displays the number of locations with temporary capacity overrides found within your filter parameters. Select this option to export all temporary capacity override attributes such as `capacityOverrideId`, `capacityOverrideNumber`, `locationNumber`, schedule dates, and the `reasonCode`. 4. Click **Export**. The export is downloaded as a .ZIP file that contains a CSV file and saved to your computer. Additionally, a window is displayed with a link to the **Activity Log** page. This page allows you to re-download the export and view its status. # Importing Locations Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/import-locations The **Import Locations** feature allows you to efficiently add multiple store or warehouse locations to fabric. This streamlined process eliminates the need for manual data entry, reducing the risk of errors while saving you time and effort. To assist with this process, fabric provides CSV template files for **Locations**, **Temporary Location Capacity**, and **Scheduled Location Closures**. ## Prerequisites * Ensure that you have **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Importing Locations 1. In the left menu, click **Inventory** > **Locations**. The **Locations** page is displayed. 2. Click **Import**. The **Import CSV file** window is displayed. 3. Select one of the following fields depending on your requirements: * **Locations**: Use this option to import locations that currently do not exist in fabric. * **Scheduled Location Closures**: Use this option to import location schedule updates and changes. * **Temporary Location Capacity**: Use this option to import temporary location capacity updates. You must select the correct field to download its corresponding template. 4. Download the sample template by clicking **template here** at the bottom of the window. 5. Depending on the CSV file you downloaded, review the required and optional columns for the template: * [Locations template](#locations-csv-file-template) for the **location.csv** file. * [Location outages template](#location-outages-csv-file-template) for the **location\_outage.csv** file. * [Location capacity overrides template](#location-capacity-overrides-csv-file-template) for the **location\_capacity\_override.csv** file. 6. In the **Import CSV file** window, do one of the following: * Drag your file to the **drag and drop** field. * Click **Select a File** from your computer and select your CSV file. The file is uploaded displaying the file name and size. 7. (Optional) You can click **Remove** to delete the uploaded file or **Replace** to replace the file. 8. Click **Submit**. The import status can be viewed on the **Inventory** > **Activity Log** page. ### Locations CSV file template Importing locations requires updating the *location.csv* template file. If a field in a column remains blank, it's set to null by the system. Ensure fields don't contain blank spaces, returns, line breaks, or other characters. Not following the format suggested in the template can result in errors when uploading. | Column | Description | | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **locationNum** (Required) | Specifies the unique location number. | | **name** (Required) | Specifies the location name. | | **isActive** | Determines if the location is active or inactive for order fulfillment operations. This can be set to `TRUE` for active and `FALSE` for inactive. | | **address\_addressLine1** | Specifies the locations first address line. | | **address\_addressLine2** | Specifies the locations second address line. | | **address\_addressLine3** | Specifies the locations third address line. | | **address\_addressLine4** | Specifies the locations fourth address line. | | **address\_city** | Specifies the location city name. | | **address\_countryCode** | Specifies the locations country code. For example, `CA` for Canada or `US` for United States. | | **address\_state** (Required) | Specifies the locations region, state, or province. | | **address\_postalCode** | Specifies the locations postal or zip code. | | **address\_type** | Specifies the locations address type. For example, `Home` or `Business`. | | **contacts** | Specifies the locations contact details. Each child attribute in the contacts object is separated by an underscore. For example, `HOME_home@gmail.com_604-999-1860_JoeMadison`. | | **capacity\_isInfiniteAllocation** | Determines if the location has a capacity limit or not. Set to `TRUE` to disable capacity limit and `FALSE` to enable capacity limit. | | **capacity\_maxAllocations** | Determines the locations capacity limit amount. For example, `100` allocations. This value is required if **capacity\_isInfiniteAllocation** is `FALSE`. | | **capacity\_currentAllocations** | Specifies the locations current amount of allocations. This value is required if **capacity\_isInfiniteAllocation** is `FALSE`. | | **operatingHours\_day\_hours\_open\_hours\_close\_hours\_type** | Specifies the locations operating hours. The following format is used to provide operation hours, day of the week, store opening time in 24 hour format, closing time in 24 hour format, location type. For example, `MONDAY_2022-10-19T15:26:30.884+00:00_2022-10-19T15:26:30.884+00:00_PICKUP`. | | **attributes\_source** | Example of a custom source attribute. By default this columns values are empty. | | **attributes\_openedAt** | Example of a custom date-time attribute. By default this columns values are empty. | | **attributes\_region** | Example of a custom region attribute. By default this columns values are empty. | | **services\_channel** | Specifies the locations sales channel ID. | | **services\_brand** | Specifies the locations brands. | ### Location outages CSV file template Importing location outages requires updating the *location\_outage.csv* template file. If a field in a column remains blank, it's set to null by the system. Ensure fields don't contain blank spaces, returns, line breaks, or other characters. Not following the format suggested in the template can result in errors when uploading. | Column | Description | | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **disabledFulfillmentMethods** (Required) | Specifies the fulfillment method you want to disable for a location. For example, `["PICKUP"]`. | | **locationNumber** (Required) | Specifies the unique location number. | | **schedule.endDate** | Specifies the end date and time of the location outage in UTC format. For example, `2025-12-20T09:30:31.198Z`. | | **schedule.isIndefinite** (Required) | Determines whether the location outage remains in effect indefinitely. Set to `FALSE` if you have provided a start and end data for the outage. Set to `TRUE` if you want the outage to remain in effect indefinitely. | | **schedule.startDate** | Specifies the start date and time of the location outage in UTC format. For example, `2025-12-20T09:30:31.198Z`. | | **outageNumber** | Indicates the reason for the outage. | ### Location capacity overrides CSV file template Importing capacity overrides requires updating the *location\_capacity\_override.csv* template file. If a field in a column remains blank, it's set to null by the system. Ensure fields don't contain blank spaces, returns, line breaks, or other characters. Not following the format suggested in the template can result in errors when uploading. | Column | Description | | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **capacity** (Required) | Specifies the temporary capacity increase amount. For example, `100`. | | **locationNumber** (Required) | Specifies the unique location number. | | **schedule.startDate** | Specifies the start date and time of the capacity override in UTC format. For example, `2025-12-20T09:30:31.198Z`. | | **schedule.endDate** | Specifies the end date and time of the capacity override in UTC format. For example, `2025-12-20T09:30:31.198Z`. | | **schedule.isIndefinite** (Required) | Determines whether the capacity override remains in effect indefinitely. Set to `FALSE` if you have provided a start and end data for the override. Set to `TRUE` if you want the override to remain in effect indefinitely. | # Inventory Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/manage-inventory-overview See the stock of goods across locations all in one spot The **Inventory** page displays a table containing a list of all the items in your inventory across all locations. This table contains metrics such *SKU*, *Location*, *Channel*, *Status*, *Last Updated*, and the total quantity of each item that's *Available to Purchase*, *Available to Backorder*, and *Available to Preorder*. ## Prerequisites * Ensure that you have **Inventory Editor** or **Administrator** privileges to fabric Inventory or **Inventory Viewer** to view the page. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Filtering Inventory The **Inventory** page displays a [inventory table](#inventory-table) that includes every SKU. This list can be filtered by **Channel**, **Network code**, **Status**, and **Last Updated** so that the list only displays inventory that match the filter parameters. By default, only the SKUs updated in the last 7 days are displayed. To view additional filters, click the **More** button. The additional options enable you to filter by most attributes associated with inventory, such as *style*, *shipping weight*, *prop 65 warning*, *primary color*, and more. You can apply any combination of standard filters and additional filters from the **More** menu simultaneously. ## Inventory Table Clicking a SKU in your inventory table displays the **Inventory Detail** page. This page displays details such as how that SKUs stock is allocated across your locations, attributes, and an activity log. | Column | Description | | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **SKU** | A stock-keeping unit (SKU) is a unique identifier assigned to each distinct product variation. | | **Location** | Displays the warehouse or store location where the inventory is stored. | | **Channel** | Displays the channel, such as **12** for the United States or **13** for Canada. Additional channels created in fabric Experiences or using the API are also available. | | **Status** | Displays the real-time status of a specific product SKU at a specific location. For more information, see the [Inventory Statuses](#inventory-statuses) section. | | **Available To Purchase** | Displays the current *available to purchase* amount for a SKU at the specified location. | | **Available To Backorder** | Displays the current available to *backorder* amount for a SKU at the specified location. | | **Available To Preorder** | Displays the current available to *preorder* amount for a SKU at the specified location. | | **Last Updated** | Displays when the inventory was last updated. | ### Inventory statuses The inventory status metric is used describe the current status of an individual SKU for each location. The following table describes each inventory status: | Status | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Available** | Indicates that the specific SKU is currently in stock and can be purchased. | | **Low stock** | Indicates that the SKUs available stock has fallen below a predetermined threshold. The `lowStock` value is an optional integer that can be set when [creating inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/create-inventory) for a SKU. | | **Out of stock** | Indicates the SKU has no stock including *available to purchase*, *backorder*, and *preorder* amounts. | | **Backorder** | Indicates the SKU is available for *backorder*. | | **Preorder** | Indicates the SKU is available for *preorder*. | If a SKU is available for both **Backorder** and **Preorder** but has no **Available to Purchase** amount. The **Backorder** status is displayed. # Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/overview fabric Inventory is your single source of truth for inventory data. You can receive and track inventory across networks and locations. ## Prerequisites Copilot is the primary interface for working with fabric applications. You will need an active account, including an account ID, to access Copilot. Contact your Copilot Admin or Customer Success representative to obtain these credentials. ## Launching Inventory To launch Inventory, log in to your Copilot account and select **Inventory** from the left-hand navigation. ## Role-Based Access Control (RBAC) fabric Copilot provides the ability to restrict the access of different users to information and actions available to them through roles. For more information and instructions on how to set up these controls, [visit the RBAC documentation](/v3/platform/settings/rbac/role-based-access-control). # Configuring Scheduled Closures Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/inventory/scheduledclosures Scheduled closures allow you to manage location availability for fulfillment to plan for holidays, weather events, and operational downtime. ## Procedure 1. In the left menu, click **Inventory > Locations**.\ The **Locations** page is displayed. 2. Click a location’s number.\ The **Edit Location** page is displayed. 3. In the **Location Status** section, click the **Scheduled Closures** tab.\ The **Scheduled Closures** tab is displayed. 4. Click **Schedule Closure**.\ The **Schedule Closure** window is displayed. 5. To set the beginning date of the closure for the location, in the **Start Closure Date** field, enter the date. * Do one of the following: * Use the calendar to select the date. * Enter a date in the following format: mm/dd/yyyy. 6. To set the beginning time of the closure for the location, in the **Start Closure Time** field, enter the time. * Do one of the following: * Select a time. * Enter a time in hh:mm format and specify AM or PM.\ The time zone is recorded from your browser. fabric recommends you turn off any VPNs before setting up scheduled closures. 7. To specify an end date and time for the closure, follow the instructions in steps 5 and 6 to configure the **End Closure Date** and **End Closure Time** fields.\ The **Specify closure end date** field is selected by default. If you don't want to specify an end date, clear the selection. 8. (Optional) To specify the shipping methods this closure applies to, do the following: * Clear the selection in the **Applies to all shipping methods** field.\ The **Shipping methods** field is displayed. * In the **Shipping methods** field, select the shipping methods the closure applies to.\ Note: SDD stands for same-day-delivery. 9. In the **Reason Code** field, select the reason for the closure.\ NOTE: Contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new) for help setting up reason codes. 10. (Optional) To add a short description about the reason for the closure, click **Add Notes** and enter a description. 11. Click **Schedule**. The outage is scheduled for the duration you defined. # Activity Log Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/activity-log The **Activity Log** tab displays a history of all your Order import and export events. By default, the most recent activities are displayed. To find a specific file, in the search bar, enter the **File ID** and press Enter. ## Activity Log Table | Field | Description | | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **File Id** | A unique system-generated file ID that's assigned upon starting the import or export process. | | **Type** | The file type, such as **Import** or **Export**. | | **Module** | Indicates which of the four Order modules the file relates to. Possible values are **Allocation**, **Invoice**, **Shipment**, and **Order**. | | **Status** | The status of the activity, such as **Finished** or **System error**. | | **Created on** | The date and time the file was created. | | **Message** | A message displaying additional details for the import or export. Click the download icon to download a .zip file containing the import or export CSV and a separate logs file for debugging. | # Creating a Rule Set Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/create-a-new-rule-set-ui The following guide contains examples and field descriptions for the Order Fulfillment Logic (OFL) user interface. ## Basic Information | Field name | Description | Values | | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | | **Fulfillment Rule Set Name (Required)** | The name of the rule set. This name is displayed in the table on the Fulfillment Rules page. | String | | **Description (optional)** | A description of the rule set. It's best practice to include a detailed description describing the purpose of the rule set for anyone viewing the rule set. If this is a cloned rule set with minor differences, describe the differences between each rule set. | String | ### Field descriptions **Order Level Rule Groups** are run in order from the top down. If one of the rule conditions are met, this rule is executed and subsequent rules aren't run. If you wanted to move a rule up, you can drag and drop rules to change their order. Item level rules runs in parallel and execute all rules even if a previous rule condition is met (including order level rules). This means item level rules override order level rules for the specified item. ### Condition fields When creating any new rule, a condition is required. The condition is used to determine if a rule should be executed. A condition is used as the prerequisite to take an action. Each condition you create executes from the top down. This means the order of your defined conditions matter. If you wanted to move a condition up, you can drag and drop conditions to change their order. The following table outlines the available fields and their values for conditions. | Field name | Description | Values | | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Entity** | Entity is used to determine the attribute schema used to fulfill the condition. For **Order Level Rule Groups**, the Order schema is set as the default. For **Item Level Rule Groups**, the Item schema is set as the default. The default values can't be changed. | Order, Item | | **Attribute** | The dropdown for attribute is populated based on the Order or Item attribute type. | Default values for Order are `type`, `subtype`, `orderId`, `channelId`, and `referenceId`. The default values for Item are `attributes`, `type`, `backOrdered`, `lineId`, `itemId`, `sku`. Additional values are available based on your Order or Item schema. For example, shippingInfo.address.city, price.itemUnitPrice. | | **Operator** | A list of supported expressions. Each expression can be used to filter in different ways. Only supported expressions are displayed for an attribute. | • Equals

• Doesn't equal

• Contains

• Doesn't contain

• Less Than

• Less Than or Equal To

• Greater Than

• Greater Than or Equal To | | **Value** | The value of an attribute. For example, an online order can have the attribute *type* with a value equal to *STH* (Ship to home). This value can also be *SDD* (Same day delivery). Multiple values are supported. | String | ### Action fields Each action you create executes from the top down. This means the order of your defined actions matters. If you wanted to move an action up, you can drag and drop actions to change their order. There are 3 different **Fulfillment Rule Type** options. These rule types determine which additional action field options are made available. * **Provided location:** Buy online, pick up in store (BOPIS). The order itself has the location and it doesn't need to be provided. * **Static Location:** Use this method if you want to predefine where all your orders will be fulfilled from when meeting a rule/condition. This can be any location that you provide along with the associated location number. For example, as a retailer you can choose to ship all web ship orders from the `DC 975` location. Additionally, you can use this method for item level rules to assign fulfillment locations for particular SKUs. For example, you can provide a SKU that starts with 1122 and set this SKUs specific fulfillment location. * **Location Prioritization** Location prioritization allows for multiple inventory networks and additional features such as geo-location, split shipments, and item exclusions. This method is best used for retailers who have a lot of store presence or multiple warehouses in a particular region. It also provides the most flexibility if you want to split shipments from different locations for a single order. Once an **Fulfillment Rule Type** is selected, depending on the selected type, different fields outlined in the table below are made available. | Field name | Description | Value | | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | **Location Numbers** | Used to configure the distribution location number. | String | | **Allows Partial Fulfillment** | Set this value to Yes if you want to allow the order to be partially filled if one or more of the SKU’s aren't available at a particular location. For example, if an order had 5 table lamps and 1 chair but you did not have the chair available, the 5 table lamps are shipped and the chair is ignored. Setting this value to No cancels the order if it can't be fully fulfilled. | Yes/No | | **Included Location Types** | A dropdown containing all the available configured inventory networks. This option is only available for the Location Prioritization action type. All the locations that are selected will be checked for inventory availability based on the additional geo locations, split shipment, and exclude fields selected. | Value is based on your available fulfillment locations. All configured locations are listed. For example: StoreDropshipDC | | **Geolocation** | Enable this field if you want to fulfill shipments based on the customers shipping location. If this field is set to No, Initial Boundary, Increment Size, and Maximum Boundary aren't used. | Yes/No | | **Initial Boundary** | The initial circumference boundary when determining geo-location. For example, if the value 100 is provided, fabric will look to see if any Included Location Types can fulfill the order within 100 miles of the shipping location. | Number | | **Increment Size** | Incremental Boundary In Miles is the number of miles you want to add every time search is performed. This means if the Initial Boundary was unable to fulfill an order, the incremental circumference is increased by the number specified here. For example, we can set this value set to 50. If no stores were in the first 100 miles entered in Initial Boundary, the search boundary is increased to 100-150, then 150-200, until it reaches the Maximum Boundary value. | Number | | **Maximum Boundary** | The maximum search radius. Once the Increment Size reaches this number and the order can't be fulfilled, the order is canceled. | Number | | **Inventory Balancing** | The Inventory Balancing dropdown has two values, Distance and InventoryAvailability. Selecting Distance means the order fulfillment is completed by the nearest store with the items in stock. Selecting InventoryAvailability, means fabric looks at each of the eligible stores within your boundary and chooses the store with the most inventory. For example, if a store had 1 item remaining and another store had 5 of the same item within the search boundary, the order fulfillment would default to the store with more inventory. | DistanceInventoryAvailability | | **Order Level Split Shipments** | Setting this value to Yes enables orders to be fulfilled through multiple stores if the SKU’s or items aren't available at a single location. Setting this value to No means that fabric must find a location that has every item for an order at a single fulfillment location. If fabric is unable to find all the items in the order at a single location, the entire order is canceled. | Yes/No | | **Item Level Split Shipments** | Set this value to Yes if you want to look between locations to meet the item quantity request of an order. For example, if an order for 20 of the same office chair came in, and a location only had 15 available, the remaining 5 chairs would be sourced from another location. With this set to No, the remaining quantity of chairs are canceled and only the 15 at the first location are allocated. | Yes/No | | **Maximum Splits allowed per order** | The maximum number of locations that a split order can be fulfilled from. | Number | | **Item exclusions** | Allows you to create an additional condition based on an item attribute. For example, if an item is less than \$10, you can create a condition to ship it from a retail store near the customer to save on shipping costs. | Yes/No | ## Creating a Fulfillment Rule Set Requirements: * Allocate orders to different fulfillment locations based on a the selected shipping type during checkout. * Configure geographic distance rules for same day shipping. * Configure rules around split shipments. * Configure a price/margin rule for items under a certain cost. * Configure an auto cancel rule for shipments that can't be fulfilled. * Create a default dropship rule to ship directly from the factory for orders that can't be fulfilled from the main fulfillment locations. Using the above requirements, the examples outlined in this document assume that both a web store and retail locations are available. The web store allows customers to select two different types of shipping: default and expedited. In the `Order` attribute are the attribute types `STH` (ship to home) and `SDD` (same day delivery). The rules that are created must automatically send an order to a specific location based on the shipping type selected during checkout. The following examples outline how to create a rule set for each requirement. Although the conditions and requirements are separate examples in this document, note that all of the following examples make up a single **Fulfillment Rule Set** and that only one rule set can be active at any given time. All of the examples below build upon one another. ## Pre-requisites Ensure you have the **Orders & Inventory Editor** or **Administrator** privilege for fabric Orders. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles.mdx). ### Create a new rule set 1. Using the left navigation, click **Orders** > **Fulfillment**. * The **Fulfillment Rule Set** page is displayed. 2. To create a new rule, click **Create Rule Set**. 3. In the **Basic Information** section, provide a **Fulfillment rule set name**, and optionally a **description**. * It's best practice to always provide a description indicating what the rule is doing and its purpose. ### Example 1 - Allocate orders to specific fulfillment locations This example fulfills the following requirements: * Allocates orders to different fulfillment locations based on a the selected shipping type during checkout. * Geographic distance rules for same day shipping. * Creates rules for split shipments. To create a rule, you must first define the condition for when the rule should be executed. 1. In the **Setup your set of rules** section, a default rule is provided in the subsection for **Order Level Rule Group**. Click the edit icon to rename the default rule. * In this example, the first rule is called **Allocate to fulfillment locations \[ STH ]**. * Expanding the field reveals the **Add condition** and **Add action** buttons. A blank default condition and action are provided. The fields populated for **Attribute** are all based on your **Attribute type** which is automatically set to `Order`. This can't be changed. 2. In the **Attribute** field, select `type`. 3. In the **Operator** field, select `Equals`. 4. In the **Value** field, enter `STH` as the value. * This condition makes it so an action is triggered when the condition for an order is `STH`. Note that in your instance, ship to home may not be equal to the value `STH`. For example, the value could be `Ship_To_Home`. It's suggested that you check your `Order` schema to determine what values are allowed/expected. Once a condition is created, the **Fulfillment Rule Type** needs to be set. The **Fulfillment Rule Type** determines what happens when a condition is met. In this example, the action needs to direct `STH` orders to the `DC` fulfillment warehouse. 1. In the **Fulfillment Rule Type** field, select **Multi Location Single Ship Fulfillment**. * Additional fields appear. If you only have a single fulfillment location and aren't expecting additional conditions, you can use **Configured Location** and enter the location number without needing to follow the remaining steps. 2. Set the **Included Location Types** field to where you want to fulfill `STH` orders. * In this example, `STH` orders need to be fulfilled in `DC`. 3. The remaining available options aren't needed in the `STH` use case. For more information on each of these fields, visit the [Action fields table](#action-fields). The following list is an example of what the default values look like: * Set **Geolocation** to `No`. * Set **Order Level Split Shipments** to `No`. * Set **Item Level Split Shipments** to `No`. * Set **Allows Partial Fulfillment** to `Yes`. * Set **Maximum Splits allowed per order** to `3`. * Set **Item exclusions** set to `No`. This creates our first rule which is executed when the shipping method `STH` is selected during checkout. However, in order to create a same day delivery `SSD` condition, an additional rule is needed. 1. Click **Add Rule**. 2. In the **Attribute** field, select `type`. 3. In the **Operator** field, select `Equals`. 4. In the **Value** field, enter `SDD` as the value. * This condition makes it so an action is triggered when the condition for an order is `SDD` (same day delivery). Note that in your instance, same day delivery may not be equal to the value `SDD`. For example, the value could be `expedite` or `same_day_delivery`. It's suggested that you check your `Order` schema to determine what value is expected. 5. Set the **Included Location Types** field to the main warehouse `DC` and retail locations `Store`. * If we had additional distribution methods, they could be selected here. 6. Set the **Geolocation** field to `Yes`. * The **Geolocation** feature looks at the customer's location and sees if any of our inventory networks within a set distance are able to fulfill the order. * Unlike `STH`, `SDD` requires that we take into consideration where the items are located in relation to the shipping location. This is because we want to fulfill the order as quickly as possible and ship from the closest location to the customer. 7. Set the geolocation boundaries. The following settings look for a store from 0-100 miles from the customer's shipping address that can fulfill the order. If the order can't be fulfilled, it then searches between 100-200 miles and finally, 200-300 miles. * Set the **Initial Boundary** field to `100`. * Set the **Increment Size** field to `100`. * Set the **Maximum Boundary** field to `300`. 8. Set the **Inventory Balancing** field to one of the following values: * **Distance**: The order fulfillment is completed by the nearest store with the items in stock. * **InventoryAvailability**: Looks at each of the eligible stores within the geo-location boundary and chooses based on maximum available stock. For example, if multiple stores had the items in stock and one store had 1 item remaining, whereas another store had 5, the order fulfillment would default to the store with 5 inventory. 9. Split shipments are used to fulfill orders from multiple fulfillment locations. Each split shipment method changes how an order is fulfilled. Depending on your individual needs and logistics, one or more of these methods may not be feasible. Visit the [Action fields table](#action-fields), for more information on each of these fields and examples. * Set the **Order Level Split Shipments** field to `Yes`. * Set the **Item Level Split Shipments** field to `Yes`. * Set the **Allows Partial Fulfillment** field to `Yes`. * Leave the **Maximum Splits allowed per order** field as the default value of `3`. 10. Set the **Item exclusions** field to `No`. ### Example 2 - Create a price rule for items under a set cost This example fulfills the following requirements: * Creates a price/margin rule for items under a certain cost. * Configures an auto cancel rule for shipments that can't be fulfilled. There are three ways to create price rules. If you must ship certain items from certain locations, it's recommended you use the third method described below: * Create a new rule with the condition specifying a price. * Add an item exclusion to an existing condition. * Use item level rules to provide a condition and action for all items within a certain price range. If you wish to follow along, please review the following example [Allocate Orders to Specific Fulfillment Locations](#example-1---allocate-orders-to-specific-fulfillment-locations). The example below builds upon this example. The allocate orders to a specific fulfillment location rule set allocates ship to home `STH` orders to a `DC` fulfillment location. Same day delivery `SDD` orders are fulfilled based on geographical location and can be shipped from retail stores or the `DC` fulfillment location. 1. Using the Allocate to fulfillment locations \[ STH ] rule, set the **Item exclusions** field to `Yes`. * Enabling **Item exclusions** creates a new **Item Exclusion** condition above your action with the **Entity** default set to `Item`. 2. Set the **Attribute** field to `price.itemUnitPrice`. 3. Set the **Operator** field to `Less Than or Equal To`. 4. In the **Value** field, enter `5`. * This condition now checks to see if any item is less than or equal to 5\$. If an item meets this condition, it's excluded from that action. In other words, if **Item exclusions** is `Yes`, fabric looks at the next action in a rule that has been specified. At this point, if you don't configure a default condition or add an additional action, the items that fall under the exclude condition are never added to an order. This means those items are canceled and depending on if you have **Allows Partial Fulfillment** enabled or not, the shipment is cancelled. There are two options for making sure small items are shipped. * Create another action within the same rule where the exclusion exists. * Create an item level rule. In this example an item level rule is created. 1. Rename the default item rule from the **Item Level Rule Group** section to `Items under 5$`. 2. Set the **Attribute** field to `price.itemUnitPrice`. 3. Set the **Operator** field to `Less Than or Equal To`. 4. In the **Value** field, enter `5`. 5. In the **Fulfillment Rule Type** field, select **Multi Location Single Ship Fulfillment Method**. 6. Set the **Included Location Types** field to include `Store`. * If instead of using retail stores you had specific warehouses to ship smaller items from, you could instead use **Configured Location Fulfillment Method** and enter the location numbers. 7. Set the **Geolocation** field to `Yes`. * The locations should be limited based on shipping costs and logistics. * Set the **Initial Boundary** field to `200`. * Set the **Increment Size** field to `100`. * Set the **Maximum Boundary** field to `400`. 8. Set the **Inventory Balancing** field to `Distance`. * This ensures the item is shipped from the closest store. 9. Set all of the split shipment options to `No`. * It would be too costly to ship items under \$5 from multiple different locations for a single order. * Set the **Order Level Split Shipments** field to `No`. * Set the **Item Level Split Shipments** field to `No`. * Set the **Allows Partial Fulfillment** field to `No`. * You can choose to enable partial fill if you want to partially fill an order. * Leave the **Maximum Splits allowed per order** field as the default value of `3`. 10. Set the **Item exclusions** field to `No`. This item level rule accounts for all items under 5 dollars and ships items under 5 dollars from the nearest retail location. ### Example 3 - Create a default dropship action Sometimes, you are unable to fulfill an order from any of your available fulfillment locations. When this happens, you can create an action to fulfill the order directly from a factory dropship location. With this type of action in place, orders with partially filled SKUs and items not currently in stock can still be fulfilled. If you wish to follow along, please review the following example [Allocate Orders to Specific Fulfillment Locations](#example-1---allocate-orders-to-specific-fulfillment-locations). The example below builds upon this example. The allocate orders to a specific fulfillment location rule set allocates ship to home `STH` orders to a `DC` fulfillment location. Same day delivery `SDD` orders are fulfilled based on geographical location and can be shipped from retail stores or the `DC` fulfillment location. In this example, an additional action is added to backfill orders with no inventory. If an order can't be fulfilled, the remaining items are sent to a dropship location to be fulfilled at a later time. 1. In the **Allocate to fulfillment locations \[ STH ]** rule, click the **Add action**. * You will already have an action to fulfill orders from `DC` from the previous example. A new action must be created under it. 2. In the **Fulfillment Rule Type** field, select **Location Prioritization**. 3. Set the **Included Location Types** field to include `Dropship`, `store`, and `DC`. * Every fulfillment location is selected to ensure the order is fulfilled if possible. 4. In the first action, set the **Allows Partial Fulfillment** field to `Yes`. * If this is disabled, the order will be canceled because it can't be fulfilled in the first action. Actions execute from the top down. * Alternatively, if you wanted to guarantee that an order is fulfilled, you would also set **Item Level Split Shipments** and **Order Level Split Shipments** to `Yes`. However, this can complicate shipping logistics making it so certain orders might have multiple shipping locations for different SKUs. Check with your team to determine what settings should be enabled based on your individual needs. 5. All remaining fields can be left as their default values. ## Related Topics * [Order Fulfillment Logic Overview](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/order-fulfillment-logic) * [Orders Overview](/v3/orders-and-inventory/user-guides/orders/overview) * [Order Management](/v3/orders-and-inventory/user-guides/orders/order-management/creating-an-order) * [Order History](/v3/orders-and-inventory/user-guides/orders/activity-log) * [Order Settings](/v3/orders-and-inventory/user-guides/orders/settings/overview) # Updating a Rule Set Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/manage-rule-sets To prevent fulfillment or distribution from breaking due to changes, direct editing of rule sets is disabled. Instead, once you have completed your edits, the **Clone** option is enabled. A cloned rule set acts as a entirely new rule set allowing you to set it as the primary active rule set. Note that only one rule set can be active at a time. ## Prerequisites Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure 1. Using the left navigation, select **Orders** > **Fulfillment**. * The **Fulfillment Rule Set** page is displayed. 2. Using the **ID** or **Name**, find the rule set you want to update. * The fulfillment rule set table alphabetically sorts your rule sets (A-Z) with your active rule set at the top. 3. Click the **ID**. * The **Edit Fulfillment Rule Set** page is displayed. 4. Click **Clone**. * Editing is disabled until you clone the rule set. 5. In the **Basic Information** section, provide a new **Fulfillment rule set name** and **description**. * Because this is a clone of the previous rule set, it can be confusing if you don't change the name. 6. In the **Setup your set of rules** section, click an order level or item level rule to expand and reveal the conditions and actions for that rule. 7. Make edits to the fields you want to change. * For more detailed information on each of the fields, see the [Creating a Rule Set](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/create-a-new-rule-set-ui#field-descriptions) field descriptions section. 8. Click **Save**. The edited rule set is added to the **Fulfillment Rule Set** table. ## Related Topics * [Order Fulfillment Logic Overview](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic) * [Orders Overview](/v3/orders-and-inventory/user-guides/orders/overview) * [Order Management](/v3/orders-and-inventory/user-guides/orders/overview) * [Order History](/v3/orders-and-inventory/user-guides/orders/activity-log) * [Order Settings](/v3/orders-and-inventory/user-guides/orders/settings/overview) # Order Fulfillment Logic Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/order-fulfillment-logic The order fulfillment feature allows you to create fulfillment rule sets. Fulfillment rule sets are used to direct orders to different fulfillment locations based on characteristics, such as geo-location, warehouse location, item price, order attribute type, and more. ## Pre-requisites Ensure you have the **Orders & Inventory Editor** or **Administrator** privilege for fabric Orders. For more information, see [Role-Based Access Control](../../settings/rbac/role-based-access-control-orders-roles.mdx). ## Rule Setup When creating a new fulfillment rule set, you must provide some basic information along with the rules in the [order level rule group](###order-level-rule-group) or [item level rule group](###item-level-rule-group) sections. Ensure that you create all your rules in a single fulfillment rule set because only one rule set can be active at a time. ### Order level rule group When you create rules in the **Order Level Rule Group**, they're executed in the order that they're sorted. This means rules are executed from the top down. You can drag and drop rules to execute in any order as needed. Its important to note that when a rules condition is met, the additional rules defined below it aren't executed. If no rule conditions are met and no default condition is provided, the rules are all ignored. #### Example Let's assume 2 rules are defined. One for fulfilling online orders at a specified fulfillment warehouse, and one for packaging specific online orders (based on the shipping location) at a different warehouse equipped to package unique orders. If the order of the rules contains the first rule at the top and the second rule below, the second rule can't run because the first rules condition is always met before the second rule has executed. However, if we were to swap the rules order and run the second rule first, it would guarantee that the rule is run. If fabrics rules condition isn't met, fabric proceeds to run the next rule below. This means the last rule (as a best practice) should be a default catch-all and very specific rules with unique conditions should be run first. ### Item level rule group Item level rules run in parallel and execute all rules even if a previous rule condition is met (including order level rules). This means item level rules override order level rules. The **Attribute type** is limited to the `Item` attribute type and only allows you to create conditions based on item attribute values such as `price.ItemUnitPrice`. This allows item level rules to control where certain items are fulfilled from and guarantees a static fulfillment location regardless of the order level rules you have implemented. Item level rules are often used when you set up certain item exclusions. This could be specific SKUs that ship from a particular warehouse, items under a certain price point, items that weigh a lot, and more. ### Frequently asked questions What happens if more than one condition is met for an order? * If the rules are within the **Order Level Rule Group** section, the rules are executed from the top down. For example, if the first rules condition is fulfilled, subsequent rules aren't run on that order. Rules defined within **Item Level Rule Group** always execute. This is because the rules are run on specific item conditions rather than order conditions. What happens if an item level rule conflicts with a order level rule? * Because item level rules run at the item level, they always take priority over order level rules. For example, an order level rule specifies shipping an order with 5 items and one of the items in the order fulfills the condition for an item level rule. In this event, 4 of the items are shipped based on the action defined in the order level rule. The item that meets the item level rule condition is shipped based on the action defined in the item level rule. ## Next Steps For more information, such as example rule sets, please begin by reading the [Creating a rule set](./create-a-new-rule-set-ui) documentation. ## Related Resources * [Orders Overview](/v3/orders-and-inventory/user-guides/orders/overview) * [Order Management](/v3/orders-and-inventory/user-guides/orders/overview) * [Order History](/v3/orders-and-inventory/user-guides/orders/activity-log) * [Order Settings](/v3/orders-and-inventory/user-guides/orders/settings/overview) # Adding Products to an Existing Order Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/adding-products-to-existing-order This topic covers the process of adding products to an existing order. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. * Ensure that the order is in **Hold**, **Confirmed**, **Partially allocated**, or **Created** status. If the status of the order changes to **Allocated** in the order lifecycle, the order can no longer be updated with additional products. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find an order, do one of the following: * In the search bar, enter the search keywords and press **Enter**. * Use filters to refine the search results. The orders table displays the orders that match the search or filter criteria. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. Using the **More actions** button, select **Add SKUs**. The page for adding products to an order is displayed with the order number. 5. In the **Select SKUs** > **Your network** field, select a [network](/v3/orders-and-inventory/user-guides/inventory/networks). Upon selecting a network, a group of locations sharing inventory, the available products for browsing are filtered accordingly. 6. In the **Your channel** field, select a channel. 7. Click **Browse SKUs**. The **Browse SKUs** window is displayed with a product table. 8. To find the product in the **Browse SKUs** window, do one of the following: * In the search bar, enter the search keywords and press **Enter**. * Use filters to refine the search results. The **Stock status** for a product must be **Available** and **Availability** must be greater than or equal to one. If you add an unavailable product, an error message is displayed after adding the product. 9. Select products using the **Product title** checkbox. 10. Click **Add SKUs**. The products you selected are added to the **Select SKUs** table with the **SKU ID**, **Price per unit**, **Quantity**, and **Availability** details. 11. Update the **Quantity** of each product by clicking the `+` or `-` buttons. The order details for **Added SKUs** are updated along with the total amount in the **Order Summary**. **Added SKUs** displays the total cost breakdown of the newly selected products and the **Order Summary** displays the total cost breakdown for the entire order including past products and the newly added products. 12. To select the shipping address, click the radio button next to the address. A default shipping address is displayed from the previous order. If you want to add a new address, follow the instructions in the [Adding an Address](#adding-an-address) section. 13. Click **Confirm**. The additional products are added to the **Basic details** tab for the order. Scroll down to the **Order status** to view the details of each product and its current status. ## Adding an Address 1. To add a new address, click **Add address**. The **Add address** window is displayed. 2. In the **Fulfillment method** field, select one of the following options: * [Ship to Home](#ship-to-home): Use this option if you want to ship the selected products to a specific address. * [Pickup in store](#pickup-in-store): Use this option if you want to ship the selected products to a designated store pickup location. ### Ship to Home 1. To ship to a specific address, in the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * From the **Phone number type** dropdown, select `Mobile`, `Business`, or `Home`. 2. To ship to a specific address, in the **Shipping address** section, enter the following details: * **Address line 1** * (Optional) Click **Add address line** to add additional address lines. * From the **Country** dropdown, select a Country. * **Zip code** * **Region** * **City** * From the **Shipping method** dropdown, select a shipping method. 3. In the **Payment details** > **Payment method** field, select a payment method. The previous payment method is selected by default. 4. Click **Confirm**. The new shipping address is added to the **Select shipping address** section. ### Pickup in Store 1. In the **Select pickup location** field, select a [pickup location](/v3/orders-and-inventory/user-guides/inventory/networks). 2. In the **Contact type** field, select one of the following: * **Primary**: Select this method to set the primary contact information. The primary contact is sent notifications for pickup and tracking details. * **Secondary**: Select this method if you want to authorize someone other than the primary contact to pick up the order. The default for a primary contact is the customer who ordered the items. 3. To ship to a pickup location, in the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * From the **Phone number type** dropdown, select `Mobile`, `Business`, or `Home`. 4. (Optional) To add additional contacts that are authorized to pick up the order, click **Add alternate pickup name**. 5. In the **Payment details** > **Payment method** field, select a payment method. The previous payment method is selected by default. 6. Click **Confirm**. The new shipping address is added to the **Select shipping address** section. # Creating Appeasement Refunds Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/appeasements By creating an appeasement refund, you can issue discretionary refunds. The appeasement option for an order is enabled only after the payment process is initiated for the order. Orders with the **Fraud** status can't be appeased. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find an order, do one of the following: * In the search bar, enter the search keywords and press **Enter**. * Use filters to refine the search results. The orders table displays the orders that match the search or filter criteria. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. Click the **More actions** button and select **Create Appeasement**. The page for creating appeasements is displayed with the order number. 5. In the **Reason code** field, select a reason code. To provide additional details, click **Add sub-reason code** and enter the reason in the **Sub-reason code** field. 6. In the **Refund amount** field, enter a refund amount. The fields for **Subtotal**, **Shipping**, **Fees**, and **Total** are updated. These fields display the total available amount you can refund for an order. You can't refund more than the available amount. 7. Click **Create Appeasement**. The appeasement is created and you are redirected to the **Basic details** tab for the order. ### Order Details Field Descriptions The **Order Details** section displays the following information: | Field | Description | | --------------- | ---------------------------------------- | | **Channel** | The sales channel ID used for the order. | | **Date placed** | The date and time the order was placed. | ### SKU Details If you want to view the details of a SKU, click the **SKU**. The **Sku Details** window is displayed containing two tabs, **Pricing** and **Attributes**. For more information on **Attributes**, visit the [Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) section in the Product Catalog documentation. For more information on **Pricing**, visit the [Pricing](/v3/offers/user-guides/offers/pricing/pricing-overview) section in the Offers documentation. # Canceling Items in an Order Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/cancel-skus You can cancel individual items or the entire order. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. * Ensure that the order is in **Hold**, **Confirmed**, **Partially allocated**, or **Created** status. If the status of the order changes to **Allocated** in the order lifecycle, the order can no longer be canceled. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find an order, do one of the following: * In the search bar, enter the search keywords and press **Enter**. * Use filters to refine the search results. The orders table displays the orders that match the search or filter criteria. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. Click the **More actions** button and select **Cancel SKUs**. The **Cancel order** page is displayed with the order number. 5. In the **Items to cancel** section, do one of the following: * **Cancel entire order**: This option automatically selects all items in the order and sets the cancel quantity to the maximum amount. * Individually select each item in the **SKU ID** field. 6. Update the **Qty** field by clicking **+** or **-**. 7. In the **Reason code** field, select a reason code. The **Order summary** section updates the total refund amount based on the canceled items. 8. Click **Confirm**. You are redirected to the **Basic details** page. The selected products are cancelled and the status is updated to **Cancelled**. For more information on statuses, visit the [Manage Orders](/v3/orders-and-inventory/user-guides/orders/overview) overview documentation. # Creating an Order Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/creating-an-order This topic covers the process of creating a new order. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor**, or **Administrator** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. Click **Create Order**. The **Create order** page is displayed with the order status set to **Draft**. 3. In the **Select SKUs** > **Your network** field, select a [network](/v3/orders-and-inventory/user-guides/inventory/networks). Upon selecting a network, the system automatically filters the products available for browsing. 4. In the **Your channel** field, select a channel. 5. Click **Browse SKUs**. The **Browse SKUs** window is displayed with a product table. 6. To find a product in the **Browse SKUs** window, do one of the following: * In the search bar, enter the search keywords and press **Enter**. * Use filters to refine the search results. The **Stock status** for a product must be **Available** and **Availability** must be greater than or equal to one. If you add an unavailable product, an error message is displayed after adding the product. 7. To select products, select the **Product title** field next to the product. You can select more than one product. 8. Click **Add SKUs**. The products you selected are added to the **Select SKUs** table with the **SKU ID**, **Price per unit**, **Quantity**, and **Availability** details. 9. To update the quantity of each product, in the **Quantity** field, click the `+` or `-` buttons or enter the quantity. The **Order Summary** is updated with pricing information for the order. 10. In the **Add shipping address** > **Fulfillment method** field, select one of the following options: * [Ship to Home](#ship-to-home): Use this option to ship the selected products to a specific address. * [Pickup in store](#pickup-in-store): Use this option to ship the selected products to a designated store pickup location. ### Ship to Home 1. To ship to a specific address, in the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * **Phone number type**: The options are `Mobile`, `Business`, or `Home`. 2. In the **Shipping address** section, enter the following details: * **Address line 1** * You can add additional address lines by clicking **Add address line**. * **Country** * **Zip code** * **Region** * **City** * **Shipping method** 3. In the **Payment details** > **Payment method** field, select a [payment method](/v3/guides/quickstart/merchant-experience-quickstart-guide#configure-checkout). 4. Click **Create**. The order is created and added to the **Manage Orders** > **Orders** list. ### Pickup in Store 1. In the **Select pickup location** field, select a [pickup location](/v3/orders-and-inventory/user-guides/inventory/locations). 2. In the **Contact type** field, select one of the following: * **Primary**: The primary contact is sent notifications for pickup and tracking details. The default setting for primary contact is the customer who ordered the items. * **Secondary**: Authorizes someone other than the primary contact to pick up the order. 3. In the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * **Phone number type**: The options are `Mobile`, `Business`, or `Home`. 4. (Optional) To add additional contacts who are authorized to pick up the order, click **Add alternate pickup name**. 5. In the **Payment details** > **Payment method** field, select a [payment method](/v3/guides/quickstart/merchant-experience-quickstart-guide#configure-checkout). 6. Click **Confirm**. The order is created and added to the **Manage Orders** > **Orders** list. # Processing Exchanges Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/exchange-orders You can exchange an entire order or the individual products in an order. The system automatically calculates any price differences for the exchanged products. The exchange option for an order is enabled only after the payment process is initiated for the order. Orders with the **Fraud** status can't be exchanged. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure To exchange an item, the return process is initially followed. 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find the order, use the [search or filter options](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders) on the **Manage Orders** page. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. In the top-right of the page, click **Return Order**. The **Return order** page is displayed. 5. In the **Select SKUs to return** section, do one of the following: * To exchange an entire order, select the **Refund entire order** checkbox. This automatically checks all items in the order and sets the maximum exchange quantity for each SKU. * To exchange specific items, click the checkbox next to the SKU you want to exchange and use the **+** or **-** buttons to set the quantity. The **Refund summary** is updated. 6. Click **Next**. 7. If multiple exchange reasons exist for each SKU, clear the **Same reason code for all SKUs** field. 8. In the **Action** field, select **Exchange**. 9. In the **Reason code** field, select a reason code. You can add additional information for the exchange by selecting **Add sub-reason code** and by providing the information in the **Sub-reason code** field. 10. Click **Next**. The **Items to send customer in exchange** section is displayed. 11. In the **Your network** field, select a network. After selecting a network, which is a group of locations sharing inventory, the available products for browsing are filtered accordingly. 12. In the **Your channel** field, select a channel. 13. Click **Browse SKUs**. The **Browse SKUs** window is displayed with a product table. 14. To find the product in the **Browse SKUs** window, in the search bar, enter the search keywords and press **Enter**. You can use the filters to refine the search results and find a specific product. The Stock status for a product must be **Available** and **Availability** must be greater than or equal to one to process the exchange. If you add an unavailable product, an error message is displayed. 15. Select **Product title** checkbox for the products that you want to exchange. 16. Click **Add SKUs**. You can remove SKUs by clicking **Remove SKUs**. This option is only displayed if a SKU is added to the exchange. 17. In the **When should exchange items ship** field, select one of the following: * **Ship upon receiving return:** This option prevents the new exchanged items from shipping until the previous items are received and processed. * **Ship exchange items immediately:** This option immediately sends the exchange request to the nearest fulfillment location to ship. fabric recommends that you only use this option for specific loyalty tiers. 18. Click **Next**. The **Confirm** section is displayed with an overview of the exchange. 19. Click **Confirm**. The order status is updated to **Exchanged**. ### Refund Summary The **Refund summary** section displays a breakdown of the total amount being refunded. Selecting more than one item to refund or exchange updates the summary accordingly. The following table describes each field in the **Refund summary** section. | Field | Description | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Subtotal refund** | Displays the refund subtotal which excludes discounts, fees, adjustments, shipping, and taxes. This amount can be edited in the refund process. | | **Discounts refund** | Displays the discount amount applied to the order. If discount codes were applied to a product, the system automatically adjusts the refund summary. | | **Fees refund** | Displays the additional fees that were charged for an order such as an oversized item fee. This can be edited in the refund process. | | **Adjustment refund** | Displays the adjustments applied to the order if applicable. | | **Shipping refund** | Displays the shipping refund amount. This can be edited in the refund process. | | **Tax refund** | Displays the tax refund amount. Tax refund amounts can't be edited and are broken down into sub-taxes. For example, Canadian orders are broken down into two taxes, General Sales Tax (GST) and Provincial Sale Tax (PST). Use the **More Details** field to get a list of taxes. Taxes are calculated for individual products, so returns with multiple products display duplicate taxes representing each product. | | **Total refund** | Displays the total refund amount. | ### Adding Notes to an Order The **Add Notes** option is located in the **Return order** field. 1. To add notes to an order, Click **Add Notes**. The **Add notes** window is displayed. 2. Enter the note. Notes are limited to 110 characters. 3. Click **Save**. You can edit the note by clicking **Edit Notes**. Repeat step 2 and 3 to complete the update. The note is added with the **Return order** label. Notes are only saved if you complete the entire return process. # Exporting Orders Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/exporting-orders The Export feature provides you with the ability to export all your order-related data. This topic covers the process of exporting order data. Previous exports can be viewed in the **Orders > Activity Log** page. You can download previous export files from this page. ## Prerequisites Ensure that you have the **Orders & Inventory Editor** or **Admin** privilege for fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Export logic Exporting downloads a zip folder containing a JSON source file or multiple CSV files depending on the option you select. ### JSON The JSON zip folder contains a single JSON file. The JSON file contains objects for each `orderId`. Each order object contains the entire history and information of an order including the SKUs for each item in the order. ### CSV The CSV zip folder contains CSV files for orders (exported by item), adjustments, appeasements, discounts, logs, notes, payments, and shipInfo. Each row in the order CSV file represents a product in the order. If an order contains multiple products, duplicate `orderId` rows are displayed for each product. The following table outlines each column in the order CSV file and provides example values. Values in the CSV file are populated only if the data is available. | Column name | Description | Example value | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | | **orderId** | The 24-character system-generated order ID. | 65c0e0d07044e34a495a05c8 | | **orderNumber** | A merchant-defined order identifier. If omitted, this is generated by fabric's sequence generator using the configuration service. | 6250002317 | | **version** | The current version of the order. The number displayed indicates the number of times the order is updated by any operation. | 11 | | **orderedAt** | The merchant-defined order creation time (UTC). | 2022-05-12T09:30:31.198Z | | **cancelledAt** | The system-generated order cancellation time (UTC). | 2022-05-12T09:30:31.198Z | | **allocatedAt** | The system-generated order allocation time (UTC). | 2022-05-12T09:30:31.198Z | | **channelId** | The merchant-defined sales channel ID. | WHBM | | **cartId** | The unique cart identifier, either from fabric cart service or an external cart service. It's used for linking an order to a specific cart. | 5f2d15e8-a837-41a3-9bf1-4467e8e1893a | | **type** | The order type. | WEB | | **subtype** | The order subtype. This is used if further classification is required. | ANDROID | | **processName** | Order process name (V2) only. | | | **employeeId** | The employee (ID or name) who initiated the request. | 3213123 | | **retail** | Determines if an order was created from a Point-of-Sale system. | true | | **orderSubTotal** | Recalculated `orderSubtotal - summationOfAll(itemSubTotal)`. | 24.55 | | **originalSubtotal** | A system-generated order subtotal, auto filled by the orders service when an order is placed. This is saved for reference in case the value changes later. | 24.55 | | **orderDiscount** | Recalculated order discount. | 49 | | **originalDiscount** | The system-generated total discount, auto filled by the orders service when an order is placed. This is saved for reference in case the value changes later. | 49.99 | | **feeTotal** | Recalculated total fee, calculated as orderedQuantity\* itemFeeTotal | 7.95 | | **originalFeeTotal** | The system-generated total fees, auto filled by the orders service when an order is placed. | 7.95 | | **taxTotal** | Recalculated total tax on an order. summationOfAll(itemTaxTotal)+summationOf(tax\[].value) | 13.45 | | **appeasementTotal** | The final appeasement amount. | -10 | | **originalTaxTotal** | The system-generated total tax, auto filled by the orders service when an order is placed. | 12.93 | | **returnTotal** | The return total of order. Calculated as summationOfAll(itemReturnTotal) | -3 | | **cancelTotal** | The amount to be returned after an order cancellation. Calculated as `cancelledQuantity` / `orderedQuantity` \* `itemTotal` | 85.19 | | **invoiceTotal** | The total payment captured by fabrics invoice service. If you are using a third-party service, then this amount will be null. For partial payment scenarios, this value will be different from orderTotal. | 149.09 | | **orderTotal** | The total amount to be charged for the order. Calculated as `orderSubTotal - orderDiscountTotal + orderFeeTotal + orderTaxTotal` | 149.09 | | **originalOrderTotal** | A system-generated order total, auto filled by the orders service when an order is placed. This is saved for reference in case the `orderTotal` changes. | 234.28 | | **currency** | A three-letter currency code as defined by ISO-4217. | USD | | **statusCode** | The current status of the order. | ORDER\_SHIPPED | | **statusDescription** | A human readable brief description of the `statusCode` value. | Order Shipped | | **orderReleasedAt** | The order released time (UTC). | 2022-05-12T09:30:31.198Z | | **createdAt** | The order creation time (UTC). | 2024-02-05T13:21:20.686Z | | **updatedAt** | The timestamp for the latest update that was made to the order (UTC). | 2024-02-21T20:12:42.127Z | | **adjustmentTotal** | The total price adjustment made to the item. | 0 | | **originalAdjustmentTotal** | A system-generated order adjustment total, auto filled by the orders service when an order is placed. This is saved for reference in case the `adjustmentTotal` value changes. | 0 | The remaining CSV files for `adjustments`, `appeasements`, `discounts`, `logs`, `notes`, `payments`, and `shipInfo` contain one or more of the following columns. For example, the **adjustment-order** CSV file contains columns for `orderId`, `orderNumber`, `itemId`, `sku`, `lineItemId`, and `lineItemNumber`. | Column name | Description | Example value | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | | **orderId** | The 24-character system-generated order ID. | `65dce9816a08674c56ecdef2` | | **orderNumber** | A merchant-defined order identifier. If omitted, this is generated by fabric's sequence generator using the configuration service. | `6250002317` | | **cartId** | The unique cart identifier, either from fabric cart service or an external cart service. It's used for linking an order to a specific cart. | `5f2d15e8-a837-41a3-9bf1-4467e8e1893a` | | **statusCode** | The current status of the order. | `ORDER_ALLOCATED ` | | **itemId** | A system-generated unique identifier of an item from fabric Product Catalog service. | `1145` | | **channelId** | The merchant-defined sales channel ID. | `CHS` | | **sku** | The stock keeping unit (SKU), unique identifier of item. | `P1135` | | **lineItemId** | A merchant-defined unique identifier for each item in an order. When omitted, fabric generates it in UUID format during order creation. | `d538b1f1-0e45-43c6-bfc6-9666fc1188ca` | | **lineItemNumber** | A merchant-defined line item number to identify each item in an order. | 15 | | **lineOrderStatus** | A system generated status for each item in the order. | `SHIPPED` | ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To export specific orders, filter the number of orders displayed using the filters on the **Orders** tab. Only the filtered results displayed in the table are exported during the export operation. For example, if you set the filter criteria to **Last 7 Days**, only the orders from the last seven days are exported. 3. Click **Export**. The **Export Order Activity as CSV or JSON File** window is displayed. 4. In the **Export format** field, select one of the following: * **CSV**: Select this if you want to export CSV files. * **JSON**: Select this if you want to export a JSON file. 5. Click **Export**. A zip file containing your export is downloaded. ## Related topics * [Getting Started with the Orders Export API](/v3/orders-and-inventory/api-reference/orders/exports/overview) # Filtering Orders Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders The **Manage Orders** page displays a list that includes every order. This list can be filtered by **Order Status**, **Order Date**, **Order Total**, and **Channel** so that the list only displays orders that match the filter parameters. To view additional filters, click the **More** button. The additional options allow you to filter by most data points associated with an order, such as the customer’s name, contact information, currency, payment statuses, and more. You can apply any combination of standard filters and additional filters from the **More** menu simultaneously. ## Order Filter Options The following tables list the options when setting up standard filters and more filters. ### Standard filters The standard filters table shows the various options for standard filters. | Field | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Order Status** | The status of the order, whether **Created**, **Allocated**, or **Shipped**, or a combination of these options. | | **Order Date** | The date the order was created or modified, whether **Today**, **Last 7 days**, **Last 30 days**, or a custom date range using the calendar menu. | | **Order Total** | The total order cost within a user-specified range. | | **Channel** | The channel, whether **12** for the United States or **13** for Canada. Other channels that the user creates in fabric Experiences or via API are also available. | ### More filters The more filters table shows the various options available in the **More** menu. | Field | Description | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Type** | Type of the order:
- **WEB** : Orders that shoppers create on storefronts.
- **Borderfree**: International orders. These are orders that will be shipped outside of the merchant's country.
- **Mobile**: Orders that shoppers create on mobile apps, not web pages.
- **CSR**: Orders that customer service representatives create for customers. | | **Currency** | The currency type with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Order subtotal** | The order subtotal within a user-specified range. | | **Order discounts** | The order discount with options to validate by **Is equal to**, **Is greater than**, or **Is lesser than**. | | **Fee total** | The total fees with options to validate by **Is equal to**, **Is greater than**, or **Is lesser than**. | | **Tax total** | The total taxes with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer first name** | The customer’s first name with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer middle name** | The customer’s middle name with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer last name** | The customer’s last name with validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer email** | The customer’s email address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer phone number** | The customer’s phone number with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer phone type** | The customer’s phone type with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer employee ID** | The ID of the employee who placed the order for the customer with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Customer account ID** | The customer account ID with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Pickup first name** | The first name of the person picking up the order with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Pickup middle name** | The middle name of the person picking up the order with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Pickup last name** | The last name of the person picking up the order with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Email** | The email address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Primary pickup phone number** | The primary pickup phone number with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Phone type** | The phone type with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Pickup type** | The pickup type with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address first name** | The first name associated with the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address middle name** | The middle name associated with the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address last name** | The last name associated with the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address phone number** | The phone number associated with the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address phone type** | The phone type associated with the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address line 1** | The first line of the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address line 2** | The second line of the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address city** | The city of the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address region** | The region, such as the state or province, of the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Ship to address postal code** | The postal code of the shipping address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address first name** | The first name associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address middle name** | The middle name associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address last name** | The last name associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address email** | The email address associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address phone number** | The phone number associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address phone type** | The phone type associated with the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address line 1** | The first line of the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address line 2** | The second line of the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address city** | The city of the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address region** | The region, such as the state or province, of the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Bill to address postal code** | The postal code of the billing address with options to validate by **Is exact match**, **Includes**, or **Excludes**. | | **Payment status** | The payment status, whether **PAID**, **AUTHORIZED**, **PARTIALLY\_PAID**, or **NOT\_AUTHORIZED**, or a combination of these options. | | **Payment charged amount** | The payment charged amount with options to validate by **Is equal to**, **Is greater than**, or **Is lesser than**. | ## Setting up a Standard Filter 1. In the left menu, click **Orders**.\ The **Manage Orders** page is displayed. 2. Click one of the following filters: * **Order Status** * **Order Date** * **Order Total** * **Channel**.\ The filter options are displayed. 3. Set up the filter parameters as required. Orders that match the filter criteria are displayed. You can remove an individual filter by clicking the **X** icon corresponding to the filter in the list of filters. You can also click **Reset Filters** to remove all filters. ## Setting up More Filters 1. In the left menu, click **Orders**.\ The **Manage Orders** page is displayed. 2. Click **More**.\ The **Filters** window is displayed. 3. Click a filter option. 4. Set up the filter parameters as required and press **Enter**. 5. Click **Apply**. Orders that match the filter criteria are displayed. You can remove an individual filter by clicking the **X** icon corresponding to the filter in the list of filters. You can also click **Reset Filters** to remove all filters. # Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/overview fabric Orders is a distributed order management (DOM) platform that helps you manage the order fulfillment process and provide inventory details, order fulfillment, and customer service. The **Manage Orders** feature helps you to create real-time orders in the orders database, unify order data, get existing order information, track orders, update orders, add additional products to an order, process cancellations, returns, and exchanges. Additionally, you can use this feature to flag fraudulent orders, which then can be either released from hold or canceled. ### Order Statuses You can find the order status on the **Orders** and **Orders > Basic details** page. These statuses describe the current status of an individual order within the order lifecycle. The following table describes each order status: | Order Status | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Shipped** | Indicates that a shipment is created. | | **Allocated** | Indicates all the items in an order are reserved. | | **Canceled** | Indicates that either fraud is detected and the order was canceled within the hold window or the payment isn't authorized. | | **Returned** | Indicates that all the items in an order have been returned. | | **Created** | Indicates that the order is created. | | **Exchanged** | Indicates that an exchange is created. The exchange is only created if all the items from the order to be exchanged have been received from the customer. | | **Picked Up** | Indicates that all the items in an order have been picked up at a specified location. | | **Partially Allocated** | Indicates that the product inventory for one or more of the items in the order are successfully reserved, but additional items are still pending reservation. | | **Partially Shipped** | Indicates multiple order statuses for a single order. At least one product in the order is shipped and the remaining products have different statuses. | | **Partially Returned** | Indicates multiple order statuses for a single order. At least one product in the order is returned and the remaining products have different statuses. | | **Partially Exchanged** | Indicates multiple order statuses for a single order. At least one product in the order is exchanged and the remaining products have different statuses. The exchanged items must be received from the customer before this status is displayed. | | **Confirmed** | Indicates the release date has passed for an order. | | **Ready For Pickup** | Indicates that all the items in an order are ready for pickup at a specified retail location. | | **Ready for Partial Pickup** | Indicates multiple order statuses for a single order. At least one product in the order is ready for pickup at a specified retail location and the remaining products have a different status. | | **Delivered** | Indicates all the items in an order are delivered. | | **Partially Delivered** | Indicates multiple order statuses for a single order. At least one product in the order is delivered and the remaining products have different statuses. | | **Hold** | Indicates that the item is available, the payment is authorized, and the customer has a brief time window to make changes to the order. | | **Error** | Indicates the order payment status returned an order payment error. | ### Payment Statuses You can find the payment status on the **Orders** page. These statuses describe the current payment status of an order within the order lifecycle. The following table describes each payment status: | Payment Status | Description | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Authorized** | Indicates that the payment for the order has been authorized. | | **Partially paid** | Indicates multiple order statuses for a single order. At least one product in the order is paid for and the remaining products have different payment statuses. | | **Paid** | Indicates that the payment for the order has been paid. | | **Error** | Indicates that an error occurred during the payment process. Depending on your payment provider rules, a set number of payment attempts will be made before the order is canceled. | ### Allocation Statuses Allocations serve as fulfillment location records and are used by Warehouse Management Services (WMS) or Point of Sales Services (POS). You can find the **Allocation Status** on the **Allocation** and **Orders > Allocations** page. This status describes the current allocation status of each individual SKU. The following table describes each allocation status: | Allocation Status | Description | | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Allocated** | Indicates that all products in the order are allocated. | | **Pending Drop** | Indicates the order is allocated with a location number and is awaiting shipping. | | **Pending Allocation** | Indicates the order is confirmed and waiting for allocation. | | **Pending Pickup** | Indicates the order is waiting for pickup. | | **Shipped** | Indicates the order is shipped and a tracking number is created. | | **Partially Shipped** | Indicates multiple order statuses for a single order. At least one product in the order is shipped and the remaining products have different statuses. | | **Reallocated** | Indicates that the order was reallocated to a different fulfillment location. | | **Cancelled** | Indicates the order is cancelled. | | **Partially Cancelled** | Indicates multiple order statuses for a single order. At least one product in the order is canceled and the remaining products have different statuses. | | **Pending Reallocation** | Indicates the order is pending reallocation to a different fulfillment location. | | **Partial Pending Reallocation** | Indicates that one or more products in the order are pending reallocation to a different fulfillment location. | ### Shipment Statuses You can find the **Shipment status** on the **Shipment**, **Orders > Shipments**, and **Orders > Basic details** page. When shipping multiple items from different locations or carriers, each group of items in an order is assigned a separate shipment status. The following table describes each shipment status: | Shipment Status | Description | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Shipment created** | Indicates that a shipment is created for the order. A tracking number is provided. | | **Shipment updated** | Indicates that a shipments information or details have been updated. | | **Shipment cancelled** | Indicates that a shipment is canceled. | | **Pickup created** | Indicates that a shipment is being sent to a specified retail or pickup location. | | **Pickup completed** | Indicates that the order has been picked up by the customer. | | **Shipment delivered** | Indicates that the order has been delivered to the customers address provided on the order. | | **Shipment return pending** | Indicates that a return has been requested but the items are still in transit and haven't been processed or received. | | **Shipment return received** | Indicates that a return has been processed and the items received. | | **Shipment partially delivered** | Indicates multiple order statuses for a single order. At least one product in the order is delivered and the remaining products have a different status. | ### Invoice Statuses You can find the **Invoice Status** on the **Invoice** and **Orders > Invoices** page. When shipping multiple items from different locations or carriers, each group of items in an order is assigned a separate invoice status. The following table describes each invoice status: | Invoice Status | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Captured** | Indicates that the authorized amount is successfully captured. | | **Settled** | Indicates that the authorized amount is successfully settled with the customer. The means the authorized amount is fully paid or has been returned to the shopper. | | **Settle Failed** | Indicates that the settlement for the authorized amount failed. | | **Partially Settled** | Indicates that the authorized amount is partially settled. For example, 7.50 USD of the authorized 11.50 USD is paid and settled. | # Processing returns Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/returning-orders You can return an entire order or the individual products in an order. The system automatically calculates all the return prices, fees, shipping, and taxes. The return option for an order is enabled only after the payment process is initiated for the order. Orders with the **Fraud** status can't be returned. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](//v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find the order, use the [search or filter options](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders.mdx) on the **Manage Orders** page. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. In the top-right of the page, click **Return Order**. The **Return order** page is displayed. 5. In the **Select SKUs to return** section, click one of the following: * To refund an entire order, select the **Refund entire order** checkbox. This automatically checks every item in the order and sets the maximum return quantity for each SKU. * To refund specific items, click the checkbox next to the SKU you want to exchange and use the **+** or **-** buttons to set the quantity. The **Refund summary** is updated. 6. Click **Next**. 7. If multiple return reasons exist for each SKU, clear the **Same reason code for all SKUs** field. 8. In the **Action** field, select **Return and refund**. 9. In the **Reason code** field, select a reason code. You can add additional information for the exchange by selecting **Add sub-reason code** and by providing the information in the **Sub-reason code** field. 10. Click **Next**. 11. In the **Refund** section, enter the refund amount in the **Refund \$** field. The system automatically adjusts the order to include any previous discounts, adjustments, and taxes. More information on the refund can be reviewed in the [Refund summary](#refund-summary). 12. In the **Shipping refund** field, enter a shipping refund amount. If the customer qualified for free shipping, this field is set to \$0. 13. In the **Refund Fee** field, enter a fee refund amount. If the customer did not pay any fees, this field is set to \$0. 14. Click **Next**. The **Confirm** section is displayed with an overview of the refund. 15. Click **Confirm**. The order status is updated to **Returned**. ### Refund Summary The **Refund summary** section displays a breakdown of the total amount being refunded. Selecting more than one item to refund updates the summary accordingly. The following table describes each field in the **Refund summary** section. | Field | Description | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Subtotal refund** | Displays the refund subtotal which excludes discounts, fees, adjustments, shipping, and taxes. This amount can be edited in the refund process. | | **Discounts refund** | Displays the discount amount applied to the order. If discount codes were applied to a product, the system automatically adjusts the refund summary. | | **Fees refund** | Displays the additional fees that were charged for an order such as an oversized item fee. This can be edited in the refund process. | | **Adjustment refund** | Displays the adjustments applied to the order if applicable. | | **Shipping refund** | Displays the shipping refund amount. This can be edited in the refund process. | | **Tax refund** | Displays the tax refund amount. Tax refund amounts can't be edited and are broken down into sub-taxes. For example, Canadian orders are broken down into two taxes, General Sales Tax (GST) and Provincial Sale Tax (PST). Use the **More Details** field to get a list of taxes. Taxes are calculated for individual products, so returns with multiple products display duplicate taxes representing each product. | | **Total refund** | Displays the total refund amount. | ### Adding Notes to an Order The **Add Notes** option is located under the **Return order** label. 1. To add notes to an order, Click **Add Notes**. The **Add notes** window is displayed. 2. Enter the note. Notes are limited to 110 characters. 3. Click **Save**. You can edit the note by clicking **Edit Notes**. Repeat step 2 and 3 to complete the update. The note is added under the **Return order** label. Notes are only saved if you complete the entire return process. # Updating a Shipping Address Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/updating-shipping-address This topic covers the process of updating an existing orders shipping address. You can update both pickup-from-store and ship-to-home addresses. ## Prerequisites * Ensure that you have the **Orders & Inventory Editor** or **Administrator** privileges to fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. * Ensure that the order is in **Hold**, **Confirmed**, **Partially allocated**, or **Created** status. If the status of the order changes to **Allocated** in the order lifecycle, the order can no longer be updated with additional products. ## Procedure 1. In the left menu, click **Orders**. The **Orders** tab is displayed on the **Manage Orders** page. 2. To find the order, use the [search or filter]() options on the **Manage Orders** page. 3. In the orders table, click the **Order Number**. The order details are displayed on the **Basic details** tab. 4. Click the **More actions** button and select **Change shipping address**. The **Change address for order** page is displayed. 5. In the **Select SKUs** section, use the checkbox for **SKU ID** to select each item in the order. The shipping addresses are updated for the selected items. 6. In the **Fulfillment method** field, select one of the following options: * [Ship to Home](#ship-to-home): Use this option if you want to ship the selected products to a specific address. * [Pickup in store](#pickup-in-store): Use this option if you want to ship the selected products to a designated store pickup location. ### Ship to Home 1. To ship to a specific address, in the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * From the **Phone number type** field, select `Mobile`, `Business`, or `Home`. 2. In the **Shipping address** section, enter the following details: * **Address line 1** * (Optional) Click **Add address line** to add additional address lines. * From the **Country** field, select a Country. * **Zip code** * **Region** * **City** * From the **Shipping method** field, select a shipping method. 3. Click **Confirm**. A confirmation window is displayed. 4. Click **Yes, change all**. The address is updated and the **Delivery Summary** in the **Basic details** tab is updated with the new address for each product you selected. ### Pickup in Store 1. In the **Select pickup location** field, select a [pickup location](/v3/orders-and-inventory/user-guides/inventory/locations). 2. To ship to a pickup location, in the **Contact type** field, select one of the following: * **Primary**: Select this method to set the primary contact information. The primary contact is sent notifications for pickup and tracking details. * **Secondary**: Select this method to authorize someone other than the primary contact to pick up the order. The default for a primary contact is the customer who ordered the items unless otherwise specified. 3. In the **Contact details** section, enter the following details: * **First name** * **Last name** * **Email** * **Phone number** * From the **Phone number type** field, select `Mobile`, `Business`, or `Home`. 4. (Optional) To add additional contacts that are authorized to pick up the order, click **Add alternate pickup name**. 5. Click **Confirm**. A confirmation window is displayed. 6. Click **Yes, change all**. The address is updated and the **Delivery Summary** in the **Basic details** tab is updated with the new address for each product you selected. # Viewing Allocations Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-allocations The **Allocation** tab in **Manage Orders** provides a summary of your allocations containing information such as **Order Number**, **Allocation Request ID**, **Allocation Status**, **Parent Allocation ID**, **Channel**, **Item Type**, and **Allocation Date**. * To search for a specific allocation, use filter conditions. For more information, see the [Searching, Filtering, and Sorting](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders) section. ## Prerequisites * Ensure that you have the **Viewer**, **Orders & Inventory Editor**, or **Administrator** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Allocation table The **Allocation** tab displays the following information: | Column name | Description | Values | | ------------------------- | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | | **Order Number** | A unique order identifier. You can view the **Basic details** page by clicking the order number. | String | | **Allocation Request ID** | A unique allocation identifier. Click the request ID to view the **Allocations** detail page. | String | | **Allocation Status** | The current allocation status code for the order. | [Allocation Statuses](/v3/orders-and-inventory/user-guides/orders/order-management/overview#allocation-statuses) | | **Parent Allocation ID** | The **Parent Allocation ID** remains constant and is used to monitor all subsequent child allocations. | String | | **Channel** | The sales channel ID for the allocation. | String | | **Items Type** | An inherited attribute from Orders that classifies an item type. | `WEB_SHIP`, `WEB_PICKUP`, `WEB_SDD INTERNATIONAL`, `POS`, `POS_SHIP`, and `POS_PICKUP`. | | **Allocation Date** | The allocation creation time in the UTC format. | Date and Time | # Viewing Allocation Details Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-details-of-an-order/allocation-details The **Allocations** tab displays all the allocations associated with a specific order number. This includes the allocation date, SKU, status, and additional allocation attributes. ## Allocation Details Each allocation has its own **Allocation ID** and you can have multiple allocations for a single order. Allocations are sorted by the most recent allocation request. By default, each allocation displays **Allocation ID**, **Parent allocation ID**, **Allocation request ID**, and **Allocation date**. Clicking **View more attributes** displays the allocation attributes window with additional attributes. The following table describes the different allocation attributes in the **View more attributes** window: | Field | Description | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Allocation ID** | A unique allocation identifier. | | **Parent allocation ID** | The **Parent Allocation ID** is initially the same as the **Allocation ID**. The **Parent Allocation ID** remains constant (isn't updated) and is used to monitor all subsequent child allocations. For example, if a new allocation is assigned to an order and the **Allocation ID** is updated, the previous ID (**Parent Allocation ID**) can still be referenced. | | **Allocation request ID** | A merchant-specified unique ID. If omitted, this is generated by fabric’s sequence generator using the Configuration service. | | **Allocation date** | The allocation creation time in the UTC format. | | **Last updated date** | A system-generated time indicating when the allocation record was last modified. | | **Location type** | The type of inventory location where the order is picked up, such as DC or Store. | | **Ship-from location name** | The Inventory location fulfilling the allocation. | | **Ship-from location number** | The inventory location number to identify the ship-from location or Buy Online Pickup from Store (BOPIS) location. | | **Ship-from location address** | The full address of the fulfillment location. | | **Shipment method** | The shipment method used to fulfill the allocation. For example, next day shipping. | | **Recipient** | The recipient details such as name, email address, and phone number. If details are unavailable, the value is set to **false**. | | **Sent date** | The date and time the allocation shipment left the facility. | | **Ship to id** | A system-generated UUID associated with `shipInfo`, generated from the Cart and Checkout (CnC) service. Note that an order can have multiple ship-to or delivery locations, however the `shipToId` is the same for items going to the same location. | | **Ship to address** | The shipping address details. | | **Type** | The allocation type.
**Allocated**: The order is allocated for fulfillment.
**Scratched**: The order is cancelled during allocation due to unavailable inventory.
**Returned**: The allocation is created for returned items. | | **Shipment type** | The shipment type, such as, `Pickup`, `Ship_To_Store`, or `Ship_To_Home`, that's selected by the customer during checkout. This attribute is inherited from the `order.shipInfo` during allocation creation. | | **Order sub type** | An order subtype attribute that contains additional information on the order type. Use this setting to include additional order data such as region or device type which isn't included in the order types, such as *IOS*, *ANDROID*, and *INTERNATIONAL* . | | **Currency** | The currency used for the order. | ### Allocation table The following table describes the additional attributes found in each individual allocation: | Field | Description | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Line number** | A system-generated number assigned to each item in an allocation. | | **SKU** | The stock keeping unit (SKU), unique identifier of item. Clicking the SKU displays the **Sku Details** window containing pricing and attribute information. | | **Allocated** | Indicates if the item is allocated. A **0** indicates the item isn't allocated, a **1** indicates the item is allocated. | | **Shipped** | Indicates if the item is shipped. A **0** indicates the item isn't shipped, a **1** indicates the item is shipped. | | **Cancelled** | Indicates if the item is cancelled. A **0** indicates the item isn't cancelled, a **1** indicates the item is cancelled. | # Viewing Order Basic Details Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-details-of-an-order/basic-details To view an orders **Basic Details**, click the order number in the **Manage Orders** > **Orders** table. The **Basic details** tab displays an overview of the orders attributes, status, delivery details, customer details, and payment details. ## Basic Details Tab As an order continues through the order lifecycle, attributes are continually updated and added to the order. These attributes are displayed in the **Basic details** tab. The **Basic Details** tab contains the following sections: * [Order Summary](#order-summary) * [Customer Details](#customer-details) * [Order Status](#order-status) * [Delivery Summary](#delivery-summary) * [Payment Details](#payment-details) When an order has more than 16 attributes, the **View more attributes** button is displayed. If you click **View more attributes**, all the order attributes are displayed in a new window with searching capabilities. The following table describes the default order attributes: | Field | Description | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Order ID** | Displays the unique identifier of the order. | | **Order type** | Specifies the workflow used to create the order. For example, Storefront orders have a different workflow than Call Center orders. fabric Orders service offers default configurations for Storefront, Call Center, Point of Sale, iOS, Android, and International. | | **Order subtype** | Indicates an order subtype attribute that contains additional information on the order type. This allows additional order data to be captured such as region or device data which was not captured in the order type such as `IOS`, `ANDROID`, and `INTERNATIONAL`. | | **Date Created** | Displays the order creation time in UTC. | | **Channel** | Displays the sales channel ID. | | **Order Total** | Specifies the total amount to be charged for the order. This is calculated by taking `orderSubTotal` - `orderDiscountTotal` + `orderFeeTotal` + `orderTaxTotal`. This value also includes the currency that was used for the order. | | **fraudStatus** | Displays the current fraud status. | | **fraudCheckSessionId** | Displays the unique identifier of the fraud status. | | **fraudCheckStatus** | Indicates if the fraud status has changed. | | **fraudCheckTransId** | Displays a system-generated fraud transaction ID used to track the transaction fraud status. | | **fraudScore** | Displays a fraud score used to flag an order for fraud, ranging from 0-100. | | **loyaltyStatus** | Indicates the customers current loyalty status at the time of order creation. | | **createdDate** | Displays the fraud status creation time in UTC. | ### Order Summary The **Order summary** section displays an overview of the total costs associated with an order such as discounts, fees, taxes, and adjustments. ### Customer Details The **Customer Details** section displays an overview of the customer details for an order. To edit a customers basic details, click **Edit**. The **Edit customer details** window is displayed. You can update the following details: * **First name** * **Last name** * **Phone number** * **Email** * **Middle name** * **Phone type** ### Order Status The **Order Status** section displays a high-level overview for each SKUs position in the order lifecycle. For more information on each individual order status, visit the [Order Statuses](/v3/orders-and-inventory/user-guides/orders/overview#order-statuses) section in the Overview. Orders are separated into shipping groups based on their allocation and shipping methods. For instance, if one item is for pickup only and other items in the same order qualify for free standard shipping, the order is split into Group 1 and Group 2. Each group follows its own order status lifecycle. Additionally, each group shows the following details based on whether the order is for **Pickup** or **Delivery**. * **Fulfillment Details**: Displays the customer's shipping information including the customer name, shipping address, city, state code, zip code, and country. * **Shipping Method**: Displays the orders selected shipping method. For more information, visit the [Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods) section in Settings. * **Pick up details**: Displays the orders primary pick up name and the pick up location. #### SKU Details If you want to view the details of a SKU, click the **SKU**. The **Sku Details** window is displayed containing two tabs, **Pricing** and **Attributes**. * For more information on **Attributes**, visit the [Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) section in the Product Catalog documentation. * For more information on **Pricing**, visit the [Pricing](/v3/offers/user-guides/offers/pricing) section in the Offers documentation. ### Delivery Summary The **Delivery Summary** section displays an overview of the delivery containing shipping location information, the current shipping status, and the total number of packages. To view more detailed shipment information, you can click **Shipment 1 of X**. The **Shipments** detail tab is displayed. ### Payment Details The **Payment Details** section displays an overview of the orders payment attributes. The following table describes the default payment attributes: | Field | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Payment type** | Indicates the payment type, for example, credit card payment providers can be Visa, Mastercard, and American express. | | **Card number** | Displays the card used to complete the transaction. | | **Expiration date** | Displays the card expirations month and year. | | **Payment placed on** | Displays a system-generated time created during shipment. This time can instead be captured at checkout during order creation depending on your merchant-defined settings. | | **Refund amount** | Specifies the merchant-defined refund amount. If no refund is issued, this attribute remains blank. | | **Bill-to** | Displays the customer's billing information, including name, email, and phone details. | | **Bill-to-address** | Displays the customer's billing address information including, address lines, city, region, postal code, and country code if applicable. | | **fabric payment reference** | Displays a system-generated UUID referenced internally for Invoice and Orders services. | | **Payment provider** | Indicates the payment provider that processed the payment. | | **Payment token** | Displays the payment token provided by the payment provider. | | **Payment status code** | Indicates the current payment status code. For more information visit [Payment Statuses](/v3/orders-and-inventory/user-guides/orders/order-management/overview) in the manage orders overview documentation. | | **Payment counter** | Displays a sequential or incremental counter associated with a payment for an order. This is used in refund scenarios to identify the specific payment for refund. | | **Transaction id** | Displays the system-generated transaction ID. | | **Partial capture** | Indicates whether the payment capture is partial. A partial capture is the release of funds that don't equal the total authorized payment. For example, 7.50 USD of the authorized 10.99 USD payment. The system returns `true` when the payment is captured partially; otherwise, it returns `false`. | | **Final capture** | Indicates whether the payment capture is final. The point of final capture is when all authorized funds have moved from the customer to the merchant and the payment is successful. The system returns `true` when the payment capture is final; otherwise, it returns `false`. | | **Order source** | Displays a merchant-defined source indicating where an update was initiated. There are no predefined values; for example, values can be Customer Service Representative (CSR), Point-of-Sale (POS), and Web (e-commerce). | | **Invoice number** | Displays the merchant-defined unique invoice number. If omitted, this is generated by fabric’s sequence generator using the Configuration service. | # Viewing Invoice Details Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-details-of-an-order/invoice-details The **Invoices** tab displays any invoices associated with a specific order. This includes shipping, returns, appeasement, and other invoice types. ## Invoice Details Each invoice contains a number indicating the total number of invoices associated with an order, the specific invoice number, and the invoice status. Invoices are separated by invoice type. Each invoice contains the following attribute details: | Field | Description | Value | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | **Invoice type** | The current invoice type code for the order. | `RETURN`, `SHIPPING`, `APPEASEMENT`, `ORDER_DONATION`, `ORDER_CARRY`, `EXCHANGE` | | **Invoice total** | The total amount to be charged for the invoice. | String | | **Invoice date** | Indicates the time the invoice was created in UTC format. | String | | **Shipment number** | A merchant-specified shipment number for an invoice. | String | | **SKU** | The stock keeping unit (SKU), unique identifier of item. | String | | **Price / unit** | Indicates the default or base price for each unit of a product.

For more information on product pricing, visit the Offers [Pricing documentation](/v3/offers/user-guides/offers/pricing). | String | | **Qty** | Indicates the quantity of a Product or SKU. | Number | | **Invoice Amount** | Indicates the total amount charged for an item in an invoice. | String | When an invoice has more than 4 attributes, the **View more attributes** button is displayed. Clicking **View more attributes** displays all the invoice attributes in a new window with searching capabilities. For more information on the available invoice attributes, visit the [Invoices API reference documentation](/v3/orders-and-inventory/api-reference/orders/invoices/get-invoice-by-id). The 200 response displays all possible default invoice attributes and descriptions for each attribute. This list doesn't include custom attributes. # Viewing Shipment Details Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-details-of-an-order/shipment-details The **Shipments** tab displays all the shipments associated with a specific order number. This includes the ship date, method, status, fulfillment details, tracking information, and delivery date. Depending on the allocation location, item, fulfillment logic, and shipping method selected at checkout, multiple shipments might be required for a single order. ## Shipment Details By default, each shipment displays **Fulfillment details**, **Ship date**, **Shipping Method**, and **Delivery date**. Clicking **View more attributes** displays the shipment attributes window with additional attributes. The following table describes the different shipment attributes in the **View more attributes** window: | Field | Description | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Fulfillment details** | The name, address, and email details for the primary recipient. | | **Ship date** | The shipment time in UTC format. | | **Shipping method** | The shipment method used to fulfill the allocation. For example, next day shipping. | | **Delivered Date** | The delivery date. Initially, this value is null. Once delivery is complete, the date and time is displayed in UTC format. | | **Master tracking number** | The tracking number for all cartons in the shipment. | | **Location Number** | A unique value used to identify the **Ship from** location. This must be the `locationNumber` stored in the fabric Location service. | | **Location type** | The location type. For example, a distribution center (DC) or warehouse. | | **Shipment ID** | A system-generated shipment ID (UUID). | | **Shipment number** | A merchant-specified shipment number for an invoice. | | **Shipment type** | The shipment type, such as, `Pickup`, `Ship_To_Store`, or `Ship_To_Home`, that's selected by the customer during checkout. This attribute is inherited from the `order.shipInfo` during allocation creation. | | **Allocation ID** | A system-generated allocation ID (UUID) from the Create allocation endpoint. Allocation occurs prior to shipment creation. An `allocationId` is mandatory to create a shipment. | | **Vendor ID** | The unique Vendor ID. This ID is used in dropshipping scenarios to indicate the vendor responsible for the given item. | | **Ship from** | The allocation location name and number. | | **Ship from address** | The full address of the fulfillment location. | | **Ship to** | The shipping address details. | | **Ship to id** | A system-generated UUID associated with `shipInfo`, generated from cart and checkout (CnC) service. **Note**: An order can have multiple ship-to (delivery) locations and items going to the same location share one `shipToId`. | | **PO Number** | A merchant-defined purchase order number. | | **Status Code** | The current shipment [status code](/v3/orders-and-inventory/user-guides/orders/order-management/overview) for the order. | | **Reshipment reason code** | The reason provided for a reshipment. For example, missing order. | | **Updated at** | The time the last update to shipment was made in UTC format. | | **Recipient name** | The primary contact's name. | | **Recipient email** | The primary contact's email. | | **Recipient phone** | The primary contact's phone number. | ## Package Details Each shipment section contains a package table with information on the number of packages, a tracking number, and the package shipment status. Clicking the arrow next to the shipping status expands the package details section. This reveals additional information on the package details such as the SKUs, quantity of items, cost, events, and attributes. By default, the **SKUs** tab is selected. ### SKU Details If you want to view the details of a SKU, click the **SKU**. The **Sku Details** window is displayed containing two tabs, **Pricing** and **Attributes**. * For more information on **Attributes**, visit the [Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) section in the Product Catalog documentation. * For more information on **Pricing**, visit the [Pricing](/v3/offers/user-guides/offers/pricing/pricing-overview) section in the Offers documentation. ### SKUs | Field | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **SKU** | The stock keeping unit (SKU) used as a unique identifier for an item. Clicking the SKU displays the **Sku Details** window containing pricing and attribute information. | | **Quantity** | Indicates the quantity of a product or SKU. | | **SKU Cost** | The total cost of the SKUs before discounts and promotions. | | **Total Cost** | The total cost paid by the customer including discounts and promotions. | ### Event Tracker | Field | Description | | ------------------- | --------------------------------------------------------------------- | | **Ship from** | The allocation location name and number. | | **Ship to** | The shipping address details. | | **Tracking number** | The carton tracking number. Each carton has a single tracking number. | | **Activity** | Displays shipment-specific events provided by the carrier. | | **Date** | The time and date the event was recorded in UTC format. | | **Location** | The location the event occurred, if applicable. | ### Attributes | Field | Description | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Promised Delivered Date** | The promised delivery date in UTC format provided by the seller. | | **Carton Number** | A merchant-defined unique identifier for a carton. | | **Tracking number** | The carton tracking number. Each carton has a single tracking number. | | **Carton Type** | The carton type provided to the carrier. For example, package. | | **Est. ship date** | The estimated ship date in UTC format provided by the seller based on availability of items, processing time, delivery location, and the selected shipping method. | | **Est. delivery date** | The estimated delivery date in UTC format provided by the carrier based several factors including the selected shipping method and delivery location. | | **Shipment method** | The shipment method used to fulfill the allocation. For example, next day shipping. | | **Shipment carrier** | The shipment carrier name. | | **Total weight** | The cartons total weight. | # Viewing an Orders Activity Log Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-details-of-an-order/viewing-activity-log The order details **Activity log** tab displays a history of all the inventory and shipping events for an order. ## Activity log filtering You can filter the activity log history by using one or more of the following filters: | Filter name | Description | Values | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | **Date** | The date filter sets a look-back window for your selected time frame. For example, selecting **Last 7 days** displays the activity logs for the last 7 days and filters out logs that are older than the selected time frame. To set a **Custom date** filter, select the **Custom date** option, then click the calendar icon and select the desired start date followed by the desired end date. | **Today** **Last 7 days** **Last 30 days** **Custom date** | | **Type of activity** | Activities are split into 4 different types, Order, Invoice, Shipment, and Allocation. Selecting one or more activity type filers an orders activity logs to display only that activity type. | **Order** **Invoice** **Shipment** **Allocation** | | **Updated by** | The [`tenantId`](/v3/platform/settings/account-details/getting-the-account-id) of the user that made an update or change. Automatic updates don't include an **Updated by** value. | `tenantId` Null `-` | ## Activity log table The **Activity log** displays a table with the following columns and values: | Column name | Description | Values | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Date** | The day of the week, month, day, year, and time the change or update was made. | Date | | **Updated by** | The [`tenantId`](/v3/platform/settings/account-details/getting-the-account-id) of the account that made an update or change. Automatic system updates such as order enrichment and order natural hold don't include an **Updated by** value. | `tenantId` Null `-` | | **Type of activity** | Activities are split into 4 different types, Order, Invoice, Shipment, and Allocation. The activity type corresponds to each tab for the current order. For example, if an orders shipment information was updated, the activity type value for that entry in the log will be **Shipment**. The updates are displayed in the **Shipments** tab for the order. | **Order** **Invoice** **Shipment** **Allocation** | | **Document number** | A unique identifier that corresponds to one of the following tabs, **Basic details**, **Allocations**, **Shipments**, and **Invoices**. For example, `65d5103a654a506e00d61ed7` is the **Order ID**. Clicking the link displays the **Basic details** tab for your current order. | String | | **Details** | Details on the updates and existing values, this includes values that haven't changed but are related to the activity type. When the details of a log are too long to display, a **View more updates** link is displayed. Clicking **View more updates** displays all the data associated with a specific log. For more information on each parameter listed in the details, visit the order endpoint corresponding to the type of activity. | [Shipment endpoint](/v3/orders-and-inventory/api-reference/orders/shipments/get-shipment-by-id) [Order endpoint](/v3/orders-and-inventory/api-reference/orders/orders/get-order-by-order-id) [Invoice endpoint](/v3/orders-and-inventory/api-reference/orders/invoices/get-invoice-by-id) [Allocation endpoint](/v3/orders-and-inventory/api-reference/orders/allocations/get-allocation-by-id) Clicking the 200 response for an endpoint displays the response body with each parameter and its description. | ## Related resources * [Orders API documentation](/v3/orders-and-inventory/api-reference/orders/orders--3-0-0) * [Orders FAQ](/v3/orders-and-inventory/api-reference/orders/orders-faq-s) # Viewing Invoices Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-invoices The **Invoice** tab in **Manage Orders** provides a summary of your invoices containing information such as, **Order Number**, **Invoice Number**, **Invoice Total**, **Invoice Status**, **Invoice Type**, and the **Settlement Date**. * To find an invoice, in the search bar, type the search criteria and press **Enter**. You can refine the search results by applying the filter conditions and sorting the results in ascending or descending order. For more information, see the [Searching, Filtering, and Sorting](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders) section. ## Prerequisites * Ensure you have at least one order that meets the current search or filter conditions. If your search or filter criteria don't match any orders, you will see the message **No Orders Found** displayed in the table. * Ensure you have the **Viewer**, **Orders & Inventory Editor**, or **Administrator** privilege for fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) document. ## Invoice Table The **Invoice** tab displays the following information: | Field | Description | Values | | ------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | | **Order Number** | Displays the unique order identifier. You can view the **Basic details** page by clicking the order number. | String | | **Invoice Number** | Displays the merchant-defined unique invoice identifier. To view the invoice details page, click the invoice number. | String | | **Invoice Total** | Displays total amount charged for the invoice. | String | | **Invoice Status** | Indicates current status code for the invoice associated with the order. | [Invoice Statuses](/v3/orders-and-inventory/user-guides/orders/settings/overview#invoice-statuses) | | **Invoice Type** | Indicates the current code for the type of invoice associated with the order. | `RETURN`, `SHIPPING`, `APPEASEMENT`, `ORDER_DONATION`, `ORDER_CARRY`, and `EXCHANGE` | | **Settlement Date** | The invoice settle time in UTC format. | String | # Viewing Orders Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-orders The **Orders** tab in **Manage Orders** provides a summary of your orders containing information such as **Order Number**, **Customer Name**, **Order Total**, **Order Status**, **Payment**, and **Order Created**. You can search for an order, use filter conditions to tailor your search, and sort the results in ascending or descending order. For more information, see the [Searching, Filtering, and Sorting](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders) document. ## Prerequisites * Ensure you have at least one order that meets the current search or filter conditions. If your search or filter criteria don't match any orders, you will see the message *No Orders Found* displayed in the table. * Ensure you have the **Viewer**, **Orders & Inventory Editor**, or **Administrator** privilege for fabric Orders. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) document. ## Order table The **Orders** tab displays a table with the following columns and values: | Column name | Description | Values | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Order Number** | The unique order identifier. Clicking the order number takes you to the Orders **Basic details** tab where you can view additional details such as an orders attributes and history. | String | | **Customer Name** | The name of the customer and customer account ID. | String | | **Order Total** | The total amount to be charged for the order. This is calculated by taking `orderSubTotal` - `orderDiscountTotal` + `orderFeeTotal` + `orderTaxTotal`. This value also includes the currency that was used for the order. | Total cost and currency: \$83.01 USD | | **Order Status** | The current status code for the order. | [Order Status](/v3/orders-and-inventory/user-guides/orders/overview#order-statuses) | | **Payment** | The payment status code for the order. | [Payment Status](/v3/orders-and-inventory/user-guides/orders/overview#invoice-statuses) | | **Order Created** | The order creation time in UTC. | Date and Time | ### Order Information This value displays the total number of orders in the order table. When filtering, this value changes based on the filtered results. For example, filtering by the **Last 7 days** results in **Total Orders** equal to 2431. Filtering by **Today** updates the **Total Orders** number to 153. # Viewing Shipments Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/order-management/viewing-shipments The **Shipment** tab in **Manage Orders** provides a summary of your shipments containing information, such as **Order Number**, **Shipment number**, **Shipment status**, **Ship date**, and **Master Tracking**. * To search for a specific shipment, use filter conditions. For more information, see the [Searching, Filtering, and Sorting](/v3/orders-and-inventory/user-guides/orders/order-management/filtering-orders) section. ## Prerequisites * Ensure that you have the **Viewer**, **Orders & Inventory Editor**, or **Administrator** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Shipment Table The **Shipment** tab displays the following information: | Field | Description | Values | | ------------------- | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | | **Order Number** | A unique order identifier. You can view the **Basic details** page by clicking the order number. | String | | **Shipment number** | A merchant-defined unique shipment identifier. Click the shipment number to view the **Shipments** details page. | String | | **Shipment status** | The current shipment status code for the order. | [Shipment Statuses](https://developer.fabric.inc/docs/overview-1#shipment-statuses) | | **Ship date** | The order shipment time in the UTC format. | date-time | | **Master Tracking** | The tracking number for all cartons in the shipment. | String | # Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/overview Build a centralized source of order, inventory, and warehouse information with fabric Orders. fabric Orders enable you to receive, track, and fulfill customer orders across sales channels, allow customers to track their orders, route orders through warehouses based on the customer’s location, and more. Orders is designed to streamline and simplify order management and fulfillment processes during and after an order is created. ## Key Features Orders is divided into five separate sections accessible from the left column in fabric Copilot: * [Manage orders](/v3/orders-and-inventory/user-guides/orders/order-management/overview) allows you to create orders in the database in real-time, unify order data, get existing order information, track orders, update orders, add additional products to an order, process cancellations, returns, and exchanges. * [Fulfillment](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/order-fulfillment-logic) allows you to create fulfillment rule sets, which are used to direct orders to different fulfillment locations based on characteristics, such as geo-location, warehouse location, item price, order attribute type, and more. * [Activity Log](/v3/orders-and-inventory/user-guides/orders/activity-log) displays your order import and export history. * [Alerts](/v3/platform/home/alerts/alerts-overview) notifies you of potential issues using the data within your account. * [Settings](/v3/orders-and-inventory/user-guides/orders/settings/overview) contains additional features and configurations such as Order Attributes, Shipping Methods, Backorder & Preorder, Policies, and Alerts. ## Role-Based Access Control (RBAC) fabric Copilot provides the ability to restrict the access of different users to information and actions available to them through roles. For more information and instructions on how to set up these controls, see the [RBAC](/v3/platform/settings/rbac/role-based-access-control-orders-roles) documentation. ## Integration Examples **Allocation with fabric Orders:** After creating an order using fabric Orders service, the orders service sends a request to fabric’s Allocation module for order allocation. Allocation calls Order Fulfillment Logic (OFL) and OFL rules to get the location number where the inventory is available based on the currently defined OFL rule system. After completion, OFL provides the necessary information to the Allocation service, and Allocation calls the inventory service to reserve items as needed, adjusting your inventory counters in real-time. The Order fulfillment process is set up by integrating your existing fulfillment systems, such as a Warehouse Management System (WMS), with fabric's Allocation APIs. This integration enables allocation-related events to start fulfillments in external systems, and allows external systems to make callbacks to the fabric Allocation APIs. **Shipments & Tracking with fabric Orders:** fabric's Shipment APIs ensure that shipments are created for allocations. These APIs enable the warehouse or any external fulfillment system to generate shipments associated with the allocated orders. Additionally, you can set up shipment tracking updates for orders by integrating your carrier tracking service with the Shipment Tracking APIs. These APIs enable the external carrier tracking service, such as ParcelLab, to post shipment events. With the order created, shipped, and tracking enabled, you can manage the order. This includes Cancellations, Appeasements, Exchanges, Credits, Returns, and more using the [Orders APIs](/v3/api-reference/orders/orders--3-0-0) or [Manage Orders](/v3/guides/orders/order-managment/overview) UI as needed. **Notifications with fabric Orders:** Optionally, you can configure email updates for order transactions by integrating your preferred email service with the Notification APIs. This integration enables fabric Orders to deliver real-time email notifications for specific order update events. **Fraud with fabric Orders:** To establish fraud prevention, you can integrate your preferred fraud service with the Fraud APIs. These APIs primarily allow for hold and release actions on the order, providing an effective means of preventing fraudulent activities. ## Benefits * **Customer Lifetime Value (CLTV)**: Manage the customer lifetime vale through omnichannel orders. With all your data in one place, improve customer service by reducing call volume, average handle time, and increase support satisfaction. Improve order orchestration by reducing split shipments, OOS cancellations, and increasing on time delivery rate. As a multi-brand and multi-channel retailer, improve order processing time, reduce inventory cancellations, and subsequently increase support satisfaction. * **Sell-through Rate (STR)**: You can increase sell-through rate by unifying and improving the Buy Online and Pickup in Store (BOPIS) experience, ship from store experience, and improved store inventory management. * **Storefront Conversion Rate (CVR)**: Using real-time inventory coupled with backorder and preorder capabilities, you can increase sell-through rate, website conversion, and site merchandiser operational efficiency. Additionally, you can optimize your inventory and fulfillment by reducing split shipments, OOS cancellations, and increasing on time delivery rate. ## Example Use Cases * **Exporting Sales and Reports Data**: Using fabric Orders export API, you can export data to be utilized for business intelligence or store the data externally as needed. The exports service flattens the JSON structure into columns, so that an external columnar database, such as an SQL database, can easily ingest the data. Exports can also be generated in fabric Copilot for ad-hoc analysis. * **Fulfilling Backorders & Preorders**: During the order creation process within fabric Orders service, backorders and preorders are identified and flagged accordingly. This enables the backorder and preorder service to store these orders in a dedicated backorder queue. Fulfillment of these orders follows a *first in, first out* approach as inventory becomes available for the backorders. Additionally, consent to delay operations are implemented based on your configuration of backorder settings. Orders that exceed the specified backorder service level require customer consent to proceed with the delay. fabric triggers the consent to delay notification based on your configuration, and updates regarding consent to delay are managed through the consent to delay API endpoint. * **Omnichannel Store Fulfillment**: You can maximize return on existing investments in physical locations, such as brick and mortar stores, by connecting ecommerce sales to store inventories that are eligible for direct-to-consumer shipments. By bringing store inventory into the fulfillment network, you can expand capacity for ecommerce sales and increase the available assortment for online shoppers. * **Optimized Order Fulfillment Logic**: Using fabric's Order Fulfillment Logic (OFL) you can configure how orders are handled for different items, locations, sales, shipping types, and more. For example, multi-location fulfillment allows you to allocate orders to specific fulfillment locations based on factors, such as shipping type, geographic distance, and inventory availability. This flexibility enables efficient order processing and reduces shipping times. For same-day delivery optimization, fabric's geolocation feature can be utilized. It considers the customer's location and searches for inventory networks within a set distance that can fulfill the order the fastest. This feature can be configured with specific boundaries and inventory balancing options to ensure the fastest possible delivery. Split shipment management is another key feature, allowing orders to be fulfilled from multiple locations when necessary. This can be set up at both the order and item level, with options to allow partial fulfillment. This functionality is particularly useful when dealing with complex inventory situations or when aiming to optimize delivery times for multi-item orders. ## Related topics * [Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview) * [Inventory](/v3/orders-and-inventory/user-guides/inventory/overview) * [Orders API reference](/v3/orders-and-inventory/api-reference/orders/orders--3-0-0) * [Inventory API reference](/v3/orders-and-inventory/api-reference/inventory/inventory--3-0-0) * [Orders API developer guides](/v3/orders-and-inventory/api-reference/orders/developer-guide/overview) # Backorder & Preorder Settings Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder Backorders are defined as orders for products that aren't currently available for fulfillment. Preorders are defined as orders for products that aren't yet released. ## Prerequisites * Ensure that you have **Administrator** or **Editor** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Procedure In the left menu, click **Orders** > **Settings** > **Backorder & Preorder**. The **Backorder & Preorder Settings** page is displayed. ### Allow backorders 1. In the **Allow Backorders** field, select the **On** option. Additional fields are displayed. 2. In the **Consent to delay should start** field, select one of the following options: * From order created date. * From ship by date. 3. In the **Notification Settings** and **Auto-cancellation Settings** fields, do the following: * In the first **Notification Setting** field, set the number of days past the promised order ship-by date before sending the first consent-to-delay notification to the customer. * In the second **Notification Setting** field, set the number of days past the promised order ship-by date before sending the second consent-to-delay notification to the customer. * In the first **Auto-cancellation Setting** field, set the number of days to cancel the order if the customer doesn't respond to either of the first two notifications. * In the second **Auto-cancellation Setting** field, set the number of days to cancel a backordered order when the item has not yet been fulfilled, even if the customer had previously agreed to a consent-to-delay notification. 4. Click **Save**. The backorder settings are updated and saved for all orders. ### Allow preorders 1. In the **Allow Preorders** field, select the **On** option. 2. Click **Save**. ## Related Topics * [Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes) * [Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods) * [Order Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies) * [Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts) # Order Alerts Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/order-alerts The Order **Alerts setup** page displays an overview of the currently configured order alerts. Order alerts are used to monitor trailing metrics that can affect revenue and efficiency such as returns, cancellations, reorder rates, payment failures, and more. Alerts are classified based on severity thresholds such as low, medium, and high severity levels. You can view the current status of all alerts on the **Home** > **Alerts** page. ## Alert Table Field Descriptions | Field | Description | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------- | | **Alert name** | The alert name assigned when creating the alert. | | **Document** | The module within **Orders** that the alert is for. The options are **Order**, **Invoice**, **Allocation**, or **Inventory**. | | **Status** | The current status, such as active or inactive, of the alert. | | **Created by** | The tenant id of the user who created the alert. | | **Last updated** | A system-generated time indicating when the allocation record was last modified. | ## Creating Order Alerts 1. In the left menu, click **Orders** > **Settings** > **Alerts**. The **Alerts Setup** page is displayed. 2. Click **Create Alert**. The **Create Alert** page is displayed. 3. In the **Basic Information** section, do the following: * Enter an alert name. For example, *Low Orders Allocated*. * Optionally provide an alert **Description**. 4. In the **Alert scope** section, do the following: * In the **Document** field, select a document type. * In the **Template** field, select a template. Depending on the document type you select, the available templates for the document type are displayed. If you want to create a custom alert, follow the instructions in the [Creating fabric Alerts](/v3/platform/home/alerts/creating-alerts) documentation. * In the **Low Severity** field, enter a number representing the low severity threshold to trigger a low alert. * In the **Medium Severity** field, enter a number representing the medium severity threshold to trigger a medium alert. * In the **High Severity** field, enter a number representing the high severity threshold to trigger a high alert. 5. In the **Alert notification** section, select the **Notify by email** as required. If you don't select the **Notify by email** field, email notifications aren't sent to users who are subscribed to alerts. However, the alert is still displayed on the **Home** > **Alerts** page. If you select the **Notify by email** field, fabric automatically sends email alert notifications to users who have subscribed to alerts. For more information on how to subscribe to an alert, see the [Managing fabric Alerts](/v3/platform/home/alerts/managing-alerts) documentation. ## Editing an Alert 1. In the left menu, click **Orders** > **Settings** > **Alerts**. The **Alerts Setup** page is displayed. 2. In the **Alert name** column, click an alert. The **View Alert** page is displayed. You can edit the details in the **Basic Information**, **Alert Scope**, and **Alert notification** sections. For more information on each of the fields, see the [Creating Order Alerts](#creating-order-alerts) section. 3. To save the alert, click **Edit**. The edits are saved and the **Last updated** field in the **Alerts Setup** page is updated. ## Deactivating Alerts **Note:** Currently, alerts can't be deleted. You can only deactivate an alert if you don't wish to receive a notification. 1. In the left menu, click **Orders** > **Settings** > **Alerts**. The **Alerts Setup** page is displayed. 2. In the **Alert name** column, click an alert. The **View Alert** page is displayed. 3. Click the **Active** toggle. The deactivate alert window is displayed. 4. Click **Yes, Deactivate**. The **Active** toggle now displays **Inactive**. The system auto saves these changes. 5. To return to the **Alerts Setup** page, click **Cancel** The status of the alert is set to **Inactive** in the **Status** column in the alert setup table . ## Related Topics * [Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes) * [Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods) * [Backorders and Preorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder) * [Order Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies) # Order Attributes Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/order-attributes Order attributes let you create a range of custom attributes you can apply to Orders, Invoices, Locations, Networks, and more. For example, you could create a custom attribute that would allow customers to select gift wrapping at checkout. To navigate to the **Attributes** page, click **Settings** in the left menu and then select **Attributes**. You can search for an attribute, use filter conditions to tailor your search, and sort the results in ascending or descending order. ## Attributes Table Field Descriptions The Attributes table displays a list of all previously created **Attributes**. | Field | Description | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | The attribute name assigned when creating the attribute. | | **Section** | The section within **Orders** that the attribute field will be used in. The options are **Location**, **Order**, **Shipment**, **Invoice**, **Allocation**, or **Inventory**. | | **Data type** | The data type associated with the attribute. For example, String, Boolean, Double, or Enum. | | **Mandatory** | Determines if the attribute is mandatory. Mandatory attributes must be provided when making API calls to the **Section** its assigned to. The value can be **Yes** or **No**. | ## Creating Order Attributes 1. In the left menu, click **Orders** > **Settings** > **Attributes**. The Attributes page is displayed. 2. Click **Create Attribute**. The **Create Attribute** page is displayed. 3. In the **Attribute name** field, enter an attribute name. 4. To make the attribute mandatory, select the **Mandatory attribute** field. 5. (Optional) In the **Description** field, enter a description. 6. In the **Data type** field, select a data type. For example, *Integer* or *Boolean*. 7. In the **Document** field, select a document type. This field is used to map the attribute to the fabric API endpoint. For example, if you select *inventory* and the attribute is a mandatory attribute, you must provide this attribute and its value when making an API call to inventory. 8. In the **Object** field, select an object. The object field is used to further classify where an attribute lives. For example, if you select the **Order** document type and **shipInfo** object. The attribute lives under the **order.shipInfo** object as the **order.shipInfo.shopToType** attribute. 9. Click **Save**. The attribute is added to the attribute table on the **Attributes** page. ## Editing an Attribute 1. In the left menu, click **Orders** > **Settings** > **Attributes**. The **Attributes** page is displayed. 2. In the **Name** column of the attribute table, click an attribute. The **Edit Attribute** page is displayed. Note that you can only edit the **Description** and **Object** values. 3. To save edits to the attribute, click **Save**. The edits are saved. ## Deleting Attributes 1. In the left menu, click **Orders** > **Settings** > **Attributes**. The **Attributes** page is displayed. 2. In the attribute table, hover over the attribute you wish to remove and click the delete icon. The **Are you sure you want to delete this attribute?** page is displayed. 3. Click, **Yes, Delete**. The attribute is deleted and removed from the attribute table on the **Attributes** page. ## Related Topics * [Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods) * [Backorders and Preorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder) * [Order Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies) * [Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts) # Overview Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/overview Use the Order Settings menu to manage order attributes, shipping methods, policies, alerts, backorders, and preorders. ## Order attributes Order attributes are used to create a range of custom attributes you can apply to Orders, Invoices, Locations, Networks, and more. For example, you could create a custom attribute that would allow customers to select gift wrapping at checkout. * [Creating Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes#creating-order-attributes) * [Editing Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes#editing-an-attribute) ## Shipping methods Shipping methods determine how products are delivered to your customers. Examples of shipping methods include domestic, international, free shipping, and express delivery. * [Creating Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods#creating-shipping-methods) * [Editing Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods#editing-shipping-methods) ## Backorder & Preorders Backorders are defined as orders for products that aren't currently available for fulfillment. Preorders are defined as orders for products that aren't yet released. * [Enable Backorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder#allow-backorders) * [Enable Preorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder#allow-preorders) ## Policies Policies enable you to define how your business handles returns, cancellations, and exchanges. * [Creating Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies#creating-a-policy) * [Editing Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies#managing-policies) ## Alerts The Order Alerts setup page displays an overview of the currently configured order alerts. Order alerts are used to monitor trailing metrics that can affect revenue and efficiency such as returns, cancellations, reorder rates, payment failures, and more. * [Creating Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts#creating-order-alerts) * [Editing Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts#editing-an-alert) # Order Policies Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/policies Policies allow you to define how your business processes returns, cancellations, and exchanges. Any number of policies are supported, however, you can only have a one default policy each for returns, cancellations, and exchanges. Default policies apply when no other policy condition is met. For example, the default return policy might have a 5\$ return fee. However, for items with the `Overweight` attribute, the return fee should be higher. By creating a policy that looks for the product attribute `Overweight`, returns and exchanges with this attribute can be handled differently. ## Prerequisites * Ensure that you have **Administrator** or **Editor** privileges to fabric Orders. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Policies Table Field Descriptions | Field | Description | | ---------------- | ---------------------------------------------------------------------------------- | | **Name** | The policy name assigned when creating the policy. | | **Policy type** | The type of policy. Policies can be **Cancellation**, **Exchange**, or **Return**. | | **Channels** | The channels the policy is applied to. | | **Currencies** | The currencies used for any fees associated with the policy. | | **Last updated** | A system-generated time indicating when the policy was last modified. | | **Status** | The status indicating whether a policy is set as the default. | ### Standard filters and searching You can use the search field to find a policy by its name. If you don't know the policy name, you can use the following standard filters to refine the policies in the **Policies** table: | Filter | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Channel** | The channel name, depending on the available channels. The default available options are United States or Canada. You can use any other channels created in fabric Experiences or using the APIs. | | **Currency** | The three-digit currency code used to process policy fees. | | **Policy type** | The type of policy. You can filter the policies based on the type of the policy, such as **Cancellation**, **Exchange**, and **Return**. | ## Creating a Policy 1. In the left menu, click **Orders** > **Settings** > **Policies**. The Policies page is displayed. 2. Click **Create Policy**. The **Create Policy** page is displayed. 3. In the **Policy name** field, enter a self-explanatory name. For example, *US Return Policy*. 4. In the **Policy type** field, select one of the following: * Return * Cancellation * Exchange 5. (Optional) Click the **Set as default returns policy** field. Each of the policy types can have one default policy associated with them. This means you can have a default return, cancellation, and exchange policy. 6. (Optional) In the **Description** field, enter a description of the policy. 7. (Optional) Click the **Apply to all channels** field. Selecting this option automatically applies the policy to all your channels. Don't select this option if this policy doesn't apply to different regions/countries. 8. In the **Channels** field, select the channels you want the policy to apply to. This field is disabled if you selected the **Apply to all channels** field. Depending on the **Policy type** that's selected, the **Returns**, **Exchange**, or **Cancellation** section is displayed. 1. For the selected section, enter the following details to specify the duration of each operation: * Days * Hours * Minutes * Seconds The values entered in these fields determine the time frames for returns, cancellations, or exchanges for this policy. 2. To create a refund fee, in the **Refund Fee** field, do the following: * In the **Currency** field, select a currency. * In the **Fee type** field, enter a description for the fee. * In the **Return fee** field, enter a dollar amount. * Click **Add**. The **Refund Fee** is added to the refund fee table. Cancellations don't support **Refund Fees**. 3. To create **Reason Codes**, click **Add reason code**. 4. In the **Add reason code** window, do the following: * In the **Code** field, enter the reason code. * In the **Description** field, enter a description for the reason code. * Click **Save**. The reason code is added to the **Reason Codes** table. 5. To include product attributes in the policy, click **Add product attribute**. Three new fields appear in the **Product Attribute Selection** section. This section is used to apply policies to specific items. 6. In the **Product attribute** field, select a product attribute. This field is populated based on your product catalog attributes. 7. In the **Operator** field, select an operator. 8. In the **Values** field, select a value. 9. Click **Save** at the top-right of the page. The policy is created and added to the policy table on the **Policies** page. If you set the policy as default, the status is set to **Default** and the policy appears sorted at the top of the table. ## Managing Policies 1. In the left menu, click **Orders** > **Settings** > **Policies**. The Policies page is displayed. 2. Using the **Policies** table and [filter options](#standard-filters-and-searching), find the policy you want to edit. 3. Click the policy **Name** or hover over the policy and click **Edit**. The **Edit** page is displayed. **Note**: If the policy is a default policy, you can't edit the **Basic Information** section. 4. Edit the policy following the steps outlined in the [Creating a Policy](#creating-a-policy) section. 5. Click **Save**. The **Last updated** field in the **Policies** table is updated and the policy saved. ## Related Topics * [Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes) * [Shipping Methods](/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods) * [Backorders and Preorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder) * [Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts) # Shipping Methods Source: https://developer.fabric.inc/v3/orders-and-inventory/user-guides/orders/settings/shipping-methods Shipping methods determine how products are delivered to your customers. Examples of shipping methods include domestic, international, free shipping, and express delivery. Shipping method costs are in addition to the cost of products in the cart and any applicable taxes. To navigate to the **Shipping methods** page, click on **Settings** in the left menu and then select **Shipping Methods**. ## Shipping Methods Table The Shipping methods table displays a list of all previously created shipping methods. You can search for a specific shipping method by entering the shipping method name in the search bar and clicking enter. | Field | Description | | ------------------------ | -------------------------------------------------------------------------- | | **Shipping method name** | The carrier name assigned when creating the shipping method. | | **Cost** | The shipment cost and currency assigned when creating the shipping method. | ## Creating Shipping Methods 1. In the left menu, click **Orders** > **Settings** > **Shipping Methods**. The **Shipping Methods** page is displayed. 2. Click **Create Shipping method**. The **Create Shipping method** page is displayed. 3. In the **Carrier name** field, enter a name. 4. (Optional) In the **Description** field, enter a description. 5. In the **Shipping method code** field, enter a shipping method code. For example, Same Day Delivery (SDD) or Ship To Home (STH). 6. In the **Shipment cost** field, enter the shipping cost. 7. In the **Shipment tax code** field, enter the tax code associated with the shipping method. Note that this fields value depends on the applicable tax laws and regulations in each jurisdiction you ship from and should be provided by your tax processing service. 8. (Optional) In the **Region** field, enter a State or region of delivery. 9. In the **Address Type** field, select an address type. Certain carriers or methods are sometimes required depending on the address type entered at checkout. For example, when fulfilling orders to an address type with Army Post Office (APO) or Military Post Office (MPO) a unique method or specific carrier might be required. 10. In the **Channel** field, select a channel. For example, if the method was for international order fulfillment, you would select the international channel. fabric has two default channels, Canada and USA. 11. In the **Currency** field, select a three-letter currency code. 12. In the **Carrier SLA** section, do the following: * In the **Minimum days to deliver** field, enter the minimum duration required to deliver an order starting from the time the order is placed. * In the **Maximum days to deliver** field, enter the maximum duration required to deliver an order starting from the time the order is placed. * In the **Cut-off time** field, enter the time at which the current order day is over. This is used as the daily deadline for a warehouse to process the last order. **Note**: If an order is delivered after the cutoff time, it's considered as delivered the next working day. For example, if the cutoff time is set to 5:00 PM, any orders delivered after this time will be considered to have been delivered the following business day. 13. In the **Freight Options & Restrictions** section, enter the following minimum and maximum dimensions for the shipping method: * Enter a minimum & maximum weight. * Enter a minimum & maximum length. * Enter a minimum & maximum width. * Enter a minimum & maximum height. 14. In the **Product Selection** section, choose whether the shipping and carrier rules apply to specific products or to a purchase’s entire cart value. * **To specific products**: Use the **Add Products** button to select eligible products. * **Cart Value**: Enter a minimum and maximum cart value. 15. Click **Save**. The shipping method is created and added to the **Shipping method** table. ## Editing Shipping Methods 1. In the left menu, click **Orders** > **Settings** > **Shipping Methods**. The **Shipping Method** page is displayed. 2. In the **Shipping method name** column of the shipping methods table, click a method. The **Edit Shipping method** page is displayed. 3. Make your edits. For more information on the shipping method fields, follow the instructions in the [Creating Shipping methods](/v3/guides/orders/settings/creating-shipping-methods) document. 4. Click **Save**. The edits are saved. ## Delete a Shipping Method 1. In the left menu, click **Orders** > **Settings** > **Shipping Methods**. The **Shipping Method** page is displayed. 2. Mouse over the shipping method you want to delete. Two icons appear, edit and delete. 3. Click the delete icon. A confirmation window is displayed. 4. Click **Yes, Delete**. The shipping method is deleted and is no longer visible in the shipping method table. ## Related Topics * [Order Attributes](/v3/orders-and-inventory/user-guides/orders/settings/order-attributes) * [Backorders and Preorders](/v3/orders-and-inventory/user-guides/orders/settings/backorder-preorder) * [Order Policies](/v3/orders-and-inventory/user-guides/orders/settings/policies) * [Order Alerts](/v3/orders-and-inventory/user-guides/orders/settings/order-alerts) # Create counter Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/counters/create-counter inventory.openapi post /inventory-counters Create counter (also known as inventory position) for better tracking of inventories. # Get all counters Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/counters/get-all-counters inventory.openapi get /inventory-counters Get all configured counters. # Get counter by code Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/counters/get-counter-by-code inventory.openapi get /inventory-counters/{counterCode} Get details of a specific counter by specified counter code. # Getting Started with Counters Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/counters/overview Inventory Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Counters** API refers to inventory positions such as, available, in-transit, on-hand, or other custom positions. These endpoints let you read, update, and create custom counters that suit your business use case. # Update counter by code Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/counters/update-counter-by-code inventory.openapi put /inventory-counters/{counterCode} Update a specific counter based on specified counter code. # Create an inventory import file configuration Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/create-import-configs inventory.openapi post /inventory-import-configs Create inventory import file configuration containing rules for queried file prefix # Delete inventory import file config Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/delete-an-import-config-by-id inventory.openapi delete /inventory-import-configs/{id} Delete inventory import file config containing rules for queried file prefix # Force import halt Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/force-trigger inventory.openapi post /inventory-imports/{importId}/actions/force-trigger Force import halted due to zeroed out Inventories more than threshold # Get uploaded file status and details Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/get-file-status-by-id inventory.openapi get /inventory-imports/{importId} Get uploaded file status and details by specifying `importId`. # Get inventory import upload file configuration Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/get-import-config-by-id inventory.openapi get /inventory-import-configs/{id} Get inventory import file configurations containing rules for queried file prefix # Get all file configurations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/get-import-configuration inventory.openapi get /inventory-import-configs Get all file configurations for matching filter criteria # Get uploaded files that match specified criteria Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/get-uploaded-files inventory.openapi post /inventory-imports/search Get uploaded files that match specified criteria. Returned as paginated records. # Import inventory data Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/import-inventory inventory.openapi post /inventory-imports Import inventory data by specifying file name. Successfully uploading the file triggers the import process, which is an event-driven extraction of the file's data to update the respective resource's system. # Update inventory import file configuration Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/imports/update-import-config-by-id inventory.openapi put /inventory-import-configs/{id} Update inventory import file configuration # Inventory (3.0.0) Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory--3-0-0 Inventory Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/inventory.json) # Inventory FAQ Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory-faq-s #### How can I upload inventory if I have more than one POS, WMS, or other sources of truth for inventory? 1. Prepare a `.csv` file with the inventory details. 2. Create a URL by using the bulk operation endpoint `POST/api/v2/inventory/aws/upload-url`. 3. Upload the `.csv` file to the URL. #### What are counters and how can I update them? Counters are inventory positions, such as on-hand, allocated, shipped, and other customized positions. The types of counters are: 1. **Base Counter:** Base counters refer to `onHand`, `Allocated`, `Shipped`, and any other custom counters that are created using the counter endpoint. Allocated counters are automatically calculated during the order workflow. Merchants can update all base counters, except `Allocated`, by using the following endpoints: * Adjustment endpoint (`POST/v3/inventories/actions/find-and-adjust-inventory-counters`): Adjusts the counter quantity. Using this endpoint, you can only adjust the counter quantity, not other inventory details. You can increase or decrease the counter quantity by specifying the required quantity in the payload. For example, if the original counter quantity is 100 and you want to increase the quantity to 110, set the counter quantity as '+10' in the payload. The counter quantity is now updated to 110. * Update inventory endpoint(`POST/v3/inventories/action/find-and-update`): Updates counter quantity and other inventory details. 2. **Virtual Counter:**. Virtual counters refer to the counters available to purchase, `availableToPurchase`, which are calculated or updated during the order workflow. When an order is placed, the Order Management System (OMS) automatically allocates the order for shipping. After the order is allocated and shipped, the counters available to purchase is calculated based on the formula `onHand - allocated - shipped`. #### How's data security or privacy managed for fabric’s Inventory module? fabric’s REST APIs are protected with OpenID Connect (OIDC) and the identity introspector mechanism. In OIDC, identity information is communicated using JSON Web Tokens (JWTs). The data in fabric is stored in both MongoDB and S3. The MongoDB data is isolated per tenant in fabric Orders (also called OMS). You must create an [AWS configuration rule](https://aws.amazon.com/blogs/security/how-to-use-aws-config-to-monitor-for-and-respond-to-amazon-s3-buckets-allowing-public-access/) to ensure that the AWS S3 Bucket doesn't have public access. For example, one shouldn't be able to run the following command: `curl ` Whenever data is requested, fabric will generate a S3 presigned URL to ensure secure access. #### What's the primary use case for fabric’s Inventory module? The primary use case for fabric Inventory is to prevent *overselling* during transactions by providing real-time inventory data via REST API and event-driven integrations, for the storefront and other downstream applications to accurately display available products for sale. #### What's the primary interface for user operations? fabric Copilot is the Graphical User Interface where users may log in to manage their data via interactive web pages. Copilot provides an easy way for users to manage recurring operational workflows such as updating data where the solution architecture requires manual intervention. Copilot is also an easy way for implementation specialists to manage test data creation, updates, and configurations. #### What's the primary interface for setting up integrations with Storefront and other applications? fabric’s Inventory service provides over 30 OpenAPI 3.0 compliant REST API endpoints, documented under the API Reference at [https://developer.fabric.inc/v3/reference/about-inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/overview), for users to manage data. These APIs are the same ones used in Copilot and can be integrated into the retailer's enterprise systems such as the storefront, inventory management systems, search, marketing platforms, and more. Not all APIs are available in Copilot, and some are required to use fabric Inventory for getting inventory in real-time from the storefront for use cases such as Ship-to-home, Omnichannel, and 'Buy Online Pickup In-Store' order placement. #### How can I begin using fabric's Inventory module? fabric’s Inventory module is typically packaged with fabric Orders (also called OMS). It provides enterprise-level inventory visibility with network aggregation and enables updating of order fulfillment logic without coding. To get started using fabric’s Inventory module, follow these steps: 1. Sign up or log in to your fabric account. 2. Get an access token from fabric Copilot or using the [fetch access token](/v3/getting-started/authentication-v3/authentication-endpoints/fetch-access-token) endpoint. 3. Familiarize yourself with the core concepts such as [Location](/v3/orders-and-inventory/api-reference/inventory/locations/overview), [Inventory](/v3/orders-and-inventory/api-reference/inventory/inventory/overview), [Network](/v3/orders-and-inventory/user-guides/inventory/networks), Counter, Virtual Counter, and other available features and options as described in the guide. 4. [Import](/v3/orders-and-inventory/api-reference/inventory/inventory/overview#importing-inventory) or add your initial inventory data. 5. Set up any additional configurations or preferences specific to your needs. #### What are the differences between counters and virtual counters in fabric? **Counters**, also called base counters, refer to inventory positions such as `onHand`, `Allocated`, `Shipped`, and any other counters that are configured using the counter endpoint. These values can be updated through the **Inventory detail** page in fabric Copilot or using the adjustment endpoint- POST/v3/inventories/actions/find-and-adjust-inventory-counters. This lets you increase or decrease the counter quantity, but it doesn't allow you to change other inventory details. Alternatively, you can use the update inventory endpoint- POST/v3/inventories/action/find-and-update, which allows you to update both the counter quantity and other inventory details. **Virtual counters** refer to the aggregation of real-time inventory availability. The inventory virtual counters are viewable on the inventory landing page in fabric Copilot. Their calculation from counters is configured in the virtual counter calculation. Basically, these are computed from counters at runtime. For example, `availableToPurchase = onHand - allocated - shipped`. #### What's the significance of inventory-imports in fabric’s Inventory module? For most retailers with a warehouse, point of sale, or other inventory source of truth system, the first step to begin using fabric Inventory (after generating your access token) is importing your inventory. As a user of fabric Inventory, you should integrate your one or many inventory systems of record, such as WMS, ERP, or POS, with fabric Inventory. This allows fabric Inventory to manage a SSOT ('Single Source of Truth') for reference of inventory in your commerce applications including storefronts, search functionalities, and other areas within your ecommerce solution architecture. #### How can retailers integrate existing inventory systems with fabric Inventory? **Single Inventory Management System** If retailers have a single system of record for inventory, the inventory-import process doesn't require any configuration for multiple file groups. If retailers don't have a need to manage inventory aggregation, order fulfillment, or location data in fabric OMS (also called Orders), they can start importing inventory against the default location using the Import API. To import your inventory data to fabric, you must upload a CSV file with all inventory details. You can download sample CSVs from Copilot within the inventory import modal, for your reference. **Multiple Inventory Management Systems** If retailers have multiple systems of record for inventory, they can use the "file groups" feature to configure their inventory feeds in fabric. This feature ensures that inventory updates are limited to the specific group of locations corresponding to the inventory system performing the upload **Inventory updates in real-time with event-driven data streaming** If retailers want a more real time approach than relying solely on CSV-driven bulk imports, we recommend to directly update inventory levels on a single-inventory basis using the update [inventory API](/v3/orders-and-inventory/api-reference/inventory/inventory/adjust-inventory-counters). To create or update inventory, you must provide the necessary fields including SKU, item ID, location, channel ID, and counters. If you are exclusively using the fabric Inventory module without the fabric Orders (OMS) module, you must manually update the reserved, allocated, and shipped counter quantities as orders are fulfilled. #### Why should I use fabric Inventory as a Single Source of Truth for my Inventory? For retailers with distributed inventory, fabric Inventory is an optimal solution for effectively managing the aggregation of real-time inventory into a Single Source of Truth (SSOT). For each location you want to manage inventory for, a location with a unique location number must exist. In addition, you can configure networks of locations sharing inventory using Network APIs. For testing purposes, fabric Inventory is pre-configured with a default location where all inventory is initially assigned. To manage inventory for each specific location, it's necessary to have a unique location number to every SKU during bulk upload. You can configure networks of locations that share inventory, by using the Networks interface. #### How do I manage Inventory aggregation in fabric? Inventory aggregation rules can vary from simple to very complex. This is possible through the Network service of fabric’s Inventory module, which facilitates a real-time inventory aggregation functionality. **Simple Aggregation** If you manage inventory aggregation in an external system and don't plan to manage it within fabric, or if you don't have complex distributed fulfillment and inventory requirements, then the Simple Aggregation approach within fabric Inventory's Network feature may be suitable for your usage. Your default network configuration is simple and requires no additional configuration to automatically aggregate all inventory in your “Sandbox” environment instance of fabric. This is possible because the rules in your default “starter” Network contains a rule for your default Location which dictates that, as long as the location `isActive` flag is set to “TRUE,” all inventory uploaded for your default location will be included in the aggregated inventory availability. **Complex Aggregation** Your network configuration can also be very complex. fabric’s Inventory Networks support the ability to create groups of inventory by defining “Inventory Networks” with inclusion and exclusion rules for inventory aggregation. Inventory Networks can aggregate inventory across groups of fulfillment centers for different selling requirements such as channels, brands, or fulfillment method eligibility. For example, you may want to create “Network C,” for domestic selling which includes all stores and warehouses, and “Warehouse Network,” for International selling which only includes warehouses. This can be achieved with the following two steps: * First, create the rules ([https://developer.fabric.inc/v3/reference/createnetwork](/v3/orders-and-inventory/api-reference/inventory/networks/create-inventory-network))for how inventory is aggregated in stores and warehouses. You may want to set up a rule set for “Network A” called “Store Network” and another rule set for “Network B” called “Warehouse Network,” each of which can have different inclusion and exclusion parameters based on the attributes of your location and product data. * In the second step, you may want to set up “Network C,” naming it “Domestic Selling,” and making it a “Multiple Network” type which is created by selecting the store inventory and warehouse inventory through the Multiple Network setup process. Now, you have a way to combine inventory pools for Domestic, while simply relying on the “Warehouse Network” for International selling. For both networks, you can call the Inventory API to look up inventory in real-time on the storefront, such as the Product Display Page (PDP) and other use cases, by passing the network code in the request object. Before utilizing Complex Aggregation to use product data in fabric’s Network rule-setting interface, you must decide whether to use fabric's Product Catalog or a third-party product information management system. If you are using a third-party system, you must provide product details to fabric’s Catalog Connector. To use product data in the Network rule-setting interface, decide whether you are using fabric’s Product Catalog or a third-party product information management system. If using a third-party system, you need to provide product details to the Catalog Connector. Also, define your location details using the Locations service through either [Copilot](/v3/orders-and-inventory/api-reference/orders/backorders-preorders/overview) or the [APIs](/v3/orders-and-inventory/api-reference/inventory/locations/overview). You may also configure custom attributes on the location model if you want to extend the JSON data model to support more fields. **Note:** Custom attributes only support key-value data in a single “attributes” object of the service collection response format. Once a custom attribute is configured, it will apply for all data in the service collection. #### What are the advanced configurations and features of fabric’s Inventory service? **1. Backorder and Preorder** Managing backorder and preorder inventory follows the same workflows as regular inventory, allowing seamless management through both [Copilot](/docs/orders-pre-order-and-backorder) and [API interfaces](/v3/orders-and-inventory/api-reference/orders/backorders-preorders/overview). In the fabric Inventory module, the primary feature of Backorder and Preorder is the ability to reduce the available quantity of backorder or preorder products so that the inventory remains balanced even when orders are placed, and the inventory is marked as `OnHand` for availability. **2. Safety Stock and Low Stock Setting** In addition to the import-inventory and network features, you may configure values for `safetyStock` and `lowStock` fields while creating or updating either networks or inventory. **3. Infinite Inventory Flag** If you want to represent an inventory in unlimited quantities, you may set `infiniteInventory` to 'true' and reference that attribute on the storefront and other downstream systems consuming inventory from fabric. #### Can I use fabric Inventory without using the fabric Orders module. If so, how? Yes, fabric provides the flexibility of using only Inventory service independently without implementing the whole of fabric’s order management system into your business. If you're not using the fabric Orders module, you must manually update the 'allocated' and 'shipped' counters using the [adjust inventory endpoint](/v3/orders-and-inventory/api-reference/inventory/inventory/adjust-inventory-counters) every time an order is created, allocated, and shipped. Similarly, you will have to update inventory records using the [update inventory endpoint](/v3/orders-and-inventory/api-reference/inventory/inventory/update-inventory-by-adding-new-property). When updating the `onHand` counter, remember that the 'availableToPurchase' quantity is calculated based on the default formula `onHand - allocated - shipped - safetyStock`. Note that the `availableToPurchase` quantity can be customized based on requirement. Contact fabric Support to customize `availableToPurchase`. #### How can I upload inventory data from multiple sources? To upload inventory data from multiple sources, you must create an upload URL by using the bulk operation endpoint. Prepare a .csv file with all the inventory details from your POS, WMS, or other sources, then upload this file to the URL you have created. # Getting Started with Inventory Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/overview Inventory Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Inventory** API lets organizations use *Inventory* as a standalone service, which functions as the repository of product availability for order fulfillment. Typically, Storefront Websites use the Inventory service to retrieve data, while Warehouse Management Systems (WMS) use it to create and update inventory details. fabric's Inventory API includes high-performance endpoints built on highly scalable architecture, and includes a configurable data model to orchestrate the inventory lifecycle events. # Update inventory by adding new property Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/update-inventory-by-adding-new-property inventory.openapi post /inventories/actions/find-and-update Add a new property to existing inventory.

**Note:** This endpoint does not override all the existing properties; rather it updates inventory by adding new properties or by updating the existing inventory properties that are specified in the request body. Inventory is identified based on the combination of location number, channel ID, and item ID or SKU.

# Get allocation by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/allocations/get-allocation-by-id allocations.openapi get /allocations/{allocationId} Get allocation details by allocation ID. The allocation ID can be obtained using the `/allocations/search` endpoint or stored externally, for example, in the WMS order database. # Getting Started with Allocations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/allocations/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Allocations** API lets retailers manage allocation for existing orders. Allocations serve as records of the locations from which an order is fulfilled. The user of the Allocation service is a Warehouse Management Service (WMS) or Point of Sale Service (POS). [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersAllocations.json) # Search for allocations by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/allocations/search-for-allocations-by-query allocations.openapi post /allocations/search Search for inventory allocations based on the matching filter criteria. # Update allocation or initiate reallocation Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/allocations/update-allocation-or-initiate-reallocation allocations.openapi put /allocations/allocation-request-id/{allocationRequestId} Update allocation or initiate reallocation of the order by `allocationRequestId`. # Update allocation attributes Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/allocations/update-attributes allocations.openapi post /allocations/{allocationId}/actions/update-attributes Update allocation attributes by `allocationId`. # Create appeasement by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/appeasements/create-appeasement-by-order-id orders.openapi post /orders/{orderId}/actions/create-appeasement When customer is dissatisfied with their shopping experience, you may want to offer an appeasements amount such as partial refund to keep them happy.

This endpoint is used to create appeasement request by order ID

. **Note**: If you do not have an order ID, but have an order number, use the order number-based endpoint - `POST /orders/order-number/{orderNumber}/actions/create-appeasement`.

# Create appeasement by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/appeasements/create-appeasement-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/create-appeasement When customer is dissatisfied with their shopping experience, you may want to offer an appeasement amount to keep them happy.

This endpoint is used to create appeasement request by order number.

**Note**: If you don't have order number, use the corresponding order ID-based endpoint - `POST /orders/{orderId}/actions/create-appeasement`

# Getting Started with Appeasements Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/appeasements/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Appeasements** API endpoints help create appeasements. # Get backorder or preorder details by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/backorders-preorders/get-backorder-or-preorder-details-by-id backorders-preorders.openapi get /backorders-preorders/{id} Get backorder or preorder reservation details by ID. # Getting Started with Backorders & Preorders Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/backorders-preorders/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Backorders and Preorders** API refer to orders placed for products not currently available for shipment or sale. Backorders are orders for out-of-stock products that will be shipped to customers as soon as they're available for shipment. Preorders are orders for products that aren't yet available in the market, but will be launched for sale. Customers can preorder products, and the products will be shipped when they're available for sale. fabric's Backorders & Preorders API supports multi-tenant service. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersBackorders.json) # Record customer agreement to delay shipment Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/backorders-preorders/record-customer-agreement-to-delay-shipment backorders-preorders.openapi post /backorders-preorders/{id}/actions/save-delay-consent Record customer's agreement to delay the shipment. # Search for backorders or preorders by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/backorders-preorders/search-for-backorders-or-preorders-by-query backorders-preorders.openapi post /backorders-preorders/search Search for the backorder or preorder reservations based on filter criteria. # Cancel order by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/cancellations/cancel-order-by-order-id orders.openapi post /orders/{orderId}/actions/cancel When customer's order cancellation request is determined to be eligible, this endpoint processes the cancellation by order ID.

**Note**: If you do not have the order number, use the corresponding order number-based endpoint - `POST /orders/order-number/{orderNumber}/actions/cancel`.

# Cancel order by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/cancellations/cancel-order-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/cancel When customer's order cancellation request is determined to be eligible, this endpoint processes the cancellation by order number.

**Note**: If you do not have order number, use the corresponding order ID-based endpoint - `POST /orders/{orderId}/actions/cancel`.

# Get order cancellation eligibility by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/cancellations/get-order-cancellation-eligibility-by-order-id orders.openapi post /orders/{orderId}/actions/check-cancel-eligibility Either customer may initiate cancellation due to an incorrect order placement or as a merchant, you may initiate cancellation due to product unavailability, pricing errors, payment failure, or shipping restrictions. Before processing cancellation, it's crucial to determine the eligibility of the cancellation request.

This endpoint gets the eligibility of order cancellation by order ID. You can additionally specify `lineItemIds` to get the eligibility of specific line items.

**Note**: If you do not have order ID, use the corresponding order number-based endpoint -`POST /orders/order-number/{orderNumber}/actions/check-exchange-eligibility`.

# Get order cancellation eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/cancellations/get-order-cancellation-eligibility-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/check-cancel-eligibility Either customer may initiate cancellation due to an incorrect order placement or as a merchant, you may initiate cancellation due to product unavailability, pricing errors, payment failure, or shipping restrictions. Before processing cancellation, it's crucial to determine the eligibility of the cancellation request.

This endpoint gets the eligibility of the cancellation request by order number. You can additionally specify `lineItemIds` to get the eligibility of specific line items.

**Note**: If you do not have order number, use the corresponding order ID-based endpoint - `/orders/{orderId}/actions/check-cancel-eligibility`.

# Getting Started with Cancellations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/cancellations/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Cancellations** API endpoints check eligibility of order cancellation requests and if eligible, processes order cancellation. # Check credits eligibility by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/credits/check-credits-eligibility-by-order-id orders.openapi post /orders/{orderId}/actions/check-credits-eligibility In case of refund scenarios, credits such as gift card may be offered to customers for various reasons such as damaged products, later deliveries, or other qualifying factors as per your policy.

This endpoint checks the credits eligibility by order ID, allowing businesses to manage credits effectively and provide appropriate compensation to eligible customers.

# Create credits by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/credits/create-credits-by-order-id orders.openapi post /orders/{orderId}/actions/create-credits Use this endpoint to create credits by order ID. # Create credits by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/credits/create-credits-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/create-credits The following endpoint is used to create credits using an order number. # Update credit status by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/credits/update-credit-status-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/update-credit-status The update credit status endpoint is used to update the credits status, notes, and additional credit attributes. # Update credits by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/credits/update-credits-by-order-id orders.openapi post /orders/{orderId}/actions/update-credit-status Use this endpoint to update the credit status, as well as to add any associated notes and additional attributes. # Export data by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/exports/export-data-by-query exports.openapi post /oms-exports Initiate data export by the given filter criteria. # Get export job by exportId Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/exports/get-export-job-by-exportid exports.openapi get /oms-exports/{exportId} Get details of a specific export job by specified `exportId`. # Get export jobs by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/exports/get-export-jobs-by-query exports.openapi post /oms-exports/search Get a paginated list of all the export jobs based on the filter criteria specified in the request body. # Get file headers by module Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/exports/get-file-headers-by-module exports.openapi get /oms-exports/module-headers/{module} Get the list of file headers for a given module.

**Note:** File headers are basically the column headers or titles of the exported document.

# Cancel fraud order by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/frauds/cancel-fraud-order-by-order-id orders.openapi post /orders/{orderId}/actions/fraud-cancel If an order is suspected to be fraudulent, it is immediately placed on hold for verification. After verification, if it is confirmed as fraudulent, this endpoint is used to cancel the order.

**Note**: If you do not have order ID, use the corresponding order number-based endpoint - `POST - /orders/order-number/{orderNumber}/actions/fraud-cancel`

# Cancel fraud order by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/frauds/cancel-fraud-order-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/fraud-cancel If an order is suspected to be fraudulent, it is immediately placed on hold for verification. After verification, if it's confirmed as fraudulent, this endpoint is used to cancel the order by order number.

**Note**: If you don't have order number, use the corresponding order ID-based endpoint - `POST /orders/{orderId}/actions/fraud-cancel`.

# Getting Started with Frauds Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/frauds/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Frauds** API endpoints deal with potential fraud orders. # Release fraud order Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/frauds/release-fraud-order orders.openapi post /orders/order-number/{orderNumber}/actions/fraud-release If an order is suspected to be fraudulent, it is immediately placed on hold for verification. After verification, if it is confirmed as non-fraudulent, this endpoint is used to release the order from hold, by order number so that it can be processed.

**Note**: When you don't have order number, use the corresponding order ID-based endpoint - `POST /orders/{orderId}/actions/fraud-release`.

# Release fraud order by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/frauds/release-fraud-order-by-order-id orders.openapi post /orders/{orderId}/actions/fraud-release If an order is suspected to be fraudulent, it is immediately placed on hold for verification. After verification, if it is confirmed as non-fraudulent, this endpoint is used to release the order from hold, by order ID, so that it can be processed.

**Note**: When you don't have order ID, use the corresponding order number-based endpoint - `POST /orders/order-number/{orderNumber}/actions/fraud-release`.

# null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/cancel-inventory-transfer shipments.openapi post /shipments/inventory-transfer/{transferShipmentId}/action/cancel # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/create-inventory-transfer shipments.openapi post /shipments/inventory-transfer # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/get-inventory-transfer-by-transfershipmentid shipments.openapi get /shipments/inventory-transfer/{transferShipmentId} # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/inventory-transfer-query shipments.openapi post /shipments/inventory-transfer/query # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/inventory-transfer-search shipments.openapi post /shipments/inventory-transfer/search # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/package-tracking-acknowledge shipments.openapi post /shipments/inventory-transfer/{transferShipmentId}/actions/package-tracking-acknowledge # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/packing-and-unpacking shipments.openapi post /shipments/inventory-transfer/pack-unpack # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/receive-inventory-tracking shipments.openapi post /shipments/inventory-transfer/{transferShipmentId}/action/receiving # null Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/inventory-transfer/update-tracking-for-an-inventory-transfer shipments.openapi post /shipments/inventory-transfer/actions/update-tracking # Acknowledge financial transaction Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/invoices/acknowledge-financial-transaction invoices.openapi post /invoices/{invoiceId}/acknowledge When an order is created or processed, fabric generates invoice and sends it to merchants or third-party systems for further financial processing of the order. This endpoint lets merchants acknowledge that they have received the invoice with payment information. # Get invoice by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/invoices/get-invoice-by-id invoices.openapi get /invoices/{invoiceId} Get details of an invoice by invoice ID. # Getting Started with Invoices Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/invoices/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Invoices** API helps in generating invoices that can be used by any third party system for order fulfillment operation. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersInvoices.json) # Search for invoices Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/invoices/search-for-invoices invoices.openapi post /invoices/search Search for invoices by matching filter criteria. # Get acknowledgment receipt for notification Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/notifications/get-acknowledgment-receipt-for-notification notifications.openapi post /oms-notifications/acknowledge This endpoint gets notification acknowledgment from external service. # Getting Started with Notifications Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/notifications/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Notifications** API enables you (Storefronts) to resend notifications to customers for specific order-related events, such as confirmation, status updates, cancellations, and more. it's also used to get notification acknowledgements from external services. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersNotifications.json) # Resend notifications Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/notifications/resend-notifications notifications.openapi post /oms-notifications/actions/resend When an order is placed, the first notification is automatically sent to shopper. If the first notification isn't delivered for reasons such as incorrect email or server issues, this endpoint resends notification for specific events. # Check appeasement eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/check-appeasement-eligibility orders.openapi post /orders/order-number/{orderNumber}/actions/check-appeasement-eligibility This endpoint checks for the appeasement eligibility of an order by order number. # Check appeasement eligibility by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/check-appeasement-eligibility-by-id orders.openapi post /orders/{orderId}/actions/check-appeasement-eligibility This endpoint checks for the appeasement eligibility of an order by orderId. # Check credits eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/check-credit-eligibility orders.openapi post /orders/order-number/{orderNumber}/actions/check-credits-eligibility When processing refunds, credits such as a gift card may be offered to customers for various reasons such as damaged products, later deliveries, or other qualifying factors as per your policy.

This endpoint checks the credits eligibility by order number, allowing you to manage credits effectively and provide appropriate compensation to eligible customers.

# Get order exchange eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/check-exchange-eligibility orders.openapi post /orders/order-number/{orderNumber}/actions/check-exchange-eligibility Customers may want exchange an item because of size, fit, color, or style preferences. Before processing exchange, it's crucial to verify whether the item is eligible for exchange as per your policy.

This endpoint gets the exchange eligibility by order number. You can additionally specify `lineItemId` to get eligibility for a specific item.

**Note**: If you do not have the order number, but have the order ID, use the order ID-based endpoint - `POST /orders/{orderId}/actions/check-exchange-eligibility`.

# Create new order Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/create-new-order orders.openapi post /orders This endpoint creates a new order in the fabric Orders (OMS) system, regardless of whether it originates from fabric CnC service or an external system. The response includes an order ID, which is required for subsequent calls such as updating pickup information, getting order details, verifying eligibility for order cancellations, returns, exchanges, as well as creating appeasements, and processing order returns, cancellations, and exchanges. # Find orders Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/find-orders orders.openapi post /orders/search Customers may want to review their past orders or, as merchants, you may have to answer queries related to past orders, and analyze sales.

To support the previously mentioned use cases, this endpoint searches for orders based on filter conditions specified in the request body. By using `offset` and `limit` you can refine the search results. When they are not specified, you will get up to 10 results.

# Get order by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/get-order-by-order-id orders.openapi get /orders/{orderId} As a merchant, you may need to review or monitor an order to answer customer inquiries, resolve a complaint, or for analytics and reporting. With this endpoint, you can get order details by order ID.

**Note**: If you do not have the order ID, use the corresponding order number-based endpoint - `GET /orders/order-number/{orderNumber}`.

# Get order by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/get-order-by-order-number orders.openapi get /orders/order-number/{orderNumber} As a merchant, you may need to review or monitor an order to answer customer inquiries, resolve a complaint or for analytics and reporting. With this endpoint, you can get order details by order number.

**Note**: If you do not have the order number, use the corresponding order ID-based endpoint - `GET /orders/{orderId}`.

# Getting Started with Orders Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Orders** API is a scalable multi-tenant service designed to streamline your order management process. Orders API is a REST and JSON driven interface enabling retailers to create orders directly from online Storefronts and Point-of-Sale systems, and serve as records of purchase transactions to permit retailers to operate against a standard schema with varied purchase channels. fabric Orders API creates orders real time in the orders database, unifying the order data for users to streamline order lifecycle orchestration and customer service operations. It offers a range of features including the ability to create orders, get orders, update pickup details, and track orders, as well as search for existing orders. Also, the Orders API makes it easy to check eligibility of return, cancel, and exchange requests as well process them, if eligible. In addition, you can flag fraudulent orders based on due diligence, and either release them from hold or cancel them altogether. The appeasement feature helps you resolve any issues that may arise with an order and keep your customers happy. # Update Shipping information for an existing order by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/update-attributes orders.openapi post /orders/order-number/{orderNumber}/actions/update-attributes The following endpoint is used to update attributes by order number. # Update Order Attributes Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/update-attributes-by-id orders.openapi post /orders/{orderId}/actions/update-attributes The update attributes endpoint is used to update order attributes using the order ID. Attributes can be updated in the integration layer to modify external system related information. # Update customer details for given order IDs Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/update-customer-details-for-given-order-ids orders.openapi post /orders/actions/update-customer In many scenarios, customer details may change over time. For example, a customer might change their email, phone, or company affiliation.

By providing the order IDs and the updated customer details, this endpoint facilitates updating customer info for the given order IDs. This ensures order-related communication reaches the customer and they get timely customer service.

# Updates order pick-up details Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/orders/updates-order-pick-up-details orders.openapi put /orders/{orderId}/ship-info/{shipToId}/pickup Customers can choose to either have their order delivered to them or opt to pick up from a store or warehouse. In a Buy Online Pickup in Store (BOPIS) scenario, there may be situations when the primary pickup person has changed.

This endpoint allows for the updating pickup person details in BOPIS, ensuring that the most up-to-date information is available.

# Authorize order payments Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/payments/authorize-payments orders.openapi post /orders/actions/authorize-payments This endpoint is used synchronously or asynchronously for authorizing order payments pending for authorization. # Getting Started with Order Payments Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/payments/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Order Payments** API endpoints update payment status. # Update order payment status by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/payments/update-order-payment-status-by-order-id orders.openapi post /orders/{orderId}/actions/update-payment-status This endpoint is used sync order payments when transactions happen externally. Additionally, used for updating order payment status and the amount, whether it is captured, refunded or void amount.

If you don't have order ID, use the corresponding order number-based endpoint - POST /orders/order-number/{orderNumber}/actions/update-payment-status.

# Update status of order payment by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/payments/update-status-of-order-payment-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/update-payment-status This endpoint is used sync order payments when transactions happen externally. Additionally, used for updating order payment status and the amount, whether it is captured, refunded or void amount.

If you don't have order number, use the corresponding order ID-based endpoint - POST /orders/{orderId}/actions/update-payment-status.

# Get eligibility of returns for items in an order by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/get-eligibility-of-returns-for-items-in-an-order-by-order-id orders.openapi post /orders/{orderId}/actions/check-return-eligibility Customers may want to return one or more items because they do not meet the expectations or customer has changed their mind. Before processing return, it's crucial to verify whether the items are eligible for return as per your policy

This endpoint gets the eligibility of your return by order number. You can additionally specify `lineItemId` to get the eligibility of a single line item.

**Note**: If you do not have the order ID, use the corresponding order number-based endpoint - `POST /orders/order-number/{orderNumber}/actions/check-return-eligibility`.

# Get order exchange eligibility by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/get-order-exchange-eligibility-by-order-id orders.openapi post /orders/{orderId}/actions/check-exchange-eligibility Customers may want exchange an item because of size, color, or style preferences. Before processing exchange, it's crucial to verify whether the item is eligible for exchange as per your policy.

This endpoint gets the eligibility of exchange request by order number. You can additionally specify `lineItemId` to get eligibility of a specific item.

**Note**: If you do not have the order ID, but have the order number, use the order number-based endpoint - `POST /orders/order-number/{orderNumber}/actions/check-exchange-eligibility`.

# Get order exchange eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/get-order-exchange-eligibility-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/check-exchange-eligibility Customers may want exchange an item because of size, fit, color, or style preferences. Before processing exchange, it's crucial to verify whether the item is eligible for exchange as per your policy.

This endpoint gets the exchange eligibility by order number. You can additionally specify `lineItemId` to get eligibility for a specific item.

**Note**: If you do not have the order number, but have the order ID, use the order ID-based endpoint - `POST /orders/{orderId}/actions/check-exchange-eligibility`.

# Get return eligibility by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/get-return-eligibility-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/check-return-eligibility Customers may want to return one or more items because they do not meet the expectations or customer has changed their mind. Before processing return, it's crucial to verify whether the items are eligible for return as per your policy

This endpoint gets the eligibility of return by order number. You can additionally specify `lineItemId` to get the eligibility of a single line item.

**Note**: If you do not have the order number, use the corresponding order ID-based endpoint - `POST /orders/{orderId}/actions/check-return-eligibility`.

# Order return by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/order-return-by-order-id orders.openapi post /orders/{orderId}/actions/submit-return-request When customer's return request is found to be eligible, this endpoint submits the return request by order ID.

**Note**: If you do not have order ID, use the corresponding order number-based endpoint- `POST /orders/order-number/{orderNumber}/actions/submit-return-request`.

# Order return by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/order-return-by-order-number orders.openapi post /orders/order-number/{orderNumber}/actions/submit-return-request When the customer's return request is determined to be eligible, this endpoint is used to process the return request.

**Note**: If you do not have the order number, but have order ID, use Return order by order ID endpoint - `POST /orders/{orderId}/actions/submit-return-request`.

# Getting Started with Returns Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/returns/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Returns** API endpoints check eligibility of order return or exchanges requests and, if eligible, processes order return or exchanges. # Acknowledge shipment Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/acknowledge-shipment shipments.openapi post /shipments/{shipmentId}/acknowledge For users of fabric Webhook Service, Shipment related events can trigger HTTP callbacks to notify web clients through a merchant-defined URL/URI, typically an API Gateway for a middleware. While the response to fabric Webhook service HTTP call-back may occur, a secondary call-back can use this Acknowledge Shipment endpoint to indicate that a secondary external system has acknowledged this shipment event. Middleware receives the event, transforms it in a suitable format, and sends a success response back to fabric, confirming it received the event. It also sends the transformed event to an external merchant system (typically in XML or JSON).

With this endpoint, middleware immediately sends an asynchronous acknowledgement to fabric, based on shipping ID, to indicate whether the call was successful. This acknowledgement is used for learning, auditing, and taking any necessary action.

# Create new shipment Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/create-new-shipment shipments.openapi post /shipments To use this endpoint an “allocation” must exist for the order that's being shipped. When an order is placed, fabric sends allocation details to external merchant system to create order fulfillment requirement details in an external system. With reference to the allocation that's being shipped, users of this POST API can create shipment details for allocations.

**Note**: Shipment ID generated as part of the response is required for subsequent calls such as Acknowledge shipment (`POST /shipments/{shipmentId}/acknowledge`) and Get shipment (`GET /shipments/{shipmentId}`).

# Create re-shipment Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/create-re-shipment shipments.openapi post /shipments/actions/re-ship Orders may go missing before they're delivered to customers for reasons such as incorrect address, theft, labelling issues, or other reasons. This endpoint triggers reshipment in such cases for the existing location.

**Note**: Shipment ID generated as part of the response is required for subsequent calls such as Acknowledge shipment (POST /shipments/{shipmentId}/acknowledge) and Get shipment (GET /shipments/{shipmentId}).

# Find shipments Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/find-shipments shipments.openapi post /shipments/search As merchants, you may want to view shipments of specific statuses, monitor progress of deliveries, and proactively manage situations to ensure timely deliveries.

This endpoint enables you to easily search for shipments based on the specified criteria in the request body. You can refine your search by specifying `limit` and `offset`. When they're not specified, by default you will get up to 10 records. In addition, you can `sort` results.

# Get shipment by ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/get-shipment-by-id shipments.openapi get /shipments/{shipmentId} As merchants, you may want to resolve customer queries related to shipment or track a specific shipment to manage customer expectations with timely communication.

This endpoint gets details of a single shipment by ID. You will get `shipmentId` by using the search endpoint, or by referencing a `shipmentId` on a file such as the Invoice.

# Getting Started with Shipments Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Shipments** API is a multi-tenant service that enables you to manage shipments for existing 'Allocations.' Shipments serve as records of the locations from which an order was fulfilled. Typical user of fabric Shipment service is a Warehouse management service or Point of Sale service. **Note**: Shipment API relies on the Allocation service to send allocation details to external merchant systems after an order is placed. Allocation is the prerequisite for using Shipment API. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/ordersShipments.json) # Update gift card activation status Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/update-gift-card-activation-status shipments.openapi post /shipments/{shipmentId}/actions/update-gift-cards-status This endpoint is used to activate gift cards before they're delivered to the customer. Typically used by “adapters” or external web services integrated with gift card applications, so that gift cards can be activated as part of the fabric fulfillment workflow. # Update shipment tracking Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/shipments/update-shipment-tracking shipments.openapi post /shipments/actions/update-tracking The update tracking endpoint creates a new tracking log that can be used to update the order status. The most common application of this endpoint is to connect to external web services or 'adapters' that have been integrated with carrier tracking applications. With this endpoint, fabric Shipment service gets information from carrier tracking applications, and in turn, updates customers about their shipment status. # Get acknowledgement for package tracking by order number Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/tracking/get-acknowledgement-for-package-tracking-by-order-number orders.openapi put /orders/order-number/{orderNumber}/actions/package-tracking-acknowledge This endpoint gets acknowledgement of package tracking by order number.

**Note**: If you do not have order number, use the corresponding order ID-based endpoint - `PUT /orders/{orderId}/actions/package-tracking-acknowledge`.

# Get package tracking acknowledgement by order ID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/tracking/get-package-tracking-acknowledgement-by-order-id orders.openapi put /orders/{orderId}/actions/package-tracking-acknowledge This endpoint gets acknowledgement of package tracking by order ID.

**Note**: If you do not have order ID, use the corresponding order number-based endpoint - `PUT /orders/order-number/{orderNumber}/actions/package-tracking-acknowledge`.

# Getting Started with Tracking Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/orders/tracking/overview Orders Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Tracking** API endpoints track orders. # Adjust inventory counters Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/adjust-inventory-counters inventory.openapi post /inventories/actions/find-and-adjust-inventory-counters With this endpoint, you can modify inventory counters (also known as inventory positions) to maintain accurate inventory records. These counters are adjusted when new inventory is received or when an item is shipped. If the inventory does not exist, an error message will be displayed. An inventory can have multiple counters, and all counters will be updated when this endpoint is used. # Create inventory Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/create-inventory inventory.openapi post /inventories Create inventory based on the combination of location number, channel ID, and item ID or SKU. # Find inventories of specific items Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/find-inventories-of-specific-items inventory.openapi post /inventories/actions/find Search for inventories of specific items by SKUs, itemIds, location numbers, and other parameters as specified in the request body. This endpoint retrieves the exact available quantity of the searched inventory. # Find inventory of specific items in a specific region Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/find-inventory-of-specific-items-in-a-specific-region inventory.openapi post /inventories/actions/find-by-geography Search for list of inventories of specific items in a specific region based on SKUs, postal code, latitude, longitude, and other details of the location as specified in the request body. # Search for inventories Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/inventory/search-for-inventories inventory.openapi post /inventories/search Search for inventories based on filter criteria. # Cancel an outage using outageNumber Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/cancel-outage-by-outage-number locations.openapi post /location-outages/outage-number/{outageNumber}/actions/cancel Using the location outages cancel endpoint you can cancel a location outage by providing the `outageNumber`. # Cancel an outage using outageID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/cancel-outage-by-outageid locations.openapi post /location-outages/{outageId}/actions/cancel The location outages cancel endpoint is used to cancel an outage by providing the `outageId`. # Create a location Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/create-a-location locations.openapi post /locations Create a location to use for managing inventory and orders. # Create Outage Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/create-location-outage locations.openapi post /location-outages The location outages endpoint is used to create a location outage. # Delete a location Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/delete-a-location locations.openapi delete /locations/{locationNumber} Delete a location by location number. # Get LocationOutages by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/find-location-outage locations.openapi post /location-outages/search Get a filtered list of LocationOutages. # Get a specific location Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/get-a-specific-location locations.openapi get /locations/{locationNumber} Get a specific location by location number. # Get locations by query Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/get-locations-by-query locations.openapi post /locations/search Get a list of locations by specified filter criteria. # Getting Started with Locations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/overview Inventory Support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | URL: [https://www.fabric.inc](https://www.fabric.inc) | License: [fabric API License](https://fabric.inc/api-license) fabric **Locations** API provides location endpoints that support multi-tenant services. This location data is used for both inventory management and order management. When an order is created, it's allocated to the nearest location according to the Order Fulfillment Logic. [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/inventoryLocations.json) # Search for nearby locations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/search-for-nearby-locations locations.openapi post /locations/geography-search Search for nearby locations based on city name, state, postal code, and other geographical details as mentioned in the request body. # Update a specific location Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/update-a-specific-location locations.openapi put /locations/{locationNumber} Update details of a specific location by location number. # Update an outage by outageNumber Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/update-outage-by-outage-number locations.openapi put /location-outages/outage-number/{outageNumber} You can use the location outages outage number endpoint to update the details of a specific location outage by providing its outageNumber. # Update an outage using outageID Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/locations/update-outage-by-outageid locations.openapi put /location-outages/{outageId} Update the details of a specified location outage by providing the `outageId`. # Create inventory network Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/create-inventory-network inventory.openapi post /inventory-networks Create a network using conditional rules to add locations and SKU to the network. # Delete network by code Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/delete-network-by-code inventory.openapi delete /inventory-networks/{networkCode} Delete a specific network, with all its details, by specified network code. Once deleted, it can't be undone. # Get all networks Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/get-all-networks inventory.openapi get /inventory-networks Get a paginated list of all the created networks. # Get network by code Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/get-network-by-code inventory.openapi get /inventory-networks/{networkCode} Get details of a specific network by code. # Search for inventory hard reservations Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/search-hard-reserve inventory.openapi post /inventories/actions/hard-reserve-search Search for hard reservations based on filter criteria. # Release soft reservation Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/soft-release inventory.openapi post /inventory-networks/actions/soft-release Release soft reservation. # Soft reservation Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/soft-reserve inventory.openapi post /inventory-networks/actions/soft-reserve Soft reserve quantity. # Update network by code Source: https://developer.fabric.inc/v3/orders-and-inventory/api-reference/inventory/networks/update-network-by-code inventory.openapi put /inventory-networks/{networkCode} Update details of a specific inventory network by specified network code. # Attributes Mapping Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes-mapping/overview fabric has a predefined set of mandatory attributes for `Items` and `Categories`. However, as merchants, you may have your own naming conventions for these attributes. For instance, a mandatory attribute 'unique item identifier' may be referred to as `SKU` by fabric and as `productId` by merchant. To address this inconsistency, merchant-defined attributes are mapped to fabric attributes as productId -> fabric SKU. These endpoints are used to get and update mapping of attributes. # Create attribute Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/create-attribute attribute.openapi post /product-attributes In fabric **Product Catalog**, both products (Items, Variants, and Bundles) and categories have attributes. For products, they may be technical specifications like size, weight, etc., design specifications like color, material, etc. For Categories, they may be basic specifications such as name, description, ID, etc. This endpoint creates attributes that can be assigned to a `target` - Product or Category. # Delete single attribute Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/delete-single-attribute attribute.openapi delete /product-attributes/{id} Over time, fabric **Product Catalog** may accumulate attributes that are no longer relevant or were created with incorrect or incomplete information. This can cause downstream issues. This endpoint provides the flexibility to delete an attribute by its ID, without impacting other attributes **Note**: An attribute can't be deleted if it's already assigned to `Item` or `Category`. # Find attributes Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/find-attributes attribute.openapi post /product-attributes/search With this endpoint, you can search for attributes based on criteria such as name, creation or modification date, attribute type, and other factors. # Get attributes Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/get-attributes attribute.openapi get /product-attributes Once attributes are created, this endpoint gets all the available attributes that can be assigned to the requested `target` - `item` or `category`. You can refine search results by specifying `offset` and `limit`. When they're not specified, by default, you'll get up to 10 attributes. # Get single attribute Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/get-single-attribute attribute.openapi get /product-attributes/{id} E-commerce platforms (web or app) show product details based on attributes such as name, size, color, and other specifications. This endpoint gets the details of a particular attribute by its ID, which is used to display on the e-commerce platform. # Attributes Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/overview Supports CRUD operations for managing attributes. These endpoints generally require an attribute `target` to be specified to ensure appropriate separation and assignment of attributes to the correct target - `Item` or `Category`. # Update single attribute Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes/update-single-attribute attribute.openapi put /product-attributes/{id} This endpoint updates attribute details such as name, description, validation criteria, and more, for the specified ID. The target and type fields cannot be updated via this endpoint. # Data Ingestion Best Practices Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/data-ingestion-best-practices ## Overview Optimized data management is at the core of every successful e-commerce operation. For fabric users managing extensive product catalogs, finely tuned data ingestion is paramount. Adhering to fabric’s best practices will ensure the fastest processing speed, optimum resource management, and enhanced accuracy when importing your data. This topic covers subjects such as file size restrictions, types of import actions, reconciling errors, and most importantly, the best method of data ingestion: **delta updates**. ## File Size and Upload Guidelines Before you upload your first file, it's important to understand file size restrictions and how fabric handles files that exceed those restrictions. * **No files larger than 300MB** Limit the size of your uploads to 300MB. * **Split files larger than 300MB into smaller ones** Splitting large files into smaller ones before uploading them is the quickest way to import large amounts of data. For fastest processing, the ideal file size is between 80-100MB. * **Parallel processing** fabric can process multiple files in parallel. The number of parallel files depends on your package. When the limit has been reached, subsequent files will be in a “scheduled” status until moved into the queue. Reach out to your account representative to learn more. * **Automatic file chunking is available** fabric can automatically chunk files larger than 300MB into smaller files to improve performance. This feature is only available in select packages. Reach out to your account representative to learn more. ## Delta Updates A delta update involves transmitting only the changed data fields when making an update. This is in contrast to the more traditional “full feed” updates that send the entire dataset. By sending only the changed data fields, fabric can process updates without reprocessing unchanged data. **Delta updates are the preferred method for all uploads.** ### Delta updates vs. full feed updates | | Full Feed Data Updates | Delta Data Updates | | -------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------- | | **Resource Usage** | Requires more resources | Requires fewer resources | | **Processing Time** | Longer processing time | Shorter processing time | | **Data Transmission** | Transmits entire dataset | Transmits only modified data fields | | **Network Bandwidth** | Consumes more network bandwidth | Requires less network bandwidth | | **Storage** | Requires more storage space | Requires less storage space | | **Error Handling** | Prone to errors during full data transmission | Less prone to errors due to focused updates | | **Scalability** | Less scalable for large datasets | More scalable, especially for large datasets | | **Data Accuracy** | Potential for data redundancy and inconsistency | Enhances data accuracy by focusing on changes | | **Operational Efficiency** | Lower operational efficiency due to higher resource consumption | Higher operational efficiency due to optimized resource usage | | **Incremental Updates** | Updates entire dataset each time | Updates only modified data fields incrementally | ## Ways to Import Data You can import data into fabric using the following methods: * CSV import using API * Import using RESTful APIs * CSV import using the Copilot interface The import method you choose is up to you, but in each case, uploading smaller files and using the delta update method will result in quicker processing, better resource management, and a higher degree of accuracy. ## Data Formatting It's crucial to make sure your dataset is accurate and compatible with fabric’s formatting before initiating the upload process. Validate your data to avoid errors by reviewing the file to identify any changes since the last upload and confirm that the data structure and format are correct. See the following pages for formatting guidelines: * [Importing Items](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items#csv-file-guidelines) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles#csv-file-guidelines) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes#attribute-data-formatting) * [Importing Categories](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories#csv-file-guidelines) ## Import Actions The actions you use when importing items, bundles, categories, and collections tell fabric how you are modifying your data. The following actions are available: * **UPSERT:** Creates a new product if the product doesn't exist, or it updates an existing product. * **CREATE:** Creates a new product. * **UPDATE:** Updates existing product. * **PUBLISH:** Publishes an existing product that was in draft state. The product is published to the storefront. * **UNPUBLISH\_KEEP\_DRAFT:** Unpublishes an existing product. If the product already has a draft version, the live version is unpublished and discarded. If product doesn't already have a draft version, the live version is unpublished and saved as a draft. * **UNPUBLISH\_KEEP\_LIVE:** Unpublishes an existing product. If the product already has a draft version, the draft version is discarded. * **DELETE:** Deletes the existing product. * **ATTACH\_VARIANT:** Adds variants to an existing parent product. The variant column holds the variant to be attached to the SKU. * **DETACH\_VARIANT:** Detaches existing variants. The variant column holds the variant to be detached from the SKU. * **CHANGE\_CATEGORY:** Updates the category of existing product. * **ATTACH\_CHANNELS:** Appends listed channels to the product, allowing it to be available across various sales channels. You can specify the channels to be attached in the Channels column. After attaching channels, users should verify the attachment post-action to confirm the successful addition of channels to the product. * **DETACH\_CHANNELS:** Removes listed channels from a product. Users specify the channels to be detached in the Channels column. This action is useful when a product needs to be removed from specific sales channels while remaining available on others. Users should verify the detachment of channels post-action to ensure the desired channels are removed from the product. ## Reconciling Errors If there are errors during processing, download the error file and review each error to identify the problem. Correct the errors by updating the CSV file with the necessary changes and validate the corrected CSV file before re-importing. * [Troubleshooting Item Imports](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items#troubleshooting) * [Troubleshooting Bundle Imports](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles#troubleshooting) # Configuring Product Catalog Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/developer-guide/configuring-product-catalog The following workflow diagram illustrates the step-by-step interaction process with the Product Catalog API: ![Getting Started Diagram](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/gettingstartedworkflow.jpg) The following steps outline the process: 1. Create attributes that can be assigned to categories and associated products. 2. Map fabric-mandatory attributes with merchant-defined attributes. 3. Create categories as the primary organizational structure. 4. Assign attributes to categories. 5. Create collections to display products on storefronts and support storefront-specific use cases, including promotions. 6. Add products, such as individual items, variants, and bundles of items and variants. ## Prerequisites You must have the following: * **Access and Permissions Setup** * Ensure that you have Admin or Editor role to set up Product Catalog. For more information about the roles and permissions offered through fabric **Identity** service, see the [Role-based Access Control (RBAC)](/v3/platform/settings/rbac/role-based-access-control-products-roles) section. * Use the V3 version of the [Product Catalog API](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAPI.json). * **Authentication and Security Protocols** * Ensure that you have a valid [Authorization Token](/v3/getting-started/authentication-v3/authentication-endpoints/fetch-access-token) to provide in the header. ## Procedure Use this procedure to configure Product Catalog. The API collections for the endpoints are: * Postman collection for [attributes](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAttributes.json). * Postman collection for [categories](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsCategories.json). * Postman collection for [products](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAPI.json). 1. Create attributes using one of the following methods: * **Individually**: Create a new attribute using the [Create attribute](/v3/product-catalog/api-reference/product-catalog/attributes/create-attribute) endpoint. By specifying the `target` in the request body as a `product` or `category`, you can assign the attribute to a product or a category, respectively. * **Bulk Import**: Import multiple attributes through bulk import APIs. For more information, see the [bulk import guide](#import-products-data-through-bulk-import). * (Optional) Create attribute groups using the [Create attribute groups](/v3/product-catalog/api-reference/product-catalog/attribute-groups/create-product-attribute-group) endpoint and group relevant attributes. The attribute groups can then be assigned to products. 2. Map the mandatory fabric attributes, such as `sku`, `title`, `image`, and `active` status, to the corresponding attribute names provided by the merchant. To create new mapping or update an existing mapping, use the [Update attribute](/v3/product-catalog/api-reference/product-catalog/attributes-mapping/update-attributes-mapping) endpoint. 3. Create categories using one of the following methods: * **Individually**: Create a new category using the [Create category](/v3/product-catalog/api-reference/product-catalog/categories/create-category) endpoint. A root category is created by default and can't be modified. * **Import Multiple Categories**: Add multiple new categories using the [Create multiple categories](/v3/product-catalog/api-reference/product-catalog/bulk-action-for-categories-and-collections/create-multiple-categories) endpoint. You can add up to 25 categories. * **Bulk Import**: Add multiple categories (more than 25) through bulk import APIs. For additional information, refer to the [bulk import guide](#import-products-data-through-bulk-import). You can add other category IDs to `categoryIdsIncluded` which automatically includes a categories catalog of items. Similarly, you can exclude categories using `categoryIdsExcluded`. 4. Assign attributes to categories using the [Create category](/v3/product-catalog/api-reference/product-catalog/categories/create-category) and [Partially update category](/v3/product-catalog/api-reference/product-catalog/categories/partially-update-category) endpoint. The attributes of a category automatically cascade to all products associated with that category. 5. (Optional) Create collections to display products on storefront using the [Create collections](/v3/product-catalog/api-reference/product-catalog/collections/create-collection) endpoint. 6. Add products, which may be items, variants, and bundles, using one of the following methods: * **Add Item**: Add items using the following methods: * **Individually**: Add a single item using the [Add product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the `type` as item. * **Add Multiple items**: Add multiple items using the [Add products](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the `type` as item. You can add up to 25 items in a single request. * **Bulk Import**: Import multiple products through bulk import APIs. For additional information, refer to [bulk import guide](#import-products-data-through-bulk-import). * **Add Variants**: For creating variants for a product, you must set the product's `status` flag to `LIVE`. If a product status is `DRAFT`, variants are treated as separate products. Add variants using the following methods: * **Individually**: Add a single variant using the [Add product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the `type` as variant. * **Add Multiple Variants**: Add multiple variants using the [Add Products](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the `type` as variant. You can add up to 25 variants. * **Bulk Import**: Import variants using the bulk import APIs. For additional information, refer to the [bulk import guide](#import-products-data-through-bulk-import).\ **Note**: To add a variant, its `parentProduct` must be in published or draft status. Initially, the `type` remains as `item` until the parent is published. Once the parent is published, the `type` is updated to `variant`. Additionally, both the parent and its children should belong to the same category and channel. * **Add Bundles**: Add bundles using the following methods: * **Individually**: Add a single bundle using the [Add Product](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the `type` as bundle. * **Add Multiple Products**: Add multiple bundles using the [Add Products](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) endpoint and specify the type as bundle. You can add up to 25 bundles. * **Bulk Import**: Import bundles using the [bulk import guide](#import-products-data-through-bulk-import) API. When bulk importing attributes, specify their corresponding type and subtype in the template. The following list shows the Attribute types and their corresponding Attribute sub types: * **Serial:** None * **Date-Time:** None * **Boolean:** None * **Number:** None * **Text:** Small text * **Text:** Text area * **Text:** HTML * **Options:** Single * **Options:** Multiple **Note**: When creating a bundle, make sure to specify the `bundleProducts`. Ensure the individual items or their variants, which you intend to include in the bundle, already exist in the system. ### Import Product Data Through Bulk Import The following diagram illustrates the step-by-step process to bulk import attributes, categories, collections, items, variants, and bundles: ![Bulk Import Workflow](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/bulkimport.jpg) Take the following steps to bulk import: 1. Download the [template](/v3/product-catalog/api-reference/product-catalog/files/generate-the-import-template) based on the `type`, which could be items, variants, bundles, attributes, categories, or collections. A CSV template with header columns is returned in the response. You can add required data in the template and save the file in your local system.\ The following code sample provides an example for the template: Bash ``` curl --request POST \ --url https://api.fabric.inc/v3/product-templates/actions/generate \ --header 'accept: text/csv' \ --header 'content-type: application/json' \ --data ' { "type": "ITEM", "categoryId": "648014741adc8a9de14e1a68", "locale": "en-US" } ' ``` The following code sample provides an example to bulk import attributes: Bash ``` curl --request POST \ --url https://api.fabric.inc/v3/product-templates/actions/generate \ --header 'accept: text/csv' \ --header 'content-type: application/json' \ --data '{"type":"ATTRIBUTE"}' ``` 1. Retrieve the AWS S3 bucket URL used to upload the import file by using the [Create file object and get upload location](/v3/product-catalog/api-reference/product-catalog/files/create-file-object-and-get-file-upload-location) endpoint.\ The following code sample provides an example to retrieve the upload URL to import a file: Bash ``` curl --request POST \ --url https://api.fabric.inc/v3/product-files \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --data ' { "type": "ITEM_VARIANT_EXPORT", "name": "bulk_import_123345677788999.csv", "locale": "en-US" } ' ``` 1. Make a PUT request with the upload URL, returned in the response of the step 2, to upload the updated CSV file from your local system. 2. Download one or more previously imported or exported files, including error files, use the [Get files available for a merchant](/v3/product-catalog/api-reference/product-catalog/files/get-files-available-for-a-merchant) endpoint.\ The following code sample provides an example: Bash ``` curl --request GET \ --url 'https://api.fabric.inc/v3/product-files?offset=0&limit=10' \ --header 'accept: application/json' ``` 1. To view the status of previously imported or exported files, use the [Get jobs](/v3/product-catalog/api-reference/product-catalog/jobs/get-jobs-related-to-products) endpoint.\ The following code sample provides an example to retrieve the import history: Bash ``` curl --request GET \ --url 'https://api.fabric.inc/v3/product-jobs?offset=0&limit=10' \ --header 'accept: application/json' ``` # Examples Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/developer-guide/examples The following examples provide step-by-step instructions to create a category and its structure with attributes, collections, and products. This example uses a furniture store selling lamps. Use the following table to reference the category, subcategories, and products that will be created. | Category | Sub-Categories | Products | | -------- | -------------- | --------------------------- | | Lamps | | | | | Ceiling Lamps | | | | | Atlas Pendant Ceiling Lamp | | | | Apollo Pendant Ceiling Lamp | | | Table Lamps | | | | | Hudson Table Lamp | | | | Luminary Table Lamp | in Product Catalog, both products and categories have attributes. Each product can have multiple attributes associated with it. Because you need to add attributes to both categories and products, the first step in building the lamps category is to create the attributes needed to fulfill our objective. In this example, lamps need to have a `Style` attribute for all the products. ## 1. Create the `Style` Attribute with the Values `Modern`, `Traditional`, and `Rustic` The `product-attributes` endpoint is used to create different product and category attributes. In this example, the `Style` attribute is created for products. This attribute differentiates lamps based on design aesthetics, such as modern or rustic. In this example the `type` is set to `OPTIONS` since multiple accepted values are added. Note that if you set `isMandatory` to `true` in the request, anything with the `Style` attribute requires a value. This means if a product inherits or has the `Style` attribute, it must have one of the `acceptedValues` outlined in the request below. Bash ``` curl --location 'https://api.fabric.inc/v3/product-attributes' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization;' \ --data ' { "name": "Style", "type": "OPTIONS", "target": "PRODUCT", "isLocalizable":false, "localizedProperties":{}, "validation": { "isMandatory": false, "acceptedValues": ["Modern", "Traditional", "Rustic"], "subType": "SINGLE", "isManualOverwrite": false, "isDecimal": false, "formula": "" } } ' ``` The response includes a product attribute ID for `Style`. This ID is required in subsequent API requests for mapping. ## 2. Create a new `Lamps` Category Use the `categories` endpoint to create a new category with the name `Lamps`. Bash ```curl --location 'https://api.fabric.inc/v3/categories' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "name":"Lamps" } ' ``` After creating a category successfully, a response with the ID for the new category is returned. Use this ID to set up sub-categories. ## 3. Create the `Ceiling Lamps` and `Table Lamps` sub-categories Use the bulk insert API for categories when you need to create more than one subcategory at a time. You must provide the `parentCategoryId` that you previously received in step 2 when making the parent category `Lamps`. Optionally, you can also set `isLocalizable` to `true` and provide localized names. Bash ``` curl --location 'https://api.fabric.inc/v3/categories/batch' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "categories": [ { "parentCategoryId": "65a503418b49c6d313211159", "name": "Ceiling Lamps", "isLocalizable": true, "localizedProperties": { "en-US": { "name": "Ceiling Lamps" }, "es-US": { "name": "Lámparas de techo" } }, }, { "parentCategoryId": "65a503418b49c6d313211159", "name": "Table Lamps", "isLocalizable": true, "localizedProperties": { "en-US": { "name": "Table Lamps" }, "es-US": { "name": "Lámparas de mesa" } }, } } ], }' ``` ## 4. Map the `Style` attribute With attribute mapping, you can update existing attributes and add new attributes to a category or product. In this example, the product attribute ID corresponding to the `Style` attribute is added to the `Lamps` category, and the `isMandatory` flag set to `true`. With this setting, all products within the `Lamps` category must have a value corresponding to the `Style` attribute. When you add an attribute to a parent category, such as `Lamps`, it automatically applies to all its sub-categories. In this example, `Ceiling Lamps` and `Table Lamps` are children of the `Lamps` category, so they inherit the mandatory `Style` attribute. For mapping, use the `categories` endpoint and provide the ID corresponding to the `Style` attribute that's returned in the response from the `product-attribute` endpoint. Bash ```shell curl --location --request PUT 'https://api.fabric.inc/v3/categories/557f1f77bcf86cd799439015' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --data ' { "name": "Lamps", "productAttributes": [ { "isMandatory": true, "id": "557f1f77bcf86cd799439015" } ] } ' ``` ## 5. Create products and variants with attributes This example requires four products with variants, so the products `status` is set to `LIVE` to create variants and the `parentProduct` field is included in the request body. The following code example shows adding the products using the bulk insert API for `products`, which includes the mandatory attributes values: Bash ```shell curl --location 'https://api.fabric.inc/v3/product-catalog/batch' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "products": [ { "sku": "AGLAMPTL12", "status":"LIVE", "categoryId": "65a505cf8b49c6d313211187", "isActive": true, "type": "ITEM", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["modern"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Hudson Table Lamp" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "AGLAMPTL12" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] }, { "sku": "AGLAMPTL9", "status":"LIVE", "categoryId": "65a505cf8b49c6d313211187", "isActive": true, "type": "ITEM", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["rustic"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Luminary Table Lamp" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "AGLAMPTL9" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] }, { "sku": "AGLAMPCL2", "status":"LIVE", "categoryId": "65a505cf8b49c6d313211187", "isActive": true, "type": "ITEM", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["rustic"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Apollo Pendant Ceiling Lamp" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "AGLAMPCL2" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] }, { "sku": "AGLAMPCL5", "status":"Live", "categoryId": "65a505cf8b49c6d313211187", "isActive": true, "type": "ITEM", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["modern"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Atlas Pendant Ceiling Lamp" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "AGLAMPCL5" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] }, { "parentProduct": { "sku": "AGLAMPCL5" }, "sku": "GLAMPCL5", "status": "LIVE", "categoryId": "65a505cf8b49c6d313211187", "isActive": false, "type": "VARIANT", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["modern"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Green" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "GLAMPCL5" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] }, { "parentProduct": { "sku": "AGLAMPCL5" }, "sku": "AGLAMPCL1", "status": "LIVE", "categoryId": "65a505cf8b49c6d313211187", "isActive": false, "type": "VARIANT", "attributes": [ { "id": "65a503bfd97969bcbb224415", "value": ["modern"] }, { "id": "6464ecfc4529ad33084c4adb", "value": "Gold" }, { "id" : "6464ecfc4529ad33084c4ad7", "value": "AGLAMPCL1" }, { "id": "6464ecfc4529ad33084c4acb", "value" : "https://exampleimagelink.me/assets/images/exampleimagelink.png" }, { "id": "6464ecfd4529ad33084c4adf", "value" : "FALSE" } ] } ] }' ``` ## Create a `Sale` category for `Modern Style Furniture` and `Cyber Monday` 1. Create the parent collection, `Sale`. Bash ``` curl --location 'https://api.fabric.inc/v3/collections' \ --header 'x-fabric-tenant-id: ' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --data '{ "isRoot": true, "isLocalizable": false, "name": "Sale", }' ``` 1. Create the sub category `Current Sales`. The `parentCollectionID` is returned from the previous response when creating the parent collection `Sale`. Bash ``` curl --location 'https://api.fabric.inc/v3/collections/batch' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: ' \ --data '{ "collections": [ { "parentCollectionId": "65a5847b8b49c6d313211476", "name": "Current Sales", "isLocalizable": false, "isRoot": false, "isLeaf": false } ] }' ``` 1. Create the `Modern Style Furniture` and `Cyber Monday` categories. Bash ``` curl --location 'https://api.fabric.inc/v3/collections/batch' \ --header 'Authorization: ' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: ' \ --data '{ "collections": [ { "parentCollectionId": "65a58a5b8b49c6d313211486", "name": "Modern Style Furniture", "isLocalizable": false, "isRoot": false, "isLeaf": false, "categoryIdsIncluded": [ "65a503418b49c6d313211159" ] }, { "parentCollectionId": "65a58a5b8b49c6d313211486", "name": "Cyber Monday", "isLocalizable": false, "isRoot": false, "isLeaf": false, "categoryIdsIncluded": [ "65a503418b49c6d313211159" ] } ] }' ``` Optionally, you can include products in a sale tab by filtering for specific attributes using `productAttributeFilters`. ``` "productAttributeFilters": [ { "attributeId": "78184766610c0e32a86d8757", "condition": "EQUALS", "value": 2 } ] ``` ## Error Handling For effective error handling, refer to the API documentation which outlines standard HTTP error codes, such as 400 (Bad Request), 404 (Not Found), and 500 (Internal Server Error). ## Next Steps Once the above steps are completed, you are all set with the basic setup. You may proceed to fully utilize all features and capabilities available to you. Refer to the [Related Resources](/v3/product-catalog/api-reference/product-catalog/developer-guide/introduction) for additional information. # Introduction Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/developer-guide/introduction fabric **Product Catalog** API supports CRUD operations related to Product Catalog. This service is designed to provide low latency reads and search functionalities for the storefront. It supports event-driven updates to ensure the data is always up-to-date without manual intervention, efficient cache management for faster data retrieval, and scalability to handle high volumes of traffic. This guide provides step-by-step instructions to help you get started with fabric Product Catalog API, from initial setup to basic usage. ## Target Audience * Solution Integration (SI) partners responsible for configuring the Product Catalog for e-commerce. * Third-party developers who set up Product Catalog on behalf of merchants. * The fabric developers who work with Product Catalog. ## Knowledge and Skill Requirements The target audience should: * Understand [REST APIs](https://fabric.inc/blog/developer/api-endpoint), in the context of e-commerce. * Get familiar with [fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis). * Know the [concepts related to Product Catalog](/v3/product-catalog/api-reference/product-catalog/products-api---overview.mdx). * Understand caching strategies and technologies. * Have access to development tools capable of interacting with HTTP-based APIs, such as Postman or cURL for testing. We also recommend you to: * Maintain a list of attributes that need to be assigned to products and categories. * Identify the mandatory and optional attributes. * Develop a strategy for organizing products within a hierarchical tree structure of categories and collections. * Create a product list consisting of individual items, variants, and bundles of items and variants. ## Related Resources For additional information, refer to the following: * Product Catalog [FAQs](/v3/product-catalog/api-reference/product-catalog/products-faqs). * [Sample store](https://sales-demo-uat.vercel.app) to view the given product organization. * [User guide](/v3/product-catalog/user-guides/product-catalog/overview) for Product Catalog in Copilot. * API reference for all operations related to [attributes](/v3/product-catalog/api-reference/product-catalog/attributes/overview) * API reference for all operations related to [categories](/v3/product-catalog/api-reference/product-catalog/categories/overview). * API reference for all operations related to [collections](/v3/product-catalog/api-reference/product-catalog/collections/overview). * API reference for all operations related to products based on [SKU](/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/overview) or [product ID](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/overview). # Postman Collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/developer-guide/postman-collections The Product Catalog Postman collections make it easy to explore, test, and integrate with the Product Catalog API. They include pre-built requests for common API operations, allowing you to understand how different endpoints work and test them with real data. With these collections, you can: * Test API requests directly within Postman without writing code. * View example payloads and expected responses for each endpoint. * Modify requests with your own data to fit your unique use cases. * Speed up API integration. * Improve troubleshooting. The following Postman collections are available: * [Attributes](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAttributes.json): Create, update, retrieve, and delete product attributes. * [Categories](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsCategories.json): Create new categories, update existing ones, and retrieve category hierarchies. * [Products](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAPI.json): Create new products, update existing product details, retrieve product information, and manage product lifecycle events. * [Published Products](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsPublishedProducts.json): Retrieve and manage published versions of your products. * [Files and Jobs](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsFileAndJobs.json): Upload product data files, monitor the progress of file imports, and manage various background jobs. # Product Catalog - Attributes API Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/products---attributes-api Product team: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | License: [fabric API License](https://fabric.inc/api-license) **Product Catalog** supports two types of attributes: Item Attributes and Category Attributes. Within fabric, a product could be an item, variant, or bundle. Product attributes are factual and objective descriptions that shoppers see when browsing through an e-commerce platform (website or mobile app). These attributes may include technical specifications such as size and weight, design specifications such as color and material, as well as basic details like name, description, and ID. Similarly, Category attributes define the characteristics of parent and children categories. They're essential for organizing products in logical groups, making it easier for shoppers to browse and find products on your platform with minimal cognitive load. [Find out more about Product Catalog](/v3/product-catalog/user-guides/product-catalog/overview) [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAttributes.json) # Product Catalog API - Overview Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/products-api---overview ## Product Catalog Overview Product Catalog is a data organization tool that enables merchants to build a centralized source of product information. This information can include technical specifications such as size and weight, design specifications such as color and material, and generic details such as name, description, and ID. Product categories allow merchants to organize items into logical parent-child groups to make finding products on the storefront easier for the shoppers. While configuring products, merchants can use validations to ensure data consistency and quality for each item and category. Product Catalog has out-of-the-box integrations with fabric services such as Orders and Offers that enable merchants to add base prices and promotions to any products available in Product Catalog, including categories and collections. Key Product Catalog capabilities include: * **Catalog Management**: Create and manage products and services such as items, variants, and bundles. For example, an item could be a coffee table in oak. A variant could be that same coffee table, but in pine. A bundle could be the coffee table sold together with two matching end tables. * **Taxonomy Management**: Define categories of products to create a structured hierarchy. * **Distribution management**: Control product data availability for multiple channels and locales and use collections to curate subsets of products for sales and marketing goals, such as holiday sales or seasonal discounts. * **Bulk Management**: Import product, category, and collection information in a CSV file and export catalog data into a CSV file. * **Variant management**: Create and manage an unlimited number of variants to indicate that a product is available in different options, such as colors or sizes. ### Use Case As an example, consider a furniture distributor with an extensive catalog that includes living, dining, and bedroom pieces who wants to display their products for sale on their storefront. The merchant can upload each item they sell, either individually or in bulk with a CSV file. Attributes of each piece, ranging from physical characteristics such as dimensions and weight to construction characteristics such as materials and finishes can all be included. Variants of items are also supported, so that a coffee table available in mahogany, oak, and pine can all be considered different versions of the same item. In addition, items frequently sold together can be grouped into bundles so that the coffee table can be sold along with a pair of matching end tables. The merchant can then create a hierarchy of relationships among the items in the catalog that make the most sense to their business. That means the coffee table could be in a category with all living room furniture, or a category of all tables, or both. Merchants can group items from different categories into themed collections to boost the sales or marketing campaigns. For example, for a Black Friday promotion, merchant can assemble a living room set collection that includes a coffee table, end tables, sofa, loveseat, and lamps. # Bundles Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/bundles-overview Bundles are combinations of two or more products sold exclusively together or individually, depending on the configuration. Pure bundles consist of items exclusively sold together, and individual items can't be purchased separately. Shoppers have the flexibility to buy items in mixed bundles together or separately. For example, in a living room furniture set consisting of a coffee table and an end table, shoppers can choose to purchase each table individually or buy both tables together as part of the living room set bundle. You can create bundles by importing them using a CSV or JSON file. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Importing Bundles](/v3/product-catalog/user-guides/catalog-connector/importing-bundles) * [Viewing Bundle Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels) * [Searching and Filtering Bundles](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history) # Importing Bundles Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/importing-bundles ## Overview Bundles are two or more items sold together. Creating a bundle allows you to group items that are exclusively sold together or group items that can be purchased together and separately. This document covers the process of importing bundles, which is done using a CSV or JSON file. ## File Guidelines You can import products using a CSV or JSON file only; no other data or file formats are supported. * SKU is a required field to create or update a bundle. * When adding a SKU to a bundle, enter the quantity to add in the same cell as the SKU itself. For example, if a bundle requires two of item 12345, enter *2, 12345* in the SKU cell. * When updating or upserting bundles, entering *null* in a spreadsheet cell will override existing values with blank values. Although not required, we recommend that you download the template file to use as a guide when creating your own file for import to minimize errors during the import process. ### Attribute Data Format When preparing your file for import, ensure that the attribute data format aligns with following attribute type requirements: * String: Ensure the data is in text string format. If a string attribute contains multiple values, the values need to be sent as a stringified array, for example: `["a","b"]`. * Number: Numerical data only. * Boolean: Use *true* or *false* only; other values will be ignored. ## Procedure 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. Click **Import bundles**.\ The **Import CSV file** window is displayed. This window provides a link to download example templates for JSON and CSV files. 3. To import a file, do one of the following options: * Drag and drop the file into the window. * Click **Select a File** from your computer. 4. Click **Import file**. The file is imported and the bundles are added to your product list. fabric stores the files that you upload to your account. You can view the status of the import operation and re-download the original files by visiting the **Import History** page. ## Troubleshooting For a list of common errors when importing and how to correct them, refer to the following table: | **Error Message** | **Description** | **Impact** | **Solution** | **Comment** | | --------------------- | --------------- | ------------------------------------ | ------------ | ------------------------------ | | Internal Server Error | Server issues | The bundle isn't created or updated. | Try again | This is an intermittent issue. | ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Bundles Overview](/v3/product-catalog/user-guides/catalog-connector/bundles-overview) * [Viewing Bundle Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels) * [Searching and Filtering Bundles](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history) # Importing Items Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/importing-items Items, which are also referred to as products, are services or stand-alone objects sold individually. This document covers the process of importing items, which is done using a CSV or JSON file. ## File Guidelines You can import products using a .csv or .json file only. No other data or file formats are supported. * SKU is a required field to create or update an item. * You can detach child or variant items from the parent item when importing by entering detach in the Parent SKU field. When the parent/child relationship is removed, the child or variant item becomes a standalone SKU. * When updating or upserting items, entering null in a spreadsheet cell will override existing values with blank values. Although not required, fabric recommends that you download the template file to use as a guide when creating your own file for import to minimize errors during the import process. ### Attribute data format When preparing your file for import, ensure that the attribute data format aligns with following attribute type requirements: * String: Ensure the data is in text string format. If a string attribute contains multiple values, the values need to be sent as a stringified array, for example: `"a", "b"`. * Number: Numerical data only. * Boolean: Use true or false only; other values will be ignored. ## Procedure 1. In the left menu, click **Catalog Connector > List > Items**. The **Items** page is displayed. 2. Click **Import items**. The **Import CSV file** window is displayed. This window provides a link to download example templates for .csv and .json files. 3. To import a file, do one of the following options: * Drag the file into the window. * Click **Select a File** from your computer. 4. Click **Import file**. The file is imported and the items are added to your product list. fabric stores the files that you upload to your account. You can view the status of the import operation and re-download the original files by visiting the **Import History** page. ## Troubleshooting For a list of common errors when importing and how to correct them, refer to the following table: | **Error Message** | **Description** | **Impact** | **Comment** | **Comment** | | --------------------- | --------------- | ---------------------------------- | ----------- | ------------------------------ | | Internal Server Error | Server issues | The item isn't created or updated. | Try again | This is an intermittent issue. | ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Items Overview](/v3/product-catalog/user-guides/catalog-connector/items-overview) * [Viewing Item Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels) * [Searching, Filtering, and Sorting Items](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history) # Items Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/items-overview An item is a standalone service or product sold individually. You can create items by importing them using a .csv or .json file. Each item can have different variations, known as variants, distinguished by specific differences from the standard version. fabric Catalog Connector doesn't validate or display the relationship between a parent and its variants. It simply stores each product as a distinct item. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Importing Items](/v3/product-catalog/user-guides/catalog-connector/importing-items) * [Viewing Item Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels) * [Searching, Filtering, and Sorting Items](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history) # Catalog Connector Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/overview Catalog Connector is a denormalized data organization tool that enables merchants to link information from their third-party product information management system to their fabric account, making it accessible across fabric modules such as Offers, Orders, and Inventory. This data can include technical specifications, such as size and weight, design attributes, such as color and material, and generic product details such as name, description, and ID. Catalog Connector provides out-of-the-box integrations with fabric services, such as Orders and Offers, that enable merchants to apply base prices and promotions to any products available within the Catalog Connector. Key Catalog Connector capabilities include: * **Bulk Management:** Import product information in a CSV or JSONL file. * **Catalog Management:** Manage product create, update, and delete actions, including parent, variant, and bundle products. Catalog Connector is only available to fabric users who haven't purchased fabric’s proprietary product information manager, Product Catalog. Catalog Connector setup involves importing products and bundles and their properties in a CSV or JSONL file. ## Related Topics ### Items * [Items Overview](/v3/product-catalog/user-guides/catalog-connector/items-overview) * [Importing Items](/v3/product-catalog/user-guides/catalog-connector/importing-items) * [Viewing Item Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels) * [Searching, Filtering, and Sorting Items](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history) ### Bundles * [Bundles Overview](/v3/product-catalog/user-guides/catalog-connector/bundles-overview) * [Importing Bundles](/v3/product-catalog/user-guides/catalog-connector/importing-bundles) * [Viewing Bundle Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels) * [Searching and Filtering Bundles](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history) # Searching, Filtering, and Sorting Bundles Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles ## Overview The search and filter options on the **Bundles** page allow you to refine the list of bundles or find a specific bundle. ### To search for a specific bundle, do the following: 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. To search for a bundle, in the search bar, type a search term and press **Enter**. The results are displayed. ### To filter the list of bundles, do the following: 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. Choose at least one of the following filters: * Click the **Date** dropdown and select a date range for the date the bundles were created or the date the bundles were modified. * Click the **Attributes & Values** dropdown, and do the following: * Enter an attribute name in the **Attribute** field. * Select a validation option. * Enter a value in the **Value** field. * To add more conditions, click **Add new condition** and enter the required values. Bundles that match the filters you chose are displayed. You can remove all filters by clicking **Reset all**. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Bundles Overview](/v3/product-catalog/user-guides/catalog-connector/bundles-overview) * [Importing Bundles](/v3/product-catalog/user-guides/catalog-connector/importing-bundles) * [Viewing Bundle Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history) # Searching, Filtering, and Sorting Items Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items ## Overview The search, filter, and sort options on the **Items** page allow you to refine the list of items or find a specific item. You can use the filter option only if you have multiple items in your list. ### To search for a specific item, do the following: 1. In the left menu, click **Catalog Connector > List > Items**.\ The **Items** page is displayed. 2. To search for an item, in the search bar, type a search term and press **Enter**. The results are displayed. ### To filter the list of items, do the following: 1. In the left menu, click **Catalog Connector > List > Items**.\ The **Items** page is displayed. 2. Choose at least one of the following filters: * Click the **Date** dropdown and select a date range for the date the items were created or the date the items were modified. * Click the **Attributes & Values** dropdown, and do the following: * Enter a search term in the **Attribute** field. * Select a validation option. * Enter a value in the **Value** field. * To add more conditions, click Add new condition and enter the required values * Click the **Type** dropdown and select Item or Variant Items that match the filters you chose are displayed. You can remove all filters by clicking **Reset all**. ### To sort the list of items, do the following: 1. In the left menu, click **Catalog Connector > List > Items**.\ The **Items** page is displayed. 2. Click one of the column headers to sort the list of items.\ Sortable headers are **SKU**, **Item ID**, **Product name**, **Channels**, **Category**, and **Created**. The items are sorted. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Items Overview](/v3/product-catalog/user-guides/catalog-connector/items-overview) * [Importing Items](/v3/product-catalog/user-guides/catalog-connector/importing-items) * [Viewing Item Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history) # Viewing Bundle Details Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels ## Overview After you have uploaded a CSV or JSON file of your items, you can view the bundle details on the **Bundles** page. ## Prerequisites Ensure that you have imported at least one CSV or JSON file of your bundles. ### To view bundle attributes, do the following: 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. In the **SKU** column, click the SKU of the bundle.\ The bundle details page with attributes, variants, and channels is displayed. You can click the corresponding tab to view the details. Bundle attribute information is displayed. ### To view bundle items, do the following: 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. Click a **SKU**.\ The SKU details page is displayed on the **Bundle information** tab. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Bundles Overview](/v3/product-catalog/user-guides/catalog-connector/bundles-overview) * [Importing Bundles](/v3/product-catalog/user-guides/catalog-connector/importing-bundles) * [Searching and Filtering Bundles](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history) # Viewing Bundle Import History Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-import-history ## Overview You can check the status of bundle import operations on the **Import History** page. Successful imports are marked as **Completed**. Imports that failed are marked with **Failed**. ## Procedure 1. In the left menu, click **Catalog Connector > List > Bundles**.\ The **Bundles** page is displayed. 2. Click **Import History**.\ The **Import History** page is displayed. 3. Click the name of an import.\ The **Import Summary** page with the details of the import is displayed. 4. (Optional) To download the import details file, click **Download original file**.\ The original CSV or JSON import file is downloaded. * (Optional) To see the details of an import that had errors, click Export errored bundles. The report is downloaded. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Bundles Overview](/v3/product-catalog/user-guides/catalog-connector/bundles-overview) * [Importing Bundles](/v3/product-catalog/user-guides/catalog-connector/importing-bundles) * [Viewing Bundle Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-bundle-attributes-variants-channels) * [Searching and Filtering Bundles](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-bundles) # Viewing Item Details Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels ## Overview After you have uploaded a CSV or JSON file of your items, you can view the item details on the **Items** page. ## Prerequisites Ensure that you have imported at least one CSV or JSON file with the details of the items. ## Procedures ### To view item attributes, do the following: 1. In the left menu, click **Catalog Connector > List > Items**.\ The **Items** page is displayed. 2. In the **SKU** column, click the SKU of the item.\ The items details page is displayed. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Items Overview](/v3/product-catalog/user-guides/catalog-connector/items-overview) * [Importing Items](/v3/product-catalog/user-guides/catalog-connector/importing-items) * [Searching, Filtering, and Sorting Items](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items) * [Viewing Import History](/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history) # Viewing Item Import History Source: https://developer.fabric.inc/v3/product-catalog/user-guides/catalog-connector/viewing-item-import-history ## Overview You can check the status of item import operations on the **Import History** page. Successful imports are marked as **Completed**. Imports that failed are marked with **Failed**. ## Procedure 1. In the left menu, click **Catalog Connector > List > Items**.\ The **Items** page is displayed. 2. Click **Import History**.\ The **Import History** page is displayed. 3. Click the name of an import.\ The **Import Summary** page with the details of the import is displayed. 4. (Optional) Click **Download original file**.\ The original CSV or JSON import file is downloaded. * (Optional) To download the import details file, click **Download original file**. ## Related Topics * [Catalog Connector Overview](/v3/product-catalog/user-guides/catalog-connector/overview) * [Items Overview](/v3/product-catalog/user-guides/catalog-connector/items-overview) * [Importing Items](/v3/product-catalog/user-guides/catalog-connector/importing-items) * [Viewing Item Attributes, Variants, and Channels](/v3/product-catalog/user-guides/catalog-connector/viewing-item-attributes-variants-channels) * [Searching, Filtering, and Sorting Items](/v3/product-catalog/user-guides/catalog-connector/searching-filtering-sorting-items) # Adding a Boolean Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute ### Overview Boolean attributes allow you to add yes or no, or true or false information to an item. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**. The **Product Attributes** page is displayed. 2. Click **New Attribute**. The **Create product attribute** page is displayed. 3. Select **Boolean**. 4. In the **Attribute title** filed, enter a name for the attribute. 5. (Optional) In the **Description** field, enter a description for the attribute. 6. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 7. Click **Save**. The boolean attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Boolean Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2 ### Overview Boolean attributes allow you to add yes or no, or true or false information to a category. ### Prerequisites Ensure you have administrator privileges to fabric Product Catalog. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Category**.\ The **Category Attributes** page is displayed. 2. Click **New Attribute**.\ The **Create category attribute** page is displayed. 3. Select **Boolean**. 4. In the Attribute title field, enter a name for the attribute. 5. Click **Save**. The boolean attribute is created. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Adding a Date Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute ### Overview Date attributes allow you to add date-related information about an item. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product > Attributes > Product**. The **Product Attributes** page is displayed. 2. Click **New Attribute**. The **Create product attribute** page is displayed. The **Text** attribute type is selected by default. 3. Select **Date**. 4. In the **Attribute title** filed, enter a name for the attribute. 5. In the **Select date format** field, select a date format. Note that bulk import of the date attribute type uses the date format you select here. The selected date format can't be changed. If the format needs to be changed, you must delete the attribute and create it again using the required format. 6. (Optional) In the **Description** field, enter a description for the attribute. 7. In the **Use JavaScript formula to calculate value** field, select one of the following: * **Yes**: Specifies that the value for the attribute is calculated using the JavaScript formula that you provide in the **Calculation formula** field. An example of a JavaScript formula is `(async () => await attribute('id') *10)()`. When you select **Yes**, the **Calculation formula** and **Allow manual overwrite** fields are displayed. Do the following to complete the settings: 1. In the **Calculation formula** field, enter a JavaScript formula. 2. In the **Allow manual overwrite** field, choose one of the following: * **Yes**: Specifies that you can manually overwrite the attribute value. When the **Use JavaScript formula to calculate value** setting is enabled, the system determines the value based on your provided formula. However, if you enable the manual overwrite option, you can replace the system-calculated value with a custom value during product attribute setup. For more information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) section. * **No**: Specifies that you can't manually overwrite the attribute value. This is the default setting. * **No**: Specifies that the attribute value isn't calculated using a JavaScript formula. 8. In the **Validations** field, select one of the following: * **None**: Specifies that no custom validation is required for the attribute. This is the default setting. * **Custom JavaScript**: Specifies that the JavaScript you enter in the **Validation formula** field is used to validate the attribute. The **Validation formula** field is displayed. * In the **Validation formula** field, enter a JavaScript validation formula. 9. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 10. Click **Save**. The date attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Date Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2 ### Overview Date attributes allow you to add date-related information about a category. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product > Attributes > Category**. The **Category Attributes** page is displayed. 2. Click **New Attribute**. The **Create category attribute** page is displayed. The **Text** attribute type is selected by default. 3. Select **Date**. 4. In the **Attribute title** field, enter a name for the attribute. 5. In the **Select date format** field, select a date format. Note that bulk import of the date attribute type uses the date format selected here. The selected date format can't be changed. If the format needs to be changed, you must delete the attribute and create it again using the required format. 6. Click **Save**. The date attribute with the specified settings is created. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Adding a List of Values Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute ### Overview List of values attributes allow you to create dropdown menus with defined values across the product list. There are two types of list of values attributes: * **Single select**: Specifies that the end user can select one option in the list of values. * **Multiple select**: Specifies that the end user can make multiple selections from the list of values. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**. The Product Attributes page is displayed. 2. Click **New Attribute**. The Create product attribute page is displayed. 3. Select **List of values**. 4. (Optional) To enable localization for the attribute, set the **Localize this attribute** toggle to one of the following: * **On**: The attribute title is localized. The **Title and description** and **Business validations** sections display additional fields corresponding to the languages depending on the internationalization settings. * **Off**: The attribute title isn't localized. 5. In the **Attribute title (primary)** field, enter a name for the attribute. If localization is enabled in step 4, enter the localized attribute titles in the Attribute title field for each corresponding internationalization setting. 6. (Optional) In the **Description** field, enter a description for the attribute. 7. In the **Type of list** field, select one of the following: * **Single select**: Specifies that the end user can select one option in the list of values. * **Multiple select**: Specifies that the end user can make multiple selections from the list of values. 8. In the **Enter values** field, enter each value in the list, separated by a comma. If localization is enabled in step 4, enter the localized values for each corresponding internationalization setting. 9. In the **Use JavaScript formula to calculate value** field, select one of the following: * **Yes**: Specifies that the value for the attribute is calculated using the JavaScript formula that you provide in the **Calculation formula** field. An example of a JavaScript formula is (async () => await attribute('id') \* 10)(). When you select **Yes**, the **Calculation formula** and **Allow manual overwrite fields** are displayed. Do the following to complete the settings: * In the **Calculation formula** field, enter a JavaScript formula. * In the **Allow manual overwrite** field, choose one of the following: * **Yes**: Specifies that you can manually overwrite the attribute value. When the **Use JavaScript formula to calculate value** setting is enabled, the system determines the value based on your provided formula. However, if you enable the manual overwrite option, you can replace the system-calculated value with a custom value during product attribute setup. For more information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) section. * **No**: Specifies that you can't manually overwrite the attribute value. This is the default setting. * **No**: Specifies that the attribute value isn't calculated using a JavaScript formula. 10. In the Validations field, select one of the following: * **None**: Specifies that no custom validation is required for the attribute. This is the default setting. * **Custom JavaScript**: Specifies that the JavaScript you enter in the **Validation formula** field is used to validate the attribute. The **Validation formula** field is displayed. * In the **Validation formula** field, enter a JavaScript validation formula. 11. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 12. Click **Save**. The list of values attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Number Only Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute ### Overview Number attributes allow you to add number-based information about an item. Use this attribute type when the value is always a number. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**.\ The **Product Attributes** page is displayed. 2. Click **New Attribute**.\ The **Create product attribute** page is displayed. 3. Select **Number**. 4. In the **Attribute title** field, enter a name for the attribute. 5. (Optional) In the **Description** field, enter a description for the attribute. 6. In the **Use JavaScript formula to calculate value** field, select one of the following: * **Yes**: Specifies that the value for the attribute is calculated using the JavaScript formula that you provide in the **Calculation formula** field. An example of a JavaScript formula is `(async () => await attribute('id') *10)()`. When you select **Yes**, the **Calculation formula** and **Allow manual overwrite** fields are displayed. Do the following to complete the settings: 1. In the **Calculation formula** field, enter a JavaScript formula. 2. In the **Allow manual overwrite** field, choose one of the following: * **Yes**: Specifies that you can manually overwrite the attribute value. When the **Use JavaScript formula to calculate value** setting is enabled, the system determines the value based on your provided formula. However, if you enable the manual overwrite option, you can replace the system-calculated value with a custom value during product attribute setup. For more information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) section. * **No**: Specifies that you can't manually overwrite the attribute value. This is the default setting. * **No**: Specifies that the attribute value isn't calculated using a JavaScript formula. 7. In the **Do you want this attribute to accept decimal values?** field, select one of the following: * **Yes**: Specifies that the field does accept decimal values. * **No**: Specifies that the field doesn't accept decimal values. 8. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 9. Click **Save**. The number only attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Number Only Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2 ### Overview Number attributes allow you to add number-based information about a category. Use this attribute type when the value is always a number. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product > Attributes > Category**.\ The **Category Attributes** page is displayed. 2. Click **New Attribute**.\ The **Create category attribute** page is displayed. 3. Select **Number Only**. 4. In the **Attribute title** field, enter a name for the attribute. 5. Click **Save**. The number-only attribute is created. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Adding a Serial Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute ### Overview Serial attributes allow you to create an auto increment number-type attribute. You can specify the starting number and the increment interval. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**.\ The **Product Attributes** page is displayed. 2. Click **New Attribute**.\ The **Create product attribute** page is displayed. 3. Select **Serial**. 4. In the **Attribute title** filed, enter a name for the attribute. 5. (Optional) In the **Description** field, enter a description for the attribute. 6. In the **Start serial with** field, enter the beginning serial number. 7. In the **Increment serial number by** field, enter the interval by which each subsequent number increases. 8. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 9. Click **Save**. The serial attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Text Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute ### Overview Text attributes allow you to add text-based information about an item, such as a description or a code snippet. You can use any combination of text, numbers, or special characters for this attribute type. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product > Attributes > Product**.\ The **Product Attributes** page is displayed. 2. Click **New Attribute**.\ The **Create product attribute** page is displayed. The **Text** attribute type is selected by default. 3. In the **Attribute title (primary)** field, enter a name for the attribute.\ If localization is enabled in step 3, enter the localized attribute titles in the **Attribute title** field for each corresponding internationalization setting. 4. (Optional) In the **Description** field, enter a description for the attribute. 5. In the **Type of text** field, select one of the following: * Small text: For single-line text attributes. * Text Area: For multi-line text attributes. * HTML: For text area attributes that support HTML. 6. In the **Use JavaScript formula to calculate value** field, select one of the following: * **Yes**: Specifies that the value for the attribute is calculated using the JavaScript formula that you provide in the **Calculation formula** field. An example of a JavaScript formula is `(async () => await attribute('id') *10)()`. When you select **Yes**, the **Calculation formula** and **Allow manual overwrite** fields are displayed. Do the following to complete the settings: 1. In the **Calculation formula** field, enter a JavaScript formula. 2. In the **Allow manual overwrite** field, choose one of the following: * **Yes**: Specifies that you can manually overwrite the attribute value. When the **Use JavaScript formula to calculate value** setting is enabled, the system determines the value based on your provided formula. However, if you enable the manual overwrite option, you can replace the system-calculated value with a custom value during product attribute setup. For more information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) section. * **No**: Specifies that you can't manually overwrite the attribute value. This is the default setting. * **No**: Specifies that the attribute value isn't calculated using a JavaScript formula. 7. In the **Is this attribute mandatory?** field, select one of the following: * **Yes**: Specifies that the attribute is mandatory when creating an item. * **No**: Specifies that the attribute isn't mandatory when creating an item. This is the default selection. 8. Click **Save**. The text attribute with the specified settings is created. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Adding a Text Attribute Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2 ### Overview Text attributes allow you to add text-based information about a category, such as a description or a code snippet. You can use any combination of text, numbers, or special characters for this attribute type. ### Prerequisites Ensure you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Category**. The **Category Attributes** page is displayed. 2. Click **New Attribute**. The **Create category attribute page** is displayed. The **Text** attribute type is selected by default. 3. In the **Attribute title** field, enter a name for the attribute. 4. In the **Type of text** field, select one of the following: * **Small text**: For single-line text attributes. * **Text Area**: For multi-line text attributes. * **HTML**: For text area attributes that support HTML. 5. Click **Save**. The text attribute with the specified settings is created. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Category Attributes Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview ## Overview Category attributes define specific characteristics of a category or collection, such as images and SEO tags. Category attributes added to higher-level categories are inherited by subcategories. Category attributes are inherited by default, meaning sub-collection nodes automatically adopt attribute values from their parent categories. However, users can override these values as needed, allowing for customization at different hierarchy levels. ## Attribute Types fabric supports the following attribute types for storing category information: * **Text:** A sequence of characters. You may store any combination of text, numbers, or special characters. Text attribute has three subtypes: * Small text: For single-line text attributes. * Text Area: For multi-line text attributes. * HTML: For text area attributes that support HTML. * **Number Only:** An attribute type for values that are always a number. * **Date:** All date-related formats. Bulk import of the date attribute uses the date format selected when the attribute was created. Once selected, the date format can't be changed. If the format needs to be changed, you must delete the attribute and create it again using the required format. * **Boolean:** A Boolean value (true/false) for a category attribute. While importing attributes from an external system, make sure the true or false values are specified for all Boolean attribute types. For each attribute type, certain fields are optional, while others are required. Failure to provide required fields will result in an "Unable to create attribute" error message. The following table shows the attribute types and their properties. This will help you determine the mandatory and optional properties of an attribute type. To ensure data quality, set up one or more validations based on the selected attribute type. | Attribute Type | Localize this attribute | Attribute title | Description | Use JavaScript to calculate value | Validations | Is this attribute mandatory? | Type of text | Date Format | Decimal | | -------------- | ----------------------- | --------------- | ----------- | --------------------------------- | ----------- | ---------------------------- | ------------ | ----------- | -------- | | Text | Optional | Required | Optional | Optional | Optional | Required | Required | N/A | N/A | | Number Only | Optional | Required | Optional | Optional | Optional | Required | N/A | N/A | Optional | | Date | Optional | Required | Optional | Optional | Optional | Required | N/A | Required | N/A | | Boolean | Optional | Required | Optional | Optional | Optional | Required | N/A | N/A | N/A | After creating a category attribute, you cannot modify its attribute type. If you want to use a different attribute type, you must create a new category attribute with the required type. ## Related Topics * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Importing Product Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes ## Overview Product attributes are specific product descriptors that define characteristics such as size, color, or material. This document covers the process of importing multiple product attributes using a CSV file. You also have the option to add product attributes manually. ## CSV File Guidelines Product attributes can be imported using CSV files exclusively, as fabric doesn't support other data or file formats. Here are some essential points to keep in mind: * The headers in the first row of the CSV file should match the attribute titles. * While attribute titles aren't case-sensitive, maintaining case consistency with the original attribute titles is recommended. * Empty rows and columns are ignored. * fabric recommends downloading the template file to serve as a guide when creating your own CSV file for import, minimizing errors during the process. ### Attribute data formatting When preparing your CSV file for import, ensure that the product attribute data format aligns with the column requirements. Different columns have specific data input requirements: | **Attribute** | **Description** | | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Attribute Title** | The name of the attribute. | | **Type of Attribute** | Specifies the attribute type, such as text, number, date, boolean, serial, or list of values, which is also known as *list of options*. | | **Description** *(Optional)* | Provides additional details about the attribute. | | **Decimal** | Indicates if the attribute allows decimal values. Valid values are **true** if decimals are allowed or **false** if only whole numbers are allowed. Applicable only to number-type attributes. The default value is **true**, and you must ensure that the number is in decimals. | | **Min** *(Optional)* | Defines the minimum value for validation. Applicable only to number-type attributes. | | **Max** *(Optional)* | Defines the maximum value for validation. Applicable only to number-type attributes. | | **Date Format** | Specifies the required date format, such as MM/DD/YYYY, MM-DD-YYYY, DD/MM/YYYY, DD-MM-YYYY, YYYY/MM/DD, or YYYY-MM-DD. This is mandatory for date-type attributes; otherwise, the attribute can't be imported. | | **Calculation Formula** *(Optional)* | JavaScript formula used to calculate the attribute value. | | **Validations Formula** *(Optional)* | JavaScript formula used to define business validation rules for the attribute. | | **Mandatory** | Specifies whether the attribute is required. Valid values are **true** if the attribute is mandatory or **false** if it's optional. | | **Start With** | Defines the starting value for a serial-type attribute. Applicable only to serial-type attributes. | | **Increment by** | Specifies the increment value for a serial-type attribute. | | **Options Select Type (List of Value)** | Determines if the attribute is a list of values. Valid values are **true** if the attribute is a list of values or **false** if it's not. To specify options, use additional columns, such as **Value 1**, **Value 2**, **Value 3**, etc. | The following table provides an example for a product attribute import CSV file: | **Attribute Title** | **Type of Attribute** | **Sub Type** | **Description** | **Decimal** | **Min** | **Max** | **Date Format** | **Calculation Formula** | **Validation Formula** | **Mandatory** | **Start With** | **Increment by** | **Options Select Type** | **Value 1** | **Value 2** | **Value 3** | **Value 4** | | ------------------- | --------------------- | ------------ | --------------- | ----------- | ------- | ------- | --------------- | ----------------------- | ---------------------- | ------------- | -------------- | ---------------- | ----------------------- | ----------- | ----------- | ----------- | ----------- | | On Sale | `BOOLEAN` | | | | | | | | | `TRUE` | | | | | | | | | Description 1 | `TEXT` | `SMALL_TEXT` | | | | | | | | `FALSE` | | | | | | | | | Description 2 | `TEXT` | `TEXT_AREA` | | | | | | | | `TRUE` | | | | | | | | | Description 3 | `TEXT` | `HTML` | | | | | | | | `FALSE` | | | | | | | | | Color | `OPTIONS` | | | | | | | | | | | | | | | | | ## Prerequisites Ensure that you have access to fabric **Product Catalog** in Copilot. ### Procedure You can't import CSV files with duplicate names. Ensure that every file you import has a unique filename. 1. In the left menu, click **Product Catalog** > **Attributes** > **Product**. The Product Attributes page is displayed. 2. Click **Import**. The Import CSV file window is displayed, providing a link to download an example template for the CSV file. 3. To import a CSV file, choose one of the following options: * Drag and drop the CSV file into the window. * Click **Select a File** from your computer. 4. Click **Import file**. The CSV file is imported, and the product attributes are added. ### Error messages | **Error Message** | **Description** | | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | File header not present | A column header in the CSV file is incorrect. | | INVALID\_ATTRIBUTE\_TYPE | An invalid attribute type was provided during import. Supported types are:
  • `TEXT`
  • `BOOLEAN`
  • `OPTIONS`
  • `SERIAL`
  • `DATETIME`
  • `NUMBER`
| | ATTRIBUTE\_TYPE\_NOT\_FOUND | An the attribute type wasn't mentioned in the CSV file during import. | | Duplicate headers found \["Sub Type"] | Duplicate columns are present in the CSV file. | | Attribute not found in formula definition. | An invalid attribute was provided for a custom formula during import. | | At least one of the properties in startWith or increment are missing. | A startWith or increment value was missing for a serial type attribute during import. | | `acceptedValues` must be unique and can't be empty | Duplicate or empty values were present for a list of values attribute during import. | ## Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Managing Category Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes ### Overview This document covers the process of editing and deleting category attributes. ## Editing Product Attributes ### Prerequisites * Ensure that you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-role). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Category**.\ The **Category Attributes** page is displayed. 2. Click the category attribute that you want to edit.\ The edit attribute type page is displayed. 3. Edit the attributes as required. 4. Click **Save**. The category attribute is saved. ## Deleting a Category Attribute ### Prerequisites Ensure that: * You have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-role). * The category attribute is removed from all category nodes. For more information, see the [removing a category attribute](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories#removing-a-category-attribute) section. * The category attribute is unassigned for all attribute groups. For more information, see the [update attribute group](/v3/product-catalog/api-reference/product-catalog/attribute-groups/update-attribute-group) page. ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Category**.\ The **Category Attributes** page is displayed. 2. Click a Category attribute that you want to delete.\ The edit attribute type page is displayed. 3. Click **Delete**.\ The **Delete attribute** popup is displayed. 4. Click **Yes, Delete**. The category attribute is deleted. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) # Managing Product Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes ## Overview This document covers the process of editing and deleting product attributes. ## Editing Product Attributes ### Prerequisites * Ensure that you have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-role). ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**. The **Product Attributes** page is displayed. 2. Click the product attribute that you want to edit. The edit attribute type page is displayed. 3. Edit the attributes as required. 4. Click **Save**. The product attribute is saved. ## Deleting a Product Attribute ### Prerequisites Ensure that: * You have administrator privileges to fabric **Product Catalog**. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-role). * The product attribute is removed from all category nodes. For more information, see the [removing a product attribute](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories#removing-a-product-attribute) section. * The product attribute is unassigned for all attribute groups. For more information, see the [update attribute group](/v3/product-catalog/api-reference/product-catalog/attribute-groups/update-attribute-group) page. ### Procedure 1. In the left menu, click **Product Catalog > Attributes > Product**. The Product Attributes page is displayed. 2. Click a product attribute that you want to delete. The edit attribute type page is displayed. 3. Click **Delete**. The **Delete attribute** popup is displayed. 4. Click **Yes, Delete**. The product attribute is deleted. ### Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) # Product Attributes Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview ## Overview Item attributes are used to define product characteristics. For example, a product name, an identity number, and a product description are all common attributes of a product. Attributes are key-value pairs, such as *Color: red*, that hold information for each property of the product. ‌ ## Attribute Types fabric supports the following types of attributes for storing product information: * **Text:** A sequence of characters. You may store any combination of text, numbers, or special characters. Text attribute has three subtypes: * Small text: For single-line text attributes. * Text Area: For multi-line text attributes. * HTML: For text area attributes that support HTML. * **Number Only:** An attribute type for values that are always a number. * **Date:** All date-related formats. Bulk import of the date attribute uses the date format selected when the attribute was created. Once selected, the date format can't be changed. If the format needs to be changed, you must delete the attribute and create it again using the required format. * **Boolean:** A Boolean value (true/false) for a product attribute. While importing attributes from an external system, make sure the true or false values are specified for all Boolean attribute types. * **List of Values:** A dropdown menu for product attributes that have defined values across the product list. Supports single selection or multiple selection from the dropdown. * **Serial:** An auto increment number-type attribute. You can specify the starting number and what the increment is. The following table shows the attribute types and their properties. This will help you determine the mandatory and optional properties of an attribute type. To ensure data quality, set up one or more validations based on the selected attribute type. | **Attributes** | **Text** | **Number Only** | **Date** | **Boolean** | **List of Values** | **Serial** | | --------------------------------- | -------- | --------------- | -------- | ----------- | ------------------ | ---------- | | Localize this attribute | Optional | Optional | Optional | Optional | Optional | Optional | | Attribute title | Required | Required | Required | Required | Required | Required | | Description | Optional | Optional | Optional | Optional | Optional | Optional | | Use JavaScript to calculate value | Optional | Optional | Optional | Optional | Optional | N/A | | Validations | Optional | Optional | Optional | Optional | Optional | N/A | | Is this attribute mandatory? | Required | Required | Required | Required | Required | Required | | Type of text | Required | N/A | N/A | N/A | N/A | N/A | | Date Format | N/A | N/A | Required | N/A | N/A | N/A | | Decimal | N/A | Optional | N/A | N/A | N/A | N/A | | Type of list | N/A | N/A | N/A | N/A | Required | N/A | After creating a category attribute, you cannot modify its attribute type. If you want to use a different attribute type, you must create a new product attribute with the required type. ## Calculation Formulas Businesses often require dynamically calculated attributes based on existing values. For example: 1. You can configure a product's display name to be *Product Name* + *by* + *Brand Name*, Instead of naming each product or variant individually. This formula automatically creates names for the products. 2. The area of a rug can be calculated by multiplying width with length and the price per square foot can be calculated by dividing the price attribute value by the area attribute value. 3. You can calculate weight per count by dividing the weight of the product by the total count of items inside the box. With low-code JavaScript formulas, these attribute values can be calculated automatically. Here are some frequently used formulas: | Operation | Calculation Formula | | ----------- | -------------------------------------------------------------------------------------------------------- | | Divide | `(async ()=> await attribute('attribute 1 ID') / await attribute('volume'))() ` | | Multiply | `(async ()=> await attribute('attribute ID') \* 10)()` | | Sum | `(async ()=> await attribute('attribute 1 ID') + await attribute('attribute 2 ID'))() ` | | Subtract | `(async ()=> await attribute('attribute 1 ID') - await attribute('attribute 2 ID'))()` | | Concatenate | `(async ()=> await attribute('attribute 1 ID') + " followed by " + await attribute('attribute 2 ID'))()` | Note that the values in double quotes (`" "`) represent the title of the reference attribute and refer to the absolute value of the attribute being used for calculation. ## Validation Formulas you can specify business validations on attributes using a low-code JavaScript formula and ensure data integrity and quality. This operation doesn't manipulate data, only validates fields for the attributes. | Validation Type | Validation Formula | | -------------------------------------------- | ----------------------------------------------------------------------------------------------- | | Number Validation | `(async ()=> await attribute() >=0 && await attribute()<=20 && await attribute()%0.25 === 0)()` | | String Validation | `(async ()=> (await attribute()).length < 200)()` | | Date (Greater than Equal to current Date) | `(async ()=> await attribute() >= new Date())()` | | Date (Greater than Equal to particular Date) | `(async ()=> await attribute() >= new Date('02/14/2021'))()` | Formulas are based on JavaScript syntax, so you can use all inbuilt JavaScript functions. For example, values given as a string can be stored as integers by using formulas such as `(async () => parseFloat(await attribute('Height (in)')) - parseFloat(await attribute('Weight (in)')) )()`. ## Related Topics * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Searching and Sorting Category Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/searching-and-sorting-category-attributes ### Overview The search, filter, and sort options on the **Category Attributes** page allow you to refine the list of category attributes or find a specific category attribute. You can use the filter option only if you have multiple category attributes. #### To search for a specific category attribute, do the following: 1. In the left menu, click **Product Catalog > Attribute > Category**. The **Category Attributes** page is displayed. 2. In the search field, enter a search term and press **Enter**. The results are displayed. #### To sort the list of category attributes, do the following: 1. In the left menu, click **Product Catalog > Attributes > Category**. The Category Attributes page is displayed. 2. Click one of the column headers to sort the list of category attributes. Sortable headers are **Attribute Title**, **Attribute Type**, **Last Modified**, and **Mandatory/Optional**. The category attributes list is sorted by the selected header. ### Related Topics * [Category Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute2) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute2) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute2) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute2) * [Managing Category Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/managing-category-attributes) # Searching and Sorting Product Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/attributes/searching-and-sorting-product-attributes The search, filter, and sort options on the **Product Attributes** page allow you to refine the list of product attributes or find a specific product attribute. You can use the filter option only if you have multiple product attributes. ## Prerequisites Ensure you have created or imported multiple product attribute. ### To search for a specific product attribute, do the following: 1. In the left menu, click **Product Catalog > Attribute > Product**. The **Product Attributes** page is displayed. 2. In the search field, enter the attribute title and press **Enter**. The results are displayed. ### To sort the list of product attributes, do the following: 1. In the left menu, click **Product Catalog > Attributes > Product**. The Product Attributes page is displayed. 2. Click one of the column headers to sort the list of product attributes. Sortable headers are **Attribute Title**, **Attribute Type**, **Last Modified**, and **Mandatory/Optional**. The product attributes list is sorted by the selected header. For finding an attribute ID, sort the product attributes list and use the find command by pressing Control + F on Windows or Command + F on Mac. There is no other direct method to find an attribute ID. ## Related Topics * [Product Attributes Overview](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) * [Adding a Text Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-text-attribute) * [Adding a Number Only Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-number-only-attribute) * [Adding a Date Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute) * [Adding a Boolean Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-boolean-attribute) * [Adding a List of Values Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute) * [Adding a Serial Attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-serial-attribute) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes) * [Managing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/managing-product-attributes) # Background Jobs Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/background-jobs/background-jobs With **Background Jobs**, you can view the history of all the files you have imported and exported in **Product Catalog**, as well as see real-time progress updates for these jobs. The summary of the job includes its status, type, and the date it was started and completed. The overview page also includes a link to download the original file. This feature enhances operational efficiency for users, such as Merchandising Managers and SI Developers, who manage product information. All import jobs are kept on file in your account for access later. The details of export jobs are only held for seven days. ### Related Topics * [Managing Background Jobs](/v3/product-catalog/user-guides/product-catalog/background-jobs/managing-background-jobs) * [Viewing Background Jobs History](/v3/product-catalog/user-guides/product-catalog/background-jobs/viewing-background-jobs-history) # Managing Background Jobs Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/background-jobs/managing-background-jobs The search, filter, and sort options on the **Background Jobs** page allow you to refine the list of items, find a specific job, or cancel a job. The **Background Jobs** page displays the following information: | Column Header | Description | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Job ID** | The unique identifier of the job. | | **File name** | The name of the file that was imported. This column is only available on the **Import** tab. | | **Import type** | The **Import type** column is only available on the **Import** tab. It displays the type of information that was exported, whether item, bundle, item variant, attribute, category, or collection. | | **Export type** | The **Export type** column is only available on the **Export** tab. It displays the type of information that was exported, whether item, bundle, item variant, attribute, category, or collection. | | **Job type** | The Job type column is only available on the **Other** tab. It displays the following information:

- **Product Update**: Collection Evaluation: When a product is updated, all collections are evaluated to identify which collection the product will be a part of.

- **Category Update**: Product Attribute: A job that's triggered every 20 minutes (unless the account is configured for a different time period) when product attributes assigned to a category are assigned or removed.

- **Collection Update**: Product Evaluation: When a collection is updated or created, this job evaluates all the rules against products and indexes all the products.

- **Product Update**: Category Assignment: Users can assign products to a different category in bulk. This job tracks those bulk category reassignments on products.

- **Product Denormalization**: fabric’s downstream domains, such as Orders, Offers, and Cart and Checkout, use denormalized data.

This job handles all the Product Catalog events and identifies a list of products that are updated due to these events and writes the denormalized data to OpenSearch for use downstream. | | **Message** | The system-generated message that gives one of the following outcomes of the background job:

- **Completed successfully**: The job is complete with no errors.

- **Partially completed with errors**: The job is partially complete and contains errors.

- **File contains errors**: The job is complete and contains errors.

- **Failed with Errors**: The job couldn't be completed because of major errors.

This message can only appear for jobs on the Other tab. | | **Status** | The status of the job. Statuses are color-coded and defined as follows:

- **Scheduled (grey)**: Job is scheduled to begin.

- **In progress (green)**: Job is currently running.

- **Completed (green)**: Job is complete with no errors.

- **Completed (orange)**: Job is complete but some errors were identified.

- **Failed (red)**: Job couldn't be completed and no rows were processed due to major errors. | | **Time started** | The date and time the job began. | | **Time completed** | The date and time the job completed. | ### Searching Jobs 1. In the left menu, click **Product Catalog > Background Jobs**. The **Import** tab on the **Background Jobs** page is displayed. 2. Select the type of jobs to search by doing one of the following: * To search imports, stay on the **Imports** tab. * To search exports, click the **Exports** tab. * The **Exports** tab is displayed. * To search other jobs, click the **Other** tab. * The **Other** tab is displayed. 3. Type a search term into the search bar and press **Enter**. The search field accepts the following queries: * Imports: Partial file name, full file name, or full job ID. * Exports: Partial file name, full file name, or full job ID. * Other jobs: Full job ID. The results are displayed. ### Filtering Jobs 1. In the left menu, click **Product Catalog > Background Jobs**.\ The **Import** tab on the **Background Jobs** page is displayed. 2. Select the type of jobs to filter by doing one of the following: * To filter imports, stay on the **Imports** tab. * To filter exports, click the **Exports** tab. * The **Exports** tab is displayed. * To filter other jobs, click the **Other** tab. * The **Other** tab is displayed. 3. Choose at least one of the following filters: * Click the **Date** field and select a range for the date the jobs were started or completed. * Click the **Status** field and select a status. * Depending on the type of jobs to filter that you selected in step 2, click the **Import type**, **Export type**, or **Job type** field and select a job type. Jobs that match the filters you chose are displayed. Click **Reset filters** to remove all filters. ### Sorting Jobs 1. In the left menu, click **Product Catalog > Background Jobs**.\ The **Import** tab on the **Jobs** page is displayed. 2. Select the type of jobs to sort by doing one of the following: * To sort imports, stay on the **Imports** tab. * To sort exports, click the **Exports** tab. * The **Exports** tab is displayed. * To sort other jobs, click the **Other** tab. * The **Other** tab is displayed. 3. Click one of the column headers to sort the list of jobs.\ All jobs can be sorted by **Job ID**, **Status**, **Time started**, and **Time completed**. In addition, import jobs can be sorted by **Import type**, export jobs can be sorted by **Export type**, and other jobs can be sorted by **Job type**. The jobs are sorted. ### Canceling Jobs The only type of background job that can be canceled is an item or item variant import. When a job is canceled, it stops processing after completing the row in progress. 1. In the left menu, click **Product Catalog > Background Jobs**. The **Import** tab on the **Background Jobs** page is displayed. 2. Mouse over the job you want to cancel and click the **X** icon. Note: The job must have a status of **In Progress** or **Scheduled** to be canceled. 3. The **Are you sure you want to cancel?** window is displayed. 4. Click **Yes, Cancel**. The job is canceled. ## Related Topics * [Background Jobs Overview](/v3/product-catalog/user-guides/product-catalog/background-jobs/background-jobs) * [Viewing Background Jobs History](/v3/product-catalog/user-guides/product-catalog/background-jobs/viewing-background-jobs-history) # Viewing Background Jobs History Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/background-jobs/viewing-background-jobs-history In Copilot, you can view the import history, export history, and real-time progress updates for **Product Catalog**. All import jobs are kept on file in your account for access later. The details of export jobs are only held for seven days. You can view job histories only if you have performed at least one import or export operation. ## Viewing Import History 1. In the left menu, click **Product Catalog > Background Jobs**.\ The **Import** tab on the **Background Jobs** page is displayed. 2. Click a **Job ID**.\ The summary page with the following details is displayed: * **Job type**: For import history details, this is always **import**. Also includes information on the type of import, whether item, bundle, item variant, attribute, category, or collection. * **Time started**: The date and time the import began. * **Time completed**: The date and time the import completed. * Three fields with dynamic names depending on the type of import. Items is used in the following example, but depending on the type of import, the fields could be labelled item, bundle, item variant, attribute, category, or collection. * **Item created**: The number of items created as a result of the import. * **Item updated**: The number of items updated as a result of the import. * **Items upsert with error**: The number of items upserted with errors as a result of the import. 3. (Optional) To download a copy of the original file, click **Download Original File**.\ A CSV file containing the import details is downloaded. 4. (Optional) If the import job had errors, to view the error report, click **Download Error Report**.\ A zip file is downloaded containing the original file that was uploaded as well as a the error report in CSV format. ## Viewing Export History 1. In the left menu, click **Product Catalog > Background Jobs**.\ The **Background Jobs** page is displayed. 2. Click **Export history**.\ The **Export history** tab is displayed. 3. Click a **Job ID**.\ The summary page with the following details is displayed: * **Job type**: For export history details, this is always **export**. Also includes information on the type of export, whether item, bundle, item variant, attribute, category, or collection. * **Time started**: The date and time the export began. * **Time completed**: The date and time the export completed. 4. (Optional) To download a copy of the original file, click **Download Original File**.\ A CSV file containing the export details is downloaded. 5. (Optional) If the export job had errors, to view the error report, click **Download Error Report**.\ A zip file is downloaded containing the original file that was uploaded as well as a the error report in CSV format. ## Viewing Other Jobs History 1. In the left menu, click **Product Catalog > Background Jobs**.\ The **Background Jobs** page is displayed. 2. Click **Other**.\ The **Other** tab is displayed. 3. Click a **Job ID**.\ The summary page with the following details is displayed: * **Product Update: Collection Evaluation:** When a product is updated, all collections are evaluated to identify which collection the product will be a part of. * **Category Update: Product Attribute:** A job that's triggered every 20 minutes (unless the account is configured for a different time period) when product attributes assigned to a category are assigned or removed. * **Collection Update: Product Evaluation:** When a collection is updated or created, this job evaluates all the rules against products and indexes all the products. * **Product Update: Category Assignment:** Users can assign products to a different category in bulk. This job tracks those bulk category reassignments on products. * **Product Denormalization:** fabric's downstream domains, such as Orders, Offers, and Cart and Checkout, use denormalized data. This job handles all the Product Catalog events and identifies a list of products that are updated due to these events and writes the denormalized data to OpenSearch for use downstream. * **Product Update: Publish:** This job runs when you publish one or more items or bundles using the bulk publish feature. After all necessary updates are processed, the products become available across domains. * **Product Update: Unpublish:** This job runs when you unpublish one or more items or bundles using the bulk unpublish feature. It removes the products from active availability across domains. ## Related Topics * [Background Jobs Overview](/v3/product-catalog/user-guides/product-catalog/background-jobs/background-jobs) * [Managing Background Jobs](/v3/product-catalog/user-guides/product-catalog/background-jobs/managing-background-jobs) # Adding a Category Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category ### Overview Categories are hierarchical tree structures that allow you to organize items, variants, and bundles into groups based on similar attributes. This document covers how to create a single category using the Copilot interface. You can also add multiple categories at the same time by [importing them](/v3/guides/product-catalog/categories/importing-categories) using a CSV file. ### Prerequisites Ensure that you have access to the **Product Catalog** in Copilot. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Categories**.\ The Categories page is displayed. 2. Click the **+** icon. 3. Enter a title for the new category and press **Enter** or click the **?** icon.\ The new category is created. 4. (Optional) Click the new category name, and then click the **+** icon on the right to create a new subcategory.\ The new subcategory is created. When you click a root category, all subcategories within the root category are displayed at the right. A **leaf** label is used to indicate any category or subcategory that doesn't contain a subcategory. ### Related Topics * [Categories Overview](/v3/product-catalog/user-guides/product-catalog/categories/overview) * [Importing Categories](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories) * [Managing Categories](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories) # Importing Categories Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/categories/importing-categories Categories are hierarchical tree structures that allow you to organize items, variants, and bundles into groups based on similar attributes. This document covers the process of importing multiple categories using a CSV file. You can also [add categories individually](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category). ## CSV File Guidelines You can import categories using CSV files only, fabric doesn't support any other data or file formats. Here are the key points to consider: * The headers, represented in the first row of the CSV file, should match the attributes of the category. * While category titles aren't case-sensitive, maintaining case consistency with the original category titles is recommended. * Empty rows and columns are ignored. * fabric recommends that you download the template file to use as a guide when creating your own CSV file for import to minimize errors during the import process. ## Category Data Formatting When preparing your CSV file for import, ensure that the category data format aligns with the column requirements. Different columns have specific data input requirements: | **Header** | **Description** | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Action** | Accepts one of the following commands:
  • **Create**: Adds a new category.
  • **Update**: Replaces the details of an existing category.
  • **Upsert**: Creates a new category or replaces the details of an existing category. If no action is specified for a row, upsert is the default action.
  • **Delete**: Removes an existing category.
If the field is blank, the default value is Create. | | **Node ID** | Represents the Category ID.
  • When creating a category, this field must be left blank; otherwise, an error will occur.
  • When updating, upserting, or deleting a category, enter the **Node ID** or **Node Name**.
| | **Parent Category** | Specifies the parent category for the new category you want to create or update unless you are creating a primary or root category. | | **Node Name** | Specifies the name of the root, branch, or leaf categories being created or updated. | | **Order** | Specifies the order in which a category should appear among sibling categories. If multiple categories share the same order, the newly added ones appear in alphabetical order. | | **Product Attributes** | Specifies the attributes of products associated with a category. You must assign relevant product attributes to categories. For more information on assigning product attributes in Copilot, see the [Adding Product Attributes](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories#adding-product-attributes) section. | | **Category Attributes** | Specifies the attributes of a category. You must assign relevant category attributes to categories. For more information on assigning category attributes in Copilot, see the [Adding Category Attributes](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories#adding-category-attributes) section. | ### Example Category import supports up to two category levels. For example, if you have the category **Dog > Food > Wet Food**, the third level, **Wet Food**, won't be imported. You must manually add categories through Copilot starting from the third level. For more information on adding categories using Copilot, see the [Adding a Category](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category) page. | **Action** | **Node ID** | **Parent Category** | **Node Name** | **Order** | **Product Attributes** | **Category Attributes** | | ---------- | ----------- | ------------------- | ------------- | --------- | ---------------------- | ----------------------- | | Create | | | Dog | 1 | salmon; beef; chicken | wet food | | Create | | Dog | Food | 1 | salmon; beef; chicken | wet food | | Create | | | Cat | 1 | salmon; beef; chicken | wet food | | Create | | Cat | Food | 1 | salmon; beef; chicken | wet food | ## Prerequisites Ensure that you have access to **Product Catalog** in Copilot. For more information, see the Product Catalog [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-roles) page. ## Procedure Importing a CSV file will overwrite existing data. To preserve your data, use your previously imported CSV file, add the new categories to it, and rename the file. For more information on downloading the import file, see the [Viewing Import History](/v3/product-catalog/user-guides/product-catalog/background-jobs/viewing-background-jobs-history) section. 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Click **Import**.\ The **Import CSV file** window is displayed. This window provides a link to download an example template for the CSV file. 3. Download the sample template by clicking **template here**. 4. To import a CSV file, do one of the following: * Drag and drop the CSV file into the window. * Click **Select a File from your computer**. 5. Click **Import file**. The CSV file is imported and the changes you indicated to your categories are made. ## Related Topics * [Categories Overview](/v3/product-catalog/user-guides/product-catalog/categories/overview) * [Adding a Category](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category) * [Managing Categories](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories) # Managing Categories Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/categories/managing-categories ## Overview Categories are hierarchical tree structures that allow you to organize items, variants, and bundles into groups based on similar attributes. This document covers the process of adding attributes to categories, renaming categories, and deleting categories. ## Adding Product Attributes ### Overview Item attributes are the attributes that an item, also called a product, must have configured in order to be added to a category. Individual item attributes are set up in the Attributes section. Those product attributes can then be added to a category using the procedure below. As an example, a home décor company might have a category for rugs and want to require any items added to that category to have length and width information. The attributes for dimensions would be set up in **Product Catalog > Attributes > Product** and then added to a category in **Product Catalog > Categories**. It's required to set up a category’s product attributes prior to adding any items to it. If a category is missing item attributes, no item can be created for that category. ### Procedure 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Mouse over the desired category and click the vertical ellipses (**⋮**) at the right. 3. Click **Product attributes**.\ The **Product attributes** menu is displayed. 4. Click the **Add Product Attributes** dropdown.\ The dropdown displays a list of category attributes as created in **Product Catalog > Attributes > Product**. 5. To add an attribute, click its corresponding checkbox. Note that system-mandatory attributes are separated for easier management. These attributes are shown by default, but need to be saved so that you can add to the category. You can add as many attributes as needed up to a maximum of 60 attributes per each session. If you want to add more attributes, you must click **Save** and repeat this step. 6\. (Optional) To the right of a product attribute, click the vertical ellipses (**⋮**) and do the following: * To make the attribute mandatory, click **Make attribute mandatory**. * To remove the attribute, click **Remove attribute**. 7. Click **Save**. The category attributes you selected are applied to the category and all its subcategories. ## Adding Category Attributes ### Overview Category attributes allow you to apply a group of attributes to your category hierarchy. These attribute groups are set up in **Product Catalog > Attributes > Category**. You can apply category attributes at the root level of your category hierarchy or at the subcategory level. Subcategories inherit the category attributes applied to the parent category unless you select a different group of category attributes at the subcategory level. ### Procedure 1. In the left menu, click **Product Catalog > Categories**.\ The Categories page is displayed. 2. On the desired category click the vertical ellipses (**⋮**) at the right. To apply category attributes to the entire category hierarchy, click the vertical ellipses to the right of the Root menu. 3. Click **Category attributes**.\ The **Category Attributes** menu is displayed. 4. Click the **Add Category Attributes** dropdown. The dropdown menu displays a list of category attributes that are created in the **Product Catalog > Attributes > Category** page. 5. To add an attribute, click its corresponding checkbox. You can add up to 60 attributes per session. To add more attributes, you must click **Save** and repeat this step. 6. Click **Save**. The category attributes that you selected are applied to the category and its subcategories. ## Removing Attributes from Category You can remove category attributes at the root level of your category hierarchy or at the subcategory level. With the following procedure, you can remove one attribute at a time. To update or remove multiple attributes at once, [import an attributes CSV](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories) file for categories. The import process overwrites existing data, so any attributes not included in the file will be removed. ### Removing a category attribute 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Click the vertical ellipsis (**⋮**) on the right of the category that you want to modify. To remove category attributes from the entire category hierarchy, click the vertical ellipsis (**⋮**) next to the **Root** menu. 3. Click **Category attributes**.\ The **Category attributes** window is displayed. 4. In the **Category Attributes** section, click the vertical ellipsis (**⋮**) next to the attribute you want to remove. 5. Click **Remove attribute**. 6. Click **Save**. The category attribute is removed from the category. ## Removing a product attribute Product attributes inherited from a parent category can't be removed at the subcategory level. To remove them, you must remove them from the parent category. 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Find the category you want to modify and click the vertical ellipsis (**⋮**) on the right.\ To remove product attributes from the entire category hierarchy, click the vertical ellipsis (**⋮**) next to the **Root** menu. 3. Click **Product attributes**.\ The **Product attributes** window is displayed. 4. In the **Product Attributes** section, click the vertical ellipsis (**⋮**) next to the attribute you want to remove. 5. (Optional) If the product attribute is mandatory, click **Make attribute non mandatory**. 6. Click **Remove attribute**.\ If you can't click **Remove attribute**, ensure that the product attribute isn't inherited or mandatory. 7. Click **Save**. The product attribute is removed from the category. ## Viewing Items in a Category 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Click the vertical ellipses (**⋮**) at the right of the desired category. 3. Click **View Items**. The list of all items belonging to the selected category and its subcategories is displayed. ## Renaming a Category 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Click the vertical ellipses (**⋮**) at the right of the desired category. 3. Click **Rename**. 4. Enter a new name. 5. Press **Enter**. The category name is updated. ## Deleting a Category 1. In the left menu, click **Product Catalog > Categories**.\ The **Categories** page is displayed. 2. Click the vertical ellipses (**⋮**) at the right of the desired category. 3. Click **Delete**. 4. Click **Yes, Delete**. The category is deleted. ## Related Topics * [Categories Overview](/v3/product-catalog/user-guides/product-catalog/categories/overview) * [Adding a Category](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category) * [Importing Categories](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories) # Categories Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/categories/overview Categories define the structure of product organization within **Product Catalog**, allowing merchants to group products logically based on shared attributes. Using a hierarchical tree structure, categories help create navigable and scalable product groupings. Each product in Product Catalog, whether an item, a variant, or a bundle, must be assigned to a category or subcategory when it's created. A product can only be assigned to one category or subcategory at a time. There is no limit to the number of categories or subcategories you can create. ## Tree Analogy Categories and subcategories can be best explained with the tree analogy. For instance, consider *furniture* as the main category or root, the branches are subcategories such as *tables* and *chairs*, and the leaves represent individual products. In this example, a leaf could be an oak dining table that seats four. Visually, it looks like this: > * Root: Furniture > * Branch: Tables > * Leaf: Dining Tables > * Product: Oak dining table seating 4 > * Product: Oak dining table seating 6 > * Leaf: Coffee Tables > * Product: Oak coffee table > * Product: Oak coffee table, glass top > * Branch: Chairs > * Leaf: Dining Chairs > * Product: Oak dining chair > * Product: Oak dining chair, with arms > * Leaf: Office Chairs > * Product: Computer chair > * Product: Computer chair, reclining Any attribute applied to a category is inherited by its subcategories, known as attribute inheritance. However, inherited attributes can be overwritten by assigning the attribute to the subcategory itself. For example, the broad *office chairs* category could have a *material* attribute set to *leather*, but a specific subcategory could be set to *nylon*. ## Related Topics * [Adding a Category](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category) * [Importing Categories](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories) * [Managing Categories](/v3/product-catalog/user-guides/product-catalog/categories/managing-categories) # Adding Category Attributes to a Collection Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes Category attributes define specific characteristics of a category, describing items within it. Using categories, you can organize products into a tree structure of subcategories, with each item belonging to a category or subcategory. ## Procedure 1. In the left menu, click **Product Catalog > Collections**.\ The **Collections** page is displayed. 2. Click a collection.\ The **Collection Preview** page is displayed. 3. Mouse over the collection and click the pencil icon. The **Manage** menu is displayed. 4. Click the **Add category attribute** field and select a category attribute. 5. Enter a corresponding value for the category attribute. 6. Click **Save**. The category attributes are added to the collection. ## Related Topics * [Collections Overview](/v3/product-catalog/user-guides/product-catalog/collections/collections) * [Creating a Collection](/v3/product-catalog/user-guides/product-catalog/collections/creating-a-collection) * [Importing Collections](/v3/product-catalog/user-guides/product-catalog/collections/importing-collections) * [Managing Collections](/v3/product-catalog/user-guides/product-catalog/collections/managing-collections) # Collections Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/collections/collections Collections in Product Catalog are a flexible tool to group products to meet dynamic merchandising purposes on a storefront. Unlike categories, which provide a fixed, hierarchical structure, collections reflect flexible grouping of products for display on a storefront based on specific themes, promotions, or attributes. Collections enable you to aggregate products from multiple categories. You can further refine the curated list based on attributes. ## Key Features of Collections * **Dynamic Grouping**: After the rules for a collection are defined, you don't need to refresh or re-run the collection to have an accurate list of products when the catalog is refreshed. When new products are added to the catalog or existing products are updated to match collection rules, they will appear in the collection automatically. * **Attribute-based Rules**: You can set up collections by defining rules based on product attributes , for example price range, brand, or availability. This allows for precise targeting and segmentation, helping you create custom displays that align with merchandising strategies. ## Collections vs Categories While both collections and categories help organize products, they serve different purposes: * [Categories](/v3/guides/product-catalog/categories/categories_overview) provide a foundational, static structure for products, making it easier for users to navigate a catalog in a structured, hierarchical way. For example, *Furniture > Living Room > Sofas*. * Collections offer flexibility, allowing you to aggregate products from multiple categories into a single, curated list, perfect for promotional or thematic displays on a storefront. For example, a page on the storefront could showcase items from all categories made by a specific manufacturer, or a sale on sectional sofas. ## Rules and Conditions Collections are set up by selecting the categories that contain the products that you want to include in the collection. You can further refine the products from those categories based on their attributes using customizable rules and conditions. Conditions consist of a product attribute, a validation option, and a value. For example, if you want to create a collection of only red items, you must set the condition for the product attribute to *color*, the validation option to *is exact match*, and the value to *red*. The [product attribute](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) and value in conditions are user-specified. The following table lists the fabric-generated validation options: | **Validation Option** | **Description** | | ----------------------- | -------------------------------------------------------------------------- | | **Is equal to** | The product attribute must match the specified value exactly. | | **Is greater than** | The product attribute must be greater than the specified value. | | **Is less than** | The product attribute must be less than the specified value. | | **Includes** | The product attribute must include the specified value. | | **Excludes** | The product attribute must exclude the specified value. | | **Contains** | The product attribute must contain a partial match to the specified value. | | **Contains exact word** | The product attribute must contain the exact word specified. | | **Does not contain** | The product attribute must not include the specified value. | | **Is exact match** | The product attribute must match the specified value exactly. | | **Yes** | The product attribute must be marked as *true*. | | **No** | The product attribute must be marked as *false*. | The relationships between conditions within a rule are governed by *AND* and *OR* operators so that you can create precise inclusion or exclusion rules. For example, a rule with conditions based on *AND* logic might require that a product be large and green and made in the USA. A rule with conditions that include *OR* logic might require that a product be large and green or blue. A collection can contain up to five rules, with each rule containing up to five conditions. Rules can only be joined together with an *AND* operator. ## Use Cases A furniture store with a diverse range of products needs to drive sales by promoting specific types of sofas from its extensive Product Catalog. While the store’s catalog is organized by broad categories, such as *Sofas*, these general categories don’t effectively highlight certain products for promotional events. The store wants to feature only a select type of sofa within its broad Sofas category to align with current market trends and customer interests. The following use cases demonstrate two scenarios: one in which conditions are joined with the *AND* operator, and another in which conditions are joined with the *OR* operator. ### Scenario 1: Creating a targeted sofa collection with AND operators In this scenario, the store wants to create a collection of sofas that meet all specified conditions, narrowing down the selection to a precise product type for a focused promotion. The goal is to quickly create a collection of sofas that are: * *Sectional* in style * *Not powered* * Not made of *leather* * Manufactured by *Top Brand* * Belonging to the *Windham* product line Using a collection, the store can set up this sale within the *Sofas* category by applying a single rule with multiple conditions that precisely define the products to be included. Here’s how each condition helps narrow down the products in the category to create a tailored collection: * Condition 1 * Product Attribute: *Style* * Validation Option: *Is exact match* * Value: *Sectional* * Condition 2 * Product Attribute: *Powered* * Validation Option: *Is equal to* * Value: *False* * Condition 3 * Product Attribute: *Material* * Validation Option: *Does not contain* * Value: *Leather* * Condition 4 * Product Attribute: *Brand* * Validation Option: *Includes* * Value: *Top Brand* * Condition 5 * Product Attribute: *Line* * Validation Option: *Includes* * Value: *Windham* In this collection, *AND* logic is used across all conditions, ensuring that the included products are sectional sofas that are non-powered, non-leather, and exclusively from the Windham line by Top Brand. ### Scenario 2: Expanding a sofa collection with OR operators In this scenario, the store wants to broaden the selection for a promotion by including sofas that meet at least one of several material options, allowing for greater flexibility. The goal is to create a collection of sofas that are: * *Sectional* in style * Made of *leather* * Made of *microfiber* Here’s how each condition would be structured to create this broader collection: * Condition 1 * Product Attribute: *Style* * Validation Option: *Is exact match* * Value: *Sectional* * Condition 2 * Product Attribute: *Material* * Validation Option: *Is equal to* * Value: *Leather* * Condition 3 * Product Attribute: *Material* * Validation Option: *Is equal to* * Value: *Microfiber* In this collection, *AND* logic is used between Conditions 1 and 2, with *OR* logic joining Conditions 2 and 3, ensuring that the included products are sectional sofas that are either leather or microfiber. ## Related Topics * [Creating a Collection](/v3/product-catalog/user-guides/product-catalog/collections/creating-a-collection) * [Importing Collections](/v3/product-catalog/user-guides/product-catalog/collections/importing-collections) * [Managing Collections](/v3/product-catalog/user-guides/product-catalog/collections/managing-collections) * [Adding Category Attributes to a Collection](/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes) # Creating a Collection Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/collections/creating-a-collection This topic covers the process of creating a collection. Collections are most effective when you’ve fully configured your Product Catalog elements. Before creating a collection, it’s helpful to have the following in place: * [Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview): Setting up product attributes enables you to refine collections based on these specific product characteristics, such as style, material, or brand. * [Products](/v3/product-catalog/user-guides/product-catalog/list/items/items): Adding products and [assigning product attributes to them](/v3/guides/product-catalog/list/items/adding-an-item) ensures that collections capture the right products. * [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview): Organizing your products into categories provides a foundation for building collections and makes it easier to select relevant products. With these elements set up, you’ll be able to define collection rules and conditions more precisely, making it easier to organize products according to specific criteria. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Product Catalog. For more detailed information on these settings, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-products-roles). ## Procedure 1. In the left menu, click **Product Catalog > Collections**. * The **Collections** page is displayed. 2. Click **Create Collection**. * The **Basic details** section on the **Create Collection** page is displayed. 3. In the **Collection name** field, enter a name. 4. To add one or more categories, in the **Your Catalog categories** section: * Select categories in the pre-populated list. * Search for the name of the category and selecting one or more of the matching categories in the results. 5. Click **Next**. * The **Choose products for your collection** section is displayed with a list of products in the categories you selected. You can select categories you want to add or remove by using the **Category** filter. 1. To define the rules and conditions that determine which products are included in the collection, select **Attributes & Values**. 2. To set up the first rule, in the **Attributes & Values** > **Rule 1**, and do the following: 1. In the **If attribute** field, select an attribute. 2. In the **Validation** field, select a validation option. 3. In the **Value** field, enter a value. 4. If you want to join this rule with a condition, click **Add Condition** and click **AND** or **OR**. You can include up to five conditions within a single rule. Repeat these steps as needed to create up to five rules per collection. You can't have an empty rule. If a rule is empty, the **Apply** button is disabled. 5. (Optional) To create a new rule, click **Add Rule** and fill out the condition fields as required. 6. Click **Apply**. 3. Click **Next**. * The **Review and add products to your collection** section is displayed. 4. Click **Save**. * The **Automatically create sub-collections?** window is displayed. Do one of the following: * To enable automatic organization of your collection into sub-collections based on the categories it contains, click **Yes, Create**. * To organize your collection into sub-collections manually, click **No, Create My Own**. The Collection Preview page is displayed. If you want to make changes to the sub-collections, follow the steps to [create a Sub-Collection](/v3/product-catalog/user-guides/product-catalog/collections/managing-collections#creating-a-sub-collection). 5. To activate click the **Inactive** button. The collection is activated. 6. Click **Run Collection**. The collection is created. If you are adding category attributes to the collection, see [Adding Category Attributes to a Collection](/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes). ## Related Topics * [Collections Overview](/v3/product-catalog/user-guides/product-catalog/collections/collections) * [Importing Collections](/v3/product-catalog/user-guides/product-catalog/collections/importing-collections) * [Managing Collections](/v3/product-catalog/user-guides/product-catalog/collections/managing-collections) * [Adding Category Attributes to a Collection](/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes) # Importing Collections Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/collections/importing-collections Collections serve as an alternative to categories for organizing products, especially useful for short-term merchandising campaigns. This topic covers the process of importing multiple collections with a CSV file. You can also add collections individually. We highly recommend that you download the template file to use as a guide when creating your CSV file for import to minimize errors during the import process. ### CSV File Guidelines You can import collections using CSV files only; Product Catalog doesn't support any other data or file formats. Here are the key points to consider: * The headers, represented in the first row of the CSV file, should match the attributes of the collection. * While collection titles aren't case-sensitive, maintaining case consistency with the original collection titles is recommended. * Empty rows and columns are ignored. ### Collection Data Formatting When preparing your CSV file for import, ensure that the collection data format aligns with the column requirements. Different columns have specific data input requirements: * **Action:** Accepts one of the following commands: * Create adds a new collection. * Update replaces the details of an existing collection. * Upsert creates a new collection or replaces the details of an existing collection. Note that if no action is specified for a row, upsert is considered the default. * **Node ID:** Represents the Collection ID. * **Parent Collection:** Unless you are creating a primary or root collection, specify the parent category for the new collection you want to create or update. * **Node Name:** Name of the root, branch, or leaf collection that you are creating or updating. * **Order:** The order in which a given collection must appear among sibling collections. If multiple collections are assigned the same order, the newly added collections appear in alphabetical order. * **Category Attributes:** Attributes that are assigned to the Collection. * **Categories Included:** Categories to include when creating the collection. * **Categories Excluded:** Categories to exclude when creating the collection. * **Product Attribute Filters:** Attribute conditions that filter the eligible products for the Collection node. Filter operations are dependent on the attribute type. | Attribute Type | Available Operations | | -------------- | ------------------------------------------ | | Text | Contains, Doesn't contain, Is exact match | | Number | Is equal to, Is less than, Is greater than | | List of Value | Includes, Excludes | | Boolean | Yes, No | | Date | Is equal to, Is less than, Is greater than | | Serial | Is equal to, Is less than, Is greater than | ### Example file | Action | Node Id | Parent Category | Node Name | Order | Category Attributes | Categories Included | Categories Excluded | Product Attribute Filters | | | | ------ | -------------- | --------------------------- | ----------------- | ----- | ------------------------ | ------------------------------------ | ------------------- | ---------------------------------------------- | - | - | | Create | 12345645648689 | | Import-collection | 1 | Collection SEO=SEO Value | category date YYYY-MM-DD=2024-03-22; | | | | | | | | Import-collection | Parent-1 | 1 | Furniture,Accessories | | | | | | | | | Import-collection->Parent-1 | Child 1 | 1 | | Furniture>Desks | | name=Description; op=CONTAINS; value=furniture | | | | | | Import-collection->Parent-1 | Child 2 | 2 | | Furniture>Chairs | | name=Color; op=ISEXACTMATCH; value=Brown | | | ## Prerequisites Before initiating the item import, ensure that: * You have created at least one category with items and attributes assigned to it. For more information about creating categories, see the Categories section. * The CSV file adheres to the guidelines. ## Procedure 1. In the left menu, click **Product Catalog > Collections**. The **Collections** page is displayed. 2. Click **Import Collection**. The **Import CSV file** window is displayed. 3. (Optional) To download the template, click **template here**. The template is downloaded. 4. To import a CSV file, do one of the following: * Drag and drop the file into the window. * Click **Select a File** from your computer. 5. Click **Import file**. The CSV file is imported and the collection is created. To track the import status, go to **Product Catalog > Background Jobs > Imports** page. ## Related Topics * [Collections Overview](/v3/product-catalog/user-guides/product-catalog/collections/collections) * [Creating a Collection](/v3/product-catalog/user-guides/product-catalog/collections/creating-a-collection) * [Managing Collections](/v3/product-catalog/user-guides/product-catalog/collections/managing-collections) * [Adding Category Attributes to a Collection](/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes) # Managing Collections Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/collections/managing-collections This topic covers the process of editing collections, creating sub-collections, and deleting collections and sub-collections. ## Prerequisites Ensure you have created at least one collection. ### Sorting collections You can sort collections and sub-collections alphabetically in either ascending or descending order. 1. In the left menu, click **Product Catalog > Attributes > Collections**. The **Collections** page is displayed. 2. Click a collection. The **Collection Preview** page is displayed. 3. Click the arrow next to the name of the collection or sub-collection to sort. The collections are sorted. ### Editing a collection 1. In the left menu, click **Product Catalog > Attributes > Collections**. The **Collections** page is displayed. 2. Click a collection. The **Collection Preview** page is displayed. 3. Click **Manage Products** for the desired collection. The add products window is displayed. 4. Edit the **Category**, **Attributes & Values**, and **Status** filters as required. 5. Click **Add Products**. 6. Click **Run Collection**. The collection is updated. ### Creating a sub-collection 1. In the left menu, click **Product Catalog > Attributes > Collections**. The **Collections** page is displayed. 2. Click a collection. The **Collection Preview** page is displayed. 3. Click the collection to create a sub-collection for. A new column for the next level of the collection is displayed to the right with the outline of a new sub-collection. 4. Click the plus sign (**+**) icon inside the outline of the new sub-collection. 5. In the **Enter name** field, give the sub-collection a name and press **Enter**. 6. To add categories and products, click **Manage Products**. The add products window is displayed. 7. Edit the **Category**, **Attributes & Values**, and **Status** filters as required. 8. Click **Add Products**. 9. Click **Run Collection**. The sub-collection is created. ### Deleting a collection or sub-collection 1. In the left menu, click **Product Catalog > Attributes > Collections**. * The **Collections** page is displayed. 2. Click a collection. * The **Collection Preview** page is displayed. 3. Mouse over a sub-collection and click the trash can icon. * The **Delete Collection** window is displayed. Note: Deleting a sub-collection also deletes any sub-collections it contains. 4. Click **Yes, Delete**. The collection is deleted. ## Related Topics * [Collections Overview](/v3/product-catalog/user-guides/product-catalog/collections/collections) * [Creating a Collection](/v3/product-catalog/user-guides/product-catalog/collections/creating-a-collection) * [Importing Collections](/v3/product-catalog/user-guides/product-catalog/collections/importing-collections) * [Adding Category Attributes to a Collection](/v3/product-catalog/user-guides/product-catalog/collections/adding-category-attributes) # Data Ingestion Best Practices Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/data-ingestion-best-practices ## Overview Optimized data management is at the core of every successful e-commerce operation. For fabric users managing extensive product catalogs, finely tuned data ingestion is paramount. Adhering to fabric’s best practices will ensure the fastest processing speed, optimum resource management, and enhanced accuracy when importing your data. This topic covers subjects such as file size restrictions, types of import actions, reconciling errors, and most importantly, the best method of data ingestion: **delta updates**. ## File Size and Upload Guidelines Before you upload your first file, it's important to understand file size restrictions and how fabric handles files that exceed those restrictions. * **No files larger than 300MB** Limit the size of your uploads to 300MB. * **Split files larger than 300MB into smaller ones** Splitting large files into smaller ones before uploading them is the quickest way to import large amounts of data. For fastest processing, the ideal file size is between 80-100MB. * **Parallel processing** fabric can process multiple files in parallel. The number of parallel files depends on your package. When the limit has been reached, subsequent files will be in a “scheduled” status until moved into the queue. Reach out to your account representative to learn more. * **Automatic file chunking is available** fabric can automatically chunk files larger than 300MB into smaller files to improve performance. This feature is only available in select packages. Reach out to your account representative to learn more. ## Delta Updates A delta update involves transmitting only the changed data fields when making an update. This is in contrast to the more traditional “full feed” updates that send the entire dataset. By sending only the changed data fields, fabric can process updates without reprocessing unchanged data. **Delta updates are the preferred method for all uploads.** ### Delta updates vs. full feed updates | | Full Feed Data Updates | Delta Data Updates | | -------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------- | | **Resource Usage** | Requires more resources | Requires fewer resources | | **Processing Time** | Longer processing time | Shorter processing time | | **Data Transmission** | Transmits entire dataset | Transmits only modified data fields | | **Network Bandwidth** | Consumes more network bandwidth | Requires less network bandwidth | | **Storage** | Requires more storage space | Requires less storage space | | **Error Handling** | Prone to errors during full data transmission | Less prone to errors due to focused updates | | **Scalability** | Less scalable for large datasets | More scalable, especially for large datasets | | **Data Accuracy** | Potential for data redundancy and inconsistency | Enhances data accuracy by focusing on changes | | **Operational Efficiency** | Lower operational efficiency due to higher resource consumption | Higher operational efficiency due to optimized resource usage | | **Incremental Updates** | Updates entire dataset each time | Updates only modified data fields incrementally | ## Ways to Import Data You can import data into fabric using the following methods: * CSV import using API * Import using RESTful APIs * CSV import using the Copilot interface The import method you choose is up to you, but in each case, uploading smaller files and using the delta update method will result in quicker processing, better resource management, and a higher degree of accuracy. ## Data Formatting It's crucial to make sure your dataset is accurate and compatible with fabric’s formatting before initiating the upload process. Validate your data to avoid errors by reviewing the file to identify any changes since the last upload and confirm that the data structure and format are correct. See the following pages for formatting guidelines: * [Importing Items](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items#csv-file-guidelines) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles#csv-file-guidelines) * [Importing Product Attributes](/v3/product-catalog/user-guides/product-catalog/attributes/importing-product-attributes#attribute-data-formatting) * [Importing Categories](/v3/product-catalog/user-guides/product-catalog/categories/importing-categories#csv-file-guidelines) ## Import Actions The actions you use when importing items, bundles, categories, and collections tell fabric how you are modifying your data. The following actions are available: * **UPSERT:** Creates a new product if the product doesn't exist, or it updates an existing product. * **CREATE:** Creates a new product. * **UPDATE:** Updates existing product. * **PUBLISH:** Publishes an existing product that was in draft state. The product is published to the storefront. * **UNPUBLISH\_KEEP\_DRAFT:** Unpublishes an existing product. If the product already has a draft version, the live version is unpublished and discarded. If product doesn't already have a draft version, the live version is unpublished and saved as a draft. * **UNPUBLISH\_KEEP\_LIVE:** Unpublishes an existing product. If the product already has a draft version, the draft version is discarded. * **DELETE:** Deletes the existing product. * **ATTACH\_VARIANT:** Adds variants to an existing parent product. The variant column holds the variant to be attached to the SKU. * **DETACH\_VARIANT:** Detaches existing variants. The variant column holds the variant to be detached from the SKU. * **CHANGE\_CATEGORY:** Updates the category of existing product. * **ATTACH\_CHANNELS:** Appends listed channels to the product, allowing it to be available across various sales channels. You can specify the channels to be attached in the Channels column. After attaching channels, users should verify the attachment post-action to confirm the successful addition of channels to the product. * **DETACH\_CHANNELS:** Removes listed channels from a product. Users specify the channels to be detached in the Channels column. This action is useful when a product needs to be removed from specific sales channels while remaining available on others. Users should verify the detachment of channels post-action to ensure the desired channels are removed from the product. ## Reconciling Errors If there are errors during processing, download the error file and review each error to identify the problem. Correct the errors by updating the CSV file with the necessary changes and validate the corrected CSV file before re-importing. * [Troubleshooting Item Imports](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items#troubleshooting) * [Troubleshooting Bundle Imports](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles#troubleshooting) # Adding a Bundle Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle Bundles are two or more products sold together. Creating a bundle allows you to group products that are exclusively sold together or group products that can be purchased together and separately. This document covers the process of adding a single bundle. To add multiple bundles at the same time, see Import Bundles. ## Prerequisites Ensure that you have: * Set up at least one product attribute group. For more information about creating product attributes, see the [Product attributes section](/v3/product-catalog/user-guides/product-catalog/attributes/attributes). * Created at least one leaf category to add the bundle to. For more information about creating categories, see the [Categories section](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category). * Created at least two items. For more information about creating items, see [Adding an Item](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item) or [Importing Items](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items). ## Procedure 1. In the left menu, click **Product Catalog > List > Bundles**.\ The **Bundles** page is displayed. 2. Click **New Bundle**.\ The **Select a leaf category** window is displayed. This window shows the root categories and leaf categories that are configured in the Categories page. 3. Select a leaf category. Leaf categories are labeled **leaf**. You must click a root category to view the leaf categories within that category. If a root category has more root categories within it, you might have to continue selecting root categories until you can select a leaf category. 4. Click **Next**.\ The attribute groups you have created and mapped are displayed based on the configuration in the Attributes page. 5. To edit an attribute group, click the **Edit** button next to the attribute group name. * In the **Edit Attributes** window, enter the required details. * Click **Save**.\ If you want to use more than one attribute group, repeat the above steps for all of those attribute groups. 6. Click **Bundle items**.\ The **Bundle items** tab is displayed. 7. Click **Add items**.\ The **Add items** page is displayed, showing the items in your product list. 8. Select the items to add to the bundle. 9. (Optional) Click **Select individual variants**.\ The **Select individual variants** tab is displayed. 10. (Optional) Select the item variants to add to the bundle. 11. Click **Save**. 12. Click the Bundle name in the breadcrumb at the top of the page.\ The **Edit Bundle** page is displayed. 13. (Optional) If internationalization is enabled, from the language dropdown menu, select the desired language variant for the item. 14. (Optional) Click **Publish**. The bundle is published and moved from draft to active state. ## Related Topics * [Bundles Overview](/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles) * [Viewing Bundle Import History](/v3/product-catalog/user-guides/product-catalog/list/bundles/viewing-bundle-import-history) * [Editing a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/editing-a-bundle) * [Searching, Filtering, and Sorting Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/searching-filtering-sorting-bundles) # Bundles Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles Bundles are combinations of two or more products sold exclusively together or individually, depending on the configuration. Pure bundles consist of items exclusively sold together, and individual items can't be purchased separately. Shoppers have the flexibility to buy items in mixed bundles together or separately. For example, in a living room furniture set consisting of a coffee table and an end table, shoppers can choose to purchase each table individually or buy both tables together as part of the *living room set* bundle. Bundles must be assigned to one [category or subcategory](v3/product-catalog/user-guides/product-catalog/categories/overview.mdx) when they're created. ## Related Topics * [Bundles Overview](/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles) * [Adding a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles) * [Viewing Bundle Import History](/v3/product-catalog/user-guides/product-catalog/list/bundles/viewing-bundle-import-history) * [Editing a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/editing-a-bundle) * [Searching, Filtering, and Sorting Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/searching-filtering-sorting-bundles) # Editing a Bundle Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/bundles/editing-a-bundle Product bundles can be edited in the List section of **Product Catalog**. ## Prerequisites Ensure that you have created at least one bundle. ## Procedure 1. In the left menu, click **Product Catalog > List > Bundles**.\ The **Bundles** page is displayed. 2. Click on a bundle.\ The **Bundle Details** page is displayed.\ The attribute groups you have created and mapped are displayed. 3. Click the **Edit** button next to an attribute group.\ The **Edit Attributes** window is displayed. 4. Edit the attributes as required and click **Save**.\ The attributes are saved. 5. (Optional) Repeat steps 3 and 4 for additional attribute group menus. 6. (Optional) If [internationalization](/v3/platform/settings/internationalization/internationalization) is enabled, from the language dropdown menu, select the desired language variant for the item. 7. (Optional) Click **Publish**.\ The item is moved from draft to active state. ## Related Topics * [Bundles Overview](/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles) * [Adding a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles) * [Viewing Bundle Import History](/v3/product-catalog/user-guides/product-catalog/list/bundles/viewing-bundle-import-history) * [Searching, Filtering, and Sorting Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/searching-filtering-sorting-bundles) # Importing Bundles Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles Bundles are two or more items sold together. Creating a bundle allows you to group items that are exclusively sold together or group items that can be purchased together and separately. This document covers the process of adding multiple bundles through CSV import. You can also [add a single bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle). ## CSV File Guidelines You can import bundles using CSV files only; no other data or file formats are supported. Here are the key points to consider: * Formulas in formula-driven attributes are executed automatically after bundles have been imported. * If the CSV file doesn't have an attribute that's added to the category, you can add a new column in the CSV with the attribute name in the header. The upload process will populate the value for this attribute. Note that empty rows and columns are ignored. * Each bundle should include a category node. If the category node is missing, the bundle won't be created. * Use the **- >** delimiter for category nodes. Incorrect mapping or absence of category nodes may result in bundle creation issues. * The headers, represented in the first row of the CSV file, should match the attributes of the bundle. While attribute titles aren't case-sensitive, maintaining case consistency with the original attribute titles is recommended. * Empty rows and columns are ignored. * When updating or upserting bundles, entering *NULL* in a spreadsheet cell will override existing values with blank values. * The ActionTarget field determines what action is being taken for that row of data. We recommend that you download the template file to use as a guide when creating your own CSV file for import to minimize errors during the import process. ### Supported actions | **Action** | **Description** | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **UPSERT** | Creates a new bundle if the bundle doesn't exist, or updates an existing bundle. | | **CREATE** | Creates a new bundle. | | **UPDATE** | Updates an existing bundle. | | **PUBLISH** | Publishes an existing bundle that's in draft state, making it available on the storefront. | | **UNPUBLISH\_KEEP\_DRAFT** | Unpublishes an existing bundle. If a draft version exists, the live version is unpublished and the draft is retained. If no draft exists, the live version is unpublished is saved as a draft. | | **UNPUBLISH\_KEEP\_LIVE** | Unpublishes an existing bundle and moves it to the draft state. If a draft of that item already existed, it's deleted. | | **DELETE** | Deletes the existing bundle. | | **ATTACH\_BUNDLE\_PRODUCTS** | Adds products to an existing bundle. You can specify the product SKU and quantity of the bundle products in the items column. | | **DETACH\_BUNDLE\_PRODUCTS** | Detaches products from an existing bundle and converts them to items. The items column holds the SKU and quantity of the bundle products to be detached from the bundled SKU. | | **CHANGE\_CATEGORY** | Updates the category of an existing bundle. Depending on how your storefront is configured, this may change where or how your bundle is viewed by the customer. | | **ATTACH\_CHANNELS** | Adds specified channels to the bundle. The channels column holds the channels to be attached. | | **DETACH\_CHANNELS** | Removes specified channels from the bundle. The channels column holds the channels to be detached. | ### Attribute data format When preparing your CSV file for import, ensure that the attribute data format aligns with attribute type requirements. Different attribute types have specific formatting criteria: | **Data Type** | **Format Rule** | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Text** | Ensure the data is in text string format. | | **Number** | Use numerical data only. All non-numeric data is ignored. | | **Boolean** | Use *TRUE* or *FALSE* only. All other values are ignored. | | **Date** | Format dates exactly as during attribute creation. | | **List of values** | The value you enter must match one of the predefined values you set up when [adding a list of values attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute). | | **Serial** | Leave this field blank; fabric automatically generates the serial number during import. | | **SKU** | Provide the SKU for the bundle to be created. | The status attribute is imported as live only when all mandatory attributes are provided for the bundle. Otherwise, the status is automatically updated to draft, regardless of the value you provide in the file. ## Prerequisites Before initiating the bundle import, ensure that: * You have created at least one leaf category with attributes assigned to it to add the bundle to. For more information about creating categories, see the [Categories section](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category). * The CSV file adheres to the guidelines. ## Procedure 1. In the left menu, click **Product Catalog > List > Bundles**.\ The **Bundles** page is displayed. 2. Click **Import**.\ The **Select a leaf category** window is displayed. 3. Select a **Leaf**.\ The root categories and leaf categories appear as they're set up in Categories. Depending on your configuration, you may have to select one or more root categories before selecting a leaf category. 4. Click **Next**.\ The **Import CSV file** window is displayed. This window provides a link to download an example template for the CSV file. 5. To import a CSV file, do one of the following options: * Drag and drop the CSV file into the window. * Click **Select a File from your computer**. 6. Click **Import file**. The CSV file is imported, and the bundles are added to your product list. fabric stores the CSV files you upload to your account. You can view the status of the import and re-download the original files by visiting the [Background Jobs](/v3/product-catalog/user-guides/product-catalog/background-jobs/background-jobs) page. ## Troubleshooting Refer to the following table for a list of common errors when importing and how to correct them. | Error Message | What it Means | What Happens to the Bundle | How to Resolve | Comment | | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | | **Category Node not found** | The category node name is incorrect or missing. | A bundle can’t be created without a proper category node. | Verify the name of the node and the delimiter. | | | **Internal Server Error** | Server issues. | The bundle isn't created or updated. | Try again. | This is an intermittent issue. | | **Attribute Name not found** | The attribute mentioned in the CSV header isn't added to the category. The attribute name must be an exact match. | The bundle is created, but this specific attribute will be ignored. | Check the attribute name and ensure it's added to the category for importing bundles. | | | **Attribute Name value is invalid** | The provided value has flaws or validation issues. | The attribute value won't be saved to the bundle. | Provide the correct attribute value. | Example: Adding text for a number-type attribute triggers this error. | | **Status Mandatory attributes (required)** | To set a bundle's status to live, all mandatory attributes are required. | The bundle is created, and the attributes are updated. However, it can't be set to live, defaulting its status to draft. | Ensure all mandatory attributes have a value in the CSV file. | For delta imports, all mandatory attributes and values are required to set the bundle's status to live. | | **Some mandatory attribute values missing** | Some mandatory attributes lack values in the CSV file. These are either globally mandatory attributes (set at the attribute level) or category-specific mandatory attributes. The bundle is created with errors; only values in the CSV are added. | Include values for all mandatory attributes. | Bundles with missing mandatory attributes can't be set to live. | | ## Related Topics * [Bundles Overview](/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles) * [Adding a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle) * [Viewing Bundle Import History](/v3/product-catalog/user-guides/product-catalog/list/bundles/viewing-bundle-import-history) * [Editing a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/editing-a-bundle) * [Searching, Filtering, and Sorting Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/searching-filtering-sorting-bundles) # Searching, Filtering, and Sorting Bundles Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/bundles/searching-filtering-sorting-bundles The search, filter, and sort options on the **Bundles** page allows you to refine the3 list of bundles or find a specific bundle. You can use the filter option only if you have multiple bundles in your list and the bundles belong to multiple categories and collections with different attributes and values. ### To search for one or more bundles, do the following: 1. In the left menu, click **Product Catalog > List > Bundles**.
The Bundles page is displayed. 2. Type a search term into the search bar.
When searching, keep in mind the following: * You can search for multiple bundles by typing multiple search terms into the search bar, each separated by a comma. * When searching for multiple bundles, the search terms must be exact. Partial entries yield no results. * In addition to typing your searches into the search bar, you can also paste them. 3. Press **Enter**.
The results are displayed. ### To filter the list of bundles, do the following: 1. In the left menu, click **Product Catalog > List > Bundles**. The **Bundles** page is displayed. 2. Choose at least one of the following filters: * Click the **Category** dropdown and select a category. * Click the **Collection** dropdown and select a collection. * Click the **Date** dropdown and select a date range for the date the bundle was created and/or the date the bundles were modified. * Click the **Attributes & Values** dropdown. * Select a value to filter by in the **If** field. * Select a **Validation** option. * Enter a value in the **Value** field. * (Optional) Click **Add new condition** to filter by another attribute or value. Bundles that match the filters you chose are displayed. Click **Reset filters** to remove all filters. ### To sort the list of bundles, do the following: 1. In the left menu, click **Product Catalog > List > Bundles**.\ The **Bundles** page is displayed. 2. Click one of the column headers to sort the list of bundles.\ Sortable headers are SKU, Product name, Category, Created, and Status. The bundles are sorted. ### Related Topics * [Bundles Overview](/v3/product-catalog/user-guides/product-catalog/list/bundles/bundles) * [Adding a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/adding-a-bundle) * [Importing Bundles](/v3/product-catalog/user-guides/product-catalog/list/bundles/importing-bundles) * [Viewing Bundle Import History](/v3/product-catalog/user-guides/product-catalog/list/bundles/viewing-bundle-import-history) * [Editing a Bundle](/v3/product-catalog/user-guides/product-catalog/list/bundles/editing-a-bundle) # Adding an Item Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item Items, which are also referred to as products, are services or stand-alone items sold individually. This document covers the process of adding an individual item to your list of products. You can also add multiple items at the same time by [importing](/v3/guides/product-catalog/list/items/importing-items) them using a CSV file. ## Prerequisites * Ensure that you have set up at least one product attribute group. For more information about creating attribute groups, see [Creating Attribute Groups](/v3/product-catalog/user-guides/product-catalog/settings/creating-attribute-groups). * Ensure that you have created at least one leaf category to add the item to. For more information about creating categories, see the [Categories section](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category). ## Procedure 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. Click **New Item**. The **Select a leaf category** window is displayed. This window displays the root categories and leaf categories that are configured in [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview). 3. Select a leaf category. Leaf categories are labelled with **leaf**. You must click a root category to view the leaf categories within that category. If a root category has more root categories within it, you might have to continue selecting root categories until you can select a leaf category. 4. Click **Next**. The attribute groups you have created and mapped are displayed based on the configuration in the **Attributes** page. 5. To edit an attribute group, click the **Edit** button next to the attribute group name. 6. In the **Edit Attributes** window, enter the required details in each attribute field. The attributes fields in the **Edit Attributes** window lists the [product attributes](/v3/product-catalog/user-guides/product-catalog/attributes/product-attributes-overview) and [category attributes](/v3/product-catalog/user-guides/product-catalog/attributes/category-attributes-overview) that you have already created. 1. Click **Save**. If you want to use more than one attribute group, repeat the above steps for all of those attribute groups. 2. (Optional) If [internationalization](/v3/platform/settings/internationalization/internationalization) is enabled, from the language dropdown menu, select the desired language variant for the item. 3. (Optional) Click **Publish**. The item is now published and moved from draft to active state. ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Adding Item Variants Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/adding-item-variants Item variants are different versions of a base product that shoppers can choose from. With variants, you can offer an extensive catalog on your storefront, giving shoppers various options for the same item, such as size, color, or material. You can create and manage any number of combinations of options for variations of an item in fabric. For example, a store sells a dining table in three different materials: oak, pine, or mahogany. Each material comes in options that accommodate 4, 6, or 8 people. Using the variants, you can create 9 different variations for the parent item, the dining table, as shown in the following table: | | Oak | Pine | Mahogany | | ----------- | ------------ | ------------- | ----------------- | | **Seats 4** | Oak, seats 4 | Pine, seats 4 | Mahogany, seats 4 | | **Seats 6** | Oak, seats 6 | Pine, seats 6 | Mahogany, seats 6 | | **Seats 8** | Oak, seats 8 | Pine, seats 8 | Mahogany, seats 8 | With the above settings, the storefront displays the parent item with 9 options. Each of these options is a variant of the parent item and is referred to as the child item. There are two ways to create a variant for an item: * **Select existing items:** Use this method to add variants to an item by selecting from the items that are already present in your items list. You can use this method only if the desired item specifications or attributes already exist within your catalog. * **Create variants:** Use this method when you want to introduce an item with new attributes or specifications as a variant of a pre-existing item. In this method, you can simultaneously create a new item and set it as a variant of an existing item. When a product is created as a variant, it will initially be classified as an item if the parent product is still in draft. ## Prerequisites Ensure that you have at least one item in your list to use the **Create variants** method of creating variants. Ensure that you have at least two items in the same category in your list (one to use as the parent and one to set as the child) to use the **Select existing items** method. ## Procedure ### Select existing items 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Click an item.\ The **Item Details** page is displayed. 3. Click **Variants**.\ The **Variants** tab is displayed. 4. Click **Add Variants**.\ The **Create Relationship** page is displayed. It shows the items that are in the same category as the item you selected in step 2. Items in the category that already have variants aren't displayed. 5. Select the checkbox next to the item to set as a variant.\ You can select as many items as required. 6. Click **Save**. The variant is added to the item. ### Create variants 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Click an item.\ The **Item Details** page is displayed. 3. Click **Variants**.\ The **Variants** tab is displayed. 4. Click **Add Variants**.\ The **Create Relationship** page is displayed. 5. Click **Create variants**.\ The **Create variants** tab is displayed. 6. (Optional) Enter the number of variants to create. 7. Click **Add**.\ The variants are added. 8. Click **Edit**.\ The **Edit Attributes** window is displayed. 9. Enter the attribute fields as required and click **Save**. 10. (Optional) Repeat steps 7 and 8 for additional variants. The variants are created. ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Bulk Operations for Items Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/bulk-operations-items This topic covers the process of performing bulk actions on items in your Product Catalog. You can also perform these operations via [CSV import](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items). ## Delete 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items to delete. The bulk operations controls are displayed. 3. Click the **Delete** button. The selected items are deleted. ## Export 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items to export. The bulk operations controls are displayed. 3. Click the **Export** button. The selected items are exported as a CSV file. The download begins automatically as soon as the file is ready. Track the export status by going to **Product Catalog > Background Jobs > Export**. ## Update Attributes Values 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items with attributes to update. The bulk operations controls are displayed. 3. Click the vertical ellipsis (**⋮**) and select **Update Attributes Values**. The **Update attribute values** window is displayed. 4. In the **Choose attributes to update** field, select the attributes you want to change. * After you make your selections, click the **Update attribute values** window outside of the field dropdown. 5. Enter the new values for the fields you selected and click **Update**. A new window is displayed. 6. Do one of the following: * To save the updated items and publish them, click **Save & Publish**. * To save the updated items as drafts, click **Save As Draft**. Note: Items in a draft state will remain drafts. The changes you made the selected attributes are saved, and the items are placed in the state you selected. ## Change Category Changing the category for multiple items at once removes the attributes of the current category and adds the attributes to the destination category. 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items to change categories. The bulk operations controls are displayed. 3. Click the vertical ellipsis (**⋮**) and select **Change category**. The **Select a leaf node** window is displayed with a list of your categories. 4. Select a leaf category. When you click a root category, its subcategories are displayed to the right. Leaf categories are labeled **Leaf**. 5. CLick **Next**. 6. The **Are you sure?** window is displayed. 7. Click **Update**. The selected items are moved to the new category. ## Publishing 1. In the left menu, click Product **Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items to publish. The bulk operations controls are displayed. 3. Click the vertical ellipsis (**⋮**) and select **Publish Products**. The **Publish Products?** window is displayed. 4. Click **Publish**. The selected items are published. ## Unpublishing 1. In the left menu, click **Product Catalog > List > Items**. The **Items** page is displayed. 2. In the left column, select the items to publish. The bulk operations controls are displayed. 3. Click the vertical ellipsis (**⋮**) and select **Publish Products**. The **Unpublish Products?** window is displayed. 4. Click **Unpublish**. The selected items are unpublished. ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Editing an Item Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/editing-an-item Items on your product list can be edited in the List section of **Product Catalog**. ## Prerequisites * Ensure that you have [added](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item) or [imported](/v3/product-catalog/user-guides/product-catalog/list/items/importing-items) at least one item. ## Procedure 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Click an item.\ The **Item Details** page is displayed.\ The attribute groups you have created and mapped are displayed. 3. Click the **Edit** button next to an attribute group.\ The **Edit Attributes** window is displayed. 4. Edit the attributes as required and click **Apply**.\ The attributes are saved. 5. (Optional) Repeat steps 3 and 4 for additional attribute group menus. 6. (Optional) If [internationalization](/v3/platform/settings/internationalization/internationalization) is enabled, from the language dropdown menu, select the desired language variant for the item. 7. (Optional) Click **Save & Publish**.\ The item is moved from draft to active state. ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Importing Items Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/importing-items Items, a type of product, are objects sold individually as simple SKUs or as the parent to a variant. This document covers the process of importing multiple items using a CSV file. You can also [add items individually](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item). ## CSV File Guidelines You can import products using CSV files only; no other data or file formats are supported. Here are the key points to consider: * Formulas in formula-driven attributes are executed automatically after items have been imported. * If the CSV file doesn't have an attribute that's added to the category, you can add a new column in the CSV with the attribute name in the header. The upload process will populate the value for this attribute. * Empty rows and columns are ignored. * Each item should include a category node. If the category node is missing, the item won't be created. * Use the **->** delimiter for category nodes. Incorrect mapping or absence of category nodes may result in item creation issues. * The headers, represented in the first row of the CSV file, should match the attributes of the item. While attribute titles aren't case-sensitive, maintaining case consistency with the original attribute titles is recommended. * The Action field determines what action is being taken for that row of data. * When updating or upserting items, entering *NULL* in a spreadsheet cell will override existing values with blank values. We recommend that you download the template file to use as a guide when creating your own CSV file for import to minimize errors during the import process. ### Supported actions | **Action** | **Description** | | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **UPSERT** | Creates a new product if it doesn't exist, or updates an existing product. | | **CREATE** | Creates a new product. | | **UPDATE** | Updates an existing product. | | **PUBLISH** | Publishes an existing product that's in draft state to the storefront. | | **UNPUBLISH\_KEEP\_DRAFT** | Unpublishes an existing product. If a draft exists, the live version is deleted and the draft is retained. If no draft exists, the live version is saved as draft. | | **UNPUBLISH\_KEEP\_LIVE** | Unpublishes an existing product and moves it to draft state. If a draft of that item already existed, it's deleted. | | **DELETE** | Deletes the existing product. | | **ATTACH\_VARIANT** | Adds variants to an existing parent product. Specify the variant SKU in the variant column. | | **DETACH\_VARIANT** | Detaches existing variants and converts them to items. The variant column specifies the variant to be detached from the SKU. | | **CHANGE\_CATEGORY** | Updates the category of an existing product. Depending on how your storefront is configured, this may change where or how your product is viewed by the customer. | ### Attribute data format When preparing your CSV file for import, ensure that the attribute data format aligns with attribute type requirements. Different attribute types have specific formatting criteria: | **Data Type** | **Format Rule** | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Text** | Provide data in text string format. | | **Number** | Use numerical data only. All non-numeric data is ignored. | | **Boolean** | Use *TRUE* or *FALSE* only. All other values are ignored. | | **Date** | Match the date format specified during [attribute creation](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-date-attribute). | | **List of values** | The value you enter must match one of the predefined values you set up when [adding a list of values attribute](/v3/product-catalog/user-guides/product-catalog/attributes/adding-a-list-of-values-attribute). | | **Serial** | Leave this field blank; fabric automatically generates the serial number during import. | | **SKU** | Provide the SKU for the item. | The status attribute is imported as live only when all mandatory attributes are provided for the item. Otherwise, the status is automatically updated to draft, regardless of the value you provide in the file. ## Prerequisites Before initiating the item import, ensure that: * Ensure that you have created at least one leaf category with attributes assigned to it to add items to. For more information about creating categories, see the [Categories section](/v3/product-catalog/user-guides/product-catalog/categories/adding-a-category). * The CSV file adheres to the guidelines. ## Procedure 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Click **Import**.\ The **Select a leaf category** window is displayed. 3. Select a **Leaf** to which you want to import items.\ The **Select a leaf category** window is displayed. This window displays the root categories and leaf categories that are configured in [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview). 4. Click **Next**.\ The **Import CSV file** window is displayed. This window provides a link to download an example template for the CSV file. 5. To import a CSV file, do one of the following options: * Drag and drop the CSV file into the window. * Click **Select a File**. 6. Click **Import file**. The CSV file is imported and the items are added to your product list. fabric stores the CSV files you upload to your account. You can view the status of the import and re-download the original files by visiting the [Import History](/v3/product-catalog/user-guides/product-catalog/list/items/viewing-item-import-history) page. ### Troubleshooting Refer to the following table for a list of common errors when importing and how to correct them. | **Error Message** | **What it means?** | **What happens to the item?** | **How to resolve?** | **Comment** | | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | Category Node not found | The category node name is incorrect or missing. | An item can’t be created without a proper category node given. | Verify the name of the node and the delimiter. | | | Internal Server Error | Server issues | The item isn't created or updated | Try again | This is an intermittent issue. | | Attribute Name not found | The attribute mentioned in the CSV header isn't added to the category. The attribute name must be an exact match. | The item is created, but this specific attribute will be ignored. | Check the name of the attribute and ensure that the attribute is added to the category you are trying to import items to. | | | Attribute Name value is invalid | The value provided has some flaws or validation issues. | The attribute value won't be saved to the item. | Provide the correct attribute value. | Example: If you add text for a number type attribute, you will receive this error. | | Status Mandatory attributes required | To set the status of an item to live, all mandatory attributes are required. | The item will be created and the attributes will be updated. However, the item can't be set to live; its status will default to draft. | Ensure that all mandatory attributes have a value in the CSV you are trying to import. | When doing a delta import, it is required to have all mandatory attributes and values added to set the item's status to live. | | Some mandatory attribute values are missing. | There are some mandatory attributes that don't have values in the CSV file that was uploaded. These are either global mandatory, which are set at the attribute level, or category mandatory, which are set at the individual category level. | The item is created with errors. Only the values in the CSV will be added. | Include values for all mandatory attributes. | Items can be created with errors, but they can’t be set to live unless all mandatory attributes have a value. | ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Items Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/items An item is a standalone service or product sold individually. You can create items manually or import items using a CSV file. Each item can have different variations, known as variants, distinguished by specific differences from the standard version. For example, in a furniture store, a dining table might have variations in sizes, such as round or rectangular and finishes, such as oak, mahogany, or walnut, resulting in unique versions. Items and variants must be assigned to one [category or subcategory](v3/product-catalog/user-guides/product-catalog/categories/overview.mdx) when they're created. ## Related Topics * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) * [Searching, Filtering, and Sorting Items](/v3/guides/product-catalog/list/items/searching-filtering-sorting-items) # Searching, Filtering, and Sorting Items Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/list/items/searching-filtering-sorting-items The search, filter, and sort options on the **Items** page allows you to refine the list of items or find a specific item. You can use the filter option only if you have multiple items in your list and the items belong to multiple categories and collections with different attributes and values. ### To search for one or more items, do the following: 1. In the left menu, click **Product Catalog > List > Items**.
The Items page is displayed. 2. Type a search term into the search bar.
When searching, keep in mind the following: * You can search for multiple items by typing multiple search terms into the search bar, each separated by a comma. * When searching for multiple items, the search terms must be exact. Partial entries yield no results. * In addition to typing your searches into the search bar, you can also paste them. 3. Press **Enter**.
The results are displayed. ### To filter the list of items, do the following: 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Choose at least one of the following filters: * Click the **Category** dropdown and select a category. * Click the **Collection** dropdown and select a collection. * Click the **Date** dropdown and select a date range for the date the item was created and/or the date the items were modified. * Click the **Attributes & Values** dropdown. * Select a value to filter by in the **If** field. * Select a **Validation** option. * Enter a value in the **Value** field. * (Optional) Click **Add new condition** to filter by another attribute or value. Items that match the filters you chose are displayed. 3. Click **Reset filters** to remove all filters. ### To sort the list of items, do the following: 1. In the left menu, click **Product Catalog > List > Items**.\ The **Items** page is displayed. 2. Click one of the column headers to sort the list of items.\ Sortable header is **Status**. The items are sorted. ## Related Topics * [Items Overview](/v3/product-catalog/user-guides/product-catalog/list/items/items) * [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) * [Importing Items](/v3/guides/product-catalog/list/items/importing-items) * [Viewing Item Import History](/v3/guides/product-catalog/list/items/viewing-item-import-history) * [Bulk Operations for Items](/v3/guides/product-catalog/list/items/bulk-operations-items) * [Editing an Item](/v3/guides/product-catalog/list/items/editing-an-item) * [Adding Item Variants](/v3/guides/product-catalog/list/items/adding-item-variants) # Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/overview fabric Product Catalog is a data organization tool that enables merchants to build a centralized source of product information. This information can include technical specifications such as size and weight, design specifications such as color and material, and generic details such as name, description, and ID. Product categories allow merchants to organize items into logical parent-child groups to make finding products on the storefront easier for the shoppers. While configuring products, merchants can use validations to ensure data consistency and quality for each item and category. Product Catalog has out-of-the-box integrations with fabric services such as Orders and Offers that enable merchants to add base prices and promotions to any products available in Product Catalog, including categories and collections. Key Product Catalog capabilities include: * **Catalog Management:** Create and manage products and services such as items, variants, and bundles. For example, an item could be a coffee table in oak. A variant could be that same coffee table, but in pine. A bundle could be the coffee table sold together with two matching end tables. * **Taxonomy Management:** Define categories of products to create a structured hierarchy. * **Distribution management:** Control product data availability for multiple channels and locales and use collections to curate subsets of products for sales and marketing goals, such as holiday sales or seasonal discounts. * **Bulk Management**: Import product, category, and collection information in a CSV file and export catalog data into a CSV file. * **Variant management:** Create and manage an unlimited number of variants to indicate that a product is available in different options, such as colors or sizes. ### Use Case As an example, consider a furniture distributor with an extensive catalog that includes living, dining, and bedroom pieces who wants to display their products for sale on their storefront. The merchant can upload each item they sell, either individually or in bulk with a CSV file. Attributes of each piece, ranging from physical characteristics such as dimensions and weight to construction characteristics such as materials and finishes can all be included. Variants of items are also supported, so that a coffee table available in mahogany, oak, and pine can all be considered different versions of the same item. In addition, items frequently sold together can be grouped into bundles so that the coffee table can be sold along with a pair of matching end tables. The merchant can then create a hierarchy of relationships among the items in the catalog that make the most sense to their business. That means the coffee table could be in a category with all living room furniture, or a category of all tables, or both. The merchant can group items from different categories into themed collections to boost the sales or marketing campaigns. For example, for a Black Friday promotion, merchant can assemble a living room set collection that includes a coffee table, end tables, sofa, loveseat, and lamps. ### Workflow Basic Product Catalog setup begins with creating attributes, then mapping fabric-mandatory attributes with merchant-defined attributes. The following workflow provides details of the steps involved in product setup: 1. [Create Attributes](/v3/guides/product-catalog/attributes/product-attributes-overview): Create the required attributes for the products. You can also use attribute groups to group relevant attributes and assign to products or categories. 2. [Map Attributes](/v3/guides/product-catalog/attributes/product-attributes-overview): Map the mandatory attributes of fabric, such SKU, title, image, and active status to the corresponding names provided by the merchant. 3. [Add Categories](/v3/guides/product-catalog/categories/adding-a-category): Arrange items, bundles, and variants into a hierarchical tree structure based on common attributes to logically group products. 4. Create Items, Variants, and Bundles: Add your products, which can consist of [items](/v3/guides/product-catalog/list/items/adding-an-item), [bundles](/v3/guides/product-catalog/list/bundles/adding-a-bundle), and [variants](/v3/guides/product-catalog/list/items/adding-item-variants). Prior to adding any products, fabric recommends the following: * Maintain a list of attributes for products and categories. * Organize products within a hierarchical tree structure of categories. * Compile a products list, along with their variants and bundles, to display on the storefront. 5. [Create Collections](/v3/guides/product-catalog/collections/creating-a-collection): Organize products according to marketing needs for display on your storefront. Collections are optional. Once these steps are complete, basic setup is finished. You may proceed to use the features and capabilities available to you. ### Navigation Product Catalog is accessible through fabric’s cloud-based application called Copilot, and divided into the following menus and sub-menus: * **List** * [Items](/v3/guides/product-catalog/list/items/items): Add, import, and manage product and variant information. * [Bundles](/v3/guides/product-catalog/list/bundles/bundles): Add, import, and manage bundle information. * **Attributes** * [Product Attributes](/v3/guides/product-catalog/attributes/product-attributes-overview): Define item, variant, and bundle characteristics. * [Category Attributes](/v3/guides/product-catalog/attributes/category-attributes-overview): Define category characteristics. * **[Categories](/v3/guides/product-catalog/categories/categories_overview):** Create a hierarchy of product groups and relationships. * **[Collections](/v3/guides/product-catalog/collections/collections):** An alternative method to categories for organizing products. * **Settings** * [Attribute Groups](/v3/guides/product-catalog/settings/attribute-groups-overview): Organize similar attributes together. * [Attribute Mapping](/v3/guides/product-catalog/settings/attribute-mapping-overview): Ensure data in Product Catalog is readable and usable to other systems. # Attribute Groups Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/settings/attribute-groups-overview ### Overview Attribute groups enable merchants to organize various attributes together based on meaning or purpose for an easier, more logical flow during the set up process. For example, a furniture store might need to have height, width, length, or depth attributes present on the item or bundle listing page on their storefront. The merchant can create an attribute group called *dimensions* so that all dimension-related details can be added in one place when adding a new piece of furniture. This allows merchants to streamline the setup process and reducing the time required to manage extensive attribute data in large catalogs. Before creating attribute groups, you must first set up the attributes that you want to group together in the Attributes > Products page. While attribute groups enhance storefront convenience, setting them up is optional and not mandatory for product setup. ### Related Topics * [Creating Attribute Groups](/v3/product-catalog/user-guides/product-catalog/settings/creating-attribute-groups) # Attribute Mapping Overview Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/settings/attribute-mapping-overview ### Overview Before creating items in the Product Catalog, proper attribute mapping is essential to ensure other systems can read and use data from the Product Catalog. fabric has a predefined set of mandatory attributes for items and bundles that Product Catalog uses to deliver a consistent and reliable experience across channels. However, merchants may have their own naming conventions for these attributes. For instance, Product Catalog uses the term SKU to refer to a unique product identifier while some merchants use the terms UPC or Part Number. To address this inconsistency, merchant-defined attributes are mapped to fabric attributes as productId -> fabric SKU. Only the SKU is mandatory to create items, but each basic attribute should be mapped to exactly one attribute from the list of attributes. Attribute mapping is done once, before uploading any items or bundles. After you have mapped the attributes and begun uploading, the features in attribute mapping are disabled. ### Basic attributes detail Refer to the following table for more information about each attribute. | Mapping Name | Attribute Specifications | Why does this need to be mapped? | | --------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SKU | Must be a mandatory Attribute | Each SKU value must be unique. This attribute serves as the primary identifier for items to be created in Product Catalog. | | Product Title | A text or number type attribute is recommended | This attribute helps Product Catalog identify the display name of the item or bundle. | | Primary Product Image | A text type attribute is recommended here | This attribute helps Product Catalog identify the main image of the product for thumbnail purposes. | | Active | Must be a mandatory attribute | Must be a Boolean type attribute. Name the attribute to be Active which can be set to true/false. Required to maintain the status of item to active/disabled. Only items where status is set to Active=TRUE will be available for the commerce API to consume. | ## Related Topics * [How to Map Attributes](/v3/product-catalog/user-guides/product-catalog/settings/how-to-map-attributes) # Creating Attribute Groups Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/settings/creating-attribute-groups ### Overview Attribute groups enable merchants to organize various attributes together based on meaning or purpose for an easier, more logical flow during the item and bundle set up process. ### Prerequisites Ensure you have created multiple product attributes. ### Procedure 1. In the left menu, click **Product Catalog > Settings > Attribute Groups**.\ The **Product Settings** page is displayed. 2. Click **Create Attribute Group**.\ The **Create Attribute Group** page is displayed. 3. In the **Attribute group title** field, enter a title for the attribute group. 4. (Optional) In the **Description** field, enter a description for the attribute group. 5. In the **Priority order** field, enter a number.\ The attribute group's position on the **Add Item** or **Add Bundle** pages is determined by its Priority order value—lower numbers indicate higher priority. 6. To add attributes to the group, do one of the following: * In the **Editable attributes** menu, click **Add attributes**.\ The **Select attributes** window is displayed. * To add an attribute, click its corresponding checkbox.\ You can add as many attributes as needed, but an attribute can only be added to one attribute group. * When finished selecting attributes, click **Add**.\ The attributes are added to the group. * In the **Read-only attributes** menu, click **Add attributes**.\ The **Select attributes** window is displayed. * To add an attribute, click its corresponding checkbox.\ You can add as many attributes as needed, but an attribute can only be added to one attribute group. * When finished selecting attributes, click **Add**.\ The attributes are added to the group. 7. Click **Save**. The attribute group is created. ### Related Topics * [Attribute Groups Overview](/v3/product-catalog/user-guides/product-catalog/settings/attribute-groups-overview) # Mapping Attributes Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/settings/how-to-map-attributes ### Overview Before creating items in Product Catalog, proper attribute mapping is essential to ensure other systems can read and use data from Product Catalog. ### Prerequisites Ensure you have administrator privileges to fabric Product Catalog. For more information, see [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control). ### Procedure 1. In the left menu, click **Product Catalog > Settings > Attribute mapping**.\ The **Product Settings** page is displayed. 2. In the **SKU** dropdown, select the attribute you will use for SKU values. 3. In the **Product title** dropdown, select the attribute you will use for product titles. 4. In the **Primary Product Image** dropdown, select the attribute you will use for the primary product image. 5. In the **Active** dropdown, select the attribute you will use to set the item’s status. 6. In the **Variant** dropdown, select an attribute you will use to identify variants. 7. Click **Save**. The product attributes are mapped. ### Related Topics * [Attribute Mapping Overview](/v3/product-catalog/user-guides/product-catalog/settings/attribute-mapping-overview) # Settings Source: https://developer.fabric.inc/v3/product-catalog/user-guides/product-catalog/settings/settings ### Overview Use the Product Catalog **Settings** menu to create attribute groups and map product attributes. Use the following links to learn more about attribute groups and attribute mapping. ### Attribute Groups * [Attribute Groups Overview](/v3/product-catalog/user-guides/product-catalog/settings/attribute-groups-overview) * [Creating Attribute Groups](/v3/product-catalog/user-guides/product-catalog/settings/creating-attribute-groups) ### Attribute Mapping * [Attribute Mapping Overview](/v3/product-catalog/user-guides/product-catalog/settings/attribute-mapping-overview) * [How to Map Attributes](/v3/product-catalog/user-guides/product-catalog/settings/how-to-map-attributes) # Create a file object and retrieve the file upload URL Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/files/create-file cc.openapi post /catalog-connector-files Use this endpoint to retrieve the URL of the AWS S3 location to upload the file that you want to import to the Catalog Connector. # Download a file by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/files/download-file cc.openapi get /catalog-connector-files/actions/download Use this endpoint to retrieve the URL used to download a previously processed file. You can then make a GET request with this URL to retrieve the products data in CSV or JSONL format. The download link is valid for five minutes. # Retrieve import and export history Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/files/get-file cc.openapi get /catalog-connector-files Use this endpoint to access files previously imported to or exported from the Catalog Connector, sorted in chronological order. You can refine the search results by using the following query parameters: - `ids`: Provide a comma-separated list of file IDs to retrieve multiple files by their IDs. Note that pagination isn't supported when using this parameter. - Format type (`formatType`) : Specify the format of the file to filter files by format. The options are **CSV** or **JSONL**. - Operation type (`type`): Use this parameter to specify whether you want imported or exported files. - Pagination (`offset`, `limit`): Use offset and limit parameters to refine the number of results returned. - `sort`: Use this parameter to view results in ascending or descending order. If no query parameters are specified, the endpoint returns up to 10 records. # Retrieve an import template Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/files/retrieve-import-template cc.openapi post /catalog-connector-templates/actions/generate Use this endpoint to retrieve the product import template for Catalog Connector in either CSV or JSONL format, based on your preferred data handling method. You can open CSV template in applications, such as Excel or Google Sheets and JSONL template in text editors compatible with JSONL, such as Visual Studio Code. After filling in product data, save the template file with a unique name on your local system. # Export products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/jobs/export cc.openapi post /catalog-connector-jobs/actions/export Use this endpoint to start an internal job to export products from Catalog Connector. Specify the `formatType` query parameter to export data in either CSV or JSONL format. In the request body, provide the `ids` of all products to be exported, the product type, and the locale. # Catalog Connector Overview Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/overview Catalog Connector is a denormalized data organization tool that enables merchants to link information from their third-party product information management system to their fabric account, making it accessible across fabric modules such as Offers, Orders, and Inventory. This data can include technical specifications, such as size and weight, design attributes, such as color and material, and generic product details such as name, description, and ID. Catalog Connector provides out-of-the-box integrations with fabric services, such as Orders and Offers, that enable merchants to apply base prices and promotions to any products available within the Catalog Connector. Key Catalog Connector capabilities include: * **Bulk Management:** Import product information in a CSV or JSONL file. * **Catalog Management:** Manage product create, update, and delete actions, including parent, variant, and bundle products. Catalog Connector is available exclusively to fabric users who don't have fabric’s proprietary Product Catalog service. Setting up Catalog Connector involves importing products, bundles, and their properties using a CSV or JSONL file. Catalog Connector setup involves importing products and bundles and their properties in a CSV or JSONL file. # Create product attribute group Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/create-product-attribute-group attribute.openapi post /product-attribute-groups Attribute group is a collection of attributes that can be assigned to products or categories. This endpoint creates an attribute group with associated attributes so that it's easier to assign attributes to products and categories **Note**: At least one attribute must be specified. # Delete attribute group Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/delete-attribute-group attribute.openapi delete /product-attribute-groups/{id} To ensure product details are up to date, it's important to remove unused, incorrect attribute groups. This endpoint deletes an attribute group by its ID. # Find attribute groups Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/find-attribute-groups attribute.openapi post /product-attribute-groups/search Attribute groups are a collection of attributes that can be assigned to products or categories. This endpoint searches for attribute groups based on the search criteria specified in the request body. # Get all product attribute groups Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/get-all-product-attribute-groups attribute.openapi get /product-attribute-groups Attribute group is a collection of attributes that can be assigned to products or categories. This endpoint gets all the existing attribute groups along with their attributes. # Get single attribute group Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/get-single-attribute-group attribute.openapi get /product-attribute-groups/{id} Attribute groups are a collection of attributes that can be assigned to products or categories. This endpoint gets details of the product attribute groups for the specified ID for proper details of product information on your e-commerce portal. # Attribute Groups Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/overview An Attribute Group is a collection of product attributes that helps categorize products into various semantic groups based on meaning and purpose, allowing for easier management and organization in the Product Catalog. Supports CRUD operations for managing attribute groups. # Update attribute group Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attribute-groups/update-attribute-group attribute.openapi put /product-attribute-groups/{id} When launching a new product line, it may be necessary to update certain aspects, such as adding or deleting attributes, updating attribute group name, or adjusting the sequence in which they appear on UI. This endpoint is used to group attributes and mark them as editable or read-only. In addition, you can update the details of attribute groups such as name, description, priority order, and more. This endpoint completely replaces the existing details. # Get attributes mapping Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes-mapping/get-attributes-mapping attribute.openapi get /product-attribute-mappings Before adding an item (with or without variants) to fabric **Product Catalog**, you must map merchant-specific attributes to fabric-specific attributes.
Once mapping is created, this endpoint is used to get the mapping details. # Update attributes mapping Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/attributes-mapping/update-attributes-mapping attribute.openapi put /product-attribute-mappings This endpoint updates mapping of merchant-defined attributes to fabric-defined standard attributes. This will help ensure consistency. # Create multiple categories Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/bulk-action-for-categories-and-collections/create-multiple-categories category.openapi post /categories/batch Items are organized within categories, which form the original hierarchical tree structure with multiple levels of nested categories. This endpoint is used to add new categories within this structure. **Note**: 1. Upon onboarding a new merchant to fabric **Product Catalog**, a root category is automatically generated.
2. This endpoint doesn't support adding of parent and its children categories at the same time.
3. You can add up to 25 categories. # Create multiple collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/bulk-action-for-categories-and-collections/create-multiple-collections category.openapi post /collections/batch Collection is an alternative way to organize products compared to the original Category system; they're created based on merchant's requirements. This endpoint is used to create a new collection **Note**: You can create up to 25 collections in a single call. # Update collections up to 25 Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/bulk-action-for-categories-and-collections/update-collections-up-to-25 category.openapi put /collections With this endpoint, you can update up to 25 collections. You can also update collection details, such as add sub-collections, exclude sub-collections, add validation rules for attributes, or reorder collections. **Note**:
1. This endpoint replaces the existing details.
2. To avoid losing all details, for minor updates, use the `partially update collection` endpoint - `PATCH /collections/{id}` # Update multiple categories Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/bulk-action-for-categories-and-collections/update-multiple-categories category.openapi put /categories With this endpoint, you can update up to 25 categories and add new child categories. You can update the name of the category as required, update the parent category, change category attributes for improved product discovery, and modify product attributes to efficient product filtering. # Create category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/create-category category.openapi post /categories Items are organized within categories, which form the original hierarchical tree structure with multiple levels of nested categories. This endpoint is used to create a new category within this structure. **Note**: 1. Upon onboarding a new merchant to fabric **Product Catalog**, a root category is automatically generated.
2. This endpoint doesn't support adding of children categories. Use the Update category endpoint - `PUT /categories/{id}` endpoint to add child categories. # Delete category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/delete-category category.openapi delete /categories/{id} If there is a change in product offerings , one or more categories may become unnecessary. This endpoint is used to delete a category by its ID. # Find categories Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/find-categories category.openapi post /categories/search This endpoint is used to search and find specific categories based on the search criteria given in the request body. This endpoint is also used to find the root category that's automatically created when the merchant is onboarded to fabric **Product Catalog**. # Get a single category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/get-a-single-category category.openapi get /categories/{id} The Category system is the original tree hierarchy used to organize and categorize products. This endpoint gets the details of a specific category by its ID. The response includes basic info (ID, name, localized name (if applicable), list of category attributes, product attributes, associated product IDs, associated child categories, and more. # Get attribute groups of a category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/get-attribute-groups-of-a-category category.openapi get /categories/{id}/attribute-groups Attribute groups are a collection of attributes that can be assigned to an item or a category. For example, an `Electronics` category may have `Dimensions` as one of the attribute groups, with `length`, `width`, and `height` as individual attributes. This endpoint gets all attribute groups for the given category. For each attribute group, you can view its basic details such as ID, name, and priority as well as attribute details including validation rules, localized versions, and more # Get navigation path for categories Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/get-navigation-path-for-categories category.openapi get /categories-path In **Product Catalog**, items are organized in a hierarchy tree structure of parent and children categories. This endpoint gets the navigation path starting from the root (level 0) until the given category IDs. # Get products by category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/get-products-by-category category.openapi get /categories/{id}/products To ensure correct items are grouped together within a category, it's important to review them in the context of each category. This endpoint gets a paginated list of products. For each product, you can view its attribute details, localized properties, variant IDs as well as the `categoryId`. You can refine your search results by specifying `offset`, and `limit`. When they're no specified, you'll get up to 10 results. # Categories Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/overview Categories are organized into a hierarchical tree structure based on common attributes, allowing logical grouping of items. The Categories endpoints enable CRUD operations, which include creating, finding, and managing categories. # Partially update category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/partially-update-category category.openapi patch /categories/{id} In contrast to the Update Category endpoint - `PUT /categories/{id}`, which fully overwrites the category details, this endpoint allows for selective modification of specific details, such as fixing any typos present in category names as well as facilitating addition or removal of category attributes or product attributes. # Update category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/categories/update-category category.openapi put /categories/{id} Child categories can't be added while creating a new category (using the `POST /categories` endpoint). This endpoint is used to add a child category to a parent category. In addition, when there are changes in product offerings, this endpoint is used to change the item and category attributes as well as rename the category. This endpoint completely replaces the existing details. # Copy Category to Collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/copy-category-to-collections category.openapi post /collections/actions/copy-category This endpoint is used to replicate category tree hierarchy to collections. # Create collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/create-collection category.openapi post /collections Collection is an alternative way to organize products compared to the Category system, which is the original organization of items. Because the Category system isn't granular enough to meet all the requirements of Storefronts, collections are used to organize products as per the merchant's requirements. This endpoint is used to create a new collection within the alternative organization so that it can be adapted to support various use-cases of Storefronts. # Delete collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/delete-collection category.openapi delete /collections/{id} If there is a change in product offerings, one or more collections may become unnecessary. This endpoint is used to delete a collection by ID. # Find collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/find-collections category.openapi post /collections/search This endpoint enables you to find collections by the search criteria you specify in the request body. You can also `sort` the results. # Get a single collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/get-a-single-collection category.openapi get /collections/{id} Collections are used to organize and categorize products on your e-commerce platform (website and app), making it easier for shoppers to browse and find products. This endpoint gets category details such as basic info (ID, name, localized name, status, etc.), attributes details, categories included, categories excluded, associated child categories, and more. # Get navigation path for collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/get-navigation-path-for-collections category.openapi get /collections-path On the Storefront, products are organized in hierarchical tree structure of parent and children collections. This endpoint gets the navigation path starting from the root (level 0) until the given collections. # Get products under collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/get-products-under-collection category.openapi get /collections/{id}/products To ensure the right set of products are organized within a collection, it's important to review products in each collection. This endpoint gets a paginated list of products in a collection. **Note**: You can refine your search by specifying `offset` and `limit`. When they're not specified, you'll get up to 10 products by default. # Collections Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/overview As the **Categories** system may not be sufficiently granular to accommodate all Storefront use cases, **Collections** provides an alternative means of organizing products on the storefront. Collections create a representational categorization of products, and are primarily used by merchants for short-term marketing campaigns. For instance, a collection could be created for a New Year sale that highlights discounted furniture products. # Partially update collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/partially-update-collection category.openapi patch /collections/{id} In contrast to the Update Collection endpoint - `PUT /collections/{id}`, which fully overwrites the collection details, this endpoint allows for selective modification of specific details such as fixing any typos present in the collection name as well as facilitating addition or removal of attributes # Syncing Collections Using Delta Files Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/syncing-collections-using-delta-files Collections help organize products for commerce channels and shoppers by using category source inclusions/exclusions and attribute-based rules. Product Catalog maintains collection assignments through two background jobs, which evaluate and update product assignment based on attribute or rule changes: | Job Name | Function | Event | | ----------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | **Product Update: Collection Evaluation** | Monitors product attribute updates and re-evaluates product eligibility for collections. | `pim:jobs.ProductUpdate.CollectionEvaluation:completed`
`pim:jobs.ProductUpdate.CollectionEvaluation:failed` | | **Collection Update: Product Evaluation** | Monitors collection rule updates and re-evaluates products based on the revised collection rules. | `pim:jobs.CollectionUpdate.ProductEvaluation:completed`
`pim:jobs.CollectionUpdate.ProductEvaluation:failed` | If you are subscribed to Product Catalog's Collections [webhook events](/v3/platform/settings/webhooks/list-of-products-events), the system synchronizes product updates using delta files. The following diagram shows the sequence of tasks performed during the synchronization process: ![Integration Sequence Diagram](https://mintlify.s3.us-west-1.amazonaws.com/fabric-demo/images/integrationsequencediagram.png) The system runs background jobs that generate product update files. Depending on the job status, an event is triggered. Ensure that the webhook listener is subscribed to both "completed" and "failed" events, as failed jobs might still update some products. ## Synchronization Process ### 1. Job execution The system runs one of two background jobs: * Product Update: Collection Evaluation (re-evaluates product fitment based on attribute updates). * Collection Update: Product Evaluation (re-evaluates products based on collection rule changes). ### 2. Event triggering Once a job completes successfully or fails, it triggers an event. The webhook listener must be subscribed to both **completed** and **failed** events because failed jobs may still update some products. ### 3. Event delivered The fabric event publisher delivers the event to the webhook listener. ### 4. Extract the output file ID The Webhook Listener retrieves the first output file ID from the event payload. If multiple output files exist: * Only the first file should be processed. * Additional files should be reviewed to determine if they contain duplicates, sequential data, or logs. #### Example payload with output files ``` { "specversion": "v3", "type": "pim:jobs.productUpdate.collectionEvaluation:completed", "tenantid": "64cbda7e0cf2dcad87b14456", "events": [ { "id": "87852cfa-0cf8-4625-8935-20f2292ea0d3", "time": "2024-02-07T12:09:21.623Z", "source": "pim:job", "data": [ { "id": "65c3705726f919316ba95361", "tenantId": "64cbda7e0cf2dcad87b14456", "name": "Product Job_02.07.2024", "type": "PRODUCT_JOB", "outputFiles": [ "65c372f1b683f0539a8c18b1" ], "errorFiles": [], "status": "COMPLETED", "createdAt": "2024-02-07T11:58:15.814Z", "updatedAt": "2024-02-07T12:09:21.618Z", "batchJobId": "afe320dc-fb2f-4550-89d4-3578a5c9d255", "completedAt": "2024-02-07T12:09:21.615Z", "statusMessage": "Job completed successfully" } ] } ] } ``` ### 5. Retrieve the file download link Make an API request to fetch the file download link using the extracted file ID. #### Example cURL request ``` curl--location 'https://api.fabric.inc/v3/product-files/actions/download?fileId=65c372f1b683f0 539a8c18b1' \--header 'Authorization: ' \--header 'x-fabric-tenant-id: 64cbda7e0cf2dcad87b14456' ``` ### 6. Download and extract the file Download the output file from the retrieved link. The downloaded file is a .zip archive that must be extracted before use. Retry logic: * If the download fails, retry with exponential backoff. * Verify file integrity before extraction. #### Example signed URL for file download ``` { "location": "https://pim-v3-prod01-us-east-1-files.s3.us-east-1.amazonaws.com/product-batch-job/64cbda7e0cf2dcad87b14ad7/prod01/1707307761501-65c3705726f919316ba95361-product-job-outputFile.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240207T193937Z&X-Amz-Expires=300&X-Amz-Signature=3f33806438e10764832d0a3dd5f2e98d02be31476b5bb94f7805b775744b60d0" } ``` This signed URL is a temporary, pre-authenticated link that allows you to download the generated output file. The URL includes security parameters such as an expiration time `X-Amz-Expires`, an algorithm used for signing `X-Amz-Algorithm`, and a signature `X-Amz-Signature`. Ensure that the webhook listener processes the file right after retrieval to avoid needing multiple API requests. If the URL expires before the file is downloaded, request a new signed URL by calling the File API again. ### 7. Process the extracted data If no products were updated, the file contains the message "No products updated." If products were updated, the file contains JSON entries listing: * Product ID * SKU * Type (item, variant, or bundle) * Status (live, draft) * Collections the product was added to or removed from Category attributes are inherited by default, meaning sub-collection nodes automatically adopt attribute values from their parent categories. However, users can override these values as needed, allowing for customization at different hierarchy levels. #### Example JSON entries ``` { "id": "65b293d4bc83fd68411eb0e7", "sku": "GZZ19228-150-35_pim_pim_2", "type": "ITEM", "status": "LIVE", "collections": { "added": ["65c3e29b8cf6b31a1f1845fb"], "removed": [] } } ``` ### 8. Synchronize the updated data Process the extracted product data for further synchronization within the system to ensure that any updates correctly propagate through downstream services. # Update children of collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/update-children-of-collection category.openapi put /collections/{id}/children This endpoint is primarily used to change display order of children collection. # Update collection Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/collections/update-collection category.openapi put /collections/{id} With this endpoint, you can update details of a single collection, such as add or remove sub-collections, add validation rules for attributes, reorder collections, and more. **Note**:
1. This endpoint replaces the existing details.
2. To avoid impacting the entire data, for minor updates, use the Partially update collection endpoint instead - `PATCH /collections/{id}`. # Create file object and get file upload location Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/files/create-file-object-and-get-file-upload-location files-jobs.openapi post /product-files This endpoint creates a file object by specifying the import file's `type`, `name`, and `locale` in the request body. The response will include the URL location to upload the file. # Download a file by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/files/download-a-file-by-id files-jobs.openapi get /product-files/actions/download Use this endpoint to get a download link for imported file, which you can use to review or update the file . **Note**: The link is valid only for five minutes. # Generate the import template Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/files/generate-the-import-template files-jobs.openapi post /product-templates/actions/generate Bulk import must be in a standardized format. Using this endpoint, you can generate the template required to bulk import attribute, category, collection, item, and/or bundle. # Get files available for a merchant Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/files/get-files-available-for-a-merchant files-jobs.openapi get /product-files Get files available for a merchant. This endpoint can be used to search for files using file names or file IDs. **Note**: Query parameter `ids` can't be combined with any other query parameters and pagination isn't supported when `ids` query is used. # Add products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/add-products product.openapi post /products/batch At fabric, the term products refers to items, variants, and/or bundles. With this endpoint, you can add up to 25 products. Refer to the examples added for each type. **Note**:
1. If product type is Variant, they can be added using either SKU or ID.
2. When product type is Item, either `parentCategoryId` or `parentCategorySKU` must be specified.
3. When product `type` is Bundle, items in a bundle can be added using either SKU or ID.
4. In the response you can see the products that are added successfully and the ones that couldn't be added. # Bulk reassign products to a different category using filter conditions Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/bulk-reassign-products-to-a-different-category-using-filter-conditions product.openapi post /products/actions/filter-change-category To enhance product visibility or improve product organization, you may want to reassign products to a different category. With this endpoint, you can asynchronously reassign products to a different category. Instead of waiting for results through the API response, you'll gets notified via email whether the products were successfully reassigned. # Delete products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/delete-products product.openapi delete /products To keep the product list (catalog) up to date and current, it's important to remove products that are discontinued permanently. With this endpoint, you can delete up to 25 products either by SKUs or IDs. **Note**:
1. Unless all products are deleted, this endpoint fails.
2. To delete a single product, you can use either the ID-based (`DELETE /products/{id}`) or SKU-based endpoint (`DELETE /products/sku/{sku}`). # Find products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/find-products product.openapi post /products/search To find specific products for review or reports, you need to specify the criteria for the search. With this endpoint, you can find products (items, variants, and bundles) based on ID or SKU, type, category, and other criteria. # Get products list Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/get-products-list product.openapi get /products You may have to review products to review or analyze them or create certain reports. This endpoint gets a paginated list of products (items, variants, and bundles) for the specified `locales`. **Note**: Specify product IDs to get only those products. Or, you may mention `offset` and `limit` to refine the search results. When they're not specified, by default, you'll get up to 10 products. # Reassign products to a different category, synchronously. Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/reassign-products-to-a-different-category-synchronously product.openapi post /products/actions/change-category To enhance product visibility or improve product organization, you may want to reassign products to a different category. With this endpoint, you can synchronously reassign up to 25 products to a different category. The response will show a list of successful and unsuccessful reassignments # Update products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/general-product-operations/update-products product.openapi put /products With this endpoint, you can update details of multiple products, which could be items, variants, and bundles. **Note**:
1. When product type is `Variant`, it can be added either via SKU or ID.
2. When product type is `Item`, either the `parentCategoryId` or `parentCategorySKU` must be specified.
3. When product type is `Bundle`, the associated items or variants can be added either via SKU or via ID.
4. At least one product must be specified. # Cancel background jobs using job IDs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/jobs/cancel-background-jobs files-jobs.openapi post /product-jobs/{id}/actions/cancel Cancel any in progress or scheduled background job by providing the job ID. Currently only supports item and variant import jobs. # Get jobs related to products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/jobs/get-jobs-related-to-products files-jobs.openapi get /product-jobs Get a paginated list of jobs related to products by specifying the query parameters such as job `ids`, `type`. You can refine the results by specifying `offset` and `limit`. **Note**:
1. Query parameter `ids` can't be combined with the rest of the query parameters and when it's specified, pagination isn't supported.
2. Query parameter `inputFileIds` supports up to 15 comma-separated file IDs and it can be combined only with the query parameter `lastJobOnly`. Pagination isn't supported when this parameter is used. # Initiate job to export items and variants Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/jobs/initiate-job-to-export-items-and-variants files-jobs.openapi post /product-jobs/actions/export Use this endpoint to trigger a job to export items and variants, by ids. # Initiate job to export items and variants Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/jobs/initiate-job-to-export-items-and-variants-1 files-jobs.openapi post /product-jobs/actions/filter-export Use this endpoint to trigger a job to export items and variants based on the specified filter conditions. # Search jobs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/jobs/search-background-jobs files-jobs.openapi post /product-jobs/search Get a paginated list of jobs related to products and collections by specifying the request body. You need to specify the criteria for the search such as job `id`, `type`, `status`, `collectionId`, `inputFileId`. # Add product Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product product.openapi post /products At fabric, the term products refers to items, variants, and/or bundles. # Add products to bundle by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-products-to-bundle-by-id product.openapi post /products/{id}/bundles/actions/attach Creating a bundle of two or more complementary products, sold as a single package, is a widely adopted sales and marketing strategy. For example, a laptop is bundled with a carrying case and wireless mouse. This makes it convenient for shoppers to purchase them together. With this endpoint, you can add up to 25 products in a bundle that can be sold together. **Note**:
1. At least one product must be added.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `POST /products/sku/{sku}/bundles/actions/attach`. # Add variants to products by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-variants-to-products-by-id product.openapi post /products/{id}/variants/actions/attach Variants are the different options of an item such as size, color, and materials. For example, there are 12 variants for a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer more options to shoppers. With this endpoint, you can add up to 25 variants to an existing product. **Note**:
1. At least one variant must be specified.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `POST /products/sku/{sku}/variants/actions/attach`. # Change product category Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/change-product-category product.openapi post /products/{id}/actions/change-category This endpoint lets you change a product from one category to another. When managing a large number of products, this endpoint gives you the flexibility to organize products easily. # Delete product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/delete-product-by-id product.openapi delete /products/{id} To keep the product list (catalog) up to date and current, it's important to remove products that are discontinued permanently. With this endpoint, you can delete a product (Item, Bundle, or Variant) by ID. Using `deleteVariants` as query parameter, you an optionally specify if you want to delete the associated variants as well. **Note**: If you don't have product ID, use the corresponding SKU-based endpoint - `DELETE /products/sku/{sku}`. # Get product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/get-product-by-id product.openapi get /products/{id} With this endpoint, you can get details of a product (item, bundle, or variant) by ID. The response includes the product's attributes and its variants. You can optionally specify `locales` to get products for specific regions. **Note**: If you don't have product ID, use the corresponding SKU-based endpoint - `GET /products/sku/{sku}` # Get product variants by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/get-product-variants-by-id product.openapi get /products/{id}/variants Variants are different options of an item such as size, color, and materials. For example, there are 12 variants for a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer more options to shoppers . **Note**:
1. At least one variant must be specified.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `GET /products/sku/{sku}/variants`.
3. The `status` parameter is applicable to the `id` passed in path parameter and not for the variants. That is, the variants returned as part of the response are either the variants attached to the Live or Draft version of the product based on the `status` parameter. # Get products in a bundle by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/get-products-in-a-bundle-by-id product.openapi get /products/{id}/bundles Bundle is a collection of products that are sold together as a single package. For example, a laptop is bundled with a carrying case and a wireless mouse to be sold as a package. This endpoint gets a paginated list of products by ID. **Note**:
1. You can refine the results by specifying `offset` and `limit` values. When they're not specified, by default, you'll get up to 10 products.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `GET /products/sku/{sku}/bundles`.
3. The `status` parameter is applicable to the `id` passed in path parameter and not for bundles. That is, bundles returned as part of the response are either the bundles attached to the Live or Draft version of the product based on the `status` parameter. # Partially update product attributes by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/partially-update-product-attributes-by-id product.openapi patch /products/{id}/attributes Product attributes are the objective and factual descriptions of products that shoppers see when they browse through an e-commerce platform. Attributes may be technical specifications like size, weight, etc., design specifications like color, material, etc., or basic specifications such as name, description, ID, etc. With this endpoint, you can partially update attributes of a given product. **Note**:
1. This endpoint is recommended over `PUT /products/{id}/attributes` (Update product attributes by ID) if you want to update only specific attributes without affecting the others.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `PATCH /products/sku/{sku}/attributes`. # Product Catalog API Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/products-api Product team: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | License: [fabric API License](https://fabric.inc/api-license) Product Catalog API, a subset of fabric **Product Catalog**, is designed to improve product management. A product can refer to an item, variant, or bundle. Product Catalog API enables you to create items, add variants to an item, create a bundle, add items to a bundle, update product attributes, get details of one or more products, delete products and search for products. Each product has a title, ID, category, and assigned attributes. Multiple options of a given item become variants of that item and they're nested under a parent item, allowing the different options to appear for the item. [Find out more about Product Catalog](https://developer.fabric.inc/v3/guides/product-catalog/overview) [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsAPI.json) # Publish product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/publish-product-by-id product.openapi post /products/{id}/actions/publish A newly added product can be in `Published` or `Draft` status. With this endpoint, you can publish the Draft version of a product. # Remove products from a bundle by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/remove-products-from-a-bundle-by-id product.openapi post /products/{id}/bundles/actions/detach When one or more products in a bundle are discontinued or no longer required, you don't want them to appear in the bundle. With this endpoint, you can remove up to 25 products by ID. **Note**
1. Products are only detached from the given product, not deleted. They can be added to the same or another product, at a later point.
2. At least one product must be specified.
3. If you don't have product ID, use the corresponding SKU-based endpoint - `POST /products/sku/{sku}/bundles/actions/detach`. # Remove variants by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/remove-variants-by-id product.openapi post /products/{id}/variants/actions/detach When one or more variants of a product are discontinued or no longer required, you don't want them to appear as options for the product. This endpoint provides the flexibility to remove up to 25 variants by ID and manage options efficiently. **Note**:
1. Variants are only detached from the given product, not deleted. They can be reattached to the same or another product at a later point.
2. At least one variant must be specified.
3. If you don't have product ID, use the corresponding SKU-based endpoint - `POST /products/sku/{sku}/variants/actions/detach`. # Unpublish product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/unpublish-product-by-id product.openapi post /products/{id}/actions/unpublish Due to changes in market, you may have to remove a product from being live. With this endpoint, you can unpublish product. # Update product Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/update-product product.openapi put /products/{id} With this endpoint, you can update details of a single product, which could be an items, variant, or a bundles. **Note**:
1. When product type is `Variant`, it can be added either using SKU or ID.
2. When product type is `Item`, either `parentCategoryId` or `parentCategorySKU` must be specified.
3. When product type is Bundle, associated items or variants can also be added either using SKU or via ID.
4. At least one product must be specified. # Update product attributes by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/update-product-attributes-by-id product.openapi put /products/{id}/attributes Product attributes are the objective and factual descriptions of products that shoppers see when they browse through an e-commerce platform. Attributes may be technical specifications like size, weight, etc., design specifications like color, material, etc., or basic specifications such as name, description, ID, etc. This endpoint is used to update product attributes, completely replacing the existing ones. **Note**:
1. This endpoint is recommended over `PATCH /products/{id}/attributes`, if the update involves replacing all the attributes. If there are any missing or null fields in the request, the original values will be replaced with empty ones.
2. If you don't have product ID, use the corresponding SKU-based endpoint - `PUT /products/sku/{sku}/attributes`. # Add products to bundle by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/add-products-to-bundle-by-sku product.openapi post /products/sku/{sku}/bundles/actions/attach Creating a bundle of two or more complementary products, sold as a single package, is a widely adopted sales and marketing strategy. For example, a laptop is bundled with a carrying case and wireless mouse. This makes it convenient for shoppers to purchase them together. With this endpoint, you can add up to 25 products in a bundle that can be sold together. **Note**:
1. At least one product must be added.
2. If you don't have product `sku`, use the corresponding ID-based endpoint - `POST /products/{id}/bundles/actions/attach`. # Add variants to products by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/add-variants-to-products-by-sku product.openapi post /products/sku/{sku}/variants/actions/attach Variants are the different options of an item such as size, color, and materials. For example, there are 12 variants for a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer more options to shoppers. With this endpoint, you can add up to 25 variants to an existing product **Note**:
1. At least one variant must be specified.
2. If you don't have product ID, use the corresponding ID-based endpoint - `POST /products/{id}/variants/actions/attach`. # Delete product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/delete-product-by-sku product.openapi delete /products/sku/{sku} To keep the product list (catalog) up to date and current, it's important to remove products that are discontinued permanently. With this endpoint, you can delete a product (Item, Bundle, or Variant) by SKU. Using `deleteVariants` as query parameter, you an optionally specify if you want to delete the associated variants as well. **Note**: If you don't have product SKU, use the corresponding ID-based endpoint - `DELETE /products/{id}`. # Get product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-product-by-sku product.openapi get /products/sku/{sku} You may want to periodically review details of a product to ensure they're correct. This endpoint gets details of a product (item, bundle, or variant) by SKU. The response includes products attributes and its variants. You can optionally specify `locales` to get products for specific regions. **Note**: If you don't have product SKU, use the corresponding ID-based endpoint - `GET /products/{id}`. # Get product variants by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-product-variants-by-sku product.openapi get /products/sku/{sku}/variants Variants are different options of an item such as size, color, and materials. For example, there are 12 variants for a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer more options to shoppers **Note**:
1. At least one variant must be specified.
2. If you don't have product ID, use the corresponding ID-based endpoint - `/products/{id}/variants`.
3. The `status` parameter is applicable to the `id` passed in path parameter and not for variants. That is, the variants returned as part of the response are the variants attached to either the Live or Draft version of the product based on the `status` parameter. # Get products by SKUs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-products-by-skus product.openapi get /products/sku Get a paginated list of product (Item, Bundle, or Variant) by SKU, including the attributes and variants. You can optionally specify `locales` to get products for specific regions. **Note**:
1. You can refine the results by specifying `offset` and `limit` values. If you don't specify them, by default, you'll get up to 10 products.
2. If you don't have product SKU, use the corresponding ID-based endpoint - `GET /products/{id}`. # Get products in a bundle by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/get-products-in-a-bundle-by-sku product.openapi get /products/sku/{sku}/bundles Bundle is a collection of products that are sold together as a single package. For example, a laptop is bundled with a carrying case and a wireless mouse to be sold as a package. This endpoint gets a paginated list of products by ID. **Note**:
1. You can refine the results by specifying `offset` and `limit` values. When they're not specified, by default, you'll get up to 10 products.
2. If you don't have product SKU, use the corresponding ID-based endpoint - `GET /products/{id}/bundles`.
3. The `status` parameter is applicable to the `id` passed as path parameter and not for bundles. That is, the bundles returned in the response are the bundles attached to either the Live or Draft version of the product based on the `status` parameter. # Partially update product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/partially-update-product-by-sku product.openapi patch /products/sku/{sku}/attributes Product attributes are the objective and factual descriptions of products that shoppers see when they browse through an e-commerce platform. Attributes may be technical specifications like size, weight, etc., design specifications like color, material, etc., or basic specifications such as name, description, ID, etc. This endpoint is used to partially update attributes of the given product attributes. **Note**:
1. This endpoint is recommended over `PUT /products/sku/{sku}/attributes` (Update product attributes by SKU) if you want to update only specific attributes without affecting the others.
2. If you don't have product SKU, use the corresponding ID-based endpoint - `PATCH /products/{id}/attributes`. # Publish product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/publish-product-by-sku product.openapi post /products/sku/{sku}/actions/publish A newly added product can be in `Published` or `Draft` status. With this endpoint, by specifying `sku`, you can publish a product in Draft status. # Remove product variants by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/remove-product-variants-by-sku product.openapi post /products/sku/{sku}/variants/actions/detach When one or more variants of a product are discontinued or no longer required, you don't want them to appear as options. This endpoint provides the flexibility to remove up to 25 variants by SKU and manage product options, efficiently. **Note**:
1. Variants are only detached from the given product, not deleted. They can be reattached to the same or another product, at a later point.
2. At least one variant must be specified.
3. If you don't have product SKU, use the corresponding ID-based endpoint - `POST /products/{id}/variants/actions/detach`. # Remove products from a bundle by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/remove-products-from-a-bundle-by-sku product.openapi post /products/sku/{sku}/bundles/actions/detach When one or more products in a bundle are discontinued or no longer required, you don't want them to appear in the bundle. With this endpoint, you can remove up to 25 products by SKU. **Note**
1. Products are only detached from the given product, not deleted. They can be added to the same or another product, at a later point.
2. At least one product must be specified.
3. If you don't have product ID, use the corresponding SKU-based endpoint - `POST /products/{id}/bundles/actions/detach`. # Unpublish product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/unpublish-product-by-sku product.openapi post /products/sku/{sku}/actions/unpublish Due to changes in market, you may have to remove a product from being live. With this endpoint, you can unpublish a product by specifying `sku`. # Update product attributes by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/update-product-attributes-by-sku product.openapi put /products/sku/{sku}/attributes Product attributes are the objective and factual descriptions of products that shoppers see when they browse through an e-commerce platform. Attributes may be technical specifications like size, weight, etc., design specifications like color, material, etc., or basic specifications such as name, description, ID, etc. This endpoint is used to update product attributes, completely replacing the existing ones. **Note**:
1. This is recommended over `PATCH /products/sku/{sku}/attributes`, if the update involves replacing all the attributes. If there are any missing or null fields in the request, the original values will be replaced with empty ones.
2. If you don't have product SKU, use the corresponding ID-based endpoint - `PUT /products/{id}/attributes`. # Update product SKUs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/product-operations-by-sku/update-product-skus product.openapi put /products/sku You may need to update the SKUs of one or more products if the products have undergone significant improvements, and you need a way to differentiate between the updated version and the previous one. Or, you may want to address a typographical error or inconsistencies in the SKU naming conventions. This endpoint updates SKUs for up to 25 products. **Note**: Unless all SKUs are updated, the endpoint will fail. # Product Catalog - Files and Jobs API Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/products---files-and-jobs-api Product team: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | License: [fabric API License](https://fabric.inc/api-license) fabric's **Files and Jobs** API supports bulk import and export of items, attributes, and bundles. Generally, the first step is to download the appropriate template for import. There are separate endpoints to get templates for items (`POST /item-import-templates`), attributes (`POST /attribute-import-templates`), and bundles (`POST /bundle-import-templates`). Once the import details are filled out in the template, you need to provide the file name and type in the request body of the `POST /files/product` endpoint. In the endpoint response, you will get the URL to upload the file to be imported. Using job exports endpoints, you can export the uploaded products and attributes based on specified criteria. For information on the optimal methods to import data into fabric, see [Data Ingestion Best Practices](/v3/api-reference/product-catalog/data-ingestion-best-practices). [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsFileAndJobs.json) # Product Catalog - Published Product Catalog API Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/products---published-products-api Product team: [fabric support](https://support.fabric.inc/hc/en-us/requests/new) | License: [fabric API License](https://fabric.inc/api-license) fabric Published Product Catalog API enables displaying products (items, variants, and bundles) and their details on your e-commerce platform (website or mobile app). Published products are products that are ready to be sold. These endpoints support getting one or more product details by product ID or SKUs also support search and filter functions, making it easier for shoppers to view product details such as descriptions, specification, images, and more. This will help them make informed purchases and enjoy a better shopping experience. [Find out more about Product](/v3/product-catalog/user-guides/product-catalog/overview) [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/productsPublishedProducts.json) # Get collections by product ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-id/get-collections-by-product-id published-product.openapi get /published-products/{id}/collections On your Storefront products are organized or grouped in logical groups called Collections. The main purpose of Collection is distribution management by displaying products on your website based on separate browsing structures required to achieve specific merchandising objectives, such as organizational requirements, multi-regional assortments, multi-channel assortments, and collections. This endpoint gets the collection details of a published product by ID. You can refine your search results by specifying query parameters - `collectionIds` and `collectionRootName` **Note**:
1. You can narrow down the results by specifying `offset` and `limit`. When they're not specified, by default, you'll get up to 10 products.
2. If you don't have product ID, use the corresponding item ID-based or SKU-based endpoints. # Get products by IDs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-id/get-products-by-ids published-product.openapi get /published-products/ids Shoppers may want to view the products they've already identified or bookmarked, or you may want to promote a particular set of products as part of promotions. This endpoint get details of published products with or without variants, categories, bundle products, and collections. You can specify multiple comma-separated product `ids`. Using this endpoint, you can show up to 25 products on your Storefront. **Note**: If you don't have product ID, use the corresponding item ID-based or SKU-based endpoints. # Get products in a bundle by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-id/get-products-in-a-bundle-by-id published-product.openapi get /published-products/{id}/bundle-products A bundle is a collection of products that are sold together as a single package. For example, a laptop is bundled with a carrying case and a wireless mouse to be sold as a package. This endpoint gets a paginated list of published products in a bundle by bundle ID. You can refine your search results by specifying query parameters - `excludeBundleProducts`, `excludeCollections`, `excludeCategories` and `excludeVariants` **Note**:
1. You can refine the results by specifying `offset` and `limit`. When they're not specified, by default, you'll get up to 10 products.
2. If you don't have product ID, use the corresponding item ID-based or SKU-based endpoints. # Get published product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-id/get-published-product-by-id published-product.openapi get /published-products/{id} Your Storefront must displays all the relevant information for shoppers to make an informed purchase decision. This endpoint gets details of a published product (item, bundle, or variant) by ID, which can be used to display product details on your Storefront. **Note**: If you don't have product ID, use the corresponding SKU-based or item ID-based endpoints. # Get variants of published product by ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-id/get-variants-of-published-product-by-id published-product.openapi get /published-products/{id}/variants Variants are the different versions of a product with different sizes, colors, or materials. For example, there are 12 variants of a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer shoppers more options. This endpoint gets a paginated list of variants of a published product by ID. **Note**:
1. You can narrow down the search results by specifying `offset` and `limit`. When they're not specified, by default you'll get up to 10 records.
2. If you don't have product ID, use the corresponding SKU-based or item ID-based endpoints. # Get bundle products by bundle SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-bundle-products-by-bundle-sku published-product.openapi get /published-products/skus/{sku}/bundle-products A bundle is a collection of products that are sold together as a single package. For example, a laptop is bundled with a carrying case and a wireless mouse to be sold as a package. This endpoint gets a paginated list of published products in a bundle by bundle SKU. **Note**:
1. You can refine the results by specifying `offset` and `limit`. When they're not specified, by default, you'll get up to 10 products.
2. If you don't have product SKU, use the corresponding item ID-based or product ID-based endpoints. # Get collections by product SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-collections-by-product-sku published-product.openapi get /published-products/skus/{sku}/collections On your Storefront products are organized or grouped in logical groups called Collections. The main purpose of collection is distribution management by displaying products on your website based on separate browsing structures required to achieve specific merchandising objectives, such as organizational requirements, multi-regional assortments, multi-channel assortments, and collections. This endpoint gets the collection details of a published product by ID. You can refine your search results by specifying query parameters - `collectionIds` and `collectionRootName`. **Note**: If you don't have SKU, use the corresponding item ID-based or product ID-based endpoints. # Get published product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-published-product-by-sku published-product.openapi get /published-products/skus/{sku} Your Storefront must displays all the relevant information for shoppers to help them make an informed purchase decision. This endpoint gets details of a published product (item, bundle, or variant) by SKU, which can be used to display product details on your Storefront. **Note**: If you don't have product SKU, use the corresponding item ID-based or product ID-based endpoints. # Get published products by SKUs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-published-products-by-skus published-product.openapi get /published-products/skus Shoppers may want to view the products they've already identified or bookmarked, or you want to promote a particular set of products as part of promotions. This endpoint gets multiple published products based on `skus` (comma-separated values) and is useful to show product list (up to 25 products) on your Storefront. **Note**:
1. Using the examples you can see separate response for items, variants, and bundles.
2. If you don't have product SKU, use the corresponding item ID-based or product ID-based endpoints. # Get variants of published products by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/product-catalog/published-products-by-sku/get-variants-of-published-products-by-sku published-product.openapi get /published-products/skus/{sku}/variants Variants are different versions of a product with different sizes, colors, or materials. For example, there are 12 variants of a laptop that comes in three sizes (13, 15, and 17 inches) and four colors (red, blue, grey, and white). By adding variants to products, you can offer shoppers more options. This endpoint gets a paginated response of variants of a published product by SKU. **Note**:
1. You can refine results by specifying `offset` and `limit`. When they're not specified, by default you'll get up to 10 records.
2. If you don't have product SKU, use the corresponding item ID-based or product ID-based endpoints. # Create add-on Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/create-add-on addons.openapi post /addons Create an add-on with its price and currency details. By creating add-ons, you can enhance customer experience by allowing them to choose personalized products while placing an order. # Delete a specific add-on Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/delete-a-specific-add-on addons.openapi delete /addons/{id} Delete an add-on by ID. # Get a specific add-on Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/get-a-specific-add-on addons.openapi get /addons/{id} Get a specific add-on by ID. # Get all add-ons Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/get-all-add-ons addons.openapi get /addons Get a paginated list of all the created add-ons. # Add-ons Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/overview Add-ons are additional items that shoppers can buy while placing an order. These endpoints let you create, update, and delete details of add-ons, including their prices and currency types. # Update a specific add-on Source: https://developer.fabric.inc/v3/offers/api-reference/offers/add-ons/update-a-specific-add-on addons.openapi put /addons/{id} Update a specific add-on by ID. # Bulk update coupon codes Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupon-codes/bulk-update-coupon-codes coupon-codes.openapi put /coupon-codes/batch Use this endpoint to update multiple coupon codes using identifiers. Identifiers are a unique combination of a coupon code and a promotion ID. You can update up to 25 codes at a time. # Get all coupon codes Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupon-codes/get-all-coupon-codes coupon-codes.openapi get /coupon-codes This endpoint provides coupon code lists. Use parameters to filter results, for example, set `status` as 'ACTIVE' for active coupons, or add `userId` for user-specific coupon codes. Navigate the results using the query parameters `size` and `startCursor`. # Create coupon Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/create-coupon coupons.openapi post /coupons Create a coupon with the requested conditions. # Delete a specific coupon Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/delete-a-specific-coupon coupons.openapi delete /coupons/{couponId} Delete a specific coupon by ID # Enable or disable a coupon Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/enable-or-disable-a-coupon coupons.openapi post /coupons/{couponId}/actions/toggle Change coupon status by ID. **Enable a coupon:** Only *disabled* coupons can be enabled. **Disable a coupon:** Only *not expired* coupons can be disabled. # Generate coupon codes Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/generate-coupon-codes coupons.openapi post /coupons/actions/generate-codes Generate coupon codes based on the given parameter. # Get all coupons Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/get-all-coupons coupons.openapi get /coupons Get a paginated list of coupons. # Coupons Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/overview Coupons are discounts on items, carts, or shipping that are applied to qualified purchases when shoppers provide a valid coupon code during the checkout process. You can use the `coupon` endpoints to create and manage coupons and their codes. # Retrieve a coupon Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/retrieve-a-coupon coupons.openapi get /coupons/{couponId} Use this endpoint to retrieve the details of a coupon by its ID. # Search for coupons Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/search-for-coupons coupons.openapi post /coupons/search Use this endpoint to search for coupons based on filter conditions. # Update a specific coupon Source: https://developer.fabric.inc/v3/offers/api-reference/offers/coupons/update-a-specific-coupon coupons.openapi put /coupons/{couponId} Update a specific coupon by ID. # Exporting Offers CSV Source: https://developer.fabric.inc/v3/offers/api-reference/offers/developer-guide/exporting-csv This topic provides developers with step-by-step instructions for exporting product pricing data in CSV format using Offers export API endpoints. It includes initiating an export request and downloading a CSV file containing product prices, enabling seamless integration with pricing analytics, inventory management, or external reporting tools. Exporting product pricing data as a CSV file involves three main steps: 1. [Initiate an export request](/v3/offers/api-reference/offers/exports/initiate-export-request): Send a request to generate an `exportId` and configure filters to target specific data. 2. [Retrieve the export details](/v3/offers/api-reference/offers/exports/get-export-request-by-id): Use the `exportId` to check the progress and retrieve the `fileId` after the export is complete. 3. [Download the CSV File](/v3/offers/api-reference/offers/exports/download-exported-csv-file): With the `fileId`, obtain a download link to retrieve the CSV file. ## Export parameters You can the refine the data included in your export by specifying filters in the `filters` array. If you leave the array empty, all data is included. The following table describes the parameters for filtering and the functions of each parameter: | **Parameter** | **Description** | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `field` | Specifies the data type used to search. Use `priceType` to set it as the search criteria. | | `value` | Specifies the exact value for the selected `field`. If `priceType` is used as `field`, you must enter the corresponding `priceType` value for this parameter. | | `operator` | Specifies how the `value` is applied to the `field`. If the field is `priceType` and the operator is set to `EQUAL`, all products with the specified `value` are included in the search result. | The following table provides detailed information for the two different data types: * `CALCULATED_PRICE`: If the data type you want to export is `CALCULATED_PRICE`, use the following `field`, `operator`, and `value`: | `field` | `operator` | `value` | | ----------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `priceType` | `EQUAL` | Filter your data by `BASE` or `SALE` price. If the `filters` array in the request body is empty, both prices are included in the CSV export. | | `priceListIds` | `IN` | Filter your data by a list of `priceListIds` by including them in an array in the request body. If the `filters` array is empty, the data is based on the default `priceList`. | | `calculationTime` | `EQUAL` | Filter your data by an ISO timestamp to specify when the price should be calculated. The provided timestamp is used for price determination. If the `filters` array is empty, the price is based on the CSV execution time. | * `REDEMPTION`: If the data type you want to export is `REDEMPTION`, use the following `field`, `operator`, and `value`: | `field` | `operator` | `value` | | ----------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `promoCode` | `EQUAL` | Filter your data by redeemed promotion code. | | `userId` | `EQUAL` | Filter your data by provided user ID. | | `email` | `EQUAL` | Filter your data by provided email. | | `orderId` | `EQUAL` | Filter your data by provided order ID. | | `redeemedAt` |
  • `EQUAL`
  • `GREATER_THAN_OR_EQUAL_TO`
  • `LESS_THAN`
| Filter data based on the provided redemption date. If the operator is:
  • `EQUAL`: Redemptions on the provided date.
  • `GREATER_THAN_OR_EQUAL_TO`: Redemptions on and after the provided date.
  • `LESS_THAN`: Redemptions before the provided date.
| | `storeId` | `EQUAL` | Filter data based on case-insensitive promotion titles. | | `promotionStatus` | `EQUAL` | Filter data based on the specified promotion status:
  • `ACTIVE`
  • `EXPIRED`
  • `DISABLED`
| We recommend not to seach for all the `REDEMPTION` data by leaving the `filters` array empty. ## Prerequisites * Ensure that you have Offers editor or administrator privileges to fabric Offers. For more information, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-offers-roles) section. * Ensure that you have added one or more products using one of the following methods: * [Copilot](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item) * [API endpoints](/v3/product-catalog/api-reference/product-catalog/product-operations-by-id/add-product) * Ensure that you have added price to the products using one of the following methods: * [Copilot](/v3/offers/user-guides/offers/pricing) * [API endpoints](/v3/offers/api-reference/offers/prices/create-price) * Ensure that you have created a redemption for the products using the [create a redemption](/v3/offers/api-reference/offers/redemptions/create-redemption) endpoint. ## Procedure ### Step 1: Initiating an export request 1. Submit a POST request including the `type`, such as `CALCULATED_PRICE` or `REDEMPTION` with any required `filters`. The duration for this process increases with the amount of data being exported. The [initiate offers export](/v3/offers/api-reference/offers/exports/initiate-export-request) endpoint initiates a CSV export request and generates an `exportId`. The following example shows a POST request with the request body set to `type` as `REDEMPTION`, searching for `storeId` with the value `store001`: ```bash curl --request POST \ --url https://api.fabric.inc/v3/offers-exports \ --header 'Authorization: Bearer exampleToken123' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: exampleTenantID456' \ --data '{ "type": "REDEMPTION", "filters": [ { "field": "storeId", "value": "store001", "operator": "EQUAL" } ] }' ``` A successful request returns the following response: ```json { "exportId": "ab50fe48-5da0-4e77-92d1-bb629eedf19e", "startedAt": "2023-05-17T21:24:52.398Z", "endedAt": "null", "totalDataExported": 0, "status": "IN_PROGRESS", "errors": [], "type": "REDEMPTION", "filters": [ { "field": "storeId", "value": "store001", "operator": "EQUAL" } ] } ``` ### Step 2: Retrieve the `fileId` After initiating the export request, use the `exportId` generated in [step 1](#step-1-initiate-export-request) to [retrieve details of the request](/v3/api-reference/offers/exports/get-export-request-by-id). You can view the export details, such as `startedAt` and `endedAt` times, as well as the `totalDataExported`. The export request might take up to 10 hours. 1.[Submit a GET request using the `exportId`](/v3/offers/api-reference/offers/exports/get-export-request-by-id) endpoint to check the export status to retrieve the `fileId`. 1. When the `status` is `COMPLETED`, use the `fileId` in the [download the exported CSV file](/v3/offers/api-reference/offers/exports/download-exported-csv-file) step to download the CSV file. Use the following GET request to retrieve the details of an export request, including its status and `fileId`: ```bash curl --request GET \ --url https://api.fabric.inc/v3/offers-exports/ab50fe48-5da0-4e77-92d1-bb629eedf19e \ --header 'Authorization: Bearer exampleToken123' \ --header 'x-fabric-tenant-id: exampleTenantID456' ``` A successful request returns the following response: ```json { "exportId": "ab50fe48-5da0-4e77-92d1-bb629eedf19e", "startedAt": "2023-05-17T21:24:52.398Z", "endedAt": "null", "totalDataExported": 0, "status": "IN_PROGRESS", "errors": [], "type": "REDEMPTION", "filters": [ { "field": "storeId", "value": "store001", "operator": "EQUAL" } ], "fileId": "redemption/tenantId/1687472977242-redemption-export.csv" } ``` Wait until you receive a response with `status: COMPLETED` before moving to the next step. If you don't receive a `status` of `COMPLETED`, [you won't get a complete export file](#exported-file-is-incomplete). ### Step 3: Downloading the exported CSV file 1. After retrieving `fileId` from [step 2](#step-2-retrieve-the-fileid), include it in the request body of the [download exported CSV file](/v3/offers/api-reference/offers/exports/download-exported-csv-file) endpoint to generate a temporary URL for downloading the file as shown in the following request: ```bash curl --request POST \ --url https://api.fabric.inc/v3/offers-exports/actions/download-export-file \ --header 'Authorization: Bearer exampleToken123' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: exampleTenantID456' \ --data '{ "fileId": "redemption/tenantId/1687472972-redemption-export.csv" }' ``` A successful request returns the following response with a URL used to download your file: ```json { "url": {Your Download URL}, "fileId": "redemption/tenantId/1687472972-redemption-export.csv" } ``` You can copy and paste the URL from the response into your browser's address bar to download your file. This URL is valid for 5 minutes. If you exceeded this duration, repeat [step 3](#step-3-download-exported-csv-file) to generate another URL. ## Common Variations ### Searching with multiple fields You can include more than one `field` in the `filters` array as long as you are filtering single data type. Using more than one `field` allows you to refine the search results to meet all of the specified search conditions. You can expand the following example of a POST request to initiate an export request with more than one `field`. In the following example, the request filters `CALCULATED_PRICE` by both `priceType` and `priceListIds`: ```bash curl --request POST \ --url https://api.fabric.inc/v3/offers-exports \ --header 'Authorization: Bearer exampleToken123' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: exampleTenantID456' \ --data '{ "type": "CALCULATED_PRICE", "filters": [ { "field": "priceType", "value": "BASE", "operator": "EQUAL" }, { "field": "priceListIds", "value": [ 1000003, 1000004 ], "operator": "IN" } ] }' ``` A successful request returns the following response: ```json { "exportId": "4a73a9a9-b8c3-4dc1-a467-c528a1b2dfe7", "startedAt": "2023-12-01T10:33:33.638Z", "endedAt": "null", "totalDataExported": 0, "status": "IN_PROGRESS", "errors": [], "type": "CALCULATED_PRICE", "filters": [ { "field": "priceType", "value": "BASE", "operator": "EQUAL" }, { "field": "priceListIds", "value": [ 1000003, 1000004 ], "operator": "IN" } ] } ``` ### Retrieving all export requests If you have initiated multiple export requests, you can retrieve details of all export requests using the [Get all export requests](/v3/offers/api-reference/offers/exports/get-all-export-requests) endpoint. A successful request returns an array containing details of all export request details, including the respective `fieldId` values. You can expand the following example to see the GET response: ```json { "query": { "size": 10, "offset": 10, "count": 50 }, "data": [ { "exportId": "ab50fe48-5da0-4e77-92d1-bb629eedf19e", "startedAt": "2023-05-17T21:24:52.398Z", "endedAt": "null", "status": "IN_PROGRESS", "type": "REDEMPTION", "totalDataExported": 0, "fileId": "redemption/tenantId/1687294954996-redemption-export.csv" }, { "exportId": "4a73a9a9-b8c3-4dc1-a467-c528a1b2dfe7", "startedAt": "2023-12-01T10:33:33.638Z", "endedAt": "null", "status": "IN_PROGRESS", "type": "CALCULATED_PRICE", "totalDataExported": 0, "fileId": "redemption/tenantId/5900139542278-calculated-price-export.csv" } ] } ``` ## Troubleshooting ### `EXPORT_CALCULATED_PRICE_ERROR` If you get the `EXPORT_CALCULATED_PRICE_ERROR` error after initiating an export request, resubmit the request. If the problem persists, contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new). ### Exported file is incomplete If your exported CSV is incomplete, use the [get export request](/v3/offers/api-reference/offers/exports/get-export-request-by-id) endpoint and ensure that the `status` is marked as `COMPLETED`. If the `status` remains `IN_PROGRESS` after the 10-hours, try the request again or contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new). ### CSV file download link not working The download link is valid for only 5 minutes. If the link has expired, generate the link again using the [download exported CSV file](/v3/api-reference/offers/exports/download-exported-csv-file) endpoint. If the problem persists, contact [fabric support](https://support.fabric.inc/hc/en-us/requests/new). ## Related Topics * [Initiate export request](/v3/offers/api-reference/offers/exports/initiate-export-request) * [Get export request by ID](/v3/offers/api-reference/offers/exports/get-export-request-by-id) * [Get all export requests](/v3/offers/api-reference/offers/exports/get-all-export-requests) * [Download exported CSV file](/v3/offers/api-reference/offers/exports/download-exported-csv-file) # Offers (3.0.0) Source: https://developer.fabric.inc/v3/offers/api-reference/offers/offers--3-0-0 Offers support: [fabric support](https://support.fabric.inc/hc/en-us/requests/new)| License: [fabric API License](https://fabric.inc/api-license)\ fabric Offers service supports two sets of APIs. The first set is for managing the Create, Retrieve, Update, and Delete (CRUD) operations for objects, such as prices, promotions, and coupons. The second set is our [Real-Time Pricing Engine (RTPE)](/v3/offers/api-reference/offers/real-time-pricing-engine/overview) designed to power your site experiences, such as displaying prices and promotional discounts on a Product Description Page (PDP) or shopping cart. ### Related Resources * [Offers](/v3/offers/user-guides/offers/overview) * [Prices](/v3/offers/api-reference/offers/prices/overview) * [Promotions](/v3/offers/api-reference/offers/promotions/overview) * [Coupons](/3/offers/user-guides/offers/coupons/overview) [Download Postman Collection](https://github.com/FabricCommerce/public-fabric-api-postman-collections/blob/main/v3/offers.json) # Create price control Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/create-price-control price-controls.openapi post /price-controls Create a price control record that contains various price types other than the elemental prices such as base price, sale price, and sale price. # Delete price controls by itemId Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/delete-price-controls-by-itemid price-controls.openapi delete /price-controls/{itemId} Delete price controls of a specific item by `itemId` # Get all price controls Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/get-all-price-controls price-controls.openapi get /price-controls Get a paginated list of all the created price controls. # Get price controls by itemId Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/get-price-controls-by-itemid price-controls.openapi get /price-controls/{itemId} Get price control records of an item by `itemId` and `priceListId`. If `priceListId` isn't specified, price controls of the item will be retrieved under the default price list. # Get price controls by SKU Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/get-price-controls-by-sku price-controls.openapi get /price-controls/sku/{sku} Get price controls of a specific product by `sku`. # Price Controls Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/overview With price control endpoints, merchants can create and manage more diversified prices, such as Manufacturer Recommended Retail Price (MSRP), Minimum Advertised Price (MAP), floor price, and ceiling price, for an item. These endpoints restrict any accidental changes to the base and sale prices. # Update price controls by itemId Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-controls/update-price-controls-by-itemid price-controls.openapi put /price-controls/{itemId} Update price controls of a specific item by `itemId` and `piceListId`. If `priceListId` isn't specified, price controls of the item will be updated under the default price list. # Create price list Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/create-price-list price-lists.openapi post /price-lists Create a price list. Based on the currency code you define for a price list, you will be able to create or update prices under the price list for the defined currency code only. # Delete a specific price list Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/delete-a-specific-price-list price-lists.openapi delete /price-lists/{id} Delete a specific price list by ID. # Get a specific price list Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/get-a-specific-price-list price-lists.openapi get /price-lists/{id} Get a specific price list by ID. # Get all price lists Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/get-all-price-lists price-lists.openapi get /price-lists Get a paginated list of all price lists. # Price Lists Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/overview A price list is a collection of items and their assigned prices. You can add the same item to multiple price lists and set different prices for that item in each of those lists. For example, for the same item, you can assign a one-time purchase price, a subscription price, or a special loyalty member price. You can set the currency and duration of the prices in each price list. If the price list expires, the prices of items within the price list will also expire. # Update a specific price list Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-lists/update-a-specific-price-list price-lists.openapi put /price-lists/{id} Update a specific price list by ID. # Create price method Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-methods/create-price-method price-methods.openapi post /price-methods Create a price method that you can use to set up the SKU price. Price method can be created based on SKU quantity, dimension of the SKU, or any other strategy that aligns with the business. # Delete a specific price method Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-methods/delete-a-specific-price-method price-methods.openapi delete /price-methods/{id} Delete a specific price method by ID. # Get all price methods Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-methods/get-all-price-methods price-methods.openapi get /price-methods Get a paginated list of all price methods of SKUs. # Price Methods Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-methods/overview Price methods are the different approaches or strategies used in calculating prices. These endpoints let you set up the SKU price by choosing a defined price method. # Update a specific price method Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-methods/update-a-specific-price-method price-methods.openapi put /price-methods/{id} Update a specific price method by ID. # Get price types Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-types/get-price-types price-types.openapi get /price-types Get a paginated list of all price types. # Price Types Source: https://developer.fabric.inc/v3/offers/api-reference/offers/price-types/overview Using the price type endpoints, you can get the following price types: * **Base price:** The regular amount that merchants charge shoppers to purchase an item. * **Sale price:** The lowest amount that merchants charge shoppers to purchase an item without a promotion or coupon. # Get priced products Source: https://developer.fabric.inc/v3/offers/api-reference/offers/priced-products/get-priced-products priced-products.openapi get /priced-products Get a paginated list of products and prices for the specified price list ID. # Get product and price details by product item ID Source: https://developer.fabric.inc/v3/offers/api-reference/offers/priced-products/get-product-and-price-details-by-product-item-id priced-products.openapi get /priced-products/{itemId} Get product and price details by product item ID # Get product and price details by SKU Source: https://developer.fabric.inc/v3/offers/api-reference/offers/priced-products/get-product-and-price-details-by-sku priced-products.openapi get /priced-products/sku/{sku} Retrieves the details of a product and its associated prices using the SKU, including the details for the variants of the product, if any. # Get SKUs in price list Source: https://developer.fabric.inc/v3/offers/api-reference/offers/priced-products/get-skus-in-price-list priced-products.openapi get /priced-products-identifiers Retrieve SKUs and product item IDs that have a price entry in the given price list. # Create batch prices Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/create-batch-prices prices.openapi post /prices/batch Create one or more prices for items based on `itemId` and `itemSku`. # Create price Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/create-price prices.openapi post /prices Create or update price of an item based on given `itemId` and `itemSku` # Delete price by itemId Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/delete-price-by-itemid prices.openapi delete /prices/{itemId} Delete price details by `itemId`. If `priceListId` isn't specified, price is deleted for the `itemId` that belongs to the default price list. # Delete price by SKU Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/delete-price-by-sku prices.openapi delete /prices/sku/{sku} Delete price record for the given `sku` and `priceListId`. # Get all active prices Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/get-all-active-prices prices.openapi get /prices Get a paginated list of active and scheduled prices. Active prices have start date greater than the current date and end date is in the future. # Get price by itemId Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/get-price-by-itemid prices.openapi get /prices/{itemId} Get a paginated list of price details for the given `itemId` and `priceListId`. If `priceListId` isn't specified, prices are retrieved for the `itemId` that belongs to the default price list. # Get price by SKU Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/get-price-by-sku prices.openapi get /prices/sku/{sku} Get price details for the `sku` and `priceListId`. If `priceListId` isn't specified, price is retrieved for the `sku` that belongs to the default price list. # Prices Source: https://developer.fabric.inc/v3/offers/api-reference/offers/prices/overview Pricing endpoints let you create and manage price details for one or more items. You can configure the prices endpoints to include your default price list in all requests. # Create promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/create-promotion promotions.openapi post /promotions Create a promotion to apply to one or more items to increase sales, or to a customer segment to reward existing customers or attract new ones. Promotions are configured with rules that define the promotion type, conditions, and discounts. # Delete a specific promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/delete-a-specific-promotion promotions.openapi delete /promotions/{promotionId} Delete a specific promotion using the corresponding `promotionId`. # Enable or disable a promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/enable-or-disable-a-promotion promotions.openapi post /promotions/{promotionId}/actions/toggle Use this endpoint to change the status of a promotion by enabling or disabling it. You can't change the status of a promotion that's currently in the `ACTIVE` state. You can enable promotions that are disabled or disable promotions that haven't yet expired. # End a promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/end-a-promotion promotions.openapi post /promotions/{promotionId}/actions/end End a specific promotion using the corresponding `promotionId`. To end a promotion, set the `status` to `EXPIRED` and set both the `startAt` and `endAt` dates to the current date. # Get a specific promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/get-a-specific-promotion promotions.openapi get /promotions/{promotionId} Retrieves a specific promotion using the corresponding `promotionId`. # Get all promotions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/get-all-promotions promotions.openapi get /promotions Retrieves a paginated list of all promotions. # Promotions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/overview Promotions are discounts on items, carts, or shipping that are applied automatically if the required conditions are met. Using the `promotions` endpoints, you can create and manage promotions. # Search for promotions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/search-for-promotions promotions.openapi post /promotions/search Use this endpoint to search for promotions based on specified filter conditions. # Update a specific promotion Source: https://developer.fabric.inc/v3/offers/api-reference/offers/promotions/update-a-specific-promotion promotions.openapi put /promotions/{promotionId} Updates a specific promotion using the corresponding `promotionId`. # Calculate prices for products by IDs Source: https://developer.fabric.inc/v3/offers/api-reference/offers/real-time-pricing-engine/calculate-prices-for-products-by-ids price-engine.openapi post /price-engine/actions/evaluate-products-by-id Use this endpoint to calculate prices for one or more products in a specific price list using item IDs. If you prefer to use SKUs to calculate product prices, use the [calculate prices for products by SKUs](/v3/api-reference/offers/real-time-pricing-engine/calculate-prices-for-products-by-skus) endpoint. # Calculate prices for products by SKUs Source: https://developer.fabric.inc/v3/offers/api-reference/offers/real-time-pricing-engine/calculate-prices-for-products-by-skus price-engine.openapi post /price-engine/actions/evaluate-products-by-sku Use this endpoint to calculate prices for one or more products in a specific price list by product SKUs. If you prefer to use item IDs to calculate product prices, use the [calculate prices for products by item IDs](/v3/api-reference/offers/real-time-pricing-engine/calculate-prices-for-products-by-item-ids) endpoint. `itemId` is used as the default identifier for a product. If you want to set SKUs as product identifiers and use this endpoint, you must contact fabric support at support@fabric.inc. # Evaluate cart promotions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/real-time-pricing-engine/evaluate-cart-promotions price-engine.openapi post /price-engine/actions/evaluate-cart Evaluate cart's total cost instantly, after applying all applicable promotions and discount coupons. Using this endpoint, submit a range of data that will be referenced against the conditions that are set earlier using the promotions, coupons or prices APIs. The response includes the details of the promotions and discounts applied. These promotions and discounts can be displayed on your website to help shoppers know that they're getting their expected discounts. # Real-time Pricing Engine Source: https://developer.fabric.inc/v3/offers/api-reference/offers/real-time-pricing-engine/overview fabric’s Real-time Pricing Engine (RTPE) endpoints calculate prices and evaluate discounts for individual products and carts. * The endpoints `Get prices by item ID` and `Get prices by product SKUs` are used to power product description pages. * The endpoint `Evaluate cart promotions` is used to determine prices and returns cart-level promotions. * Both the base price and sales prices are included. * Use segments to target specific customer groups with particular promotions. * Settings specific to stacking influence how RTPE applies promotions, determining which can be combined and in what order. RTPE relies on cached information rather than getting product offers from the database. This approach is useful for immediate evaluation of promotions and price calculations. It's designed for speed, supports intricate promotional strategies, and handles millions of pricing requests daily. # Bulk update redemptions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/bulk-update-redemptions redemptions.openapi put /redemptions/batch Use this endpoint to update multiple redemptions by including the corresponding `redemptionId` values in the request body. You can update up to 25 redemptions at a time. # Create redemption Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/create-redemption redemptions.openapi post /redemptions Creates a redemption for a specific promotion using the corresponding `promotionId` value in the request body. # Create redemption Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/create-redemption-using-coupon redemptions.openapi post /coupons/{couponId}/redemptions Creates a redemption for a specific coupon using the corresponding `couponId` value. # Delete a coupon redemption by ID Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/delete-coupon-redemption-by-id redemptions.openapi delete /coupons/{couponId}/redemptions/{redemptionId} Delete a specific redemption by redemption ID. # Delete redemption by ID Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/delete-redemption-by-id redemptions.openapi delete /redemptions/{redemptionId} Deletes a specific redemption using the corresponding `redemptionId` value. # Get redemption by ID Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/get-redemption-by-id redemptions.openapi get /redemptions/{redemptionId} Retrieves a specific redemption using the corresponding `redemptionId` value. # Redemptions Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/overview Redemptions are used to track the usage of coupons or promotions by shoppers. The redemption records are used to keep track of [coupon limits](/docs/offers-coupons#coupon-limits) across the site or per customer. # Update redemption by ID Source: https://developer.fabric.inc/v3/offers/api-reference/offers/redemptions/update-redemption-by-id redemptions.openapi put /redemptions/{redemptionId} Updates a specific redemption using the corresponding `redemptionId`. # Creating a Buy Get Coupon Source: https://developer.fabric.inc/v3/offers/user-guides/offers/coupons/creating-a-buy-get-coupon This topic covers the process of creating a Buy-Get coupon. ## Prerequisites Ensure that: * You have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see the [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control-offers-roles) topic. * You have added at least one item in fabric Product Catalog. For more detailed information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) topic. * You have created at least one price list in fabric Offers. For more information, see the [Pricing](/v3/guides/offers/pricing) topic. If you plan to create a coupon based on [Categories](/v3/guides/product-catalog/categories/categories) or [Collections](/v3/guides/product-catalog/collections/collections), ensure you have set up these features in Product Catalog and added items to them. ## Procedure 1. In the left menu, click **Offers > Coupons > All coupons**. The **Coupons** page is displayed. 2. Click **Create coupon**. The **Create Coupon** page is displayed. 3. In the **Coupon title** field, enter a name for the coupon. This name is for internal use only. fabric recommends giving it a unique, descriptive name that can help you differentiate this coupon from other coupons you might be running concurrently. For example, *Holiday Sale*. 4. In the **Start date** and **Start time** fields, enter the date and time the coupon becomes available for use. The start date and time must be in the future. 5. In the **End date** and **End time** fields, enter the date and time the coupon expires. The end date and time must be after the start date and time. 6. In **Coupon usage**, do one of the following: * Select **Multiple-use** to allow the coupon to be used more than once. * In the **Coupon code** field, enter the code that customers must use to apply the coupon. * Select **Single-use** to restrict the coupon usage to once per customer. * In the **Prefix** field, enter a prefix that's at least 3 characters long, for example *SALE*. * In the **Starting number** field, enter the number your coupon code starts with, for example, *1*. * In the **Total coupon count** field, enter how many coupons you want to generate, for example *10*. * Click **Generate Codes**.\ Coupon codes *SALE01*, *SALE02*, ...*SALE10* are generated. For more information about **Multiple-use** and **Single-use**, see the [coupon codes](/v3/guides/offers/coupons/overview#coupon-code) section. 7. In the **Price list** field, select one or more price lists. The coupon only applies to the eligible SKUs on the price lists that you select. The available price lists depend on your organization's price list settings. You can use multiple price lists that use the same currency. For more information, see the [Price lists](/v3/guides/offers/coupons/overview#price-lists) section. 8. In the **Coupons can be applied to** field, select a price type.\ For more information on price types, see the [Price lists](/v3/guides/offers/coupons/overview#price-lists) section. 9. If you want to enable stacking with other coupons or restrict it based on other coupons you are running, select a stacking type in the **Set promotion stacking as** field. If applicable, set the priority. The default is set to stackable coupons.\ For more information on coupon stacking and priority, see the [Stacking and additional settings](/v3/guides/offers/coupons/overview#stacking-and-additional-settings) section. 10. In the **Coupon applied to field**, select **Buy-Get**. 11. Set the target of the coupon to **SKUs** or **Cart Value**. 12. To select the items that are eligible for the promotion, in the **Product target** field, make one or more selection. * If make more than one selection, choose how the coupons are applied with the **AND** and **OR** operators.\ For more information, see the [Product eligibility definitions for coupons](/v3/guides/offers/coupons/overview#product-eligibility-definitions-for-coupons) section. 13. In the **BUY** field select where you want the discount to apply on.\ For more information on how discounts are applied, see the [Defining discount and how they're applied](/v3/guides/offers/coupons/overview#defining-discount-and-how-they're-applied) section. do the following steps: 14. Select the products to include in the coupon promotion.\ The field corresponding to the **Product target** you selected is displayed. For example, if the **Product target** is **SKUs**, the **SKUs** field is displayed. 15. Click the product target field.\ The **Browse** product target window is displayed. 16. Choose the products to include in your coupon promotion. * (Optional) If the **Product target** is only **SKUs**, you can import a CSV file. The import function isn't available for other options, or if you selected more than one options . To import, do the following steps: * Click **Import SKUs**.\ **Bulk Upload SKU List** window is displayed. * Do one of the following: * **Drag and drop the file from the local folder to the window** * Click **Select a File** from your computer. * Click **Upload file**. 17. Click **Add selection**. 18. (Optional) To exclude products from your coupon promotion, click **Add Rule**.\ The **Product target** field is displayed. * Click the dropdown menu to select the products that aren't eligible for the coupon. 19. To set a minimum for coupon eligibility, do one of the following: * If you selected **SKUs** in the **BUY** section, in the **Buy minimum quantity of SKUs (A)** field, enter the number of products required. * If you selected **Cart Value** in the **BUY** section, in the **Spends minimum cart value** field, enter the minimum cart value required. 20. (Optional) Click **Add Another Set of SKUs** and fill out the fields as required. 21. To set up the **Coupon type**, in the **Discount #1** section, do one of the following. * To apply the discount to individual SKUs, in the **Get discount on** field, select **SKU**. The **Sub-Discount** section is available to do the following: * In the **Get discount on** field, select a set of SKUs. * In the **Max SKU quantity** field, enter the maximum quantity of the SKU eligible for the discount. * In the **Get discount type on sku** field, select the type of discount for the SKU. * In the **Discount value** field, enter a value. * In the **Apply discount on** field, select the items that are eligible for the discount. * To apply the discount to the entire cart, in the **Discount on** field, select **Cart** and do the following: * In the **Get discount type on cart** field, select a discount type. * In the **Discount value** field, enter a value. * To apply the discount to the cost of shipping, in the **Discount on** field, select **Shipping** and do the following: * In the **Shipping type** field, choose one or more shipping methods the discount applies to. * In the **Applicable on** field, select **Entire Cart** or **Entire Shipment**. * In the **Get discount type on shipping** field, select a discount type. * In the **Discount value** field, enter a value. For more information on **Coupon type**, see the [Defining discounts and how they're applied](/v3/guides/offers/coupons/overview#defining-discounts-and-how-they-re-applied) section. 22. (Optional) To add another discount, select **Add Another Discount** and set up the discount as required. This options is disabled if the **Cart Value** option is selected in step 11. 23. (Optional) If you want to encourage shoppers to add items to reach a certain threshold to be eligible for the coupon, click the **Promotion proximity** toggle to **On** and do the following: * In the **Proximity trigger quantity/amount** field, enter the threshold amount for the customer to be eligible for the coupon. * In the **Locales set 1** field, select the locales where this messaging will appear. * In the **Message** field, enter a message for the customer about the threshold they need to meet. * (Optional) Click **Add another locale set** as required. 24. To set coupon limits, do the following: * In the **Limit use per customer** field, enter a number that specifies how many times a customer can use this coupon. * In the **Limit use site wide** field, enter a number that specifies how many times any customer can use this coupon across the site. For more information, see the [Coupon limit](/v3/guides/offers/coupons/overview#coupon-limit) section. 25. (Optional) In the **Terms and conditions** section, do the following: * Enter the title of the condition in the in the **Title** field. * Enter the body of the condition in the **Description** field. * (Optional) Click **Add another condition** and fill out the fields as required. 26. To create tailored messaging about the coupon on various pages of your commerce site, do the following: * In the **Pages** field, select one or more pages to display the messaging. * In the **Locales for this group** field, select the locales where this messaging will appear. 27. To add interal-facing tags to help you identify or classify the promotion, in the **Coupon attributes** section, do the following: * In the **Attribute name** field, select a name. * In the **Attribute values** field, select one or more values. * Attribute names and attribute values are user-generated and can be created by visiting **Offers > Settings > Attributes** in Copilot.\ For more information, see the [Creating an attribute](/v3/guides/offers/settings#attributes) section. 28. (Optional) To target the promotion to specific customer segments, do the following: * In the **Target Audience** field, select **Segment**. * In the **Segment name** field, select a name. * In the **Segment values** field, select one or more values. * Click **Add another segment** as needed. * (Optional) To exclude segments, select **Add exclusion list**. * In the **Segment name** field, select a name to exclude. * In the **Segment values** field, select one or more values to exclude. * Segment names and segment values are user-generated and can be created by visiting **Offers > Settings > Customer segments** in Copilot.\ For more information, see the [Customer segments](/v3/guides/offers/settings#customer-segments) section. 29. (Optional) To set the maximum number of times the coupon can be used, do the following: * In the **Promotion Limits** section, click the toggle to enable the limit. * In the **Max usage per order** section, enter a number. 30. Click **Create** on the top right of the page. # Creating a SKU Quantity Coupon Source: https://developer.fabric.inc/v3/offers/user-guides/offers/coupons/creating-a-sku-quantity-coupon This topic covers the process of creating a SKU quantity coupon. ## Prerequisites Ensure that: * You have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see the [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control-offers-roles) topic. * You have added at least one item in fabric Product Catalog. For more detailed information, see the [Adding an Item](/v3/guides/product-catalog/list/items/adding-an-item) topic. * You have created at least one price list in fabric Offers. For more information, see the [Pricing](/v3/guides/offers/pricing) topic. If you plan to create a coupon based on [Categories](/v3/guides/product-catalog/categories/categories) or [Collections](/v3/guides/product-catalog/collections/collections), ensure you have set up these features in Product Catalog and added items to them. ## Procedure 1. In the left menu, click **Offers > Coupons > All coupons**. The **Coupons** page is displayed. 2. Click **Create coupon**. The **Create Coupon** page is displayed. 3. In the **Coupon title** field, enter a name for the coupon. This name is for internal use only. fabric recommends giving it a unique, descriptive name that can help you differentiate this coupon from other coupons you might be running concurrently. For example, *Holiday Sale*. 4. In the **Start date** and **Start time** fields, enter the date and time the coupon becomes available for use. The start date and time must be in the future. 5. In the **End date** and **End time** fields, enter the date and time the coupon expires. The end date and time must be after the start date and time. 6. In **Coupon usage**, do one of the following: * Select the **Multiple-use** option to allow the coupon to be used more than once. * In the **Coupon code** field, enter the code that customers must use to apply the coupon. * Select the **Single-use** option to restrict the coupon usage to once per customer. * In the **Prefix** field, enter a prefix that's at least 3 characters long, for example *SALE*. * In the **Starting number** field, enter the number your coupon code starts with, for example, *1*. * In the **Total coupon count** field, enter how many coupons you want to generate, for example *10*. * Click **Generate Codes**.\ Coupon codes *SALE01*, *SALE02*, ...*SALE10* are generated. For more information about **Multiple-use** and **Single-use**, see the [coupon code](/v3/guides/offers/coupons/overview#coupon-code) section. 7. In the **Price lists** field, select one or more price lists. The coupon only applies to the eligible SKUs on the price lists that you select. The available price lists depend on your organization's price list settings. You can use multiple price lists that use the same currency. For more information, see the [Price lists](/v3/guides/offers/coupons/overview#price-lists) section. 8. In the **Coupons can be applied to** field, select a price type.\ For more information on price types, see the [Price lists](/v3/guides/offers/coupons/overview#price-lists) section. 9. If you want to enable stacking with other coupons or restrict it based on other coupons you are running, select a stacking type in the **Set promotion stacking as** field. If applicable, set the priority. The default is set to stackable coupons.\ For more information on coupon stacking and priority, see the [Stacking and additional settings](/v3/guides/offers/coupons/overview#stacking-and-additional-settings) section. 10. In the **Coupon applied to field**, select **SKU quantity**. 11. In the **minimum quantity of SKUs** field, enter the minimum number required for the coupon to be eligigble. 12. To set up the **Coupon type**, in the **Tier** section, in the **Minimum quantity of SKUs** field, enter the minimum quantity for the discount to be eligible and do one of the following steps. * To apply the discount to individual SKUs, in the **Discount on** field, select **SKU**. * In the **Discount type** field, select a discount type. * In the **Apply discount on** field, select the items to apply discount. * (Optional) To allow the coupon to have variable discount amounts to prevent over-discounting when coupons stack, click **Dynamic discount** and in the **Additional discount** field, enter a value. * In the **Discount value** field, enter a value. * To apply the discount to the cost of shipping, in the **Discount on** field, select **Shipping** and do the following: * In the **Discount type** field, select a discount type. * In the **Shipping type** field, choose one or more shipping methods the discount applies to. * In the **Applicable on** field, select **Entire Cart** or **Entire Shipment**. * (Optional) To allow the coupon to have variable discount amounts to prevent over-discounting when coupons stack, click **Dynamic discount** and in the **Additional discount** field, enter a value. * In the **Discount value** field, enter a value. * To apply the discount to the entire cart, in the **Discount on** field, select **Cart** and do the following: * In the **Discount type** field, select a discount type. * In the **Discount value** field, enter a value.\ For more information on **Coupon type**, see the [Defining discounts and how they're applied](/v3/guides/offers/coupons/overview#defining-discounts-and-how-they-re-applied) section. 13. (Optional) To add another discount, select **Add Another Discount** and set up the discount as required. 14. (Optional) To add more tiers to the coupon eligibility, click **Add Another Tier** as needed. 15. To select the items that are eligible for the coupon, in the **Product target** field, select one or more items. * If you select more than one, choose how coupons apply to products by selecting **AND** or **OR** before selecting your items.\ For more information, see the [Product eligibility definitions for coupons](/v3/guides/offers/coupons/overview#product-eligibility-definitions-for-coupons) section. 16. Select the products to include in the coupon promotion.\ The field corresponding to the **Product target** you selected is displayed. For example, if the **Product target** is **SKUs**, the **SKUs** field is displayed. 17. Click the product target field.\ The **Browse** product target field is displayed. 18. Choose the products to include in your coupon promotion. * (Optional) If the **Product target** is only **SKUs**, then you can import a CSV file. The import function isn't available for other options, or if you selected more than one option. To import, do the following steps: * Click **Import SKUs**.\ **Bulk Upload SKU List** window is displayed. * Do one of the following: * **Drag and drop the file from the local folder to the window** * Click **Select a File** from your computer. * Click **Upload file**. 19. Click **Add selection**. 20. (Optional) To exclude products from your coupon coupon, click **Add Rule**.\ The **Product target** field is displayed. * Click the dropdown menu to select the products that aren't eligible for the coupon. 21. To set coupon limits, do the following: * In the **Limit use per customer** field, enter a number that specifies how many times a customer can use this coupon. * In the **Limit use site wide** field, enter a number that specifies how many times any customer can use this coupon across the site.\ For more information on setting coupon limits, see the [Coupon limit](/v3/guides/offers/coupons/overview#coupon-limit) section. 22. (Optional) In the **Terms and conditions** section, do the following: * Enter the name in the **Title** field and the condition in the **Description** field. * (Optional) Click **Add another condition** as needed. This section is used to outline the terms and conditions of using this coupon to the customer. 23. To create tailored messaging about the coupon on various pages of your commerce site, do the following: * In the **Pages** dropdown menu, select one or more places to add the messaging. * In the **Locales for this group** field, select the locales where this messaging will appear. 24. To add interal-facing tags to help you identify or classify the coupon, click the arrow icon next to **Promotion attributes** and do the following: * In the **Attribute name** field, select a name. * In the **Attribute values** field, select one or more values. * Attribute names and attribute values are user-generated and can be created by visiting **Offers > Settings > Attributes** in Copilot.\ For more information, see the [Creating an attribute](/v3/guides/offers/settings#attributes) section. 25. (Optional) To target the coupon to specific customer segments, do the following: * In the **Target Audience** field, select **Segment**. * In the **Segment name** field, select a name. * In the **Segment values** field, select one or more values. * Click **Add another segment** as needed. * (Optional) To exclude segments, click **Add exclusion list**. * In the **Segment name** field, select a name to exclude. * In the **Segment values** field, select one or more values to exclude. * Segment names and segment values are user-generated and can be created by visiting **Offers > Settings > Customer segments** in Copilot.\ For more information, see the [Customer segments](/v3/guides/offers/settings#customer-segments) section. 26. (Optional) To set the maximum number of times the coupon can be used, do the following: * In the **Promotion Limits** section, click the toggle to enable the limit. * In the **Max usage per order** section, enter a number. 27. Click **Create** on the top right of the page. # Managing Coupons Source: https://developer.fabric.inc/v3/offers/user-guides/offers/coupons/managing-coupons This topic covers the process of viewing coupons. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see the [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control-offers-roles) section. * Ensure that you created at least one coupon. For more detailed information on creating coupons, see one of the following pages: * [Creating a SKU Coupon](/v3/guides/offers/coupons/creating-a-sku-coupon) * [Creating a SKU Quantity Coupon](/v3/guides/offers/coupons/creating-a-sku-quantity-coupon) * [Creating a Buy Get Coupon](/v3/guides/offers/coupons/creating-a-buy-get-coupon) ## Managing All Coupons If you want to view only redeemed coupons, see the [Viewing Redeemed Coupons](#viewing-redeemed-coupons) section. 1. In the left menu, click **Offers > Coupons > All coupons**. The **Coupons** page is displayed. 2. In the search bar, you can search by coupon title. 3. Use the dropdown menu to narrow the coupons list. You can filter using the following criteria: * **Status** * **Start Date** * **End Date** * **Coupon Type** * **More** * **Coupon Usage** * **Coupon Attributes** * **Segments** * **Price Lists** * **Price Type** * **Categories** 4. In the **Title** column, click the title of a coupon you want to view. 5. (Optional) To edit a coupon, change the details as needed and click **Update**. You can't edit a coupon that's ended. 6. (Optional) To enable or disable a coupon, click the toggle on the top left as needed. ## Viewing Redeemed Coupons 1. In the left menu, click **Offers > Coupons > Redemption**. The **Coupon Redemptions** page is displayed. 2. In the search bar, you can search by coupon title. 3. In the search bar, click **Advanced** to search using the following options: * **Coupon Code** * **Customer ID** * **Email ID** * **Order Number** * **Store ID** 4. Use the dropdown menu to narrow the coupon redemptions list. You can filter using the following criteria: * **Redemption Date** * **Coupon Type** * **Coupon Status** 5. In the **Title** column, click the title of a redeemed coupon you want to view. # Overview Source: https://developer.fabric.inc/v3/offers/user-guides/offers/coupons/overview With the Coupons feature in fabric Offers, you can create targeted discounts, incentives, and pricing rules tailored to specific products, categories, collections, product attributes, and customer segments. You can also configure coupon conditions, set exclusions, and define how multiple coupons interact through stacking rules. The key elements of a coupon include: | **Elements** | **Description** | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | | Eligible products | The SKUs, categories, and collections that qualify for the coupon. | | Conditions | Criteria that define the requirements to activate the coupon, such as a minimum purchase quantity or specific product features. | | Discount type | Formats of the discount, including percentage reductions, fixed amount discounts, or free shipping. | | Coupon stacking | Rules determining how coupons combine, whether by allowing multiple discounts or making them exclusive. | | Dynamic discounting | Controls the way discounts are applied when multiple coupons are eligible, preventing over-discounting by limiting how discounts stack. | | Coupon messaging | Customizable coupon messages visible on product pages, in the customer's cart, or at checkout, tailored for specific customer segments. | To redeem a coupon the customer must enter a coupon code. If the items in their cart meet the criteria you specify, the discount will apply. Unlike [Promotions](/v3/guides/offers/promotions/overview), customers need to provide a code to receive the discount. ## Types of Coupons fabric supports three types of coupons: * **SKU Coupon**: A discount targeting specific SKUs, where individual products are selected for eligibility, and a discount type is assigned. This coupon type is ideal for sales on specific products, clearing inventory, or spotlighting new arrivals. For example, a *Spring clearance* could offer a percentage discount on products from the previous year's collection. * **SKU Quantity Coupon**: A discount applied when a customer buys a specific quantity of a particular SKU. This coupon is often used to clear inventory or promote high-margin products. For example, you can create a *Buy 3, get 15% off* coupon to encourage customers to purchase in bulk and increase average order value. * **Buy X Get Y Coupon**: A free or discounted product, Y, is offered when customers purchase a designated product or quantity of X. This coupon is ideal for bundling complementary products, driving larger transactions, and increasing cart size. For example, you can create *Buy one, get one free* or *Buy two, get 50% off the third item* to offer an incentive when the customer's cart meets the minimum purchase threshold. ## Coupon Setup Setting up a coupon includes configuring key elements such as price lists, coupon codes, product eligibility conditions, discount types, exclusions, and how multiple coupons interact, as described in the following workflow: 1. Create a [coupon code](/v3/guides/offers/coupons/overview#coupon-code) section. When customers enter the coupon code during checkout, the discount will apply if the code is eligible. 2. Choose a [price list](/v3/guides/offers/coupons/overview#price-lists) to establish the baseline pricing, ensuring that discounts apply correctly depending on whether items are full-price or already discounted. 3. Set the [conditions](/v3/guides/offers/coupons/overview#product-eligibility-definitions-for-coupons) that determine which products qualify for the promotion. This could include all products, specific SKUs, categories, or product attributes. 4. Set the [coupon limit](#coupon-limit) that determines how many times a shopper can redeem the coupon. The limit can be set for both the customer and site. 5. Apply [exclusions](/v3/guides/offers/coupons/overview#product-exclusions-from-coupons) to refine the promotion by targeting specific products or excluding certain items from the offer. 6. Specify the type of [discount](/v3/guides/offers/coupons/overview#defining-discounts-and-how-they-re-applied) the customer receives. For example, percentage off, amount off, or free shipping, and decide if it applies to individual items, shipping costs, or the entire cart. 7. Set up [stacking](/v3/guides/offers/coupons/overview#stacking-and-additional-settings) to apply multiple promotions simultaneously. Define how they interact by assigning priorities or making them exclusive. 8. Configure [promotion messaging](/v3/guides/offers/promotions/overview#promotion-messaging) to determine where details appear for customers, such as product pages, the cart, or at checkout. Customize messaging based on customer groups or regions. ### Coupon code Coupons can be configured as the following: * **Multiple-use coupons**: Allow you to set a usage limit. * **Single-use coupons**: Restricted to one-time use per customer. To create more than single-use coupons, the **Total coupon count** field is used. For example, if you set **Prefix** to `SALE`, **Starting number** to `1`, and **Total coupon count** to `3`, the following coupon codes are generated: `SALE1`, `SALE2`, and `SALE3`. For more information on setting coupon limit, see the [coupon limit](#coupon-limit) section. ### Price lists Price lists determine how discounts are applied to products. By selecting a price list, you define whether the discount applies to full-price items, sale items, or both. This ensures that coupon pricing is applied as desired, without over-discounting. The following table outlines the different types of price lists and how they determine the application of discounts during a coupon: | **Price list** | **Description** | | ---------------------- | ---------------------------------------------------------------------------------------- | | Only base price | The discount applies only if the item isn't already on sale. | | Only sale price | The discount applies only if the item is on sale. | | Both sale & base price | The discount applies regardless of whether the item is at base price or already on sale. | For more information, see the [pricing guide](/v3/guides/offers/pricing) section. ### Product eligibility definitions for coupons The **Customer buys** section allows you to define conditions that specify which products are eligible for the coupon. Setting these conditions ensures that the coupon is applied only to products that meet your defined criteria. The following table describes the options to define product eligibility based on the price list or lists you selected: | **Condition** | **Description** | | ------------- | ------------------------------------------------------------------------------------------- | | All SKUs | The coupon applies to all products. | | SKUs | The coupon applies to specific products you select. | | Categories | The coupon applies to one or more categories of products that you select. | | Collections | The coupon applies to one or more collections of products that you select. | | Attributes | The coupon applies to products based on specific attributes, such as color, size, or brand. | You can combine multiple conditions using operators to create a more targeted coupon. The `AND` condition requires all conditions to be met, while the **OR** condition allows the coupon to apply if any one condition is satisfied. For example, if you select both the *Category: Apparel* and *Color: Red*, with the `AND` operator, only red apparel qualifies for the coupon. On the other hand, if you use the **OR** operator, any items in the category *apparel* will qualify for the coupon. Combining conditions allows you to ensure that the right products are included based on multiple criteria. For example, you can include all items in the *Apparel* category, but limit the coupon to products with the attribute *Color: Red* or *Size: Large*. This allows you to ensure that the right products are included based on multiple conditions. ### Coupon limit Defining the initial group of products—based on SKUs, categories, collections, or product attributes—is the first step in configuring a coupon. Usage limits can be established to manage coupon availability and overuse prevention when creating **Multiple-use** coupons. The following are limits that can be set: * **Limit use per customer**: Specifies how many times a single customer can redeem the coupon. * **Limit use per site**: Specifies the total number of redemptions allowed across your retail site. For example, setting a limit of 1 use per customer and 5 uses site-wide ensures that five unique customers can redeem the coupon before it becomes invalid. If unlimited usage is desired, leave the usage fields empty. Note that single-use coupons don't require these limits, as their usage is inherently restricted. #### Product exclusions from coupons After setting your coupon usage limit, you can refine your coupon by excluding specific products. The **Exclude** field allows you to remove certain items from the coupon, even if they meet the initial coupon criteria. For example, you might run a sale on all products in the *Apparel* category, but exclude premium brands or limited-edition items. Using the exclude field, you can remove these products by specifying their SKUs, categories, collections, or attributes. You can exclude products in the following ways: | **Exclusion List** | **Description** | | ------------------ | -------------------------------------------------------------------- | | SKUs | Specify the SKUs of individual products to exclude from the coupon. | | Category | Specify the categories to exclude from the coupon. | | Collection | Specify the collections to exclude from the coupon. | | Attributes | Specify the products by their attributes to exclude from the coupon. | By using exclusions, you gain greater precision over which products are part of a coupon, avoiding unintended discounts on products that don’t align with your strategy. ### Defining discounts and how they're applied Different types of discounts can be applied to various aspects of a coupon. Here’s an overview of the most common discount applications: | **Discount on** | **Description** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | SKU | The discount applies to the specific SKU or SKUs you specify. Ideal for coupons highlighting specific products or for clearing inventory. | | Shipping | The discount applies to shipping. | | Cart | The discount applies to the total value of the customer's cart. Cart discounts incentivize customers to add more items to their carts to qualify for the discount. | The discount type defines how the discount is applied to the coupon. A coupon can support up to three different discounts. For example, you can create a coupon that gives shoppers 10 percent off and then create a second discount that offers free shipping. There are several discount types available, each with their own function: | Discount type | Description | | -------------- | ------------------------------------------------------------- | | Percentage off | Reduces the cost of eligible items by a specified percentage. | | Amount off | Reduces the cost of eligible items by a specified amount. | | Fixed price | Sets a specific price for eligible items. | | Free | Only available when the discount applies to shipping. | When creating a coupon that applies to the shipping method, you must select a fulfillment rule set that you configured in fabric Orders. For more information, see the [Creating a fulfillment rule set guide](/v3/guides/orders/order-fulfillment-logic/create-a-new-rule-set-ui) section. #### Shipping discounts Shipping discounts can be applied with one of the following options: * Entire cart: Each item in a cart must qualify for the coupon to apply regardless of ship-to locations. * Entire shipment: Only the items that share the same ship-to locations qualify for the coupon. For example, in the event of multi-fulfillment orders, when part of the order ships to home and part is picked up in-store, shipping discount will only apply to eligible items in the order. You can use multiple shipping methods, such as home delivery, in-store pickup, or split shipments. However, only a single discount type can be applied per shipping method. This means if one part of the order is shipped and another part is picked up, you can apply different discounts to different shipping methods. ### Dynamic discounting Dynamic discounting allows coupons to have variable discount amounts, preventing over-discounting when multiple coupons stack. By enabling dynamic discounting, you can set limits on the discount percentage or amount applied, ensuring that the total discount remains controlled even when coupons overlap. For example, if one coupon discounts an item or cart by 40%, you can limit a subsequent discount to 10%. Dynamic Discounts aren't eligible for buy-get or spend-get coupons. ## Stacking and Additional Settings Coupon stacking refers to the ability to combine multiple coupons or discounts on the same cart. When coupon stacking is enabled, a customer can apply more than one discount to their cart, increasing the overall savings. For example, a customer could receive both a 10% discount for a store-wide sale and an additional \$5 off for a specific product coupon. Coupon stacking is controlled by assigning a priority to each coupon. Coupons with a lower priority number are applied first, and subsequent coupons are stacked on top, applying their discounts to the already-discounted price. This allows for more control over how multiple coupons interact, ensuring that coupons with higher priority are considered before others. Coupons are stacked using the following options: * **Stackable**: The coupon can stack with any other discount, except for those set to exclusive. The discounts are applied on top of each other, increasing the total discount amount if the discounts apply to the same item. Stackable coupons require a priority, which defines the order in which stackable coupons are evaluated. Starting with priority 1, coupons are evaluated and applied in ascending order. Priority 1 uses the price on the price list to apply the discounts. Priority 2 coupons are evaluated with their applicable discounts stacked on top of the discounted price from priority 1 coupons. Evaluation continues until all stackable priorities have been evaluated and applied. * **Exclusive**: The coupon can't be combined with other discounts, except Universal. Only one non-stackable coupon is applied to the cart, even if other items are eligible. This is considered globally exclusive. In these cases, Offers applies the coupons with the largest monetary discount. If two coupons have the same monetary discount amount, the most recently published coupon is applied. * **Type exclusive**: This coupon can't be combined with other coupons of the same discount type, such as SKU, cart, or shipping. When multiple coupons of the same type are available, only the one with the highest level or best discount is applied to the customer’s order. This ensures that conflicting coupons don't overlap, preventing excessive discounts. * **Universal**: The coupon is always evaluated and applied. These discounts are applied last and can stack on any other coupon regardless of its stacking setting. ### Coupon messaging Coupon messaging allows you to create custom messages to customers on the Product Detail Page (PDP), Product List Page (PLP), in the customer's cart, and on the checkout page, or any combination of these. Additionally, you can target specific customer groups by choosing the locale, ensuring the message is displayed in the appropriate language or region. This feature helps ensure that your coupon offers are clearly communicated to the right audience. ### Coupon attributes Coupon attributes are internal-facing tags to categorize and classify coupons for use in reporting and analytics. For example, you can tag coupons with attributes such as *Seasonal Sales* and further define them with values such as *Summer* or *Fall*. This classification allows you to query and report on coupons based on the attributes you’ve assigned, making it easier to measure the performance of targeted campaigns. For more information on creating these attributes, see the [Attributes guide](/v3/guides/offers/settings#attributes) section. ### Customer segments You can define which customer segments are eligible for the coupon. Targeting customer segments allows you to apply discounts or special offers to specific groups of customers. For more information on customer segments, see the [customer segments](/v3/guides/offers/settings#customer-segments) section. # Overview Source: https://developer.fabric.inc/v3/offers/user-guides/offers/overview Offers is fabric's pricing and promotions engine with tools to manage your pricing, promotions, and coupons in one place. fabric Offers works in conjunction with Product Catalog to set up and manage Stock Keeping Unit (SKU) prices. Its wide range of coupon and promotion features let you design discounts ranging from single-use, customer-specific coupons to site-wide promotions. Offers must be connected to a front-end such as a web storefront or mobile app to display content and facilitate interaction. You must be an active user of fabric's Product Catalog service to use Offers. Product data must be available in Product Catalog to enable the creation of prices, price lists, promotions, and coupons within Offers. ## Role-Based Access Control (RBAC) fabric Copilot provides the ability to restrict the access of different users to information and actions available to them through roles. For more information and instructions on how to set up these controls for Offers, see [the RBAC](/v3/platform/settings/rbac/role-based-access-control) documentation. ## Accessing Offers in Copilot 1. Log in to your Copilot account. If you don't have an active Copilot account, [click here](https://live.copilot.fabric.inc/auth/v2/login) to sign up for a free trial, or [contact support](https://support.fabric.inc/hc/en-us/requests/new) for help. 2. On the left menu, click **Offers**, and then click one of the following options as required: * [Pricing](/v3/offers/user-guides/offers/pricing): Sets and tracks the price of items in your web store. * [Promotions](/v3/offers/user-guides/offers/promotions/overview.mdx): Automatically applies discounts at checkout. * [Coupons](/3/offers/user-guides/offers/coupons/overview): Provides discount codes that customers can apply at checkout. * [Settings](/v3/offers/user-guides/offers/settings): Sets and updates price lists. # Adding Bulk Price Source: https://developer.fabric.inc/v3/offers/user-guides/offers/pricing/add-bulk-price The **Add Bulk Price** feature allows you to upload a [CSV file](/v3/offers/user-guides/offers/pricing/price_template.csv) with details such as cost, price, and clearance price. This streamlined process eliminates the need for manual data entry, reduces errors, and saves time. ## CSV File Guidelines fabric doesn't support any other data or file formats. Here are the key points to consider: * The headers, represented in the first row of the CSV file, should match the product details. * Empty rows and columns are ignored. Ensure that fields don't contain blank spaces, returns, line breaks, or other characters not supported in the CSV. * fabric provides a CSV template file. Not following the parameters in the template can result in errors when uploading. ## Product Price Data Formatting When preparing a CSV file for import, ensure that the product pricing data format aligns with the following column requirements: | **Header** | **Description** | | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **SKU ID** | The SKU ID of the item in Product Catalog. | | **Cost** *Optional* | The cost of the item set by the distributor. | | **Price** | The price set in fabric to charge buyers for their purchases. | | **Clearance Price** *Optional* | The lowest price set in fabric to charge customers for their purchases. | | **Start Date** | The date the price change begins. Dates must follow the `YYYY-MM-DDTHH:MM:00.000Z` format. For example, a price change scheduled for June 1, 2025 at noon would be `2025-06-01T12:00:00.000Z`. | | **Price List Name** | The name assigned to a price list when created. | Below is a sample of a valid CSV file for bulk price import: | **SKU ID** | **Cost** | **Price** | **Clearance Price** | **Start Date (UTC)** | **Price List Name** | | ------------- | -------- | --------- | ------------------- | ------------------------ | ------------------------ | | SOME\_SKU\_ID | | 111 | | 2025-12-15T02:05:46.000Z | Default\_PriceList\_Name | ## Prerequisites * Ensure that you have the **Offers Editor**, or **Administrator** privileges to fabric Offers. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-offers-roles) section. ## Procedure 1. In the left menu, click **Offers**.\ The **Products Pricing** page is displayed. 2. Click **Add Bulk Price**.\ The **Import price CSV file** window is displayed. 3. Download the sample template by clicking Template: Price. 4. In the Import price CSV file window, do one of the following: * Drag and drop your file to the window. * Click **Select a File from your computer** and select your file. 5. Click **Import File**. The CSV file is imported, and the prices are added to your products. # Managing Prices Source: https://developer.fabric.inc/v3/offers/user-guides/offers/pricing/managing-prices This topic covers the process of viewing price import history, viewing import errors, and manually editing prices. ## Viewing Import History You can check the status of your upload by navigating to **Import History**. If the file contains errors, Offers flags the rows with issues. Once the upload is complete, you can download the CSV file with the errors, correct them, and re-upload the file. ### Procedure 1. In the left menu, click **Offers**.\ The **Products Pricing** page is displayed. 2. Click the **Import History** button.\ The **Pricing Import History** page is displayed. 3. Click the **>** icon under the **File Name** to expand for details.\ You can view the **Status** and **Message** about the import job. 4. (Optional) If the **Status** shows **Error**, click the **Download CSV** button under the **Message** column. 5. (Optional) Navigate to your downloads folder and open the CSV file.\ The CSV file is displayed with an **Error** column that specifies the error. ### Errors | **Error** | **Description** | | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | SKU ID not found | A SKU ID doesn’t match the SKU of any product in your Product Catalog account. | | Headers don’t match the price template headers | The headers don’t match the headers in the template. | | Only numeric and decimal values are allowed in cost | The cost column contains a character that isn’t a number or decimal. | | Incorrect date format for Start/End Date (UTC). Use this date format YYYY-MM-DDTHH:MM:00.000Z | A date doesn’t match the correct format. | | No price data found | The price columns don’t contain any data. | | Start Date (UTC)/Price is required | Data is missing from one of these two required fields. | | Clearance price/Price/Cost price should always be >= 0.00 | The data in these columns must be greater than or equal to 0. | | Cost can’t be greater than its corresponding Price | The price must be greater than the cost. | | Clearance price can’t be greater than or equal to its corresponding price | The price must be greater than the clearance price. | | The header for an additional attributes column isn’t correctly formatted | The header for an additional attributes column doesn’t use the correct format and must follow the format additionalAttributes.exampleAttribute. | ## Manually Editing Price On the **Products Pricing** page, you can edit price details. Use the **List View** or **Tile View** to adjust how items are displayed. * **Tile View**: Displays images but includes less information. * **List View**: Includes more information but doesn't display images. To bulk edit the cost and price attributes for all variations of a product, such as colors, prints, or sizes, edit the parent product. To edit the cost and price attributes for a single product, such as only the green jacket, locate and edit the individual variant. Offers supports up to five decimal places for price, cost, and clearance price values. ### Procedure 1. In the left menu, click **Offers**.\ The **Products Pricing** page is displayed. 2. To filter for a specific product, you can do the following: * Search by product name or item ID. * Click the dropdown menu to select a price list. 3. Click the product you want to edit. The product information is displayed. 4. Click the **Edit SKU Price** button. The **Edit Parent SKU Price** window is displayed. 5. In the **Edit Parent SKU Price** window, enter the following values: * Cost * Base Price * Sale price * Start date * Start time You must include the **Base Price**, **Start date**, and **Start time** values. 6. Click **Add Price**. # Overview Source: https://developer.fabric.inc/v3/offers/user-guides/offers/pricing/pricing-overview Pricing is a core feature of the fabric platform, enabling merchants to manage product prices across their catalog. It works seamlessly with Product Catalog to ensure that the products you upload into your fabric account are automatically available for pricing. ## Key Benefits * Seamless Integration: Pricing works directly with the Product Catalog, automatically displaying all uploaded products for efficient price management. * Centralized Management: Access and configure all product prices from the **Offers> Pricing** page. ## Use Case A merchant needs to set up and manage product prices for its online store. To achieve this, the merchant uploads products to the **Product Catalog** in fabric, making them available for pricing configuration through the **Offers > Pricing** page. This integration centralizes pricing tasks, enabling the merchant to define and control prices efficiently. Through the **Offers > Pricing** page, the merchant sets base prices for each product. These base prices ensure consistent and accurate pricing for buyers across the platform. By managing prices for individual products or entire catalogs in one place, the merchant maintains full control over their pricing structure and strategies. The merchant can also adjust prices for products as needed. Whether modifying the price of a single product or applying changes across an entire catalog, the merchant uses the **Offers > Pricing** page to make updates seamlessly. These adjustments are automatically reflected across the platform, ensuring alignment and accuracy across all channels. With features like **clearance pricing** to prevent over-discounting during promotions or coupon campaigns, and real-time update capabilities, pricing empowers merchants to adapt quickly to market changes. This flexibility allows businesses to remain competitive while maintaining control over profitability and customer value. # null Source: https://developer.fabric.inc/v3/offers/user-guides/offers/promotions/creating-a-buy-get-promotion This topic covers the process of creating a buy-get promotion. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control-offers-roles). * Ensure that you have added at least one item in fabric Product Catalog. For more detailed information, see [Adding an Item](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item). * Ensure that you have created at least one price list in fabric Offers. For more information, see [Pricing](/v3/offers/user-guides/offers/pricing). * If you plan to create a promotion based on [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview) or [Collections](/v3/product-catalog/user-guides/product-catalog/collections/collections), ensure you have set up these features in Product Catalog and added items to them. ## Procedure 1. In the left menu, click **Offers > Promotions**.\ The **Promotions** page is displayed. 2. Click **Add Promotion**. The **Create Promotion** page is displayed. 3. In the **Select type** field, select **Buy X - Get Y**. 4. Click **Next**. The **Basic details** menu is displayed. 5. In the **Promotion name** field, enter a name for the promotion.
This name is for internal use only. fabric recommends giving it a unique, descriptive name that will help you differentiate this promotion from other promotions you may be running concurrently. For example, *Labor Day Dining Set Clearance*. 6. (Optional) In the **Notes** field, enter any internal-facing details that might be relevant to this promotion. 7. In the **Start date** and **Start time** fields, enter the date and time the promotion begins.
The start date and time must be in the future. 8. In the **End date** and **End time** fields, enter the date and time the promotion ends.
The end date and time must be after the start date and time. 9. In the **Price lists** field, select one or more price lists.
The promotion will only apply to eligible SKUs on the price lists you select. If selecting multiple price lists, they must all use the same currency. For more information, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 10. In the **Apply promotion to** field, select a price type.
For more information on price types, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 11. Click **Next**.
The **Conditions** menu is displayed. 12. To define the conditions that must be met to receive the promotional offer, do one of the following: * Select **Buys min. qty of SKUs**. * In the **A minimum of** field, enter a number of SKUs. * Select **SPends a min. amount**. * In the **A minimum amount of** field, enter a dollar amount. 13. To select the items that are eligible for the promotion, in the **From** field, make one or more selections.
For more information, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 14. Click the **Browse** button.
The **Browse SKUs customers must buy** window is displayed. 15. Select the SKUs that are eligible for the promotion and click **Add**.
The SKUs you selected are added to the list of SKUs that are eligible for the promotion. 16. If you selected multiple conditions in step 12, select an operator to choose how your selections interact with each other. For more information on these settings, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 17. (Optional) To exclude items from the promotion, in the **Exclude** field, select one or more options and configure as required. For more information on excluding products, see [Excluding products](/v3/offers/user-guides/offers/promotions/overview#product-exclusions-from-promotions). 18. To set up the type of discount, in the **Customer gets** section, take one of the following steps.
For more information on the **Customer gets** section, see [Defining discounts and how they're applied](/v3/offers/user-guides/offers/promotions/overview#defining-discounts-and-how-they-re-applied). * To apply the discount to individual SKUs, in the **Discount on** field, select **SKU**. a. In the **Discount type** field, select a discount type. b. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. c. In the **Discount value** field, enter a value. * To apply the discount to the cost of shipping, in the **Discount on** field, select **Shipping** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Shipping type** field, choose one or more shipping methods the discount applies to. c. In the **Applicable on** field, select **Entire Cart** or **Entire Shipment**. d. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. e. In the **Discount value** field, enter a value. * To apply the discount to the entire cart, in the **Discount on** field, select **Cart** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Discount value** field, enter a value.
19. (Optional) To add another discount, select **Add Another Discount** and set up the discount as required. 20. Click **Next**.
The **Stacking & additional settings** menu is displayed. 21. To set how this promotion can be combined with or restricted by other promotions you are running, in the **Set promotion stacking** field, select a stacking type, and, if applicable, set the priority.
For more information on promotion stacking and priority, see [Stacking & additional settings](/v3/offers/user-guides/offers/promotions/overview#stacking-and-additional-settings). 22. (Optional) To create tailored messaging about the promotion on various pages of your commerce site, click the arrow icon next to **Promotion messaging**. * In the **Choose where to add messaging** field, select one or more places to add the messaging. * In the **Locale set 1** field, select the locales where this messaging will appear. * Enter a title for the message. * Enter the message body. For more information on promotion messaging, see [Promotion messaging](/v3/offers/user-guides/offers/promotions/overview#promotion-messaging). 23. (Optional) To add interal-facing tags to help you identify or classify the promotion, click the arrow icon next to **Promotion attributes** and do the following: * In the **Attribute name** field, select a name. * In the **Attribute values** field, select one or more values. Attribute names and attribute values are user-generated and can be created by visiting **Offers > Settings > Attributes** in Copilot. For more information, see [Creating an attribute](/v3/guides/offers/settings#attributes). 24. (Optional) To target the promotion to specific customer segments, click the arrow icon next to **Customer segments** and do the following: * Select **Segment**. * In the **Segment name** field, select a name. * In the **Segment values** field, select one or more values. * (Optional) To exclude segments, select **Exclude Segment**. * In the **Segment name** field, select a name to exclude. * In the **Segment values** field, select one or more values to exclude. Segment names and segment values are user-generated and can be created by visiting **Offers > Settings > Customer segments** in Copilot. For more information, see [Customer segments](/v3/guides/offers/settings#customer-segments). 25. (Optional) To set the maximum number of times the promotion can be used, click the arrow icon next to **Usage limits** and enter a number. 26. Click **Next**.
The **Review & create** menu is displayed. 27. Verify that all promotion details are correct.
Use the **Back** button to move to previous steps in the process. 28. Click **Create**. The promotion is created with the settings you specified. ## Related Topics * [Promotions Overview](/v3/offers/user-guides/offers/promotions/overview) * [Creating a SKU Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-promotion) * [Creating a SKU Quantity Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-quantity-promotion) # null Source: https://developer.fabric.inc/v3/offers/user-guides/offers/promotions/creating-a-sku-promotion This topic covers the process of creating a SKU promotion. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see [Role-Based Access Control](/v3/offers/user-guides/offers/promotions/overview). * Ensure that you have added at least one item in fabric Product Catalog. For more detailed information, see [Adding an Item](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item). * Ensure that you have created at least one price list in fabric Offers. For more information, see [Pricing](/v3/offers/user-guides/offers/pricing). * If you plan to create a promotion based on [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview) or [Collections](/v3/product-catalog/user-guides/product-catalog/collections/collections), ensure you have set up these features in Product Catalog and added items to them. ## Procedure 1. In the left menu, click **Offers > Promotions**.\ The **Promotions** page is displayed. 2. Click **Add Promotion**. The **Create Promotion** page is displayed. 3. In the **Select type** field, select **SKU Promotion**. 4. Click **Next**. The **Basic details** menu is displayed. 5. In the **Promotion name** field, enter a name for the promotion.
This name is for internal use only. fabric recommends giving it a unique, descriptive name that will help you differentiate this promotion from other promotions you may be running concurrently. For example, *Labor Day Dining Set Clearance*. 6. (Optional) In the **Notes** field, enter any internal-facing details that might be relevant to this promotion. 7. In the **Start date** and **Start time** fields, enter the date and time the promotion begins.
The start date and time must be in the future. 8. In the **End date** and **End time** fields, enter the date and time the promotion ends.
The end date and time must be after the start date and time. 9. In the **Price lists** field, select one or more price lists.
The promotion will only apply to eligible SKUs on the price lists you select. If selecting multiple price lists, they must all use the same currency. For more information, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 10. In the **Apply promotion to** field, select a price type.
For more information on price types, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 11. Click **Next**.
The **Conditions** menu is displayed. 12. To select the items that are eligible for the promotion, in the **From** field, make one or more selections.
For more information, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 13. Click the **Browse** button.
The **Browse SKUs customers must buy** window is displayed. 14. Select the SKUs that are eligible for the promotion and click **Add**.
The SKUs you selected are added to the list of SKUs that are eligible for the promotion. 15. If you selected multiple conditions in step 12, select an operator to choose how your selections interact with each other. For more information on these settings, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 16. (Optional) To exclude items from the promotion, in the **Exclude** field, select one or more options and configure as required. For more information on excluding products, see [Excluding products](/v3/offers/user-guides/offers/promotions/overview#product-exclusions-from-promotions). 17. To set up the type of discount, in the **Customer gets** section, take one of the following steps.
For more information on the **Customer gets** section, see [Defining discounts and how they're applied](/v3/offers/user-guides/offers/promotions/overview#defining-discounts-and-how-they-re-applied). * To apply the discount to individual SKUs, in the **Discount on** field, select **SKU**. a. In the **Discount type** field, select a discount type. b. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. c. In the **Discount value** field, enter a value. * To apply the discount to the cost of shipping, in the **Discount on** field, select **Shipping** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Shipping type** field, choose one or more shipping methods the discount applies to. c. In the **Applicable on** field, select **Entire Cart** or **Entire Shipment**. d. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. e. In the **Discount value** field, enter a value. * To apply the discount to the entire cart, in the **Discount on** field, select **Cart** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Discount value** field, enter a value.
18. (Optional) To add another discount, select **Add Another Discount** and set up the discount as required. 19. Click **Next**.
The **Stacking & additional settings** menu is displayed. 20. To set how this promotion can be combined with or restricted by other promotions you are running, in the **Set promotion stacking** field, select a stacking type, and, if applicable, set the priority.
For more information on promotion stacking and priority, see [Stacking and additional settings](/v3/offers/user-guides/offers/promotions/overview#stacking-and-additional-settings). 21. (Optional) To create tailored messaging about the promotion on various pages of your commerce site, click the arrow icon next to **Promotion messaging**. * In the **Choose where to add messaging** field, select one or more places to add the messaging. * In the **Locale set 1** field, select the locales where this messaging will appear. * Enter a title for the message. * Enter the message body. For more information on promotion messaging, see [Promotion messaging](/v3/offers/user-guides/offers/promotions/overview#promotion-messaging). 22. (Optional) To add interal-facing tags to help you identify or classify the promotion, click the arrow icon next to **Promotion attributes** and do the following: * In the **Attribute name** field, select a name. * In the **Attribute values** field, select one or more values. Attribute names and attribute values are user-generated and can be created by visiting **Offers > Settings > Attributes** in Copilot. For more information, see [Creating an attribute](/v3/guides/offers/settings#attributes). 23. (Optional) To target the promotion to specific customer segments, click the arrow icon next to **Customer segments** and do the following: * Select **Segment**. * In the **Segment name** field, select a name. * In the **Segment values** field, select one or more values. * (Optional) To exclude segments, select **Exclude Segment**. * In the **Segment name** field, select a name to exclude. * In the **Segment values** field, select one or more values to exclude. Segment names and segment values are user-generated and can be created by visiting **Offers > Settings > Customer segments** in Copilot. For more information, see [Customer segments](/v3/guides/offers/settings#customer-segments). 24. (Optional) To set the maximum number of times the promotion can be used, click the arrow icon next to **Usage limits** and enter a number. 25. Click **Next**.
The **Review & create** menu is displayed. 26. Verify that all promotion details are correct.
Use the **Back** button to move to previous steps in the process. 27. Click **Create**. The promotion is created with the settings you specified. ## Related Topics * [Promotions Overview](/v3/offers/user-guides/offers/promotions/overview) * [Creating a SKU Quantity Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-quantity-promotion) * [Creating a Buy Get Promotion](/v3/offers/user-guides/offers/promotions/creating-a-buy-get-promotion) # null Source: https://developer.fabric.inc/v3/offers/user-guides/offers/promotions/creating-a-sku-quantity-promotion This topic covers the process of creating a SKU quantity promotion. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see [Role-Based Access Control](/v3/offers/user-guides/offers/promotions/overview). * Ensure that you have added at least one item in fabric Product Catalog. For more detailed information, see [Adding an Item](/v3/product-catalog/user-guides/product-catalog/list/items/adding-an-item). * Ensure that you have created at least one price list in fabric Offers. For more information, see [Pricing](/v3/offers/user-guides/offers/pricing). * If you plan to create a promotion based on [Categories](/v3/product-catalog/user-guides/product-catalog/categories/overview) or [Collections](/v3/product-catalog/user-guides/product-catalog/collections/collections), ensure you have set up these features in Product Catalog and added items to them. ## Procedure 1. In the left menu, click **Offers > Promotions**.\ The **Promotions** page is displayed. 2. Click **Add Promotion**. The **Create Promotion** page is displayed. 3. In the **Select type** field, select **SKU Quantity**. 4. Click **Next**. The **Basic details** menu is displayed. 5. In the **Promotion name** field, enter a name for the promotion.
This name is for internal use only. fabric recommends giving it a unique, descriptive name that will help you differentiate this promotion from other promotions you may be running concurrently. For example, *Labor Day Dining Set Clearance*. 6. (Optional) In the **Notes** field, enter any internal-facing details that might be relevant to this promotion. 7. In the **Start date** and **Start time** fields, enter the date and time the promotion begins.
The start date and time must be in the future. 8. In the **End date** and **End time** fields, enter the date and time the promotion ends.
The end date and time must be after the start date and time. 9. In the **Price lists** field, select one or more price lists.
The promotion will only apply to eligible SKUs on the price lists you select. If selecting multiple price lists, they must all use the same currency. For more information, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 10. In the **Apply promotion to** field, select a price type.
For more information on price types, see [Price lists](/v3/offers/user-guides/offers/promotions/overview#price-lists). 11. Click **Next**.
The **Conditions** menu is displayed. 12. To select the items that are eligible for the promotion, in the **From** field, make one or more selections.
For more information, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 13. Click the **Browse** button.
The **Browse SKUs customers must buy** window is displayed. 14. Select the SKUs that are eligible for the promotion and click **Add**.
The SKUs you selected are added to the list of SKUs that are eligible for the promotion. 15. If you selected multiple conditions in step 12, select an operator to choose how your selections interact with each other. For more information on these settings, see [Product eligibility definitions for promotions](/v3/offers/user-guides/offers/promotions/overview#product-eligibility-definitions-for-promotions). 16. (Optional) To exclude items from the promotion, in the **Exclude** field, select one or more options and configure as required. For more information on excluding products, see [Excluding products](/v3/offers/user-guides/offers/promotions/overview#product-exclusions-from-promotions). 17. To set the minimum quantity of SKUs the customer must purchase in order to be eligible for the promotion, in the **Buy min quantity of SKUs field**, enter a value. 18. To set up the type of discount, in the **Customer gets** section, take one of the following steps.
For more information on the **Customer gets** section, see [Defining discounts and how they're applied](/v3/offers/user-guides/offers/promotions/overview#defining-discounts-and-how-they-re-applied). * To apply the discount to individual SKUs, in the **Discount on** field, select **SKU**. a. In the **Discount type** field, select a discount type. b. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. c. In the **Discount value** field, enter a value. * To apply the discount to the cost of shipping, in the **Discount on** field, select **Shipping** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Shipping type** field, choose one or more shipping methods the discount applies to. c. In the **Applicable on** field, select **Entire Cart** or **Entire Shipment**. d. (Optional) To allow the promotion to have variable discount amounts to prevent over-discounting when promotions stack, click **Dynamic discount** and do the following: * In the **Additional discount (If discount already exists)** field, enter a value. e. In the **Discount value** field, enter a value. * To apply the discount to the entire cart, in the **Discount on** field, select **Cart** and do the following: a. In the **Discount type** field, select a discount type.\ b. In the **Discount value** field, enter a value.
19. (Optional) To add another discount, select **Add Another Discount** and set up the discount as required. 20. Click **Next**.
The **Stacking & additional settings** menu is displayed. 21. To set how this promotion can be combined with or restricted by other promotions you are running, in the **Set promotion stacking** field, select a stacking type, and, if applicable, set the priority.
For more information on promotion stacking and priority, see [Stacking and additional settings](/v3/offers/user-guides/offers/promotions/overview#stacking-and-additional-settings). 22. (Optional) To create tailored messaging about the promotion on various pages of your commerce site, click the arrow icon next to **Promotion messaging**. * In the **Choose where to add messaging** field, select one or more places to add the messaging. * In the **Locale set 1** field, select the locales where this messaging will appear. * Enter a title for the message. * Enter the message body. For more information on promotion messaging, see [Promotion messaging](/v3/offers/user-guides/offers/promotions/overview#promotion-messaging). 23. (Optional) To add interal-facing tags to help you identify or classify the promotion, click the arrow icon next to **Promotion attributes** and do the following: * In the **Attribute name** field, select a name. * In the **Attribute values** field, select one or more values. Attribute names and attribute values are user-generated and can be created by visiting **Offers > Settings > Attributes** in Copilot. For more information, see [Creating an attribute](/v3/guides/offers/settings#attributes). 24. (Optional) To target the promotion to specific customer segments, click the arrow icon next to **Customer segments** and do the following: * Select **Segment**. * In the **Segment name** field, select a name. * In the **Segment values** field, select one or more values. * (Optional) To exclude segments, select **Exclude Segment**. * In the **Segment name** field, select a name to exclude. * In the **Segment values** field, select one or more values to exclude. Segment names and segment values are user-generated and can be created by visiting **Offers > Settings > Customer segments** in Copilot. For more information, see [Customer segments](/v3/guides/offers/settings#customer-segments). 25. (Optional) To set the maximum number of times the promotion can be used, click the arrow icon next to **Usage limits** and enter a number. 26. Click **Next**.
The **Review & create** menu is displayed. 27. Verify that all promotion details are correct.
Use the **Back** button to move to previous steps in the process. 28. Click **Create**. The promotion is created with the settings you specified. ## Related Topics * [Promotions Overview](/v3/offers/user-guides/offers/promotions/overview) * [Creating a SKU Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-promotion) * [Creating a Buy Get Promotion](/v3/offers/user-guides/offers/promotions/creating-a-buy-get-promotion) # Managing Promotions Source: https://developer.fabric.inc/v3/offers/user-guides/offers/promotions/managing-promotions This document covers the process of editing and deleting promotions. ## Prerequisites * Ensure that you have **Admin** or **Editor** privileges for Offers. For more detailed information on these settings, see the [Role-Based Access Control](/v3/guides/settings/rbac/role-based-access-control-offers-roles) topic. * Ensure that you have created at least one required promotion: * [Create a SKU promotion](/v3/guides/offers/promotions/creating-a-sku-promotion) * [Create a SKU Quantity Promotion](/v3/guides/offers/promotions/creating-a-sku-quantity-promotion) * [Create a buy-get promotion](/v3/guides/offers/promotions/creating-a-buy-get-promotion) ## Managing Existing Promotions 1. In the left menu, click **Offers > Promotions**. The **Promotions** page is displayed. 1.(Optional) **Search by promotion title** in the search bar. 1.(Optional) Use the dropdown menu to filter your results. The dropdown menus can filter by: * Status * Start date * End date * Promotion Type * More Filters * Promotion Attributes * Segments * Price Lists * Price Type * Categories * Collections * Product Attributes * Stacking 2. Click the promotion that you want to view. Your promotion is displayed. 3. To edit a promotion, edit the promotion details as required. If the promotion is expired, you can't edit it. 4. If you want to enable the promotion, turn on the toggle. You can turn off the toggle and disable the promotion later if required. 5. Click **Update**. # Overview Source: https://developer.fabric.inc/v3/offers/user-guides/offers/promotions/overview With the Promotions feature in fabric Offers, you can create targeted discounts, incentives, and pricing rules tailored to specific products, categories, collections, product attributes, and customer segments. You can also configure promotion conditions, set exclusions, and define how multiple promotions interact through stacking rules. The key elements of a promotion include: | **Elements** | **Description** | | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | Eligible products | The SKUs, categories, and collections that qualify for the promotion. | | Conditions | Criteria that define the requirements to activate the promotion, such as a minimum purchase quantity or specific product features. | | Discount type | Formats of the discount, including percentage reductions, fixed amount discounts, or free shipping. | | Promotion stacking | Rules determining how promotions combine, whether by allowing multiple discounts or making them exclusive. | | Dynamic discounting | Controls the way discounts are applied when multiple promotions are eligible, preventing over-discounting by limiting how discounts stack. | | Promotion messaging | Customizable promotional messages visible on product pages, in the customer's cart, or at checkout, tailored for specific customer segments. | Promotions are applied automatically to a customer's order once the items in their cart meet the criteria you specify. Unlike [Coupons](/3/offers/user-guides/offers/coupons/overview), customers don't need to provide a code to receive the discount. ## Types of Promotions fabric supports three types of promotions: * **SKU Promotion**: A discount targeting specific SKUs, where individual products are selected for eligibility, and a discount type is assigned. This promotion type is ideal for sales on specific products, clearing inventory, or spotlighting new arrivals. For example, a *Spring clearance* could offer a percentage discount on products from the previous year's collection. * **SKU Quantity Promotion**: A discount applied when a customer buys a specific quantity of a particular SKU. This promotion is often used to clear inventory or promote high-margin products. For example, you can create a *Buy 3, get 15% off* promotion to encourage customers to purchase in bulk and increase average order value. * **Buy X Get Y Promotion**: A free or discounted product,Y, is offered when customers purchase a designated product or quantity of X. This promotion is ideal for bundling complementary products, driving larger transactions, and increasing cart size. For example, you can create *Buy one, get one free* or *Buy two, get 50% off the third item* to offer an incentive when the customer's cart meets the minimum purchase threshold. ## Promotion Setup Setting up a promotion includes configuring key elements such as price lists, product eligibility conditions, discount types, exclusions, and how multiple promotions interact, as described in the following workflow: 1. Choose a [price list](#price-lists) to establish the baseline pricing, ensuring that discounts apply correctly depending on whether items are full-price or already discounted. 2. Set the [conditions](#product-eligibility-definitions-for-promotions) that determine which products qualify for the promotion. This could include all products, specific SKUs, categories, or product attributes. 3. Apply [exclusions](#product-exclusions-from-promotions) to refine the promotion by targeting specific products or excluding certain items from the offer. 4. Specify the type of [discount](#defining-discounts-and-how-they-re-applied) the customer receives. For example, percentage off, amount off, or free shipping, and decide if it applies to individual items, shipping costs, or the entire cart. 5. Set up [stacking](#stacking-and-additional-settings) to apply multiple promotions simultaneously. Define how they interact by assigning priorities or making them exclusive. 6. Configure [promotion messaging](#promotion-messaging) to determine where details appear for customers, such as product pages, the cart, or the checkout. Customize messaging based on customer groups or regions. ### Price lists Price lists determine how discounts are applied to products. By selecting a price list, you define whether the discount applies to full-price items, sale items, or both. This ensures that promotional pricing is applied as desired, without over-discounting. The following table outlines the different types of price lists and how they determine the application of discounts during a promotion: | **Price list** | **Description** | | ---------------------- | ---------------------------------------------------------------------------------------- | | Only base price | The discount applies only if the item isn't already on sale. | | Only sale price | The discount applies only if the item is on sale. | | Both sale & base price | The discount applies regardless of whether the item is at base price or already on sale. | For more information, see [the pricing guide](/v3/offers/user-guides/offers/pricing). ### Product eligibility definitions for promotions The **Customer buys** section allows you to define conditions that specify which products are eligible for the promotion. Setting these conditions ensures that the promotion is applied only to products that meet your defined criteria. The following table describes the options to define product eligibility based on the price list or lists you selected: | **Condition** | **Description** | | ------------------ | ---------------------------------------------------------------------------------------------- | | All SKUs | The promotion applies to all products. | | Specific SKUs | The promotion applies to specific products you select. | | Categories | The promotion applies to one or more categories of products that you select. | | Collections | The promotion applies to one or more collections of products that you select. | | Product Attributes | The promotion applies to products based on specific attributes, such as color, size, or brand. | You can combine multiple conditions using operators to create a more targeted promotion. The **AND** condition requires all conditions to be met, while the **OR** condition allows the promotion to apply if any one condition is satisfied. For example, if you select both the *Category: Apparel* and *Color: Red*, with the **AND** operator, only red apparel qualifies for the promotion. On the other hand, if you use the **OR** operator, any items in the category *apparel* will qualify for the promotion. Combining conditions allows you to ensure that the right products are included based on multiple criteria. For example, you can include all items in the *Apparel* category, but limit the promotion to products with the attribute *Color: Red* or *Size: Large*. This allows you to ensure that the right products are included based on multiple conditions. #### Product exclusions from promotions After selecting your initial group of products based on SKUs, categories, collections, or product attributes, you can refine your promotion by excluding specific products. The **Exclude** field allows you to remove certain items from the promotion, even if they meet the initial promotion criteria. For example, you might run a sale on all products in the *Apparel* category, but exclude premium brands or limited-edition items. Using the exclude field, you can remove these products by specifying their SKUs, categories, collections, or attributes. You can exclude products in the following ways: * SKUs: Specify the SKUs of individual products that you don’t want to include in the promotion. * Category: Specify the categories that you don't want to include in the promotion. * Collection: Specify the collections that you don't want to include in the promotion. * Attributes: Specify the products by their attributes that you don't want to include in the promotion. By using exclusions, you gain greater precision over which products are part of a promotion, avoiding unintended discounts on products that don’t align with your strategy. ### Defining discounts and how they're applied Promotions offer various types of rewards, such as a percentage off, a fixed amount off, or free shipping, to customers when the promotion criteria are met. Different types of discounts can be applied to various aspects of a promotion. Here’s an overview of the most common discount applications: | **Discount on** | **Description** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | SKU | The discount applies to the specific SKU or SKUs you specify. Ideal for promotions highlighting specific products or for clearing inventory. | | Shipping | The discount applies to shipping. | | Cart | The discount applies to the total value of the customer's cart. Cart discounts incentivize customers to add more items to their carts to qualify for the discount. | The discount type defines how the discount is applied to the promotion. A promotion can support up to three different discounts. For example, you can create a promotion that gives shoppers 10 percent off and then create a second discount that offers free shipping. There are several discount types available, each with their own function: | Discount type | Description | | -------------- | ------------------------------------------------------------- | | Percentage off | Reduces the cost of eligible items by a specified percentage. | | Amount off | Reduces the cost of eligible items by a specified amount. | | Fixed price | Sets a specific price for eligible items. | | Free | Only available when the discount applies to shipping. | When creating a promotion that applies to the shipping method, you must select a fulfillment rule set that you configured in fabric Orders. For more information, see the [Creating a fulfillment rule set guide](/v3/orders-and-inventory/user-guides/orders/order-fulfillment-logic/create-a-new-rule-set-ui). #### Shipping discounts Shipping discounts can be applied with one of the following options: * Entire cart: Each item in a cart must qualify for the promotion to apply regardless of ship-to locations. * Entire shipment: Only the items that share the same ship-to locations qualify for the promotion. For example, in the event of multi-fulfillment orders, when part of the order ships to home and part is picked up in-store, only items that qualify within the same ship-to qualify for the promotion. You can use multiple shipping methods, such as home delivery, in-store pickup, or split shipments. However, only a single discount type can be applied per shipping method. This means if one part of the order is shipped and another part is picked up, you can apply a shipping discount to one method at a time. ### Dynamic discounting Dynamic discounting allows promotions to have variable discount amounts, preventing over-discounting when multiple promotions stack. By enabling dynamic discounting, you can set limits on the discount percentage or amount applied, ensuring that the total discount remains controlled even when promotions overlap. For example, if one promotion discounts an item or cart by 40%, you can limit a subsequent discount to 10%. Dynamic Discounts aren't eligible for buy/get or spend/get promotions. ## Stacking and Additional Settings Promotion stacking refers to the ability to combine multiple promotions or discounts on the same cart. When promotion stacking is enabled, a customer can apply more than one discount to their cart, increasing the overall savings. For example, a customer could receive both a 10% discount for a storewide sale and an additional \$5 off for a specific product promotion. Promotion stacking is controlled by assigning a priority to each promotion. Promotions with a lower priority number are applied first, and subsequent promotions are stacked on top, applying their discounts to the already-discounted price. This allows for more control over how multiple promotions interact, ensuring that promotions with higher priority are considered before others. Promotions are stacked using the following options: * **Stackable**: The promotion can stack with any other discount, except for those set to exclusive. The discounts are applied on top of each other, increasing the total discount amount if the discounts apply to the same item. Stackable promotions require a priority, which defines the order in which stackable promotions are evaluated. Starting with priority 1, promotions are evaluated and applied in ascending order. Priority 1 uses the price on the price list to apply the discounts. Priority 2 promotions are evaluated with their applicable discounts stacked on top of the discounted price from priority 1 promotions. Evaluation continues until all stackable priorities have been evaluated and applied. * **Exclusive**: The promotion can't be combined with other discounts, except Universal. Only one non-stackable promotion is applied to the cart, even if other items are eligible. This is considered globally exclusive. In these cases, Offers applies the promotions with the largest monetary discount. If two promotions have the same monetary discount amount, the most recently published promotions are applied. * **Type exclusive**: This promotion can't be combined with other promotions of the same discount type, such as SKU, cart, or shipping. When multiple promotions of the same type are available, only the one with the highest level or best discount is applied to the customer’s order. This ensures that conflicting promotions don't overlap, preventing excessive discounts. * **Universal**: The promotion is always evaluated and applied. These discounts are applied last and can stack on any other promotion regardless of its stacking setting. ### Promotion messaging Promotion messaging allows you to create custom messages that notify customers about active promotions. The message can appear on any combination of the following pages: The message can appear on Product Detail Page (PDP), Product List Page (PLP), customer's cart, and the checkout page, or any combination of these. Additionally, you can target specific customer groups by choosing the locale, ensuring the message is displayed in the appropriate language or region. This feature helps ensure that your promotional offers are clearly communicated to the right audience. ### Promotion attributes Promotion attributes are internal-facing tags to categorize and classify promotions for use in reporting and analytics. For example, you can tag promotions with attributes such as *Seasonal Sales* and further define them with values such as *Summer* or *Fall*. This classification allows you to query and report on promotions based on the attributes you’ve assigned, making it easier to measure the performance of targeted campaigns. For more information on creating these attributes, see the [Attributes guide](/v3/offers/user-guides/offers/settings#attributes). ### Customer segments You can define which customer segments are eligible for the promotion. Targeting customer segments allows you to apply discounts or special offers to specific groups of customers. For more information on customer segments, see [customer segments](/v3/offers/user-guides/offers/settings#customer-segments). ## Related Topics * [Creating a SKU Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-promotion) * [Creating a SKU Quantity Promotion](/v3/offers/user-guides/offers/promotions/creating-a-sku-quantity-promotion) * [Creating a Buy Get Promotion](/v3/offers/user-guides/offers/promotions/creating-a-buy-get-promotion) # Settings Source: https://developer.fabric.inc/v3/offers/user-guides/offers/settings ## Introduction To manage price lists, global exclusions, and customer segments, click on the **Settings** menu under Offers in the left-hand navigation. ### Price Lists Price lists is the default view when accessing the Offers Settings menu. For a new price list, enter a name under Price List Name and then click the **Add price list** button. The new price list you create will be listed along with other existing prices lists under Manage Price List. Use the buttons at the left to choose which price list is set as the Default List. The Default Price List serves as the master price list in cases of conflicting prices. For example, if you have a single SKU that appears at different prices on five different price lists, the SKU’s price as it appears in the Default Price List will be shown. Sort price lists by clicking on the arrow next to Price List ID. To change a Price List Name, click on its corresponding pencil icon and enter a new name. Click the checkmark to save or the X to cancel. ### Global exclusions Global Exclusions allows you to protect SKUs from being discounted by active promotions. To set up Global exclusions, select **Global exclusions** from the Settings menu and click the **Create exclusion list** button. * Give the list a title * Set the start and end dates/times. This sets the duration that the SKUs in the list will be protected from discounts. * Set whether you want the SKU price, Shipping price, or both to be protected * SKU price - This protects the SKU’s price from being discounted * Shipping price - This will ensure that the shipping price is applied during checkout for this SKU. * Select the SKUs to be excluded from discounts * Bulk upload - Use a CSV file to import SKUs * Browse SKUs - Browse SKUs that are in your Product Catalog and select * Click **Save** To edit a Global exclusion list, mouse over the list and click on the edit icon that appears. Make your changes, and then click save. To delete a Global exclusion list, mouse over the list, click on the delete icon that appears, and then click **confirm** in the dialog box. ## Customer Segments Offers allows you to target promotions at specific groups of customers. To use this feature, your customers must first be segmented outside of fabric Offers. Segmentation can be achieved through one of the following external methods: * **Third-party segmentation tools**: Group customers by their traits and behaviors. Each group is assigned a unique segment identifier that can be stored with the customer’s profile. * **Customization of your online store**: Use browser-based information to segment customers by device type, location, or other factors. * **Customer tagging**: Add custom traits to customer profiles, which can then be configured into segments. After a customer is assigned to a segment, [fabric Cart](/v3/cart-and-checkout/api-reference/carts-v3/overview) include the segment information when passing data to fabric Offers when evaluating promotions. The customer segment ID must be included in the **Profile** section of the promotion evaluation request. The process of identifying and assigning customers to segments is handled entirely outside of fabric Offers. ### Creating a customer segment 1. To set up customer segments in fabric Offers, go to **Settings > Customer Segments** and click **Create Segment**, and do the following: * **Segment name**: Enter a name for your segment type. For example, **Loyalty Tier** or **Region**. * **Segment values**: Define multiple options within the segment type. For example, for a **Loyalty Tier** segment, values might include **Gold**, **Silver**, and **Bronze**. Enter each value and press Enter to save it. Customer segments created in fabric Offers must align with the segment identifiers passed from your external tools through fabric Cart. ### Linking a customer segment to a promotion After creating a customer segment in **Offers** > **Settings** menu, follow the steps in the [Offers Promotions](/v3/offers/user-guides/offers/promotions/overview) section to link the customer segment to a promotion. Linking customer segments allows you to target specific customer groups with custom discounts or incentives. ### Attributes With the attributes feature, you can create internal-facing tags to help you identify or classify promotions and coupons. For example, business intelligence or reporting tools can use the attribute and value you set up for querying purposes. Two attributes can share the same name, such as seasonal Sales, with values such as summer or fall to differentiate them. **Creating an attribute** 1. In the left menu, click **Offers > Settings**. The **Settings** page is displayed. 2. Select the **Attributes** tab. The **Create attribute** tab is displayed. 3. In the **Attribute name** field, enter a name for the attribute. 4. In the **Attribute values** field, enter an attribute value. 5. Click **Create Attribute**. The attribute is created. You can assign the attribute when creating or editing a promotion or coupon. # Managing Price Lists Source: https://developer.fabric.inc/v3/offers/user-guides/offers/settings/price-lists ## Overview A price list is a collection of items and their assigned prices, enabling merchants to implement various pricing strategies within the Offers Settings menu. The same item can exist in multiple price lists with different prices, allowing for promotions, coupons, discounts, and clearance pricing. Each price list includes key properties, such as currency, start and end dates, and pricing rules. When a price list expires, the prices of the associated items also expire. Merchants can create and manage price lists, and designate one as the default to maintain consistency when multiple lists contain conflicting prices. Additionally, price lists influence promotions by defining how discounts apply to products—whether on full-price items, sale items, or both. This flexibility allows merchants to maintain accurate, dynamic pricing across products and channels. ## Creating a Price List 1. In the left menu, click **Offers > Settings**.\ The **Price Lists** tab on the **Offers settings** page is displayed. 2. In the **Price List Name**, enter the name for the price list. 3. In the **Currency** field, select the currency for the price list. 4. In the **Start Date** field, enter the date when this price list takes effect. 5. In the **Time** field, enter the time for when this price list takes effect. 6. In the **End date** field, enter the date when this price list expires. 7. In the **Time** field, enter the time for when this price list expires. 8. Click **Add price list**. The price list is created. ## Editing a Price List 1. In the left menu, click **Offers > Settings**.\ The **Offers settings** page is displayed. This page consists of **Price Lists**, **Global exclusions**, **Customer segments**, and **Attributes**. 2. On the **Price Lists**, in the price lists table, click the name of the price list that you want to edit. The **Update price list** window is displayed. 3. Edit the fields as required. 4. Click **Save**. The price list is updated with the new setting. # Retrieve jobs Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/jobs/retrieve-jobs cc.openapi get /catalog-connector-jobs Use this endpoint to retrieve a paginated list of import and export jobs related to Catalog Connector. The following constraints apply when using the query parameters: - The query parameter job `ids` can't be combined with any other query parameters. - The query parameter `inputFileIds` can only be combined with the query parameter `lastJobOnly`. - Pagination isn't supported when `ids` or `inputFileIds` is specified. # Delete a product by Item ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/item-operations/delete-by-item cc.openapi delete /catalog-connector/products/itemIds/{itemId} Use this endpoint to delete a single product by its `itemId`. If you don't have the `itemId`, use one of the endpoints to delete the product: - [Delete a product by SKU](/v3/api-reference/catalog-connector/operations/sku-operations/delete-with-sku). - [Delete a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/delete-by-product). # Retrieve a product or a variant by Item ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/item-operations/retrieve-by-item cc.openapi get /catalog-connector/products/itemIds/{itemId} Use this endpoint to retrieve a single product by its `itemId`. You must specify the query parameters `itemId` and `locale`. Optionally, you can set the following query parameters to `true` to refine the search results: You must specify the query parameters `itemId` and `locale`. Optionally, you can set the following query parameters to `true` to refine the search results: - `excludeBundleProducts`: Exclude bundled products from the response. - `excludeCollections`: Exclude collections from the response. - `excludeCategories`: Exclude categories from the response. - `excludeAttributes`: Exclude attributes from the response. - `excludeVariants`: Exclude variants from the response. If you don't have the `itemId`, use one of the endpoints to retrieve the product: - [Update a product by SKU](/v3/api-reference/catalog-connector/operations/sku-operations/update-with-sku). - [Update a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/update-by-product). # Update a product by the Item ID. Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/item-operations/update-by-item cc.openapi put /catalog-connector/products/itemIds/{itemId} Use this endpoint to update a single product by using its `itemId`. You can update the product's details, such as its name, category details, product images, attributes, and collections. However, you can't update the `itemId`. The new data completely replaces the existing data. You can update the product's details, such as its name, category details, product images, attributes, and collections. However, you can't update the itemId. The new data completely replaces the existing data. If you don't have the `itemId`, use the one of the endpoints to delete the product: - [Update a product by SKU](/v3/api-reference/catalog-connector/operations/sku-operations/update-with-sku). - [Update a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/update-by-product). # Add a product Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/product-operations/add-product cc.openapi post /catalog-connector/products Use this endpoint to add a single product to Catalog Connector. You must specify the `locale` in the query parameter and the product data in the request body. Only `sku` is mandatory for product data. Optionally, you can specify the `type` as item, variant, or bundle. The default setting for `type` is item. # Delete a product by product ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/product-operations/delete-by-product cc.openapi delete /catalog-connector/products/{productId} Use this endpoint to delete a single product by its `productId`. If you don't have the `productId`, use one of the endpoints to delete the product: - [Delete a product by SKU](/v3/api-reference/catalog-connector/operations/sku-operations/delete-with-sku). - [Delete a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/delete-by-item). # Retrieve a product by product ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/product-operations/retrieve-by-product cc.openapi get /catalog-connector/products/{productId} Use this endpoint to retrieve a single product by its `productId`. You must specify the query parameters `productId` and `locale`. Optionally, you can set the following query parameters to `true` to refine the search results: - `excludeBundleProducts`: Exclude bundled products from the response. - `excludeCollections`: Exclude collections from the response. - `excludeCategories`: Exclude categories from the response. - `excludeAttributes`: Exclude attributes from the response. - `excludeVariants`: Exclude variants from the response. If you don't have the `productId`, use one of the endpoints to retrieve the product: - [Retrieve a product by SKU](/v3/api-reference/catalog-connector/operations/sku-operations/update-with-sku). - [Retrieve a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/update-by-item). # Update a product by product ID Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/product-operations/update-by-product cc.openapi put /catalog-connector/products/{productId} Use this endpoint to update a single product by its `productId`. You can update the product's details, such as its name, category details, product images, attributes, and collections. However, you can't update the productId. The new data completely replaces the existing data. If you don't have the `productId`, use one of the corresponding endpoints: - [Update a product by SKU](/v3/api-reference/catalog-connector/operations/product-operations/update-by-product). - [Update a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/update-by-item). # Find products Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/search cc.openapi post /catalog-connector/products/search Use this endpoint to search for products based on names, IDs, SKUs, image URLs, and more. By specifying the appropriate query parameters, you can exclude one or more types of data, such as collections, categories, variants, attributes, and products within a bundle. - Use the `CONTAINS` search operation to search for products based on keywords of SKU, name, and more. - Use the `IN` search operation to search for products based on one or more values, such as IDs, names, SKUs, image URLs, attributes, and types. - Use the less than or equals to, `LTE`, greater than or equals to, `GTE`, less than, `LT`, greater than, `GT` and equals `EQ` operations to search for date-specific values, such as time of creation or modification. # Delete a product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/sku-operations/delete-with-sku cc.openapi delete /catalog-connector/products/skus/{skuId} Use this endpoint to delete a single product by using its SKU. If you don't have the product SKU, use one of the endpoints to delete the product: - [Delete a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/delete-by-product). - [Delete a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/delete-by-item). # Retrieve a product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/sku-operations/retrieve-with-sku cc.openapi get /catalog-connector/products/skus/{skuId} Use this endpoint to retrieve a single product by its SKU. You must specify the query parameters `sku` and `locale` to corresponding to the product. Optionally, you can set the following query parameters to `true` to refine the search results: - `excludeBundleProducts`: Exclude bundled products from the response. - `excludeCollections`: Exclude collections from the response. - `excludeCategories`: Exclude categories from the response. - `excludeAttributes`: Exclude attributes from the response. - `excludeVariants`: Exclude variants from the response. If you don't have the product SKU, use one of the endpoints to retrieve the product: - [Retrieve a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/retrieve-by-product). - [Retrieve a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/retrieve-by-item). # Update a product by SKU Source: https://developer.fabric.inc/v3/product-catalog/api-reference/catalog-connector/operations/sku-operations/update-with-sku cc.openapi put /catalog-connector/products/skus/{skuId} Use this endpoint to update details of a product by its SKU. You can update details of the product, such as the product name, category details, product images, attributes, and collections. The new data replaces the existing data. Note that you can't update the SKU. If you don't have the product SKU, use one of the endpoints update the product details: - [Update a product by product ID](/v3/api-reference/catalog-connector/operations/product-operations/update-by-product). - [Update a product by item ID](/v3/api-reference/catalog-connector/operations/item-operations/update-by-item). # Create an empty cart Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/carts/carts modular-cart post /carts Use this endpoint to create a new cart. **Default Configurations**: To create a cart with default configurations, send a request with an empty body. **Provided Configurations**: To create a cart with provided configurations, include the configurations in the request body. To learn more about configuration behaviors, visit the [Configuration Behaviors](/v3/cart-and-checkout/api-reference/carts-v3/configuration-behaviors) page. # Sequence calling Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/carts/sequence modular-cart post /carts/{cartId}/sequence Use this endpoint to execute multiple cart-related operations with a single request. This allows you to perform various actions such as creating a cart, adding items, and checking out in a single API call. **Note:** The order of operations matters since IDs are carried over from call to call. The Cart ID from the [Create cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts) endpoint is used in the path parameter. # Configuration Behaviors Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/configuration-behaviors The Configuration Behaviors page provides an overview of the configuration settings and their associated functionalities. To ensure your cart functions as intended, you must specify which configurations to activate when making a [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts) request. When setting a cache expiry, the minimum duration is 1 second and the maximum duration is 7,776,000 seconds, which is 3 months. | Configuration | Description | | ------------- | -------------------------------------------------------- | | WARN | Executes the action, and the state object is updated. | | REJECT | Rejects the action and a detailed exception is returned. | | DROP | Drops the action and resource is removed from the cart. | | NONE | Accepts the action. | | BLOCK | Blocks the action and returns an exception. | ## Related Topics * [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts) # Configuring Adjustment Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-adjustments This feature in Carts API provides you the flexibility to apply adjustments at the cart, item, or fulfillment level. Adjustments are deductible elements that modify the total amount and are non-taxable. ## Prerequisites The following prerequisites must be completed sequentially to configure an adjustment. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Create a fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) to add a fulfillment adjustment. 3. [Create an item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to add an item adjustment. ## Adjustment Initialization You can apply adjustments at multiple levels, including the cart, individual items, or fulfillment. The adjustment maintains a consistent structure across all levels. The following code sample provides the structure of an adjustment object: ```json { "id": "6964b984-49fd-4754-b979-a260e944320c", "price": { "amount": 10 }, "reason": "DelayedOrder", "attributes": { "reasonDescription": "Price Adjustment due to delayed shipping" }, "updatedAt": "2024-06-20T08:09:58.951Z", "createdAt": "2024-06-20T08:09:58.951Z" } ``` As multiple adjustments can be applied to a single cart, item, or fulfillment, adjustments are displayed as a collection. The following code sample provides the structure of an adjustment object in a collection: ```json "adjustments": { "total": 10, "collection": [ { "id": "6964b984-49fd-4754-b979-a260e944320c", "price": { "amount": 10 }, "reason": "DelayedOrder", "attributes": { "reasonDescription": "Price Adjustment due to delayed shipping" }, "updatedAt": "2024-06-20T08:09:58.951Z", "createdAt": "2024-06-20T08:09:58.951Z" } ] } ``` ## Examples ### Making adjustments at the cart level Use the [create cart adjustment](/v3/cart-and-checkout/api-reference/carts-v3/carts-adjustments/create-adjustments) endpoint to make adjustments at the cart level and credit points available for discounts as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/adjustments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "price": { "amount":10 }, "reason":"Avail 1000 Credit Points" }' ``` ### Using adjustments at the item level Use the [create item adjustment](/v3/cart-and-checkout/api-reference/carts-v3/item-adjustments/create-item-adjustments) endpoint to make adjustments at the item level and apply the sale price as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/items/806d6671-801d-4554-976d-0d38e525a852/adjustments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "price": { "amount":"10" }, "reason":"Item was a sale item 2 days ago", "attributes": { "type": "retail" } }' ``` # Configuring Fees Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-fees The fees feature in Carts API allows you to add, update, or remove additional fees beyond the resource price, such as gifting fees, platform fees, and service fees. These fees can be applied at various levels, including the cart, individual items, or fulfillment, providing flexibility in customizing the total cost structure. Optionally, the fees may be taxable. ## Prerequisites The following prerequisites must be completed sequentially to configure a fee. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Create a fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) to apply the fulfillment fee. 3. [Create an item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to add the item fee. ## Fee Initialization You can apply fees at multiple levels, including the cart, individual items, or fulfillment. The fee resource maintains a consistent structure across all levels. Taxes on fees is controlled by the `taxable` attribute in the request payload, which defaults to `true`. This means fees are taxed unless specifically set to `false`. The following code sample provides the structure of a fee object: ```json { "id": "188514cb-f36b-4835-a8b3-df75164325d7", "name": "cart v3 fees", "price": { "amount": 10 }, "taxable": true, "attributes": { "message": "gifting-fee" }, "updatedAt": "2024-06-20T07:55:49.021Z", "createdAt": "2024-06-20T07:55:49.021Z" } ``` The resource is displayed as a collection of fees for the associated resource as multiple fees can be applied to a single resource. The following code sample provides the structure of a fee object in a collection: ```json "fees": { "total": 10, "collection": [ { "id": "188514cb-f36b-4835-a8b3-df75164325d7", "name": "cart v3 fees", "price": { "amount": 10 }, "taxable": true, "attributes": { "message": "gifting-fee" }, "updatedAt": "2024-06-20T07:55:49.021Z", "createdAt": "2024-06-20T07:55:49.021Z" } ] } ``` ## Examples ### Adding shipping fees, including shipping fee tax The following steps outline how a fulfillment fee is configured: 1. [Create fulfillment fee.](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment-fees/add-fulfillment) ```curl curl --location '{{modular_cart}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/fulfillments/65879f42-edfb-46de-bf57-77835dec3d60/fees' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "name": "Shipping fee", "price": { "amount": 10 }, "taxable": true, "attributes": { "displayMsg": "Shipping Off for orders over $100" } }' ``` 2. Add tax for the fulfillment fee using the [replace tax data](/v3/cart-and-checkout/api-reference/carts-v3/validations/add-tax) endpoint. ```curl curl --location --request PUT 'https://dev.cart.fabric.inc/beta/v3/modular/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/tax' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --data '{ "fulfillments": [ { "id": "65879f42-edfb-46de-bf57-77835dec3d60", "tax": [ { "amount": 2, "attributes": { "rate": 1 } } ], "fees": [ { "id": "026b9bd1-2e96-4016-93a3-674da01aa29e", "tax": [ { "amount": 1, "attributes": { "rate": 1 } } ] } ] } ] }' ``` Tax here includes fulfillment tax and fulfillment the fee tax as provided in the payload. Response: ```json "price": { "total": 343, "subtotal": 310, "tax": 3, "fulfillments": 30, "discounts": 0, "fees": 110, "adjustments": 0 } ``` ### Applying a gifting fee to items that are gift-wrapped Use the [create item fees](/v3/cart-and-checkout/api-reference/carts-v3/item-fees/create-item-fees) endpoint to apply the gifting fees to the items that are gift wrapped. The following curl example provides how the request is structured when creating an item fee: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/items/806d6671-801d-4554-976d-0d38e525a852/fees' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "name": "Gift wrap", "price": { "amount": 10 }, "taxable": false, "attributes": { "message": "Happy Birthday John Doe" } }' ``` ### Adding a platform fee at the cart level Use the [create cart fees](/v3/cart-and-checkout/api-reference/carts-v3/fees/create-fees) endpoint to add a platform fee at the cart level. The following curl example provides how the request is structured when creating fee at the cart level: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/fees' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "name": "Platform-fee", "price": { "amount": 100 }, "taxable": true, "attributes": { "reason": "added as an example" } }' ``` # Configuring Fulfillment Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-fulfillment This feature in Carts API allows you to add, update, or remove fulfillment information in the cart and associate it with individual items. The cart supports multiple fulfillment options. ## Prerequisites The following prerequisites must be completed sequentially to configure a fulfillment. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Create a destination address](/v3/cart-and-checkout/api-reference/carts-v3/addresses/create-addresses) if the fulfillment type is `SHIP_TO`. 3. [Create an origin address](/v3/cart-and-checkout/api-reference/carts-v3/addresses/create-addresses) if the fulfillment type is `BOPIS` or `ROPIS`. ## Fulfillment Initialization After you create a cart with [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts), you will see the fulfillment resource in the cart response. The following code sample provides the structure of fulfillment object in a cart response: ```json { "id": "a7f51053-6fbd-42a6-8fbc-303bfc16c13f", "type": "SHIP_TO", "refId": "6425279f661bf878448465b4", "originAddress": "{{originAddressId}}", "destinationAddress": "{{destinationAddressId}}", "price": { "amount": 10 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } } ``` The fulfillment resource can be associated with an item using the `fulfillmentId` by making POST request to the `{cartId}/fulfillments` endpoint. The following code sample provides how the request is structured in a request payload: ### POST Response ```curl curl --location '{{cartV3_domain}}/carts/{{cartId}}/items' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "sku": "5", "refId": "19", "quantity": 10, "price": { "type": "UNIT", "amount": 100 }, "fulfillment": { "id": "a7f51053-6fbd-42a6-8fbc-303bfc16c13f", // fulfillmentId "inventory": { "channels": {"networkCode": "ShipToHome"}, "type": "preOrder" } } }' ``` The cart has a fulfillment object that stores all the fulfillments added to it. You can check your fulfillment information by making a GET request to `carts/{cartId}/fulfillments/{fulfillmentId}` endpoint. The following code sample provides the structure of fulfillment object in the response: ```json { "fulfillments": { "a7f51053-6fbd-42a6-8fbc-303bfc16c13f":{ "id": "a7f51053-6fbd-42a6-8fbc-303bfc16c13f", "type": "SHIP_TO", "refId": "6425279f661bf878448465b4", "attributes": {}, "originAddress": "d48340ac-23c6-42ef-8aa3-84c43eb4e391", "destinationAddress": "d48340ac-23c6-42ef-8aa3-84c43eb4e391", "price": { "amount": 10 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } }, "b326819-6fbd-42a6-8fbc-303bfc16e222": { "id": "b326819-6fbd-42a6-8fbc-303bfc16e222", "type": "SHIP_TO", "refId": "632479f661bf87844846534", "attributes": {}, "originAddress": "d48340ac-23c6-42ef-8aa3-84c43eb4e391", "destinationAddress": "d48340ac-23c6-42ef-8aa3-84c43eb4e391", "price": { "amount": 10 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } } } } ``` ## Examples ### Adding a fulfillment with a single cost to multiple items 1. [Create a fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) curl. ```curl curl --location '{{modular_cart_domain}}/carts/07618f2d-8559-479a-80ed-5ed7259cbd25/fulfillments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "type": "SHIP_TO", "refId": "6622d50d2eee4e4e124c7467", "destinationAddress": "2ac62be8-2440-46e7-9a42-6b2c62fb6690", "price": { "amount": 10.0 } }' ``` **Response** ```json { "id": "e4d68b36-8902-4427-a244-9eb65290855c", "type": "SHIP_TO", "refId": "6622d50d2eee4e4e124c7467", "destinationAddress": "2ac62be8-2440-46e7-9a42-6b2c62fb6690", "price": { "amount": 10.0 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } } ``` 2. Create multiple items with same fulfillment using the [add items](/v3/cart-and-checkout/api-reference/carts-v3/orchestrator/line-items/add-items) endpoint. ```curl curl --location '{{orchestrator_domain}}/orchestrator/carts/07618f2d-8559-479a-80ed-5ed7259cbd25/items' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-request-id: 1' \ --header 'x-fabric-channel-id: 12' \ --header 'Authorization: {authToken}' \ --header 'customer-id: 1234' \ --header 'Content-Type: application/json' \ --data '{ "items": [ { "quantity": 4, "itemId": "41", "sku": "SKU2", "priceListId": "100000", "price": { "type": "UNIT", "amount": 10 }, "fulfillment": { "id": "e4d68b36-8902-4427-a244-9eb65290855c", "inventory": { "channels": { "type": "WEB_PICKUP", "locationNumber": "15", "channelId": "12" }, "type": "availableToPurchase" } } }, { "quantity": 5, "itemId": "44", "sku": "SKU3", "priceListId": "100000", "price": { "type": "UNIT", "amount": 100 }, "fulfillment": { "id": "e4d68b36-8902-4427-a244-9eb65290855c", "inventory": { "channels": { "type": "WEB_SHIP", "networkCode": "ShipToHome", "channelId": "12" }, "type": "availablePreorder" } } } ] }' ``` ### Adding a fulfillment with a custom cost to an item 1. [Create a fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) curl. ```curl curl --location '{{modular_cart_domain}}/carts/07618f2d-8559-479a-80ed-5ed7259cbd25/fulfillments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "type": "SHIP_TO", "refId": "6622d50d2eee4e4e124c7467", "destinationAddress": "2ac62be8-2440-46e7-9a42-6b2c62fb6690", "price": { "amount": 10.0 } }' ``` Response: ```json { "id": "e4d68b36-8902-4427-a244-9eb65290855c", "type": "SHIP_TO", "refId": "6622d50d2eee4e4e124c7467", "destinationAddress": "2ac62be8-2440-46e7-9a42-6b2c62fb6690", "price": { "amount": 10.0 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } } ``` 2. Add a custom cost to the item using the [add item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) endpoint. The example shows adding an additional \$5.00 as the fulfillment cost for the item. ```curl curl --location 'https:{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/items' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --data '{ "sku": "5", "refId": "1", "quantity": 1, "priceListId": "100000", "price": { "type": "UNIT", "amount": 100 }, "fulfillment": { "id": "e4d68b36-8902-4427-a244-9eb65290855c", "inventory": { "channels": { "networkCode": "ShipToHome" }, "type": "backOrder" }, "price": { "amount": 5 } } }' ``` `price.fulfillments` accepts both the fulfillment cost and any additional fulfillment amount added to the item. Response: ```json { "lineItems": { "total": 100, "collection": [ { "id": "806d6671-801d-4554-976d-0d38e525a852", "sku": "5", "refId": "1", "quantity": 1, "priceListId": "100000", "position": 1, "price": { "unit": 100, "amount": 100 }, "fees": { "total": 0, "collection": [] }, "promotions": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "fulfillment": { "id": "cda19e15-ab04-419e-8fc1-61fa7874beb0", "price": { "amount": 5 }, "inventory": { "type": "backOrder", "channels": { "networkCode": "ShipToHome" } }, "tax": { "total": 0, "collection": [] } }, "attributes": {}, "tax": { "total": 0, "collection": [] }, "updatedAt": "2024-08-31T15:17:20.584Z", "createdAt": "2024-08-31T15:17:20.584Z" } ] }, "id": "7d403833-8e0c-43f5-aded-72d6a2eaf062", "attributes": { "key": "value" }, "configuration": { "order": { "validate": { "paymentsRemaining": "BLOCK", "taxRemaining": "BLOCK", "invalidItem": "BLOCK", "itemOutOfStock": "BLOCK" } }, "product": { "cacheExpiry": 1, "behaviors": { "add": "NONE", "update": "NONE", "get": "NONE", "cacheExpiry": "NONE" }, "maxQuantity": { "behaviors": { "add": "NONE", "update": "NONE", "get": "NONE" } } }, "inventory": { "cacheExpiry": 1, "behaviors": { "add": "NONE", "update": "NONE", "get": "NONE", "cacheExpiry": "NONE" }, "check": "SKU" }, "tax": { "cacheExpiry": 5, "behaviors": { "cacheExpiry": "NONE" } }, "promotions": { "cacheExpiry": 5, "behaviors": { "cacheExpiry": "WARN" } }, "maxQuantity": { "limit": 10, "behaviors": { "add": "NONE", "update": "NONE", "get": "NONE" } } }, "customerContext": {}, "status": "ACTIVE", "state": [ { "resource": "CART", "resourceId": "", "key": "MISSING_PAYMENT_DETAILS", "description": "No payment details have been added to this Cart" }, { "resource": "CART", "resourceId": "", "key": "MISSING_TAX", "description": "No tax has been added to this Cart" } ], "price": { "total": 115, "subtotal": 100, "tax": 0, "fulfillments": 15, "discounts": 0, "fees": 0, "adjustments": 0 }, "promotions": { "total": 0, "collection": null }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "addresses": { "702009a6-fc56-4df7-a1b4-c73cf916d9fc": { "id": "702009a6-fc56-4df7-a1b4-c73cf916d9fc", "name": { "first": "Pat", "last": "E" }, "email": "samiksha@gmail.com", "phone": { "number": "9050123102", "type": "MOBILE" }, "addressLine1": "Princeton", "addressLine2": "Street 2", "addressLine3": "Stars Hollow", "city": "Phillidelphia", "region": "Pennsylvania", "country": "US", "postalCode": "1-21-12", "updatedAt": "2024-08-31T15:17:17.312Z", "createdAt": "2024-08-31T15:17:17.312Z" } }, "summary": { "totalItems": 1, "totalUniqueItems": 1 }, "fulfillments": { "cda19e15-ab04-419e-8fc1-61fa7874beb0": { "id": "cda19e15-ab04-419e-8fc1-61fa7874beb0", "type": "SHIP_TO", "refId": "1", "attributes": { "test1": {}, "channelId": [ "12" ] }, "originAddress": "", "destinationAddress": "702009a6-fc56-4df7-a1b4-c73cf916d9fc", "price": { "amount": 10 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0, "collection": [] } } }, "coupons": [], "appliedCoupons": [], "notAppliedCoupons": [], "validations": { "promotions": null, "lineItems": [], "product": null, "tax": null }, "payments": { "authorized": 0, "collection": [] }, "channelId": "13", "currency": "USD", "updatedAt": "2024-08-31T15:17:18.982Z", "createdAt": "2024-08-31T15:17:07.865Z" } ``` ### Adding a fulfillment with the type `BOPIS` or `ROPIS` requires a `locationId` Use the [add fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) endpoint to add a location when creating a fulfillment as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/fulfillments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "type": "BOPIS", "refId": "1", "originAddress": "702009a6-fc56-4df7-a1b4-c73cf916d9fc", "locationId": "1", "attributes": { "channelId": [ "12" ], "test1": 123 }, "price": { "amount": 10 }, "pickupPerson": { "primary": { "name": { "firstName": "BOB" }, "email": "123", "phone": { "type": "MOBILE", "number": "1231231234" }, "addressId": "702009a6-fc56-4df7-a1b4-c73cf916d9fc" } } }' ``` ### Adding the same destination address to different fulfillments for multiple items Use the [add fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) endpoint to create multiple fulfillment with the same addresses as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/7d403833-8e0c-43f5-aded-72d6a2eaf062/fulfillments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --data '{ "type": "BOPIS", "refId": "1", "originAddress": "702009a6-fc56-4df7-a1b4-c73cf916d9fc", "destinationAddress": "702009a6-fc56-4df7-a1b4-c73cf916d9fc", "locationId": "1", "attributes": { "channelId": [ "12" ], "test1": 123 }, "price": { "amount": 10 }, "pickupPerson": { "primary": { "name": { "firstName": "BOB" }, "email": "123", "phone": { "type": "MOBILE", "number": "1231231234" }, "addressId": "702009a6-fc56-4df7-a1b4-c73cf916d9fc" } } }' ``` # Configuring Order Drafts Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-order-drafts This feature in Carts API enables the cart to be transformed into a schema ready for submission to the **Order Management System (OMS)**, representing the **order draft** stage before the order is officially created. At this stage, the cart contains all necessary data, including items, fulfillment details, fees, taxes, and payment information. This transformation ensures that the cart aligns with OMS requirements, allowing for final review and confirmation of the order before proceeding to fulfillment. ## Prerequisites There are two types prerequisites, depending on your cart configurations. One of the following prerequisites must be completed sequentially to configure an order draft. ```json "configuration": { "order": { "validate": { "paymentsRemaining": "BLOCK", "taxRemaining": "BLOCK", "invalidItem": "BLOCK", "itemOutOfStock": "BLOCK" } } } ``` **Prerequisites** 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Add item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to the cart. 3. [Add taxes](/v3/cart-and-checkout/api-reference/carts-v3/validations/add-tax) to the resources in the cart. 4. [Add payments to the cart](/v3/cart-and-checkout/api-reference/carts-v3/payments/create-payments), ensuring they match the cart total. 5. Ensure that the items added to the cart are valid and in stock. ```json "configuration": { "order": { "validate": { "paymentsRemaining": "BLOCK", "taxRemaining": "BLOCK", "invalidItem": "BLOCK", "itemOutOfStock": "BLOCK" } } } ``` **Prerequisites** 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Add item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to the cart. ## Order Drafts Initialization The order draft captures a snapshot of the cart, which can then be converted into an order. The ability to create an order draft is controlled by [cart configurations](/v3/cart-and-checkout/api-reference/carts-v3/configuration-behaviors). Cart offers users the flexibility to prevent order draft creation if: * Payments haven't been added to the cart. * Taxes are missing for resources in the cart. * Items are invalid. * Items are out of stock. The following code sample provides the structure of order draft settings that block creation in the response: ### Cart configuration ```json "configuration": { "order": { "validate": { "paymentsRemaining": "BLOCK", "taxRemaining": "BLOCK", "invalidItem": "BLOCK", "itemOutOfStock": "BLOCK" } } } ``` ## Examples ### Creating an order draft to send to an order management system (OMS) Use the [create an order draft](/v3/cart-and-checkout/api-reference/carts-v3/order-drafts/create-order-drafts) endpoint to create an order draft and send it to OMS as in the following example: ```curl curl --location '{{orchestrator_domain}}/carts/{{cartId}}/order-draft' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'x-fabric-request-id: {{requestId}}' \ --header 'x-fabric-channel-id: {{channelId}}' \ --header 'Authorization: {authToken}' \ --header 'Content-Type: application/json' --data '{ "orderNumber": "W0013" }' ``` **Response** ```json { "order": { "number": "W0013", "currency": "USD", "createdAt": "2024-06-24T09:22:40.979+00:00", "attributes": {} }, "cartId": "39ea2154-7160-4feb-ae42-1506223efd95", "attributes": { "name": "cart test", "description": "This cart is created by cart v2 service" }, "customerContext": { "id": "C01", "segments": [ { "name": "membership", "value": [ "premium" ] }, { "name": "customer-type", "value": [ "high" ] } ], "attributes": { "returnRate": "high", "city": "london", "type": "regular" } }, "status": "ACTIVE", "state": [ { "resource": "VALIDATION", "resourceId": "", "key": "PROMOTION_REFRESH", "description": "Promotions require a refresh in the Cart" }, { "resource": "CART", "resourceId": "HAPPY10", "key": "COUPON_NOT_APPLIED", "description": "Coupon HAPPY10 has no associated promotion" } ], "price": { "total": 1180.19, "subtotal": 1043, "tax": 97.19, "fulfillments": 40, "discounts": 0, "fees": 25, "adjustments": 12 }, "promotions": { "total": 0, "collection": [ { "id": "6626c179627d450008a5b202", "title": "SXP Cart Promotion Fixed Price", "type": "QUANTITY", "value": 10, "attributes": {} }, { "id": "64959a4b2341cd00080ca746", "title": "happy10 coupon", "code": "HAPPY10", "type": "PRODUCT", "value": 103, "attributes": {} }, { "id": "662a7a5c65c3c7000cff7c4a", "title": "SXP Cart Promotion Item Free", "type": "BUYGET", "value": 3.9, "attributes": {} }, { "id": "6626e327fc29c3000858c6e6", "title": "SXP Cart Promotion Percentage Off", "type": "QUANTITY", "value": 515, "attributes": {} } ] }, "fees": { "total": 15, "collection": [ { "id": "9db3ed22-9a71-47c7-844e-bd42e28319c2", "name": "cart v3 fees", "price": { "amount": 15 }, "taxable": true, "attributes": { "message": "gifting-fee" }, "tax": { "total": 1.33, "collection": [ { "amount": 0.6, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 0.67, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 0.06, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] }, "updatedAt": "2024-06-24T09:07:50.155Z", "createdAt": "2024-06-24T09:07:50.155Z" } ] }, "adjustments": { "total": 7, "collection": [ { "id": "c18aa476-97a7-4f31-a2ae-528adb3d6e84", "price": { "amount": 7 }, "reason": "DelayedOrder", "attributes": { "reasonDescription": "Price Adjustment due to delayed shipping" }, "updatedAt": "2024-06-24T09:07:51.960Z", "createdAt": "2024-06-24T09:07:51.960Z" } ] }, "addresses": { "476e673c-10c1-4bd6-b83d-26d403b5a735": { "id": "476e673c-10c1-4bd6-b83d-26d403b5a735", "name": { "first": "Jane", "last": "Doe" }, "email": "jane.doe@gmail.com", "phone": { "number": "9050123102", "type": "MOBILE" }, "addressLine1": "888 Broadway", "addressLine2": "Street 2", "addressLine3": "Stars Hollow", "city": "New York", "region": "NY", "country": "US", "postalCode": "10003", "updatedAt": "2024-06-24T09:07:41.463Z", "createdAt": "2024-06-24T09:07:41.463Z" }, "9f615749-35ef-43e7-adfc-3369eb3b05e8": { "id": "9f615749-35ef-43e7-adfc-3369eb3b05e8", "name": { "first": "Joe", "last": "Cooper" }, "email": "joe.cooper@mail.com", "phone": { "number": "+1-5807769338", "type": "MOBILE" }, "addressLine1": "92 Landon", "addressLine2": "Street 1", "addressLine3": "5th Avenue", "city": "New York", "region": "NY", "country": "US", "postalCode": "10006", "updatedAt": "2024-06-24T09:07:43.138Z", "createdAt": "2024-06-24T09:07:43.138Z" } }, "lineItems": { "total": 1035, "collection": [ { "id": "75c41689-7bc5-4775-8d72-c7821d38ed9c", "sku": "SKU2", "refId": "41", "quantity": 2, "priceListId": "100000", "position": 1, "price": { "unit": 500, "amount": 1000 }, "fees": { "total": 10, "collection": [ { "id": "e3a734c6-d496-43e2-8912-881b44d5f083", "name": "giftingFee", "price": { "amount": 10 }, "taxable": true, "attributes": { "message": "regular" }, "tax": { "total": 0.89, "collection": [ { "amount": 0.4, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 0.45, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 0.04, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] }, "updatedAt": "2024-06-24T09:07:53.712Z", "createdAt": "2024-06-24T09:07:53.712Z" } ] }, "adjustments": { "total": 5, "collection": [ { "id": "b36d4bf0-3e10-40fb-b629-7f7760bbadcc", "price": { "amount": 5 }, "reason": "Item was a sale item 2 days ago", "attributes": { "type": "retail" }, "updatedAt": "2024-06-24T09:07:55.423Z", "createdAt": "2024-06-24T09:07:55.423Z" } ] }, "fulfillment": { "id": "e8d9d243-80cf-48a3-bf3d-765b55c2bca9", "inventory": { "type": "availableToPurchase", "channels": { "type": "WEB_PICKUP", "locationNumber": "15", "channelId": "12" } } }, "attributes": {}, "tax": { "total": 88.75, "collection": [ { "amount": 40, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 45, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 3.75, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] }, "updatedAt": "2024-06-24T09:07:53.712Z", "createdAt": "2024-06-24T09:07:48.783Z" }, { "id": "9a45a494-0cc5-49aa-b339-88e4659ede8b", "sku": "SKU3", "refId": "44", "quantity": 3, "priceListId": "100000", "position": 2, "price": { "unit": 10, "amount": 30 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "fulfillment": { "id": "94b538bb-713f-464d-aa2e-d23ae6fd3115", "inventory": { "type": "availablePreorder", "channels": { "networkCode": "ShipToHome", "type": "WEB_SHIP", "channelId": "12" } } }, "attributes": {}, "tax": { "total": 2.66, "collection": [ { "amount": 1.2, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 1.35, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 0.11, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] }, "updatedAt": "2024-06-24T09:07:48.783Z", "createdAt": "2024-06-24T09:07:48.783Z" } ] }, "summary": { "totalItems": 5, "totalUniqueItems": 2 }, "fulfillments": { "e8d9d243-80cf-48a3-bf3d-765b55c2bca9": { "type": "SHIP_TO", "refId": "6622d50d2eee4e4e124c7467", "attributes": { "dropOffMethod": false, "WEB_CARRIER_MODE": "2DAY", "proOrderShipDays": 2, "shipmentInstructions": "Ring doorbell for 2nd Floor", "radialShippingID": "ANY_2 DAY", "promisedShipDate": "2023-02-10T18:31:31.784Z", "taxCode": "FR1000", "WEB_CARRIER_CODE": "ANY", "storePickupEnabled": false }, "originAddress": "", "destinationAddress": "476e673c-10c1-4bd6-b83d-26d403b5a735", "price": { "amount": 10 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 0.89, "collection": [ { "amount": 0.4, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 0.45, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 0.04, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] } }, "94b538bb-713f-464d-aa2e-d23ae6fd3115": { "type": "BOPIS", "refId": "64b985ef9e16365c4d2b0083", "attributes": { "warehouseId": "6126819ec326fe0009f473ba", "isPickup": true, "taxCode": "FR1000" }, "originAddress": "9f615749-35ef-43e7-adfc-3369eb3b05e8", "destinationAddress": "476e673c-10c1-4bd6-b83d-26d403b5a735", "locationId": "15", "pickupPerson": { "primary": { "name": { "first": "Jay", "last": "Cooper" }, "email": "jay.cooper@gmail.com", "phone": { "number": "+1-1153202801", "type": "MOBILE" } } }, "price": { "amount": 30 }, "fees": { "total": 0, "collection": [] }, "adjustments": { "total": 0, "collection": [] }, "tax": { "total": 2.67, "collection": [ { "amount": 1.2, "attributes": { "taxRate": 0.04, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "STATE", "jurisdictionId": "24354" } } }, { "amount": 1.35, "attributes": { "taxRate": 0.045, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "NEW YORK", "jurisdictionType": "CITY", "jurisdictionId": "25353" } } }, { "amount": 0.12, "attributes": { "taxRate": 0.00375, "taxType": "SALES", "taxJurisdiction": { "jurisdictionValue": "METROPOLITAN COMMUTER TRANSPORTATION DISTRICT", "jurisdictionType": "DISTRICT", "jurisdictionId": "79774" } } } ] } } }, "coupons": [ { "code": "HAPPY10", "updatedAt": "2024-06-24T09:07:57.295Z" } ], "appliedCoupons": [ { "code": "HAPPY10", "updatedAt": "2024-06-24T09:07:57.295Z" } ], "notAppliedCoupons": [], "payments": { "authorized": 1180.19, "collection": [ { "id": "43eaf31a-2ef6-403a-ace7-0cca0dee9d97", "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "AUTHORIZED", "authorization": { "amount": 1180.19, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "123" } }, "billToAddress": "476e673c-10c1-4bd6-b83d-26d403b5a735", "cardDetails": {}, "attributes": {} } ] }, "channelId": "12", "updatedAt": "2024-06-24T09:22:40.907Z", "createdAt": "2024-06-24T09:07:37.140Z", "errors": [] } ``` # Configuring Payment Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-payment This feature in Carts API allows users to add, update, and delete payment details. The cart maintains the state of each payment—pending, authorized, captured, and failed—as provided by the user, but it doesn't store tokens, which are expected from the System Integrator (SI). ## Prerequisites The following prerequisites must be completed sequentially to configure a payment. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Add an item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to the cart. ## Payments Initialization The cart displays authorized amounts and allows updates or removals of payments. Payments can be purged or held when the cart changes such as, price changes. The cart also verifies the authorized payment amount against the cart total. The following code sample provides an example of the structure of payment information and status in the response: ```json { "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "PENDING", "authorization": { "amount": 520.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } }, "billToAddress": "{{addressId}}", "cardDetails": null, "attributes":{ "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } } ``` As the cart can contain multiple payments, they are shown as a collection. The authorized amount is the sum of all payments with the **AUTHORIZED** state added to the cart as in the following example: ```json "payments": { "authorized": 0, "collection": [ { "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "PENDING", "authorization": { "amount": 520.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } }, "billToAddress": "{{addressId}}", "cardDetails": null, "attributes":{ "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } } ] } ``` ## Examples ### Adding payments with the `CAPTURED` status to the cart Use the [create a payment](/v3/cart-and-checkout/api-reference/carts-v3/payments/create-payments) endpoint to add a `CAPTURED` payment method to the cart as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/ba0e93f5-e47f-4b0d-bac8-6233b67ef65f/payments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Authorization: {authToken}' \ --data '{ "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "CAPTURED", "authorization": { "amount": 500.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } }, "billToAddress": "46622c9c-604c-4f8c-8bcf-2a393a572839", "cardDetails": null, "attributes": { "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } } ' ``` A successful response to `carts/{cartId}/payments` provides a payments object as the following example: ```json "payments": { "authorized": 0, "collection": [ { "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "CAPTURED", "authorization": { "amount": 500.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } } }, "billToAddress": "46622c9c-604c-4f8c-8bcf-2a393a572839", "cardDetails": null, "attributes":{ "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } ] } ``` ### Adding payments with the `AUTHORIZED` status to the cart Use the [create a payment](/v3/cart-and-checkout/api-reference/carts-v3/payments/create-payments) endpoint to add `AUHTORIZED` payments to the cart as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/ba0e93f5-e47f-4b0d-bac8-6233b67ef65f/payments' \ --header 'Content-Type: application/json' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Authorization: {authToken}' \ --data '{ "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "AUTHORIZED", "authorization": { "amount": 500.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } }, "billToAddress": "46622c9c-604c-4f8c-8bcf-2a393a572839", "cardDetails": null, "attributes": { "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } } ' ``` A successful response to `carts/{cartId}/payments` provides a payments object as in the following example: ```json "payments": { "authorized": 500.0, "collection": [ { "provider": "fabricmock", "processor": "fabricmock", "method": "CREDIT_CARD", "methodType": "VISA", "state": "AUTHORIZED", "authorization": { "amount": 500.0, "expiry": "", "verifier": { "type": "PAYMENT_TOKEN", "key": "{{payment_token}}" } } }, "billToAddress": "46622c9c-604c-4f8c-8bcf-2a393a572839", "cardDetails": null, "attributes":{ "orderSource": "ecommerce", "expirationDate": "0224", "requestedDate": "2022-01-27T16:15:58-05:00", "paymentDate": "2022-01-27T16:15:58-05:00", "billToId": "213321" } ] } ``` # Configuring Search Cart Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-search-cart This feature in Carts API allows the user to search the cart by the following parameters: * Cart Status * Order Number * Customer Information * Promotion Codes * Created/Updated Date Range * Channel ID ## Prerequisites * A cart that needs to be searched is created with the required parameters using the [create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts) endpoint. ## Search Cart Initialization The search endpoint returns a paginated response, displaying the first 10 search results by default. The `total` field in the response indicates the number of results found for the search query, capped at 10,000 results. For queries that exceed this `limit`, use an `offset`. Querying many carts through this endpoint isn't recommended, as it's intended for basic use cases to retrieve a limited number of carts rather than for analytics purposes. The following code sample provides the structure of `limit`, `offset`, and `total` in the response when searching for a cart: ```json { "query": { "limit": 20, "offset": 0, "total": 3 }, "data": [ { ... } ] } ``` ## Examples ### Retrieving a cart with an order number Use the [search for multiple carts](/v3/cart-and-checkout/api-reference/carts-v3/carts/search) endpoint and include the order number in the request body as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/search' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "offset": 0, "limit": 20, "filter": { "orderNumber": "O1232", "updatedAt": { "start": "2024-03-27T06:06:53.709Z", "end": "2024-06-29T06:06:53.709Z" } } }' ``` ### Retrieving a cart with the date range and the `customerId` Use the [search for multiple carts](/v3/cart-and-checkout/api-reference/carts-v3/carts/search) endpoint and include the date range and the `customerId` in the request body as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/search' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "offset": 0, "limit": 20, "filter": { "customer": { "id": "testCustomerId", "sessionId": "testSessionId" }, "createdAt": { "start": "2024-03-27T06:06:53.709Z", "end": "2024-06-29T06:06:53.709Z" } } }' ``` ### Retrieving a cart with the `customerId` and `promotionTitles` Use the [search for multiple carts](/v3/cart-and-checkout/api-reference/carts-v3/carts/search) endpoint and include `customerId` and promotionTitles\` in the request body as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/search' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "offset": 0, "limit": 20, "filter": { "promotionTitles": [ "FREE_SHIPPING" ], "customer": { "id": "testCustomerId", "sessionId": "testSessionId" } } }' ``` # Configuring Split Line Items Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-split-line-items Splitting line items allows the user to split a single line item into multiple line items based on quantity. ## Prerequisites The following prerequisites must be completed sequentially to configure splitting line items. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Add an item to the cart](/v3/cart-and-checkout/api-reference/carts-v3/items/items) that needs to be split. The sum of the quantities of the split items must not exceed the total quantity of the line item. ## Split Line Items Initialization All information from the original item is copied to the split items except for the item ID, quantity, `createdAt`, and `updatedAt` timestamps. Adjustments, fees, and fulfillment can be copied to split items based on configuration. The default setting is `NONE`, meaning these elements aren't copied to split items unless specified. The following code sample provides an example for split line items request payload: ```json { "quantities": [2,1], "adjustmentsBehaviour": "COPY", "feesBehaviour": "COPY", "fulfillmentBehaviour": "COPY" } ``` The `quantities` array allows users to specify the number and quantity of split items. The total number of split items is `quantities.size + 1`.\ In this example, a line item with `6` units and `quantities` set to `[2, 1]` splits into `3` items with `quantities [2, 1, 3]`, where the last quantity represents the remainder. With `adjustmentsBehaviour`, `feesBehaviour`, and `fulfillmentBehaviour` set to `COPY`, adjustments, fees, and fulfillment details from the original item are copied to each split item. The quantities array lets users specify the number and quantity of split items. The total number of split items will be `quantities.size` plus 1. For example, if a line item has 6 units and quantities is `[2, 1]`, it will be split into 3 items with quantities `[2, 1, 3]`, where the last quantity is the remainder. The following code sample provides an example for split line items request payload with the `quantities`: ### Split line items request payload ```json { "quantities": [2,1], "adjustmentsBehaviour": "COPY", "feesBehaviour": "COPY", "fulfillmentBehaviour": "COPY" } ``` ## Examples ### The item is available in limited quantities at multiple warehouses Use the [split line items](/v3/cart-and-checkout/api-reference/carts-v3/item-actions/split) endpoint to split and ship items from different locations as in the following example: In this example, 4 units are available in Warehouse A, and the remaining units are in Warehouse B. ```curl curl --location '{{modular_cart_domain}}/carts/9877b7ab-092d-4d67-ad42-b070ac778df8/items/806d6671-801d-4554-976d-0d38e525a852/actions/split' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --data '{ "quantities": [4,5], "adjustmentsBehaviour": "COPY", "feesBehaviour": "COPY", "fulfillmentBehaviour": "COPY" }' ``` ### Sending individual items in the order to different addresses as gifts Use the [split line items](/v3/cart-and-checkout/api-reference/carts-v3/item-actions/split) endpoint to split items in the cart and send them to different addresses as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/9877b7ab-092d-4d67-ad42-b070ac778df8/items/806d6671-801d-4554-976d-0d38e525a852/actions/split' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --data '{ "quantities": [4,5], "adjustmentsBehaviour": "COPY", "feesBehaviour": "COPY", "fulfillmentBehaviour": "COPY" }' ``` ### Splitting items for promotional bundles or discounts Use the [split line items](/v3/cart-and-checkout/api-reference/carts-v3/item-actions/split) endpoint to split the items in the cart and item prices will adjust appropriately as in the following example: ```curl curl --location '{{modular_cart_domain}}/carts/9877b7ab-092d-4d67-ad42-b070ac778df8/items/806d6671-801d-4554-976d-0d38e525a852/actions/split' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --data '{ "quantities": [4,5], "adjustmentsBehaviour": "COPY", "feesBehaviour": "COPY", "fulfillmentBehaviour": "COPY" }' ``` # Configuring Taxes Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/configuring-taxes This feature in Carts API allows users to levy taxes on resources such as items, fulfillment, and fees. Fees are optionally taxable. ### Prerequisites The following prerequisites must be completed sequentially to configure a fulfillment. 1. [Create a cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts). 2. [Create a fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) to add fulfillment taxes. 3. [Create an item](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to add item taxes. 4. Create either [item](/v3/cart-and-checkout/api-reference/carts-v3/item-fees/create-item-fees), [fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment-fees/add-fulfillment), or [cart fees](/v3/cart-and-checkout/api-reference/carts-v3/fees/create-fees) to add fee taxes. ### Tax Initialization You can add taxes on the cart, cart fees, cart fulfillment, items, item fees, item fulfillment, and fulfillment fees through a single request. To ensure that fees are subject to tax, the fees should be marked as taxable. You can apply taxes at multiple levels, including individual items, fulfillment, or fees. The tax resource maintains a consistent structure across all levels. The following code sample provides an example of tax object structure in request payload: ### Tax resource ```json { "amount": 4.0, "attributes": { "rate": 5, "message": "5% tax" } } ``` For accurate tax calculation, address information is required. While items, fulfillment, and their fees already have associated addresses from the fulfillment information, the cart fee requires a separate field for the address to be provided. The following code sample provides an example tax object structure in a request payload with the `destinationAddress` and `originAddress`: ### Tax fee resource with addresses ```json { "amount": 4.0, "attributes": { "rate": 5, "message": "5% tax" }, "taxDetails":{ "destinationAddress": "{{destinationAddressId}}", "originAddress": "{{originAddressId}}" } } ``` ## Examples ### Applying sales taxes on items and fulfillments Use the [replace tax data](/v3/cart-and-checkout/api-reference/carts-v3/validations/add-tax) endpoint to create sales taxes on items and fulfillments as in the following example: ```curl curl --location --request PUT '{{modular_cart_domain}}/carts/ba0e93f5-e47f-4b0d-bac8-6233b67ef65f/tax' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "items": [ { "id": "c0f1c36d-35e6-4098-94a7-3b92fba089d7", "tax": [ { "amount": 10, "attributes": { "rate": 8 } }, { "amount": 2, "attributes": { "rate": 3 } } ] } ], "fulfillments": [ { "id": "a7f51053-6fbd-42a6-8fbc-303bfc16c13f", "tax": [ { "amount": 10, "attributes": { "rate": 1 } }, { "amount": 4, "attributes": { "VAT": "enabled" } } ] } ] }' ``` ### Applying sales taxes on items, fulfillments and the service charge Use the [replace tax data](/v3/cart-and-checkout/api-reference/carts-v3/validations/add-tax) endpoint to create sales taxes on items and fulfillments, and service charge which are also taxable as in the following example: Ensure that fulfillment fees are set to taxable. ```json { "id": "d4e9f8dc-c0ae-4ef3-be8b-bd23579a4dd3", // feeId "name": "fulfillment-fee", "price": { "amount": 5.0 }, "taxable": true, "attributes": { "message": "Shipping fee" }, "tax": { "total": 0, "collection": [] }, "updatedAt": "2024-09-02T15:21:19.874Z", "createdAt": "2024-09-02T15:21:19.874Z" } ``` Add tax to the cart `curl`. ```curl curl --location --request PUT 'https://dev.cart.fabric.inc/beta/v3/modular/carts/ba0e93f5-e47f-4b0d-bac8-6233b67ef65f/tax' \ --header 'x-fabric-tenant-id: {tenantId}' \ --header 'Content-Type: application/json' \ --header 'Authorization: {authToken}' \ --data '{ "items": [ { "id": "2c51a3da-e3ff-40ef-bb5b-3e191892293c", "tax": [ { "amount": 10, "attributes": { "rate": 8 } }, { "amount": 2, "attributes": { "rate": 3 } } ] } ], "fulfillments": [ { "id": "131b9a58-8ee5-41dc-a79e-736ca934b435", "tax": [ { "amount": 10, "attributes": { "rate": 1 } }, { "amount": 4, "attributes": { "VAT": "enabled" } } ], "fees": [ { "id": "d4e9f8dc-c0ae-4ef3-be8b-bd23579a4dd3", "tax": [ { "amount": 1, "attributes": { "rate": 1 } } ] } ] } ] }' ``` # Getting Started with fabric Carts API Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/developer-guide/getting-started This guide provides instructions to help you get started with fabric Carts API, from initial setup to basic usage. ## Target Audience * Third-party developers who set up Carts on behalf of merchants. * The fabric developers who work with Carts. ### Knowledge and skill requirements The target audience should: * Understand [REST APIs](https://fabric.inc/blog/developer/api-endpoint), in the context of e-commerce. * Get familiar with [fabric APIs](/v3/getting-started/api-guides/getting-started-with-fabric-apis). * Know the cart [configuration](/v3/cart-and-checkout/api-reference/carts-v3/configuration-behaviors) and [merge](/v3/cart-and-checkout/api-reference/carts-v3/merge-carts-behaviors) behaviors. * Have access to development tools capable of interacting with HTTP-based APIs, such as Postman or cURL for testing. ## Workflow The following steps outline the Carts process, from creating a cart to generating an order draft: 1. [Create an empty cart](/v3/cart-and-checkout/api-reference/carts-v3/carts/carts) for shoppers to add products for purchase. You can customize the cart settings by sending configuration details in the request body. Otherwise, the default settings apply. For more information about cart configuration behaviors, see [Configuration Behaviors](/v3/cart-and-checkout/api-reference/carts-v3/configuration-behaviors) section. If the initial request is successful, a response body containing cart information, such as `cartId` and configurations is returned. 2. [Create a destination address](/v3/cart-and-checkout/api-reference/carts-v3/addresses/create-addresses) to fulfill the order in the cart. You can [delete](/v3/cart-and-checkout/api-reference/carts-v3/addresses/delete-addresses) or [update](/v3/cart-and-checkout/api-reference/carts-v3/addresses/update-addresses) the address. If the initial request is successful, a response body that contains the address information is returned. 3. [Create all the necessary fulfillment](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/create-fulfillments) information for the cart.
You can [partially update](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/add-fulfillments-attribute) or [delete](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/delete-fulfillments-attribute) fulfillment attributes, [fully update](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/update-fulfillments) fulfillments, or [delete them entirely](/v3/cart-and-checkout/api-reference/carts-v3/fulfillment/delete-fulfillments) if needed. If the initial request is successful, a response body containing fulfillment information is returned. 4. [Add items](/v3/cart-and-checkout/api-reference/carts-v3/items/items) to the cart.
You can [update](/v3/cart-and-checkout/api-reference/carts-v3/items/update-items) or [delete](/v3/cart-and-checkout/api-reference/carts-v3/items/delete-items) items in the cart. If the initial request is successful, a response body that contains the cart information, including the items that are added, is returned. 5. (Optional) [Apply any eligible coupons](/v3/cart-and-checkout/api-reference/carts-v3/coupons/add-coupons) for the cart.
Use [remove the coupon](/v3/cart-and-checkout/api-reference/carts-v3/coupons/remove-coupons) endpoint to remove coupons if necessary. If the initial request is successful, a response body that contains the cart information, including the coupon information, is returned. 6. [Add tax rules](/v3/cart-and-checkout/api-reference/carts-v3/validations/add-tax) for the cart. Look up the usage as tax rates vary by location. You must apply the appropriate taxes for each area.
If the initial request is successful, a response body that contains cart information with the updated tax rates is returned. 7. [Add a payment method](/v3/cart-and-checkout/api-reference/carts-v3/payments/add-payment-attributes) for the cart.
You can [partially update](/v3/cart-and-checkout/api-reference/carts-v3/payments/add-payment-attributes) or [delete payment attributes](/v3/cart-and-checkout/api-reference/carts-v3/payments/delete-payment-attributes) and [fully update](/v3/cart-and-checkout/api-reference/carts-v3/payments/update-payments) or [delete payment methods entirely](/v3/cart-and-checkout/api-reference/carts-v3/payments/delete-payments). If the initial request is successful, a response body containing payment information is returned. 8. [Create an order draft](/v3/cart-and-checkout/api-reference/carts-v3/order-drafts/create-order-drafts). If the payment is authorized, then the order is shipped.
If the initial request is successful, the response containing all the necessary information for an order to ship is returned. Before submitting the order details, ensure that all the information for the order is correct. # Overview Source: https://developer.fabric.inc/v3/cart-and-checkout/api-reference/carts-v3/overview ### Carts 3.0 fabric's Cart API is used to add, update, and remove items from your Storefront cart, either as a guest or logged-in user. It also supports merging carts when transitioning from a guest to a logged-in user, and applying coupons and other attributes, such as gift wrapping, to line items. The API supports advanced features like using multiple carts within a B2B organization, sharing carts, and providing a unified cart experience for multi-region and multi-brand businesses. The Cart API supports configurability for end-to-end order processing actions by adding items to the cart, handling pre-checkout tasks like billing, shipping, and payment details, and proceeding to checkout, where orders are processed and confirmed by fabric's Order Management System (OMS). Cart 3.0 is modular, enabling users to select only the necessary endpoints. It integrates seamlessly with both fabric and non-fabric services. ### Cart orchestrator If you're using other fabric services, you can leverage the Cart Orchestrator endpoints for seamless integration with those services. ### Contact and support If you have any additional questions, please reach out to the Cart support team at [support.cnc@fabric.inc](mailto:support.cnc@fabric.inc). # BigCommerce Integration Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/bigcommerce-integration-1 ## Adding the BigCommerce Integration 1. To access Integrations, click your account name in the menu at the top of the page. A dropdown menu appears. 2. Select **Retailer Settings**. The **Retailer Settings** page is displayed. 3. Click **Integrations**. The **Integrations** page is displayed. 4. Click **Add Integration**. The **Add Integration** window is displayed with a list of available integrations. 5. Click **Add** next to the BigCommerce tile. The **Add BigCommerce Integration** window is displayed. 6. In the **Store Identifier** field, enter your BigCommerce store identifier. 7. In the **Store Token** field, enter your BigCommerce store token. 8. Click **Add Integration** After successful authorization, BigCommerce will show up on the list of the integrations on the **Integrations** page for Dropship. ## Accessing Integration Options 1. To access your Dropship Integrations, click your account name. 2. In the dropdown that appears, select **Merchant Settings**. The **Merchants Settings** page is displayed. 3. Click **Integrations**. The **Integrations** page is displayed. 4. Next to the BigCommerce logo, click **Options**. The **Options** window is displayed. 5. Select one of the following: * [Configuration](#configuration): The **Configuration** page allows you to make changes to the basic BigCommerce setup and add or disable webhooks. * [Webhook History](#webhook-history): The **Webhook History** page shows a list of previous webhook callbacks. ## Configuration The Configuration page allows you to make changes related to how order and transaction information is shared between Dropship and BigCommerce. ### Enable or disable webhooks The following webhooks are available for BigCommerce and can be enabled or disabled at any time: | Webhook | Description | | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Orders** | fabric automatically sends purchase orders from your supplier partners directly to your BigCommerce account. Enabling this webhook means that orders from ALL of your supplier connections in fabric will flow through this webhook. | | **Inventory** | Dropship requires frequent inventory updates to reduce cancellations due to low or no stock. The inventory webhook syncs inventory with Dropship automatically. Turn this webhook off if you prefer to update inventory manually. | | **Fulfillment** | Dropship requires frequent order fulfillment updates to track orders. The fulfillment webhook syncs order fulfillment data with Dropship automatically. Turn this webhook off if you prefer to update order fulfillment data manually. | ## Webhook History To access the **Webhook History** page, follow the steps outlined in [Accessing Integration Options](#accessing-integration-options). The Webhook History page shows details of all the events that have been captured by Dropship from your BigCommerce store: * **ID:** The ID of the webhook as captured by Dropship. * **Topic:** The topic that was captured as part of the webhook. * **Status:** The status of the webhook (success or failure). * **Payload:** The data that was sent in the webhook payload. * **Received:** The timestamp of when the webhook was captured. This is in the user’s local time zone. You can use the filters at the top of the table to adjust the webhook information you see. # Publishing Products to BigCommerce Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/bigcommerce-publish-products ## Publishing Products Outside of a Proposal If a supplier isn't submitting a proposal to you and is importing products through a BigCommerce import, products can be published directly from the **Products Dashboard**. 1. In the main menu, click **Products**. The products page is displayed. 2. Click **Products** located in the **Browse & Review** section. 3. Select the products that you wish to publish. Alternatively, you can check the top box to select all products on the first page. 4. Click **Actions**. The **Publish Products** window is displayed. 5. In the **Platform** field, select BigCommerce. 6. In the **Template** field, select **BigCommerce Export Template**. 7. Click **Publish Products**. ## Publishing Products on a Proposal Suppliers that have submitted product proposals can be approved and published in the **Proposal** menu. 1. In the **Proposal Summary** page, click **Approve**. The proposal state is changed to **Ready to Publish**. 2. In the **Assortment Proposal** page, click **Ready to Publish**. A list of approved proposals containing the items ready to be published is displayed. 3. To review a proposal, click the proposal **ID**. The **Proposal Detail** page is displayed. 4. Click **Approve Products**. The **Approve Proposal** window is displayed. 5. In the **Do you also want to publish products on this proposal to an external platform?** field, select **Yes**. 6. In the **Platform** field, select **BigCommerce**. 7. In the **Template** field, select **BigCommerce Export Template**. 8. Click **Approve**. ## Checking a Job Status To confirm that products were successfully created in BigCommerce, you can check the **Jobs Report** in Dropship to review the status of the job itself. 1. Click on your account name in the top right hand corner of the navigation bar. 2. Click **Job Reports**. The **Job Status** window is displayed with the most recent jobs at the top. 3. Click the job **ID** for the **push\_products** job. The job report is displayed. If any errors occurred when attempting to push products to BigCommerce, we recommend filing a ticket with support. Please provide [fabric support](https://support.fabric.inc/hc/en-us/requests/new) with the following: * The error Job ID * Vendor Name * Product details (new products added X date, or entire catalog) # fabric Integration Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/fabric-integration The fabric Dropship integration seamlessly integrates with fabric Catalog and fabric Orders. ## Prerequisites * Ensure that you have **Administrator** privilege to fabric. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) topic. ## Configuring the Integration 1. In the Dropship UI company name top-nav, click **Merchant Settings**. The Merchant Settings page is displayed. 2. Click **Integrations**. The Integrations page is displayed. 3. Click **Add integration**. The Add Integration window is displayed. 4. In the **Add Integration** window, click **Add** for the fabric option. The Add fabric Integration window is displayed. 5. In the fabric Account field, enter your fabric account ID. To find your fabric account ID, see the guide for [getting your account ID](/v3/platform/settings/account-details/account-details). 6. (Optional) In the **Location Number** field, enter a location number. This option allows you to connect to a specific location instead of the entire platform. 7. Click **Add Integration**. You are redirected to the **Integrations** page with the fabric integration now visible. ## Updating Settings 1. In the Dropship UI company name top-nav, click **Merchant Settings**. The Merchant Settings page is displayed. 2. Click **Integrations**. The Integrations page is displayed. 3. Click **Add integration**. The Add Integration window is displayed. 4. In the fabric integration section, click **Options > Configuration**. The **fabric Settings** page is displayed. 5. (Optional) to update the **Location Number** field, enter a new location number and click update. ### Selecting a webhook 1. To select a webhook, in the **fabric Settings Orders** section, use the **Select Webhook** field. 2. Click the Select Webhook field and select an available webhook. 3. Click **Enable Integration**. The integration is Synced and enabled. ### Disabling the integration 1. Follow the steps outlined in [Updating Settings](#Updating-Settings). 2. In the Orders section, click **Disable Integration**. # Import Products & Attributes Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/import-products---attributes Suppliers send product details to their retail partners either through proposals within the fabric Dropship system or through spreadsheets that retailers use to create Import Requests, based on their connection settings with the supplier. As a retailer, upon receiving products in your catalog from the supplier, you may need to update some of the products' information before publishing them to your store. This is done by updating the items using the **Import Products & Attributes** feature. ## Procedure Click **Products** in the menu across the top of Dropship. On the Products page, select **Import Products & Attributes**. On the **Import Products** page, use the **Select Template** dropdown to select a template for the products you’re importing. This will ensure that the data in the file you import is mapped to the product in your store correctly. Use the Download Empty Template and/or Show Headers buttons to verify you’re uploading to the intended template and format. To learn about templates and how to create them, refer to the [Templates](/v3/dropship/dropship-retailers/settings/templates) page. Upload the product spreadsheet using the **Select File** field and click **begin import**. If there are errors present in the template file the following files are made available: * **A list of SKUs:** For every import with one or more errors, an Error Report file is generated. This report includes all SKUs and provides an itemized list of errors corresponding to each SKU. * **A template with only errored items:** A separate file is generated that includes only the items with one or more errors. This allows you to fix these specific items and re-import them without needing to handle the entire original file again. Once the import is complete, you will see a summary of the import process, including its status. ## Import History To see a list of all product spreadsheets uploaded previously, visit the Products page and click on the **History** link next to **Import Products & Attributes**. The Import History page shows a sortable list of all previous imports. | Field | Description | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ID** | The import’s unique, fabric-generated identification number. Click the ID to see more detailed information about the import. | | **Data** | The type of data import. | | **File** | The name of the file that was imported. Click the file name to download the original file. | | **Queued** | The date and time the import was initiated. | | **Processed** | The date and time the import was processed. | | **Completed** | The date and time the import was completed. | | **Status** | The result of the import.
- **Success** is displayed when the file is processed successfully.
- **Created with error** is displayed when the file is processed partially but some items had one or more errors.
- **Failed** is displayed when the file fails to upload or when no item is created or updated. | If you encounter any import error, check the **Jobs Report** by clicking on your account name at the top right corner of the navigation bar. Select **Jobs Report**. The most recent job should appear as **Import Products**. Click on the job ID in blue text review the error. In case of errors during import, we recommend filing a support ticket. Include the **Job ID** and any other relevant information, such as Vendor Name and file, if available. # Submit and Manage Import Requests Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/import-requests Import requests allow retail partners to preview a supplier's products before the data is added to the Product Catalog. When an import request is submitted to a supplier, the supplier receives a notification from fabric notifying them that you are waiting for them to review and approve the products. ## Submitting an Import Request 1. In the main menu, click **Products**. The products page is displayed. 2. Click **Import Requests**. The **Import Requests** page is displayed. 3. Click **Upload**. 4. In the **Connection** field, select a supplier. 5. In the **File Template** field, select an import template. If you are unsure of what template to select, check your current template setup in your merchant settings. 6. In the **Purpose** field, select a purpose. 7. (Optional) In the **Reference Number** field, provide details and additional context or identifiers. 8. In the \*\*Upload File \*\*section, drag and drop the product file you with to upload. 9. Click **Request Approval from Supplier**. The supplier receives a notification notifying them that you are waiting for them to review and approve the products. ## Managing Import Requests 1. In the main menu, click **Products**. The products page is displayed. 2. Click **Import Requests**. The **Import Requests** page is displayed. On the **Import Requests** page you can view all the import requests submitted to your suppliers. ### Import statuses **Pending** - The supplier has yet to approve or reject the import request. If the import request has been pending for an allotted amount of time, we recommend reaching out to the supplier directly to have them review the submitted file and approve. **Approved** - The supplier has approved the requested products and these products should now be available to your team within your fabric Dropship account. # Inventory Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/inventory View and export inventory reports on both the item and supplier levels. ## Item level inventory To access inventory positions on each item you are selling, navigate to the **Products** page and select **Inventory** within the **Browse & Review** section of the products page. The Item Inventory page will provide you with a list of all items and their associated inventory positions. You can search for an individual item or use the filters to create a specific inventory report. All inventory reports can exported by using the **Export** button on the top right of the inventory page. NOTE: if the supplier provides an estimated availability date for out of stock items, that date will appear underneath the inventory amount. ## Inventory by supplier To access inventory status by Supplier, navigate to the **Products** page and click the blue **By Supplier** link within the **Inventory** section. The **Inventory by Supplier** page is a high level status of each of your connected suppliers. It provides the number of items associated with each of your suppliers, the number of items that are in stock, the number of items that are out of stock, and the last time each supplier submitted inventory. # Inviting Suppliers Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/inviting-suppliers To invite a new supplier to your dropship program, click **Suppliers** in the top navigation menu. Click **Invite Supplier** at the top-right of the page. In the new window, enter the following details in the **Supplier Info** section: * The name of the supplier. * The primary contacts first name, last name, and email. If the connection settings of the new supplier are different than your account's default settings, you can change those settings during the invite process by using the **Advanced Settings** on the invite form. **Note:** Your account's default settings are set during the initial onboarding of the retailer with the help of the Customer Success Manager. To invite a new supplier who will have different account settings: * Check the **I want to override the settings below** box on the invite form. * Select the settings you wish to create for this supplier using the following fields: * **Default Fulfillment SLA** * **Payment Terms** * **Cost Model** * **Returns & Customer Service Allowance** * When the form is complete, click **Send Invitation**. Your new supplier will receive an email from the Dropship Platform prompting them to sign in and begin the onboarding process. If the supplier requires more detail on how to use the Dropship Platform or has additional questions, they can schedule a call with a fabric Supplier Onboarding Specialist. ## Managing invitations To manage the suppliers you have invited, navigate to the **Suppliers** page and click **Invitations**located in the **New Suppliers** section. The **Invitations** page provides you with a list of all suppliers who you have sent an invitation to but have yet to access the platform. If your supplier has not received the invite email, you can resend the email by clicking the **Resend** button next to that supplier. ## Activating new suppliers Once a supplier accepts your invitation, they will move to the **Onboarding** section on the **Suppliers** page. You can opt into receiving a notification when your supplier has completed onboarding to know when they're ready for their connection to be activated. To activate a new supplier, navigate to the **Supplier** page and click **Onboarding** within the **Browse Suppliers** section of the suppliers page. This page provides you with a list of suppliers who have accepted your invite and in the process of setting up their account. The **In Review** status means that the supplier has completed their onboarding and is ready for your team to activate them. Click on the blue supplier link to pull up that suppliers detail page. Click **Activate** on the top left of the **Supplier Detail** page. **NOTE:** If you don't activate a new supplier, they won't be able to receive orders. Once the supplier is **Active**, they will move from the **Onboarding** section to the **Active** section within the **Suppliers** page and they can begin receiving orders. ## Checking Onboarding Status Once a supplier accepts your invitation, they will move to the **Onboarding** section on the **Suppliers** page. If a supplier is still in an **Onboarding** status and you want to check where they're at with their onboarding items, click on the blue supplier link to pull up that suppliers detail page. On the **Supplier Detail** page, click **Onboarding** in the left connection menu to pull up the status of their onboarding. # Invoices Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/invoices View, export, and manage invoices for all dropship orders. ## Viewing and exporting invoices 1. To access invoices associated with your dropship orders, click **Orders**. The **Orders** page is displayed. 2. Click **Invoices** located in the **Reports** section of the **Orders** dashboard. The **Invoices** page is displayed. 3. To find an invoice report, use the filter options. You can view and export reports. 4. To export your invoice report, click **Export**. Your invoice report is sent through an email to the user who requested the export. ## Managing invoices The fabric Dropship Platform provides you with the tools to manage invoices by updating their status to both **Acknowledged** and **Paid**. 1. To access invoices associated with your dropship orders, click **Orders**. The **Orders** page is displayed. 2. Click **Invoices** located in the **Reports** section of the **Orders** dashboard. The **Invoices** page is displayed. 3. Select the invoices you wish to update as **Acknowledged** or **Paid**. 4. To mark an invoice as **Acknowledged** or **Paid**, click **Actions**. 5. Two options appear, select **Accept Invoices** or **Mark Invoices as Paid**. If you selected multiple invoices, all the invoices are updated. The **Acknowledged** or **Paid** column is updated for the invoices. # Loop Integration Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/loop-integration The Loop Dropship integration seamlessly integrates with fabric Catalog and fabric Orders. ## Prerequisites * Ensure that you have **Administrator** privilege to fabric. For more detailed information on these settings, see the [Role-Based Access Control](/v3/platform/settings/rbac/role-based-access-control-orders-roles) section. ## Configuring the Integration 1. Submit a support request to [fabric customer success](https://support.fabric.inc/hc/en-us/requests/new) with the following details: * `Loop_api_key` (Required) * `Loop_webhook_secret` (Required) * `Loop_rma_number_mapping` (Optional): The default mapping is with the `id` of the return. Retailers can use this option to map other values such as `order_name`. This field's value is set as the return merchandise authorization **RMA** number in Dropship. * **Return to vendor warehouse** (Optional): Loop doesn't provide data on where the return is being shipped by default. The return to vendor warehouse credential is used to set up the shipping address on the return. Choose one of the following options: * **True**: Create the return address on RMA to be set to the vendor's warehouse. * **False**: RMA is created without any `shipTo` address. A tracking number is still available but no shipping address. * Select one of the following webhooks: * **Return Created**: This is the standard webhook for returns. Loop provides the `return_created` event and an RMA is created in fabric dropship. * **Return Updated**: This webhook enables you to create a return without an initial tracking number allowing you to later update the return with the tracking number once available. Loop doesn't support automatic enabling of webhooks for their API. Once set up, you need to manually enable the webhook on the Loop dashboard. If a return fails to sync, fabric can identify the return based on the Webhook History ID, Order Number, or return ID. fabric will then retry retrieving the return information again. # Create Purchase Order Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/create-purchase-order Generate a custom purchase order manually. ## Create order To manually create a purchase order, select **Create Purchase Order** from the **More** dropdown menu on the **Orders** page. Select **Create Purchase Order**. You will be directed to the **Order Create** page to start manually creating your Purchase Order. Each field must be completed manually unless it's marked optional. ### Order details | Field | Required Information | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Purchase Order Number** | Provide the purchase order number. | | **Order Date** | Provide the purchase order date. | | **Retailer Order Number** (Optional) | Use this field if an additional identifier is needed to reference the **Purchase Order Number**. For example, an Order Management System order number. | | **Customer Order Number** (Optional) | Provide the customer order number if applicable. | ### Ship to 1. To enter a customer shipping address, click the ship to link. 2. Complete the **Add Ship To Address** form. 3. Click **Save**. ### Requested ship method In the **Requested ship method** section, assign the shipping method. Use the dropdown to select **Expedited** or **Ground**. ### Optional notes In the notes section, you can add purchase order notes. ### Order lines 1. Select the supplier the order should be created against using the dropdown list. 2. Click **Add new line**. Select the variant using the dropdown search bar. 3. Enter the quantity, price, and cost of the item. 4. Click **Add**. 5. Click **Create Order**. The data is saved in the system for future reference. # Managing cancels & backorders Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/managing-cancels---backorders Manage orders canceled or flagged as backordered by a supplier. ## Managing canceled orders When orders are canceled by a supplier, retailers have the ability to acknowledge the cancelation. If you don't have an automated integration with fabric Dropship, you can acknowledge canceled orders directly within Dropship. 1. Click **Orders** in the top navigation. The **Orders** page is displayed. 2. In the **Require Attention** section, click **New Cancels**. The **Cancels** page is displayed with a table of canceled orders. 3. Select the canceled orders you wish to acknowledge by clicking the checkbox next to the order. 4. Click the **Actions** button and select **Acknowledge Cancels.** The Acknowledge Cancels window is displayed. 5. Click **Acknowledge All Cancels**. ## Managing orders with backordered Items When items on an order are marked as backordered by a supplier, retailers have the ability to acknowledge the backorder. If you don't have an automated integration with fabric Dropship, you can acknowledge orders with backordered items directly within Dropship. 1. Click **Orders** in the top navigation. The **Orders** page is displayed. 2. In the **Require Attention** section, click **New Backorders.** A list view of orders containing backordered items is displayed. 3. To open the order detail page, click the blue PO#. The order details page is displayed. On the order detail page you can view the date the supplier expects the item to be back in stock within the **Key Dates** section. 4. To acknowledge the backorder, click **Acknowledge Backorder** on the main **Order Detail** page. # Order Detail Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/order-detail Search for and view detailed information on each order. ## Finding orders If you know the **PO#** of the order you want to view, enter it in the search bar on the main **Orders** dashboard. From the results, click the **PO#** to view the [detail page](#order-detail-page). ### Advanced filtering If you don't have the **PO#** available for the order you want to view, click **advanced** next to the search bar on the main **Orders** dashboard. You can filter by: * PO Number (exact) * PO Number (contains) * Customer Order Number (exact) * Customer Order Number (contains) * Tracking Number * Invoice Number ## Order detail page The following fields and data are available on each individual **Order Detail** page. * **Order Identifiers** - The order identifiers provide a breakdown of the supplier name, customer order number, purchase order number, and the fabric ID assigned to the order. * **Shipping** - The shipping section provides the ship method information with the customer **Ship To Address**. * **Key Dates** - The key dates capture all the important dates tied to the order such as the date of order creation, expected completion date, and the date the order was closed out. If there is a backorder date associated with the order it's displayed with other key dates. * **Extras** - This section provides miscellaneous information against the order. * A direct link to the order packing slip; Dropship automatically generates a packing slip for each order once an order has been created within the platform. If a supplier doesn't wish to generate packing slips outside of the platform, the supplier can access the packing slip within the individual order. * Gift Message; If a customer provides a gift message when placing an order, the information can be found within the individual order. The gift message will also appear on the packing slip. **Order Lines** - The Order Lines section within the individual order screen provides you with a simple overview of the products available on the order. The item description and SKU are captured on the left-hand side while the units ordered breakdown is captured on the right-hand side. To view the pricing associated with the line item you can change the view using the **View** dropdown on the line item. **Tracking Numbers** - The Tracking Numbers section within the individual order screen provides you with a simple overview of the shipment information that's available on the order. The tracking number can be clicked to open a pop-up providing complete Shipment Detail information. Clicking on the tracking number in the shipment detail popup will re-direct you to the carrier site for additional tracking details. **Invoices** - The Invoices section within the individual order screen provides your team with a simple overview of the invoice information that's available on the order. The invoice number can be clicked on to open a pop-up providing complete invoice detail information. **Order Messages** - This section contains all the messages shared on the order between you and the supplier. **Order Activity** - This section contains a running list of all activity associated with the order. ## Order detail Shopify activity If your supplier is integrated with Shopify, on the Order Detail page you can see if the order was successfully pushed to their Shopify or not. If the order wasn't pushed to your suppliers Shopify, a error message will be present at the top of the individual order detail page. Typically errors will occur when attempting to push to suppliers Shopify’s due to the following: * The SKU on the order doesn't exist in the suppliers Shopify. Examples include: * The SKU was changed in the suppliers Shopify but wasn't updated in fabric Dropship. * The SKU was removed from the suppliers Shopify due to it being discontinued. * The SKU on the order is duplicated in the suppliers Shopify. * Although fabric recommends that each SKU is unique in a suppliers Shopify, fabric understands that this can't always be the case. When there is a duplicate variant in the suppliers Shopify, the supplier will need to confirm what Shopify Variant ID fabric Dropship should sync to. If an error is available for your suppliers orders, please reach out to the supplier directly to have them work with fabric support. # Orders Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/orders Visualize the information needed to manage all aspects of your dropship orders across all connected suppliers. To navigate to the **Orders** dashboard, login to the Dropship Platform and click **Orders** on the top menu bar. ## Orders dashboard The **Orders** dashboard consists of three main sections that make it easy to quickly view all information associated with dropship orders. They're **Open Orders**, **Reports**, and **Require Attention**. Clicking on any of the pre-filtered lists or reports within each of the main sections of the Orders dashboard provides a list view of all orders that fit within the pre-filtered criteria. ### Open orders **Open Orders** contains four pre-filtered lists: | List | Description | | ------------------------ | ---------------------------------------------------------------------------------- | | **Open Orders** | A list of all open orders | | **Current Orders** | A list of open orders that are within your fulfillment SLA. | | **Past Fulfillment SLA** | A list of open orders that are past your fulfillment SLA. | | **Late Invoices** | A list of open orders that have shipments but remain open due to missing invoices. | ### Reports **Reports** contains pre-filtered reports for various order details. | Report | Description | | ---------------------------- | ----------------------------------------------------------------- | | **Orders with New Messages** | A report with the latest order notes from your partners. | | **Shipments & Tracking** | A report containing information for shipments & tracking numbers. | | **Returns** | A report containing information on returns and RMAs. | | **Invoices** | A report containing all invoices from your suppliers. | ### Require attention **Require Attention** contains two pre-filtered lists to manage cancellations and backorders. | Name | Description | | ------------------ | -------------------------------------------------------------------------------- | | **New Cancels** | A list of cancellations that require acknowledgement by you, the retailer. | | **New Backorders** | A list of orders that contain items that the supplier has marked as backordered. | All data from any page containing a list view of orders can be exported by clicking on the **Export** link on the upper right side of each page. If any additional filters are applied to the page, the export will contain all orders that fit the filter criteria. # Returns and Credit Memos Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/returns-and-credit-memos Create returns on orders and manage the credit memos associated with those returns. ## Creating returns To create a return on an order, navigate to the **Orders** dashboard by clicking on **Orders** in the top menu bar. Search for the order you wish to create the return on and click the PO# that's displayed in the search results to pull up the order detail page. NOTE: An order must be in a closed status in order to create a return against that order. On the **Order Detail**page click **Start a Return**. Complete the form by selecting a reason for the return, adding an RMA number (optional), and entering the number of items being returned. Submit the return by clicking on **Start Return.** Once a return has been created against an order, the supplier associated with that order will be notified via email of the return. The supplier can then either Approve or Decline the return. ## Managing returns To track and manage returns, navigate to the **Orders** dashboard and click **Returns** located in the **Reports** section of the dashboard. The **Returns** page will provide you with a list of all returns and their current status (Pending, Approved, Declined). ## Credit memos If your supplier approves a return that was created against an order, they then have the ability to create a Credit Memo against that return. To access **Credit Memos**, navigate to the **Orders** dashboard and using the **More** dropdown, and select **Review Credit Memos**. The **Credits** page provides you with a list of all credit memos submitted by your suppliers. You can use the filtering options to create a report of specific credit memos. Click the blue **ID** link of a specific credit memo to pull up additional details of that credit memo. # Shipping & Tracking Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/orders/shipping---tracking The Shipments & Tracking dashboard allows you to see all the shipments sent by all of your suppliers in one spot. ## Viewing the Shipments and Tracking Dashboard 1. To view a filterable list of all the existing shipments, click **Orders**. 2. On the **Orders** page, click **Shipments & Tracking**. The **Tracking #s** page features a filterable list of all existing shipments with sortable column headers. | Column Header | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------- | | **Supplier** | The name of the supplier who sent the shipment. | | **Service** | The shipping service the supplier used. | | **Tracking #** | The shipment tracking number. Clicking on an individual tracking number in the list opens the **Shipment Detail** window. | | **PO #** | The purchase order associated with the shipment. | | **Registered** | The date the shipment was registered, shown in the user’s local time zone. | | **Acknowledged** | The date you (the retailer) acknowledged the shipment as complete. | | **Track** | A direct link to the carrier’s website for tracking. | # Overview Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/overview Rapidly launch, operate, and scale a curated assortment of products from an unlimited number of dropship suppliers. fabric Dropship acts as a business catalyst by enabling retailers to curate and offer new product assortments with low risk, low cost and zero added inventory. It's the only dropshipping platform that seamlessly integrates into a business's commerce stack and allows for rapid expansion and revenue growth while handling all of the complex inventory, transactions, billing, and supplier management functions in the backend. ## Navigation The fabric Dropship Platform for retailers is divided into four separate sections accessible from the top navigation menu * **Orders** - Your dashboard for managing and tracking all dropship orders * **Product Catalog** - Your dashboard for managing existing items, curating new items from your suppliers, and tracking inventory * **Suppliers** - Your dashboard for managing existing supplier connections and inviting new suppliers to your dropship program * **Reports** - Detailed reports to review the performance of your dropship business and all your suppliers # Proposals Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/proposals Review and approve proposals online. A proposal is a list of items that a supplier submits directly to a retailer partner through the fabric Dropship Platform. When one of your connected suppliers submits a proposal, you receive an email notification that a new list of items are submitted. You can then review the items before accepting and approving. ## Proposal statuses The status of a newly submitted proposal shows as **Proposed**. The following table describes the various proposal statuses. | Status | Description | | -------------------------- | ---------------------------------------------------------------------------------------------------- | | **Requires Approval** | Indicates the supplier has submitted the proposal for the retailer's review and approval. | | **Waiting for Supplier** | Indicates the proposal is sent back to the supplier for additional revisions to product data. | | **Needs Pricing Approval** | Indicates that the proposal requires an approval for pricing or product data. | | **Pricing Approved** | Indicates that the proposal requires a second approval before it's ready for publishing. | | **Ready to Publish** | Indicates the proposal is approved and is ready for publishing. | | **Completed** | Indicates that the proposal is complete. | | **Declined** | Indicates the proposal is declined, along with a reason. However,the reasons for declining may vary. | ## Proposal types There are three types of proposals: * **New item proposals**: These proposals contain new items that aren't currently available on your site. * **Cost update proposals**: Suppliers submit these proposals to update the previously approved wholesale cost of items. * **Attribute update proposals**: Suppliers submit these proposals to change product details, including images and descriptions, of already approved items. All proposals are reviewed and approved with the same process outlined below. ## Managing proposals To manage new item proposals, cost update proposals, and attribute update proposals, navigate to the **Products** page and select **Proposals**, located in the **Curate** section of the **Products** page. On the **Assortment Proposals** page, Click **Requires Approval** to pull up a list of all recently submitted proposals. The **Requires Approval** page lists all submitted proposals awaiting action. On this page, you can view the following details: * Proposal ID. * The name of the supplier who submitted the proposal. * The name of the proposal, which includes the department name. * The total items added to the proposal. * The date when the proposal was submitted. * The status of the proposal. To review a proposal from the list, click the blue link in the proposal **ID** column to access the individual **Proposal Detail** page. Using the **Proposal Menu** on the **Proposal Detail** page, you can review the items on the proposal at both the product level and the item level. * To view items on the product level, click products under the **Proposal Menu**. * To view items on the item level, click pricing under the **Proposal Menu**. ### Removing Items To reject items or entire products from a proposal that aren't relevant to the agreed upon assortment, you can remove by: * Select the items or products under the designated view (pricing or products). * Click **Actions**. * Select **Remove Products**. ## Sending Items Back to a Supplier If a supplier needs to revise a proposal, create an issue for each item, detailing the reason for sending it back and setting the expectation for the required changes. ### Creating an issue Select an item or product under the designated view (pricing or products). Click **Actions**. Click **Create Issue**. * Add an Issue Title. For example, Images. * Add an Issue explanation. For example, images provided are broken, please provide new ones. Once all issues have been created on the proposal, return to the summary screen using the proposal menu and click **Return**. ## Approving Proposals 1. When you are ready to approve the reviewed items, return to the summary screen using the proposal menu and click **Approve**. 2. Once the proposal is approved, it's moved to the **Ready to Publish** section of the **Assortment Proposals** page. 3. Click on the **Ready to Publish** section to pull up a list of approved proposals containing the items that are ready to be published on your site. 4. To pull up a proposal from the list, click the blue link in the proposal **ID** column to access the **Proposal Detail** page. 5. Click **Approve Products**. When approving, a new window opens, asking the following: * Do you also want to publish the products on this proposal to an external platform. 6. Select one of the following: * Yes. Continue the steps below. * No, just mark this proposal as approved. Skip to step 10. 7. Using the **Platform** field, select the platform where you want to publish the product. 8. Using the **Template** field, select the preferred template for publishing products. 9. To complete the process and remove the proposal from the **Ready to Publish** section, click **Mark as Complete!**. Marking the proposal as complete moves the proposal to the **Completed** section on the main **Proposals** page. Once the items from the proposal are added to your site you can begin receiving orders for those items. # Compliance Scorecard Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/reports/compliance-scorecard ## Overview The Compliance Scorecard is a tool that allows Retailers to track and monitor their suppliers' compliance and ensure dropship performance. The scorecard is calculated using three factors: * Number of orders fulfilled within a specified SLA * Number of canceled orders * Number of orders replaced To access the Compliance Scorecard, click **Reports** in the menu across the top of Dropship. In the dropdown that appears, select **Compliance Scorecard**. ## Compliance Scorecard The main Compliance Scorecard page shows an overview of all Suppliers along with a quick look at their performance metrics. * **Score & Change:** The supplier’s score for the month and change compared to the previous month. * **Award (Gold/Silver/Bronze):** The award level the supplier has achieved in comparison with all of your other suppliers. * **Rank & Change:** The supplier’s rank compared with all of your other suppliers and change in comparison with the previous month. * **Actions:** Click the icon to access more detailed compliance numbers for that individual supplier. ## Compliance Scorecard Details To see the Supplier Details report on an individual supplier, find and click on that supplier’s name or click on the icon under Actions. The Supplier Details page shows graphs and rankings in two categories: **Summary** and **Orders**. ### Summary * **Compliance Score:** The supplier’s compliance score over the past six months. * **Rank:** The supplier’s rank out of all of your suppliers over the past six months. ### Orders * **Orders Received:** The total number of orders the supplier has received. * **Fulfillment Score:** The supplier’s fulfillment score, which is calculated by their ability to fulfill orders within the SLA time. * **Cancellation Score:** The number of orders that customers have cancelled with the supplier, measured against the total number of orders they’ve received. * **Replacement Score:** The number of orders the supplier has had to replace, measured against the total number of orders they’ve received. * **Supplier Revenue:** The total revenue generated by the supplier through fabric Dropship. * **Merchant Share Paid:** The retailer’s share of revenue paid by the supplier. # Reports Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/reports/reports ## Introduction The Reporting features in fabric Dropship allow you to export information about Orders, Shipments, Invoices, Products, and Cancellations. ## Order Report To export orders, select **Orders** from the menu at the top, and then click on one of the categories under **Open Orders** on the Orders page. You will be directed to the **List** page, which shows all of the orders in the category you chose. When exporting an orders report, you can apply different filters to the data. Some filters include Connection (supplier name), Order Status, and Date range in which the orders were received. Once you are ready to export the order report (with or without filters), click the **Export** button to the right of the search bar. The export will be delivered as a CSV file to the email address associated with the Retailer account. ## Shipment Report To export past shipments, click on **Shipments & Tracking** on the Orders page. You will be directed to the **Tracking #s** page, which shows all of your previous shipments. When exporting a shipment report, you can apply different filters to the data. Some filters include Connection (supplier name) and the date the shipment was created. Once you are ready to export the shipment report (with or without filters), click the **Export** button to the right of the search bar. The export will be delivered as a CSV file to the email address associated with the Retailer account. ## Invoice Report To export past invoices, click on **Invoices** on the Orders page. You will be directed to the **Invoices** page, which shows all of your invoices. When exporting an invoice report, you can apply different filters to the data. Some filters include Connection (supplier name), the date invoice was submitted, and whether the invoice has been received by your retailer partner. Once you are ready to export the invoice report (with or without filters), click the **Export** button to the right of the search bar. The export will be delivered as a CSV file to the email address associated with the Retailer account. ## Product Report To export a supplier’s product catalog, select **Products** from the menu at the top of the page. From the Products page, there are two ways to view the supplier’s product catalog: * Click **Products** to view the catalog by parent information * Click **Items** to view the catalog by child SKU information When exporting a product catalog, you can apply different filters to the data. Some filters include Connection (supplier name), the date item was created, and whether or not the item is in stock. Once you are ready to export the product report (with or without filters), click the **Export** button to the right of the search bar. The export will be delivered as a CSV file to the email address associated with the Retailer account. ## Cancels Report To export a supplier's cancellations, select **Orders** from the menu at the top, and then click on **New Cancels** under the **Requires Attention** section. You will be directed to the **Cancels** page, which shows all order cancellations. When exporting a supplier’s cancellations, you can apply different filters to the data. Some filters include Connection (supplier name), the reason for the cancellation, and the date order was canceled. Once you are ready to export the cancel report, click the Export button to the right of the search bar. The export will be delivered as a CSV file to the email address associated with the Retailer account. # Sales Performance Reporting Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/reports/sales-performance-reporting ## Overview fabric Dropship Performance Reporting allows you to see the sales performance of your top suppliers each supplier’s top products. ## Performance Reporting Click on **Reports** in the menu at the top of Dropship. In the dropdown that appears, select **Sales Reporting**. The graphs on the Reporting page display numbers based on the dates selected in the fields at the top-right. Enter a custom date range or use the dropdown to select a predefined date range to adjust the data you see. The dashboard across the top of the page shows an overview of the number of suppliers with orders, number of orders, estimated gross merchandise value, average order value, and a line graph plotting performance over time. Use the Export buttons in the Daily Performance, Top Suppliers, and Top Products menus to save the information in a CSV file. # Attribute Value Transformers Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/attribute-value-transformers Transform the value of attributes automatically and accurately. ## Overview Attribute Value Transformers provide retailers with the capability to transform the product and variant attributes through various transformation rules. This enables consistent and accurate conversion of supplier-provided attribute values into the desired value as required by the business. Some examples of an attribute value transformation rule- Transform the value of “Category” attribute * Tshirt → Fashion > Apparel > Topwear > Tshirt * Shoes → Fashion > Footwear > Shoes Transform the value of “Supplier ID” attribute * 15 → Asian, Inc * 18 → Viets Corp ## Create an Attribute Value Transformer To access the Proposal Department, login to your dashboard, select **Retailer Settings**, then **Attribute Value Transformers,** then **Create Transformer.** Enter your **Transformer Name** Select **Save** Click on new transformer in **Transformer Name** list **Search** the attribute you want to transform * Not all identifier attributes can be added to a transformer Click on the attribute in the **Attribute** list Enter the details in the **Transformation Settings** section * Attribute Value Match - This is the value to be transformed * Transformation Output Value - The value you need after the transformation Each transformation can be modified by clicking on the **Edit** link You can create and number of transformations for this Attribute Once completed, click on the **Transformers** link in the breadcrumb navigation in the upper right of the page. ## Apply a transformer Once transformer is created, there are multiple screens and workflows where a transformer can be applied. ### Accepting Proposals If you have any new open proposals after creating a transformer, values of the proposal can be transformed. Navigate to the proposal that still requires an approval Click on **More** button Click on **Apply Transformer** Select the **Transformer** of choice from the dropdown menu and click **Apply** All matching attribute values across all items of proposal will be transformed. ### For Suppliers and Retailers **Importing the Products** You can apply transformer on a spreadsheet before you import any products Navigate to **Import Products** Select a **Template** from the dropdown menu Select the desired **Transformer** from the dropdown menu Select your import file and click **Begin Import** ### Product List Page You can apply a transformer even after items have been added to the catalog. Navigate to the **Products** list page Select the relevant products using the checkbox Click on **Actions** Select the **Transformer** from the dropdown menu Click on **Apply to All Products** # Categories & Commission Profiles Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/categories---commission-profiles The Categories feature in fabric Dropship allows retailers to organize products into groups and set different commission rates for each group of products. Categories can then be used to create Commission profiles for different supplier partners on the Dropship to maximize commissions. ## Categories To access Categories, click on your account name in the menu at the top of Dropship and select **Retailer Settings** in the menu that appears. On the Settings page, scroll to the bottom and select **Categories**. The Categories page displays a table of all the Categories you’ve created previously, with a quick look at the ID, Category Name, Number of Items in the Category, and the Last Updated date. To create a new Category, click the **Add New Category** button at the top-right of the page. In window that appears, give the new Category a name and click **Save**. To rename or delete an existing Category, find it in the list of Categories you’ve created previously, click on the corresponding vertical ellipsis icon (⋮), and then click Rename or Delete. Please note that Category names must be unique and only Categories with no items can be deleted. **Please Note:** Your Suppliers will be able to see all the Categories you create and any products you assign to them. ### Adding Products to a Category In Dropship, categories are attributes of a product, similar to a product’s name, description, color, etc. Like these other attributes, categories are set up in the CSV file of your products that you import into Dropship. To learn more about this process, visit the Import Products & Attributes page. ## Commission Profiles To access Commission Profiles, click on your account name in the menu at the top of Dropship and select **Retailer Settings** in the menu that appears. On the Settings page, scroll to the bottom and select **Commission Profiles**. The Commission Profiles page displays a table of all the Commission Profiles you’ve created previously, with a quick look at the Profile Name, Suppliers, and Method. ### Creating a Commission Profile To create a new Commission Profile, click the **Add New Profile** button at the top-right of the page. On the Create Commission Profile page, give the new profile a name and a description, and select a method for the Commission Profile, either **Flat Commission %** or **Commission by Category**. * **Flat Commission %:** Specify a commission rate to be applied to all items, regardless of their category. * **Commission by Category:** Enter a commission rate for each category. **All Categories** is selected by default and used for any items without a category. Click **Add Categories** to set up custom commission rates on a per-category basis. When you’re finished setting up your Commission Profile, click **Save**. ### Managing Commission Profiles To edit or delete a commission profile, visit the Commission Profiles page and click on a Commission Profile to change. * To edit the Commission Profile, make your changes and then click the Update button at the top right. * To delete the Commission Profile, click Delete at the top right, and then click Delete in the popup that appears. ## Best Practices for Commission Profiles To use Commission Profiles effectively, consider the following best practices: * Set commission rates that align with your business goals and help you maximize profits. * Use category-specific Commission Profiles to set different commission rates for different categories of products. * Keep Commission Profile names and descriptions clear and descriptive to help you identify them later. # Proposal Departments Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/proposal-departments Standardize product data rules for all suppliers across various categories. ## Overview When retailers are sourcing products in various categories from their suppliers, it becomes essential for them to be able to differentiate product attributes and their validations for each category. A proposal department enables retailers to set any number of categories and apply different validations on each one, making it easy to implement control over the quality of data their suppliers share. A proposal department enforces the rules of a product import template and two predefined rulesets on every proposal before a supplier can send proposals to the retailer. Status * Active - An active Proposal Department is available for all suppliers of the retailer. * Disabled - You can set the status of a department to Disabled if you don’t want to use this anymore. ## Create a Proposal Department To access the Proposal Department, login to your dashboard, select **Retailer Settings**, then **Proposal Department,** then **Create.** Enter the name of the proposal in **Department Name** Select a **Product Import Template** * Every proposal department requires the product import template to identify the list of attributes for the proposal department * A retailer can only select from the existing list of templates. Select a **Supplier Ruleset** * You will be able to see a list of existing rulesets * Select the ruleset that all items must be compatible with when being added to a proposal NOTE: Supplier ruleset is also applied on all items during the compatibility check of every proposal. Select a **Retailer Ruleset** * You will be able to see a list of all existing rulesets * Select the ruleset that the items must be compatible with when being accepted from a proposal NOTE: The retailer ruleset is applied on the all items of a proposal during the compatibility check before it can be sent over to the retailer for a review Select a **Sample Template URL** (optional step) * Dropship gives retailer the capability to provide a ready template to their supplier that can be referenced while creating the spreadsheet for a proposal. * You can simply upload the file on your server and add a URL here. This will make the file available for the supplier while creating a proposal. Please reach out to fabric Support if you need support in uploading the sample file to fabric’s server. Select **Save.** # Rulesets Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/rulesets Set the conditions and validations used by the Proposal Department. ## Overview A ruleset is a set of conditions that can be applied to a proposal through the feature called Proposal Departments. A ruleset consists of multiple rule groups. Each rule group can have multiple rules configured where each rule dictates the conditions for an individual attribute. * Retailers and suppliers use rulesets to dictate the terms of a proposal department * Rules set under a ruleset are applied to all items and attributes during a proposal * Proposal compatibility will check all the items from the template and apply the rulesets on them. Only validated items will be added to the proposal * Every retailer must have at least 2 rulesets, one to be used as Retailer ruleset and one to be used as suppliers ruleset. Refer to [Proposal Departments](/v3/dropship/dropship-retailers/settings/proposal-departments) for more details. ### Create a Ruleset To create a ruleset, login to your dashboard, select **Retailer Settings**, then **Product Rulesets,** then **Create Ruleset.** Enter a **Name** and **Description** of the ruleset. Click **Create** and the new ruleset will appear in the list. ## [](#section-) ### Create a Rule Group inside the Ruleset To configure a Rule Group in a Ruleset, click on the **Ruleset Name** you created. Click on Create inside the **Rule Group** section and complete the dialog box * **Name** - Name of the Rule Group. This represents the group to which the attribute belongs. For example, all identifier-related attribute rules can be part of the a single group called Identification. * **Position** - Only an integer is accepted. This will dictate the order of this group on the item details page. * **Description** - An optional description of the Rule Group. Click **Save**. A single Ruleset can have any number of Rule Groups. ### Create rule group ### Create a rule inside a Rule Group To add a rule, click on the relevant **Rule Group**. Click on **Create** inside the **Rules** section and complete the dialog box * **Attribute** - Select an attribute on which you want to apply the rule. * Note: This list will have the attribute names as defined by fabric Dropship. Retailers’ own attribute names aren't shown here, so be careful when selecting the attribute while creating a rule. * **Name** - Provide a name for the rule. * **Position** - Set the priority of the rule. This will dictate the order in which this attribute should appear on the Item details page. * **Description** - an optional field to add a description to the rule. * **Is Required** - Determines if the attribute must be included to pass the compatibility with this Ruleset. Click **Save**. A single Rule Group can have any number of rules. ### Create rule ### Adding validators to a rule (optional) A validator Enables retailers to set more complex validations on their attributes. Once a rule is added, validators can be added to it. * Multiple validators are available to be added, however, only one validator can be added per rule. To add a validator, click **Add** next to the rule inside the list. Select the validation **Type** from the dropdown menu. Enter the relevant expression in **Value.** Click **Save.** # Settings Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/settings Add users and configure notifications in Dropship. ## Introduction To access Retailer Settings, click on your account name in the menu at the top of the page. In the dropdown menu that appears, select **Retailer Settings**. Use the tiles on the Retailer Settings page to manage everything from general information and user privileges to API clients and webhook settings. ## Default Onboarding Preferences Manage the default onboarding settings for all new suppliers. The settings you configure here will be the default settings for all new connections. You can always override these settings when inviting a new connection. Each of these preferences is set for a new vendor automatically. These preferences can be changed for an individual vendor by going to their Connection Details Page. ### Default Cost Determination All incoming items on a purchase order must have an associated cost to the retailer. Use the **Cost Method** dropdown menu to make a selection: **Specified on Platform:** Dropship is responsible for capturing the cost in this scenario. For Proposals, an attribute called “Cost” becomes mandatory for all of a supplier’s items. It's implemented through rulesets being used by Proposal Departments and requires that suppliers define the value for the “Cost” attribute for every item when creating a proposal. For Import Requests, the same “Cost” attribute becomes mandatory for all items created by the retailer, and retailers won't be able to send import requests without the “Cost” attribute. **Specified on Order:** The retailer is responsible of providing the value of “Net Price” with every order they create in Dropship. Orders created without “Net Price” or “Retailer Price” will be rejected by the system. **Commission:** The retailer must specify the commission amount. Dropship will automatically calculate the cost to be paid to the supplier based on the retail price in every item. Retailers need to provide the “Retail Price” while creating an order in Dropship. Any order without the Retail Price will be rejected. The net price will be calculated based on the commission and retail price. After making a selection, click the **Save Preference** button. ### Default Fulfillment SLA The Fulfillment SLA governs how long suppliers have to ship orders before they're considered late. Use the dropdown to choose whether suppliers have one, two, or three business days to ship orders once they receive the order. After making a selection, click the **Save Preference** button. ### Default Payment Terms The retailer pays the cost of all the items on a purchase order. The Payment Terms reflect how long the retailer has in credit days before that amount is due to the supplier. For example, if set to Net 15, the retailer will need to remit the supplier within 15 days of invoice receipt. Use the dropdown to make a selection and then click the **Save Preference** button. ### Default Catalog Import Method The catalog import method defines how suppliers share their product catalog with you. Selecting **Import Requests** requires you to upload a spreadsheet on behalf of your suppliers and subsequently seek their approval to publish the products. Selecting **Proposals** requires suppliers to submit products to you for approval. After making a selection, click the **Save Preference** button. ### Default Customer Service & Returns Allowance Setting a customer service & returns allowance on a connection automatically applies an adjustment to all new incoming supplier invoices, decreasing the amount the retailer owes the supplier. This allowance is typically applied to offset the costs of returns and other costs associated with servicing a customer. To set a default returns allowance for any new connections automatically, enter a value between 0 and 10% and then click the **Save Preference** button. ### Packing Slip Template Including a retailer-branded packing slip is often an important component of the customer experience. The default packing slip will include your logo and core order data including the customer order number. If you have worked with fabric Support to configure a custom packing slip, please provide the template name and click the **Save Preference** button. ## Currency Settings Manage the currency of your account. Use the dropdown menu to select a primary currency. This will help Dropship apply location-specific configurations for things like a product’s cost and price. Supported currencies include United States Dollar, Canadian Dollar, British Pound Sterling, and Euros. ## Notifications Dropship supports real-time push notifications so that you can receive supplier onboarding alerts or transaction alerts. To enable a notification, enter an email address or a distribution list the corresponding field, and then use the toggle menu to set the notification to **Enabled** or **Not Enabled**. Types of **Onboarding Notifications**: * Supplier Invite Accepted: Notifications when a supplier partner accepts an invitation to join. * Supplier Completed Onboarding: Notifications when a new supplier completes onboarding. * Connection Notifications: Real-time alerts related to your connections and connection notes. Types of **Transaction Notifications**: * Connection Notifications: Notifications related to your connections and connection notes. * Order Received: Notifications when a new order is received. * Order Canceled: Notifications when a cancellation request is received. * Order Ship To Address Updated: Notifications when a “ship to” address change request is received. * Message Received: Notifications when a new message is received on an orders. * Return Received: Notifications when a new RMA is created on an order. * Return Approved/Rejected: Notifications when an RMAs is approved or rejected. In addition, **Digest Notifications** allow you to receive daily, aggregated reports on any late purchase orders. ## Branding Use the Branding menu to upload your business’s logo. It will be displayed to your supplier partners throughout the fabric platform and included on your packing slip. The ideal logo is a 360x120 pixel PNG. Click on the **Upload From Device** button to browse files on your computer to upload. Once you’ve selected a file, click and drag the preview to zoom, pan, and crop the image. When finished, click **Save**. ## Payment Settings (Staff Only) Connect your bank account to your fabric Dropship profile for automatic payments through Plaid. Click on the **Open Plaid** button to begin the setup process within Plaid. ## User Management Invite new users and manage existing ones. ### Creating a new user To add a user to the account, click the **Add New User** button. Enter the new user’s first name, last name, and email address, and fabric will send them an email with instructions to activate their user account. ### Editing a user To edit a user’s account information, find and click their name on the User Management page. The **General Settings** section allows you to edit basic profile information that identifies the user across the fabric platform. Use the Status dropdown menu to change the account between Active, Suspended, and Invited. When finished with your changes, click **Update**. The **Role** section allows you to configure a user’s access level. Click **Add Role** to assign a user a new role. To edit a user’s existing role, click on the role and the Update Role popup will appear. Select a new role for the user in the dropdown menu and click Save Role. **Security Credentials** allows you to give the user a new temporary password. Use the New Password and Confirm Password fields to create their new password. Upon logging in, the user will be required to change their password. **Security Info** shows details from the last time the user signed in to fabric. ## API Clients Manage API keys for your account. ### Adding a new API Client To add a new client, click the **Add API Client** button, give the client a name, and click **Create Client**. After the client is created, you will be able to retrieve their credentials. ### Accessing Client Credentials To access a client’s credentials, find and click their name on the API Clients page. The Client Credentials section shows the name you gave the client, their API URL, their Brand ID, and Client ID, along with the Client Secret. To access the client secret, click on **Get Client Secret**. **However, you can only access the client secret once.** When you’re ready, click on the Show API Secret button. The API secret will be shown, along with a copy button so that you can save it. If you need to access the client secret again, please submit a support ticket. ## Integrations Manage existing integrations associated with your account and add new ones. Dropship supports integrations with BigCommerce, fabric, and Shopify. ### Adding an Integration Basic setup for integration with third-party platforms consists of clicking on the **Add Integration** button at the top-right of the page. In the Add Integration popup that appears, click the **Add** button next to the platform you’d like to integrate with. From there, integrating with each platform is different, but setup includes information like the API Key, API Secret, or Store URL. ### Integration Options Existing integrations appear on the Integrations page below the **Add Integration** button. To manage an existing integration, find and click its corresponding **Options** menu. The options in the window that appears are shortcuts to edit settings within the integration. ## Webhooks (Advanced) Configure webhooks and review webhook history. ## Webhooks Configure webhooks to listen to key events from the fabric platform. To add a new webhook, click the **Add Webhook** button. * Proposal Approved * Item Inventory updated * Offer Created * Order Created * Order Closed * Shipment Closed * Cancel Created * Invoice Created The **Method** dropdown menu allows you to choose between post, put, and patch. In the **URL** field, enter the webhook URL. Use the **Status** dropdown menu to choose whether the webhook is Enabled or Disabled. When finished, click **Add Webhook**. ### Webhook History Review recent webhook results. ## Retailer SKU Settings Configure auto generation of retailer SKUs. You can turn on automatic SKU assignment if you would like Dropship to generate unique SKUs for items as soon as they're approved by a member of the retailer team. The settings configured on this page will be applied to new products only; existing products and items will NOT be modified. After making a selection, click the **Save Preference** button. ### Serial Key If Retailer SKU Assignment is enabled, you can choose a seed value for your SKUs. Fill out the Prefix, Seed Value, and Net Value fields, and then click **Save Preference**. ## Proposal Departments Visit the [Proposals](/v3/dropship/dropship-retailers/settings/proposal-departments) page to learn more about Proposal Departments in fabric Dropship. ### Creating a Proposal Department To create a new Proposal Department, click the **Create** button at the top-right of the page and fill out the fields in the **Create Department** popup that appears. * Name: Give the Department a name * Product Import Template: select from fabric’s default templates or a template you created * Supplier Ruleset: Select the attribute validations that suppliers must meet * Retailer Ruleset: Select the attribute validations that you must meet * Sample Template URL (optional) ## Attribute Value Transformers Please see the [Attribute Value Transformers](/v3/dropship/dropship-retailers/settings/attribute-value-transformers) page for more information. ## Product Rulesets Please see the [Rulesets](/v3/dropship/dropship-retailers/settings/rulesets) page for more information. ## Product & Inventory Templates Please see the [Templates](/v3/dropship/dropship-retailers/settings/templates) page for more information. ## Shipping Accounts Create and manage Shipping Accounts ### Adding a Shipping Account To add a new shipping account, click the **Add Shipping Account** button. In the window that appears, give shipping account a nickname, use the **Carrier** dropdown menu to select a shipping provider, and then click **Save & Continue**. ## Terms of Service Review the Terms of Service from fabric Dropship. Click the Commerce Network Merchant Agreement link to open a PDF of the Terms of Service. ## Tracking Number History The Tracking Number History section allows retailers to acknowledge changes in tracking numbers. The Tacking History page shows the Shipment ID and old and new tracking numbers, as well as the date the tracking number was changed. Click the **Shipment ID** to see details about the shipment, including the Packing Slip. Click the **Acknowledge** button at the right to acknowledge the changes to an order’s tracking number. ## Commission Profiles Please see the [Categories & Commission Profiles](/v2/guides/marketplace-retailers/settings/categories---commission-profiles) page for more information. ## Categories Please see the [Categories & Commission Profiles](/v2/guides/marketplace-retailers/settings/categories---commission-profiles) page for more information. # Templates Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/settings/templates Keep data consistent between internal and external systems ## Overview Templates are a key feature of Dropship that facilitates the data exchange of Dropship with other external systems. To access the templates, login to your dashboard, select **Retailer Settings**, then **Product & Inventory Templates.** These templates are specific to the retailer and come in two varieties, product and inventory. ### Product Templates * Pre-existing list of global attributes that's shared by all items and all businesses. * Retailers can use their own attribute names for the spreadsheets and will be able to see these names on the Dropship platform UI * Templates are mappings between the Dropship attributes and the attributes names defined by the retailer * Import templates are responsible for data ingestion into Dropship * Export templates can be used for extracting data from Dropship. * This allows the retailer and their suppliers to generate spreadsheets that match the template as required by other systems such as Shopify, fabric Product Catalog, and others. ### Retailers and Suppliers can create and clone templates Retailers * Retailers can create templates for importing and exporting products. * Retailers templates are also accessible by all of their suppliers. * Retailers can clone a template by selecting the clone option on the template details screen. Suppliers * Suppliers can create their own templates for importing and export products. * Supplier templates are only accessible by suppliers and can't be seen by their retailers. ## Create a template Click on **Create Template** Enter the **Template Name** Select **Product** as **Data Type** Select the **Direction** of template * Import - Select this if you want to use the template to import products into Dropship * Export - Select this if you want to use the template to export products from Dropship * Sample file * You need to provide a sample file of the template in order to create one * The sample file should only contain the header row of the spreadsheet you want to be using for the said operation * Once you upload the file, you will be asked to map the attributes ### Map Attributes Dropship automatically tries to map user-uploaded attributes with those of fabric Dropship, however, all mapping needs to be checked by the user before creating the template. There are certain attributes that are relevant for most dropship businesses and need to be mapped and added to capture key details related to dropship products. You can accept the values Dropship offers or enter your own for each column. Column Header - the name of the attribute in your file Map To - the name of the corresponding fabric Dropship attribute * You should be able to find a similar attribute in the dropdown * In case you can’t find a match for your attribute in the list provided by fabric, please raise a request to support team Level - this indicates whether this is a parent or individual item attribute * This field is only relevant for an import template * Defines whether the attribute is relevant for the product (the parent item) or its variants * Most attributes are relevant for items * Attributes that leveled to Products will be inherited by all of the variants automatically Priority - dictates the order in which the attributes will appear everywhere in the platform UI and during the exports Required - indicate if this is a mandatory or optional attribute * This field is only relevant for product import templates. * If an attribute is mandatory in the import template, items without that attribute will show an error when imported through into Dropship. Click **Save Template** # Shopify Integration Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/shopify-integration Integrate your fabric Dropship account with your Shopify account ## Adding the Shopify Integration 1. To access your Dropship Integrations, click your account name. 2. In the dropdown that appears, select **Merchant Settings**. The **Merchants Settings** page is displayed. 3. Click **Integrations**. The **Integrations** page is displayed. 4. Click **Add Integrations**. The **Add Integrations** page is displayed with a number of tiles. 5. Click the **Shopify** tile. The **Add Shopify Integration** window is displayed. 6. Do the following: * In the **Shopify Store URL** field, provide your store name. * In the **API Key** field, provide your Shopify API key. 7. Click **Add Integration**. After you enter your Shopify credentials in Dropship, you are directed to Shopify’s website. 8. Click **Install unlisted app** to install the fabric Dropship app in your **Shopify** profile. Once your credentials are entered and the app is installed, you are ready to begin configuring the various settings of your integration. ## Accessing Integration Options 1. To access your Dropship Integrations, click your account name. 2. In the dropdown that appears, select **Merchant Settings**. The **Merchants Settings** page is displayed. 3. Click **Integrations**. The **Integrations** page is displayed. 4. Next to the Shopify logo, click **Options**. The **Options** window is displayed. 5. Edit one of the following: * [Configuration](#configuration): The **Configuration** page allows you to make changes to the basic Shopify setup. * [Webhook History](#webhook-history): The **Webhook History** page shows a list of previous webhook callbacks. * [Utilities](#utilities): The **Utilities** page is used to update and sync order/inventory data. ## Configuration To access the **Configuration** page, follow the steps outlined in [Accessing Integration Options](#accessing-integration-options). ### Orders Configure how your Shopify store syncs orders with fabric. When you enable a Shopify orders webhook, fabric automatically imports customer orders that contain items from your approved suppliers and distribute purchase orders to suppliers via their preferred integration method (Console, EDI, API, etc). When suppliers ship items, fulfillments and tracking numbers will be automatically synced back to the original customer order in your Shopify store account. 1. To choose when fabric imports customer orders, click the **Select Webhook** field. 2. Choose one of the following options: * **Order Paid (Recommended)** * **Order Created** 3. Click **Enable Integration**. To disable the order integration, click **Disable Integration**. ### Fraudulent order protection You can specify and configure whether you want to import orders flagged by Shopify as High or Medium risk. Enable this service if you would like to skip medium-risk orders as recommended by Shopify. High-risk orders are always skipped. The field is **Disabled** by default. 1. To enable this service, select **Enabled** from the fraud field. 2. Click **Save Preference**. ### Location Set which inventory location to use when syncing inventory. When fabric updates inventory in Shopify, we have to assign the inventory to a location that's configured in your Shopify account. fabric recommends setting up a new, dedicated dropship location in order to keep your owned inventory separate from your dropship inventory. For more information on how to do that in Shopify, check the Shopify Help Center. 1. To choose an inventory location, select the **Select Shopify Location** field. 2. Click **Save Location**. ### Inventory fabric allows you to configure how your Shopify store syncs inventory with fabric. With this feature enabled, fabric can automatically sync supplier inventory movements to your Shopify store. 1. To choose how fabric syncs orders, use the **Select Webhook** field. 2. Choose the **Product/Inventory Updated (Recommended)** option. 3. Click **Enable Integration**. To disable inventory integrations, click the red **Disable Integration** button. ## Webhook History The Webhook History page shows a list of previous webhook callbacks. To access the **Webhook History** page, follow the steps outlined in [Accessing Integration Options](#accessing-integration-options). To inspect a webhook, click on the webhook ID. The **Inspect Webhook** window has basic information about the webhook including any messages the webhook returned, and the script used to fetch the webhook. ## Utilities To access the **Utilities** page, follow the steps outlined in [Accessing Integration Options](#accessing-integration-options). ### Retry Order If an order didn't import into fabric, its likely that there was a problem routing the order to the correct supplier. If you have doubled-checked the SKUs and the Shopify mappings, you can attempt to import the order again by supplying the **Shopify Order Number**. 1. To import the order, enter the order number into the **Shopify Order Number** field. 2. Use the fraud checkbox to toggle whether you would like to ignore Shopify’s fraud risk recommendation. 3. Click **Retry Order**. ### Push Inventory This utility pushes inventory for all synced items from a specified connection. Use the dropdown to select the connection and click **Push Inventory** to kickoff the sync process. ### Sync Variants by Vendor This utility attempts to sync variants between Shopify and fabric using a vendor name. It searches your Shopify store for all items created within the date range you specified and then attempts to sync them with variants in fabric. fabric checks if the Shopify variant's SKU field matches the Merchant SKU, the UPC, or the Supplier SKU (in that order). 1. Use the **Select Date Range** field to choose whether you would like to look for products created between two given dates, or run a sync against all products (a process that can be very slow). 2. Click **Run Sync** to begin the process. ### Sync Variant Use this utility to sync variants between Shopify and fabric using a fabric **Item ID**. Enter a value in the **fabric Item ID** field and click **Run Sync**, and fabric will search your Shopify store for any items matching using the Merchant SKU, Vendor SKU, and/or UPC. * **Variant-Level Metafields:** You can publish Metafields and their values at the variant level. * **Additional Metafield Types:** Support for additional Metafield types such as `multi_line_text_field`, `boolean`, `URL`, and `date_time`. ### Data Override on Publish Any publish to Shopify action overrides the data for products and variants in Shopify with the data in Dropship. Empty attributes aren't sent over. # Publishing Products to Shopify Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/shopify-publish-products ## Publishing Products Outside of a Proposal If a supplier isn't submitting a proposal to you and is importing products through a Shopify import, products can be published directly from the **Products Dashboard**. 1. In the main menu, click **Products**. The products page is displayed. 2. Click **products** located in the \*\*Browse & Review \*\*section. 3. Select the products that you wish to publish. Alternatively, you can check the top box to select all products on the first page. 4. Click **Actions**. The **Publish Products** window is displayed. 5. In the **Platform** field, select Shopify. 6. In the **Template** field, select **Shopify Export Template**. 7. Click **Publish Products**. ## Publishing Products on a Proposal Suppliers that have submitted product proposals can be approved and published in the **Proposal** menu. 1. In the **Proposal Summary** page, click **Approve**. The proposal state is changed to **Ready to Publish**. 2. In the **Assortment Proposal** page, click **Ready to Publish**. A list of approved proposals containing the items ready to be published is displayed. 3. To review a proposal, click the proposal **ID**. The **Proposal Detail** page is displayed. 4. Click **Approve Products**. The **Approve Proposal** window is displayed. 5. In the **Do you also want to publish products on this proposal to an external platform?** field, select **Yes**. 6. In the **Platform** field, select **Shopify**. 7. In the **Template** field, select **Shopify Export Template**. 8. Click **Approve**. ## Checking a Job Status To confirm that products were successfully created in Shopify, you can check the **Jobs Report** in Dropship to review the status of the job itself. 1. Click on your account name in the top right hand corner of the navigation bar. 2. Click **Job Reports**. The **Job Status** window is displayed with the most recent jobs at the top. 3. Click the job **ID** for the **push\_products** job. The job report is displayed. If any errors occurred when attempting to push products to Shopify, we recommend filing a ticket with support. Please provide [fabric support](https://support.fabric.inc/hc/en-us/requests/new) with the following: * The error Job ID * Vendor Name * Product details (new products added X date, or entire catalog) # Supplier Information Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/supplier-information ## Introduction As a retailer, you can manage your suppliers, see their details, and make changes to their accounts from the **Supplier** page. To access the **Supplier** page, click **Suppliers** from the menu at the top. The **Suppliers** page features a dashboard that allows you to search for existing suppliers, invite new ones, and browse suppliers by status. There’s also a supplier calendar that allows you to look ahead at upcoming supplier events. Use the search bar or the options under **Browse Suppliers** to find existing suppliers. Searching for or browsing suppliers displays a list of suppliers. Clicking on a supplier’s name opens the **Supplier Detail** page. ## Supplier Detail Page The **Supplier Detail** page shows information about the supplier, broken up in to four menus available in the left-hand side of the page: **Summary**, **Locations**, **Attributes**, and **Carriers**. ## Summary Summary is the default view of the **Supplier Detail** menu. At the top of the **Summary** menu is a button that allows you to either **Activate** or **Suspend** the supplier, depending on the supplier’s status. * **Activate** - The Activate button is available for suppliers that have completed the onboarding process. You must click **Activate** in order to complete their onboarding process and enable their supplier account. * **Suspend** - The Suspend button is available for active suppliers that have completed the onboarding process. It allows you to suspend their status as your supplier at any time. The **Summary** menu shows basic information about the supplier. There are five sections: **Connection Detail**, **Payment Settings**, **SLAs**, **Contacts**, and **Settings**. ### Connection Detail The **Connection Detail** section displays the following information: * **Supplier:** The supplier’s name. * **Supplier #:** The supplier’s number. * **Supplier ID:** The supplier’s ID. * **Integration Type:** The integration type the supplier used. * **Catalog Import Method:** The method of catalog sharing you used to for this specific supplier. * **Packing Slip Template:** The type of packing slip the supplier uses to fulfill the retailer’s orders. This is a global setting. See the Settings page to learn more. Click the **Edit** button next to the **Connection Detail** heading to make changes to this section. In the **Update Settings** window that appears, you can make changes to the **Supplier #**, **Transactions Integration** type, and **Catalog Import Method** type. Please note that while it's possible to edit these settings, it's recommended that you contact fabric support prior to making any changes in the **Update Settings** window. ### Payment Settings The **Payment Settings** section displays the following information: * **Cost Tracking:** The cost method the retailer is using for this specific supplier connection. * **Payment Terms:** The payment terms the retailer is using for the supplier connection. Click the **Edit** button next to the **Payment Settings** heading to make changes to this section. In the **Update Connection Fees** window that appears, you can make changes to the **Cost Method**, **Commission Rate**, and **Payment Terms**. Please note that, for auditing purposes, we recommend that you don't make changes to these settings. If changes are necessary, please contact fabric support first. ### SLAs The **SLAs** section shows the number of days the Service-Level Agreement gives the supplier to fulfill an order. Click the **Edit** button next to the SLAs heading to make changes. In the **Update Connection SLAs** window that appears, enter the number of days the supplier has to fulfill an order. When finished, click **Save Settings**. ### Contacts The **Contacts** section displays the following information: * **Primary:** The primary point of contact at the supplier’s business. * **Merchandising:** The merchandising point of contact at the supplier’s business. * **Fulfillment:** The fulfillment point of contact at the supplier’s business. The information is displayed as it was when the account was set up and can't be edited. ### Connection Notes The **Connection notes** section keeps notes from fabric staff or the retailer to store any critical information or decisions while onboarding or during business with the supplier. Click the **Add a Note** button to create a new note. In the **Add Note** window that appears, enter a message, use the **Message Visibility** field to choose who can see the note, and use the **Message Notification** checkbox to choose whether or not creating this new note will send an email to all those selected in the **Message Visibility** field. Click **Save Note**. To edit an existing note, click on the **Options** button to the right of its title and click **Edit**. ### Invoice Adjustments The **Invoice Adjustments** section displays any invoice adjustments you have set up previously. To make changes to these adjustments, click on the **fabric Retailer** menu at the top of the page, click **Retailer Settings**, and then click **Default Onboarding Settings**. ### Locations To visit the **Locations** menu, click **Locations** from the navigation at the left of the **Supplier Detail** page. The Locations menu shows a list of all of the supplier’s warehouse locations. This information is owned by the supplier and can't be changed by the retailer. ### Attributes To visit the **Attributes** menu, click **Attributes** from the navigation at the left of the **Supplier Detail** page. The Attributes menu features a list of all supplier attributes you’ve created previously, and an **Add Attribute** at the top right. Click **Add Attribute** to open the Edit Connection Attribute window. In the **Attribute** dropdown, there are four types of attributes: * **About Supplier:** Used to store key information about the supplier. * **Terms & Conditions:** Specific terms and conditions related to the supplier. * **Return Policy:** Any agreements related to returns. * **Packing Slip Text:** Text that shows below the packing slip that's generated by the supplier when they're fulfilling the order. ### Carriers The **Carriers** menu is where the retailer designates the Shipping Accounts this specific supplier is able to use. To visit the Carriers menu, click **Carriers** from the navigation at the left of the **Supplier Detail** page. Click **Edit Shipping Accounts** to open the **Update Connection Shipping Methods** window. Use the checkboxes next to each shipping method to choose which ones this supplier can use. If you don’t have any shipping accounts to choose from, you haven’t created one yet. To set up a shipping account, click on the **fabric Retailer** button in the menu at the top of the page, click **Retailer Settings**, and then click **Shipping Accounts**. # Supplier Payment Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/supplier-payment Track supplier invoices and payments ## Overview Dropship enables retailers to create payments for the invoices generated by their suppliers. One payment can only contain invoices coming from a single supplier. Retailers will be able to pool multiple invoices together and create a single payment draft and add its details such as check number, check amount, and the date of payment. Please note that this feature only facilitates creating payments against invoices to keep a record of supplier remittances. The feature doesn’t involve movement on money. ## Create Payments To create a payment, select **Reports** in the top header, then **Payments.** Click on **Create Payment** Use the **Select Supplier** dropdown menu to select the recipient for the payment, then click **Continue**. You can select the invoices to be added individually, or use the **Filter** to narrow the list to a specific range. Browse the list, or search for invoices, then select the checkbox next to it. After the selection is complete, click on **Actions** and **Add Invoice.** You can also **Search** for existing payments or see a list of **Draft** and **Completed** payments. ### Adding credits to the payment You can also add any existing credits to a payment. Credits are the amount a supplier has already been compensated with. This amount will be subtracted from the total invoice amount. Once you have your invoices selected a payment in the **Payment Detail** screen, select the **Add Credits** link to the left. Select the **Credits** from the list, then click **Actions**, **Add Credits.** In the confirmation dialog, select **Save**. ### Adding adjustments to the payment To add an adjustment to a payment, select **Adjustments** in the **Payment Detail** screen, select the **Add Adjustment** button. Select the kind of adjustment from the dropdown menu, enter the **Amount** and a **Description**. Click the **Save** button. If you need to modify or delete the adjustment, click the **Edit** link. ### Adding Check Information Once all invoices, credits and adjustments are added, a final amount of payment will be automatically calculated. Go to **Payment Summary Page**, to see the summary and check information. Click on **Edit** and add the check information * Provide Check number * Check Amount * Check Issue Date Once all details are added, click on **Mark as paid** and all invoices will be closed and payment information will be recorded. # Support Source: https://developer.fabric.inc/v3/dropship/dropship-retailers/support ## Overview fabric Tech Support is available for all current customers and registered prospects. ## Dropship Support for Retailers Under the **Support** dropdown in the menu at the top of the page, select **File a Ticket,** complete the form, and click the **Submit** button. The support dropdown exists on all pages within the platform. It's helpful to submit your request directly from the page where you are experiencing the issue. Note: Please use your company email address for all form completion. ## Definitions Use the following lists to help guide you when filling out the Issue Type and Priority dropdown fields. Ensuring these fields are filled out correctly will help fabric's support team respond to your ticket accurately. #### Issue Types * Product Training: Demo fabric Dropship or feature training request. * Merchandising: Product Help (Submission of proposals, Cost Updates, Import Request Issues, Broken Images). * Upload Failure: Import issues (Products, Inventory, Shipment, Invoices). * Order Help: Help during closing orders or registering shipments. * Shopify: Shopify Help (Order fulfillment and Inventory Help). * ShipStation: ShipStation Help (Order and Fulfillment Help ). * Account Help: Supplier, Retailer Settings Help, Adding new users. * EDI Integration: EDI Help (Order fulfillment and Inventory Help). * API Integration: API Help (Order fulfillment and Inventory Help). * Reporting: Reporting requests (Invoice export). * Inventory Issues: Inventory Errors (Inventory not updating in fabric system). * Proposal Help: Data Correction (fabric Dropship data team proposal help). #### Priority Types * Urgent: Complete loss of access to fabric Dropship. * High: Major functionality is severely impaired (Timeout issues, Product Update Requests not passing Shopify API). * Normal: Non-critical loss of functionality of the software or application (Shipment not registering, invoice issue, Order management issues). * Low: General usage questions and product help issues (Documentation errors, Adding users, Product Imports, Proposal). ## General Support If you need Tech Support for the fabric Core Platform, [click here](https://support.fabric.inc/hc/en-us/requests/new). # BigCommerce Integration Source: https://developer.fabric.inc/v3/dropship/dropship-suppliers/bigcommerce-integration ## Initial Setup To access Integrations, click your account name in the menu at the top of the page. In the dropdown that appears, select **Retailer Settings**. On the Retailer Settings page, find and click the **Integrations** tile. On the Integrations page, click the **Add Integration** button at the top-right of the page. In the Add Integration popup that appears, click the **Add** button in the BigCommerce tile. You will be prompted to fill out your BigCommerce **Store Identifier** and **Store Token**. When finished, click the **Add Integration** button. After successful authorization, BigCommerce will show up on the list of the integrations in the Integrations section of Dropship. ## Configuration On the Integrations page, find and click the **Options** button to the right of the BigCommerce logo and select **Configuration** from the dropdown. The Configuration page allows you to make changes related to how order and transaction information is shared between Dropship and BigCommerce. ### Configure Webhooks Choose whether or not to enable webhooks for **Orders**, **Inventory**, or **Fulfillment**. * **Orders:** With the orders integration enabled, fabric can automatically send purchase orders from your supplier partners directly to your BigCommerce account. Enabling this integration means that orders from all your supplier connections in fabric will flow through this integration. * **Inventory:** Dropship requires frequent inventory updates to reduce cancellations due to stockouts. The BigCommerce integration can sync inventory with Dropship automatically. Turn this integration off if you would prefer to update inventory manually. * **Fulfillment:** Dropship requires frequent order fulfillment updates to track orders. The BigCommerce integration can sync order fulfillment with Dropship automatically. Turn this integration off if you would prefer to update order fulfillment manually. **Note:** You can enable and disable these webhooks at any time. ### Webhook History On the Integrations page, find and click the **Options** button to the right of the BigCommerce logo and select **Webhook History** from the dropdown. The Webhook History page shows details of all the events that have been captured by Dropship from your BigCommerce store: * **ID:** The ID of the webhook as captured by Dropship. * **Topic:** The topic that was captured as part of the webhook. * **Status:** The status of the webhook (success or failure). * **Payload:** The data that was sent in the webhook payload. * **Received:** The timestamp of when the webhook was captured. This is in the user’s local time zone. Use the Filter feature at the top of the table to adjust the webhook information you see. # Adding Fulfillment Locations Source: https://developer.fabric.inc/v3/dropship/dropship-suppliers/fulfillment/adding-fulfillment-locations ## Overview To add a fulfillment location, click your supplier name in the menu at the top of the page. In the dropdown that appears, select **Supplier Settings**. From Supplier Settings, find and click **Inventory Settings**. In Inventory Settings, click the **Add Location** button in the Fulfillment Locations section. In the Add Location popup that appears, fill out the location's information and click the **Add Location** button at the bottom to save. You can add as many fulfillment locations as you need. # Bulk Actions for Orders Source: https://developer.fabric.inc/v3/dropship/dropship-suppliers/fulfillment/bulk-actions-for-orders ## Introduction With the Bulk Actions features in Dropship, you can perform actions that affect multiple orders. This document is divided into two sections: **Open Orders** and **Canceled Orders and Backorders**. ## Open Orders This section outlines the steps to perform bulk actions on open orders, including printing pick tickets, reprinting shipping labels, reprinting packing slips, and manually accepting orders. To begin, navigate to the **Orders** page in Dropship, and click one of the tiles under **Open Orders**. On the Orders page, find the orders you would like to print a pick ticket for and click the corresponding checkboxes at the left to select them. After you select the Orders, click the **Actions** dropdown and take the following steps based on the action you need to perform. ### Print Pick Ticket The pick ticket differs from a packing slip. A packing slip is required for all Retailer orders and contains all of your required information. A pick ticket provides a “pick list” of the order line information with your supplier SKU information and total ordered quantity. This can be helpful if your Retailer uses a retailer SKU on the packing slip instead of your internal supplier SKU. Select **Print Pick Tickets** from the Actions dropdown. In the popup that appears, you will be able to download and/or print your pick tickets. ### Reprint Shipping Labels If shipping labels are being generated directly in fabric Dropship, you can reprint them at any time. Select **Print Shipping Labels** from the Actions dropdown. In the popup that appears, you will be able to download and/or print your shipping labels. ### Reprint Packing Slips To reprint a packing slip for a specific order or batch of orders, select **Print Packing Slips** from the Actions dropdown. In the popup that appears, you will be able to download and/or print packing slips. ### Manually Accepting (Acknowledging) Orders To accept (also called acknowledge) an order or a set of orders, select **Accept Orders** from the Actions dropdown. In the popup that appears, you will see an overview of the orders you selected. Click **Accept All Orders** to confirm. Once the orders have been accepted, the status will change from **Ready** to **OK**. ## Canceled Orders and Backorders This section outlines the steps to perform bulk actions on orders that require attention, including canceled and backordered orders. ### Manually Accepting (Acknowledging) Canceled Orders When orders are canceled by a Supplier, Retailers have the ability to acknowledge the cancellation. If you don't have an automated integration with the fabric Dropship Platform, you can acknowledge canceled orders manually within the platform. Navigate to the **Orders** page and click **New Cancels** in the **Requires Action** section of the **Orders** dashboard. In the list of canceled orders, **click the checkbox** beside the canceled order you would like to acknowledge. Click the **Actions** dropdown at the top of the list and select **Acknowledge Cancels**. Click the **Acknowledge All Cancels** in the popup window to complete the process. ### Managing orders with backordered Items When items in an order are marked as backordered by a Supplier, Retailers have the ability to acknowledge the backorder. If you don't have an automated integration with the fabric Dropship Platform, you can acknowledge orders with backordered items directly within the platform. Navigate to the **Orders** page and click **New Backorders** in the **Requires Action** section of the **Orders** dashboard. In the list of backorders, click the **blue PO# link** to open the order detail page. On the order detail page you can view the date the supplier expects the item to be back in stock in the **Key Dates** section. You can then acknowledge the backorder by clicking the **Acknowledge Backorder** button at the top of the page. # Fulfillment Source: https://developer.fabric.inc/v3/dropship/dropship-suppliers/fulfillment/fulfillment Process and ship orders from all connected retail partners. ## Overview To navigate to the **Orders** dashboard, login to the Dropship Platform and click **Orders** on the top menu bar. The three main sections within the **Orders** Dashboard are: Open Orders, Reports, and Require Attention. **Open Orders** - contains four pre-filtered buckets of dropship orders * Open Orders - a list of all open orders * Current Orders - a list of open orders that are within your fulfillment SLA * Past Fulfillment SLA - a list of open orders that are past your fulfillment SLA * Late Invoices - a list of open orders that have shipments but remain open due to missing invoices. **Reports** - contains pre-filtered reports for various order details * Orders with New Messages - Browse the latest order notes from your partners * Shipments & Tracking - Review shipments & tracking numbers * Returns - Track returns and RMAs * Invoices - Review all invoices from suppliers **Require Attention** - contains two pre-filtered buckets to manage cancellations and backorders * New Cancels - a list of cancellations that require acknowledgement by you, the Supplier * New Returns - a list of orders that have a return associated with them. Clicking on any of the pre-filtered buckets within each of the main sections of the **Orders** dashboard will provide a list view of all orders that fit within the pre-filtered criteria. All data from any page containing a list view of orders can be exported by clicking on the **Export** link on the upper right side of each page. If any additional filters are applied to the page, the export will contain all orders that fit the filter criteria. ### Manage Orders in Bulk 1. To access the bulk operations page, click **Manage Orders in Bulk**. The Bulk Operation Details Page is displayed with available workflow actions. 2. Click one of the following fields: * **Cancel Entire Orders by PO Number** This operation cancels all orders of the given Purchase Order Numbers. To use this operation, the following mandatory fields are required: **Purchase Order Number**, **Retailer ID**, and **Cancellation Reason Code**. * **Cancel specific order lines by SKU** This operation cancels all order lines when given the purchase order of a given SKU. For example, if orders include an item that's now discontinued or is OOS, you can cancel just those items. To use this operation, the following mandatory fields are required: \*\* PO Number\*\*, *SKU* and **cancellation reason code**. If **Quantities** isn't provided, the default action cancels all quantities in that order. * **Cancel all order lines of specific SKU** This operation cancels all order lines of the given SKU. For example: A vendor can upload a template with the **SKU** affected and the **Cancellation Reason**. Then all orders containing the affected SKUs have those SKUs cancelled instead of going into each order individually. To use this operation, the following mandatory fields are required: **SKU** and **Cancellation Reason Code**. Only the specific SKUs are canceled when an order contains multiple order lines with different SKUs. ### Video: Dropship manual fulfillment