> 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/sdk/user-identifier.md).

# User Identifier & Properties

## Identifier

{% hint style="info" %}
For the meaning and importance of User Identifiers and guidelines for choosing one, refer to the [Managing User Identifiers](/en/getting-started/user-identifier.md) document.
{% endhint %}

The User Identifier is used to uniquely identify a user.\
You can manage User Identifiers through the Hackle SDK.

<table><thead><tr><th width="199.671875">Category</th><th>Description</th></tr></thead><tbody><tr><td><a href="/pages/UdqQgqweP4X89oJwqpmf">Client</a></td><td>The client manages User Identifiers internally.<br>The client uses two main types of identifiers.<br>- The Device ID provided by the Hackle SDK<br>- Custom identifiers</td></tr><tr><td><a href="/pages/HfUDxx8Kl2fndaP3rIUj">Server</a></td><td>The server does not manage User Identifiers internally.<br>A User Identifier must always be passed for every server request.</td></tr></tbody></table>

## Property

The Hackle SDK supports adding properties to the User object.\
By sending user-specific information as User Properties, you can reduce repetitive coding while making rich use of them in A/B Tests and data analytics.

* Properties must be sent as key-value pairs (Property Key and Property Value).
* A maximum of 128 properties can be added.

<table><thead><tr><th width="133.04296875">Category</th><th width="127.60546875">Type</th><th>Constraints</th></tr></thead><tbody><tr><td>Property Key</td><td><code>string</code></td><td><ul><li>Character limit is 128 characters.</li><li>Case-insensitive.</li><li>For example, AGE and age are recognized as the same Property Key.</li></ul></td></tr><tr><td>Property Value</td><td><code>boolean</code>, <code>string</code>, <code>number</code>, <code>array</code></td><td><ul><li>For string type, the character limit is 1024 characters.</li><li>String type is case-sensitive.</li><li>For example, APPLE and apple are recognized as different Property Values.</li><li>For number type, up to 15 integer digits and up to 6 decimal places are supported.</li></ul></td></tr></tbody></table>

### Example

The User object is used as a parameter in variation distribution, Feature Flag decisions, and event tracking. The example below shows three properties (`age`, `grade`, `is_paying_user`) being added.

```java
import io.hackle.android.HackleApp
import io.hackle.sdk.common.User
import io.hackle.sdk.common.Variation

User user = User.builder()
  	.userId(userId)
    .property("age", 30)
    .property("grade", "GOLD")
    .property("is_paying_user", false)
    .build();

// Variation distribution
Variation variation = hackleApp.variation(experimentKey, user);

// Feature Flag decision
boolean featureOn = hackleApp.isFeatureOn(featureKey, user);

// Event tracking
hackleApp.track(event, user);
```

```kotlin
import io.hackle.android.Hackle
import io.hackle.sdk.common.User
import io.hackle.sdk.common.Variation

val user = Hackle.user() {
  	userId(userId)
    property("age", 30)
    property("grade", "GOLD")
    property("is_paying_user", false)
}

// Variation distribution
val variation = hackleApp.variation(experimentKey, user)

// Feature Flag decision
val featureOn = hackleApp.isFeatureOn(featureKey, user)

// Event tracking
hackleApp.track(event, user)
```


---

# 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, and the optional `goal` query parameter:

```
GET https://docs.hackle.io/en/development-guide/sdk/user-identifier.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
