--- title: Create a catalog for a specific market description: >- Use catalogs to control which products are available at what prices in different markets. source_url: html: 'https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog' md: 'https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md' --- # Create a catalog for a specific market **Note:** Not all merchant stores are eligible for the new markets experience. As an app developer, you must [check if the shop is onboarded on the new markets experience](https://shopify.dev/docs/apps/build/markets/new-markets/merchant-eligibility) before you can use the new [`marketCreate`](https://shopify.dev/docs/api/admin-graphql/2025-04/mutations/marketCreate) and [`marketUpdate`](https://shopify.dev/docs/api/admin-graphql/2025-04/mutations/marketUpdate) mutations. Catalogs define the set of products that are available to customers in a market, and the prices of each product. The market that's associated to a catalog defines the target audience. For example, a catalog that's associated to a market with a European region condition might allow customers shipping to Europe to purchase all items except electronics lacking CE certification. With a few exceptions, customers need to pay 10% higher prices. In this guide, you’ll learn how to create a catalog that includes a price list and publication settings to manage prices and control product availability, and then link the catalog to a specific market. *** ## Requirements * Your app can make [authenticated requests](https://shopify.dev/docs/api/admin-graphql#authentication) to the GraphQL Admin API. * Your app has the `write_products` [access scope](https://shopify.dev/docs/api/usage/access-scopes). Learn how to [configure your access scopes using Shopify CLI](https://shopify.dev/docs/apps/build/cli-for-apps/app-configuration). * You've created [products](https://shopify.dev/docs/api/admin-graphql/latest/mutations/productcreate) and [product variants](https://shopify.dev/docs/api/admin-graphql/latest/mutations/productvariantcreate) in your store. - You're [eligible to use the new Markets API](https://shopify.dev/docs/apps/build/markets/new-markets/merchant-eligibility). *** ## Step 1: Create a new catalog By default, markets aren't automatically associated with catalogs. You must create a catalog and associate it with a market. The catalog determines the products that are published to customers in that market. You can use the [`catalogCreate`](https://shopify.dev/docs/api/admin-graphql/2025-04/mutations/catalogCreate) mutation to create a new catalog: ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation CreateCatalog { catalogCreate(input: { title: "Europe" status: ACTIVE context: {marketIds: []} }) { catalog { id title status priceList { id } publication { id } ... on MarketCatalog { markets(first: 1) { nodes { id name } } } } } } ``` ## JSON response ```json { "data": { "catalogs": { "nodes": [ { "id": "gid://shopify/MarketCatalog/CATALOG-ID", "title": "Europe", "status": "ACTIVE", "priceList": null, "publication": null, "markets": { "nodes": [] } } ] } } } ``` To create a catalog that you'll later associate to a market, you need to specify the empty `marketIds` array in the `context` field. If you have a market ID, then you can use it to assign the catalog to the market immediately, but you won't be able to control pricing or product availability until you associate a price list and publication with it. **Tip:** You can create a catalog for a business-to-business (B2B) company location using the [`catalogCreate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/catalogcreate) mutation. Learn [how to create a B2B catalog](https://shopify.dev/docs/apps/build/b2b/start-building#step-2-create-a-b2b-catalog). *** ## Step 2: Associate a publication with the catalog After you create a catalog, you can use the catalog ID to associate a publication with the catalog. The publication determines the products that are published to customers in a market. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation CreatePublication { publicationCreate(input: { catalogId: "gid://shopify/MarketCatalog/CATALOG-ID", defaultState: ALL_PRODUCTS, autoPublish: true }) { publication { id autoPublish catalog { id title } } } } ``` ## JSON response ```json { "data": { "publicationCreate": { "publication": { "id": "gid://shopify/Publication/PUBLICATION-ID", "autoPublish": true, "catalog": { "id": "gid://shopify/MarketCatalog/CATALOG-ID", "title": "Europe" } } } } } ``` *** ## Step 3: Associate a price list with the catalog After you create a catalog, you can use the catalog ID to associate a price list with the catalog. The price list determines the prices that are shown to customers in a market. If a price list isn’t associated with the catalog, then customers in the associated market receive the initial variant prices converted to the market currency. ### Create a new price list Use the [`priceListCreate`](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/priceListCreate) mutation to create a new price list for the catalog. You can set the name, a percentage-based adjustment, a currency, and the ID of the catalog to associate. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation priceListCreate($input: PriceListCreateInput!) { priceListCreate(input: $input) { priceList { id } userErrors { field message } } } ``` ## Variables ##### json ```json { "input": { "name": "European prices", "currency": "EUR", "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID", "parent": { "adjustment": { "type": "PERCENTAGE_INCREASE", "value": 10.0 } } } } ``` ##### json ```json { "input": { "name": "Prices for Company's European location", "currency": "EUR", "catalogId": "gid://shopify/CompanyLocationCatalog/CATALOG-ID", "parent": { "adjustment": { "type": "PERCENTAGE_DECREASE", "value": 30.0 }, "settings": { "compareAtMode": "NULLIFY" } } } } ``` ## JSON response ```json { "data": { "priceListCreate": { "priceList": { "id": "gid://shopify/PriceList/ID" }, "userErrors": [] } } } ``` ### Associate an existing price list Use the [`priceListUpdate`](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/pricelistupdate) mutation to associate an existing price list with a catalog. You can also make changes to the name, currency, or percentage-based adjustments with the `priceListUpdate` mutation. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation priceListUpdate($id: ID!, $input: PriceListUpdateInput!) { priceListUpdate(id: $id, input: $input) { priceList { id } userErrors { field message } } } ``` ## Variables ##### json ```json { "id": "gid://shopify/PriceList/ID", "input": { "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID" } } ``` ##### json ```json { "id": "gid://shopify/PriceList/ID", "input": { "catalogId": "gid://shopify/CompanyLocationCatalog/CATALOG-ID" } } ``` ## JSON response ```json { "data": { "priceListUpdate": { "priceList": { "id": "gid://shopify/PriceList/ID" }, "userErrors": [] } } } ``` *** ## Step 4: Set fixed prices for specific product variants Use the [`priceListFixedPricesAdd`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/priceListFixedPricesAdd) mutation to set a fixed price for specific product variants. If a product variant is [published to the catalog](#step-4-unpublish-specific-products-to-restrict-them-from-sale) and doesn’t have a set fixed price, then its price is automatically calculated using the percentage-based adjustment that’s specified in the [`PriceListParent`](https://shopify.dev/docs/api/admin-graphql/latest/objects/pricelistparent) object. **Warning:** The `priceListFixedPricesAdd` mutation accepts a maximum of 250 prices for each request and acts as an add and replace operation. If a fixed price for a given variant already exists on the price list, then it’s replaced. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation priceListFixedPricesAdd( $priceListId: ID!, $prices: [PriceListPriceInput!]! ) { priceListFixedPricesAdd(priceListId: $priceListId, prices: $prices) { prices { variant { id } } userErrors { field message } } } ``` ## Variables ```json { "priceListId": "gid://shopify/PriceList/ID", "prices": [ { "variantId": "gid://shopify/ProductVariant/ID", "price": { "amount": "10.00", "currencyCode": "EUR" }, "compareAtPrice": { "amount": "12.00", "currencyCode": "EUR" } }, { "variantId": "gid://shopify/ProductVariant/ID-2", "price": { "amount": "15.00", "currencyCode": "EUR" } } ] } ``` ## JSON response ```json { "data": { "priceListFixedPricesAdd": { "prices": [ { "variant" : { "id" : "gid://shopify/ProductVariant/ID" } }, { "variant" : { "id" : "gid://shopify/ProductVariant/ID" } } ], "userErrors": [] } } } ``` ### Delete fixed prices To delete a partial set of fixed prices on a price list, you can use the [`priceListFixedPricesDelete`](https://shopify.dev/docs/api/admin-graphql/unstable/mutations/priceListFixedPricesDelete) mutation. After a fixed price is deleted, the price for the affected product variant is automatically calculated using the price list parent's percentage-based adjustment. To delete fixed prices, you need to specify the variant ID. You can specify a maximum of 250 variant IDs in the array. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation priceListFixedPricesDelete( $priceListId: ID!, $variantIds: [ID!]! ) { priceListFixedPricesDelete(priceListId: $priceListId, variantIds: $variantIds) { userErrors { field message } } } ``` ## Variables ```json { "priceListId": "gid://shopify/PriceList/ID", "variantIds": ["gid://shopify/ProductVariant/ID"] } ``` ## JSON response ```json { "data": { "priceListFixedPricesDelete": { "deletedFixedPriceVariantIds": [ "gid://shopify/ProductVariant/ID" ], "userErrors": [] } } } ``` *** ## Step 5: Unpublish specific products to restrict them from sale If there are specific products that must be restricted from sale in the market, then use the [`publicationUpdate`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/publicationupdate) mutation to remove them from the market’s publication. The `publicationUpdate` mutation allows you to republish a product to the market. **Note:** Associating catalogs to markets is just one part of the product publication story. Sales channels have their own publications that determine what products are available to a customer. Only products that are published in all applicable catalogs are available for purchase. For example, if a European customer accesses an online store, then they can purchase a product that’s published both to the European market and to the Online Store channel. However, a product that’s unpublished in either the European market or the Online Store channel can’t be purchased by the customer. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation UnpublishProducts { publicationUpdate( id: "gid://shopify/Publication/1" input: { publishablesToRemove: [ "gid://shopify/Product/1", "gid://shopify/Product/2" ] } ) { userErrors { field message } } } ``` ## JSON response ```json { "data": { "userErrors": [] } } ``` *** ## Step 6 (Optional): Delete a price list You can use the [`priceListDelete`](https://shopify.dev/docs/api/admin-graphql/latest/mutations/priceListDelete) mutation to delete a price list so that it no longer applies for products in that market catalog. To delete a price list, you need to specify the price list ID. When deleting a `priceList`, all of the `priceListPrices` are also deleted. **Note:** If you delete a price list for a market using the API and then also use the Shopify admin to save an adjustment, then a new price list for the market is created. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation priceListDelete($id: ID!) { priceListDelete(id: $id) { deletedId userErrors { field message } } } ``` ## Variables ```json { "id": "gid://shopify/PriceList/ID" } ``` ## JSON response ```json { "data": { "priceListDelete": { "deletedId": "gid://shopify/PriceList/DELETED-ID", "userErrors": [] } } } ``` *** ## Step 7: Associate the catalog with a market With a catalog created and a publication and price list associated, you can now associate the catalog with a market. Ensure you have a market ID to use in the `context` field and then use the `marketUpdate` mutation to add the catalog to the market. ## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json ## GraphQL mutation ```graphql mutation MarketUpdate { marketUpdate(input: { id: "gid://shopify/MarketCatalog/MARKET-ID", catalogsToAdd: ["gid://shopify/MarketCatalog/CATALOG-ID"] }) { market { id catalogs(first: 1) { nodes { id title } } } } } ``` ## JSON response ```json { "data": { "marketUpdate": { "market": { "id": "gid://shopify/Market/MARKET-ID", "catalogs": { "nodes": [ { "id": "gid://shopify/MarketCatalog/CATALOG-ID", "title": "Europe" } ] } } } } } ``` *** ## Next steps * Learn [about Shopify markets feature preview](https://shopify.dev/docs/apps/build/markets/new-markets/feature-preview). ***