# Attributes & events

Attributes are the fields that describe a contact; events are the timestamped actions that build their activity. This page covers attribute types and data types, system vs custom attributes, unique attributes and automatic merging, attribute limits and actions, and the full event catalog with where events come from.

**Language:** en
**Audience:** platform
**Translation key:** platform.audience.attributes-events
**Search keywords:** attribute, attributes, custom attribute, system attribute, primary attribute, ad-hoc attribute, event-based attribute, unique attribute, read only attribute, data type, text, number, date, yes/no, currency, create attribute, edit attribute, delete attribute, set as unique, merge, deduplication, event, events, activity, event categories, event schema, event parameters, schema, data schema, subscription attributes
**Related pages:** /platform/es/audience/attributes-events, /platform/en/audience, /platform/en/audience/segments, /platform/en/data-sources, /platform/en/consent
**Docs index (every page):** https://docs.instasent.com/llms.txt
**This zone's index:** https://docs.instasent.com/platform/en/llms.txt
**This page:** https://docs.instasent.com/platform/en/audience/attributes-events/ (HTML) · https://docs.instasent.com/platform/en/audience/attributes-events.md (Markdown)
**Other language (es):** https://docs.instasent.com/platform/es/audience/attributes-events.md

Everything you know about a contact is stored in two ways. **Attributes** are what a contact
*is*: their fixed fields — name, phone, country, total spent — overwritten whenever a newer value
arrives. **Events** are what a contact *did*: timestamped actions — an order, a click, an
abandoned cart — that pile up over time and form their history. Together, attributes and events
are the raw material you segment your audience and personalize messages on.

Attributes are managed on the **Attributes** screen, which you reach from **Settings › Project ›
Attributes**, from a contact's profile, or via the URL `/customer-data/attributes`.

![The attributes manager listing the project's attributes with their description, format (data type) and type (Custom or Primary), plus the Create attribute button and Type / Format filters](/platform/en/audience/images/attributes-events--1-attributes-manager.png)
*The attributes manager: every field in the project's schema, with its data type and whether it's custom or system-provided.*

## Attributes

An attribute is a field on every contact — a name, a phone number, a country, a total spent. The
attributes manager lists each one with its description, its **Format** (data type) and its
**Type** (Custom or Primary), and a count of how many you have (for example, *You have 81
attributes*). Rows can be reordered by dragging, except the pinned **Full name**.

### Type: custom, system and read-only

The **Type** column carries one of two badges, **Custom** or **Primary**, but there are really
four kinds of attribute, and what you can do with each differs:

- **Custom** — the ones you add for your own data. They're fully editable (name, description,
  type) and can be deleted.
- **Primary / system** — the built-in fields Instasent maintains (full name, mobile phone,
  email, country, the e-commerce totals, and so on). Their names start with an underscore
  (`_full_name`, `_phone_mobile`, `_email`). You can **View details** but not rename, retype or
  delete them.
- **Ad-hoc** — fields brought in by an integration (for example, the Klaviyo client ID). They're
  read-only and can't be deleted, and they **don't count toward your custom-attribute limit**.
- **Event-based / e-commerce** — read-only fields created in bulk the first time e-commerce
  order events arrive (totals, averages, last-order date, predictions). They can't be edited or
  deleted.

The **Type** column only ever shows two badges: ad-hoc and event-based / e-commerce fields also
carry **Custom** (what sets them apart from an editable custom attribute is their read-only
constraints, not the badge). A **constraints** column flags attributes that are **Unique** or
**Read only**, and a line under each shows which data sources set it up.

### Data types

Each attribute has a data type — its **Format** — that decides how it behaves in filters and
personalization:

| Format       | Examples                                                                                               |
| ------------ | ------------------------------------------------------------------------------------------------------ |
| **Text**     | Plain text, with length variants (keyword up to 40, string up to 128, long text up to 512 characters). |
| **Number**   | Integer, decimal (1–3 places), and units like days or hours.                                           |
| **Date**     | Date, datetime, time and timezone.                                                                     |
| **Yes/No**   | A boolean field.                                                                                       |
| **Currency** | A monetary amount (EUR), used by the e-commerce totals.                                                |

The data type is what determines which [operators](/platform/en/audience/segments#operators-by-field-type)
you get when you filter on the attribute.

### Creating and editing attributes

You can create a custom attribute with **Create attribute** on the Attributes screen, or on the
fly while mapping the columns of an import (see [Data sources](/platform/en/data-sources)). When
creating or editing:

- The **display label is required, 2 to 50 characters**, and the description is up to **128
  characters**.
- A data type is required. When editing, only custom attributes can change, and the type can
  only be changed to a compatible one.
- The identifier (uid) is read-only; you can copy it.

Each attribute's actions menu offers **Edit** / **View details**, **Duplicate**, **Copy ID**,
**Set as unique** (when eligible) and **Delete** (only for custom attributes whose id doesn't
start with `_`).

> **Note**: You can edit a contact's *value* for any attribute from their
> [profile](/platform/en/audience/contacts-profiles). What you can't change for a system
> attribute is its *definition* — its name and type.

### Unique attributes and automatic merging

An attribute can be marked **unique** (the **Set as unique** action). When it is, Instasent uses
it as an identity key: if data arrives with the same value in a unique attribute, **all contacts
with that value are merged automatically** into a single profile instead of creating duplicates.

Marking an attribute unique is a one-time, irreversible action — the dashboard confirms it: *All
contacts with the same value in {attribute} will be merged automatically. This action cannot be
undone.* Empty values are never merged. By default the mobile phone and the email act as unique
keys, which is how a person who reaches you through several sources stays one contact.

### Limits

The number of **custom attributes** you can create depends on your plan; ad-hoc and event-based
attributes don't count toward it. {/* VERIFY: exact custom-attribute limit per plan */} Some
attributes are multi-valued, with their own caps (for example, subscriptions up to 50, and
deals or automations up to 100). Length limits depend on the text type: keyword 40, string 128,
long text 512 characters.

## Events

An **event** is a timestamped action a contact took — a placed order, a campaign click, an
abandoned checkout, a meeting joined. Events are what fill the contact's
[activity timeline](/platform/en/audience/contacts-profiles#activity) and let you segment on
behaviour.

- **Schema** — each event has a name and a set of typed **parameters** (an order event carries
  its order id, amount, currency, product name and discount code; a coupon event its code,
  value and percentage; a checkout event its amount and product count; and so on). These
  parameters are what you filter on in an *Filter by activity* segment condition, and what you
  can use as variables in a message.
- **Where they come from** — events are fed by your [data sources](/platform/en/data-sources): a
  connector like Shopify or Klaviyo, or the API and webhooks. Each event carries the data source
  it came from. They aren't typed in by hand, which is why they're read-only on the profile.

### Event categories

Events group into families. The catalog is broad — roughly seventy types — and includes:

- **Lifecycle** — created, merged, deleted, updated, subscribed, unsubscribed.
- **General / web** — generic, custom, action, view, active, click, metric.
- **Forms** — form viewed, form submitted.
- **Billing** — payment, refund, chargeback, invoice.
- **Marketing / inbound** — lead, inbound.
- **Campaign** — campaign sent, campaign CTA (click), campaign opened.
- **Automation** — triggered, sent, dispatched, CTA, opened, flow.
- **Transactional** — sent, CTA, opened.
- **E-commerce — products** — product viewed, added, purchased.
- **E-commerce — checkout** — checkout initiated, abandoned, cancelled, updated.
- **E-commerce — orders** — order created, updated, paid, shipped, delivered, cancelled,
  refunded, charged back.
- **E-commerce — coupons** — coupon created, used, removed.
- **Subscriptions** — plan changed, cancelled, renewed.
- **Meetings** — registered, cancelled, joined, left.
- **Deals / CRM** — deal added, updated, won, lost.

E-commerce events only appear for e-commerce projects.

### Exploring activity

You explore events two ways: per contact, in the **Activity** card on the
[profile](/platform/en/audience/contacts-profiles#activity), and project-wide, under **Audience
› Activity**. Both show a timeline you can filter by event type, period (last 30 / 90 days, last
12 months) and date basis (event date vs reception date), with **Recommended events** as the
default selection. Each event opens a drawer with its parameters, attribution (UTM) and general
info, and order/checkout events expand inline for more detail. When nothing matches, the feed
offers to reset the filters.

## Subscription attributes

Among the system attributes is a set that tracks **consent per channel** — whether a contact
accepts marketing and whether they're subscribed on SMS, WhatsApp and so on. These show on the
profile under **Channel preferences**, but the model behind them — what each value means and how
it's enforced — is owned by [Consent](/platform/en/consent). See that section for the full
picture.

Once your schema is in place, put it to work in
[Segments](/platform/en/audience/segments).

---

This is one page of the Instasent documentation. For the complete machine-readable index of every guide and API reference, fetch https://docs.instasent.com/llms.txt — start there for full context.
