개요
/api/public/strategy/evaluate에 POST한 뒤 응답을 렌더링해요.
이 페이지에서는 두 가지 구현 패턴을 다뤄요:
- PDP 컨텍스트 - 상품 페이지에 섹션을 배치하여 현재 보고 있는 상품으로 API를 호출하고 반환된 추천 상품의 캐러셀을 렌더링해요.
- 카트 컨텍스트 - 커스텀 카트 안에 업셀 블록을 렌더링하여 현재 카트의 모든 라인 아이템으로 API를 호출하고 반환된 상품을 렌더링해요.
필요한 것
- Strategy API 키. Aftersell에서 Settings → Product Strategy로 이동한 뒤 Security Token 카드에서 토큰을 복사하세요 (이것이 Strategy API 키예요).
- Strategy ID. Aftersell Strategy 편집기에서 실행할 Strategy를 열고 ID를 복사하세요.
- 테마 코드 접근 권한. Shopify 테마에 Liquid 섹션(PDP) 또는 블록(커스텀 카트)을 추가하게 돼요 - Online Store → Themes → … → Edit code.
PDP 컨텍스트: 섹션 스니펫
설치하기
- Shopify 관리자에서 Online Store → Themes로 이동하고, 테마에서 **…**를 클릭한 다음 Edit code를 선택하세요.
- Sections 폴더 아래에
aftersell-upsell-carousel.liquid라는 새 파일을 만드세요. - 아래 스니펫을 새 파일에 붙여넣고
YOUR_STRATEGY_API_KEY를 Aftersell의 API 키로 교체하세요. - 저장하세요.
- 상품 템플릿(일반적으로
templates/product.json또는sections/main-product.liquid)을 열고 캐러셀을 표시할 위치에 Aftersell Carousel 섹션을 추가하세요. 테마 편집기에서 상품 페이지로 직접 드래그할 수도 있어요. - 섹션 설정에 Strategy ID를 붙여넣으세요.
섹션이 전송하는 것
- products - 현재 보고 있는 상품이 담긴 단일 요소 배열 (productId, variantId, quantity, price, handle, title, vendor, productType, tags, collections, sellingPlan).
- cart - 쇼핑객의 현재 카트의 소계, 아이템 수, 라인 수 (카트가 비어 있으면 생략).
- cartToken - API가 이 평가를 동일한 세션에 연결할 수 있도록.
- customer - 태그, 국가, 지역, 로케일, 주문 수, 총 지출액, 마케팅 수신 동의 플래그, 단 쇼핑객이 로그인한 경우에만.
- session -
shop.currency의 통화 코드.
session 객체에 추가하세요.
스니펫

커스터마이징하기
{% schema %} 블록에서 설정을 추가하거나 제거하세요.
CSS는 .aftersell-* 클래스 이름 아래로 범위가 지정되어 있으며, 768px에서 2개, 480px에서 1개로 줄어드는 Splide 기반 4개 표시 캐러셀을 포함해요. 테마에 맞게 자유롭게 편집하세요 - API 호출이 작동하는 데 필수적인 부분은 없어요.
카트 컨텍스트: 커스텀 카트 업셀 블록
cart.liquid 같은 테마 템플릿. API 호출의 형태와 응답 처리는 PDP 예제와 동일하며, products 배열만 달라요.
구조는 다음과 같아요:
/api/public/strategy/evaluate에 대한 fetch 호출은 위 PDP 패턴과 동일해요 - products 배열만 [productContext]에서 카트 기반 배열로 바뀌어요.
Strategy가 반환할 때 일어나는 일
evaluationId는 이 평가의 고유 ID예요. 이를 캡처하여 렌더링하는 상품에 첨부하면, 이후 발생하는 주문을 해당 추천을 생성한 정확한 평가로 어트리뷰션할 수 있어요 - 아래 어트리뷰션을 참고하세요.
products 배열을 렌더링하는 방법은 전적으로 테마 코드에 달려 있어요. 위 PDP 스니펫은 변형 선택기와 장바구니 담기 버튼이 있는 카드 캐러셀로 렌더링하고, 커스텀 카트 블록은 드로어 안에 세로 목록으로 렌더링할 수 있어요.
전체 요청 및 응답 스키마는 Strategy 평가 API 레퍼런스를 참고하세요.
상품이 반환되지 않을 때
products: []) 처리 방법은 여러분의 코드에 달려 있어요. 위 PDP 스니펫은 캐러셀을 완전히 숨겨요. 커스텀 카트 블록은 카트의 기본 업셀 목록으로 폴백하거나, 아무것도 렌더링하지 않을 수도 있어요.
빈 응답을 피하려면 Strategy에 Catch all을 구성하여 항상 반환할 폴백 상품이 있도록 하세요. Catch all 설정 방법은 Strategy 만들기 페이지를 참고하세요.
커스텀 통합을 위한 팁
- 컨텍스트는 Liquid로 구성하세요. Liquid는 렌더링 시점에 실행되며 상품, 카트, 고객, 상점, 요청 등 전체 Shopify 객체 그래프에 접근할 수 있어요. 클라이언트 측 호출에 의존하기보다 서버 측에서 페이로드를 채우는 데 사용하세요.
- API 키를 공개 저장소에 노출하지 마세요. API 키는 브라우저로 전달되는 테마 코드에 포함되는데, 그건 괜찮아요. 하지만 동일한 테마를 공개 저장소에 붙여넣거나 번들을 외부에 공유하지 마세요.
- Catch all을 사용하세요. 슬롯이 사라지면 스토어프런트 경험이 망가져 보여요. 안전한 기본 상품 몇 개로 구성된 Catch all이 UI를 일관되게 유지해요.
- 필요한 곳에 캐싱하세요. Strategies API는 서버 측에서 가벼운 캐싱을 수행하지만(
meta.servedFromCache), 트래픽이 많은 PDP에서는 클라이언트에서도 호출을 디바운스하거나 메모이즈하는 것이 좋아요 (예: 같은 세션에서 같은 상품이 두 번 렌더링될 때 다시 호출하지 않기).
어트리뷰션
/cart/add.js 호출이 카트 아이템에 라인 아이템 속성을 첨부해요:
평가로 어트리뷰션 연결하기
evaluationId를 캡처하여 __as_offer_id 속성으로 라인 아이템에 첨부하세요. AfterSell이 이 키를 읽으므로, 이 키가 태그된 주문은 보고서에서 특정 평가로 어트리뷰션돼요.
evaluate() 핸들러에서 응답의 ID를 보관하세요:
__as_offer_id의 이중 밑줄을 유지하세요 - AfterSell이 찾는 키이며, 밑줄 접두사가 쇼핑객에게 보이지 않도록 해줘요. evaluationId가 없는 경우(예: 반환된 상품이 없는 경우)에는 빈 값을 보내지 말고 속성을 생략하세요.