> For the complete documentation index, see [llms.txt](https://help.openloyalty.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.openloyalty.io/integrations-and-data-exchange/custom-fields.md).

# Custom Fields

Custom Fields let you extend members, campaigns, and rewards with your own typed, validated data — no development required.

**Custom Fields** let you extend Open Loyalty objects with your own, typed and validated data — without any development work. You define a field once in the Admin Panel (its name, type, validation rules, and whether it's required), and from that moment it appears on the relevant forms and is available through the API, imports, and exports.

{% hint style="info" %}
**Not the same as Custom Attributes.** Custom Attributes (also called "labels") are the older, flat key-value mechanism still used in some expressions and campaign conditions — see [Custom Attributes](https://help.openloyalty.io/faq/custom-attributes). Custom Fields is the newer, schema-first system described in this section, and is the recommended way to extend member, campaign, and reward data going forward.
{% endhint %}

***

#### 🧩 What makes Custom Fields different

* **Typed, not just text** — a number stays a number, a date stays a date, and a select field only accepts values from a Collection you control.
* **Validated on every write** — from the Admin Panel, the API, or an import.
* **Available across the platform** — Members, every campaign type (Direct, Referral, Automation, Leaderboards, Challenges), and every reward type including Fortune Wheels each get their own schema.
* **Repeatable data on members** — Subgroups let a member hold several rows of the same shape, e.g. a weekly score history.
* **Segmentable** — build member segments on custom field values (contains any/all, ranges, thresholds).
* **Fully wired into your data flow** — values can be set from the Admin Panel, the API, member import, or a dedicated JSON import, and they come back in S3 exports, in campaign/reward webhooks, and in the audit log.
* **Access-controlled** — a separate permission governs who can change the schema, while entering values on entity forms stays available to regular operators.

{% hint style="warning" %}
Custom Fields are released behind their own feature flag for each area. If you don't see **Custom Fields** in your side menu, it isn't enabled for your instance yet.
{% endhint %}

***

#### Where Custom Fields are available

| Module                                                             | Schema per                            | Subgroups (repeatable rows) |
| ------------------------------------------------------------------ | ------------------------------------- | --------------------------- |
| Members                                                            | one schema shared across all members  | ✅ Yes                       |
| Campaigns — Direct, Referral, Automation, Leaderboards, Challenges | one separate schema per campaign type | ❌ No                        |
| Rewards (all reward types) and Fortune Wheels                      | one separate schema per reward type   | ❌ No                        |

***

#### 🏗️ Structure: groups, fields, subgroups

* **Group** — a named container for fields, e.g. `driving_insights`, `insurance`. Every field belongs to a group.
* **Field** — a single typed value inside a group.
* **Subgroup** — a repeatable set of fields (an array of objects), available for **Members only**. Use it when a member needs several rows of the same structure, e.g. `Owned Vehicles`, each row holding its own Plate No, VIN and Make.

Subgroups can't be nested, and they only accept simple field types — a subgroup can't contain another subgroup or a select/multi-select field.

#### Available field types

<table><thead><tr><th width="159.60546875">Type</th><th>Description</th></tr></thead><tbody><tr><td>String</td><td>Free text, with optional validation (max length, regular expression)</td></tr><tr><td>Number</td><td>Numeric value, with optional min/max</td></tr><tr><td>Boolean</td><td>True / false</td></tr><tr><td>Date</td><td>A calendar date</td></tr><tr><td>Single select</td><td>One value picked from a Collection</td></tr><tr><td>Multi select</td><td>Several values picked from a Collection</td></tr><tr><td>Subgroup</td><td>Repeatable rows of simple fields — <strong>Members only</strong></td></tr></tbody></table>

***

#### In this section

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Setting Up Custom Fields</strong></td><td>Creating groups, fields, and subgroups</td><td><a href="/integrations-and-data-exchange/custom-fields/setting-up-custom-fields.md">Setting up Custom Fields</a></td></tr><tr><td><strong>Custom Fields for Members</strong></td><td>Entering and viewing values on member profiles</td><td><a href="/integrations-and-data-exchange/custom-fields/setup-for-members.md">Setup for Members</a></td></tr><tr><td><strong>Segmenting on Custom Fields</strong></td><td></td><td><a href="/integrations-and-data-exchange/custom-fields/segmenting-on-custom-fields.md">Segmenting on Custom Fields</a></td></tr><tr><td><strong>Custom Fields for Campaigns, Leaderboards &#x26; Challenges</strong></td><td></td><td><a href="/integrations-and-data-exchange/custom-fields/setup-for-campaigns.md">Setup for Campaigns</a></td></tr><tr><td><strong>Custom Fields for Rewards &#x26; Fortune Wheels</strong></td><td></td><td><a href="/integrations-and-data-exchange/custom-fields/setup-for-rewards-and-fortune-wheels.md">Setup for Rewards and Fortune Wheels</a></td></tr><tr><td><strong>Permissions</strong></td><td></td><td><a href="/integrations-and-data-exchange/custom-fields/permissions.md">Permissions</a></td></tr></tbody></table>


---

# 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://help.openloyalty.io/integrations-and-data-exchange/custom-fields.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.
