> For the complete documentation index, see [llms.txt](https://help.usejimo.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.usejimo.com/docs/analyze/users-and-segments/data-management/attributes/create-a-custom-attribute.md).

# Create a custom attribute

**Dashboard path:** [Users & Segments > Data Management > Attributes](https://i.usejimo.com/data/attributes) > **+ New Attribute**

## Why this page exists

Creating an attribute used to be engineering work end to end. A developer hand-wrote the SDK call, and until someone pushed it, the attribute did not exist in Jimo at all.

So a product team wanting a new field to segment on had to file a ticket and wait for a sprint slot, even though the part that needed product judgment, deciding the attribute and its type, took a minute.

<figure><img src="/files/OmKmYksN3GBGXDkJ46r8" alt=""><figcaption></figcaption></figure>

Now the two are split. **You define the attribute here. Your engineers only implement it.**

{% stepper %}
{% step %}

## Define it

<figure><img src="/files/78I9TxhWhaYgJzo6r0N0" alt=""><figcaption></figcaption></figure>

| Field                      |                                                                                                                                                               |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Display name**           | The human label. *Can be changed later.*                                                                                                                      |
| **Code name**              | The exact key your app will send. *Can NOT be changed later.* This one ispermanent.                                                                           |
| **Description** (optional) | What it holds. Shown under the display name everywhere.                                                                                                       |
| **Data type**              | Editable later, but changing it does not convert the values already stored. See [Attributes](/docs/analyze/users-and-segments/data-management/attributes.md). |

### The five data types

<figure><img src="/files/wmJ31QQsx8A280ILmlJQ" alt=""><figcaption></figcaption></figure>

| Type              | For             | Example               |
| ----------------- | --------------- | --------------------- |
| **Text**          | strings         | `"en"`, `"Pro"`       |
| **Number**        | numeric values  | `42`                  |
| **Datetime**      | dates           | `"2024-06-15"`        |
| **True or false** | booleans        | `true`                |
| **List**          | multiple values | `["edit", "publish"]` |

The type decides which operators you get in the [segment builder](/docs/analyze/users-and-segments/audience/segments/create-a-segment.md#the-condition-builder). A Datetime gives you `is within the last (days)`. A Text does not.

{% hint style="danger" %}
**The code name is locked from the moment you hit Create, forever.**

It is the key your app sends. Changing it would orphan everything already pushed under the old one. The only way out is to delete the attribute and recreate it, which clears the stored data until your app pushes it again.

Take the extra minute now.
{% endhint %}

{% hint style="info" %}
**The data type is not permanent, but it is not retroactive either.** You can change it later: that changes the operators you get in the segment builder, not the values already stored. Picking the right one now still saves you a data refresh later. See [Attributes](/docs/analyze/users-and-segments/data-management/attributes.md).
{% endhint %}
{% endstep %}

{% step %}

## Install it

The attribute lands in **Pending**. It holds nothing yet, and it is not usable anywhere.

<figure><img src="/files/6p1IIayv4t9hLwxALvdd" alt=""><figcaption></figcaption></figure>

**Install Attributes** opens the snippet:

```javascript
/**
 * Jimo Custom User Attributes
 * Docs: https://help.usejimo.com/docs/analyze/users-and-segments/users/attributes
 * SDK setup guide: https://help.usejimo.com/docs/for-developers/for-developers/sdk-guides/setup-the-segmentation
 */
window.jimo.push(['set', 'user:attributes', [{
  /**
   * Attribute Name: Example_new (Code name: example_new)
   * Type: Text, e.g. "en"
   */
  example_new: "YOUR_VALUE",
}]]);
```

*Add this snippet where you send user data to Jimo so these attribute values are received.*

<figure><img src="/files/jkMe4hD1qRGNzHFi5caT" alt=""><figcaption></figcaption></figure>

Jimo writes the exact key and a value format matching the type you picked. Your engineers replace `YOUR_VALUE` with the real value from your systems.

**Send to Developer** hands it over without a copy-paste round trip, it automatically drafts an email ready to send.

{% hint style="info" %}
**Where to put it.** Wherever you already send user data to Jimo. If you have no such place yet, start with [Setup the segmentation](/docs/for-developers/for-developers/sdk-guides/setup-the-segmentation.md).

Push your `set` commands before your `identify` call: everything is buffered and applied in order once the profile is initialized. See [Identify users](/docs/for-developers/for-developers/sdk-guides/identify-users.md).
{% endhint %}
{% endstep %}

{% step %}

## Watch it go Active

Once Jimo receives a value for that key, the attribute moves almost instantly to **Active** on its own. Nothing to click.&#x20;

From that moment it shows up in the [Users filter](/docs/analyze/users-and-segments/audience/users/filter-users.md), the [segment builder](/docs/analyze/users-and-segments/audience/segments/create-a-segment.md#the-condition-builder) and the [Who](/docs/publish/target-right-people-who.md) step.

{% hint style="success" icon="rotate" %}
It takes generally less than a few second for attributes to actualize in the dashboard.
{% endhint %}

### It stays Pending

Three usual suspects, in order of likelihood:

1. **The code name does not match.** Character for character, case included.
2. **The snippet does not run for real users.** It is on a page they never reach, or behind a condition.
3. **The users are not identified.** No profile, nothing to attach the value to. See [Identify users](/docs/for-developers/for-developers/sdk-guides/identify-users.md).
   {% endstep %}
   {% endstepper %}

## Related pages

* [Attributes](/docs/analyze/users-and-segments/data-management/attributes.md): the full list and what each column means
* [Setup the segmentation](/docs/for-developers/for-developers/sdk-guides/setup-the-segmentation.md): the SDK reference
* [Imports](/docs/analyze/users-and-segments/data-management/imports.md): create custom attributes from a CSV instead
