# CRM 속성

CRM 속성은 핵클 서버에만 안전하게 저장되며 SDK를 통해 값을 직접 조회할 수는 없습니다.

{% hint style="danger" %}
CRM 속성은 별도로 관리되며, `resetUser()`를 호출하거나 `updateUserProperties`에서 `clearAll`을 호출해도 삭제되거나 초기화되지 않습니다.

사용자가 회원 탈퇴 등을 한 경우, 반드시 별도로 제공되는 함수를 호출하여 정보를 삭제해야 합니다.
{% endhint %}

## 전화번호 수집

{% hint style="info" %}
JavaScript SDK 11.42.0 버전 이상에서 지원하는 기능입니다.
{% endhint %}

{% hint style="success" %}
카카오 / 문자 메시지 권장 사항

이 기능을 이용하여 사용자 식별자와 전화번호를 매핑하면 핵클을 통한 카카오 / 문자 메시지를 더욱 원활히 이용할 수 있습니다.
{% endhint %}

#### setPhoneNumber

사용자의 전화번호를 등록합니다.

전화번호는 올바른 E.164 포맷일 경우에만 저장됩니다. 국가코드를 지정하지 않았다면 대한민국(+82)이 기본값으로 사용됩니다.

이미 저장된 전화번호가 있는 사용자의 경우, 이 함수를 호출하면 기존 전화번호가 새로운 값으로 교체됩니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
const myPhone = '+821012341234';
hackleClient.setPhoneNumber(myPhone);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const myPhone = '+821012341234';
  hackleClient.setPhoneNumber(myPhone);
</script>
```

{% endtab %}
{% endtabs %}

#### unsetPhoneNumber

사용자에게 등록되어 있는 전화번호를 삭제합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
hackleClient.unsetPhoneNumber();
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  hackleClient.unsetPhoneNumber(myPhone);
</script>
```

{% endtab %}
{% endtabs %}

## CRM 마케팅 메시지 수신 동의

{% hint style="info" %}
JavaScript SDK 11.45.0 버전 이상에서 지원하는 기능입니다.

수신 동의 상태에 대한 자세한 내용은 [CRM 메시지 수신 동의 관리](/development-guide/sdk/user-identifier/crm-subscription.md) 문서를 참고해주세요.
{% endhint %}

### 수신 동의 속성

메시지 목적 별로 수신 동의/거부를 할 수 있습니다.

`HackleSubscriptionOperationsBuilder`를 사용해 원하는 속성의 동의 상태를 설정한 후, `updatePushSubscriptions()` 같은 메서드로 최종 업데이트를 진행합니다.

메시지 채널 별로 동의 상태를 업데이트할 수 있습니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .marketing(HackleSubscriptionStatus.SUBSCRIBED)
  .information(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updatePushSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updatePushSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}

#### 광고성 메시지

광고성 메시지 수신 동의 속성을 설정합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .marketing(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updatePushSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updatePushSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}

#### 정보성 메시지

정보성 메시지 수신 동의 속성을 설정합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .information(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updatePushSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updatePushSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}

#### HackleSubscriptionStatus

<table><thead><tr><th width="224.09765625">HackleSubscriptionStatus</th><th>설명</th></tr></thead><tbody><tr><td><code>UNKNOWN</code></td><td>수신 동의/거부를 하지 않음 (<code>default</code>)</td></tr><tr><td><code>SUBSCRIPTION</code></td><td>명시적으로 수신 동의</td></tr><tr><td><code>UNSUBSCRIPTION</code></td><td>명시적으로 수신 거부</td></tr></tbody></table>

### 푸시 수신 동의 상태 업데이트

사용자의 푸시 메시지 수신 동의 상태를 업데이트 합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .marketing(HackleSubscriptionStatus.SUBSCRIBED)
  .information(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updatePushSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updatePushSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}

### 카카오 메시지 수신 동의 상태 업데이트

사용자의 카카오 메시지 수신 동의 상태를 업데이트 합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .marketing(HackleSubscriptionStatus.SUBSCRIBED)
  .information(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updateKakaoSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updateKakaoSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}

### 문자 메시지 수신 동의 상태 업데이트

사용자의 문자 메시지 수신 동의 상태를 업데이트 합니다.

{% tabs %}
{% tab title="JavaScript" %}

```javascript
import { HackleSubscriptionOperationsBuilder, HackleSubscriptionStatus } from "@hackler/javascript-sdk"

const operations = new HackleSubscriptionOperationsBuilder()
  .marketing(HackleSubscriptionStatus.SUBSCRIBED)
  .information(HackleSubscriptionStatus.SUBSCRIBED)
  .build()

hackleClient.updateSmsSubscriptions(operations);
```

{% endtab %}

{% tab title="HTML" %}

```html
<script>
  const operations = new Hackle.HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

  hackleClient.updateSmsSubscriptions(operations);
</script>
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hackle.io/development-guide/javascript/user-identifier/js-user-info-crm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
