***

title: Custom Inventory Fields
description: How to extend inventory items with your own fields — text, numbers, dropdowns, dates, and more.
---------------------

For clean Markdown of any page, append .md to the page URL. For a complete documentation index, see https://docs.esoapp.co.uk/guides/inventory/llms.txt. For full documentation content, see https://docs.esoapp.co.uk/guides/inventory/llms-full.txt.

Every organisation has different data requirements. Custom fields let you add your own columns to inventory items without touching any code. Once defined, custom fields appear in the inventory list, on the item detail page, in bulk upload, and optionally on printed packing lists.

## Field types

| Type          | What it stores                                   |
| ------------- | ------------------------------------------------ |
| `text`        | Free-form text.                                  |
| `number`      | Numeric value, with optional min/max bounds.     |
| `boolean`     | True / False toggle.                             |
| `date`        | Calendar date (no time).                         |
| `datetime`    | Date and time.                                   |
| `select`      | Single choice from a predefined list of options. |
| `multiselect` | One or more choices from a predefined list.      |

***

## Managing custom fields

Navigate to **Settings → Inventory Fields** to create, edit, or archive fields.

### Creating a field

1. Click **Add Field**.
2. Choose a **type** and provide a **label** (the display name) and a **key** (the internal identifier, auto-generated from the label but editable).
   <Callout intent="warning">
     **The Key is Permanent:** Once a field is created, you can change the **Label**, but you cannot
     change the **Key**. This is because the Key is used to map your data in the database and CSV
     uploads.
   </Callout>
3. Configure type-specific options:
   * For `select` and `multiselect` — define the list of allowed options.
   * For `number` — optionally set a `min` and `max` value.
   * For `text` — optionally provide a validation regex.
4. Toggle **Required** if every item must provide a value for this field.
5. Toggle **Unique** to prevent two items from having the same value.
6. Toggle **Show in table** to make the field visible as a column in the main inventory list.
7. Toggle **Show on packing list** to include the value when printing or exporting a packing list.
8. Set an **Order** index to control where the field appears relative to other custom fields.

### Editing a field

You can update the label, options list, display settings, and order at any time. You cannot change the **key** or **type** once items have stored data against the field.

### Reordering

Use the **Up (↑)** and **Down (↓)** arrows to change the `Order Index`. This determines the sequence in which fields appear in the "Add Inventory" form and the columns in the CSV template.

### Archiving a field

If you no longer need to track a specific field for future projects, click **Archive**.

* **What happens?** The field will be hidden from forms and the bulk upload template.
* **Is data lost?** No. Any inventory items that already have data in this field will keep that data, but no new data can be entered.

## Using custom fields in bulk upload

Custom fields appear as available mapping targets during the bulk upload column-mapping step. If a field is **Required**, the upload will fail validation for any row that does not supply a value for it.

## Filtering by custom fields

The inventory list and packing list views support filtering by a single custom field value at a time. Enter the field key and a value to narrow the results.

## Display Options

You have granular control over where these custom fields appear in your daily workflow:

### Show in Table

Toggle this "On" to add a column for this field in the main **Inventory Dashboard**. This is great for data you need to scan at a glance, like `Container Number`.

### Show on Packing List

Toggle this "On" to include this field in the generated **PDF Packing Lists**. This is vital for data that carriers or customs officials need to see, such as `Seal Numbers` or `Country of Origin`.

***

## Pro-Tip: Data Consistency

If you are tracking something like "Port of Discharge," use a **Select** field instead of **Text**. This prevents "Port of LA" and "Los Angeles Port" from being entered as two different values, making your final reports much cleaner.