Shopify 연동 가이드
Tajo는 두 곳에서 Shopify를 Brevo에 연결합니다. Tajo Shopify 앱은 Shopify 웹훅이 도착하는 대로 Brevo 쓰기 작업으로 바꿉니다. 에이전트가 만들고 사람이 승인하는 동기화 규칙은 일정에 따라 레코드를 Brevo로 옮깁니다. 이 페이지에서는 두 가지를 모두 다룬 다음, Tajo가 MCP로 제공하는 Shopify 도구를 소개합니다.
사전 요구 사항
연동을 시작하기 전에 다음을 준비하세요.
- 모든 플랜의 Shopify 스토어 (Basic, Shopify, Advanced 또는 Plus)
- Tajo 계정 (Tajo는 얼리 액세스 단계입니다)
- 동기화 대상인 Brevo 계정
- Shopify 스토어에 대한 관리자 액세스 권한
1단계: Shopify 스토어 연결
Tajo는 얼리 액세스 단계입니다. Shopify 앱은 Shopify App Store에 등록되어 있지 않으며, 직접 설치할 수 있는 링크도 없습니다. 팀에 문의하여 설정을 진행하세요. Tajo 워크스페이스가 준비되면 다음을 진행합니다.
- Tajo에서 Connections를 엽니다.
- 스토어의 myshopify.com 도메인을 입력하고 Connect Shopify를 선택합니다. Shopify에 Tajo가 요청하는 범위가 표시되며, 승인하면 Tajo로 돌아옵니다.
- 각 범위의 용도와 Tajo가 Shopify에 다시 기록하는 내용은 Shopify 권한 설명에서 확인하세요.
2단계: Tajo Shopify 앱이 Brevo로 보내는 데이터
앱은 각 Shopify 웹훅을 검증하고 저장한 뒤 대기열에 넣어 바로 처리합니다. 고객과 상품 토픽은 처리 전에 약 4초를 기다립니다. 배치 대기 시간은 없습니다. 실패한 작업은 간격을 늘려 가며 다시 시도합니다.
웹훅 토픽
Tajo Shopify 앱은 다음 Shopify 웹훅 토픽을 구독합니다.
| 웹훅 토픽 | 용도 |
|---|---|
customers/create, customers/update, customers/delete | Brevo 연락처를 최신 상태로 유지합니다 |
orders/create, orders/updated, orders/fulfilled, orders/cancelled | Brevo용 주문 이벤트와 주문 지표 |
orders/paid, refunds/create | 로열티 포인트를 적립하고 차감합니다 |
checkouts/create, checkouts/update | Brevo에서 이탈한 결제 회복 |
products/create, products/update, products/delete | Brevo의 상품 카탈로그를 최신 상태로 유지합니다 |
inventory_levels/update | Brevo의 상품 재고를 최신 상태로 유지합니다 |
collections/create, collections/update, collections/delete | 컬렉션을 최신 상태로 유지합니다 |
companies/*, company_contacts/*, company_locations/* (create, update, delete) | B2B 회사 동기화 |
app/uninstalled, app/scopes_update, app_subscriptions/update | 앱 수명 주기 |
Shopify의 필수 개인정보 웹훅(고객 데이터 요청, 고객 삭제, 상점 삭제)도 처리합니다. 이 앱은 carts/*를 구독하지 않습니다. 이탈한 장바구니는 checkouts/* 토픽에서 가져옵니다.
Brevo에 반영되는 내용은 다음과 같습니다.
| Shopify 이벤트 | Brevo에서 |
|---|---|
| 고객 생성 또는 업데이트 | 이름, 이메일, 마케팅 동의와 함께 연락처가 생성되거나 업데이트됩니다. 유료 플랜에서는 앱이 태그, 주문 수, 구매 금액, 마지막 주문도 추가합니다. |
| 고객 삭제 | 연락처는 삭제되지 않고 수신 거부 처리됩니다 |
| 주문 생성, 업데이트, 결제, 이행 또는 취소 | Brevo 주문 API를 통한 주문, 그리고 이벤트 order_paid, order_completed, order_cancelled |
| 환불 생성 | 이벤트 order_refunded. Tajo로 Brevo 로열티 프로그램을 운영하는 경우 포인트가 비례해 차감됩니다. |
| 주문 결제 (Brevo 로열티 프로그램이 있는 경우) | 설정한 1달러당 포인트 비율로 포인트가 적립됩니다 |
| 이메일과 상품이 포함된 체크아웃 생성 또는 업데이트 | 이벤트 cart_updated와 cart_abandoned. 발송 시점은 Brevo 자동화가 결정합니다. |
| 상품 또는 컬렉션 생성, 업데이트, 삭제 | Brevo의 상품 카탈로그와 카테고리 |
| 재고 수준 업데이트 | Brevo 카탈로그의 상품 재고. 변형의 재고가 0에서 0보다 많아지면, 알림을 요청한 각 쇼핑객에게 재입고 1회당 한 번 back_in_stock 이벤트가 전달됩니다. |
앱은 테마에 “알림 받기” 버튼을 추가하지 않습니다. 재입고 요청은 직접 추가한 버튼처럼 스토어프런트에서 보내야 합니다.
기존 데이터
설치 시 앱은 기존 고객을 Brevo 연락처로 가져옵니다. 과거 데이터 전체 동기화는 앱의 동기화 페이지에서 시작합니다. 유료 플랜에서는 상품, 컬렉션, 회사, 주문도 가져옵니다.
3단계: 에이전트로 동기화 규칙 만들기
동기화 규칙은 하나의 동기화를 선언적으로 정의한 것으로, 소스 리소스, Brevo 액션, 필드 맵, 필터로 구성됩니다. 직접 작성할 필요는 없습니다. 원하는 내용을 설명하면 에이전트가 만들고, 사람이 승인합니다.
- Tajo에서 Agents를 열고 Brevo Integration Architect에게 원하는 동기화를 평소 말로 요청합니다. 예: “이메일 마케팅에 동의한 Shopify 고객을 Brevo에 연락처로 보내 줘.”
- 에이전트가 Shopify 커넥터를 살펴봅니다. 샘플은 필드 이름과 유형만 반환하며, 고객 값은 반환하지 않습니다.
- 필드 맵과 필터가 포함된 규칙을 제안하고, 필드 맵을 Brevo 액션에 맞춰 검증한 뒤 초안을 드라이 런합니다. 두 단계 모두 고객 레코드를 읽지 않습니다.
- 규칙을 초안으로 저장합니다. Connections > Syncs and mappings > New sync from template의 템플릿에서 시작할 수도 있습니다.
- Request publish approval을 누르면 스토어를 대상으로 미리 보기가 실행됩니다. 최대 10개의 레코드를 읽고, Brevo에는 아무것도 기록하지 않으며, 커서도 옮기지 않습니다. 기록하는 것은 개수뿐입니다. 가져온 레코드, 대상이 된 레코드, 매핑된 레코드, 필터로 제외된 레코드의 수와 매핑 오류입니다. 미리 보기가 실패하면 승인 요청이 만들어지지 않습니다.
- 사람이 Approvals 페이지에서 사유를 작성해 요청을 승인합니다. 승인은 규칙의 SHA-256 다이제스트에 묶이며 30분 후에 만료됩니다. 그러면 규칙 페이지에 Publish approved version이 표시됩니다.
게시된 규칙을 편집하면 초안으로 돌아갑니다. 다시 실행되기 전에 미리 보기와 승인을 다시 거칩니다.
실제 규칙
Tajo가 정의한 Shopify customers -> Brevo contacts 템플릿은 다음과 같습니다.
sourceSlug: "shopify",sourceResource: "customers",destinationSlug: "brevo",destinationAction: "upsert_contact",fieldMap: [ { source: "email", destination: "email", transform: "toLowerCase" }, { source: "first_name", destination: "attributes.FIRSTNAME" }, { source: "last_name", destination: "attributes.LASTNAME" }, { source: "phone", destination: "attributes.PHONE" }, { source: "total_spent", destination: "attributes.TOTAL_SPENT", transform: "toNumber" }, { source: "orders_count", destination: "attributes.ORDERS_COUNT", transform: "toNumber" }, { source: "tajo_email_marketing_consent", destination: "attributes.OPT_IN", transform: "toBoolean" }, { source: "tags", destination: "attributes.SHOPIFY_TAGS" }, { source: "id", destination: "attributes.SHOPIFY_ID", transform: "toString" }, { source: "created_at", destination: "attributes.SHOPIFY_CREATED_AT" }, { source: "updated_at", destination: "attributes.SHOPIFY_UPDATED_AT" },],filterExpression: "($json.tajo_email_marketing_consent === true) && ($json.tajo_email_suppressed === false)",이 필터가 동의 확인입니다. Tajo는 두 값을 모두 Shopify의 email_marketing_consent.state 또는 이전 accepts_marketing 플래그에서 도출합니다. 연락처를 Brevo에 기록하는 규칙은 이 필터 없이는 게시할 수 없습니다. 다른 Shopify 템플릿인 Shopify orders → Brevo orders는 체크아웃에서 마케팅에 동의한 구매자의 주문을 Brevo에 기록합니다.
규칙이 실행되는 시점
- 연락처 동기화 규칙은 기본적으로 15분마다 실행됩니다. 각 실행은 규칙의 커서에서 시작합니다.
- 활성 규칙의 페이지에는 Test run (1 batch) 버튼이 있습니다.
- 활성 상태로 게시된 Shopify orders → Brevo orders 규칙도 15분마다 실행됩니다. 첫 예약 실행은 그 시점의 몇 분 전부터 시작하며 그보다 오래된 주문은 보내지 않습니다. 이후 각 실행은 이전 실행 이후에 업데이트된 주문을 보냅니다.
- 과거 주문은 규칙을 직접 실행할 때만 Brevo로 전송됩니다. Test run (1 batch) 버튼을 사용하거나 Sync Operator 에이전트에게 실행을 요청하세요.
- 주문 규칙은 템플릿의 구매자 마케팅 옵트인 필터가 있을 때만 일정에 따라 실행됩니다. 필터를 편집한 규칙은 직접 시작할 때만 실행됩니다.
- 실행이 5번 연속 실패하면 규칙이 스스로 일시 중지되고, 페이지에 마지막 오류가 표시됩니다. 원인을 해결한 뒤 다시 게시하세요.
각 실행은 규칙의 실행 기록에 읽은 레코드, 기록한 레코드, 실패한 레코드 수와 소요 시간과 함께 표시됩니다.
Shopify 커넥터가 읽고 쓰는 데이터
동기화 규칙은 대상, 여기서는 Brevo에만 기록합니다. Shopify에는 절대 기록하지 않습니다.
Tajo Shopify 앱은 12개의 범위를 요청하며, 동의 수신 거부나 로열티 태그처럼 몇 가지 쓰기 작업만 Shopify에 수행합니다. Shopify 권한 설명에서 모든 범위와 모든 쓰기 작업을 그 계기와 함께 확인할 수 있습니다.
에이전트와 MCP 호스트는 Shopify 커넥터를 통해 스토어에 접근합니다.
| 읽기 | 쓰기 |
|---|---|
| 상점 세부 정보, 고객(목록과 검색), 주문, 상품, 고객 메타필드, 재고 수준, 대량 내보내기 상태 | 고객 메타필드와 고객 태그, 대량 내보내기 시작. 각 쓰기 작업은 제안으로 준비되며 승인된 후에만 실행됩니다. |
커넥터는 재고 조정도 선언합니다. 여기에는 write_inventory 범위가 필요하지만 Tajo Shopify 앱은 이 범위를 요청하지 않습니다.
4단계: MCP로 Shopify 도구 사용하기
Tajo는 Shopify 커넥터를 https://alto.tajo.io/mcp/connectors/shopify에서 MCP 서버로 제공합니다. Claude Code에 추가하려면 다음을 실행합니다.
claude mcp add --transport http tajo-shopify https://alto.tajo.io/mcp/connectors/shopify호스트가 Tajo의 OAuth 서버를 찾아 Tajo 로그인 화면을 엽니다. 얼리 액세스 계정만 접근할 수 있습니다. 서버는 12개의 도구를 제공합니다.
| 도구 | 기능 |
|---|---|
preview_tajo_shopify_app | MCP UI로 렌더링되는 Tajo Shopify 앱의 인터랙티브 미리 보기 |
get_shop | 상점 세부 정보 |
search_customers | tag:tajo-vip나 total_spent:>100 같은 Shopify 쿼리 구문으로 고객을 검색합니다 |
list_customers | 고객 목록(페이지 단위) |
list_orders | 주문 목록(페이지 단위) |
list_products | 변형, 이미지, 재고가 포함된 상품 목록 |
get_customer_metafields | 고객의 메타필드를 읽습니다 |
get_inventory_levels | 변형의 위치별 재고를 읽습니다 |
poll_bulk_export | 대량 내보내기를 확인하고, 완료되면 다운로드 링크를 가져옵니다 |
calculate_rewards_profile | 동기화된 커머스 데이터로 고객의 등급, 포인트, 리워드 잔액을 계산합니다 |
shopify_propose | Shopify 쓰기 작업 하나를 제안으로 준비합니다. 아무것도 전송되지 않습니다. |
shopify_apply | 승인된 제안을 실행합니다 |
문제 해결
- Brevo에 연락처가 나타나지 않는 경우: Brevo에 연락처가 없음을 참고하세요.
- 규칙이 실행되지 않거나 스스로 일시 중지된 경우: 데이터가 동기화되지 않음을 참고하세요.
다음 단계
- 데이터 동기화 이해하기: 동기화 규칙의 동작 방식
- Shopify 권한 설명: 모든 범위와 모든 쓰기 작업
- Shopify + Brevo: 연동 가이드
- 설정을 진행하려면 팀에 문의하세요