세그먼트 사용자 속성 가이드
SDK로 보낸 속성과 서버가 기록한 행동을 조건으로 조합해, 발송 대상을 자동으로 분류합니다.
전체 흐름
| 단계 | 주체 | 내용 |
|---|---|---|
| 1 | 내 서비스 | SDK identify()로 회원 정보와 커스텀 속성을 보냅니다 |
| 2 | 서버 | 로그인·구매·앱설치·앱실행 시각을 자동으로 기록합니다 |
| 3 | 콘솔 | 이 속성들을 조건으로 조합해 세그먼트를 만듭니다 |
| 4 | 서버 | 매일 조건을 다시 계산해 대상자를 갱신합니다 |
| 5 | 콘솔 | 캠페인·자동화의 발송 대상으로 세그먼트를 선택합니다 |
1. 커스텀 속성 보내기
등급·생일·관심 카테고리처럼 내 서비스에만 있는 정보는
identify()의 customFields로 보냅니다.
미리 항목을 등록할 필요 없이, 보내는 즉시 콘솔 조건 목록에 나타납니다.
// 로그인 성공 후
await tracker.identify({
externalUserId: user.id,
name: user.name,
email: user.email,
customFields: {
grade: 'gold', // 회원 등급
birthday: '1990-07-26', // 생일
joinedAt: '2024-03-15', // 가입일(내 서비스 기준)
point: 15000, // 보유 포인트
favoriteCategory: '주방용품'
}
});YYYY-MM-DD 형식으로2024-03-15 또는
2024-03-15T10:30:00 형식만 인식합니다.20240315, 2024/03/15,
2024.03.15처럼 다른 형식으로 보내면
날짜 조건에서 제외됩니다(잘못된 대상에게 발송되는 것을 막기 위한 동작입니다).
보낸 값은 키 단위로 합쳐집니다
매번 전체 속성을 보낼 필요가 없습니다. 보낸 키만 갱신되고 나머지는 그대로 유지됩니다.
// ① 로그인 시
await tracker.identify({
externalUserId: 'u1001',
customFields: { grade: 'silver', birthday: '1990-07-26' }
});
// 저장 결과: { grade: 'silver', birthday: '1990-07-26' }
// ② 구매 완료 시 — 등급만 갱신
await tracker.identify({
externalUserId: 'u1001',
customFields: { grade: 'gold', lastOrderAmount: 89000 }
});
// 저장 결과: { grade: 'gold', birthday: '1990-07-26', lastOrderAmount: '89000' }
// ↑ 갱신됨 ↑ 보내지 않았지만 유지됨 ↑ 새로 추가됨(텍스트로 저장)- 값은 텍스트로 저장됩니다. 숫자·불리언을 보내도 문자열로 저장·반환됩니다(예:
89000→"89000"). - 커스텀 필드 키는 연락처당 기본 50개, 값은 기본 2000자까지입니다(조직별 조정 가능). 상한/길이 초과분은 오류 없이 무시·절삭됩니다.
- 가입일 주의:
createdAt은 연락처가 이 플랫폼에 처음 생성된 시각(유입일)이지 고객사 서비스의 가입일이 아닙니다. 실시간 SDK 가입이면 같지만, 기존 회원 가져오기·지연 식별이면 다릅니다. 실제 가입일로 세그먼트하려면signup_date(YYYY-MM-DD)를 커스텀 필드로 명시해 보내세요(중복 아님). - 반복·금액 행동(구매 등)은
activity.purchase.first/last/count/sum으로 서버가 자동 집계합니다. 마지막 구매 "일"만 커스텀 필드로 추가로 저장하는 중복은 피하세요. (이 문서의last_purchase_date예시는 클라이언트가 날짜 속성을 직접 보내는 방식을 보여주기 위한 데모입니다.)
2. 행동은 서버가 자동 기록합니다
아래 네 가지 행동은 따로 보내지 않아도 서버가 최초·마지막 시각을 기록합니다. "마지막 구매일로부터 30일 경과" 같은 조건에 바로 사용할 수 있습니다.
| 행동 | 기록되는 시점 | 필요한 SDK 호출 |
|---|---|---|
| 로그인 | identify() 호출 시 |
tracker.identify({ externalUserId }) |
| 구매 | 전환 목표를 purchase로 기록할 때 |
tracker.trackGoal('purchase', ...) |
| 앱 설치 | 앱 설치 퍼널 이벤트 발생 시 | App SDK가 자동 전송 |
| 앱 실행 | 앱 실행 퍼널 이벤트 발생 시 | App SDK가 자동 전송 |
identify()로 사용자가 식별되어 있어야 합니다.
비로그인 상태의 구매는 세그먼트 조건에 반영되지 않습니다.
각 행동은 최초·마지막 시각뿐 아니라 발생 횟수도 함께 기록되어, "N회 이상" 조건에 쓸 수 있습니다.
누적 구매액(LTV)
구매 전환에 금액을 함께 보내면 서버가 회원별 누적 구매액을 합산합니다. "누적 구매액 10만 이상 VIP" 같은 조건을 만들 수 있습니다.
// 구매 전환 기록 시 금액(goalValue)과 통화(goalCurrency)를 함께
await tracker.trackGoal('purchase', {
goalValue: 89000, // 이 거래 금액
goalCurrency: 'KRW' // 통화 (생략 시 조직 기준 통화로 간주)
});KRW)와
일치하는 거래만 합산됩니다. 다른 통화로 들어온 구매는 발생(횟수)만 기록되고
금액 합계에서는 제외됩니다 — 서로 다른 통화가 뒤섞여 합계가 무의미해지는 것을 막기 위해서입니다.
여러 통화로 판매한다면 통화별로 별도 집계가 필요하니 문의해 주세요.
커스텀 이벤트
위 표준 4가지 외의 행동(예: 장바구니_담기,
영상_시청완료)도 trackEvent()로 보내면
회원별로 발생 시각·횟수가 집계되어 세그먼트 조건이 됩니다.
// 식별된(identify 완료) 사용자의 커스텀 이벤트
await tracker.trackEvent('add_to_cart', { productId: 'A100' });
// → 콘솔 세그먼트 조건에 "add_to_cart 횟수", "마지막 add_to_cart일" 등이 자동 노출- 식별된 사용자만 — 이벤트 전에
identify()로 로그인되어 있어야 회원에 연결됩니다. - 이벤트 종류 상한 — 조직당 집계할 수 있는 커스텀 이벤트 종류 수에 상한이 있습니다(기본 50종, 관리자 조정). 상한을 넘는 새 이벤트명은 집계되지 않으니, 이벤트명을 일관되게 설계하세요.
3. 캠페인 반응
특정 캠페인을 받은/클릭한 회원을 조건으로 쓸 수 있습니다 — "여름 세일 클릭자에게 후속 발송" 같은 리타겟팅에 유용합니다. 별도 SDK 호출은 필요 없고, 발송·클릭 이력에서 자동으로 판정됩니다.
| 조건 | 의미 |
|---|---|
| 캠페인 클릭 — 했음 / 안 했음 | 선택한 캠페인의 메시지 링크를 클릭했는지 |
| 캠페인 수신 — 했음 / 안 했음 | 선택한 캠페인을 실제로 받았는지(발송 성공분만) |
4. 조건 만들기
콘솔 메시징 → 세그먼트에서 조건을 조합합니다.
사용할 수 있는 속성
| 구분 | 속성 | 비고 |
|---|---|---|
| 기본 정보 | 유입일(연락처 생성), 이름, 이메일, 전화번호 | 주소록에 등록된 값. 유입일은 가입일이 아니라 이 서비스에 등록된 날 — 실제 가입일은 custom.signup_date |
| 언어(로케일), 수집 경로 | 다국어·유입 채널 분리 | |
| 식별자(회원ID), 앱푸시 토큰 | 주로 있음/없음으로 사용 | |
| 최근 클릭일, 최근 푸시 오픈일 | 메시지 반응 기록 | |
| 수신동의 | 앱푸시 / SMS / 이메일 수신동의 | 일반 수신동의 |
| SMS·이메일·앱푸시·야간·알림톡 광고 수신동의, WhatsApp | 프로모션 대상은 광고 동의자로 | |
| 참여·상태 | 총 클릭 수, 총 수신 메시지 수 | 숫자 비교 |
| 이메일 반송, 스팸 신고, 태그 | 발송 위생·수동 분류 | |
| 행동 | 최초·마지막 로그인일 / 구매일 / 앱설치일 / 앱실행일 | 서버가 자동 기록 |
| 행동 횟수 (구매 횟수 등), 누적 구매액(LTV) | ||
| 커스텀 이벤트 (장바구니 담기 등) | ||
| 캠페인 반응 | 특정 캠페인 수신/클릭 | 발송·클릭 이력에서 판정 |
| 커스텀 속성 | SDK로 보낸 모든 항목 | 보내는 즉시 목록에 자동 노출 |
비교 연산자
| 연산자 | 의미 | 사용 예 |
|---|---|---|
| = (같음) | 값이 정확히 일치 | 등급 = gold |
| ≠ (다름) | 값이 다르거나 비어 있음 | 등급 ≠ gold |
| 포함 | 문자열 일부가 일치 | 관심 카테고리에 주방 포함 |
| > ≥ < ≤ | 숫자 크기 비교 | 포인트 ≥ 10000 |
| 최근 N일 이내 | 오늘부터 N일 안에 해당 날짜가 있음 | 마지막 구매일이 최근 30일 이내 |
| N일 이전(경과) | 해당 날짜로부터 N일 넘게 지남 | 마지막 로그인일이 90일 이전 |
| 기념일 N일 이내(매년) | 연도를 무시하고 월·일만 비교 | 생일이 7일 이내 |
| 특정일 이후 | 지정한 날짜 이후(그날 포함) | 유입일이 2024-03-01 이후 |
| 특정일 이전 | 지정한 날짜 이전(그날 포함) | 유입일이 2024-03-31 이전 |
| 기간 사이 | 시작일~종료일 사이(양끝 포함) | 구매일이 2024-06-01 ~ 06-30 |
| 있음 / 없음 | 값이 존재하는지 / 비어 있는지 (값 입력 불필요) | 전화번호 있음 · 구매 이력 없음 |
| 했음 / 안 했음 | 선택한 캠페인에 반응했는지 | 여름 세일 클릭 했음 |
- 상대(최근 N일·N일 이전·기념일) — 기준점이 '오늘'입니다. "가입한 지 30일 이내"처럼 매일 대상이 바뀌는 조건에 씁니다.
- 절대(특정일 이후·이전·기간 사이) — 기준점이 달력 날짜입니다. "2024년 3월에 가입"처럼 특정 시기를 고정할 때 씁니다. 시각은 무시하고 날짜 단위로 비교합니다.
=와 포함은 대소문자를 구분합니다.
gold로 저장한 값은 Gold 조건에 걸리지 않습니다.
서비스에서 값을 보낼 때 표기를 통일해 주세요(예: 항상 소문자).
- 사용일 이전이거나 같은 날 만료일 → 만료 전 사용
- 구매액 > 적립금 → 적립금보다 많이 쓴 회원
- 마지막 로그인 이전 마지막 구매일 → 구매 후 재방문 안 함
AND / OR 조합
한 그룹 안의 조건은 AND(모두 만족), 그룹끼리는 OR(하나라도 만족)로 묶입니다. 그룹은 최대 5개, 그룹당 조건은 최대 10개까지 사용할 수 있습니다.
[그룹 1] 등급 = gold AND 포인트 ≥ 10000 또는(OR) [그룹 2] 마지막 구매일이 최근 7일 이내 → "골드 등급이면서 포인트 1만 이상인 회원" 또는 "최근 일주일 안에 구매한 회원"
활용 예시
| 목적 | 조건 구성 |
|---|---|
| 생일 축하 쿠폰 | 커스텀 birthday — 기념일 7일 이내 |
| 휴면 회원 되살리기 | 마지막 로그인일 — 90일 이전 AND 앱푸시 수신동의 = true |
| 첫 구매 유도 | 유입일 — 최근 30일 이내 AND 최초 구매일 — (값 없음: ≠ 로 확인) |
| VIP 전용 안내 | 커스텀 grade = gold
AND 커스텀 point ≥ 50000 |
| 앱 설치 유도 | 최초 앱 설치일 — (값 없음) AND 마지막 로그인일 — 최근 14일 이내 |
| 재구매 유도 | 마지막 구매일 — 60일 이전 AND 커스텀
favoriteCategory 포함 주방 |
| VIP (누적 구매액) | 누적 구매액(LTV) ≥ 100000 |
| 충성 고객 (구매 횟수) | 구매 횟수 ≥ 3 AND 앱푸시 광고 수신동의 = true |
| 캠페인 리마인드 | 여름 세일 수신 했음 AND 여름 세일 클릭 안 했음 |
| 장바구니 이탈 | 커스텀 이벤트 add_to_cart 횟수 ≥ 1 AND 최초 구매일 — 없음 |
| 이메일 발송 가능 | 이메일 수신동의 = true AND 이메일 반송 — 없음 |
쿠폰 시나리오 레시피
쿠폰은 서비스마다 규칙이 달라 플랫폼의 고정 기능이 아니라 커스텀 이벤트·속성으로 표현합니다. 아래 세 가지만 보내면 대부분의 쿠폰 세그먼트를 만들 수 있습니다.
// 1) 쿠폰 다운로드(발급) 시 — 만료일을 커스텀 속성으로, 다운로드를 이벤트로
await tracker.identify({
externalUserId: user.id,
customFields: { coupon_expiry: '2024-06-30' } // 회원별 만료일 (YYYY-MM-DD)
});
await tracker.trackEvent('coupon_download', { coupon: 'SUMMER10' });
// 2) 쿠폰 사용 시
await tracker.trackEvent('coupon_use', { coupon: 'SUMMER10' });케이스별 조건
| 쿠폰 케이스 | 세그먼트 조건 |
|---|---|
| 다운받고 사용함 | coupon_download 횟수 ≥ 1 AND coupon_use 횟수 ≥ 1 |
| 다운받고 미사용 | coupon_download 있음 AND coupon_use 없음 |
| 곧 만료되는데 미사용 (리마인드) | 커스텀 coupon_expiry 최근 3일 이내 AND coupon_use 없음 |
| 만료됐는데 끝내 미사용 (재발급) | 커스텀 coupon_expiry — 0일 이전(경과) AND
coupon_download 있음 AND coupon_use 없음 |
| 최근 쿠폰 사용자 | 마지막 coupon_use일 최근 7일 이내 |
예: 마지막
coupon_use일 — “이전이거나 같은 날” — coupon_expiry
= "만료일 안에 사용한 회원". 날짜는 날짜끼리, 숫자는 숫자끼리만 비교됩니다.
coupon: 'SUMMER10')으로는 세그먼트가 되지 않습니다.
특정 쿠폰만 대상으로 하려면 이벤트명 자체를 나누거나(coupon_use_summer),
쿠폰 단위로 세그먼트를 따로 만드세요. 단, 이벤트명 종류는 조직 상한(기본 50종)을 넘지 않게 하세요.
대상자 갱신 주기
세그먼트는 매일 한 번 전체를 다시 계산합니다. 오늘 등급이 바뀐 회원은 다음 계산 시점에 반영됩니다.
탈퇴 회원 처리
SDK withdraw()로 탈퇴 처리된 회원은
개인정보와 커스텀 속성이 즉시 삭제되고 모든 세그먼트에서 자동으로 빠집니다.
행동 기록도 함께 삭제되므로 재가입 시 이전 이력이 조건에 잡히지 않습니다.
→ 사용자 식별 & 수신동의 API에서 자세한 내용을 확인하세요.
트러블슈팅
| 증상 | 확인할 것 |
|---|---|
| 커스텀 속성이 조건 목록에 없음 |
해당 키로 identify()를 최소 한 번 보냈는지 확인하세요.
조직에 실제로 저장된 키만 목록에 나타납니다
|
| 날짜 조건에 아무도 안 걸림 |
날짜 형식이 YYYY-MM-DD인지 확인하세요.
다른 형식은 인식되지 않아 조건에서 제외됩니다
|
| 등급 조건에 일부만 걸림 |
대소문자를 확인하세요. gold와
Gold는 다른 값으로 취급됩니다
|
| 구매 조건에 안 걸림 |
구매 전환을 기록하기 전에 identify()가 호출되었는지,
전환 목표가 purchase로 기록되는지 확인하세요
|
| 커스텀 이벤트가 조건에 안 보임 |
① 이벤트 전에 identify()로 로그인됐는지,
② 조직 이벤트 종류 상한(기본 50종)을 넘지 않았는지 확인하세요.
상한을 넘은 새 이벤트명은 집계되지 않습니다
|
| 누적 구매액(LTV)이 실제보다 작음 | ① 배포 이전 구매는 합산되지 않습니다(집계는 도입 시점부터), ② 조직 기준 통화와 다른 통화의 구매는 합계에서 제외됩니다. 환불도 차감되지 않습니다(총 구매액 기준) |
| 전화번호/이메일 = 조건에 안 걸림 | 암호화 저장이라 값 비교는 되지 않습니다. 있음/없음으로만 조건화하세요 |
| 대상자 수가 어제와 다름 | 정상입니다. 조건에 맞는 사람이 매일 다시 계산되므로 자연스럽게 변동합니다 |