Обзор
POST на /api/public/strategy/evaluate и отобразите ответ.
На этой странице рассмотрены две схемы реализации:
- Контекст PDP — добавьте секцию на страницы товаров, которая вызывает API с просматриваемым в данный момент товаром и отображает карусель возвращенных рекомендаций.
- Контекст корзины — отобразите блок апселла внутри кастомной корзины, который вызывает API со всеми текущими позициями корзины и отображает возвращенные товары.
Что вам понадобится
- Ваш API-ключ Strategy. В Aftersell перейдите в Settings → Product Strategy и в карточке Security Token скопируйте ваш токен (это и есть ваш API-ключ Strategy).
- Идентификатор Strategy. Откройте нужную Strategy в редакторе Strategy Aftersell и скопируйте ее идентификатор.
- Доступ к коду темы. Вы будете добавлять секцию Liquid (PDP) или блок (кастомная корзина) в вашу тему Shopify — Online Store → Themes → … → Edit code.
Контекст PDP: сниппет секции
Установка
- В админ-панели Shopify перейдите в Online Store → Themes, нажмите … на вашей теме и выберите Edit code.
- В папке Sections создайте новый файл с именем
aftersell-upsell-carousel.liquid. - Вставьте приведенный ниже сниппет в новый файл и замените
YOUR_STRATEGY_API_KEYна API-ключ из Aftersell. - Сохраните.
- Откройте шаблон товара (обычно
templates/product.jsonилиsections/main-product.liquid) и добавьте секцию Aftersell Carousel там, где должна появиться карусель. В редакторе темы вы также можете перетащить ее прямо на страницу товара. - В настройках секции вставьте ваш идентификатор Strategy.
Что отправляет секция
- products — массив из одного элемента, содержащий просматриваемый в данный момент товар (productId, variantId, quantity, price, handle, title, vendor, productType, tags, collections, sellingPlan).
- cart — промежуточная сумма, количество товаров и количество позиций текущей корзины покупателя (опускается, если корзина пуста).
- cartToken — чтобы API мог связать это вычисление с той же сессией.
- customer — теги, страна, регион, локаль, количество заказов, общая сумма покупок и флаг согласия на маркетинг, но только если покупатель авторизован.
- session — код валюты из
shop.currency.
session перед вызовом fetch.
Сниппет

Настройка
{% schema %}, чтобы предоставить редактору темы больше параметров.
CSS ограничен именами классов .aftersell-* и включает карусель на Splide с 4 карточками в ряд, которая переходит на 2 карточки при 768px и на 1 при 480px. Свободно редактируйте его под свою тему — ничего из этого не требуется для работы вызова API.
Контекст корзины: блок апселла в кастомной корзине
cart.liquid. Форма вызова API и обработка ответа идентичны примеру для PDP — отличается только массив products.
Структура выглядит так:
fetch к /api/public/strategy/evaluate не отличаются от схемы для PDP выше — только массив products меняется с [productContext] на массив, полученный из корзины.
Что происходит, когда Strategy возвращает результат
evaluationId — уникальный идентификатор этого вычисления. Если вы зафиксируете его и прикрепите к отображаемым товарам, вы сможете атрибутировать итоговый заказ к точной рекомендации, которая его породила, — см. Атрибуцию ниже.
То, как вы отображаете массив products, полностью зависит от кода вашей темы. Приведенный выше сниппет для PDP отображает их как карусель карточек с выбором вариантов и кнопками добавления в корзину; кастомный блок корзины может отобразить их вертикальным списком внутри drawer.
Полную схему запроса и ответа см. в справочнике Evaluate Strategy API.
Когда товар не возвращается
products: []), обработка этого случая остается на усмотрение вашего кода. Приведенный выше сниппет для PDP полностью скрывает карусель. Кастомный блок корзины может вернуться к стандартному списку апселлов корзины или просто ничего не отображать.
Чтобы избежать пустого ответа, настройте Catch all в Strategy, чтобы всегда был резервный товар для возврата. О настройке Catch all см. страницу Создание Strategies.
Советы по пользовательским интеграциям
- Формируйте контекст в Liquid. Liquid выполняется во время рендеринга и имеет доступ к полному графу объектов Shopify — товар, корзина, покупатель, магазин, запрос. Используйте его для заполнения полезной нагрузки на стороне сервера вместо клиентских вызовов.
- Не публикуйте API-ключ в открытых репозиториях. Он окажется в коде вашей темы, который доставляется в браузер, — это нормально. Но не вставляйте эту же тему в публичный репозиторий и не делитесь сборкой с посторонними.
- Используйте Catch all. Витрина выглядит сломанной, когда слот исчезает. Catch all с небольшим набором безопасных значений по умолчанию сохраняет согласованность интерфейса.
- Кешируйте там, где это уместно. Strategies API выполняет легкое кеширование на стороне сервера (
meta.servedFromCache), но для страниц товаров с высоким трафиком имеет смысл также применять debounce или мемоизацию вызовов на клиенте (например, не вызывать API повторно, когда один и тот же товар отображается дважды за сессию).
Атрибуция
/cart/add.js прикрепляет свойства позиции (line item properties) к товару в корзине:
Атрибуция к конкретному вычислению
evaluationId из ответа и прикрепите его к позиции в свойстве __as_offer_id. AfterSell читает этот ключ, поэтому заказы, помеченные им, атрибутируются к конкретному вычислению в отчетности.
В обработчике evaluate() сохраните идентификатор из ответа:
__as_offer_id — это ключ, который ищет AfterSell, а префикс с подчеркиванием скрывает его от покупателей. Если evaluationId отсутствует (например, товары не были возвращены), пропустите это свойство, а не отправляйте пустое значение.