# CRM Properties

CRM Properties are stored securely only on the Hackle server and cannot be directly retrieved via the SDK.

{% hint style="danger" %}
CRM Properties are managed separately and are not deleted or reset when `resetUser()` is called or when `clearAll` is called in `updateUserProperties`.

If a user unregisters or similar, you must call the separately provided function to delete the information.
{% endhint %}

## Phone Number Collection

{% hint style="info" %}
This feature is supported in React SDK version 11.42.0 and above.
{% endhint %}

{% hint style="success" %}
Kakao / Text Message Recommendation

By mapping user identifiers to phone numbers using this feature, you can use Hackle's Kakao / Text Message more smoothly.
{% endhint %}

#### setPhoneNumber

Registers the user's phone number.

The phone number is stored only if it is a valid E.164 format. If no country code is specified, South Korea (+82) is used as the default.

If the user already has a stored phone number, calling this function replaces the existing phone number with the new value.

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

#### unsetPhoneNumber

Deletes the phone number registered to the user.

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

## CRM Marketing Subscription Consent

{% hint style="info" %}
This feature is supported in React SDK version 11.45.0 and above.

For detailed information about subscription consent status, refer to the [CRM Message Subscription Consent Management](/en/development-guide/sdk/user-identifier/crm-subscription.md) documentation.
{% endhint %}

### Subscription Consent Properties

You can subscribe or unsubscribe per message purpose.

Use `HackleSubscriptionOperationsBuilder` to configure the consent status for the desired properties, then perform the final update using a method like `updatePushSubscriptions()`.

You can update the consent status per message channel.

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

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

hackleClient.updatePushSubscriptions(operations);
```

#### Promotional Messages

Sets the promotional message subscription consent property.

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

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

hackleClient.updatePushSubscriptions(operations);
```

#### Informational Messages

Sets the informational message subscription consent property.

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

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

hackleClient.updatePushSubscriptions(operations);
```

<table><thead><tr><th width="224.09765625">HackleSubscriptionStatus</th><th>Description</th></tr></thead><tbody><tr><td><code>UNKNOWN</code></td><td>Subscription Consent has not been given or denied (<code>default</code>)</td></tr><tr><td><code>SUBSCRIPTION</code></td><td>Explicitly opted in to receive messages</td></tr><tr><td><code>UNSUBSCRIPTION</code></td><td>Explicitly opted out of receiving messages</td></tr></tbody></table>

### Updating Push Message Subscription Consent Status

Updates the user's Push Message subscription consent status.

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

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

hackleClient.updatePushSubscriptions(operations);
```

### Updating Kakao Message Subscription Consent Status

Updates the user's Kakao Message subscription consent status.

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

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

hackleClient.updateKakaoSubscriptions(operations);
```

### Updating Text Message Subscription Consent Status

Updates the user's Text Message / SMS subscription consent status.

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

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

hackleClient.updateSmsSubscriptions(operations);
```


---

# 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/en/development-guide/react/user-identifier/react-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.
