--- 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' --- ExpandOn this page * [Requirements](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#requirements) * [Step 1: Create a new catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-1-create-a-new-catalog) * [Step 2: Associate a publication with the catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-2-associate-a-publication-with-the-catalog) * [Step 3: Associate a price list with the catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-3-associate-a-price-list-with-the-catalog) * [Step 4: Set fixed prices for specific product variants](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-4-set-fixed-prices-for-specific-product-variants) * [Step 5: Unpublish specific products to restrict them from sale](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-5-unpublish-specific-products-to-restrict-them-from-sale) * [Step 6 (Optional): Delete a price list](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-6-optional-delete-a-price-list) * [Step 7: Associate the catalog with a market](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-7-associate-the-catalog-with-a-market) * [Next steps](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#next-steps) # 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 { "input": { "name": "European prices", "currency": "EUR", "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID", "parent": { "adjustment": { "type": "PERCENTAGE_INCREASE", "value": 10.0 } } } } ``` ```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 ``` { "input": { "name": "European prices", "currency": "EUR", "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID", "parent": { "adjustment": { "type": "PERCENTAGE_INCREASE", "value": 10.0 } } } } ``` ##### 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 { "id": "gid://shopify/PriceList/ID", "input": { "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID" } } ``` ```json { "id": "gid://shopify/PriceList/ID", "input": { "catalogId": "gid://shopify/CompanyLocationCatalog/CATALOG-ID" } } ``` ##### json ``` { "id": "gid://shopify/PriceList/ID", "input": { "catalogId": "gid://shopify/MarketCatalog/CATALOG-ID" } } ``` ##### 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). *** * [Requirements](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#requirements) * [Step 1: Create a new catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-1-create-a-new-catalog) * [Step 2: Associate a publication with the catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-2-associate-a-publication-with-the-catalog) * [Step 3: Associate a price list with the catalog](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-3-associate-a-price-list-with-the-catalog) * [Step 4: Set fixed prices for specific product variants](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-4-set-fixed-prices-for-specific-product-variants) * [Step 5: Unpublish specific products to restrict them from sale](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-5-unpublish-specific-products-to-restrict-them-from-sale) * [Step 6 (Optional): Delete a price list](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-6-optional-delete-a-price-list) * [Step 7: Associate the catalog with a market](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#step-7-associate-the-catalog-with-a-market) * [Next steps](https://shopify.dev/docs/apps/build/markets/new-markets/create-catalog.md#next-steps)