Налаштування commercetools Project та API
Перший крок перед будь-якою розробкою — правильне налаштування Project: регіони, валюти, мови, канали, сторе та API-клієнти. Помилки на цьому етапі дорого коштують: перенесення Project між регіонами не передбачено, а неправильна структура каналів ламає ціноутворення.
Вибір регіону
commercetools працює на GCP та AWS у кількох регіонах:
| Регіон | API Host | Auth Host |
|---|---|---|
| Europe (GCP) | api.europe-west1.gcp.commercetools.com |
auth.europe-west1.gcp.commercetools.com |
| US East (GCP) | api.us-central1.gcp.commercetools.com |
auth.us-central1.gcp.commercetools.com |
| Australia | api.australia-southeast1.gcp.commercetools.com |
auth.australia-southeast1.gcp.commercetools.com |
| Europe (AWS) | api.eu-west-1.aws.commercetools.com |
auth.eu-west-1.aws.commercetools.com |
Для ринку СНД — europe-west1.gcp. Регіон фіксується при створенні Project та не змінюється.
Первинне налаштування через Merchant Center
Після створення Project в mc.commercetools.com налаштуйте базові параметри:
Settings → International:
- Languages:
ru,en(перший — за замовчуванням) - Currencies:
RUB,USD,EUR - Countries:
RU,BY,KZ
Ці налаштування визначають дозволені значення для цін, перекладів та доставки по всьому Project.
Канали та Сторе
Channel — абстракція для ціноутворення та інвентаря. Store — точка продажу з фільтрацією каталогу.
// Створити Channel
const channel = await apiRoot.channels().post({
body: {
key: "storefront-ru",
roles: ["ProductDistribution", "InventorySupply"],
name: { ru: "Сайт Россия", en: "Website Russia" },
defaultLocale: "ru",
defaultCurrency: "RUB",
address: { country: "RU" },
},
}).execute();
// Створити Store з привязкою до Channel
const store = await apiRoot.stores().post({
body: {
key: "web-ru",
name: { ru: "Веб-магазин Россия" },
countries: [{ code: "RU" }],
languages: ["ru"],
distributionChannels: [{ typeId: "channel", id: channel.body.id }],
supplyChannels: [{ typeId: "channel", id: channel.body.id }],
},
}).execute();
Якщо потрібно кілька веб-сайтів (RU/BY/KZ), створіть окремий Channel та Store для кожного.
Налаштування API-клієнтів
Кожен сервіс отримує окремого API Client із мінімальними необхідними правами:
// Через Merchant Center: Settings → Developer settings → Create client
// Рекомендовані клієнти:
// 1. storefront-anonymous — view_products, view_categories, manage_my_carts, manage_my_orders
// 2. storefront-customer — + manage_my_profile, manage_my_payments
// 3. backend-import — manage_products, manage_orders, manage_customers
// 4. extensions — manage_orders, view_payments
// 5. terraform — manage_project (тільки для інфраструктурних завдань, не в коді)
Клієнт для сторфронту (anonymous):
const anonymousAuthMiddleware = createAuthMiddlewareForAnonymousSessionFlow({
host: "https://auth.europe-west1.gcp.commercetools.com",
projectKey: process.env.CTP_PROJECT_KEY!,
credentials: {
clientId: process.env.CTP_STOREFRONT_CLIENT_ID!,
clientSecret: process.env.CTP_STOREFRONT_CLIENT_SECRET!,
},
scopes: [
`view_products:${process.env.CTP_PROJECT_KEY}`,
`manage_my_carts:${process.env.CTP_PROJECT_KEY}`,
`manage_my_orders:${process.env.CTP_PROJECT_KEY}`,
],
});
Клієнт для залогованого користувача:
const customerAuthMiddleware = createAuthMiddlewareForPasswordFlow({
host: "https://auth.europe-west1.gcp.commercetools.com",
projectKey: process.env.CTP_PROJECT_KEY!,
credentials: {
clientId: process.env.CTP_STOREFRONT_CLIENT_ID!,
clientSecret: process.env.CTP_STOREFRONT_CLIENT_SECRET!,
user: { username: email, password },
},
scopes: [
`manage_my_profile:${process.env.CTP_PROJECT_KEY}`,
`view_orders:${process.env.CTP_PROJECT_KEY}`,
],
});
Terraform для version-controlled конфігурації
Конфігурація Project в Git — хороша практика для відтворюваних окружень:
# main.tf
terraform {
required_providers {
commercetools = {
source = "labd/commercetools"
version = "~> 1.4"
}
}
}
provider "commercetools" {
client_id = var.ctp_client_id
client_secret = var.ctp_client_secret
project_key = var.ctp_project_key
token_url = "https://auth.europe-west1.gcp.commercetools.com"
api_url = "https://api.europe-west1.gcp.commercetools.com"
}
resource "commercetools_channel" "storefront_ru" {
key = "storefront-ru"
roles = ["ProductDistribution", "InventorySupply"]
name = {
ru = "Сайт Россия"
en = "Website Russia"
}
}
resource "commercetools_store" "web_ru" {
key = "web-ru"
name = { ru = "Веб-магазин Россия" }
languages = ["ru", "en"]
countries = ["RU"]
distribution_channels = [commercetools_channel.storefront_ru.key]
supply_channels = [commercetools_channel.storefront_ru.key]
}
terraform init
terraform plan
terraform apply
Типи атрибутів (Product Types)
Product Type — схема атрибутів для групи товарів. Тип атрибута не можна змінити після створення, лише видалити та пересоздати.
await apiRoot.productTypes().post({
body: {
key: "apparel",
name: "Одежда",
description: "Атрибуты для одежды",
attributes: [
{
name: "brand",
label: { ru: "Бренд", en: "Brand" },
type: { name: "text" },
isRequired: false,
isSearchable: true,
},
{
name: "size",
label: { ru: "Размер", en: "Size" },
type: {
name: "enum",
values: [
{ key: "XS", label: "XS" },
{ key: "S", label: "S" },
{ key: "M", label: "M" },
{ key: "L", label: "L" },
{ key: "XL", label: "XL" },
],
},
isRequired: true,
isSearchable: true,
},
],
},
}).execute();
Контрольний список перед запуском розробки
- Регіон вибрано, Project створено
- Languages та Currencies налаштовані в Settings
- Channels створені (мінімум 1 на сторфронт)
- Stores привязані до Channel
- API Clients створені з мінімальними scopes
- Product Types визначені (узгодити схему атрибутів з контент-командою)
- Shipping zones додані
- Tax categories створені
- Конфігурація залита в Terraform (опціонально, але рекомендується)
Час на первинне налаштування Project — 1–2 робочих дні при наявності чіткої вимоги до структури каталогу.







