> For the complete documentation index, see [llms.txt](https://docs.hackle.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hackle.io/en/development-guide/flutter/user-identifier/flutter-user-info-crm.md).

# CRM Properties

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

{% hint style="danger" %}
CRM Properties are managed separately and are not deleted or reset even if you call `resetUser()` or `clearAll` in `updateUserProperties`.

If a user withdraws their account, you must call the separately provided function to delete the information.
{% endhint %}

## Phone Number Collection

{% hint style="info" %}
This feature is supported in Flutter SDK 2.16.0 and above.
{% endhint %}

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

By using this feature to map the User Identifier to a phone number, you can more seamlessly use Kakao messages and Text Messages through Hackle.
{% endhint %}

#### setPhoneNumber

Registers the user's phone number.

The phone number is stored only if it is in 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.

```dart
String myPhoneNumber = '+821012341234';
HackleApp.setPhoneNumber(myPhoneNumber);
```

#### unsetPhoneNumber

Deletes the phone number registered for the user.

```dart
HackleApp.unsetPhoneNumber();
```

## CRM Marketing Subscription Consent

{% hint style="info" %}
This feature is supported in Flutter SDK 2.20.0 and above.

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

### Subscription Consent Properties

You can subscribe or unsubscribe by message purpose.

Use `HackleSubscriptionOperationsBuilder` to configure the consent state for the desired properties, then finalize the update using methods like `updatePushSubscriptions()`.

You can update the consent state per message channel.

```dart
import "package:hackle/hackle.dart";

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

HackleApp.updatePushSubscriptions(operations);
```

#### Promotional Messages

Sets the subscription consent property for promotional messages.

```dart
import "package:hackle/hackle.dart";

var operations = HackleSubscriptionOperationsBuilder()
    .marketing(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

HackleApp.updatePushSubscriptions(operations);
```

#### Informational Messages

Sets the subscription consent property for informational messages.

```dart
import "package:hackle/hackle.dart";

var operations = HackleSubscriptionOperationsBuilder()
    .information(HackleSubscriptionStatus.SUBSCRIBED)
    .build();

HackleApp.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>

### Update Push Subscription Consent Status

Updates the user's push message subscription consent status.

```dart
import "package:hackle/hackle.dart";

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

HackleApp.updatePushSubscriptions(operations);
```

### Update Kakao Message Subscription Consent Status

Updates the user's Kakao message subscription consent status.

```dart
import "package:hackle/hackle.dart";

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

HackleApp.updateKakaoSubscriptions(operations);
```

### Update Text Message Subscription Consent Status

Updates the user's Text Message subscription consent status.

```dart
import "package:hackle/hackle.dart";

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

HackleApp.updateSmsSubscriptions(operations);
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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/flutter/user-identifier/flutter-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.
