세그먼트 사용자 속성 가이드

SDK로 보낸 속성과 서버가 기록한 행동을 조건으로 조합해, 발송 대상을 자동으로 분류합니다.

TIP세그먼트란
"생일이 이번 주인 골드 등급 회원", "가입은 했지만 30일 넘게 구매가 없는 회원"처럼 조건으로 정의하는 대상 목록입니다. 명단을 직접 관리하지 않아도 조건에 맞는 사람이 매일 자동으로 다시 계산되어 채워집니다.

전체 흐름

단계주체내용
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 예시는 클라이언트가 날짜 속성을 직접 보내는 방식을 보여주기 위한 데모입니다.)
TIP언제 보내야 하나요
값이 바뀌는 시점마다 보내면 됩니다. 로그인 시 기본 정보를, 구매 완료 시 등급·최근 구매액을, 프로필 수정 시 바뀐 항목을 보내는 식입니다. 같은 값을 반복해서 보내도 문제없습니다.

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 호출은 필요 없고, 발송·클릭 이력에서 자동으로 판정됩니다.

조건의미
캠페인 클릭 — 했음 / 안 했음선택한 캠페인의 메시지 링크를 클릭했는지
캠페인 수신 — 했음 / 안 했음선택한 캠페인을 실제로 받았는지(발송 성공분만)
TIP리타겟팅 예
"여름 세일 수신 했음 AND 여름 세일 클릭 안 했음" → 받았지만 반응 없는 회원에게 리마인드 발송.

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
있음 / 없음값이 존재하는지 / 비어 있는지 (값 입력 불필요)전화번호 있음 · 구매 이력 없음
했음 / 안 했음선택한 캠페인에 반응했는지여름 세일 클릭 했음
TIP"있음/없음"으로 이력 유무 판정
"구매 이력 있음/없음", "전화번호 있음", "생일 등록함"처럼 값의 유무만으로 나눌 때 씁니다. 예: 최초 구매일 — 없음 = 아직 한 번도 구매하지 않은 회원(첫 구매 유도 대상).
TIP상대 날짜 vs 절대 날짜
  • 상대(최근 N일·N일 이전·기념일) — 기준점이 '오늘'입니다. "가입한 지 30일 이내"처럼 매일 대상이 바뀌는 조건에 씁니다.
  • 절대(특정일 이후·이전·기간 사이) — 기준점이 달력 날짜입니다. "2024년 3월에 가입"처럼 특정 시기를 고정할 때 씁니다. 시각은 무시하고 날짜 단위로 비교합니다.
"특정 기간에 가입하고 특정 기간에 구매한 회원"은 한 그룹에 가입일 기간 사이 조건과 마지막 구매일 기간 사이 조건을 AND로 걸면 됩니다.
참고대소문자를 구분합니다
=포함은 대소문자를 구분합니다. gold로 저장한 값은 Gold 조건에 걸리지 않습니다. 서비스에서 값을 보낼 때 표기를 통일해 주세요(예: 항상 소문자).
TIP속성 간 비교(교차 비교)
날짜·숫자 속성은 고정값 대신 다른 속성과 비교할 수 있습니다. 조건 행에서 “다른 속성과 비교”를 켜면 값 입력이 속성 선택으로 바뀝니다.
  • 사용일 이전이거나 같은 날 만료일 → 만료 전 사용
  • 구매액 > 적립금 → 적립금보다 많이 쓴 회원
  • 마지막 로그인 이전 마지막 구매일 → 구매 후 재방문 안 함
날짜는 날짜끼리, 숫자는 숫자끼리만 비교됩니다(타입이 다르면 자동으로 후보에서 빠집니다).

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_expiry0일 이전(경과) AND coupon_download 있음 AND coupon_use 없음
최근 쿠폰 사용자 마지막 coupon_use일 최근 7일 이내
TIP"만료 전 사용"도 속성 간 비교로 됩니다
사용일 vs 만료일처럼 두 속성을 서로 비교하는 조건도 지원합니다. 조건 행에서 “다른 속성과 비교”를 켜고 값 대신 다른 속성을 고르면 됩니다.
예: 마지막 coupon_use일 — “이전이거나 같은 날” — coupon_expiry = "만료일 안에 사용한 회원". 날짜는 날짜끼리, 숫자는 숫자끼리만 비교됩니다.
주의특정 쿠폰만 구분하려면
이벤트의 파라미터 값(coupon: 'SUMMER10')으로는 세그먼트가 되지 않습니다. 특정 쿠폰만 대상으로 하려면 이벤트명 자체를 나누거나(coupon_use_summer), 쿠폰 단위로 세그먼트를 따로 만드세요. 단, 이벤트명 종류는 조직 상한(기본 50종)을 넘지 않게 하세요.

대상자 갱신 주기

세그먼트는 매일 한 번 전체를 다시 계산합니다. 오늘 등급이 바뀐 회원은 다음 계산 시점에 반영됩니다.

참고미리보기는 실시간입니다
조건을 만들 때 표시되는 예상 대상자 수는 그 자리에서 계산됩니다. 대상이 아주 많으면 "N명 이상"으로 표시되며, 실제 발송 대상은 매일 계산되는 전체 결과를 사용합니다.
주의발송 직전에 조건을 바꿨다면
조건을 수정한 직후 바로 발송하면 이전 계산 결과로 나갈 수 있습니다. 수정 후에는 세그먼트 화면에서 재계산을 실행하고 대상자 수를 확인한 뒤 발송하세요.

탈퇴 회원 처리

SDK withdraw()로 탈퇴 처리된 회원은 개인정보와 커스텀 속성이 즉시 삭제되고 모든 세그먼트에서 자동으로 빠집니다. 행동 기록도 함께 삭제되므로 재가입 시 이전 이력이 조건에 잡히지 않습니다.

사용자 식별 & 수신동의 API에서 자세한 내용을 확인하세요.

트러블슈팅

증상확인할 것
커스텀 속성이 조건 목록에 없음 해당 키로 identify()를 최소 한 번 보냈는지 확인하세요. 조직에 실제로 저장된 키만 목록에 나타납니다
날짜 조건에 아무도 안 걸림 날짜 형식이 YYYY-MM-DD인지 확인하세요. 다른 형식은 인식되지 않아 조건에서 제외됩니다
등급 조건에 일부만 걸림 대소문자를 확인하세요. goldGold는 다른 값으로 취급됩니다
구매 조건에 안 걸림 구매 전환을 기록하기 전에 identify()가 호출되었는지, 전환 목표가 purchase로 기록되는지 확인하세요
커스텀 이벤트가 조건에 안 보임 ① 이벤트 전에 identify()로 로그인됐는지, ② 조직 이벤트 종류 상한(기본 50종)을 넘지 않았는지 확인하세요. 상한을 넘은 새 이벤트명은 집계되지 않습니다
누적 구매액(LTV)이 실제보다 작음 ① 배포 이전 구매는 합산되지 않습니다(집계는 도입 시점부터), ② 조직 기준 통화와 다른 통화의 구매는 합계에서 제외됩니다. 환불도 차감되지 않습니다(총 구매액 기준)
전화번호/이메일 = 조건에 안 걸림 암호화 저장이라 값 비교는 되지 않습니다. 있음/없음으로만 조건화하세요
대상자 수가 어제와 다름 정상입니다. 조건에 맞는 사람이 매일 다시 계산되므로 자연스럽게 변동합니다