# Welcome to the Ninox documentation

Welcome to the Ninox documentation

Choose your Ninox version to view the documentation: the new [**Ninox 4**](/getting-started) or the classic [**Ninox 3**](https://forum.ninox.com/category/docs).

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td><h3><strong>Ninox 4 docs</strong></h3></td><td>Create and improve your apps in <strong>Ninox 4</strong>.<br>Step‑by‑step guides, examples, and tips for working with low‑code and AI.</td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/YruLaQSpup8d3M3bZFPh">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/YruLaQSpup8d3M3bZFPh</a></td><td><a href="/files/R7Aj1MxmRNDRP2UgxNqi">/files/R7Aj1MxmRNDRP2UgxNqi</a></td></tr><tr><td><h3><strong>Ninox 3 docs</strong> <i class="fa-circle-arrow-up-right">:circle-arrow-up-right:</i></h3></td><td>Create and maintain your apps in <strong>Ninox 3</strong>.<br>Step‑by‑step guides, examples, and tips for working with the classic platform.</td><td><a href="https://forum.ninox.com/category/docs">https://forum.ninox.com/category/docs</a></td><td><a href="/files/WEULZSjLgjwP5VTUuVvj">/files/WEULZSjLgjwP5VTUuVvj</a></td></tr></tbody></table>

<p align="center"></p>


# Getting started

Find the right starting path for how you use Ninox.

Start with the path that matches how you use Ninox. Most people use Ninox in one of three ways:

* **Users** work in apps created by builders, start with the [User path](/getting-started/user-getting-started/main-elements-of-ninox).
* **Builders** create apps, structure data, and design workflows. Start with the [Builder path](/getting-started/builder-getting-started/quickstart-create-your-first-app).
* **Ninox API users** are builders who also connect Ninox to other systems, use the [Ninox API path](/getting-started/ninox-api-getting-started/intro-to-the-ninox-api).

## **For Users**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4>Main elements of Ninox</h4><p>Start here for the main screens, navigation, and UI areas you use every day.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/bLLLEgSZZyurbP6ZpsG0">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/bLLLEgSZZyurbP6ZpsG0</a></td></tr><tr><td><h4>Basic actions you need to know</h4><p>Learn how to find records, edit data, bookmark items, and work faster in daily use.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/mxncJgM0PeBBAQVoja2u">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/mxncJgM0PeBBAQVoja2u</a></td></tr></tbody></table>

## **For Builders**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4>Quickstart</h4><p>Go from sign-up to a working first app and learn the fastest setup path.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/2ReWLsKVs4zQCjXXibTC">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/2ReWLsKVs4zQCjXXibTC</a></td></tr><tr><td><h4>Set up your Ninox</h4><p>Build an app step by step without AI, so you understand the building blocks.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/gL66J6yl67o6Klwr9Uws">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/gL66J6yl67o6Klwr9Uws</a></td></tr><tr><td><h4>Intro to the Ninox UI</h4><p>Learn where Builder mode, key menus, and the settings panel live in Ninox.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/NyUqAngNwbH74S8arGRU">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/NyUqAngNwbH74S8arGRU</a></td></tr><tr><td><h4>Prompting</h4><p>Write better prompts to get cleaner tables, fields, and relationships from the AI.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/sQpU0Q4OKWj0ZfjQKBVG">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/sQpU0Q4OKWj0ZfjQKBVG</a></td></tr><tr><td><h4>Glossary</h4><p>Use this as a reference for Ninox terms whenever something is unclear.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/d0lbnjzXe6JB4OegpP9T">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/d0lbnjzXe6JB4OegpP9T</a></td></tr></tbody></table>

## **For Ninox API users**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4>Intro to the Ninox API</h4><p>Start here to understand the API and when to use it.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/5SVl8S5byoAaB6CX8KvM">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/5SVl8S5byoAaB6CX8KvM</a></td></tr></tbody></table>


# Main elements of Ninox

Learn the main screens and UI areas you use every day in Ninox.

If you use Ninox to enter, review, update, and follow data, you are a user. A builder creates or changes the structure behind that work. Builders define tables, fields, pages, automations, and permissions.

This page is for users. It helps you understand where your work happens in Ninox and which areas matter in daily use. For more guidance and documentation, visit the [User Hub](https://app.gitbook.com/o/yI8eJ2eecPOm72cxYjt5/s/BmcFtwhLmWInCVTaddAT/).

It helps to know three terms from the start.

* An **organization** is the top level for your team.
* A **workspace** holds the apps, data, and settings for one area of work.
* An **app** brings together the data, business logic, and user interface.

In daily use, you usually move between one workspace and one or more apps inside it. Exactly how this feels depends on how the builder of the app you use has designed it.

## **Where you spend most of your time**

Most of your day starts in the navigation on the left. From there, you can switch workspace, return to **Home**, open an app, or go to **Profile** and **Settings**. If you belong to more than one workspace, this is where you change context.

Once you open an app, the navigation inside it helps you move between the tables and pages that belong to that app. This is the fastest way to move through your work.

On the app screen, the main working area is often a table. The current table shows records in rows and fields in columns.

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

Depending on how you prefer to work, you can either edit directly in the table with **Inline editing** turned on or open records one by one in the form view.

* A **record** is one complete entry, such as one contact, one task, or one invoice.
* A **field** stores one part of that record, such as a name, date, or status.

In practice, this is where you:

* search for records
* filter lists
* scan statuses
* update values
* create new records, if your role allows it

## **Work with one record in detail**

When you open a record, Ninox often shows the **form view**. This is the detailed view of one record. It presents the information like a form, with a clearer layout that can be easier to navigate than a table.

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

The form view is useful when you want to:

* read all information for one item
* edit with more space
* check related files or history
* bookmark an important record with the star icon

If you need to focus on one item at a time, this is usually the most comfortable place to work. As an alternative, you can turn on **Inline editing** and work directly in the table without opening the form view. Use the **Inline editing** toggle above the table to switch between editing in the grid and editing one record at a time in the form view.

## **Use other helpful areas in daily work**

Outside the current app, **Home** is the central place for the current workspace. Click the <i class="fa-house">:house:</i> home button in the main navigation to access it.

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

It helps you jump back to the apps you use, but it also gives you access to other useful areas.

* [**Bookmarks**](/user-hub/ninox-basics/bookmarks) keeps important records close.
* [**History**](/user-hub/ninox-basics/history) helps you understand what changed and when.
* [**Documents**](/user-hub/ninox-basics/documents) gives you access to files stored in the workspace.
* [**Inbox**](/user-hub/common-tasks/work-with-emails) may appear if your workspace uses email in Ninox.

These areas are useful when you are not just updating one table, but trying to keep track of your work more broadly.

## **Why your screen may look different**

Not every user sees the same options in Ninox. What you can open, edit, create, or delete depends on your permissions.

So if a button or action is missing, that does not always mean you are in the wrong place. It can simply mean your role does not allow that action.

## **Use Profile and Settings**

You will also see **Profile** and **Settings** in the left navigation.\
Use [**Profile**](/user-hub/administration/manage-your-profile) for your own account details, such as your name, email, or sign-in information.\
Use **Settings** when you need to review user, workspace, or organization information that you are allowed to access.\
As a user, you usually go there to check information, not to change how Ninox is structured.


# Basic actions you need to know

Learn the core actions users perform every day in Ninox.

Most daily work in Ninox comes down to a few simple actions. Once these feel familiar, moving around the product becomes much easier.

## **Find where you need to work**

You usually start in the navigation on the left.

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

Use the **Global menu** 1️⃣ if you need to switch to a different workspace or organization. Use **Home** 2️⃣ to return to the current workspace, and open the app you need from the app list. Inside the app, move between tables or pages with the navigation in the app itself.

Exactly how this looks depends on how the builder of the app you use has designed it, but the basic flow stays the same: first open the right workspace, then open the right app, then go to the table or page where your work is waiting.

## **Find, review, and update records**

Often you work in a table. This is where you search for records, scan lists, and update information.

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

The tools above the table help you find, organize, and update records:

* **Search in records** is best for quick lookups.
* **Hidden columns** helps when the table feels too busy.
* **Import/export** lets you bring data in or download it.
* **Inline editing** switches between editing in the grid and in the form view.
* **Add record** creates a new record, if your role allows it.

When you open a record, you either work directly in the table or in the **form view** at the side. If **Inline editing** is turned on, you can edit directly in the grid. If it is turned off, Ninox opens the record in the form view instead. The form view gives you more space and context, so it is often easier when you want to focus on one item properly.

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

### Use the table context menu <a href="#use-the-table-context-menu" id="use-the-table-context-menu"></a>

Right-click anywhere in the table to open the context menu. Use it for quick clipboard and selection actions without leaving the grid.

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

The menu includes:

* **Copy** to copy the current selection
* **Paste** to paste copied content into the table
* **Select all** to select all data in the current table view
* **Clear selection** to remove the current selection
* **Invert selection** to invert which cells are selected

This is useful when you want to copy values, prepare a larger selection, or adjust a selection before editing.

### Use actions for selected records <a href="#use-actions-for-selected-records" id="use-actions-for-selected-records"></a>

When you select one or more records, Ninox shows extra actions above the table. Use these actions to work with the current record selection.

Depending on your permissions and setup, this can include:

* **Clear selection** to unselect the current records
* **Bookmark records** to add the selected records to your bookmarks
* **Delete records** to remove the selected records

These actions help when you want to manage several records at once without opening them one by one.

{% hint style="info" %}
What you can open, edit, create, or delete depends on your permissions and on how your workspace is set up.
{% endhint %}

## **Keep important things close**

Some areas in Ninox help you stay organized beyond the current table. Access them from the <i class="fa-house">:house:</i> **Home** button.

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

### Use bookmarks

Use **Bookmarks** to keep important records close and get back to them fast.

On the **Bookmarks** screen, bookmarked records appear as cards.

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

Open a card to open the **form view** and keep working. Remove a bookmark with the **X** on the card or by clicking the **star icon** again in the **form view**. This removes only the bookmark. The record stays in your database.

To bookmark a record while working in a table:

1. Open the record in the **form view**.
2. Click the **star icon** at the top.
3. Open **Home** and select **Bookmarks** to find it again.

Learn more in [**Bookmarks**](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history#bookmarks).

### Keep track of your documents

Open **Documents** from **Home** when you need one place to store, find, and reuse files in the current workspace.

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

This screen helps you keep workspace files organized, easy to search, and available to everyone who needs them. You can upload files, organize them in folders, search by file name, and download files again when you need them. The file list helps you scan what is stored in the workspace.

You can also move files, rename them, and delete them when they are no longer needed. Deleted files move to the **Recycle bin**, where you can restore them or remove them permanently.

Learn more in [**Documents**](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history#documents).

### Check the history

Open **History** from **Home** when you need one place to review recent changes across the workspace.

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

This screen helps you follow activity, understand who changed what, and check when it happened.

You can search entries and narrow the list by date or user. The newest activity appears first, which makes recent changes easy to review.

History shows when records were created, updated, or deleted. Open an entry to review the record in the **form view** without leaving **History**.

Learn more in [**History**](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history#history).


# Quickstart - create your first app

Go from sign-up to a working first app in minutes with the Ninox AI assistant.

This quickstart shows you how to go from sign‑up to a working first version of your app in just a few minutes.

## **Sign‑up and complete the onboarding** <a href="#complete-the-onboarding-and-sign-up" id="complete-the-onboarding-and-sign-up"></a>

{% stepper %}
{% step %}

#### Open the sign-up page

Open [Ninox 4](https://go.ninox.com/signup/) and start the onboarding flow.
{% endstep %}

{% step %}

#### Create your account

Sign up with your email address and create a password. Or use one of the sign‑in options.
{% endstep %}

{% step %}

#### Answer the onboarding questions

Answer the questions shown during onboarding. These answers help Ninox tailor your workspace and suggestions.
{% endstep %}
{% endstepper %}

Once you finish onboarding, you land on the blank app creation screen, where you can start creating your first app, either by describing it to Ninox AI or by setting up your data model manually.

<figure><img src="/files/CkPJgHp81izNukyYWqUL" alt="Blank app creation screen"><figcaption></figcaption></figure>

## **Describe your app to the Ninox AI assistant** <a href="#describe-your-app-to-the-ninox-ai-assistant" id="describe-your-app-to-the-ninox-ai-assistant"></a>

{% stepper %}
{% step %}

#### Enter your app description

In the **Ninox AI assistant** panel, use the **Describe what you want to create** field.
{% endstep %}

{% step %}

#### Choose or improve your prompt

Select a pre-created prompt such as **Vacation planner** or **HR tracker**. Or enter your own prompt.

If the prompt is too vague, click **Improve message**. Use the refined version, then submit it.
{% endstep %}

{% step %}

#### Review the generated app structure

Ninox AI analyzes your description and generates:

* Tables, for example, "Employees", "Onboarding", "Absences"
* Fields for each table, such as "First name", "Email", "Start date"
* Relationships between tables
* A **Dashboard** page as the first entry in the app navigation
  {% endstep %}
  {% endstepper %}

You now have an automatically generated starting point for both your data model and your app structure.

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

## **Refine the generated data model** <a href="#refine-the-generated-data-model" id="refine-the-generated-data-model"></a>

You stay in full control of your data model. Use Ninox AI as a starting point and adjust them as needed.

### **Refine your prompt**

If the generated data model is not close enough to what you imagined:

{% stepper %}
{% step %}

#### Update your description

In the **Ninox AI assistant**, revise your prompt.

For example, add: “Integrate a separate table for Team Managers”.
{% endstep %}

{% step %}

#### Submit the improved prompt

Send the updated prompt to generate a new result.
{% endstep %}

{% step %}

#### Review the updated suggestions

Check whether the revised tables, fields, and relationships match your needs.
{% endstep %}
{% endstepper %}

<figure><img src="/files/1BQFKDT8XsjivB0qgDmZ" alt=""><figcaption></figcaption></figure>

### **Manually adjust tables and fields**

You can change any part of the data model at any time. You can edit or delete existing tables and fields created by AI.

#### **Create additional tables**

{% stepper %}
{% step %}

#### Start a new table

Click **Create table** in the top bar.
{% endstep %}

{% step %}

#### Enter a descriptive table name

Add a clear name in **Name**.

Clear names such as “Customer subscriptions” help Ninox AI suggest better fields.
{% endstep %}

{% step %}

#### Enable AI suggestions if needed

Keep **AI suggestions** enabled if you want Ninox to propose fields for the new table.
{% endstep %}

{% step %}

#### Review the suggested fields

Keep, remove, or add fields as needed.
{% endstep %}

{% step %}

#### Create the table

Click **Create table** to confirm.
{% endstep %}
{% endstepper %}

#### **Add new fields to an existing table**

{% stepper %}
{% step %}

#### Create a new field

Click **Create field** in the top bar.
{% endstep %}

{% step %}

#### Choose the target table

Select the **Target table**, for example, "Employees".
{% endstep %}

{% step %}

#### Enter the field details

Add a **Field name**.

Adjust the auto-generated **Internal name** if needed. The internal name is used in automations, so keep it stable and avoid special characters.
{% endstep %}

{% step %}

#### Choose the field type

Pick the **Field type** that best fits your data.

* **Standard fields**: Text, Multi‑line text, Number, Yes/no, Single‑choice, Multiple choice, File
* **Contact fields**: Email, Phone, URL, Location
* **Date and time fields**: Date, Date and time, Appointment, Time, Duration
* **Special fields**: Color, Icon, User
* **Relationship fields**: ←Link many records, →Link one record
  {% endstep %}

{% step %}

#### Save the field

Click **Add field** or **Add another field**.
{% endstep %}
{% endstepper %}

You can always return to the data model later to add new fields, change types, or restructure tables as your app evolves.

## Create your app <a href="#create-your-app" id="create-your-app"></a>

{% stepper %}
{% step %}

#### Decide whether to use sample data

Keep **Use sample data** enabled if you want Ninox to create dummy records.\
This helps you see how the app behaves with realistic example data.
{% endstep %}

{% step %}

#### Create the app

When your data model is ready, click **Create app**.\
Ninox generates the first working version of your app.
{% endstep %}
{% endstepper %}

Do not worry about getting everything perfect now. You can adjust your tables, fields, relationships, and field types at any time.

You now have a solid first version of your app. The app navigation includes the generated tables and an autogenerated **Dashboard** as the first entry. The generated dashboard can include charts, stats, and other views based on your prompt and sample data.\
You are now ready to continue configuring views, forms, and automations.

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


# Set up your Ninox manually

Repeat the Quickstart without the AI assistant to set up your organization, build your first app, add automations, and invite your team.

Set up Ninox manually and learn the core building blocks behind app creation.

This path walks you through your first organization and workspace, your first app, your first automations, and team access. Work through the chapters in order. Each chapter builds on the previous one.

## **Chapters**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4>Your first organization and workspace</h4><p>Learn how Ninox structures organizations and workspaces, and create your first setup.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/EK2uRj7acB1leArnqjic">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/EK2uRj7acB1leArnqjic</a></td></tr><tr><td><h4>Your first app</h4><p>Build your first app manually by creating tables, fields, and relationships.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/IHJTebNF59IFe25zXlrj">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/IHJTebNF59IFe25zXlrj</a></td></tr><tr><td><h4>Your first automations</h4><p>Add logic and automations so your app calculates values and keeps invoice data stable.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/M4UOzRGvp5ckfRZTO31X">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/M4UOzRGvp5ckfRZTO31X</a></td></tr><tr><td><h4>Invite your team and assign roles</h4><p>Invite users at the right level and assign roles so everyone gets the right access.</p></td><td><a href="/spaces/vgUdF91rY6UMBUb5r9Cl/pages/TL69FcZ59NWHzFcr0F56">/spaces/vgUdF91rY6UMBUb5r9Cl/pages/TL69FcZ59NWHzFcr0F56</a></td></tr></tbody></table>


# Your first organization and workspace

Learn how organizations and workspaces structure your Ninox environment, and how to create them.

In Ninox, the way you structure your data and apps is organized into two main levels: **organization** and **workspaces**. Understanding these levels helps you manage your team, apps, and data efficiently.

An **organization** is the top-level container in Ninox. It acts as the home base for your team, bringing together all your workspaces under one roof. Within your organization, you can:

* Manage users and assign roles
* Set organization-wide settings
* Oversee all workspaces and their contents

Think of your organization as your company or main entity in Ninox. For example, you might have one organization for your business and another for your voluntary work.

A **workspace** sits within an organization. Workspaces are where you create and run your apps. Each workspace is independent, holding its own:

* Apps
* Data
* Settings

This separation allows you to keep different solutions or projects clearly organized. For example, within your organization, you might have separate workspaces for:

* HR
* Company events
* Development projects
* Sports club activities
* Charity work

Each workspace can contain multiple apps, and each app manages its own tables, records, and settings.

Here is how your Ninox environment might be structured:

{% tabs %}
{% tab title="Organization 1: My company" %}

<table data-card-size="large" data-view="cards"><thead><tr><th>Workspace</th><th>Apps</th></tr></thead><tbody><tr><td>HR</td><td><ul><li>Onboarding</li><li>Vacation planner</li><li>...</li></ul></td></tr><tr><td>Company events</td><td><ul><li>Event planning</li><li>Guest lists</li><li>...</li></ul></td></tr></tbody></table>
{% endtab %}

{% tab title="Organization 2: My voluntary work" %}

<table data-card-size="large" data-view="cards"><thead><tr><th>Workspace</th><th>Apps</th></tr></thead><tbody><tr><td>Sports club</td><td><ul><li>Memberships</li><li>Scheduling</li><li>...</li></ul></td></tr><tr><td>Charity work</td><td><ul><li>Donation tracking</li><li>Volunteer coordination</li><li>...</li></ul></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

Let's recap this:

* An organization can have multiple workspaces.
* Each workspace is independent and can have its own apps and data.
* Users and roles are managed at the organization level, but access can be controlled per workspace.

This structure helps you keep your solutions organized, secure, and easy to manage as your needs grow.

## Creating an organization and workspace in Ninox <a href="#creating-an-organization-and-workspace-in-ninox" id="creating-an-organization-and-workspace-in-ninox"></a>

There are two alternative ways to set up organizations and workspaces in Ninox.\
The first one is the [automated onboarding](#automated-way-during-onboarding) flow, which guides you through creating your first organization and workspace. This ensures you are ready to start building right away.\
The second way is to create additional organizations and workspaces [manually](#manual-way-after-onboarding).\
This flexibility allows you to structure your Ninox environment to fit your needs, whether you are just starting out or expanding your setup.

### Automated way during onboarding <a href="#automated-way-during-onboarding" id="automated-way-during-onboarding"></a>

When you sign up for Ninox, you are guided through an onboarding flow. During this process:

* You are asked to enter an **Organization name** and a **Workspace name**.
* Ninox uses these names to automatically create your first organization and workspace.
* After onboarding, you land in your new workspace and can immediately start building your first app.

**Tip:** You can edit the organization and workspace names later in the **Settings** screen.

### Manual way after onboarding <a href="#manual-way-after-onboarding" id="manual-way-after-onboarding"></a>

You can also create additional organizations and workspaces at any time, independently of the onboarding flow.

To create a new organization manually:

{% stepper %}
{% step %}
**Open Settings**

Click **Settings** in the main navigation.
{% endstep %}

{% step %}
**Open the organization selector**

In the **ORGANIZATION** section, click the current organization name.
{% endstep %}

{% step %}
**Start organization creation**

Select **+ Create organization**.
{% endstep %}

{% step %}
**Enter the organization details**

Enter a **Name**.

Ninox generates the **Internal name** automatically. You can change it, but this is not recommended.

Click **Create organization**.
{% endstep %}
{% endstepper %}

Your new organization is now available in **Settings**. Next, create a workspace inside it.

To create a new workspace manually:

{% stepper %}
{% step %}
**Select the organization**

In the **ORGANIZATION** section, select the organization where you want to add the workspace.
{% endstep %}

{% step %}
**Open the workspace selector**

In the **WORKSPACE** section, click the current workspace name.
{% endstep %}

{% step %}
**Start workspace creation**

Select **+ Create workspace**.
{% endstep %}

{% step %}
**Enter the workspace details**

Enter a **Name** for your new workspace.

Ninox generates the **Internal name** automatically. You can change it, but this is not recommended.

Click **Create workspace**.
{% endstep %}
{% endstepper %}

You now have created a new workspace and are ready to continue configuring tables and fields.

{% hint style="info" %}
You can always manage and edit organization and workspace properties, such as name, color, and members from the **Settings** screen. Click the **gear icon** <i class="fa-gear">:gear:</i> in the main navigation to access the settings.
{% endhint %}


# Your first app

Build your first Ninox app manually by creating tables, fields, and relationships for an invoice management example.

Explore the essential steps to get started with Ninox by building your first app using a practical invoice management example. Along the way, you will learn how to create tables, add fields, set up relationships, and structure your data for real-world use.

While Ninox offers the AI assistant to help you generate your data model and app structure automatically, this guide walks you through each step manually. Building your app by hand will help you understand how Ninox apps are structured and how your data is organized. This foundation will make it easier to customize your app and use Ninox’s features effectively.

## What you will build <a href="#what-you-will-build" id="what-you-will-build"></a>

With Ninox, you can create apps to store and organize your data and workflows. Each app is based on a database and can be customized to fit your specific needs.\
A well-structured app, with correctly set up tables, field types, and relationships, makes it easier to build useful and efficient views. You can always adjust your data model as your needs evolve.

In this example, you will build an app that helps you manage invoices, customers, products, and all related data. The app will include the following tables:

* Invoices: stores invoices you issue
* Invoice items: for line items on each invoice
* Products: goods or services you sell
* Customers: invoice recipients

You will also:

* Set up relationships between these tables.
* Use automations to copy flexible data between tables to save them as static ones.
* Use logic fields to calculate totals, VAT, and due dates.

## Create the app <a href="#create-the-app" id="create-the-app"></a>

Create your first app from workspace home, then open it on the app screen.

{% stepper %}
{% step %}
**Open workspace home**

Switch to your workspace home screen. This is where you create and open apps in the current workspace.

<figure><img src="/files/EFjhwWBf3Z1xAgsltMNS" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Start manual app creation**

Select **Create app manually**. This opens the **Create app** dialog for a manual setup.
{% endstep %}

{% step %}
**Name your app**

Enter a **Name** for your app, such as "Invoice management". Use a clear name that matches the process or team the app supports.\
Ninox generates the **Internal name** automatically. You can change it, but this is not recommended.
{% endstep %}

{% step %}
**Choose an icon and color**

Click the icon <i class="fa-database">:database:</i> next to the app name.

Pick an icon and color that make the app easy to recognize later. **Confirm** your icon and color choice.

<figure><img src="/files/ajQCpHdTdXPfxmy8vBy2" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Create the app**

Click **Create app**.\
Ninox creates the app and adds it to workspace home as a new tile.
{% endstep %}

{% step %}
**Open the new app**

Open your new app from its tile on workspace home.

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

Ninox takes you directly to the app screen and opens the first table.
{% endstep %}
{% endstepper %}

## Create the tables <a href="#create-the-tables" id="create-the-tables"></a>

Create the core tables for your app before you add fields and relationships.

{% stepper %}
{% step %}
**Start the first table**

Click **+ Create table** in the center of the screen to add a table to your app.\
Start with the “Invoices” table. This will hold the main invoice records.
{% endstep %}

{% step %}
**Name the table**

In the **Create table** diaglog enter "Invoices" in **Name**.\
Ninox generates the **Internal name** automatically. You can change it, but this is not recommended.\
Feel free to choose an icon for the table.
{% endstep %}

{% step %}
**Turn off AI suggestions**

Uncheck **AI suggestions**. In this guide, you define the table structure manually.
{% endstep %}

{% step %}
**Create the table**

Click **Create table**.

Ninox adds the “Invoices” table to the app navigation and opens it on the app screen.

<figure><img src="/files/LfyFnPECAmO0rY5YO6pT" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add the remaining tables**

Click **+ Create table** in the app navigation and repeat the same steps for:

* “Invoice items”
* “Products”
* “Customers”

These four tables form the basis of the invoice management app.
{% endstep %}

{% step %}
**Check the result**

Confirm that all four tables appear in the app navigation.

At this point, your app should contain “Invoices”, “Invoice items”, “Products”, and “Customers”.
{% endstep %}
{% endstepper %}

## Add fields to your tables <a href="#add-fields-to-your-tables" id="add-fields-to-your-tables"></a>

Add the fields for each table so your app can store the right data. Let's take a look at how it generally works. Afterwards create all the fields mentioned in the following list for each table.

{% stepper %}
{% step %}
**Start adding fields**

Click **+ Add field** in the center of the screen to create the first field in the current table.\
You will repeat this process for each of the four tables.
{% endstep %}

{% step %}
**Define the field**

Enter a field **Name** in the **Add field** dialog and choose the matching field **Type**.

<figure><img src="/files/p2SH1GDJuqB90vxTopOH" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add more fields**

Click **Add another field** to keep adding fields without closing the dialog.

If you close the dialog too early, open the **Settings** panel on the right.\
Select **Table, Fields**, and click **Create field** at the end of the list.
{% endstep %}

{% step %}
**Review the table columns**

When you finish with **Create field**, Ninox shows the new fields as columns in the table. This gives you a quick check that the structure looks right.

<figure><img src="/files/vjw5dmqRmJS2zPIYkebz" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

Repeat this until all tables contain the fields listed below. Just add these fields, don’t worry about values for the choice fields or number formats. You will apply these later on.

{% columns %}
{% column %}
"Invoices" table:

* Invoice number (Text)
* Type (Single-choice)
* Creation date (Date)
* Status (Single-choice)
* Payment term (Single-choice)
* Notes (Text)
  {% endcolumn %}

{% column %}
"Invoice items" table:

* Item number (Number)
* Product description (Text)
* Quantity (Number)
* Unit price (Number)
* VAT rate (Number)
  {% endcolumn %}
  {% endcolumns %}

{% columns %}
{% column %}
"Products" table:

* Product name (Text)
* Product number (Text)
* Short description (Text)
* Detailed info (Text)
* VAT (Single-choice)
* Purchase price (Number)
* Sales price (Number)
  {% endcolumn %}

{% column %}
"Customers" table:

* Customer number (Text)
* Full name (Text)
* Address (Multi-line text)
* Email (Email)
* Photo (File)
  {% endcolumn %}
  {% endcolumns %}

When you add relationship fields, use these labels:

* **←Link many records**
* **→Link one record**

### Add values to your choice fields <a href="#add-values-to-your-choice-fields" id="add-values-to-your-choice-fields"></a>

After you have created your table and fields, it’s time to add values to your choice fields by following these steps.

{% stepper %}
{% step %}
**Open the form view**

Click **+ Add record** to open the form view. You can recognize choice fields by the small arrow at the end of the field, in this example, "Type", "Payment term", and "Status".

<figure><img src="/files/VcSh0GGXHvtvWLoWEQ2H" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Access the quick settings**

Click your first choice field, the quick settings menu appears on top of the field.

<figure><img src="/files/HNG93b60wpCPMxhk2XN3" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Open the quick settings**

Click the <i class="fa-gear">:gear:</i> gear icon. to open the quick settings.

<figure><img src="/files/yJR4miMQIclm77r46dmI" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add the first values**

Enter your first two values under **Options**. In this example for the "Type" field enter "Offer" and "Invoice". Optionally pick an icon and color for the options.

<figure><img src="/files/oXKeMfZUMW0rLsFy9yzn" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add more values if needed**

Click **+ Add value** for every additional option and enter the label you want to use.
{% endstep %}

{% step %}
**Repeat for all choice fields**

Continue until all choice fields contain the values listed here:

"Invoices" table:

* "Type": Offer, Invoice, Delivered
* "Payment term": 1 week, 2 weeks, 30 days, 90 days
* "Status": New, Sent, Paid

"Products" table:

* "VAT": 0%, 7%, 19%, 20%
  {% endstep %}

{% step %}
**Check the options in the table**

In the table, click a choice field to show its options.

<figure><img src="/files/xys5ESA5MBA74ns164zt" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

## Set up relationships <a href="#set-up-relationships" id="set-up-relationships"></a>

At this stage, you are ready to connect your tables so your app can work with related data.

In Ninox, you do not need to define key fields manually. Create a **Reference fields** (**→Link one record** or **←Link many records**) and point them to the right target table.

Create a **→Link one record** relationship :

* In "Invoice items", add an "Invoices" field that links to "Invoices".
* In "Invoice items", add a "Products" field that links to "Products".
* In "Invoices", add a "Customers" field that links to "Customers".

Invoices and products have a many-to-many (M to N) relationship. One invoice can contain many products, and one product can appear on many invoices.\
Ninox supports one-to-many (1 to N) relationships directly. To represent a many-to-many relationship, use an intermediate table. Here, that table is "Invoice items". Each invoice item links to one invoice and one product, and also stores details for that combination, such as quantity, unit price, and VAT rate.

This design lets you:

* Reuse products across many invoices.
* Keep invoice records stable, even if product details (name, price, VAT) change later.

Add these reference fields following these steps:

{% stepper %}
{% step %}
**Open "Invoice items"**

Navigate to the "Invoice items" table. Click **+ Add record** to open the form view.
{% endstep %}

{% step %}
**Open the relationships section**

Click the <i class="fa-gear">:gear:</i> gear icon in the top right to open the settings panel.\
Select the **Form** tab, then scroll down and open **Relationships**.

<figure><img src="/files/wLG3umTIkO7Vt8NEG4Q2" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add the relationship to "Invoices"**

Drag the **→Link one record** field into the form view.\
In the **→Link one record** dialog, select the target table "Invoices".

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

The reference field "Invoices" appears in the form view.
{% endstep %}

{% step %}
**Add the relationship to "Products"**

Drag another **→Link one record** field into the form view.\
In the **→Link one record** dialog, select the target table "Products".\
The reference field "Products" appears in the form view.
{% endstep %}

{% step %}
**Open "Invoices"**

Navigate to the "Invoices" table.
{% endstep %}

{% step %}
**Add the relationship to "Customers"**

Open **Relationships** again in the **Form** tab.\
Drag the **→Link one record** field into the form view.\
In the **→Link one record** dialog, select the target table "Customers".\
The reference field "Customers" appears in the form view.
{% endstep %}
{% endstepper %}

Now the tables are connected:

* Each **Invoice** is linked to one **Customer**.
* Each **Invoice item** is linked to one **Invoice** and one **Product**.

## Double check the data model <a href="#double-check-the-data-model" id="double-check-the-data-model"></a>

Now it’s a good time to review what you’ve built so far in the data model.

{% stepper %}
{% step %}
**Open the data model**

Select **Data model** in the **App navigation**.
{% endstep %}

{% step %}
**Check the tables and the relationships**

Confirm that you see these four tables:

* "Invoices"
* "Invoice items"
* "Products"
* "Customers"

Confirm that the lines between the tables match the relationships you created. The arrow always points to the table on the "one" side of a one-to-many relationship.

<figure><img src="/files/ik3D1Q4PsQ6Xe5yGy8GF" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Your first automations

Set up automations and logic fields to copy data, calculate totals, and generate invoice numbers.

## Automate data transfer and calculations <a href="#automate-data-transfer-and-calculations" id="automate-data-transfer-and-calculations"></a>

With the data model in place, you can add automations and logic to make the app behave like an invoice system instead of just a static database.

You will:

* Use logic fields to calculate line amounts and totals.
* Make sure invoices do not change afterward, even if products or customers do.

Why copy data instead of always showing linked data?

In many scenarios, you can simply show data from a linked table via a logic field and always see the latest version. For example, always show the latest product price.

For invoices, this is not what you want:

* In most countries, sent invoices must not be changed afterward.
* Product names, prices, or VAT rates may change over time.
* Invoice records must remain stable as of the time they were issued.

For this reason, you:

* Store customer and product data centrally in their tables.
* Copy relevant data (name, price, VAT, address) into invoice and invoice item records at creation time via automations.
* Use those copied values for calculations and printouts.

Let's take a look at the automations in the “Invoice Management” app.

{% hint style="info" %}
In automations, you need to refer to fields and tables by their internal names. For example, the field "Product descriptions" has the autogenerated internal name `product-descriptions`.
{% endhint %}

### Copy product data into invoice items <a href="#copy-product-data-into-invoice-items-trigger-on-relationship-field" id="copy-product-data-into-invoice-items-trigger-on-relationship-field"></a>

To ensure invoices stay unchanged even if product data changes later, copy the relevant product information into static fields on the "Invoice items" table.

When a user selects a product in the "Product" reference field, the following should happen:

* The product name is copied into "Product description" on the invoice item.
* The sales price is copied into "Unit price" on the invoice item.

Set this up as follows:

{% stepper %}
{% step %}
**Open "Invoice items"**

Open the "Invoice items" table from the app navigation.
{% endstep %}

{% step %}
**Open the field settings**

Click the gear icon in the top right to open the **Settings panel**.\
Select the **Fields** tab.\
Click the "Products" reference field to open **Field settings**.

<figure><img src="/files/oBufLEObKDtFbXDfnsM1" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Open the "On update" automation**

Navigate to **Automations** and select **On update**.\
The logic editor opens.

<figure><img src="/files/K0AvsJ7HIkWxo4GauTMv" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add the script**

Add the following script, then click **Update** to confirm.

{% code overflow="wrap" %}

```
product_description := products.product_name; 
unit_price := products.sales_price;
```

{% endcode %}

The script line by line:

* `product_description` is the target field in the current "Invoice items" table.
* `:=` assigns a value to that field.
* `products.product_name` reads the field "Product name" from the linked "Products" record.
* `;` ends the line. Add it whenever more lines follow.
* The second line copies the sales price from the linked products record into the "Unit price" field of the current invoice item.
  {% endstep %}
  {% endstepper %}

### Convert a VAT choice to a numeric value <a href="#convert-a-vat-choice-to-a-numeric-value" id="convert-a-vat-choice-to-a-numeric-value"></a>

In the “Products” table, the field “VAT” is a single‑choice field that returns a text value such as “19 %”. For calculations, you need a numeric value, like “19”.

To solve this:

* Keep “VAT” as a single-choice in “Products” for a clear UI.
* Maintain a numeric field “VAT rate” in “Invoice items”.
* Use an automation on the “Product” field in “Invoice items” to:
  * Read the choice text from `products.'VAT'` (for example "19%").
  * Extract the first part:"19" and convert it to a number.
  * Store it in 'VAT rate'.

Set this up as follows:

{% stepper %}
{% step %}
**Open the field settings**

In the "Invoice items" table, open the settings panel and select the **Fields** tab.

Click the "Products" reference field to open the field settings.
{% endstep %}

{% step %}
**Open the "On update" logic**

Navigate to **Automations** and select **On update**.
{% endstep %}

{% step %}
**Add the script**

Add the following script, then click **Update** to confirm.

{% code overflow="wrap" %}

```
vat_rate := number(item(split(products.text(vat), "%"), 0))
```

{% endcode %}

What this does:

* First you specify the target field on the current record `vat-rate`.
* Then you use `:=` to assign a value.
* `products.text(vat-rate)` gets the text displayed by the VAT choice (for example, `"19 %"`).
* `split(..., " ")` splits that text at the percent character into parts (`["19", "%"]`).
* `item(..., 0)` selects the first part (`"19"`) while indexing starts at `0`.
* `number(...)` converts the text `"19"` into the numeric value `19`.
* That number is stored in "VAT rate" on the "Invoice items" table, every time you update the "Product" reference field.
  {% endstep %}
  {% endstepper %}

You now have a numeric VAT rate ready for calculations.

### Calculate line item totals on invoice items <a href="#calculate-line-item-totals-on-invoice-items" id="calculate-line-item-totals-on-invoice-items"></a>

In each invoice item, calculate the net amount and the VAT amount for that line item based on “Quantity” and “Unit price”:

{% stepper %}
{% step %}
**Open "Invoice items"**

Navigate to the "Invoice items" table.
{% endstep %}

{% step %}
**Create the "Net amount" logic field**

* Click the **+** icon in the table header to add a new field.&#x20;
* Enter the **Field name** "Net amount".
* Keep the autogenerated internal name.
* Select the field type **Logic**.
* Click on **Create field**
  {% endstep %}

{% step %}
**Add the net amount logic**

* In the right settings panel, go to the tab **Table**.
* Select **Fields**.
* Click on the name of the new **Net amount** field.
* Under **General**, select **Logic** to open the logic editor.
* Enter this script:

```ninox
unit_price * quantity
```

* Click on **Apply**.

This multiplies the unit price by the quantity in the same record.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvgUdF91rY6UMBUb5r9Cl%2Fuploads%2F5bUkZDy8QxBtsmM6pNzd%2Fcreate_logic_from_table_header.mp4?alt=media&token=775f0a5d-6728-46d7-8139-2608fd981fc9>" %}
{% endstep %}

{% step %}
**Create the "VAT amount" logic field**

* Repeat steps 2 and 3 to add another logic field named **VAT amount**.
* Enter the following script in the logic editor:

{% code overflow="wrap" %}

```
round(quantity * unit_price * vat_rate / 100, 2)
```

{% endcode %}

* Click on **Apply**.

This multiplies quantity, unit price, and VAT rate. It then divides by 100 and rounds to two decimal places. Rounding here helps avoid differences in invoice totals later.
{% endstep %}
{% endstepper %}

### Calculate invoice totals <a href="#calculate-invoice-totals" id="calculate-invoice-totals"></a>

On the “Invoices” table, you can now calculate the totals for each invoice by summing up all related invoice items.

For each invoice, you want to see:

* The net total of all line items
* The VAT total of all line items
* The gross total (net + VAT)

Set this up as follows:

{% stepper %}
{% step %}
**Open "Invoices"**

Navigate to the "Invoices" table.
{% endstep %}

{% step %}
**Create the "Net total" logic field**

Create a logic field, for example "Net total".
{% endstep %}

{% step %}
**Add the net total formula**

Set the formula to:

{% code overflow="wrap" %}

```
sum(invoice_items.net_amount)
```

{% endcode %}

This adds up the net amount of all related invoice items for the current invoice.
{% endstep %}

{% step %}
**Create the "VAT total" logic field**

Create another logic field named "VAT total".
{% endstep %}

{% step %}
**Add the VAT total formula**

Set the formula to:

{% code overflow="wrap" %}

```
sum(invoice_items.vat_amount)
```

{% endcode %}

This adds up the VAT amount of all related invoice items for the current invoice.
{% endstep %}

{% step %}
**Create the "Gross total" logic field**

Create one more logic field named "Gross total".
{% endstep %}

{% step %}
**Add the gross total formula**

Set the formula to:

{% code overflow="wrap" %}

```
net_total + vat_total
```

{% endcode %}

This sums the net total and the VAT total to get the final invoice amount.
{% endstep %}
{% endstepper %}

Here, the `sum()` function directly uses the “Invoice items” relationship. Ninox automatically accesses all related invoice items records for the current invoice, so you do not need explicit key fields or `select` statements.

### Calculate the expected payment date <a href="#calculate-the-expected-payment-date" id="calculate-the-expected-payment-date"></a>

In the “Invoices” table, you can calculate an expected payment date based on the creation date of the invoice, and the selected “Payment term”.

Because “Payment term” is a single-choice field, you need to handle all possible options. With many options, a `switch case` structure is easier to read than multiple nested `if ... then ... else` statements.

{% stepper %}
{% step %}
**Open "Invoices"**

Open the "Invoices" table.
{% endstep %}

{% step %}
**Open the field settings**

Click the **gear** icon to open the **Settings panel**.

Make sure you are on the **Fields** tab.
{% endstep %}

{% step %}
**Create the "Expected payment date" logic field**

Create a new logic field, for example "Expected payment date".
{% endstep %}

{% step %}
**Add the formula**

Set the formula to something like this:

{% code overflow="wrap" %}

```
switch text(payment_term) do 
    case "1 week": 
        creation_date + 7 
    case "2 weeks": 
        creation_date + 14 
    case "30 days": 
        creation_date + 30 
    case "90 days": 
        creation_date + 90 
    default: 
        creation_date + 30 
end
```

{% endcode %}

What this does:

* `switch text(payment_term) do` checks which option is selected in the “Payment term” field.
  * `text(payment_term)` gives the text value of the chosen option. Without `text()`, you would get the numeric ID of the selected option.
* Each `case` block defines how to calculate the expected date for one option.
  * For fixed time spans such as “1 week” or “30 days”, it adds that many days to “Creation date”.
* The `default` block defines what should happen if none of the cases match.
  * Here, it falls back to creation date plus 30 days.

You can adapt the case labels and numbers to exactly match your “Payment term” choices.
{% endstep %}
{% endstepper %}

### Generate unique invoice numbers <a href="#generate-unique-invoice-numbers-invoices-table" id="generate-unique-invoice-numbers-invoices-table"></a>

Every invoice needs a unique invoice number. You can generate it automatically when a new invoice is created, using the **On create** automation on the “Invoices” table.

In this example, invoice numbers follow the format:\
"INV-2026-0001" (prefix + year + running number with leading zeros).

{% stepper %}
{% step %}
**Open "Invoices"**

Open the "Invoices" table.
{% endstep %}

{% step %}
**Open the table settings**

Click the **gear** icon to open the **Settings panel**.

Select the tabs **Table** and **Settings**.
{% endstep %}

{% step %}
**Open the "On create" automation**

Under **Automations**, choose **On create**.
{% endstep %}

{% step %}
**Add the script**

Add the following script and click **Confirm**:

{% code overflow="wrap" %}

```
let myYear := year(today()); 
let myRN := max((select invoices where year(creation_date) = myYear).number(substr(invoice_number, 9))); 
invoice_number := "INV-" + myYear + "-" + format(myRN + 1, "0000"); 
creation_date := today()
```

{% endcode %}

What this does:

* `myYear` stores the current year.
* `myRN` finds the highest existing invoice number for this year.
  * It selects all invoices whose creation date is in `myYear`.
  * It extracts the numeric part of `invoice_number` starting at position `9`, after `"INV-YYYY-"`.
  * `number(...)` removes the leading zeros and transformes the string to a real number data type.
  * It then takes the maximum of these numbers.
* `invoice_number := ...` composes the new invoice number.
  * It adds the prefix `"INV-"`.
  * It adds the current year.
  * It adds a dash.
  * It adds the incremented running number, formatted to 4 digits with leading zeros using `"0000"`.
* `creation_date := today()` sets the creation date when the invoice is created.
  {% endstep %}
  {% endstepper %}

### Generate unique customer numbers (Customers table) <a href="#generate-unique-customer-numbers-customers-table" id="generate-unique-customer-numbers-customers-table"></a>

You can use a similar approach to create unique customer numbers in the "Customers" table, for example: `"CU-00001"`.

{% stepper %}
{% step %}
**Open "Customers"**

Open the "Customers" table.
{% endstep %}

{% step %}
**Open the table settings**

Click the **gear** icon to open the **Settings panel**.

Select the tabs **Table** and **Settings**.
{% endstep %}

{% step %}
**Open the "On create" automation**

Under **Automations**, choose **On create**.
{% endstep %}

{% step %}
**Add the script**

Add the following script and click **Confirm**:

{% code overflow="wrap" %}

```
let myLast := max((select customers).number(substr(customer_number, 3))); 
customer_number := "CU-" + format(myLast + 1, "00000")
```

{% endcode %}

What it does:

* `select customers` gets all existing customers.
* `substr(customer_number, 3)` takes the customer number without the prefix.
  * For example, from "CU-00001" it extracts "00001".
* `number(...)` converts that text to a number.
* `max(...)` returns the highest existing number.
* `myLast + 1` increments it for the new record.
* `format(..., "00000")` formats the number with five digits and leading zeros.
* The result is combined with the `"CU-"` prefix and written back to "Customer number".
  {% endstep %}
  {% endstepper %}

### Add example data to your app

If you want to see what your first app looks like with a bit more data, use the Ninox AI assistant to generate sample records for testing.

{% hint style="info" %}
This prompt assumes you used the same table and field names as in the [Your first app](/getting-started/builder-getting-started/set-up-your-ninox-manually/your-first-app) guide.
{% endhint %}

{% stepper %}
{% step %}
**Open a table in Builder mode**

Open any table in your app and switch to **Builder mode**.

In the settings panel, select the tab **Form** and **Add**. Scroll down to **Controls**.

<figure><img src="/files/CEHRLCZv4c0fZjh48TGk" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Create a button field**

Drag a field of type **Button** into the form. Name it "Generate sample data".
{% endstep %}

{% step %}
**Open the button automation**

Open the button field settings and go to **On click**.
{% endstep %}

{% step %}
**Ask the AI assistant for the script**

In the AI chat paste the prompt below.

{% code title="Prompt" overflow="wrap" %}

```
Task: Create and run a script that inserts example data into four tables: customers, products, invoices, and invoice_items.

Customers:
- Insert 10 example records into the customers table.
- Generate customer_number values in the format CU-00001.
- Continue numbering from the highest existing customer_number.
- Determine the current maximum numeric part with:
  max(number(substr(customer_number, 3)))
- Start at max + 1 and create 10 consecutive unique numbers.

Products:
- Insert 10 example records into the products table.
- Generate product_number values in the format Pr-001.
- Continue numbering from the highest existing product_number.
- Extract the numeric part from product_number, determine the current maximum, then create 10 consecutive unique numbers with 3-digit zero-padding.

Invoices:
- Insert 10 example records into the invoices table.
- Generate invoice_number values in the format Inv-YYYY-00000, where YYYY is the current year.
- Continue numbering from the highest existing invoice_number in that format.
- Determine the current maximum numeric part with:
  max(number(substr(invoice_number, 10)))
- Start at max + 1 and create 10 consecutive unique numbers.
- Link each invoice to one existing customer through the customer relationship on the invoices table.

Invoice items:
- For each invoice, create at least 3 related records in the invoice_items table.
- Link each invoice item to a product from the products table.
- Do not reuse the same product more than once within the same invoice.

Avoid giving variables the same name as field names in these tables. It's best to always prefix variables with something that indicates they are variables, e.g., “my...” >> “myName”.
```

{% endcode %}
{% endstep %}

{% step %}
**Accept the generated script**

When the AI assistant inserts the script into the editor, click **Accept**. Then click **Confirm**.
{% endstep %}

{% step %}
**Run the button**

Exit **Builder mode** and click your new button.

If your app structure matches this guide, Ninox creates sample records in all four tables.
{% endstep %}
{% endstepper %}


# Create print layouts and generate PDFs

Learn how to create print layouts, edit them, and generate PDFs from your records.

## Create your first print layout <a href="#create-your-first-print-layout" id="create-your-first-print-layout"></a>

Use a print layout to turn an invoice record into a printable PDF.

{% hint style="info" %}
Only users with the **Admin** role can save print layout changes.
{% endhint %}

{% stepper %}
{% step %}
**Open the print editor**

In the “Invoices” table, open an invoice record. Click the <i class="fa-print">:print:</i> printer icon in the top right. You can also open the three-dot menu and select **Print this record**.

The first time you do this in a table, Ninox opens an empty print layout.
{% endstep %}

{% step %}
**Add content to the layout**

Click **+ Insert** in the top bar and add the elements you need:

* **Text** for a static text or a value returned by a script
* **Image**, for a static image
* **Data** fields from your current table
  {% endstep %}

{% step %}
**Adjust the layout elements**

* Click an element to highlight its frame. Then drag it to a new position.
* Drag the square handles to resize it.
* Click **Edit script** **<>** in the top right to update the content of a field or element.
  {% endstep %}

{% step %}
**Save your changes**

Click **Save changes** when you are finished with the layout.
{% endstep %}

{% step %}
**Name the first layout**

Enter a **Layout name** and click **Save**.
{% endstep %}
{% endstepper %}

### Create another print layout <a href="#create-another-print-layout" id="create-another-print-layout"></a>

You can save multiple print layouts in the same table.

Click the arrow next to **Save changes**. Select **Save as** to save the current layout under a different name. Then adjust it as needed.

## Add a button to generate the invoice PDF <a href="#add-a-pdf-button-to-generate-and-attach-the-invoice-pdf" id="add-a-pdf-button-to-generate-and-attach-the-invoice-pdf"></a>

Once you have at least one print layout for your invoices, you can add a button on the “Invoices” table to:

* Generate a PDF using a defined print layout.
* Attach the generated PDF to the invoice record.
* Optionally, display the file in a field on the form view.

{% stepper %}
{% step %}

### Add a file field

[Add the field](/getting-started/builder-getting-started/set-up-your-ninox-manually/your-first-app#add-fields-to-your-tables) to the form view.\
This field is not required to create and attach the PDF. We recommend it if you want to see the file at a glance in the form view.
{% endstep %}

{% step %}

### Add the button and it's logic

Open the **Settings** panel on the right.\
Select **Form**, **Add**, and drag a **Button** from the **Controls** section on the form.

* In the **Button** settings, scroll to **General** and **On click**.
* Add the following script:

{% code overflow="wrap" %}

```
let myFileName := "Invoice-" + invoice_number + "-" + format(today(), "YYYY-MM-DD") + ".pdf";
do as server
	invoice_pdf := importFile(this, 
														printAndSaveRecord(this, "Invoice"), 
														myFileName)
end
```

{% endcode %}
{% endstep %}

{% step %}

### What the script does

`let myFileName := ...` builds a file name for the PDF:

* `"Invoice_"` is the fixed prefix.
* `+ invoice_number` adds the value from the “Invoice number” field to the prefix.
* `+ "-"` adds a hyphen as separator between the invoice number and the date of today.
* `format(..., "YYYY-MM-DD")` formats the date as `2026-08-15`.
* `+ ".pdf"` adds the file extension.

The `do as server...end` block runs the enclosed code on the server.\
`printAndSaveRecord()` must run there.

`invoice_pdf := importFile(...)` stores the file reference in the "Invoice PDF" field.\
This lets you display the PDF in the form.

`importFile(...)` attaches the file to the current record. The file appears in the <i class="fa-paperclip-vertical">:paperclip-vertical:</i> **Files** tab.

* `this` targets the currently open record.
* `printAndSaveRecord(this, "Invoice")` generates a PDF from the current record (`this`) using the print layout named `"Invoice"`.
* `myFileName` provides the generated file name.

{% hint style="warning" %}
Slashes `/` are not allowed in any filename.\
Format every date used in a filename. For example, format `today()` as `YYYY-MM-DD`, as shown above.\
An unformatted date can contain slashes and cause PDF generation to fail.
{% endhint %}
{% endstep %}
{% endstepper %}

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvgUdF91rY6UMBUb5r9Cl%2Fuploads%2FX95n0N95vQ2ZXHcT5Coh%2Fprint_and_save_pdf.mp4?alt=media&token=94ae2396-50ae-4c5f-ab9d-485f586fd2dc>" %}

## Edit layout elements

Existing print layouts stay editable at any time. When you open the print editor, you are already in edit mode.

* At the bottom of the page, use **Show grid** to show or hide the grid.
* Use the **Zoom** slider to zoom in or out.
* Use **Undo** and **Redo** to reverse or restore changes.
* Use **Cut**, **Copy**, and **Paste** to reuse recurring styles and content.
* Open the three-dot menu in the top bar to arrange and align elements:
  * **Send to front** and **Send to back**
  * **Align left**, **center**, or **right**
  * **Align top**, **middle**, or **bottom**
  * **Distribute horizontally**
* To remove an element, select its frame and click <i class="fa-trash-can">:trash-can:</i> **Remove**, or press <i class="fa-delete-left">:delete-left:</i> delete or <i class="fa-delete-right">:delete-right:</i> backspace on your keyboard.

Use the settings panel to adjust the layout. Available options depend on what you select.

Select the page to change page settings. Select a text, data, image, or linked table element to adjust its position, size, styling, and display options.

### Adjust page settings

Click an empty area or the page margin to edit the page layout. You can set:

* **Paper size**
* **Header and footer** height
* Page **Margin** width
* **Print attachments** to include record attachments in the PDF

### Adjust element settings for text, logic, or data fields

If you select a text box, logic, or data field, but not an image field, you can set:

* The page area, such as **Flow with content** or a repeating **Header** or **Footer**
* A fixed or automatic element **Height**
* The exact element **Position** with X and Y coordinates, plus **Width** and **Height**
* Inner **Padding** between the content and the element border
* **Colors** for the background and text
* **Border** color, width, and radius
* **Font** family and size
* Text formatting such as **Bold**, **Italic**, or **Underline**
* **Text** alignment
* Text **Line height**

### Adjust file and image field settings

For a file field and the static image, you can set:

* The page area, such as **Flow with content** or a repeating **Header** or **Footer**
* A fixed or automatic height
* The exact element **Position** with X and Y coordinates, plus **Width** and **Height**
* **Background color** for field areas not covered by the image
* **Border** color, width, and radius

### Adjust content and column settings for linked tables

This section applies when the print layout shows records from a linked table.

Use these settings to control which linked records and columns appear in the PDF. This is useful, for example, when a customer should see only relevant details.

{% hint style="info" %}
These changes apply only to the print layout. They do not change the underlying linked table.
{% endhint %}

Select the table shown in the print layout for a field of type <i class="fa-arrow-left">:arrow-left:</i> **Link many records** to control its content and presentation in the PDF. You can use all options listed above for **Text**, **Logic**, and **Data** fields, except **Text** alignment and text **Line height**.

You can also use these linked-table options:

* **Show header** to show or hide the column titles
* **Show footer** to show or hide aggregation results for columns where you set an **Aggregation**
* **Hide columns**, **Filter**, and **Sort**
* **Border style** to choose how the table grid looks
* **Cell padding** to define the distance between the value and the cell borders

You can also change table columns directly in the selected table frame:

* Use <i class="fa-eye-slash">:eye-slash:</i> x **hidden columns**, **Filter**, and **Sort** at the top right
* In the drop-down menu for each column:
  * **Rename column**
  * **Duplicate column**
  * **Insert column left** or **right**
  * **Sort** in ascending or descending order
  * **Aggregation**, depending on the data type, which you can display in the footer with **Show footer**
  * **Hide column**

## Generate a PDF <a href="#generate-a-pdf" id="generate-a-pdf"></a>

When your print layout is ready, click **Generate document** in the top right. By default, the PDF opens in your browser.

Click the arrow next to **Generate document** to choose what to generate:

* **Generate for selected record**
* **Generate for all records**\
  This option creates a single PDF containing all records of the open table view on separate pages.

{% hint style="info" %}
**Generate for all records** is available only when you open the record from a table view.
{% endhint %}


# Invite your team and assign roles

Invite users at organization or workspace level, assign roles, and manage their status.

Start by inviting people at the right level, then adjust access if needed.

Use **organization access** when someone should help manage the organization or work across several workspaces. Use **workspace access** when someone only needs access inside a workspace.

In most cases, the default role is the best place to start. Add custom roles later if you need more specific permissions inside an app.

## **Organization level invitations**

Invite users at organization level when they should be part of the organization and need an organization role.

{% stepper %}
{% step %}

#### Open Settings

Click the **gear icon** <i class="fa-gear">:gear:</i> in the main navigation to open **Settings**.
{% endstep %}

{% step %}

#### Open Users & roles

In the **Organization** section, select **Users & roles**.
{% endstep %}

{% step %}

#### Start the invitation

On the Organization users & roles screen click **+ Invite users**.
{% endstep %}

{% step %}

#### Enter the email address

Enter the email address of the person you want to invite.
{% endstep %}

{% step %}

#### Select the organization role

Choose the organization **Role**:

* **Admin**: Full access to the organization.
* **Admin W/O Billing**: Manages users, roles, settings, and workspaces, but not billing.
* **Billing**: Manages subscriptions and payments.
* **Member**: Regular organization member with access to workspaces.
  {% endstep %}

{% step %}

#### Select the email language

Select the language for the invitation email.
{% endstep %}

{% step %}

#### Send the invitation

Click **Invite**.
{% endstep %}
{% endstepper %}

The invited user receives an email with instructions to join the organization.

This is usually the best option for people who work across several workspaces or help manage the organization itself.

For advanced setup, see [Manage organization access](https://ninox-1.gitbook.io/ninox-docs/OE5eDeSCv1tCbV8e0YOj/builder-hub/manage-your-organization-and-workspace/organization/manage-organization-access) in the Builder Hub.

The **Organization users & roles** screen gives you a clear overview of users in the current organization.

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

On this screen, you can:

* Use **Search by email…** to find a specific user quickly.
* Use **Filter by status** to narrow the list by invitation or account status.
* Click **+ Invite users** to add new organization users.
* Select users with the checkboxes in the list for bulk actions.
* Change a user’s organization role directly in the **Role** column.
* See which workspaces a user belongs to in the **Workspaces** column.
* See when a user joined or when the invitation was sent in **Joined/invited**.
* See whether the email address is confirmed in **Verified**.
* See the current access state in **Status**, for example **Active**.
* Manage [custom roles](#custom-roles)

## **Workspace level invitations**

Invite users at workspace level when they only need access to one workspace.

{% stepper %}
{% step %}

#### Open Settings

Click the **gear icon** <i class="fa-gear">:gear:</i> in the main navigation to open **Settings**.
{% endstep %}

{% step %}

#### Open Workspace users

In the **Workspace** section, select **Users & roles**.
{% endstep %}

{% step %}

#### Start the invitation

Click **+ Invite users**.
{% endstep %}

{% step %}

#### Enter the email address

Enter the email address of the person you want to invite.
{% endstep %}

{% step %}

#### Select the workspace role

Choose the workspace **Role**:

* **Admin**: Full access to the workspace.
* **Editor**: Works in the workspace and its apps.
* **Viewer**: Can read and export data, but cannot change it.
* **None**: No default workspace role. Use this when access should come only from custom roles.
  {% endstep %}

{% step %}

#### Select the email language

Select the language for the invitation email.
{% endstep %}

{% step %}

#### Send the invitation

Click **Invite users**.
{% endstep %}
{% endstepper %}

The invited user receives an email with instructions to join the workspace.

This is a good option when access should stay limited to one team, one solution, or one area of work.

{% hint style="info" %}
If the invited user is not already part of the organization, inviting them to the workspace also adds them to the organization as a **Member**.
{% endhint %}

For advanced setup, see [Manage workspace access](https://ninox-1.gitbook.io/ninox-docs/OE5eDeSCv1tCbV8e0YOj/builder-hub/manage-your-organization-and-workspace/workspace/manage-workspace-access) in the Builder Hub.

The **Workspace users & roles** screen helps you manage access for the current workspace only.

On this screen, you can:

* Invite users to the workspace.
* Change a user’s workspace role directly in the **Role** column.
* Use **Search by email…** to find specific members.
* Use **Filter by status** to check invitation and account status.
* See when a user joined or when the invitation was sent in **Joined/invited**.
* See whether the email address is confirmed in **Verified**.
* See the current access state in **Status**, such as **Active**, **Inactive**, or pending.

{% hint style="info" %}
If you are in table view or on **Workspace home**, you can click **Invite users** <i class="fa-user-plus">:user-plus:</i> in the app navigation for a faster workspace invitation flow.
{% endhint %}

## **Custom roles**

Organization roles and workspace roles control access at a broad level. Custom roles give you more detail when the default role is too broad.

You create custom roles at organization level and reuse them across workspaces in the same organization. You then assign them in a workspace and use them in permissions.

In **Builder mode**, you can use them for:

* table permissions
* field permissions
* app permissions

To limit app access to specific user roles:

* In the app, open <i class="fa-gear">:gear:</i> **App settings** from the app navigation.
* In **Allow access to**, select the roles that should have access.

For a getting-started setup, keep things simple:

* Add users to the right organization or workspace first.
* Use custom roles later when your app needs more specific access rules.

For more detail on advanced permissions, continue in the Builder Hub:

* [Manage organization access](https://ninox-1.gitbook.io/ninox-docs/OE5eDeSCv1tCbV8e0YOj/builder-hub/manage-your-organization-and-workspace/organization/manage-organization-access)
* [Manage workspace access](https://ninox-1.gitbook.io/ninox-docs/OE5eDeSCv1tCbV8e0YOj/builder-hub/manage-your-organization-and-workspace/workspace/manage-workspace-access)


# Intro to the Ninox UI

Get a mental map of Ninox: main screens, menus, and panels.

After your app is created, your day‑to‑day work takes place inside the Ninox interface. You move between workspaces and apps, switch tables and views, and work with records. This chapter gives you a clear mental map of the main screens, menus, and panels so you know where you are and what you can do next as a builder:

* [App screen - your main working screen](/getting-started/builder-getting-started/intro-to-the-ninox-ui/app-screen-your-main-working-screen) explains the app screen, top bar, and how **Builder mode** changes what you see.
* [Settings screen - user, organization, workspace](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace) shows how to configure your profile, organizations, and workspaces from the central **Settings** screen.
* [Main navigation - settings, profile, and global menu](/getting-started/builder-getting-started/intro-to-the-ninox-ui/main-navigation-settings-profile-and-global-menu) describes the menus in the main navigation that open settings and switch context.
* [Workspace home - inbox, documents, bookmarks, and history](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history) focuses on the workspace home screen and its sections.
* [Ninox AI assistant](/getting-started/builder-getting-started/intro-to-the-ninox-ui/ninox-ai-assistant) shows how the **Ninox AI assistant** fits into the UI when you build apps.

This overview page introduces each of the main screens briefly and tells you which subpage to open for details. Use it as your mental map of Ninox. Whenever you are not sure where something lives, you can come back here and jump to the right subpage.

## Landing screen during onboarding <a href="#landing-screen-build-with-the-ninox-ai-assistant" id="landing-screen-build-with-the-ninox-ai-assistant"></a>

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

When you land the first time on Ninox you'll see this llanding screen where you can:

* Start a new app from scratch
* Use the **Ninox AI assistant** to generate your first app

This screen is your starting point, learn more in [Quickstart - create your first app](/getting-started/builder-getting-started/quickstart-create-your-first-app) and in [Ninox AI assistant](/getting-started/builder-getting-started/intro-to-the-ninox-ui/ninox-ai-assistant).

## App screen <a href="#app-screen-your-main-working-screen" id="app-screen-your-main-working-screen"></a>

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

The app screen is where you spend most of your time working with data. In this screen you can:

* Access your tables
* Sort, filter, and hide or show columns to focus on what matters
* Switch between **Inline editing** and record by record editing in a side panel
* Turn **Builder mode** on to access the settings panel and change the structure of your app

Learn more in [App screen - your main working screen](/getting-started/builder-getting-started/intro-to-the-ninox-ui/app-screen-your-main-working-screen).

## Switch organizations and workspaces <a href="#switch-organizations-and-workspaces" id="switch-organizations-and-workspaces"></a>

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

When you use the **Global menu** in the main navigation, Ninox opens screens where you can:

* See all organizations you belong to and switch between them
* See all workspaces in the current organization
* Open **Organization settings** or **Workspace settings**

These screens help you change context quickly. Learn more in [Main navigation - settings, profile, and global menu](/getting-started/builder-getting-started/intro-to-the-ninox-ui/main-navigation-settings-profile-and-global-menu) and [Settings screen - user, organization, workspace](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace).

## Workspace home: inbox, documents, bookmarks, and history <a href="#workspace-home-inbox-documents-bookmarks-and-history" id="workspace-home-inbox-documents-bookmarks-and-history"></a>

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

The workspace home screen is the hub for one workspace. From here you can:

* Open **Inbox** for emails and conversations connected to your data
* Open **Documents** for files stored in this workspace
* Open **Bookmarks** for records you starred for quick access
* Open **History** for items you worked on recently

Use this screen as your launchpad into the apps and records you use most in a workspace. Learn more in [Workspace home - inbox, documents, bookmarks, and history](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history).

## Settings screen: user, organization, workspace <a href="#settings-page-user-organization-workspace" id="settings-page-user-organization-workspace"></a>

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

The **Settings** screen is a central place to configure:

* Your user account and **profile**, including name, email, and account deletion
* Your **organization**, such as its name, users, and subscriptions
* Your **workspace**, including name, users, integrations, and email settings

No matter where you open it from, the left settings menu is the same. Only the initially selected section changes depending on where you came from.

Learn more in [Settings screen - user, organization, workspace](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace) and [Main navigation - settings, profile, and global menu](/getting-started/builder-getting-started/intro-to-the-ninox-ui/main-navigation-settings-profile-and-global-menu).

## Key menus and panels across the UI <a href="#key-menus-and-panels-across-the-ui" id="key-menus-and-panels-across-the-ui"></a>

Across these main screens you see some menus and panels again and again. This section gives you a brief overview.

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

1️⃣ Main navigation

2️⃣ App navigation

3️⃣ Table area

4️⃣ Top bar

5️⃣ open Settings panel

### Main navigation <a href="#main-navigation" id="main-navigation"></a>

The main navigation is the vertical bar on the far left. Use it to:

* Access menus that let you switch organizations and workspaces
* Switch between workspaces and open the workspace home
* Open global areas like **Notifications** and **Settings**
* Open the **Profile** menu for **Profile**, **Contact support**, **Switch to dark mode**, **Change language**, and **Sign out**

### App navigation <a href="#app-navigation" id="app-navigation"></a>

Inside an app, the app navigation at the top left shows:

* The app name
* All tables and pages in the app

From here, builders can also open:

* **+ Create table** and its menu to open **Import table from CSV** and **Create page**
* **App settings** for app level configuration
* **Data model** for a visual overview of tables and relationships

### Top bar and table tools <a href="#top-bar-and-table-tools" id="top-bar-and-table-tools"></a>

At the top of the app screen, the top bar gives you tools to work with the current view, such as:

* **Search records**
* **Filter** and **Hidden columns** to focus your view
* **Import/export** to bring data in and out
* **Inline editing** to choose between spreadsheet style and record panel editing
* **Add record** to create new records

### Settings panel and Builder mode <a href="#settings-panel-and-builder-mode" id="settings-panel-and-builder-mode"></a>

On the right side of the screen, the **settings panel** appears when **Builder mode** is turned on.

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

Together they control whether you are building or just using an app:

* With **Builder mode** on, the settings panel is available and you can change tables, fields, automations, and permissions.
* With **Builder mode** off, the settings panel is hidden and the interface focuses on working with data only.


# App screen - your main working screen

Learn where everything lives on the app screen and how record editing works.

The main place where you work with data in an app is the app screen. Here you open tables, switch between tables and pages, and change the structure of your app.\
This page explains the layout of the app screen and shows you how the main tools work when you view and edit records.\
Turn on [**Builder mode**](#builder-mode) when you want to access build tools such as **Create table**, **Data model**, and the **settings panel**.

When you open an app, the screen can include a few main areas.

<figure><img src="/files/0ifA0TwqmConFVUmqxUf" alt=""><figcaption></figcaption></figure>

1️⃣ Main navigation

2️⃣ App navigation

3️⃣ Table area

4️⃣ Top bar

5️⃣ Settings panel, when **Builder mode** is on

## Main navigation - switch workspaces and open global areas <a href="#main-navigation-switch-workspaces-and-open-global-areas" id="main-navigation-switch-workspaces-and-open-global-areas"></a>

On the far left is the main navigation. From here you can:

* Switch to a different workspace or organization
* Open the workspace home
* Open **Ninox AI chat** <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i> to show the **Ninox AI assistant**
* Add additional apps to the current workspace
* Open **Settings**
* Open global areas such as **Notifications** and **Profile**

The main navigation is shared across the whole product, not just one app.

{% hint style="info" %}
When you work inside an app, click the magic wand icon in the main navigation to open the **Ninox AI assistant** in a side panel.
{% endhint %}

## App navigation - move between tables and pages <a href="#app-navigation-move-between-tables-and-pages" id="app-navigation-move-between-tables-and-pages"></a>

The app navigation is the panel directly next to the main navigation. It shows only items that belong to the current app.

Use this area when you want to stay inside one app and move between its working areas. In daily use, this usually means switching between data tables and app pages without going back to workspace home.

The main part of the app navigation shows:

* The workspace name
* **Invite users** <i class="fa-user-plus">:user-plus:</i> button
* All tables and pages in the current app

The selected table or page stays highlighted in the app navigation. This makes it easier to see where you are, especially in apps with many tables or pages.

When [**Builder mode**](#builder-mode) is on, the bottom of the app navigation shows the builder controls for the current app:

* **+ Create table** button with a menu arrow
* **App settings**
* **Data model**
* **Builder mode** toggle

When **Builder mode** is off, this area stays compact and only the **Builder mode** toggle remains visible.

The next sections explain these controls in more detail. They show how to create new tables or pages, open app-level settings, inspect the data model, and switch between working mode and building mode.

### Create new tables and pages from the app navigation <a href="#create-new-tables-and-pages-from-the-app-navigation" id="create-new-tables-and-pages-from-the-app-navigation"></a>

The **+ Create table** area at the bottom of the app navigation lets you add new objects to your app without leaving the app screen.\
Make sure [**Builder mode**](#builder-mode) is turned on to create new tables or pages.

You can either click the main button or open more options with the arrow.

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

From here you can:

* **Create table**\
  Creates a new empty table in the current app.
* **Import table from CSV**\
  Creates a table and fills it with data from a CSV file.
* **Create page**\
  Creates a page that you can use for dashboards, documentation, or other content.

#### Create a new empty table <a href="#create-a-new-empty-table" id="create-a-new-empty-table"></a>

{% stepper %}
{% step %}
**Start table creation**

In the app navigation, click **+ Create table** and choose **Create table**.
{% endstep %}

{% step %}
**Enter the table name**

Enter a **Name** for your table. This is the name people see in the app navigation and table tabs.
{% endstep %}

{% step %}
**Review the internal name**

Optionally change the autofilled **Internal name**. This is used in technical contexts and does not have to match the name.
{% endstep %}

{% step %}
**Choose whether to use AI suggestions**

Keep **AI suggestions** turned on to let Ninox propose fields for your table.
{% endstep %}

{% step %}
**Create the table**

Click **Create table**.
{% endstep %}
{% endstepper %}

Ninox adds the new table to the app navigation and opens it immediately.

#### Create a new table from CSV <a href="#create-a-new-table-from-csv" id="create-a-new-table-from-csv"></a>

{% stepper %}
{% step %}
**Start the CSV import**

In the app navigation, click the arrow next to **+ Create table** and choose **Import table from CSV**.
{% endstep %}

{% step %}
**Upload your CSV file**

Select and upload the CSV file you want to import.
{% endstep %}

{% step %}
**Check the table name**

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

In **Parse settings**, review the autofilled table name in **Name**. Ninox uses the CSV file name by default. Change it if needed.
{% endstep %}

{% step %}
**Check the internal name**

Review the autofilled **Internal name**. Ninox also takes this from the CSV file name. Change it only if needed.
{% endstep %}

{% step %}
**Review the parse settings**

Adjust the parsing options if your file is not detected correctly:

* **Encoding**, for example **UTF-8 (Unicode)**
* **Date format**
* **Number format**
* **Column separator**, for example bar, comma, semicolon, or tabulator
* **Text delimiter**, either double or single quotes
* **Include header** if the first row contains column names
* **Treat empty fields as null** if empty cells should be imported as `null`
  {% endstep %}

{% step %}
**Check the preview**

Review the preview on the right. It shows how Ninox reads the CSV data before import.
{% endstep %}

{% step %}
**Open field mapping**

Select **Map fields**.

<figure><img src="/files/GmbmEuta3O3hizRdGGHS" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Map the CSV columns**

For each CSV column, choose how Ninox should import it:

* Keep **Import** turned on to include the column
* In **Existing ninox fields**, choose **Do not map** to skip the column
* Choose **+ Create new** to create a new Ninox field
* Or select an existing Ninox field to map the CSV column to it
* If you choose **+ Create new**, select the field type below it, for example **Text**, **Number**, **Yes / No**, or **Date**
  {% endstep %}

{% step %}
**Choose the update policy if needed**

If you map a CSV column to an existing field, choose the **Update policy**:

* **Update** replaces the existing value
* **Update empty** fills only empty values
  {% endstep %}

{% step %}
**Create the table**

Click **Create table**.
{% endstep %}
{% endstepper %}

Ninox creates the table, adds the mapped fields, and imports the CSV rows as records.

#### Create a new page <a href="#create-a-new-page" id="create-a-new-page"></a>

A **page** is a canvas where you design how users interact with your app. You place fields, logic fields, view elements, and buttons on the page so it can serve as a starting point or dashboard for your app.

{% stepper %}
{% step %}
**Start page creation**

In the app navigation, click the arrow next to **+ Create table** and choose **Create page**.
{% endstep %}

{% step %}
**Enter the page name**

Enter a **Name**. This is the title people see in the app navigation.
{% endstep %}

{% step %}
**Review the internal name**

Optionally change the autofilled **Internal name**. This becomes part of the URL and must not contain special characters.
{% endstep %}

{% step %}
**Create the page**

Click **Create page**.
{% endstep %}
{% endstepper %}

Ninox adds the page to the app navigation and opens the settings panel automatically, where you can design the page with charts, text, and other components.

Learn more in [Create and customize pages](https://ninox-1.gitbook.io/ninox-docs/OE5eDeSCv1tCbV8e0YOj/builder-hub/visualize-and-organize-your-data/markdown).

### Open app settings from the app screen <a href="#open-app-settings-from-the-app-screen" id="open-app-settings-from-the-app-screen"></a>

The <i class="fa-gear">:gear:</i> **App settings** entry sits in the lower part of the app navigation when **Builder mode** is on. It opens the settings for the current app.

Use this screen to update the app name, icon, access, and visibility.

In **App settings** you can update:

* **App name**, which is the name users see in the app navigation
* The app icon, which appears next to the app name
* **Internal name**, which is the unique identifier used by the system

Under **Manage access and visibility** you can:

* Use **Allow access to** to control which [workspace user roles](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access) can open and use the app
* Turn on **Hide this app** to hide the app from normal users. Workspace admins can still find it on the workspace home page.
* Turn on **Hide the navigation bar inside this app** to hide the app navigation when **Builder mode** is off

Click **Update settings** to save your changes.

### Explore your data model <a href="#explore-your-data-model" id="explore-your-data-model"></a>

**Data model** in the app navigation opens a visual overview of your tables and their relationships. This helps you understand how data in your app fits together.\
Make sure [**Builder mode**](#builder-mode) is turned on to access the **Data model**.

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

In the data model view you can:

* See each table as a box with its fields
* Use **Create field** at the bottom of a table box to add a new field directly to that table
* Follow arrows between tables to understand relationships, such as which table links to which
* Use **Visible tables** to show or hide parts of the model when you have many tables
* Switch between **Labels** and **Names** to see either user friendly labels or internal names
* Turn **Show fields** on or off to show only table boxes or also the fields inside them
* Use **Create table** at the top to add a new table directly from this view

Use the data model when you plan changes to your app, want to explain the structure to new teammates, or need to check how tables are connected before adding automations or formulas.

### Builder mode <a href="#builder-mode" id="builder-mode"></a>

**Builder mode** switches the app between daily work and app design.\
The toggle is located at the bottom of the app navigation.

When **Builder mode** is off, the app stays focused on working with records:

* The table area and top bar stay available for daily work
* The app navigation stays compact
* **+ Create table**, **App settings**, and **Data model** are hidden
* The right-side **settings panel** is not available

This is the mode most end users work in.

When **Builder mode** is on, builder controls become available:

* The app navigation expands with **+ Create table**, **App settings**, and **Data model**
* You can open the right-side **settings panel** to edit table, field, and form structure
* More builder actions appear in context menus and setup screens

The **settings panel** can stay open or closed while **Builder mode** remains on.

## Table area - view and edit your records <a href="#table-area-view-and-edit-your-records" id="table-area-view-and-edit-your-records"></a>

The central part of the screen shows the current table or view.

In this area you can:

* Scroll through records
* Edit values directly in the grid (with **Inline editing** on)
* Add, duplicate, or delete records
* Open a single record in a side panel

You control how the table behaves with the top bar tools and with **Inline editing** mode.

### Use the table context menu <a href="#use-the-table-context-menu" id="use-the-table-context-menu"></a>

Right-click anywhere in the table to open the context menu. Use it for quick clipboard and selection actions without leaving the grid.

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

The menu includes:

* **Copy** to copy the current selection
* **Paste** to paste copied content into the table
* **Select all** to select all data in the current table view
* **Clear selection** to remove the current selection
* **Invert selection** to invert which cells are selected

This is useful when you want to copy values, prepare a larger selection, or adjust a selection before editing.

### Use actions for selected records <a href="#use-actions-for-selected-records" id="use-actions-for-selected-records"></a>

When you select one or more records, Ninox shows extra actions above the table. Use these actions to work with the current record selection.

Depending on your permissions and setup, this can include:

* **Clear selection** to unselect the current records
* **Bookmark records** to add the selected records to your bookmarks
* **Delete records** to remove the selected records

These actions help when you want to manage several records at once without opening them one by one.

## Top bar - search, filter, and organize your data <a href="#top-bar-search-filter-and-organize-your-data" id="top-bar-search-filter-and-organize-your-data"></a>

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

Above the table, you find the top bar. It contains tools for working with the current table or view, such as:

* **Search in records** to find matching records quickly
* **Hidden columns** to hide or show fields in the grid
* **Filter** to show only records that match certain conditions
* **Import/export** to bring data in and out
* **Inline editing** to choose between grid editing and the form view
* **Add record** to create new records

These actions affect only the current table or view, not the entire workspace.

### Search records quickly <a href="#search-records-quickly" id="search-records-quickly"></a>

Use **Search records** when you want to search for values in the current table or view.

1. Click **Search records**.
2. Type part of the value you are looking for.
3. Ninox shows matching records in the grid.

This is useful for quick lookups without setting up a full filter.

### Filter the table <a href="#filter-the-table" id="filter-the-table"></a>

Use **Filter** to show only records that match field-based conditions.

1. Click **Filter**.
2. In **Where**, select the field you want to filter.
3. In **Operator**, choose the condition you want to apply.
4. In **Value**, enter a value if the selected operator requires one.
5. Add more conditions in the next empty row if needed.

The available operators depend on the selected field type and the kind of comparison you want to make.

The table updates immediately while you build the filter. When a filter is active, the **Filter** button shows the number of active conditions. To remove a condition, click the trash icon on that row.

### Hide or show columns <a href="#hide-or-show-columns" id="hide-or-show-columns"></a>

Use **Hidden columns** to control which fields are visible in the grid.

If columns are currently hidden, the control shows the number of hidden fields, for example **4 hidden columns**.

1. Click **Hidden columns**.
2. Select or clear the checkboxes for the fields you want to show or hide.

This does not delete fields. It only affects the current view and helps you reduce visual noise.

### Import and export data <a href="#import-and-export-data" id="import-and-export-data"></a>

Use **Import/export** to move data in or out of the current table.

In this menu, **Import data** brings data into the current table. **Export data** downloads data from the current table.

Learn more in [Import and export data](/builder-hub/design-your-app/import-and-export-data).

### Bulk edit <a href="#bulk-edit" id="bulk-edit"></a>

Click **Import/export** and select **Bulk edit** to update several records in one action.

Use it when the same change should apply to many records, for example a shared status or date.

Learn more in [Bulk edit records](/user-hub/common-tasks/work-with-data#bulk-edit-records).

### Integrate API <a href="#integrate-api" id="integrate-api"></a>

Click **Import/export** and select **Integrate API** to open the **API Explorer** and connect Ninox with external systems through the API.

Use it to explore how you can use the API to create, update, and delete entities and their data.

Learn more in [Intro to the Ninox API](/getting-started/ninox-api-getting-started/intro-to-the-ninox-api).

### Work directly in the grid with inline editing <a href="#work-directly-in-the-grid-with-inline-editing" id="work-directly-in-the-grid-with-inline-editing"></a>

On a table, you can work with records either directly in the grid or one record at a time in a side panel. How editing behaves depends on whether **Inline editing** is turned on or off.

When **Inline editing** is on, you can click into a cell and change the value directly in the grid. This is the fastest way to clean up and update data across many records.

You can use grid editing with **Inline editing** on to:

* Fix spelling mistakes and other small text changes
* Update statuses across many records
* Change dates or numbers in place
* Move quickly between cells and records with the keyboard

For fields that have a specific input type, Ninox shows the appropriate control directly in the grid when you click a cell, such as:

* A dropdown for choice fields
* A date picker for date fields
* A checkbox for boolean fields

This lets you stay in the grid while still using precise input controls instead of typing everything manually.

If you prefer to focus on one record at a time, or you need more space to see all fields and related data, turn **Inline editing** off. In this case, clicking a record opens it in the form view instead of editing it directly in the grid.

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

In the form view you typically:

* See fields grouped into sections, which makes long forms easier to understand
* Have more room to read and edit all details of a record
* Can add and review related data more comfortably than in the grid

Compared to **Inline editing**, the form view can also give you more record-specific functions. Depending on the table setup and your permissions, this can include:

* Separate **Files**, **Emails**, and **History** tabs
* Actions such as **Bookmark**, **Print**, and **Delete**
* Linked records and tables

This record‑by‑record style is useful when:

* Records have many fields and would be hard to handle only in the grid
* You want to review details carefully before making changes
* You need to work with related data that is easier to manage in a full record view

You can switch between these two styles at any time using **Inline editing**:

* Turn **Inline editing** on when you want fast editing in the grid.
* Turn **Inline editing** off when you want more space, context, and a side panel for each record.

### Add a new record <a href="#add-a-new-record" id="add-a-new-record"></a>

Click **Add record** to create a new record in the current table.

What happens next depends on the current editing mode:

* With **Inline editing** on, you can start entering values directly in the grid.
* With **Inline editing** off, the new record opens in the form view.

## Settings panel - configure tables, fields, and views <a href="#settings-panel-configure-tables-fields-and-views" id="settings-panel-configure-tables-fields-and-views"></a>

The **settings panel** is where you change the structure of the current table. It is available when [**Builder mode**](#builder-mode) is turned on.\
Click the **Open settings panel** <i class="fa-gear">:gear:</i> icon in the top right to show it.

{% hint style="info" %}
To resize the panel, drag its left border.
{% endhint %}

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

You can work in two tabs:

* **Table** for a list-based view of the table structure
* **Form** for a drag-and-drop view with the form view

Both tabs edit the same table. The difference is the workflow. Use the **Table** tab when you want a structured view of table settings and fields. Use the **Form** tab when you want to build and arrange the form view more visually.\
The next sections show what you can do in each tab.

### Use the Table tab

Use the **Table** tab when you want speed and overview. At the top of the panel, select **Table**. Then choose one of these tabs: **Settings** or **Fields**.

With the **Settings** tab you control table-wide behavior. Use it to adjust the table’s core properties. You can also add logic to the table for create, update, and delete events. You have options to control access and to enable file attachments, change history, or hide the table for end users.

**Fields** is the fastest way to manage structure. You get a searchable list of all fields with their labels and types, and you can filter it to focus on data fields, relationship fields, or functions.\
Use **Create field** to add a field directly to the list.\
The menu next to the filter helps with bulk work, so you can copy selected fields, paste them again, or delete several at once. This is useful when you want to reuse a field setup or clean up a larger table quickly.

<figure><img src="/files/0sjAmHCCi7Xysees5Bkr" alt=""><figcaption></figcaption></figure>

### Use the Form tab

Use the **Form** tab when you want to work more visually on the form view.\
At the top of the panel, select **Form**. Then choose one of these tabs: **Add**, **Settings**, or **Structure**.

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

**Add** lets you build and update a table in a more visual way. Drag, for example, a data field, into the form view and Ninox creates that field in the table too.\
The other categories help you shape the form itself. For example, you can add relationships for linked records, controls like buttons or toggles, and embedded views like a table or calendar. You can also add charts for visual summaries and layout elements (containers) like rows, tabs, or accordions.

**Settings** shows the options for the selected form element. Here you can rename the element and adjust how it looks and behaves in the form. Depending on the element type, this can include display options like spacing, borders, background, and layout direction, as well as visibility settings. If nothing is selected, this area may be empty.

**Structure** shows what is already in the form and how it is arranged. You can quickly scan the hierarchy, see each element’s type, check its visibility, and open more actions when needed. This is useful when the form grows and you want a clean overview without clicking through every element.

{% hint style="info" %}
To close the settings panel, click the **Close panel** icon in the top right.
{% endhint %}


# Settings screen - user, organization, workspace

Learn what you can configure at user, organization, and workspace level in Settings.

The **Settings** screen is the central place where you configure your user account, organizations, and workspaces.

You can reach the **Settings** screen from different places:

* **Settings** in the main navigation
* **Global menu** in the main navigation
* **Profile** menu in the main navigation for your user settings

No matter where you open it from, the layout is similar and the left settings menu always contains the same main sections. What changes is which section is selected first, depending on how you opened the screen.

It helps to think of the three levels on the **Settings** screen as:

* **User account** settings apply only to you as a person, regardless of which organization or workspace you are in.
* **Organization** settings apply to everything inside that organization, including all its workspaces.
* **Workspace** settings apply only to the selected workspace and can differ from workspace to workspace in the same organization.

## User account and Profile settings <a href="#user-account-and-profile-settings" id="user-account-and-profile-settings"></a>

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

On the **Profile** screen you can:

* Upload or change your profile image
* Check or update your email address, display name, first name, and last name
* Add or update your company name, company size, and role
* Update your password
* Delete your account

{% hint style="info" %}
Changes you make here apply to your own user profile, not to a specific organization or workspace.
{% endhint %}

## Organization properties <a href="#organization-settings" id="organization-settings"></a>

The **Organization** section contains settings that apply only to the current organization, you can:

* Click the arrow next to the organization name to switch to another organization or set up a new one
* Change general organization details such as the name and internal name
* Manage organization users, roles, and permissions
* Manage the organization subscription and track usage

### Organization settings <a href="#organization-settings" id="organization-settings"></a>

<figure><img src="/files/0DGfSUfHlJsy3XPOnlIO" alt=""><figcaption></figcaption></figure>

In **Organization settings** you can:

* See and change the **Organization name** and **Internal name** of the organization
* Delete the organization

Changes you make here affect all workspaces and apps inside this organization.

If you choose to delete an organization, Ninox asks you to confirm the action explicitly before it is carried out.

{% hint style="danger" %}
Deleting an organization cannot be undone. All workspaces inside this organization are permanently deleted, and all data associated with those workspaces is lost.
{% endhint %}

To delete an organization:

1. Select the confirmation checkbox.
2. Confirm your email address.
3. Confirm the exact organization name.
4. Click **Delete organization**.

### Organization users and roles

The **Organization users & roles** screen is the central place to manage access across the current organization.

On this screen you can:

* Use **Search by email…** to find a specific user
* Use **Filter by status** to narrow the list by invitation or account status
* Click **+ Invite users** to add new organization users
* Select users with the checkboxes in the list for bulk actions or to remove users from the organization with <i class="fa-trash-can">:trash-can:</i> **Remove user**
* Change a user’s organization role directly in the **Role** column

You can also see:

* Which workspaces a user belongs to in the **Workspaces** column
* When a user joined or when the invitation was sent in **Joined / Invited**
* Whether the email address is confirmed in **Verified**
* The current access state in **Status**, for example **Active**

Available organization roles include:

* **Member** for regular users who work in assigned workspaces
* **Admin** for full organization access
* **Billing** for subscription and payment management
* **User management** for managing users and invitations
* **Workspace management** for creating and managing workspaces

Learn more in [Manage organization access](/builder-hub/manage-your-organization-and-workspace/manage-your-organization/manage-organization-access).

### Subscription and usage

The **Subscription and Usage** screen lets you manage your organization plan and track usage.

In the **Subscription** tab you can:

* See which plan is active. The current plan is marked on its card.
* Switch between **Monthly** and **Annual** billing.
* Compare **Free**, **Team**, and **Business** side by side.

The available plans include:

* **Free** for individuals getting started
* **Team** for small teams building and sharing apps
* **Business** for teams that need advanced security and control

Use the plan cards to compare included features, limits, and pricing.

In the **Usage** tab you can:

* Switch between **Organization** and **Workspace** usage.
* Check when usage data was last updated.
* Review current usage against the included limit for each metric.

In **Organization** usage you can track:

* **Storage**
* **Records**
* **API calls**
* **Documents generated**
* **Linked emails**

In **Workspace** usage you can:

* Search for a workspace
* Compare usage across workspaces in one table
* Review **Storage**, **Records**, **API calls**, **Documents generated**, **Sent emails**, and **Linked emails** for each workspace

This gives you one place to manage billing and monitor usage for the organization and its workspaces.

## Workspace properties <a href="#workspace-properties" id="workspace-properties"></a>

{% hint style="info" %}
All changes you make here apply to the current workspace only.
{% endhint %}

In **Workspace** properties you can:

* Click the arrow next to the workspace name to switch to another workspace or set up a new one
* Change general workspace details such as the name and internal name
* Adjust workspace appearance, such as colors or the icon
* Manage workspace users, roles, and permissions
* Manage API access and integrations
* Connect and manage email settings

### Workspace settings <a href="#workspace-settings" id="workspace-settings"></a>

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

In the workspace settings section you can:

* See and change the **Workspace name**
* Adjust the **Internal name** of the workspace
* Delete the current workspace

If you choose to delete a workspace, Ninox asks you to confirm the action explicitly before it is carried out.

{% hint style="danger" %}
Deleting a workspace cannot be undone. The workspace is permanently deleted, and all data associated with this workspace is lost.
{% endhint %}

### Workspace users and roles <a href="#users-and-roles" id="users-and-roles"></a>

<figure><img src="/files/5OygetLJw0mOUvx3eNh3" alt=""><figcaption></figcaption></figure>

The **Workspace users and roles** screen is where you manage access for the current workspace only.

On this screen you can:

* Click **+ Invite users** to add users to the workspace
* Change a user’s workspace role directly in the **Role** column
* Use **Search by email** to find specific members
* Use **Filter by status** to review invitation and account status

You can also see:

* When a user joined or when the invitation was sent in **Joined / Invited**
* Whether the email address is confirmed in **Verified**
* The current access state in **Status**, such as **Active**

Available workspace roles include:

* **Admin**: Full access to the workspace.
* **Editor**: Can read, create, edit, and delete data.
* **Viewer**: Can read and export data, but cannot create, edit, or delete it.
* **None**: No default workspace role. Use this when access should come only from custom roles.

Learn more in [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

### API and integrations <a href="#workspace-integrations" id="workspace-integrations"></a>

The **API and integrations** screen is where you manage API access and workspace integrations for the current workspace.

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

The Ninox public API lets you access workspace data programmatically from external systems. An API key is required to authenticate requests. Each key only grants access to resources in this workspace.

On this screen you can:

* Click **Create new API key** to generate a new key
* Open the API documentation links for **Swagger UI**, **JSON schema**, and **YAML schema**
* Review all API keys created for this workspace
* Revoke keys that are no longer needed

For each API key, you can see its name, what it can access, when it expires, who created it, and when it was created.

### Email integration <a href="#email-integration" id="email-integration"></a>

Access all your emails directly in your Ninox workspace. This integration keeps your workspace and email communication in sync with just a few clicks. Connect your inbox to Ninox and start syncing your emails.

To connect your inbox, open **Email integration** in the navigation.

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

Click either **Continue with Google** or **Continue with Microsoft**. Ninox will automatically use your prefilled email information to connect your account.

Once connected, your email address will be displayed along with an option to disconnect if needed.

Select **Disconnect** to remove your email account connection.


# Main navigation - settings, profile, and global menu

Learn how the main navigation helps you switch context and open Settings.

The main navigation is the vertical bar on the very left. It provides quick access to key areas, lets you switch context, and helps you manage your workspaces and apps.

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

* [**Global menu**](#the-global-menu) sits at the top of the main navigation. Click the 3x3 dots icon to open it. It gives you access to search, organization and workspace switching, and quick access to settings.
* **Home** takes you to [workspace home](/getting-started/builder-getting-started/intro-to-the-ninox-ui/workspace-home-inbox-documents-bookmarks-and-history), where you can access your inbox, documents, bookmarks, and history.
* **Ninox AI** opens the [**Ninox AI assistant**](/getting-started/builder-getting-started/intro-to-the-ninox-ui/ninox-ai-assistant) in a side panel, so you can keep working in the current screen.
* **Create app** lets you create a new app in the current workspace.
* All apps in the current workspace are listed below. Click any app to open it.
* **Settings** at the bottom of the main navigation opens the central [Settings screen](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace), where you configure your user account, organization, and workspace.
* **Help & support** opens a menu with guided **Product tours**, direct access to the **Documentation**, and the option to [**Contact support**](/user-hub/administration/contact-support).
* Use **Profile** to open [**personal settings**](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace#user-account-and-profile-settings), switch to dark mode, change the language, or **Log out**.

### The Global menu <a href="#the-global-menu" id="the-global-menu"></a>

The **Global menu** is always available, no matter which app or table you have open. Click the **3x3 dots** icon at the top of the main navigation to open it. It brings search, context switching, and workspace-level actions together in one place. Use it to quickly switch organizations, workspaces, or open settings without losing your place.

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

Use the search bar at the top when you want to jump quickly to an organization, workspace, or another item.

The menu also helps you move between levels. You can open the current organization or workspace directly from here. If you work across multiple organizations or workspaces, use **Switch organization** or **Switch workspace** to change context without leaving your flow.

From **Settings**, you can open the central settings area for your user account, organization, or workspace. Which section opens first depends on where you came from.

**Go to Ninox 3** takes you to the classic Ninox product.


# Workspace home - inbox, documents, bookmarks, and history

Learn what you can do on workspace home, from email to documents and recent records.

The workspace home is the starting point for work inside a single workspace. From here you can open your inbox, documents, bookmarks, and history, and then jump into the apps and records that matter most.

When you open **Home** for a workspace, you first see the current workspace and the actions you are most likely to need right away. You can quickly **Invite users**, <i class="fa-user-plus">:user-plus:</i> move to **Inbox**, **Documents**, **Bookmarks**, or **History**, and get back to the part of the workspace you want to work in.

You also get direct access to the apps in this workspace. From here, you can open an app, search for one, or add another app without leaving the home screen.

### Inbox <a href="#inbox" id="inbox"></a>

When an inbox is connected to your workspace, the **Inbox** section displays your emails and conversations in a familiar, organized layout.

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

The inbox is split into two areas. On the left, you browse your email list, switch folders, filter for read status, and search for specific messages. You can also start a new email from here.

On the right, you read the selected message and act on it right away. You can reply, forward the email, or link it to a record.

This layout helps you keep track of communication related to your workspace data and take action directly from the inbox.

If no inbox is connected to your workspace yet, Ninox will display a message letting you know. You can connect an inbox right away from this screen, making it easy to start linking emails and conversations to your workspace data.

To disconnect your email account switch to [Email integrations](/getting-started/builder-getting-started/intro-to-the-ninox-ui/settings-screen-user-organization-workspace#email-integration) on the Settings screen.

Learn more in [Work with emails](/user-hub/common-tasks/work-with-emails).

### Documents <a href="#documents" id="documents"></a>

The **Documents** section is where you manage files stored in the current workspace.

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

You can organize documents with folders, upload new files, search by name, and browse everything in one list. The list shows key details such as file name, size, and last modified date, so you can quickly find the document you need.

Learn more in [Documents](/user-hub/ninox-basics/documents).

### Bookmarks <a href="#bookmarks" id="bookmarks"></a>

The **Bookmarks** screen provides quick access to all records you have bookmarked in your workspace. This view is designed to help you efficiently manage and interact with your most important records.

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

All your bookmarked records appear as cards on the **Bookmarks** screen. Each card shows key information from the record, so you can quickly find the one you need.

Click a record card to open the **form view**. There you can view the full record and make changes as needed.

To remove a record from your bookmarks, click the **X** in the upper right corner of the card. This removes the bookmark only. The record stays in your database.

Learn more in [Bookmarks](/user-hub/ninox-basics/bookmarks).

{% hint style="info" %}
To bookmark a record in a table, open the form view and click the **star icon** at the top. The record will then appear on your **Bookmarks** screen.
{% endhint %}

### History <a href="#history" id="history"></a>

The **History** section shows recent record activity in the current workspace. This helps you track changes across records and see who did what and when.

<figure><img src="/files/26IfTOoUgcAUVBw3f2sa" alt=""><figcaption></figcaption></figure>

At the top of the history screen, you can search for entries and narrow the list with **Date** and **User** filters. This helps you focus on a specific time range or one person’s changes.

The list is sorted with the newest activity first. Entries are grouped by day and user, so you can scan activity more quickly. Each entry shows the record name, the record ID, the action, and the exact time of the change.

Below the first line, Ninox shows the field values captured for that event:

* For **created records**, all fields that were filled during creation are displayed.
* For **updated records**, only the fields that were changed in that update are shown.
* **Deleted records** are also listed for reference.

The details shown depend on the fields in that record type and on what changed in that event.

Learn more in [History](/user-hub/ninox-basics/history).

### Options to create a new app <a href="#options-to-create-a-new-app" id="options-to-create-a-new-app"></a>

On the right side of **Home**, you can choose how to create a new app.

<figure><img src="/files/3ELpEB13kfh2VKEfPemI" alt=""><figcaption></figcaption></figure>

Choose **Create app with Ninox AI** when you want Ninox to handle most of the setup. It uses AI to generate the app and its details automatically.

For full control from the start, use **Build app manually**. You create the app yourself by adding tables, fields, and views. Learn more in [Your first app](/getting-started/builder-getting-started/set-up-your-ninox-manually/your-first-app).


# Ninox AI assistant

Learn when to use the Ninox AI assistant and what to include for great results.

The **Ninox AI assistant** helps you turn an idea into a usable app in minutes. From a short description, it creates a strong first version with suggested tables, fields, relationships, and an initial app setup. On the app screen, it also helps you update the current app with common structure changes. Ninox also supports **AI suggestions** during table creation, so you can get helpful field proposals even when you build step by step.

That means less time spent modeling from scratch and faster progress from day one. You get something concrete to review, test, and improve right away, so you can shape the app around your process and show early results faster.

It works especially well when you already know your use case and want to move quickly. If you know what you need to track, but do not want to build every table and field manually, the AI assistant helps you save time, reduce setup effort, and start with confidence.

You can access the AI assistant in these ways:

* When you open Ninox for the first time, you see **Create app with Ninox AI** on the landing screen.
* You can also start it later from workspace **Home** by clicking **Create app with Ninox AI**.
* When you are on the app screen, open the main navigation and click **Ninox AI** <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i>.

The landing screen with the AI assistant option is only shown the first time you access Ninox. After that, use workspace **Home** to create a new app with AI, or open **Ninox AI** from the main navigation while working inside an app.

<figure><img src="/spaces/YwCp7NT87JGgngrkhfHT/files/zDir2ILNYUBsmqufsKBa" alt=""><figcaption></figcaption></figure>

To see the complete flow of using the Ninox AI assistant to create an app, including each step in the interface, check [Quickstart - create your first app](/getting-started/builder-getting-started/quickstart-create-your-first-app).

### AI assistant on the app screen <a href="#ai-assistant-on-the-app-screen" id="ai-assistant-on-the-app-screen"></a>

On the App screen, the AI assistant opens in a side panel. This lets you work on the current app without leaving what you are building.

From this panel, you can start a new chat, reopen earlier chats, view the current data model, and close the assistant when you no longer need it.

<figure><img src="/spaces/YwCp7NT87JGgngrkhfHT/files/npdIAYOYe3IfhQo63NV3" alt=""><figcaption></figcaption></figure>

Use the icons at the top to control the chat and editing context:

* **Add chat** starts a new chat. Use it when you want to work on a new topic separately from the current conversation.
* **View chat history** shows earlier chats in this app. You can search and reopen existing conversations there.
* **View data model** opens the current data model next to the chat. This lets you check tables and fields in the context of the proposed changes.
* **Close Ninox AI** hides the side panel and returns you to the normal App screen view.

Below the prompt field, Ninox shows predefined prompts for common app-building tasks, such as:

* **Add a table component** adds a table-based component to the current app view.
* **Add a chart** adds a chart component.
* **Add a metric card** adds a metric card component.
* **Add a container** adds a container for organizing content in the current view.

These prompts give you a fast starting point. You can use them as they are, or describe the change you want in your own words before you send it.

### AI help in the logic editor <a href="#ai-help-in-the-script-editor" id="ai-help-in-the-script-editor"></a>

You can also use Ninox AI anywhere you write scripts. Open the [logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features), describe what you want to build, and let AI help you create or refine the script.

In the logic editor, Ninox opens an AI panel next to the code area. This lets you work with AI directly while you write and refine your script.

If you are not sure how to start, click **Suggest ideas**. Ninox then shows example prompts based on the context of the current table and, for example, the logic field you are editing.\
You can select one of these suggestions or enter your own request in **Ask about Ninox script**. For the best result, mention the table, the fields, and the expected outcome. The more specific your prompt is, the closer the generated script will match your use case.\
Ninox AI then generates a script draft directly in the editor and shows a matching explanation in the AI panel.

<figure><img src="/spaces/YwCp7NT87JGgngrkhfHT/files/OaDAP2Z82To7daTsZRn8" alt=""><figcaption></figcaption></figure>

Review the suggested script before you keep it. You can **Accept** it, **Reject** it, or refine it by continuing the chat with Ninox AI. When you are ready to keep the current script in the logic editor, click **Apply**.

### Good habits when working with the AI assistant <a href="#good-habits-when-working-with-the-ai-assistant" id="good-habits-when-working-with-the-ai-assistant"></a>

Start with a description that gives the AI something solid to work with. Name the main things you need to track, add the most important fields, and explain how those records connect. For example, if you are planning a project app, say that each project can have many tasks and belongs to one customer.

This gives you a stronger first result, but it is still only a starting point. Review the generated tables and fields, then adjust them to match your process. Before you begin, also decide which workspace the new app should belong to, so the structure fits your setup from the start.

### AI suggestions for table creation <a href="#additional-ai-feature-ai-suggestions-for-table-creation" id="additional-ai-feature-ai-suggestions-for-table-creation"></a>

In addition to the AI assistant, Ninox also offers **AI suggestions** when you create new tables. When you enter a descriptive table name and keep **AI suggestions** enabled, Ninox proposes relevant fields for your table.

<figure><img src="/spaces/YwCp7NT87JGgngrkhfHT/files/HWrcSMZhwwDym2NcPRVy" alt=""><figcaption></figcaption></figure>

You can accept the suggested fields or turn off **AI suggestions** if you prefer to define all fields yourself.

### Query data with Ninox AI

Use natural language to find and filter records in your workspace. The **Ninox AI** lets you access your data without manually building queries. It understands your database structure, including tables, fields, relationships, and available choice options.

It does not read or analyze all records in advance. The **Ninox AI** uses the database schema to find the requested information.

For example, ask: “Show me all open orders.”\
The **Ninox AI** identifies the relevant table and status field. It then retrieves records where the status is "Open".

**Ninox AI** uses the same filtering and search capabilities as the Ninox user interface. It interprets requests written in natural language, but cannot apply filter conditions that Ninox does not support.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYwCp7NT87JGgngrkhfHT%2Fuploads%2Fp9wm1UCEq8H0jCrhKAl0%2Fai_assistant_en.mp4?alt=media&token=d0fe7cf2-2c99-4d5c-b7c8-c20612d2e64b>" %}


# Prompting

Get better results from Ninox AI with practical prompting tips and examples.

Ninox 4 comes with a built in AI assistant. You can think of it as a helpful colleague who is very fast at reading, writing and explaining things. It also knows a lot about data, logic and language.

In the beginning, you use the Ninox AI assistant mainly for one thing:\
to create your first app from a description and refine that description until the app fits your needs.

## What a prompt is in Ninox 4 <a href="#what-a-prompt-is-in-ninox-4" id="what-a-prompt-is-in-ninox-4"></a>

A prompt is what you type into the Ninox AI assistant to describe the app you want to build.

You tell Ninox AI:

* what kind of app you want,
* for which use case or team,
* and which data you want to track.

Ninox AI then turns this description into an initial data model:

* tables,
* fields in each table,
* relationships between tables.

You stay in control. If you do not like the result, you refine your description and try again or adjust the data model manually.

## Getting started: describe your first app <a href="#getting-started-describe-your-first-app" id="getting-started-describe-your-first-app"></a>

When you land on the blank app creation screen, you see the Ninox AI assistant panel with an input field like “Describe what you want to create”.

<figure><img src="/spaces/YwCp7NT87JGgngrkhfHT/files/CkPJgHp81izNukyYWqUL" alt=""><figcaption></figcaption></figure>

You can start with a short sentence. For example: "I want an app to manage customer projects and invoices."

This is enough for Ninox AI to create a basic structure, but you will get a better result if you add a bit more detail.

### Examples of better and worse prompts <a href="#examples-of-better-and-worse-prompts" id="examples-of-better-and-worse-prompts"></a>

Seeing concrete examples is often the easiest way to learn prompting. In the following pairs you will find a short, vague prompt next to a more helpful version for the same task.\
You do not have to write long texts every time. A few extra words of context already make a big difference in the first version of your app.\
Notice how a little extra context, a clear goal and a hint about the outcome already help.

#### CRM example <a href="#crm-example" id="crm-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create CRM app."</td><td><p>Ninox AI has very little to work with:</p><ul><li>It does not explain what kind of CRM you need.</li><li>It does not say who will use it or for which process.</li><li>It does not describe which data you want to store or report on.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I need a simple CRM app to track B2B customers and sales opportunities.<br>Create the main tables for this, including useful fields and relationships between them."</td><td><p>This more helpful prompt works better because:</p><ul><li>It describes the use case: B2B customers and sales opportunities.</li><li>It defines the scope: a simple CRM app.</li><li>It tells Ninox AI to create tables, fields and relationships.</li></ul></td></tr></tbody></table>

#### Projects example <a href="#projects-example" id="projects-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create an app for projects."</td><td><p>This is very general:</p><ul><li>It does not say what “projects” means in your context.</li><li>It does not say which information you need for each project.</li><li>It does not show how projects relate to other data, such as customers or tasks.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I want an app to manage customer projects for a small agency.<br>Each project belongs to one customer and has a budget, start date, end date and status.<br>Create tables for Customers, Projects and Tasks, with tasks linked to projects."</td><td><p>This more helpful prompt works better because:</p><ul><li>It names the context: a small agency with customer projects.</li><li>It lists important fields for projects: budget, start date, end date and status.</li><li>It mentions relationships between tables: customers, projects and tasks.</li></ul></td></tr></tbody></table>

#### Vacation planner example <a href="#vacation-example" id="vacation-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create holiday tracker."</td><td><p>Ninox AI has to guess many things:</p><ul><li>It does not say whether you track people, requests or both.</li><li>It does not describe which dates and status values you need.</li><li>It does not explain how approvals should work.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I need an app to manage employee vacation requests.<br>Create tables for employees and vacation requests.<br>Each vacation request should have an employee, start date, end date, status and approver."</td><td><p>This more helpful prompt works better because:</p><ul><li>It defines the main tables: Employees and Vacation requests.</li><li>It lists key fields for each request: start date, end date, status and approver.</li><li>It shows how records are linked: each vacation request belongs to one employee.</li></ul></td></tr></tbody></table>

### General principles for good prompts <a href="#general-principles-for-good-prompts-in-the-app-creation-flow" id="general-principles-for-good-prompts-in-the-app-creation-flow"></a>

There is no perfect prompt, but a few simple principles help you get better first apps.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><h4 id="be-clear-about-your-goal">Be clear about your goal</h4></td><td><p></p><p>Tell Ninox AI what you want the app to help you with:</p><ul><li>“I want an app that helps me track …”</li><li>“I need a simple app for my team to manage …”</li></ul></td></tr><tr><td><h4 id="describe-your-main-objects">Describe your main objects</h4></td><td><p></p><p>Think about what you want to track and name those things:</p><ul><li>Customers, projects, invoices</li><li>Employees, requests, approvals</li><li>Assets, locations, maintenance logs</li></ul></td></tr><tr><td><h4 id="mention-important-fields">Mention important fields</h4></td><td><p></p><p>Add a short list of key information for each object:</p><ul><li>For customers: name, email, phone, industry, status</li><li>For projects: customer, budget, start date, end date, status</li><li>For invoices: invoice number, date, amount, status</li></ul></td></tr><tr><td><h4 id="point-out-relationships">Point out relationships</h4></td><td><p></p><p>If things belong together, say so:</p><ul><li>“Each project belongs to one customer.”</li><li>“Each invoice is linked to a project.”</li><li>“Each task is linked to a project and assigned to one employee.”</li></ul></td></tr></tbody></table>

### Iterating on your prompt <a href="#iterating-on-your-prompt" id="iterating-on-your-prompt"></a>

You rarely get the ideal app structure on the first try. It is normal to refine and try a few variants.

After Ninox AI has created a first data model:

* look at the tables and fields it created,
* note what is missing or not useful,
* update your description and run it again.

Here are some useful follow up prompts you can use:

* “Also include a table for quotes before they become invoices.”
* “Add a field in the Projects table to track the current project manager.”
* “Remove anything related to tasks. I only want customers and invoices for now.”
* “Also track the payment method and due date for each invoice.”

You can extend your original description or write a short follow up like: "Update the app so that each invoice also stores the due date and payment method."

Ninox AI then updates the data model. You can repeat this until the structure feels right.


# Intro to the Ninox API

Learn what the Ninox Public API does, how it works, and which core resources it exposes.

The Ninox API is a public interface that allows developers to interact programmatically with Ninox apps. It enables external applications, services, and scripts to securely access, read, and modify data stored in Ninox.

With the API, Ninox becomes more than a standalone platform. It becomes part of a larger ecosystem where your data can flow between systems.

Modern workflows rarely live in a single tool. Teams rely on multiple platforms for automation, analytics, communication, and operations. The Ninox API is designed to make integration with these tools simple and flexible.

### What you can do

* Automate repetitive tasks
* Build custom solutions programmatically
* Simplify migration to Ninox 4

Using the Ninox API, you can:

* Perform CRUD operations on modules
* Perform CRUD operations on tables
* Perform CRUD operations on fields, one by one or in batch
* Perform CRUD operations on records, one by one or in batch
* Import CSV data with `append`, `update`, and `upsert`
* Read workspace information

### What developers should know

These are the main expectations when you build against the API:

* The API is resource-oriented. The core resources are modules, tables, fields, records, and workspaces.
* Requests are sent over HTTPS and use JSON payloads.
* The API uses standard HTTP methods such as `GET`, `POST`, `PATCH`, and `DELETE`.
* Authentication uses a Workspace API Key passed in the request header.
* Each API Key is scoped to one workspace only.
* Some operations on fields and records support batch requests.
* The API is available through Swagger and as OpenAPI in JSON and YAML format.

### How it works

The Ninox API follows a RESTful architecture and communicates over HTTPS. This means:

* Requests are made to specific endpoints
* Data is exchanged in a structured format (typically JSON)
* Standard HTTP methods are used (`GET`, `POST`, `PATCH`, `DELETE`)

All requests require a Workspace API Key passed in the HTTP header. You can generate and manage keys within the "Workspace Integration" settings in the Ninox app.

Each API Key is linked to a specific workspace and grants access to data within that workspace only.

You can discover the Ninox Public API endpoints within a Swagger instance on <https://go.ninox.com/api/docs>.

You can also fetch the OpenAPI specification from <https://go.ninox.com/api/docs-json> or <https://go.ninox.com/api/docs-yaml>.


# Glossary

Quick definitions of terms used across the docs.

[A](#a) · [B](#b) · [D](#d) · [F](#f) · [H](#h) · [I](#i) · [L](#l) · [M](#m) · [N](#n) · [O](#o) · [P](#p) · [R](#r) · [S](#s) · [T](#t) · [V](#v) · [W](#w)

## A

{% columns %}
{% column width="25%" %}
**API key**
{% endcolumn %}

{% column width="75%" %}
An **API key** is a credential that lets external systems access Ninox data securely. You can create and manage API keys in your workspace settings.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**App**
{% endcolumn %}

{% column width="75%" %}
An **app** is what you build in Ninox to support a specific workflow, process, or task. It brings together the data, business logic in one user interface, so you and your team can enter data, see information, and run automations in one place.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**App navigation**
{% endcolumn %}

{% column width="75%" %}
The **App navigation** at the left inside an app shows the app name and all tables and pages in the app. Builders can also access **+ Create table**, **Import table from CSV**, **Create page**, **App settings**, and **Data model** from here.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**App screen**
{% endcolumn %}

{% column width="75%" %}
The **App screen** is the main screen inside an app. It includes the app navigation, the current table or page, the top bar, and builder tools such as the settings panel.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**App settings**
{% endcolumn %}

{% column width="75%" %}
The **App settings** screen lets you manage properties of the current app, such as its name.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Automation**
{% endcolumn %}

{% column width="75%" %}
An **automation** runs logic automatically when a defined event occurs, such as when a record is created or updated. The term trigger is also used for this. Use automations to handle repetitive actions in the background.
{% endcolumn %}
{% endcolumns %}

## B

{% columns %}
{% column width="25%" %}
**Bookmark**
{% endcolumn %}

{% column width="75%" %}
The **Bookmarks** screen gives you quick access to records you have marked as important in your workspace.\
To bookmark a record, open it and click the **star** icon at the top. Bookmarks help you keep your key records handy and easy to find and edit.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Builder mode**
{% endcolumn %}

{% column width="75%" %}
When you turn on **Builder mode**, you can design your app instead of just working with data. This mode reveals the settings panel and builder tools, so you can change tables, fields, and automations. Use **Builder mode** whenever you want to adjust the structure or logic of your app.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Button**
{% endcolumn %}

{% column width="75%" %}
A **button** is a UI element that can execute a script when clicked, allowing you to trigger actions manually.
{% endcolumn %}
{% endcolumns %}

## C

## D

{% columns %}
{% column width="25%" %}
**Data model**
{% endcolumn %}

{% column width="75%" %}
The **Data model** view gives you a visual overview of your tables and their relationships, helping you understand how your app’s data fits together. In this view, you can also add new tables, fields, and set up and adjust relationships directly. Use the **Data model** to plan, review, and update the structure of your app with ease.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Document**
{% endcolumn %}

{% column width="75%" %}
In Ninox, a **document** is any file attached to or generated from a record.\
The **Documents** screen helps you organize and manage all files stored in your workspace. You can upload files, create folders, and access deleted documents in the recycle bin. Use this section to keep your workspace files structured and easy to find.
{% endcolumn %}
{% endcolumns %}

## E

## F

{% columns %}
{% column width="25%" %}
**Field**
{% endcolumn %}

{% column width="75%" %}
A **field** stores one attribute of a record, such as a name, a date, or a number.\
In a table, each field appears as a column. You choose the field type so the data is stored and shown correctly.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Field type**
{% endcolumn %}

{% column width="75%" %}
A **field type** defines what kind of value a field stores and how you enter it. Examples are text, number, date, choice, file, and reference.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Filter**
{% endcolumn %}

{% column width="75%" %}
A **filter** limits the records shown in a view based on rules you define. Use it to focus on only the records that match specific conditions.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Function**
{% endcolumn %}

{% column width="75%" %}
A **function** is a predefined operation that performs a specific task, such as calculating values or formatting text. Functions are the building blocks of the Ninox logic and help you automate and customize your app’s behavior.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Form view**
{% endcolumn %}

{% column width="75%" %}
The **Form view** opens one record in a side panel so you can view and edit its details with more space and context. It is available when **Inline editing** is turned off.
{% endcolumn %}
{% endcolumns %}

## G

## H

{% columns %}
{% column width="25%" %}
**History**
{% endcolumn %}

{% column width="75%" %}
The **History** screen shows a chronological list of record activities, including created, updated, and deleted records. It helps you track changes in your workspace.\
You can also edit records directly from the History screen, making it easy to review and update your data as you track recent changes.
{% endcolumn %}
{% endcolumns %}

## I

{% columns %}
{% column width="25%" %}
**Inbox**
{% endcolumn %}

{% column width="75%" %}
The **Inbox** in your workspace home lets you see and manage your emails and conversations alongside your workspace data.\
To use the inbox, you will need to connect your existing email account first. Once connected, you can easily keep track of your communication without leaving Ninox.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Inline editing**
{% endcolumn %}

{% column width="75%" %}
**Inline editing** lets you work with your records directly in the grid, just like in a regular spreadsheet.\
You can easily switch between editing in this grid view or opening the form view to work with one record at a time.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Integration**
{% endcolumn %}

{% column width="75%" %}
An **integration** connects Ninox with another service or app. Integrations help you sync data, extend workflows, or connect communication and automation features.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Internal name**
{% endcolumn %}

{% column width="75%" %}
An **internal name** is the technical name Ninox uses for an object behind the scenes. It stays stable for URLs, logic, and automations, even if the visible label changes.
{% endcolumn %}
{% endcolumns %}

## J

## K

## L

{% columns %}
{% column width="25%" %}
**Logic**
{% endcolumn %}

{% column width="75%" %}
**Logic** is a set of instructions that controls how your app behaves. You use logic to define rules, automate steps, and connect your data to other systems.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Logic field**
{% endcolumn %}

{% column width="75%" %}
A **logic field** is a field whose value is defined by logic instead of manual input. The value is calculated automatically based on your rules, so it always follows the same logic.
{% endcolumn %}
{% endcolumns %}

## M

{% columns %}
{% column width="25%" %}
**Main navigation**
{% endcolumn %}

{% column width="75%" %}
The **Main navigation** sits on the far left of your Ninox screen. Use it to quickly jump between key areas, switch workspaces, and manage your apps.
{% endcolumn %}
{% endcolumns %}

## N

{% columns %}
{% column width="25%" %}
**Ninox AI assistant**
{% endcolumn %}

{% column width="75%" %}
The **Ninox AI assistant** helps you build apps faster by generating a first version of your data model and app from a short description.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Ninox scripting**
{% endcolumn %}

{% column width="75%" %}
**Ninox scripting** is an easy-to-use language that helps you automate tasks and customize how things work in Ninox. It is designed for working with your data and is simple enough for anyone to get started, even if you are not a developer.
{% endcolumn %}
{% endcolumns %}

## O

{% columns %}
{% column width="25%" %}
**Onboarding**
{% endcolumn %}

{% column width="75%" %}
**Onboarding** is the guided setup flow you see when you first start using Ninox. It helps you create your first organization, workspace, or app and get familiar with the interface.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Organization**
{% endcolumn %}

{% column width="75%" %}
An **Organization** is the top level in Ninox where everything comes together. It holds all your workspaces and helps you manage users, roles, and settings across them. Think of it as the home base for your team in Ninox.
{% endcolumn %}
{% endcolumns %}

## P

{% columns %}
{% column width="25%" %}
**Page**
{% endcolumn %}

{% column width="75%" %}
A **page** is a canvas where you design how users interact with your app. You place fields, logic fields, view elements, and buttons on the page so it can serve as a starting point or dashboard for your app.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Permission**
{% endcolumn %}

{% column width="75%" %}
A **permission** is a rule that allows or restricts an action in Ninox. Permissions control what users can view, edit, create, delete, or manage.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Profile**
{% endcolumn %}

{% column width="75%" %}
Your **Profile** in Ninox is where your personal information, account details, and preferences are stored. On your profile screen, you can update your name, email, and password. You can also upload a profile picture or delete your account. Your profile helps identify you in the workspace.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Prompt**
{% endcolumn %}

{% column width="75%" %}
A **prompt** is the text you enter into the Ninox AI assistant to describe what you want to build. Ninox uses it to suggest tables, fields, and relationships for your app.
{% endcolumn %}
{% endcolumns %}

## Q

## R

{% columns %}
{% column width="25%" %}
**Record**
{% endcolumn %}

{% column width="75%" %}
A **record** is one complete data entry, like a specific contact or product. It contains the values of all the fields that belong to this entry.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Row**
{% endcolumn %}

{% column width="75%" %}
A **row** is another word for a record when you see it in table or inline editing mode. Each row represents one record and shows its field values across the visible columns.
{% endcolumn %}
{% endcolumns %}

## S

{% columns %}
{% column width="25%" %}
**Script**
{% endcolumn %}

{% column width="75%" %}
A **script** is a set of instructions written in the Ninox scripting language. Use scripts to automate actions, perform calculations, or customize workflows within your Ninox app.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Settings panel**
{% endcolumn %}

{% column width="75%" %}
The **Settings panel** appears on the right side of the screen when **Builder mode** is on. Use it to configure tables, fields, and views.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Settings screen**
{% endcolumn %}

{% column width="75%" %}
The **Settings screen** is the central place where you configure your user account, organizations, and workspaces. You can access it from the gear icon, global menu, or profile menu in the main navigation.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Solution**
{% endcolumn %}

{% column width="75%" %}
A **solution** is the overall outcome you create with Ninox to support a business need. It includes your apps, data model, logic, and workflows that together help you achieve a specific goal.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Subscription**
{% endcolumn %}

{% column width="75%" %}
A **subscription** is the plan that defines which features, limits, and administration options are available in your organization. You manage it in the organization settings.
{% endcolumn %}
{% endcolumns %}

## T

{% columns %}
{% column width="25%" %}
**Table**
{% endcolumn %}

{% column width="75%" %}
A **Table** in Ninox is where you store and organize your data. Each table holds a list of records, with columns for different types of information. Use tables to keep related data together, like contacts or tasks.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Table view**
{% endcolumn %}

{% column width="75%" %}
A **table view** is a saved way to display a table on the **App screen**. It shows records as rows and columns, with the fields, filters, sorting, or grouping you chose for that view.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Top bar**
{% endcolumn %}

{% column width="75%" %}
The t**op bar** sits above the current table or view and gives you quick tools for working with data. You use it for actions such as search, filter, import, export, and adding records.
{% endcolumn %}
{% endcolumns %}

## U

## V

{% columns %}
{% column width="25%" %}
**View**
{% endcolumn %}

{% column width="75%" %}
A **view** is an element that displays records from a defined table with selected columns. On a page, you use views to show filtered lists of records that are relevant in a specific context.
{% endcolumn %}
{% endcolumns %}

## W

{% columns %}
{% column width="25%" %}
**Workspace**
{% endcolumn %}

{% column width="75%" %}
A **workspace** is where you create and run your apps within an organization. You can have several workspaces side by side, each holding its own apps, data, and settings so that different solutions stay clearly separated.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="25%" %}
**Workspace home**
{% endcolumn %}

{% column width="75%" %}
The **Workspace home** is your starting point inside a workspace. From here, you can open your inbox, documents, bookmarks, and history. You can also jump into the apps and records that matter most, or create new apps.
{% endcolumn %}
{% endcolumns %}

## X

## Y

## Z


# User Hub

Find the guidance you need to work faster and with confidence in Ninox.

Welcome to the User Hub. Explore helpful guidance for everyday work in Ninox, and use the chapters below to find your way around, complete common tasks, and manage your account.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Organizations and workspaces</strong><br>Work across organizations and switch between workspaces.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/pnL2bCV2agA6mlnOm1Hj">/spaces/BmcFtwhLmWInCVTaddAT/pages/pnL2bCV2agA6mlnOm1Hj</a></td></tr><tr><td><strong>Documents</strong><br>Store, organize, and manage files in your workspace.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/iG2keep2A0rWPGxPXbrk">/spaces/BmcFtwhLmWInCVTaddAT/pages/iG2keep2A0rWPGxPXbrk</a></td></tr><tr><td><strong>Bookmarks</strong><br>Save important records for faster access.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/cpZrauMOVMqO2zR61bd9">/spaces/BmcFtwhLmWInCVTaddAT/pages/cpZrauMOVMqO2zR61bd9</a></td></tr><tr><td><strong>History</strong><br>Review recent record activity and changes.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/UhHeq4ZY2IXbbmfMOPhU">/spaces/BmcFtwhLmWInCVTaddAT/pages/UhHeq4ZY2IXbbmfMOPhU</a></td></tr><tr><td><strong>Work with emails</strong><br>Connect your inbox and link emails to records.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/jI6lAP0xX1DGDtTMyogP">/spaces/BmcFtwhLmWInCVTaddAT/pages/jI6lAP0xX1DGDtTMyogP</a></td></tr><tr><td><strong>Im- and export data</strong><br>Import data into your app and export table data.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/0lgvUkumEoJnYPbOhERe">/spaces/BmcFtwhLmWInCVTaddAT/pages/0lgvUkumEoJnYPbOhERe</a></td></tr><tr><td><strong>Manage your profile</strong><br>Update your personal details and account settings.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/oVv2ul0PBr5jWmDbsLGT">/spaces/BmcFtwhLmWInCVTaddAT/pages/oVv2ul0PBr5jWmDbsLGT</a></td></tr><tr><td><strong>Contact Support</strong><br>Send a support request when you need help.</td><td><a href="/spaces/BmcFtwhLmWInCVTaddAT/pages/6FU1M5TPX7WYaw48o9E1">/spaces/BmcFtwhLmWInCVTaddAT/pages/6FU1M5TPX7WYaw48o9E1</a></td></tr></tbody></table>


# Organizations and workspaces

Organizations and workspaces define where your team works in Ninox.

An organization is your team’s home in Ninox.\
A workspace sits inside an organization. It holds the apps, data, and setup for a specific team, project, or process. Many teams create separate workspaces for different departments or areas of work.

### How they fit together

The structure is simple:

* One organization contains one or more workspaces.
* Each workspace contains one or more apps.
* Each app contains the tables, views, and pages you use every day.

### What this means in daily work

You work inside the workspaces that are available to you. From there, you open the apps you need and work with records, views, and tasks. How many workspaces you use depends on how your organization is set up in Ninox and on the permissions granted by your organization admin.

Your access can vary across apps, tables, and views. You might be able to add records without seeing all data. You might have write access in one table, but no access to another. You can also work with dashboards when your permissions allow it.


# Documents

The Documents screen is where you manage files stored in the current workspace.

You can organize documents with folders, upload new files, search by name, and browse everything in one list. The list shows key details such as file name, size, and last modified date, so you can quickly find the document you need.

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

#### How the Documents screen and record files work together

Files often enter the workspace through a record. For example, you might upload a file directly in the form view. That file is then stored in the workspace and also appears on the **Documents** screen.

When you open a record and select the **Files** tab, you only see the files attached to that specific record. This helps you review the files for one record, while the **Documents** screen gives you the full workspace-wide list.

The **Documents** screen shows all files uploaded anywhere in apps of the current workspace. This includes files added directly on the **Documents** screen and files attached to records.

#### Upload and organize files

Click **+ Upload** to add files to the workspace. You can organize these in folders, use the plus **+** next to **Folders** to create one. Open the three dots menu on a folder to rename or delete it.

#### Manage files

When you hover over a document, you can download it. The three dots menu on a document gives you actions for that single file only. From there, you can rename the file, move it to a folder, or move it to the **Recycle bin**.

When you select one or more documents, the top bar shows bulk actions. You can move all selected documents, download them together, or delete them together. Deleting selected documents from the top bar moves all of them to the **Recycle bin**.

#### Recycle bin and view options

Open the **Recycle bin** in the bottom left to review deleted documents. There you can search for files, restore them to the main list, or delete them permanently. You can also switch between **List** and **Grid** views. In grid view, documents appear as larger tiles with a preview.


# Bookmarks

Bookmark important records for quick access.

Use **Bookmarks** to keep important records close and get back to them fast.

The **Bookmarks** screen shows your bookmarked records as cards. It helps you return to important work without searching through tables.

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

From here, you can:

* open a bookmarked record in the **form view**
* review or edit the full record
* remove a bookmark without deleting the record

#### Add a bookmark

Add a bookmark when you want to save a record for quick access later.

{% stepper %}
{% step %}
**Open the record**

Go to the table that contains the record.\
Open the record in the **form view**.
{% endstep %}

{% step %}
**Add the bookmark**

Click the <i class="fa-star-sharp">:star-sharp:</i> **star icon** at the top of the **form view**.\
The record is now bookmarked.
{% endstep %}

{% step %}
**Open Home**

In the main navigation, click **Home**.
{% endstep %}

{% step %}
**Open Bookmarks**

On the **Home** screen, select **Bookmarks**.\
The **Bookmarks** screen opens again and shows your bookmarked records.
{% endstep %}
{% endstepper %}

#### Remove a bookmark

Remove a bookmark when you no longer need quick access to that record. This does not delete the record from your database.

You can remove a bookmark in two ways:

* on the **Bookmarks** screen by clicking **X** on the record card
* in the **form view** by clicking the <i class="fa-star-sharp">:star-sharp:</i> **star icon** again

{% stepper %}
{% step %}
**Open Bookmarks**

In the main navigation, click **Home**.\
Select **Bookmarks**.
{% endstep %}

{% step %}
**Remove the bookmark**

Find the record card you want to remove.\
Click the **X** in the top-right corner of the card.
{% endstep %}

{% step %}
**Keep working**

The bookmark disappears from the list.\
The record stays available in its original table.
{% endstep %}
{% endstepper %}


# History

Review recent record activity in the current workspace and see who changed what and when.

The **History** screen shows recent record activity in the current workspace. This helps you track changes across records and see who did what and when.

<figure><img src="/files/26IfTOoUgcAUVBw3f2sa" alt=""><figcaption></figcaption></figure>

At the top of the history screen, you can search for entries and narrow the list with **Date** and **User** filters. This helps you focus on a specific time range or one person’s changes.

The list is sorted with the newest activity first. Entries are grouped by day and user, so you can scan activity more quickly. Each entry shows the record name, the record ID, the action, and the exact time of the change.

Below the first line, Ninox shows the field values captured for that event:

* For **created records**, all fields that were filled during creation are displayed.
* For **updated records**, only the fields that were changed in that update are shown.
* **Deleted records** are also listed for reference.

The details shown depend on the fields in that record type and on what changed in that event.

Click the first line of a history entry to open the **form view** on the right side of the screen.

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

The form view gives you the full context for the selected record without taking you out of History. You can review the current data, make changes, and move between tabs such as **Record**, **Files**, **Emails**, and **History** when you need more detail.

At the top of the form view, you can bookmark or delete the record. The three dots menu gives you additional record actions, so you can continue working from the same place instead of switching screens.


# Work with data

## Search records in a table view

Use **Search in records** when you want to find records that contain specific values in the current table view.

1. Click **Search in records**.
2. Type a part of the value you are looking for.
3. Ninox shows matching records in the grid.

This is useful for quick lookups without setting up a full filter.

## Bundle results of multiple searches

You can collect results across multiple search runs in one view. This is useful when you want to, for example, bookmark or delete several selected records at once.

{% hint style="info" %}
Only users whose role allows deleting records in this table can see the checkbox column in table view.
{% endhint %}

1. Start your first search.
2. In the first column of the table, select the checkbox for each record you want to keep selected.
3. Clear the current search by clicking the <i class="fa-circle-x">:circle-x:</i> in the search field and start your next search.\
   This keeps the selected records highlighted.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBmcFtwhLmWInCVTaddAT%2Fuploads%2FaU0jsQ21gbyjAaN7u1rv%2Fbundle_search.mp4?alt=media&token=03e2a12f-d911-45ea-be9a-82a464202b0a>" %}

To select or deselect all records, use the checkbox in the column header or use <i class="fa-xmark">:xmark:</i> **Clear selection** in the top bar.\
Selecting all visible records with the checkbox in the column header ends the current search cycle. If you start a new search afterwards, Ninox clears the current selection.

## Bulk delete records

Use bulk deletion to delete a group of records or a selected set at once.

{% hint style="info" %}
This function is only available to users whose role allows deleting records in this table. Admins can manage this permission in the table settings.
{% endhint %}

{% stepper %}
{% step %}

### Open the table

Choose the table that contains the records you want to delete and open a table view.
{% endstep %}

{% step %}

### Find and select the records to be deleted

Use filters and **Search in records** to find the records you want to delete.

Then select them with the checkbox in the first column.
{% endstep %}

{% step %}

### Execute the bulk deletion

Click the red trash bin in the top bar above the table.

Ninox shows the number of selected records. Click the red **Delete** button to delete them permanently.
{% endstep %}
{% endstepper %}

## Bulk edit records

Use bulk edit to save time when you need to update the same fields across many records at once.\
You can apply a fixed value, clear existing values, or generate new values with logic.

{% stepper %}
{% step %}

#### Open the table and limit the records

Open the table you want to update.

Optionally use <i class="fa-bars-filter">:bars-filter:</i> **Filter** to show only the records you want to update.

{% hint style="info" %}
Bulk edit only changes records that are currently visible in your table.
{% endhint %}
{% endstep %}

{% step %}

#### Open the bulk edit dialog

In the table toolbar, click **Import/export**. Then select **Bulk edit**.
{% endstep %}

{% step %}

#### Create rules

Click **+ Add rule**.

Select the **Field** you want to update.

You can only update fields in the current table that store data. You can't bulk edit logic fields, control elements, or layout elements.

Under **Update with** choose the type of change:

* **Constant value** enters the same value for all displayed records
* **Clear** removes the current value from the field
* **Calculated value** uses logic to generate the new field value

Enter the **Value** you want to apply.

For **Calculated value**, enter the logic that should generate the new value.

Add more rules if you want to update more fields in the same table.

<figure><img src="/files/q2dfdk6GfhVnJk4uln1y" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Review the result

Click **Preview changes** to check the result.

<figure><img src="/files/TOAwnL9kfXBUj0WeExgq" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Apply or discard the changes

Then choose one of these actions:

* **Apply changes** confirms the update
* **Back** returns to the rules so you can adjust them
* **Cancel** closes the process and lets you start over
  {% endstep %}
  {% endstepper %}


# Work with print layouts and generate PDFs

Print layouts and generate PDFs from your records.

Use a print layout to turn the data in your records into a printed PDF.

{% hint style="warning" %}
If you have the **Admin** role, you can create, adjust, and save print layouts.

With other roles, you can open existing print layouts and generate PDFs. If no layout is saved, use the automatically generated layout.
{% endhint %}

Open a record in any view. Click the <i class="fa-print">:print:</i> printer icon in the top right. You can also open the three-dot menu and select **Print record**.

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

Ninox opens the first saved print layout in the table. If no saved layout exists, Ninox generates one with all available fields.

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

{% hint style="info" %}
If you do not have the **Admin** role, you cannot create or adjust print layouts.
{% endhint %}

### **Open the layout you need**

If a table has multiple print layouts, select one from the list on the left side of the top bar.

## Generate a PDF <a href="#generate-a-pdf" id="generate-a-pdf"></a>

To print the chosen layout, click **Generate document** in the top right. By default, the PDF opens in your browser.

Click the arrow next to **Generate document** to choose what to generate:

* **Generate for selected record**
* **Generate for all records** <i class="fa-circle-question">:circle-question:</i>

Generating all records creates a single PDF containing all records on separate pages.

{% hint style="info" %}
**Generate for all records** is available only when you open a record from a table view.
{% endhint %}


# Work with emails

Connect your inbox, manage email communication, and link emails to records in your workspace.

Use emails in Ninox to stay organized and keep important communication close to your data. Connect your inbox, work with messages in your workspace, and link emails to the right records so you always have the full context.

### Understand the inbox <a href="#understand-the-inbox" id="understand-the-inbox"></a>

When an inbox is connected to your workspace, the **Inbox** section shows your emails in a familiar layout.

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

The inbox has two main areas:

* On the left, you browse messages and folders.
* You can filter by read status and search for emails.
* You can also start a new email here.

On the right, you open the selected message and work with it directly. From there, you can:

* Read the full message
* Reply or forward
* Link the email to a record

This makes it easier to stay in context.

### Connect your inbox <a href="#connect-your-inbox" id="connect-your-inbox"></a>

To use email features in Ninox, first connect your inbox in your workspace. If no inbox is connected yet, Ninox shows a message in the **Inbox** section where you can start the setup.

You can also connect it from **Workspace settings**:

{% stepper %}
{% step %}
**Open email integration**

Go to **Workspace settings** and open **Email integration**.
{% endstep %}

{% step %}
**Choose your provider**

Select **Continue with Google** or **Continue with Microsoft**.
{% endstep %}

{% step %}
**Confirm the connection**

Ninox uses your prefilled email information to connect the account.
{% endstep %}
{% endstepper %}

After the connection is complete, your email address appears in the email integration settings.

### Work with emails in Ninox <a href="#work-with-emails-in-ninox" id="work-with-emails-in-ninox"></a>

Once your inbox is connected, you can manage email communication without leaving your workspace.

Use the inbox to:

* Review incoming messages
* Search for past communication
* Keep related emails close to your records

This is especially useful when emails are part of a process such as sales, support, or project work.

### Link emails to records <a href="#link-emails-to-records" id="link-emails-to-records"></a>

You can link an email to an existing record while reading it. This keeps the conversation and the related data together.

For example, you might receive an email from a customer about an open deal. In that case, link the email to the customer contact or the related deal record. You can then open the record and see the email in context.

Use this when an email belongs to a contact, company, deal, project, ticket, or any other record in your workspace.

Linked emails help you:

* Keep communication in the right context
* Open the related record faster
* Give teammates a clearer view of the full history

{% stepper %}
{% step %}
**Start from the email**

Open the email you want to link, then click **Link new record**.
{% endstep %}

{% step %}
**Open the link dialog**

In the side panel, click **Link records**.
{% endstep %}

{% step %}
**Choose the app and table**

Select the app first, then select the table that contains the record. This narrows the search to the right part of your workspace.
{% endstep %}

{% step %}
**Find the record**

Start typing in **Search in records**. Ninox filters the list while you type. Search by a name, email address, company, or any other visible record detail.
{% endstep %}

{% step %}
**Link the record**

Select the record you want, then click **Link**. The record appears in the linked records panel for this email.
{% endstep %}
{% endstepper %}

After the link is created, you can click the linked record to open the related table and record. If needed, repeat the same steps to link more records to the same email.

### Work with linked emails in a record <a href="#work-with-linked-emails-in-a-record" id="work-with-linked-emails-in-a-record"></a>

After you link an email, open the record and select the **Emails** tab. You will see the linked email thread there. This gives you a record-based view of the conversation, which is useful when you want to check communication while working in the app instead of switching back to the inbox.

From this tab, you can review the conversation and move back to the inbox when needed.

You can also:

* Click the small arrow < to open a preview of the linked email
* Click the <i class="fa-arrow-up-right-from-square">:arrow-up-right-from-square:</i> icon to return to the **Inbox** with that email open
* Click the three dots <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> icon to unlink the email from the record

The preview helps you confirm the right message without leaving the record. The inbox shortcut is useful when you want to reply, forward, or continue from the original email view. If you unlink the email, the connection between the record and the email is removed. This helps you keep the full conversation close to the record without losing context.

You can link several records to one email. You can also link several emails to one record.

### Disconnect an inbox <a href="#disconnect-an-inbox" id="disconnect-an-inbox"></a>

You can remove the connection at any time.

{% stepper %}
{% step %}
**Open email integration**

Go to **Workspace settings** and open **Email integration**.
{% endstep %}

{% step %}
**Disconnect the inbox**

Select **Disconnect**.
{% endstep %}

{% step %}
**Finish**

This removes the email account connection from the workspace.
{% endstep %}
{% endstepper %}


# Im- and export data

Import data into your app and export table data for reuse or sharing.

## Import data

Use imports to bring CSV data into an app without entering records manually.

{% hint style="info" %}
You can only import data into a table if you have write permission for that table.
{% endhint %}

During import, you control how Ninox reads the file and where each column goes. This includes:

* choosing whether to insert new records, update existing records, or do both
* checking parse settings such as encoding, separators, and date formats
* mapping CSV columns to existing Ninox fields or creating new fields
* previewing the result before you import anything

### What you can control during import

The import dialog lets you decide how Ninox reads the file and how each CSV column is handled.

Two areas matter most:

* **Parse settings** control how Ninox reads the file format.
* **Map fields** control where the CSV data goes in Ninox.

#### Parse settings

In **Parse settings**, you define how Ninox reads the import file.

Start by choosing how Ninox should handle the records:

* **Update only** updates existing records
* **Insert only** adds new records
* **Update & insert** updates existing records and adds new ones

Then check the file format options:

* **Encoding** defines the character set, such as **UTF-8 (Unicode)**
* **Date format** defines how Ninox reads date values
* **Number format** defines how Ninox reads decimal and thousands separators
* **Column separator** defines how columns are separated, such as comma, semicolon, or tabulator
* **Text delimiter** defines which quotation marks wrap text values

You can also control two import details:

* **Include header** tells Ninox that the first row contains column names
* **Treat empty fields as null** imports empty values as `null`. This means the field has no value. It is not an empty text value and not the number `0`. Use this option when empty cells should stay unset after import.

Use the preview on the right to check whether Ninox reads the file correctly.

The preview also uses color labels to show what will happen during import:

* **New** shows records that Ninox will add
* **Updated** shows records that Ninox will change
* **Removed** shows records that will be removed from the result set during import preview
* **Unchanged** shows records that stay the same

#### Map fields

In **Map fields**, Ninox shows one row for each CSV column.\
Use the **Import** toggle to decide whether Ninox should import that column at all. If the toggle is off, Ninox skips the column.\
In **CSV fields**, you see the column names from the CSV file.\
In **Existing ninox fields**, you choose what Ninox should do with each CSV column.\
You can:

* select **Do not map** to ignore the column
* select an existing Ninox field to import the values into that field
* select **+ Create field** to create a new field for that column

If you select an existing Ninox field, Ninox maps the CSV column to that field.

In this case, you can also choose an **Update policy**:

* **Update** replaces the existing value
* **Update empty** fills only empty values

If you select **+ Create field**, Ninox adds a second selector below it. Use that selector to choose the field type, such as **Text**.

### Import data into an existing table

Use this flow when the table already exists.

{% stepper %}
{% step %}
**Open the import dialog**

Open the table in the **app screen**.\
In the toolbar, click **Import/export**.\
Then click **Import data**.
{% endstep %}

{% step %}
**Upload your file**

Drag your CSV file into the import dialog. Or select the file from your local device.
{% endstep %}

{% step %}
**Review parse settings**

Choose how Ninox should read the file.

Start with the import mode:

* **Insert only** adds new records
* **Update only** changes existing records
* **Update & insert** does both

Then check these options:

* **Encoding**, such as **UTF-8 (Unicode)**
* **Date format**
* **Number format**
* **Column separator**
* **Text delimiter**
* **Include header**
* **Treat empty fields as null**

Use the preview on the right to verify the result.
{% endstep %}

{% step %}
**Map the file columns**

Open **Map fields**.

For each CSV column, choose the matching existing field.\
You can also:

* turn off **Import** to skip a column
* create a new field if needed
* choose an update policy for mapped fields

Use **Update** to replace existing values.\
Use **Update empty** to fill only empty values.
{% endstep %}

{% step %}
**Import the records**

Check the preview one last time.\
Then click **Import records**.
{% endstep %}
{% endstepper %}

## Export data

Use export to move table data from Ninox into other tools for reporting, sharing, or further processing.\
You can export data as **CSV** for spreadsheets or as **JSON** for structured processing and integrations. Ninox downloads exported files directly to your local device.

#### CSV settings

For **CSV** exports, you can control how Ninox formats the file.

* Use **Include header** to add the field names to the first row.
* Use **Include separator definition in header** to add the separator definition at the top of the file.

Then review these options:

* **Delimiter** defines how columns are separated, such as comma, semicolon, pipe, or tabulator. Choose the separator your spreadsheet app or import tool expects.
* **Date format** defines how Ninox writes date values, such as **Locale**, **ISO 8601**, **GMT**, or **UNIX timestamp**. Choose a format your next tool can read without conversion.
* **Number format** defines how decimal values are written, such as **Locale**, `1234.56`, or `1234,56`. Match this setting to the decimal format your target tool expects.
* **Quote character** defines which quotation marks wrap text values. This helps when values contain separators or special characters.
* **Encoding** defines the character set, such as **UTF-8 (Unicode)**. Choose the encoding that keeps special characters readable in the target app.
* **Include BOM** adds a byte order mark to the file header. This can help some spreadsheet apps detect the file encoding correctly.

Choose the settings that match the tool that will open the file next.

### Export data as CSV

Choose **CSV** when you want to work with the data in a spreadsheet app or send it as a flat file.

{% stepper %}
{% step %}
**Open the export dialog**

Open the table in the **app screen**.\
In the toolbar, click **Import/export**.\
Then click **Export data**.
{% endstep %}

{% step %}
**Choose CSV**

In the export dialog, select **CSV**.
{% endstep %}

{% step %}
**Review the CSV settings**

Check whether you want to include the header row.\
If needed, turn on **Include separator definition in header**.

Then review these options:

* **Delimiter**
* **Date format**
* **Number format**
* **Quote character**
* **Encoding**
* **Include BOM**
  {% endstep %}

{% step %}
**Download the file**

Click **Download as CSV**.

Ninox downloads a CSV file of the table directly to your local device with the settings you selected.
{% endstep %}
{% endstepper %}

### Export data as JSON

Choose **JSON** when you want a structured export for integrations, scripts, or further processing.

{% stepper %}
{% step %}
**Open the export dialog**

Open the table in the **app screen**.

In the toolbar, click **Import/export**.

Then click **Export data**.
{% endstep %}

{% step %}
**Choose JSON**

In the export dialog, select **JSON**.
{% endstep %}

{% step %}
**Download the file**

Click **Download as JSON**.

Ninox downloads a JSON file of the table directly to your local device for structured reuse in other tools.
{% endstep %}
{% endstepper %}


# Manage your profile

Update your personal details, profile image, and account settings.

Use **Profile** to keep your personal details up to date and personalize your Ninox account.

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

On this page, you can:

* check or update your email address and **Display name**
* optionally add **First name** and **Last name**
* add or change **Company name**, **Company size**, and **Role**
* add or change your profile image, which Ninox uses as your user picture in the app
* update your password
* delete your account

### Update your password

Update your password in **Profile** to keep your account secure.

{% hint style="info" %}
Your password works across all Ninox platforms for this email address. After you update it, use the new password everywhere you sign in with the same email.
{% endhint %}

{% stepper %}
{% step %}

### Open the password dialogue

In **Profile**, click **Update password**.
{% endstep %}

{% step %}

### Enter your passwords

Enter your current password.\
Then enter your new password and confirm it.
{% endstep %}

{% step %}

### Save your change

Click **Update password**.
{% endstep %}
{% endstepper %}

### Change the app language

You can change the language used in the Ninox app from the **Profile** menu.

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

Open your profile menu at the bottom of the main navigation.\
Then click **Change language** and choose **German** or **English**.

{% hint style="info" %}
Changes you make here apply to your own user profile, not to a specific organization or workspace.
{% endhint %}


# Contact Support

Send a support request.

Use **Contact support** when something is not working or you need help from the Ninox support team.

Fill in all form fields before you submit your request. To help the team understand the issue faster, include what you tried, what happened, and a screenshot or file if it helps.

{% stepper %}
{% step %}
**Open Help & support**

In the left sidebar, go to the bottom section.\
Click <i class="fa-circle-question">:circle-question:</i> **Help & support**.
{% endstep %}

{% step %}
**Select Contact support**

In the menu that opens, click **Contact support**.
{% endstep %}

{% step %}
**Fill in the form**

Fill in all fields in the form.\
Check your email address, first name, and last name.\
Select a topic, then add a subject and your message.
{% endstep %}

{% step %}
**Add an attachment if needed**

Click **Choose Files** to attach a file.\
This is useful for screenshots or other supporting material.
{% endstep %}

{% step %}
**Submit your request**

Click **Submit**.\
Your support request is then sent to the Ninox support team.
{% endstep %}
{% endstepper %}


# Builder Hub

Find the guides you need to design, organize, and scale Ninox apps.

Builder Hub brings together the chapters you need to build, organize, and scale Ninox apps. Use it to set up your app, structure data, visualize records, and manage access.

### **Ninox AI**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Ninox AI</strong><br>Use Ninox AI to create apps faster, refine structure changes, and get help while you build.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/E4DajDFSS6niWl8lJglg">/spaces/YwCp7NT87JGgngrkhfHT/pages/E4DajDFSS6niWl8lJglg</a></td></tr></tbody></table>

### **Design your app**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Create and manage apps</strong><br>Start a new app and configure its settings.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/FkRlVZ9OA8aKmYiNQO6T">/spaces/YwCp7NT87JGgngrkhfHT/pages/FkRlVZ9OA8aKmYiNQO6T</a></td></tr><tr><td><strong>Create and manage tables</strong><br>Define the tables that hold your app's records.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/H7S5eJWN9g6GQo69cLPH">/spaces/YwCp7NT87JGgngrkhfHT/pages/H7S5eJWN9g6GQo69cLPH</a></td></tr><tr><td><strong>Add and edit data fields</strong><br>Shape each table with the right data fields.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/XKqVytHworemkZLZx1pV">/spaces/YwCp7NT87JGgngrkhfHT/pages/XKqVytHworemkZLZx1pV</a></td></tr><tr><td><strong>Import and export data</strong><br>Move data between Ninox and spreadsheet files with import and export workflows.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/UMWqeLwazcT4utF5c1xt">/spaces/YwCp7NT87JGgngrkhfHT/pages/UMWqeLwazcT4utF5c1xt</a></td></tr></tbody></table>

### **Visualize and organize your data**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Work with views</strong><br>Create views to organize, filter, and focus the records users see.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/i73g4LZQanoLj7XtSO18">/spaces/YwCp7NT87JGgngrkhfHT/pages/i73g4LZQanoLj7XtSO18</a></td></tr><tr><td><strong>Create and customize pages</strong><br>Create pages to build dashboards, structure information, and guide users through your app.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/AD9lDCmpddI5WAY92HgG">/spaces/YwCp7NT87JGgngrkhfHT/pages/AD9lDCmpddI5WAY92HgG</a></td></tr><tr><td><strong>Create and adjust print layouts</strong><br>Create print layouts to visualize data and generate PDF files.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/ezWbAreCau2n6c8gQ0NJ">/spaces/YwCp7NT87JGgngrkhfHT/pages/ezWbAreCau2n6c8gQ0NJ</a></td></tr><tr><td><strong>Style tables with conditional formatting</strong><br>Style table views and view elements based on conditions.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/OpmRJPne74cK5Q1jPO1p">/spaces/YwCp7NT87JGgngrkhfHT/pages/OpmRJPne74cK5Q1jPO1p</a></td></tr></tbody></table>

### **Manage your organization and workspace**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Manage your organization</strong><br>Manage settings, access, subscriptions, and workspaces at the organization level.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/ArmRVIgZkuGru5OxHZB0">/spaces/YwCp7NT87JGgngrkhfHT/pages/ArmRVIgZkuGru5OxHZB0</a></td></tr><tr><td><strong>Organize your workspace</strong><br>Manage settings, access, API keys, and email connections for one workspace.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/rWCg6GJbEwsy3fZD5hDU">/spaces/YwCp7NT87JGgngrkhfHT/pages/rWCg6GJbEwsy3fZD5hDU</a></td></tr><tr><td><strong>Backup and restore your data</strong><br>Restore a workspace from a saved point in time and understand how backup retention works.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/3N3a2h2wAHMGW7Tdnhu8">/spaces/YwCp7NT87JGgngrkhfHT/pages/3N3a2h2wAHMGW7Tdnhu8</a></td></tr></tbody></table>


# Ninox AI

Learn when to use the Ninox AI assistant and what to include for great results.

The **Ninox AI assistant** helps you turn an idea into a usable app in minutes. From a short description, it creates a strong first version with suggested tables, fields, relationships, and an initial app setup. On the app screen, it also helps you update the current app with common structure changes. Ninox also supports **AI suggestions** during table creation, so you can get helpful field proposals even when you build step by step.

That means less time spent modeling from scratch and faster progress from day one. You get something concrete to review, test, and improve right away, so you can shape the app around your process and show early results faster.

It works especially well when you already know your use case and want to move quickly. If you know what you need to track, but do not want to build every table and field manually, the AI assistant helps you save time, reduce setup effort, and start with confidence.

You can access the AI assistant in these ways:

* When you open Ninox for the first time, you see **Create app with Ninox AI** on the landing screen.
* You can also start it later from workspace **Home** by clicking **Create app with Ninox AI**.
* When you are on the app screen, open the main navigation and click **Ninox AI** <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i>.

The landing screen with the AI assistant option is only shown the first time you access Ninox. After that, use workspace **Home** to create a new app with AI, or open **Ninox AI** from the main navigation while working inside an app.

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

To see the complete flow of using the Ninox AI assistant to create an app, including each step in the interface, check [Quickstart - create your first app](/getting-started/builder-getting-started/quickstart-create-your-first-app).

### AI assistant on the app screen <a href="#ai-assistant-on-the-app-screen" id="ai-assistant-on-the-app-screen"></a>

On the App screen, the AI assistant opens in a side panel. This lets you work on the current app without leaving what you are building.

From this panel, you can start a new chat, reopen earlier chats, view the current data model, and close the assistant when you no longer need it.

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

Use the icons at the top to control the chat and editing context:

* **Add chat** starts a new chat. Use it when you want to work on a new topic separately from the current conversation.
* **View chat history** shows earlier chats in this app. You can search and reopen existing conversations there.
* **View data model** opens the current data model next to the chat. This lets you check tables and fields in the context of the proposed changes.
* **Close Ninox AI** hides the side panel and returns you to the normal App screen view.

Below the prompt field, Ninox shows predefined prompts for common app-building tasks, such as:

* **Add a table component** adds a table-based component to the current app view.
* **Add a chart** adds a chart component.
* **Add a metric card** adds a metric card component.
* **Add a container** adds a container for organizing content in the current view.

These prompts give you a fast starting point. You can use them as they are, or describe the change you want in your own words before you send it.

### AI help in the logic editor <a href="#ai-help-in-the-script-editor" id="ai-help-in-the-script-editor"></a>

You can also use Ninox AI anywhere you write scripts. Open the [logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features), describe what you want to build, and let AI help you create or refine the script.

In the logic editor, Ninox opens an AI panel next to the code area. This lets you work with AI directly while you write and refine your script.

If you are not sure how to start, click **Suggest ideas**. Ninox then shows example prompts based on the context of the current table and, for example, the logic field you are editing.\
You can select one of these suggestions or enter your own request in **Ask about Ninox script**. For the best result, mention the table, the fields, and the expected outcome. The more specific your prompt is, the closer the generated script will match your use case.\
Ninox AI then generates a script draft directly in the editor and shows a matching explanation in the AI panel.

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

Review the suggested script before you keep it. You can **Accept** it, **Reject** it, or refine it by continuing the chat with Ninox AI. When you are ready to keep the current script in the logic editor, click **Apply**.

### Good habits when working with the AI assistant <a href="#good-habits-when-working-with-the-ai-assistant" id="good-habits-when-working-with-the-ai-assistant"></a>

Start with a description that gives the AI something solid to work with. Name the main things you need to track, add the most important fields, and explain how those records connect. For example, if you are planning a project app, say that each project can have many tasks and belongs to one customer.

This gives you a stronger first result, but it is still only a starting point. Review the generated tables and fields, then adjust them to match your process. Before you begin, also decide which workspace the new app should belong to, so the structure fits your setup from the start.

### AI suggestions for table creation <a href="#additional-ai-feature-ai-suggestions-for-table-creation" id="additional-ai-feature-ai-suggestions-for-table-creation"></a>

In addition to the AI assistant, Ninox also offers **AI suggestions** when you create new tables. When you enter a descriptive table name and keep **AI suggestions** enabled, Ninox proposes relevant fields for your table.

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

You can accept the suggested fields or turn off **AI suggestions** if you prefer to define all fields yourself.

### Query data with Ninox AI

Use natural language to find and filter records in your workspace. The **Ninox AI** lets you access your data without manually building queries. It understands your database structure, including tables, fields, relationships, and available choice options.

It does not read or analyze all records in advance. The **Ninox AI** uses the database schema to find the requested information.

For example, ask: “Show me all open orders.”\
The **Ninox AI** identifies the relevant table and status field. It then retrieves records where the status is "Open".

**Ninox AI** uses the same filtering and search capabilities as the Ninox user interface. It interprets requests written in natural language, but cannot apply filter conditions that Ninox does not support.

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYwCp7NT87JGgngrkhfHT%2Fuploads%2Fp9wm1UCEq8H0jCrhKAl0%2Fai_assistant_en.mp4?alt=media&token=d0fe7cf2-2c99-4d5c-b7c8-c20612d2e64b>" %}


# Prompting

Get better results from Ninox AI with practical prompting tips and examples.

Ninox 4 comes with a built in AI assistant. You can think of it as a helpful colleague who is very fast at reading, writing and explaining things. It also knows a lot about data, logic and language.

In the beginning, you use the Ninox AI assistant mainly for one thing:\
to create your first app from a description and refine that description until the app fits your needs.

## What a prompt is in Ninox 4 <a href="#what-a-prompt-is-in-ninox-4" id="what-a-prompt-is-in-ninox-4"></a>

A prompt is what you type into the Ninox AI assistant to describe the app you want to build.

You tell Ninox AI:

* what kind of app you want,
* for which use case or team,
* and which data you want to track.

Ninox AI then turns this description into an initial data model:

* tables,
* fields in each table,
* relationships between tables.

You stay in control. If you do not like the result, you refine your description and try again or adjust the data model manually.

## Getting started: describe your first app <a href="#getting-started-describe-your-first-app" id="getting-started-describe-your-first-app"></a>

When you land on the blank app creation screen, you see the Ninox AI assistant panel with an input field like “Describe what you want to create”.

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

You can start with a short sentence. For example: "I want an app to manage customer projects and invoices."

This is enough for Ninox AI to create a basic structure, but you will get a better result if you add a bit more detail.

### Examples of better and worse prompts <a href="#examples-of-better-and-worse-prompts" id="examples-of-better-and-worse-prompts"></a>

Seeing concrete examples is often the easiest way to learn prompting. In the following pairs you will find a short, vague prompt next to a more helpful version for the same task.\
You do not have to write long texts every time. A few extra words of context already make a big difference in the first version of your app.\
Notice how a little extra context, a clear goal and a hint about the outcome already help.

#### CRM example <a href="#crm-example" id="crm-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create CRM app."</td><td><p>Ninox AI has very little to work with:</p><ul><li>It does not explain what kind of CRM you need.</li><li>It does not say who will use it or for which process.</li><li>It does not describe which data you want to store or report on.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I need a simple CRM app to track B2B customers and sales opportunities.<br>Create the main tables for this, including useful fields and relationships between them."</td><td><p>This more helpful prompt works better because:</p><ul><li>It describes the use case: B2B customers and sales opportunities.</li><li>It defines the scope: a simple CRM app.</li><li>It tells Ninox AI to create tables, fields and relationships.</li></ul></td></tr></tbody></table>

#### Projects example <a href="#projects-example" id="projects-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create an app for projects."</td><td><p>This is very general:</p><ul><li>It does not say what “projects” means in your context.</li><li>It does not say which information you need for each project.</li><li>It does not show how projects relate to other data, such as customers or tasks.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I want an app to manage customer projects for a small agency.<br>Each project belongs to one customer and has a budget, start date, end date and status.<br>Create tables for Customers, Projects and Tasks, with tasks linked to projects."</td><td><p>This more helpful prompt works better because:</p><ul><li>It names the context: a small agency with customer projects.</li><li>It lists important fields for projects: budget, start date, end date and status.</li><li>It mentions relationships between tables: customers, projects and tasks.</li></ul></td></tr></tbody></table>

#### Vacation planner example <a href="#vacation-example" id="vacation-example"></a>

<table data-header-hidden><thead><tr><th width="153.6953125">Quality</th><th width="279.86328125">Prompt</th><th>Explanation</th></tr></thead><tbody><tr><td>⛔️ Less helpful</td><td>"Create holiday tracker."</td><td><p>Ninox AI has to guess many things:</p><ul><li>It does not say whether you track people, requests or both.</li><li>It does not describe which dates and status values you need.</li><li>It does not explain how approvals should work.</li></ul></td></tr><tr><td>✅ More helpful</td><td>"I need an app to manage employee vacation requests.<br>Create tables for employees and vacation requests.<br>Each vacation request should have an employee, start date, end date, status and approver."</td><td><p>This more helpful prompt works better because:</p><ul><li>It defines the main tables: Employees and Vacation requests.</li><li>It lists key fields for each request: start date, end date, status and approver.</li><li>It shows how records are linked: each vacation request belongs to one employee.</li></ul></td></tr></tbody></table>

### General principles for good prompts <a href="#general-principles-for-good-prompts-in-the-app-creation-flow" id="general-principles-for-good-prompts-in-the-app-creation-flow"></a>

There is no perfect prompt, but a few simple principles help you get better first apps.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><h4 id="be-clear-about-your-goal">Be clear about your goal</h4></td><td><p></p><p>Tell Ninox AI what you want the app to help you with:</p><ul><li>“I want an app that helps me track …”</li><li>“I need a simple app for my team to manage …”</li></ul></td></tr><tr><td><h4 id="describe-your-main-objects">Describe your main objects</h4></td><td><p></p><p>Think about what you want to track and name those things:</p><ul><li>Customers, projects, invoices</li><li>Employees, requests, approvals</li><li>Assets, locations, maintenance logs</li></ul></td></tr><tr><td><h4 id="mention-important-fields">Mention important fields</h4></td><td><p></p><p>Add a short list of key information for each object:</p><ul><li>For customers: name, email, phone, industry, status</li><li>For projects: customer, budget, start date, end date, status</li><li>For invoices: invoice number, date, amount, status</li></ul></td></tr><tr><td><h4 id="point-out-relationships">Point out relationships</h4></td><td><p></p><p>If things belong together, say so:</p><ul><li>“Each project belongs to one customer.”</li><li>“Each invoice is linked to a project.”</li><li>“Each task is linked to a project and assigned to one employee.”</li></ul></td></tr></tbody></table>

### Iterating on your prompt <a href="#iterating-on-your-prompt" id="iterating-on-your-prompt"></a>

You rarely get the ideal app structure on the first try. It is normal to refine and try a few variants.

After Ninox AI has created a first data model:

* look at the tables and fields it created,
* note what is missing or not useful,
* update your description and run it again.

Here are some useful follow up prompts you can use:

* “Also include a table for quotes before they become invoices.”
* “Add a field in the Projects table to track the current project manager.”
* “Remove anything related to tasks. I only want customers and invoices for now.”
* “Also track the payment method and due date for each invoice.”

You can extend your original description or write a short follow up like: "Update the app so that each invoice also stores the due date and payment method."

Ninox AI then updates the data model. You can repeat this until the structure feels right.


# Create and manage apps

Create apps and manage their settings.

An app brings tables, records, views, pages, and automations together for one process.

Create apps from workspace **Home**. Use **App settings** to manage an app’s details, access, and visibility.

## **Create an app**

Create an app from workspace **Home**. Use AI for a generated starting model, or create an empty app manually.

{% tabs %}
{% tab title="Create with Ninox AI" %}
{% stepper %}
{% step %}
**Start app creation**

<figure><img src="/files/AZfudQNsANuaYtdq2Ko0" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Describe the app**

Describe the process, data, and relationships you need to manage. You can select a suggested prompt or use <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i> **Improve message**.
{% endstep %}

{% step %}
**Review and refine the result**

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

Review the generated tables, fields, relationships, and dashboard. Refine the result as needed.
{% endstep %}

{% step %}
**Approve and open the app**

Click **Approve** to create the app. Open the new app from its tile on **Home**.
{% endstep %}
{% endstepper %}

For a guided first app with AI, see [Quickstart - create your first app](/getting-started/builder-getting-started/quickstart-create-your-first-app).\
For more AI guidance, see [Ninox AI](/builder-hub/ninox-ai/ninox-ai).
{% endtab %}

{% tab title="Create manually" %}
{% stepper %}
{% step %}
**Start app creation**

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

On workspace **Home**, click **Create app manually**.
{% endstep %}

{% step %}
**Set up the app**

Enter an app **Name**. Ninox generates the **Internal name** automatically.
{% endstep %}

{% step %}
**Choose an icon and color**

Click the icon beside the app name. Select a color and click **Confirm**. Then select an icon and click **Confirm**.
{% endstep %}

{% step %}
**Create and open the app**

Click **Create app**. Open the new app from its tile on **Home**.

<figure><img src="/files/UNwH8EScximgsyq4FGti" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

For a guided first app without AI, see [Your first app](https://app.gitbook.com/o/yI8eJ2eecPOm72cxYjt5/s/vgUdF91rY6UMBUb5r9Cl/builder-getting-started/set-up-your-ninox-manually/your-first-app).
{% endtab %}
{% endtabs %}

## **Manage app settings**

**App settings** lets you change an app’s name, internal name, icon, and color. You can also control access, hide the app or its navigation, and delete the app when needed.

You can open **App settings** from two places:

* On workspace **Home**, find the app card. Open the three-dot menu, then select **App settings**.
* Inside an app, click <i class="fa-gear">:gear:</i> **App settings** in the app navigation.

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

{% hint style="info" %}
Turn on **Builder mode** to show **App settings** in an app’s navigation.
{% endhint %}

### **Change app details**

Use the top section to update the app’s details.

* **App name** changes the name shown to users.
* **Internal name** is the app’s unique system identifier. Ninox generates it when you create the app.
* The icon picker lets you choose or remove an icon, select a color, or enter a custom color value.

Click **Update app** to save your changes.

{% hint style="warning" %}
Change the **Internal name** carefully. Scripts or integrations may depend on it.
{% endhint %}

### **Manage access and visibility**

Use **Allow access to** to restrict the app to selected workspace or custom roles. Workspace admins always retain full access.

You can also control what users see:

* Turn on **Hide this app** to hide it from **Home**. Afterward, only admins can see it there.
* Turn on **Hide the navigation bar inside this app**. This hides the navigation bar whenever **Builder mode** is off.

Click **Update app** to save your changes.

For role details, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

### **Delete an app**

Delete an app only when you no longer need its structure or data.

{% stepper %}
{% step %}
**Open App settings**

Open **App settings** from workspace **Home** or from inside the app.
{% endstep %}

{% step %}
**Delete the app**

Click **Delete app**. Complete the confirmation shown by Ninox.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Deleting an app permanently removes its structure and data.
{% endhint %}


# Create and manage tables

Create, rename, and delete tables.

Tables define your app's structure and store its records.

Use this guide to create, rename, and delete tables. Arrange tables in the app navigation with drag and drop. Learn how labels, internal names, and view names affect your app.

To manage data fields in tables, see [Add and edit data fields in your tables](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables).

{% hint style="info" %}
All tasks in this guide require **Builder mode**. If it is not enabled, turn it on in the **App navigation** before you start.
{% endhint %}

## Create tables

Create tables manually or let Ninox AI build an initial structure from your description.

{% tabs %}
{% tab title="Create table with Ninox AI" %}
Use **Ninox AI** to create a table from a plain-language description.

{% stepper %}
{% step %}

#### Open Ninox AI

From the app screen, click <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i> **Ninox AI** in the main navigation.
{% endstep %}

{% step %}

#### Describe the table you need

State the table name, what it tracks, and the fields it needs.

For example, ask Ninox AI to create a vacation-planning table with destinations, travel dates, a budget, and a booking status.
{% endstep %}

{% step %}

#### Review and approve the proposed structure

Review the proposed table and its fields. Check that every field has the correct name and type.

Click **Approve** to add the table to your app. Select **Reject** and refine your request if changes are needed.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Include the information you need to track and how it relates to other tables. Specific requests produce a stronger first structure.

Learn more in [AI assistant on the app screen](/builder-hub/ninox-ai/ninox-ai#ai-assistant-on-the-app-screen).
{% endhint %}
{% endtab %}

{% tab title="Create table manually" %}
Create a table manually when you want to define its structure yourself.

{% stepper %}
{% step %}

#### Open Create table

Click **Create table** at the bottom of the app navigation.
{% endstep %}

{% step %}

#### Enter the table details

Enter a clear **Name** for the table. Optionally, select an icon.

Ninox creates an **Internal name** automatically. This unique name identifies the table in the system and in your scripts. Change it only when needed.
{% endstep %}

{% step %}

#### Choose whether to use suggested fields

<figure><img src="/files/33kaFno3mOuMtiu88vTf" alt=""><figcaption></figcaption></figure>

Keep **Ninox AI suggestions** selected to add suggested fields based on the table name. Select or clear individual suggestions as needed.

To create a blank table, clear **Ninox AI suggestions**.
{% endstep %}

{% step %}

#### Create the table

Click **Create table**. Ninox adds the table to your app.

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

Add or adjust fields afterwards from the table, form, or data model. See [Add and edit data fields in your tables](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables).
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

## Rename tables and table views

Rename tables and table views separately. Each action changes a different name.

Tables use three different names. Each one serves a separate purpose.

* **Label** is the table name shown in the app navigation. Change it to make the table easier to recognize.
* **Internal name** is the system identifier for the table. Scripts can use this name. When you change it, Ninox updates references used as function arguments. Update any string references in your scripts yourself.
* **View name** appears above the table grid. It identifies the active view and does not change the table label.

{% tabs %}
{% tab title="Rename a table" %}
Rename a table to update its label in the app navigation.

{% stepper %}
{% step %}

#### Open the table settings

Select the table in the app navigation.

In the settings panel, select the **Table** tab, then select the **Settings** tab.
{% endstep %}

{% step %}

#### Change the label

Under **General**, enter the new name in **Label**.

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

The table label updates in the app navigation.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
If you use functions such as `openTable("Vacations")` that reference the table name as text, update the table name in your scripts too. Ninox does not update these references automatically.
{% endhint %}
{% endtab %}

{% tab title="Rename a table view" %}
Rename a view to change the name shown above the table. This does not change the table label in app navigation.

{% stepper %}
{% step %}

#### Open the view menu

Click the current view name above the table.

<figure><img src="/files/jYkKMSje66eMQxs88SqY" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Select Rename view

Select **Rename view** from the menu.
{% endstep %}

{% step %}

#### Enter and save the new name

Enter the new name, then click **Rename view**.

The new name appears above the table. The table label and internal name remain unchanged.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}

## Reorder tables in app navigation

Drag tables in the app navigation to arrange them in the order you need.

{% stepper %}
{% step %}

#### Select a table

In the app navigation, select the table you want to move.
{% endstep %}

{% step %}

#### Drag the table

Drag the table up or down to the new position.
{% endstep %}

{% step %}

#### Drop the table

Release the table when it reaches the position you want.
{% endstep %}
{% endstepper %}

## Delete tables and table views

Before you delete anything, distinguish between a table and a [table view](/builder-hub/visualize-and-organize-your-data/work-with-views/table-view). A table stores your fields and records. A table view controls how those records appear.

Deleting a table permanently removes it. Deleting a table view removes only that view. The table and its records remain available.

{% tabs %}
{% tab title="Delete a table" %}
Delete a table when you no longer need its structure or records.

{% hint style="warning" %}
Deleting a table permanently deletes it. Back up any data you need before you continue.
{% endhint %}

{% stepper %}
{% step %}

#### Open the table settings

Select the table in the app navigation.

In the settings panel, select the **Table** tab, then select the **Settings** tab.
{% endstep %}

{% step %}

#### Start the deletion

Open **Delete**, then click **Delete table**.

<figure><img src="/files/1SVM5LLYduTdk8cXATY4" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Confirm the deletion

Review the confirmation message. Click **Delete** to permanently delete the table.
{% endstep %}
{% endstepper %}
{% endtab %}

{% tab title="Delete a table view" %}
{% hint style="info" %}
Ninox creates the first table view with every table. You cannot delete this view.
{% endhint %}

{% stepper %}
{% step %}

#### Open the view menu

Select the view you want to remove. Click its name above the table.

<figure><img src="/files/mBh1tMraLjbEhLHaY0Ib" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Delete the view

Select **Delete view** from the menu.
{% endstep %}
{% endstepper %}
{% endtab %}
{% endtabs %}


# Add and edit data fields in your tables

Add and adjust data fields in tables, forms, the data model, or with Ninox AI.

Data fields define what each record can store. In **Table view**, data fields appear as columns. In the form view, the same fields appear as form elements.

This page covers **data fields**. It does not cover layout components used to design, structure, or control a form.

{% hint style="info" %}
You can add and edit fields in several places. No matter where you do it, you change the same underlying table structure.
{% endhint %}

## **Where you can add and edit data fields**

You can work with fields from the table, the form view, the right-side settings panel, the data model, or [**Ninox AI**](/builder-hub/ninox-ai/ninox-ai) **chat**. Choose the place that matches the task.

### **Add and edit data fields in the table**

Use the table for quick structural changes while you review real records. This is the fastest place to add a field as a new column.

Click **+** **Add column** in the table header to add another field directly from **Table view**. This opens a menu where you can add a **New data field**, add a calculated column, or add an existing linked field to the table view.

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

If you create a new data field, Ninox adds a new column to the table. You then choose the field name and field type.

<figure><img src="/files/6340CuScqy710B4reLWM" alt=""><figcaption></figcaption></figure>

### **Add and edit data fields in the form view**

Use the form view when you want to work on fields where users insert data.

To open the form view, click a field in a record in your table.\
Do not click a choice field for this. That opens the choice options, not the form view itself.

Here, fields appear as form elements instead of columns. This is useful when you want to check labels, order, grouping, and form behavior.

<figure><img src="/files/70nOhvMYtEquECkT1PeH" alt=""><figcaption></figcaption></figure>

Use **Quick settings** from the field toolbar to make fast changes to the selected field, such as the **Label**, **Internal name**, or **Required** setting. For **Single-choice** and **Multi-choice** fields, you can also edit **Options**.

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

You can also add a field from the end of the form view. Click <i class="fa-circle-plus">:circle-plus:</i> **Add component**, then select **New data field**.

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

{% hint style="info" %}
This also works in linked tables in the form view. Any field you add there changes the linked table itself.
{% endhint %}

### **Add and edit data fields in the right-side settings panel**

Use the right-side panel to access the full settings for a field.

Click the gear in the top right to open the settings panel. You can also click **Open full settings** in **Quick settings** on the field toolbar in the form view.

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

You can work with fields from these areas:

* **Add** tab under **Form** to browse available data fields and drag them to the form view in the right place
* **Fields** tab under **Table** to review the field list, create a field, search, filter, and manage several fields together
* **Settings** tab under **Form** to change the selected field in detail, including the label, internal name, default values, display settings, permissions, behavior, visibility, and automations

{% hint style="info" %}
The available settings depend on the selected field type. Different field types show different options.
{% endhint %}

### **Add and edit data fields in the data model**

Use the data model when you want to design the table structure more deliberately.\
This view helps when you work across several tables. It is especially useful for planning linked fields and checking how tables relate to each other.

Access the data model from **Data model** in the **App navigation**.

To add a field there, click **Create field** in the relevant table at the end of the list of existing fields.

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

### **Add and edit data fields with Ninox AI chat**

You do not have to change every field manually. You can ask **Ninox AI chat** to add fields, change fields, or adjust the structure for you. This is useful when you already know the result you want and want Ninox to build it faster.

When you are on the app screen, click <i class="fa-wand-magic-sparkles">:wand-magic-sparkles:</i> **Ninox AI chat** in the left-side main navigation.

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

## **Field types and what they are for**

Choose a field type based on the kind of data you need to store and how you want to use it later.

Ninox groups data fields into these categories.

* **Standard fields**\
  Use standard fields for everyday values users enter directly.\
  Examples include **Text**, **Multi-line text**, **Number**, **Yes/no**, **Single-choice**, **Multi-choice**, **File**, and **Logic**.
* **Contact fields**\
  Use contact fields for contact details and locations.\
  Common examples are **Email**, **Phone**, **URL**, and **Location**.
* **Date and time fields**\
  Use date and time fields for schedules, deadlines, appointments, and durations.\
  This group includes **Date**, **Date and time**, **Appointment**, **Time**, and **Duration**.
* **Special fields**\
  Use special fields for app-specific values that affect display or connect a record to a workspace user.\
  Examples include **Rich text**, **Color**, **Icon**, **Signature**, and **User**.
* **Relationship fields**\
  Use relationship fields to connect records across tables.\
  You will find **Link one record** and **Link many records** in the **Relationships** group, at the same level as **Data fields**.

### **Browse all data fields**

Open [All data fields](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields) to see one page per field type.

There you can open dedicated pages for:

* standard fields
* contact fields
* date and time fields
* special fields
* relationship fields


# All data fields

Browse every Ninox data field and open a dedicated page for its settings, behavior, and use cases.

Every Ninox data field has a specific purpose, settings, and behavior. Use this page to jump to the field you need.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

[A](#a) · [C](#c) · [D](#d) · [E](#e) · [F](#f) · [I](#i) · [L](#l) · [M](#m) · [N](#n) · [P](#p) · [R](#r) · [S](#s) · [T](#t) · [U](#u) · [Y](#y)

### A

* [Appointment](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/appointment)

### C

* [Color](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/color)

### D

* [Date](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/date)
* [Date and time (Timestamp)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/date-and-time-timestamp)
* [Duration (Timeinterval)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/duration-timeinterval)
* [Dynamic choice (Dchoice)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/dynamic-choice-dchoice)
* [Dynamic multi-choice (Dmulti)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/dynamic-multi-choice-dmulti)

### E

* [Email](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/email)

### F

* [File](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/file)

### I

* [Icon](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/icon)

### L

* [Link many records (Reverse)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/link-many-records-reverse)
* [Link one record (Reference)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/link-one-record-reference)
* [Location](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/location)
* [Logic (Function)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/logic-function)

### M

* [Multi-choice (Multi)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/multi-choice-multi)
* [Multi-line text](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/multi-line-text)

### N

* [Number](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/number)

### P

* [Phone](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/phone)

### R

* [Rich text (Html)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/rich-text-html)

### S

* [Signature](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/signature)
* [Single-choice (Choice)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/single-choice-choice)

### T

* [Text](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/text)
* [Time](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/time)

### U

* [URL](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/url)
* [User](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/user)

### Y

* [Yes/no (Boolean)](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/yes-no-boolean)


# Shared field settings

Review the settings that Ninox data fields have in common.

Many data field types share the same settings. Others include options that depend on the field type.\
Some settings, like the visibility, affect the table structure. Others only change how the field appears in the form.

Many data fields include these common settings:

* A description of the field type
* <i class="fa-trash-can">:trash-can:</i> lets you delete the field
* **Label**: the name users see on the form
* **Internal name**: the technical field name used in the table structure and in scripts

{% hint style="warning" %}
Change the **Internal name** carefully. Other parts of the app, especially scripts, may depend on it.
{% endhint %}

Open <i class="fa-airplay">:airplay:</i> **Display** for:

* **Label position**: controls where the label appears
  * **Top**: shows the label above the field
  * **Left**: shows the label to the left of the field
  * **Inside**: shows the label inside the field
  * **Hidden**: hides the label
* **Tooltip**: lets you add help text for this field

Open <i class="fa-shield-check">:shield-check:</i> **Permissions** for:

* **Read access**: controls who can view the field
* **Edit access**: controls who can change the field

Open <img src="/files/amKA5qyaK2bcB1SHywyG" alt="" data-size="line"> **Behavior** for:

* **Required**: makes the field mandatory

Open <i class="fa-eye">:eye:</i> **Visibility** for:

* **Visible**, **Hidden**: controls whether the field appears on the form
* **Conditional**: lets you define a **Visibility condition** that controls when this field is shown or hidden

Open <i class="fa-code-simple">:code-simple:</i> **Automations** for:

* **On update**: runs a script when the field value changes

{% hint style="info" %}
Shared settings can still vary slightly by field type. The main differences usually appear in **General** and in field-specific display options.
{% endhint %}


# Appointment

Store a time range with a start and end for meetings, bookings, or events.

Use an **Appointment** field when the record should store a time range with a start and end.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Appointment** are:

<i class="fa-airplay">:airplay:</i> **Display**

* **Show in calendar**: controls whether the appointment appears in calendar-based views
* **Color**: sets the color used for the appointment
* **Display as**: defines how the appointment is shown

Click the **Display as** field to open the [Logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features). There, you define what appears in the calendar view. Keep in mind that space in the calendar view is limited.

On the form, the field shows a start date and time plus an end date and time. You can enter the values directly or click the <i class="fa-calendar-days">:calendar-days:</i> calendar icon to open the picker.\
If the format is set to a 12-hour option, you can switch between **AM** and **PM** by typing **A** or **P** in the field. You can also press the up and down arrow keys to switch between **AM** and **PM**.

{% hint style="info" %}
Use **Appointment** for meetings, bookings, or events with a start and end. Use **Date and time** when you only need one date and time value.
{% endhint %}


# Color

Store a color value for views, charts, and visual display.

Use a **Color** field when the record should store a color value that you can reuse in views, charts, or dynamic choice fields.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**Color** uses the shared settings only. It does not add extra field-specific options.

In the color picker, users can:

* choose a preset color
* use the color mixer by clicking the color preview next to the color value field
* enter a custom color as a hex value, such as `#ff0000`
* enter a custom color as an RGB value, such as `rgb(255, 0, 0)`
* remove the current color

Click **Confirm** to apply the selected color.

Use a **Color** field when records should control how items appear in views such as **Calendar**, **Kanban**, **Gallery**, or **Maps**. See [Work with views](/builder-hub/visualize-and-organize-your-data/work-with-views).

{% hint style="info" %}
Use a **Color** field when the value should drive visual display in the app.

If users should choose from a fixed list of named options with assigned colors instead, use **Single-choice** or **Multi-choice**.
{% endhint %}


# Date

Store a calendar date such as a start date, due date, or deadline.

Use a **Date** field for calendar dates such as start dates, due dates, or deadlines.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Date** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records
  * **Empty**: leaves the field blank
  * **Today**: uses the current date
  * <i class="fa-code-simple">:code-simple:</i> **Edit dynamic value** next to the field opens the logic editor where you can add or edit the logic for that setting. After you save the script, Ninox shows the first line of the script instead of the static value field. To switch back to a static value, click <i class="fa-xmark">:xmark:</i> **Remove dynamic value** on the right.

On the form, you can enter the value directly or click the <i class="fa-calendar-days">:calendar-days:</i> calendar icon on the right side of the field to open the date and time picker. In the picker, you can move between months, select the date, and enter the time.

If the format is set to a 12-hour option, you can switch between **AM** and **PM** by typing **A** or **P** in the field. You can also press the up and down arrow keys to switch between **AM** and **PM**.

{% hint style="info" %}
Use **Date** when only the calendar date matters. Use **Date and time** when the exact time also matters.
{% endhint %}


# Date and time (Timestamp)

Store a calendar date together with a specific time.

Use a **Date and time** field when you need to store both a calendar date and a specific time.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Date and Time** are:

&#x20;**General**

* **Default value**: fills the field automatically in new records
  * **Empty**: leaves the field blank
  * **Today**: uses the current date
  * &#x20;**Edit dynamic value** next to the field opens the logic editor where you can add or edit the logic for that setting. After you save the script, Ninox shows the first line of the script instead of the static value field. To switch back to a static value, click  **Remove dynamic value** on the right.

On the form, you can enter the value directly or click the <i class="fa-calendar-days">:calendar-days:</i> calendar icon on the right side of the field to open the date and time picker. In the picker, you can move between months, select the date, and enter the time.

If the format is set to a 12-hour option, you can switch between **AM** and **PM** by typing **A** or **P** in the field. You can also press the up and down arrow keys to switch between **AM** and **PM**.

{% hint style="info" %}
Use **Date** when only the calendar date matters. Use **Date and time** when the exact time also matters.
{% endhint %}


# Duration (Timeinterval)

Store an elapsed time span such as hours worked or response time.

Use a **Duration** field when the record should store a time span instead of a clock time or a date.

This works well for values such as hours worked, estimated effort, response time, or other elapsed time values.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Duration** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**:
  * Enter a static value directly in the field
  * <i class="fa-code-simple">:code-simple:</i> **Edit dynamic value** next to the field opens the logic editor where you can add or edit the logic for that setting. After you save the script, Ninox shows the first line of the script instead of the static value field. To switch back to a static value, click <i class="fa-xmark">:xmark:</i> **Remove dynamic value** on the right.

<i class="fa-airplay">:airplay:</i> **Display**

* **Duration format**: controls how the duration is displayed
  * a mixed day-and-time value, with optional seconds or milliseconds
  * a total in days, hours, minutes, seconds, or milliseconds
  * a rounded or more precise value, depending on the selected format

{% hint style="info" %}
Use **Duration** for elapsed time. Use **Time** for a clock time. Use **Appointment** when you need a timestamp for start and end.
{% endhint %}


# Dynamic choice (Dchoice)

Let users select one value from a dynamic list built from logic.

Use a **Dynamic choice** field when users should pick one value from a dynamic list, such as a table or logic.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Dynamic choice** are:

<i class="fa-memo">:memo:</i> **General**

* **Options logic**: defines the logic that returns the available options

<i class="fa-airplay">:airplay:</i> **Display**

* **Name**, **Color**, and **Icon** **logic**: define the label, color, and icon for each option. If you leave these empty, Ninox uses the item's identifier as the label, for example the record ID.
* **Display as**: controls how the choices appear on the form
  * **Combobox**
  * **Radio button**
  * **Tabs**

{% hint style="info" %}
Use **Dynamic choice** when the list of options should adjust dynamically to your needs. This is useful when options change often or depend on the current record or user.
{% endhint %}


# Dynamic multi-choice (Dmulti)

Let users select several values from a dynamic list built from logic.

Use a **Dynamic multi-choice** field when users should be able to select several values from the same kind of dynamic list.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Dynamic multi-choice** are:

<i class="fa-memo">:memo:</i> **General**

* **Options logic**: defines the logic that returns the available options

<i class="fa-airplay">:airplay:</i> **Display**

* **Name**, **Color**, and **Icon** **logic**: define the label, color, and icon for each option. If you leave these empty, Ninox uses the item's identifier as the label, for example the record ID.
* **Display as**: controls how the choices appear on the form
  * **Combobox**
  * **Radio button**
  * **Tabs**

{% hint style="info" %}
Use **Dynamic choice** or **Dynamic multi-choice** when the list of options should adjust dynamically to your needs. This is useful when options change often or depend on the current record or user.
{% endhint %}


# Email

Store an email address and support email actions from the form.

Use an **Email** field when the record should store an email address and support email actions from the form.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Email** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records

<i class="fa-airplay">:airplay:</i> **Display**

* **Subject**: defines the subject line used for email actions
* **Message**: defines the message body used for email actions

For **Subject** and **Message**, click the field with <i class="fa-code-simple">:code-simple:</i> in **Settings** to open the [Logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features). In the editor, you can enter text directly, write a script, or use **Ninox AI** to help generate it.

In the form view, click the <i class="fa-envelope">:envelope:</i> icon on the right side of the **Email** field. Ninox opens your device's or browser's default email app and creates a new message with the defined **Subject** and **Message** values.


# File

Store uploaded files and attachments on a record.

Use a **File** field when users should upload or attach files to a record.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **File** are:

<i class="fa-airplay">:airplay:</i> **Display**

* **Display as**: controls how the file field appears on the form
  * **Thumbnail**: shows the file as a thumbnail, this is the default setting
  * **Preview**: shows a larger preview in the form
* **Metadata**: controls whether metadata such as the file name, size, and type is shown

On the form, users can click **Browse files** to add a file. After they add a file, the field reflects the selected settings.\
Users can click **`⋮`** to **View**, **Download**, **Replace**, or **Remove** the file.

Ninox also stores the file in **Files**, where users can access it later. If you remove the file from the field, it remains available in the record’s linked **Files**. There, users can **Download**, **Rename**, **Unlink**, or **Move to Trash**. For more information about file storage, see [Documents](/user-hub/ninox-basics/documents).

{% hint style="info" %}
Use **File** when the record should store attachments. If you only need a link to an external resource, use **URL** instead.
{% endhint %}


# Icon

Store a visual icon for views, charts, and dynamic choices.

Use an **Icon** field when the record should store a visual symbol for views, charts, or dynamic choice fields.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**Icon** uses the shared settings only. It does not add extra field-specific options.

In the icon picker, users can:

* search for an icon
* choose an icon from the list
* choose an icon color in the color picker at the top right
* remove the current icon

Click **Confirm** to apply the selected icon.


# Link many records (Reverse)

Connect one record to several records from another table.

Use a **Link many records** field when one record should connect to several records from another table.

When you add a **Link many records** field, Ninox opens a dialog and asks which table you want to link.

In that dialog, you can:

* search for a table
* select the table you want to link, including the current table itself

After you choose the table, Ninox creates the relationship field and shows the linked records in the form. At the same time, Ninox creates the reverse connection in the other table and adds a **Link one record** field there.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Link many records** are:

<i class="fa-airplay">:airplay:</i> **Display**

* **Display as**: controls how the linked records appear in the form
  * **Table**: shows linked records in an embedded table
  * **Checkbox**: shows available linked records as a checkbox list
  * **Field**: shows linked records directly in the form field and provides actions to link or unlink them
* **Hidden columns**: controls which linked-record fields Ninox shows
* **Filter**: limits which records users can see and link. You can add more than one filter.
* **Group**: groups the records by one displayed field

<img src="/files/amKA5qyaK2bcB1SHywyG" alt="" data-size="line">**Behavior**

The following settings apply only when **Display as** is set to **Table**:

* **Show search field**: shows a search field at the top of the relationship table
* **Show add record button**: shows a button that lets users add new records
* **Link existing record**: shows a button for linking an existing record instead of creating a duplicate
* **Show add record row**: shows a row at the bottom of the table that adds a new record when clicked
* **Multi-select and bulk actions**: lets users select multiple records and perform bulk actions
* **Inline editing**: lets users edit records directly in the table

{% hint style="info" %}
If you need a many-to-many relationship, use a third table that connects the two other tables with one **Link one record** field for each table.
{% endhint %}


# Link one record (Reference)

Connect one record to one record in another table.

Use a **Link one record** field when a record should reference one record from another table.

When you add a **Link one record** field, Ninox opens a dialog and asks which table you want to link. You can also link the same table to itself.

After you choose the table, Ninox creates the relationship field for records from that table. At the same time, Ninox creates the reverse connection in the other table and adds a **Link many records** field there.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Link one record** are:

<i class="fa-airplay">:airplay:</i> **Display**

* **Display as**: controls how users select the linked record
  * **Popup**: opens a table where users can search for a record to link to or create a new one
  * **Combobox**: shows a searchable drop-down list
  * **Switch**: shows the available records as horizontally arranged options
  * **Radio buttons**: shows the available records as a radio-button list
* **Show data as**: controls the data from the linked record displayed in the field.\
  Click the <i class="fa-code-simple">:code-simple:</i> icon to open the [Logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features). Enter a reference, write Ninox Script, or use **Ninox AI** to generate an expression.
* **Hidden columns**: controls which columns appear in the selection view and how the linked record is displayed
* **Filter**: limits which records users can select

<img src="/files/amKA5qyaK2bcB1SHywyG" alt="" data-size="line">**Behavior**

* **Composition**: creates a parent-child relationship If it is enabled, deleting the parent record also deletes its child records. Use this option with caution.

The following settings apply only when **Display as** is set to **Popup**:

* **Show add record button**: shows a button in the **Popup** view to create and link a new record
* **Quick add at the bottom**: shows an empty row at the bottom of the **Popup** view for quick record creation

If the field is displayed as **Popup**, users can click **Select a record**. Ninox then opens a table where they can search for a record or create a new one to link.

There, users can:

* select one record from the list and click **Confirm** to link it
* click **+ Add record** to create a new record, if that option is enabled in **Behavior**

After confirmation, the selected record appears in the field.

Click the selected record in the field to open the linked record in a separate form view.

{% hint style="info" %}
Use **Link one record** when the relationship should point to one record in another table. If one record should connect to several records, use **Link many records** instead.
{% endhint %}


# Location

Store a place or address with geographic coordinates.

Use a **Location** field when the record should store a place or address.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**Location** uses the shared settings only. It does not add extra field-specific options.

Use the search to find a location and choose one of the suggestions.\
Alternatively, click the <i class="fa-location-dot">:location-dot:</i> icon on the right side to open the map. You can place the pin with a double-click or use the search at the top to find a location.

After you select a location, Ninox stores the location details, including coordinates.

{% hint style="info" %}
Use **Location** when the value should work with maps or geographic data. If you only need a plain address, use separate **Text** fields for ZIP code, place, or street instead.
{% endhint %}


# Logic (Function)

Store a calculated value from a formula or script.

Use a **Logic** field when the field value should come from logic, such as a formula or script, instead of manual input.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Logic** are:

<i class="fa-memo">:memo:</i> **General**

* **Logic**: stores the logic for the field

In the **Settings** panel, click the **Logic** field with <i class="fa-code-simple">:code-simple:</i> to open the [Logic editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features). There, you can add a script directly or use **Ninox AI** to help generate one.


# Multi-choice (Multi)

Let users select several values from a fixed list.

Use a **Multi-choice** field when users should be able to select several values from a fixed list.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Multi-choice** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: preselects one or more options in new records

<i class="fa-airplay">:airplay:</i> **Display**

* **Options**: defines the available choices
  * **Color**: assigns a color to each choice
  * **Icon**: assigns an icon to each choice
* Use the **`⋮⋮`** handle on the left of each choice to change the order
* **+ Add option**: creates more options
* **Display as**: shows the choices as a **Combobox**, **Radio button**, or **Tabs**

{% hint style="info" %}
Use **Multi-choice** when users should be able to select several values from the same list. Use **Single-choice** when users should select exactly one value.
{% endhint %}


# Multi-line text

Store longer notes, descriptions, comments, and explanations.

Use a **Multi-line text** field for longer notes, descriptions, comments, or explanations.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**Multi-line text** uses the same field-specific settings as **Text**:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records
* **Minimum length**: requires a minimum number of characters
* **Maximum length**: limits how many characters users can enter

{% hint style="info" %}
Use **Multi-line text** for longer notes or paragraphs.

If you need formatted text, use **Rich text**.
{% endhint %}


# Number

Store numeric values you want to calculate, compare, or format consistently.

Use a **Number** field for values you want to calculate, compare, or format consistently.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Number** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records
* **Minimum value**: sets the lowest allowed number
* **Maximum value**: sets the highest allowed number

<i class="fa-airplay">:airplay:</i> **Display**

* **Style**: formats the value as **Decimal**, **Currency**, **Percent**, or **Unit**
* **Decimal places**: controls how many decimal places Ninox shows
* **Grouping separator**: adds or removes the thousands separator

{% hint style="info" %}
Use **Number** when the value needs calculations or numeric filters. If users should enter text that only looks numeric, use **Text** instead.

For example, ZIP codes can contain leading zeros or non-numeric characters that a number field cannot display. Use **Phone** for telephone numbers.
{% endhint %}


# Phone

Store a phone number and support call actions from the form.

Use a **Phone** field when the record should store a phone number and support call actions from the form.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**Phone** uses the shared settings only. It does not add extra field-specific options.

In the form view, click the <i class="fa-phone">:phone:</i> icon on the right side of the **Phone** field. Ninox opens your device's or browser's default calling app with the phone number from the field.

{% hint style="info" %}
Use **Phone** when the value should be treated as a phone number. It supports special characters such as `+`, spaces, and `-`, which a **Number** field does not.
{% endhint %}


# Rich text (Html)

Store formatted text for descriptions, instructions, and content blocks.

Use a **Rich text** field for content that should support formatted text.

This works well for descriptions, instructions, or content blocks that need more structure than plain text.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Rich text** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**:
  * Enter a static formatted text directly into the field
  * <i class="fa-code-simple">:code-simple:</i> **Edit dynamic value** next to the field opens the logic editor where you can add or edit the logic for that setting. After you save the script, Ninox shows the first line of the script instead of the static value field. To switch back to a static value, click <i class="fa-xmark">:xmark:</i> **Remove dynamic value** on the right.

<img src="/files/amKA5qyaK2bcB1SHywyG" alt="" data-size="line">**Behavior**

* **Markdown**: controls whether the field supports Markdown formatting

In the **Rich text** editor, you can:

* undo or redo changes
* structure and format text
* adjust the text alignment
* discard or confirm changes

{% hint style="info" %}
Ninox stores rich text content as HTML and renders it in the **Rich text** field. Keep this in mind when you use scripts to update, read, or insert content in the field.
{% endhint %}


# Signature

Store a handwritten signature on a record.

Use a **Signature** field when the record should store a handwritten signature.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Signature** are:

<i class="fa-airplay">:airplay:</i> **Display**

* **Display as**: controls how the signature field appears on the form
  * **Thumbnail**: shows the signature as a thumbnail
  * **Preview**: shows a larger preview in the form

On the form, click **Click here to open the signature editor** to draw a signature. You can click **Clear signature** to remove the current input, **Cancel** to close the editor without saving, or **Save signature** to store it in the record.

After you save a signature, use **`⋮`** to **View**, **Download**, **Replace**, or **Remove** the file.\
Click the saved signature or drawing to open the print editor, where you can print it or download it.

Ninox also stores the signature in **Files**, where users can access it later.\
Unlike a file in a **File** field, a removed signature does not remain in the **Files** tab of the record. Ninox moves it directly to **Trash** in the **Documents** area of the workspace. For more information about file storage, see [Documents](/user-hub/ninox-basics/documents).

{% hint style="info" %}
Use a **Signature** field when the record should store a signed confirmation or approval.

If you only need to attach a scanned signature image or document, use **File** instead.
{% endhint %}


# Single-choice (Choice)

Let users select one value from a fixed list.

Use a **Single-choice** field when users should pick one value from a fixed list, such as a status, category, or stage.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Single-choice** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: preselects one option in new records

<i class="fa-airplay">:airplay:</i> **Display**

* **Options**: defines the available choices
  * **Color**: assigns a color to each choice
  * **Icon**: assigns an icon to each choice
* Use the **`⋮⋮`** handle on the left of each choice to change the order
* **+ Add option**: creates more options
* **Display as**: shows the choices as a **Combobox**, **Radio button**, or **Tabs**

{% hint style="info" %}
Use **Single-choice** when users should select exactly one value. If users should be able to select several values, use **Multi-choice** instead.
{% endhint %}


# Text

Store short free-form values such as names, titles, codes, or destinations.

Use a **Text** field for short free-form values such as names, titles, codes, or destinations.

If users should choose from recurring values such as group names, use a **Single-choice** or **Multi-choice** field instead. Use a **Multi-line text** field for longer notes, descriptions, comments, or explanations.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Text** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records
* **Minimum length**: requires a minimum number of characters
* **Maximum length**: limits how many characters users can enter

{% hint style="info" %}
**Text** is best for short input.

If users need to enter longer notes or paragraphs, use **Multi-line text** instead.

If you need formatted text, use **Rich text**.
{% endhint %}


# Time

Store a time value without a date.

Use a **Time** field when the record should store a time without a date.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Time** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: fills the field automatically in new records
  * **Empty**: leaves the field blank
  * **Now**: uses the current time
  * <i class="fa-code-simple">:code-simple:</i> **Edit dynamic value** next to the field opens the logic editor where you can add or edit the logic for that setting. After you save the script, Ninox shows the first line of the script instead of the static value field. To switch back to a static value, click <i class="fa-xmark">:xmark:</i> **Remove dynamic value** on the right.

<i class="fa-airplay">:airplay:</i> **Display**

* **Time format**: controls how the time is shown
  * **auto**: uses the default format
  * **09:42**: 24-hour format with hours and minutes
  * **9:42 AM**: 12-hour format with hours and minutes
  * **09:42:25**: 24-hour format with seconds
  * **9:42:25 AM**: 12-hour format with seconds
  * **09:42:25.123**: 24-hour format with milliseconds

On the form, users can enter the time directly in the field.\
If the format is set to a 12-hour option, you can switch between **AM** and **PM** by typing **A** or **P** in the field. You can also press the up and down arrow keys to switch between **AM** and **PM**.


# URL

Store a web address and open it directly from the form.

Use a **URL** field when the record should store a web address.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**URL** uses the shared settings only. It does not add extra field-specific options.

In the form view, click the <i class="fa-link-simple">:link-simple:</i> icon on the right side of the **URL** field. Ninox opens the URL in your default browser.


# User

Store one user from the current workspace.

Use a **User** field when the record should store one user from the current workspace.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

**User** uses the shared settings only. It does not add extra field-specific options.

On the form, users can select one workspace user or leave the field empty. To manage who appears there, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

Ninox stores the user ID and shows the user's **Display name** from their profile. This makes it easier to set up conditions that check which user is signed in and to access profile details such as email address, last name, or roles.

{% hint style="info" %}
Use a **User** field when the value should point to a workspace user. If you only need to store a name or email address as text, use **Text** or **Email** instead.
{% endhint %}


# Yes/no (Boolean)

Store a simple yes-or-no state such as approved, active, or complete.

Use a **Yes/no** field for simple yes-or-no states such as approved, active, or complete.

For the general settings all data fields have in common, see [Shared field settings](/builder-hub/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings).

Field-specific settings for **Yes/no** or **Boolean** are:

<i class="fa-memo">:memo:</i> **General**

* **Default value**: preselects the initial yes-or-no state for new records

<i class="fa-airplay">:airplay:</i> **Display**

* **Display as**: shows the options as **Checkbox**, **Dropdown**, **Switch**, or **Tabs**

We recommend using **Default value** to make filters and conditions easier to handle in automations. A default value ensures new records start as either "yes" or "no", instead of remaining empty.\
Without a default value, the field can have three states: "yes", "no", or "empty".\
For example, if you filter for `field_value = false`, records with an empty value are not included, even though users may treat them as no.


# Import and export data

Move data between Ninox and spreadsheet files with import and export workflows.

Move data into and out of Ninox without rebuilding it by hand. Import CSV files into tables or export table data for reporting, sharing, and reuse.

Choose a topic to go straight to the task you need.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Import data</strong><br>Import data to add, update, and structure records in Ninox.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/UgUeKhlxa3ENJcdCFGm4">/spaces/YwCp7NT87JGgngrkhfHT/pages/UgUeKhlxa3ENJcdCFGm4</a></td></tr><tr><td><strong>Export data</strong><br>Export table data from Ninox as CSV or JSON for reporting, sharing, or reuse.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/vUFaxBLGmMdcKQjjHF5Q">/spaces/YwCp7NT87JGgngrkhfHT/pages/vUFaxBLGmMdcKQjjHF5Q</a></td></tr></tbody></table>


# Import data

Import data to add, update, and structure records in Ninox.

Use imports to bring CSV data into an app without entering records manually.

{% hint style="info" %}
You can only import data into a table if you have write permission for that table.
{% endhint %}

You can import data in two ways:

* into an existing table
* into a new table that Ninox creates from the file

During import, you control how Ninox reads the file and where each column goes. This includes:

* choosing whether to insert new records, update existing records, or do both
* checking parse settings such as encoding, separators, and date formats
* mapping CSV columns to existing Ninox fields or creating new fields
* previewing the result before you import anything

### What you can control during import

The import dialog lets you decide how Ninox reads the file and how each CSV column is handled.

Two areas matter most:

* **Parse settings** control how Ninox reads the file format.
* **Map fields** control where the CSV data goes in Ninox.

#### Parse settings

In **Parse settings**, you define how Ninox reads the import file.

Start by choosing how Ninox should handle the records:

* **Update only** updates existing records
* **Insert only** adds new records
* **Update & insert** updates existing records and adds new ones

Then check the file format options:

* **Encoding** defines the character set, such as **UTF-8 (Unicode)**
* **Date format** defines how Ninox reads date values
* **Number format** defines how Ninox reads decimal and thousands separators
* **Column separator** defines how columns are separated, such as comma, semicolon, or tabulator
* **Text delimiter** defines which quotation marks wrap text values

You can also control two import details:

* **Include header** tells Ninox that the first row contains column names
* **Treat empty fields as null** imports empty values as `null`. This means the field has no value. It is not an empty text value and not the number `0`. Use this option when empty cells should stay unset after import.

Use the preview on the right to check whether Ninox reads the file correctly.

The preview also uses color labels to show what will happen during import:

* **New** shows records that Ninox will add
* **Updated** shows records that Ninox will change
* **Removed** shows records that will be removed from the result set during import preview
* **Unchanged** shows records that stay the same

#### Map fields

In **Map fields**, Ninox shows one row for each CSV column. \
Use the **Import** toggle to decide whether Ninox should import that column at all. If the toggle is off, Ninox skips the column.\
In **CSV fields**, you see the column names from the CSV file.\
In **Existing ninox fields**, you choose what Ninox should do with each CSV column.\
You can:

* select **Do not map** to ignore the column
* select an existing Ninox field to import the values into that field
* select **+ Create field** to create a new field for that column

If you select an existing Ninox field, Ninox maps the CSV column to that field.

In this case, you can also choose an **Update policy**:

* **Update** replaces the existing value
* **Update empty** fills only empty values

If you select **+ Create field**, Ninox adds a second selector below it. Use that selector to choose the field type, such as **Text**.

### Import data into an existing table

Use this flow when the table already exists.

{% stepper %}
{% step %}
**Open the import dialog**

Open the table in **Table view**.\
In the toolbar, click **Import/export**.\
Then click **Import data**.
{% endstep %}

{% step %}
**Upload your file**

Drag your CSV file into the import dialog. Or select the file from your local device.
{% endstep %}

{% step %}
**Review parse settings**

Choose how Ninox should read the file.

Start with the import mode:

* **Insert only** adds new records
* **Update only** changes existing records
* **Update & insert** does both

Then check these options:

* **Encoding**, such as **UTF-8 (Unicode)**
* **Date format**
* **Number format**
* **Column separator**
* **Text delimiter**
* **Include header**
* **Treat empty fields as null**

Use the preview on the right to verify the result.
{% endstep %}

{% step %}
**Map the file columns**

Open **Map fields**.

For each CSV column, choose the matching existing field.\
You can also:

* turn off **Import** to skip a column
* create a new field if needed
* choose an update policy for mapped fields

Use **Update** to replace existing values.\
Use **Update empty** to fill only empty values.
{% endstep %}

{% step %}
**Import the records**

Check the preview one last time.\
Then click **Import records**.
{% endstep %}
{% endstepper %}

### Create a new table from CSV

Use this flow when the table does not exist yet.

{% stepper %}
{% step %}
**Start a new table import**

In the app navigation, click the arrow next to **+ Create table**.\
Choose **Import table from CSV**.
{% endstep %}

{% step %}
**Upload your file**

Upload your CSV file.\
Ninox opens the import dialog.
{% endstep %}

{% step %}
**Review table details and parse settings**

Check the suggested **Table name**.\
Check the suggested **Internal name**.\
Then review the same parse settings as in the existing table import.
{% endstep %}

{% step %}
**Map the fields**

Open **Map fields**.\
For each CSV column, either create a new field or map it to an existing field.\
If you create a new field, choose the field type.
{% endstep %}

{% step %}
**Create the table**

Review the preview.\
Then click **Create table**.
{% endstep %}
{% endstepper %}


# Export data

Export table data from Ninox as CSV or JSON for reporting, sharing, or reuse.

Use export to move table data from Ninox into other tools for reporting, sharing, or further processing.\
You can export data as **CSV** for spreadsheets or as **JSON** for structured processing and integrations. Ninox downloads exported files directly to your local device.

#### CSV settings

For **CSV** exports, you can control how Ninox formats the file.

* Use **Include header** to add the field names to the first row.
* Use **Include separator definition in header** to add the separator definition at the top of the file.

Then review these options:

* **Delimiter** defines how columns are separated, such as comma, semicolon, pipe, or tabulator. Choose the separator your spreadsheet app or import tool expects.
* **Date format** defines how Ninox writes date values, such as **Locale**, **ISO 8601**, **GMT**, or **UNIX timestamp**. Choose a format your next tool can read without conversion.
* **Number format** defines how decimal values are written, such as **Locale**, `1234.56`, or `1234,56`. Match this setting to the decimal format your target tool expects.
* **Quote character** defines which quotation marks wrap text values. This helps when values contain separators or special characters.
* **Encoding** defines the character set, such as **UTF-8 (Unicode)**. Choose the encoding that keeps special characters readable in the target app.
* **Include BOM** adds a byte order mark to the file header. This can help some spreadsheet apps detect the file encoding correctly.

Choose the settings that match the tool that will open the file next.

### Export data as CSV

Choose **CSV** when you want to work with the data in a spreadsheet app or send it as a flat file.

{% stepper %}
{% step %}
**Open the export dialog**

Open the table in the **app screen**.\
In the toolbar, click **Import/export**.\
Then click **Export data**.
{% endstep %}

{% step %}
**Choose CSV**

In the export dialog, select **CSV**.
{% endstep %}

{% step %}
**Review the CSV settings**

Check whether you want to include the header row.\
If needed, turn on **Include separator definition in header**.

Then review these options:

* **Delimiter**
* **Date format**
* **Number format**
* **Quote character**
* **Encoding**
* **Include BOM**
  {% endstep %}

{% step %}
**Download the file**

Click **Download as CSV**.

Ninox downloads a CSV file of the table directly to your local device with the settings you selected.
{% endstep %}
{% endstepper %}

### Export data as JSON

Choose **JSON** when you want a structured export for integrations, scripts, or further processing.

{% stepper %}
{% step %}
**Open the export dialog**

Open the table in the **app screen**.\
In the toolbar, click **Import/export**.\
Then click **Export data**.
{% endstep %}

{% step %}
**Choose JSON**

In the export dialog, select **JSON**.
{% endstep %}

{% step %}
**Download the file**

Click **Download as JSON**.

Ninox downloads a JSON file of the table directly to your local device for structured reuse in other tools.
{% endstep %}
{% endstepper %}


# Work with views

Create views to organize, filter, and focus the records users see.

{% hint style="info" %}
Only users with the **Admin** role in the current workspace can create views. Learn more about roles in [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).
{% endhint %}

Views help you shape one table for different kinds of work. Views are different representations of your data and do not affect the data themselves, nor do they change or delete it.

Ninox offers the following view types:

{% columns %}
{% column %}
[![Table view](/files/VpwqWyJ1WlFIuxLqFpl5)](/builder-hub/visualize-and-organize-your-data/work-with-views/table-view)

[**Table**](/builder-hub/visualize-and-organize-your-data/work-with-views/table-view)\
Create, filter, and edit records in rows and columns.
{% endcolumn %}

{% column %}
[![Kanban view](/files/c63tFSN7D3LbxeJAY8xG)](/builder-hub/visualize-and-organize-your-data/work-with-views/kanban-view)

[**Kanban**](/builder-hub/visualize-and-organize-your-data/work-with-views/kanban-view)\
Group records by status and move them through your workflow.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}
[![Calendar view](/files/JhRY99YtPBJmcIqsI399)](/builder-hub/visualize-and-organize-your-data/work-with-views/calendar-view)

[**Calendar**](/builder-hub/visualize-and-organize-your-data/work-with-views/calendar-view)\
Display dates, appointments, and deadlines in a calendar layout.
{% endcolumn %}

{% column %}
[![Chart view](/files/V64hhFVXRjmevTXEfRdI)](/builder-hub/visualize-and-organize-your-data/work-with-views/chart-view)

[**Chart**](/builder-hub/visualize-and-organize-your-data/work-with-views/chart-view)\
Visualize grouped values with bar, line, and pie charts.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}
[![Maps view](/files/5PVpj56DX31SUuL0Alt7)](/builder-hub/visualize-and-organize-your-data/work-with-views/maps-view)

[**Maps**](/builder-hub/visualize-and-organize-your-data/work-with-views/maps-view)\
Display locations on a map based on a **Location** field.
{% endcolumn %}

{% column %}
[![Gallery view](/files/RUDrbPe2rz67FzvmwFqw)](/builder-hub/visualize-and-organize-your-data/work-with-views/gallery-view)

[**Gallery**](/builder-hub/visualize-and-organize-your-data/work-with-views/gallery-view)\
Display records as visual cards with images and key field values.
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column width="50%" %}
[![Pivot view](/files/Xll3Lj8eN0hJVaekwbw9)](/builder-hub/visualize-and-organize-your-data/work-with-views/pivot-view)

[**Pivot**](/builder-hub/visualize-and-organize-your-data/work-with-views/pivot-view)\
Summarize and compare data in a pivot table.
{% endcolumn %}

{% column width="50%" %}

{% endcolumn %}
{% endcolumns %}

## How to create a new view

In general, you create all view types in the same way.

{% stepper %}
{% step %}
**Start**

Open the table.\
At the top of the screen, click the **+** next to the last view name.
{% endstep %}

{% step %}
**Enter the view details**

Enter a **Name** for the new view.\
In **Display as**, select the view type.
{% endstep %}

{% step %}
**Create the view**

Click **Create view**.\
The new view appears as a tab at the top of the table.
{% endstep %}

{% step %}
**Configure your view**

Use the options applying to the chosen view type as described in the following paragraphs.
{% endstep %}
{% endstepper %}

## **Filter records in a view**

You can filter all view types to show only the records relevant to a team or task. This helps to keep a better overview and keep sensitive records out of views for users who should not access or see them.\
To control access to sensitive records and fields, also use permissions. For more on permissions, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

Use filters to show only the records relevant to the current task, team, or workflow.

{% stepper %}
{% step %}
**Open the view**

Open the table.\
Then open the view you want to filter.
{% endstep %}

{% step %}
**Open the filter options**

Click **Filter** in the view toolbar.
{% endstep %}

{% step %}
**Add one or more conditions**

Choose the field you want to filter by.\
Then choose the condition and value.\
Add more conditions if you want to narrow the result further.
{% endstep %}

{% step %}
**Review the visible records**

Check whether the view now shows the records you need.\
Adjust or remove conditions if you want to broaden or refine the result.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
A filter only changes which records appear in the current view. It does not change or delete records.
{% endhint %}

{% hint style="info" %}
Filters help you focus a view. They do not replace permissions. To control access to sensitive records or fields, also use permissions.
{% endhint %}

## Delete a view

Delete a view if you no longer need that way of displaying the table.

{% stepper %}
{% step %}
**Open the view**

Open the table.\
Then open the view you want to delete.
{% endstep %}

{% step %}
**Open the view menu**

Click the arrow next to the view name.
{% endstep %}

{% step %}
**Delete the view**

Click **Delete view**.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Deleting a view removes only the view. It does not delete any records or field data.
{% endhint %}


# Table view

Create, filter, and edit records in rows and columns.

Use a Table view to work with records in rows and columns. This is the default view for a new table and provides a broad choice of features.

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

In **Table view** you can:

* Use **Hide columns** or **x hidden columns** to show or hide columns.
* Use **Filter** to show only the records you need.
* Turn on **Inline Editing** to edit data directly in the table view, like in a spreadsheet.
* Use [**Import/export**](/builder-hub/design-your-app/import-and-export-data) to work with data from this view.

You can also change table columns directly by clicking the column title.\
In the menu, you can choose:

* **Rename column**
* **Duplicate column**
* **Insert column left** or **right**
* Sort in ascending or descending order
* **Aggregation**, depending on the data type, which you can display in the footer with **Show footer**
* **Conditional formatting**
* **Hide column**

Use the **+** button in the last column header to:

* **+ New data field**\
  Create a new data field in the current table. The field is also added to the form view.
* **ƒx Add calculated column**\
  Open the [**Logic** editor](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features) and enter plain text or logic to gather and display data from your app.

  The script is saved only in this table view column.
* Select an existing field that is currently hidden in the table view.\
  Use **Search** above the displayed fields to find it.

{% hint style="warning" %}
Avoid large, performance-intensive scripts in the calculated column. The script runs in every row each time the view opens, which can slow down daily work.
{% endhint %}

{% hint style="warning" %}
The script of the calculated column is deleted if you delete the column or the whole view.
{% endhint %}


# Kanban view

Group records by status and move them through your workflow.

Use a Kanban view to organize records into columns.

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

\
Kanban columns are based on a single choice field in the table. If Ninox prompts you to group the view, choose the choice field for the columns. If the table has no choice field, create one first.

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

In **Kanban view** you can:

* Use **Sort** to control the card order in each column.
* Use [**Filter**](#filter-records-in-a-view) to show only the records relevant to the current workflow.
* Use **Configure cards** to adjust the information shown on the cards.

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

* Choose a field to add a title to the card.
* Assign a file field for the card thumbnail.
* Choose a color field for the card color.
* Decide which field contents to show or hide on the card.

To use record-based colors, first create a **Color** field in the table. Ninox then applies the stored color to each Kanban card.

You can open records directly from the Kanban board with a click on the card of the record you want to open.

<figure><img src="/files/9Z7d6frDn2qIFPnBpRkY" alt=""><figcaption><p>Open a record with a click on the card in a Kanban</p></figcaption></figure>


# Calendar view

Display dates, appointments, and deadlines in a calendar layout.

Use a Calendar view to display records based on a date or appointment field.

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

In **Calendar view** you can click **Fields** and choose:

* a **Date** field or **Appointment** field for when a record appears
* a **Text** field for the record title
* a **Color** field to distinguish categories at a glance

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

* Use [**Filter**](#filter-records-in-a-view) to hide records you do not need in the current view.

To use record-based colors, first create a **Color** field in the table. Ninox then applies the stored color to each calendar entry.

You can open records directly from the Calendar by clicking a record card.


# Chart view

Visualize grouped values with bar, line, and pie charts.

Use a Chart view to compare grouped values visually.

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

In **Chart view** you can:

* Click **Configure chart** to define how the chart is built.
* Choose a chart type:
  * **Bar chart**
  * **Line chart**
  * **Pie chart**
* Choose a field for the X-axis to define the groups.
  * The X-axis controls how Ninox groups records in the chart.
  * In a pie chart, the X-axis defines the slices.
* Add one or more fields to the Y-axis as data sets.
  * Use numeric fields such as amounts, hours, or ratings.
  * Ninox sums the values for each group.
  * Each data set appears as a separate series in the chart.
  * Use **Add data set** to compare multiple numeric fields in one chart.
  * Assign a color to each data set to distinguish it visually.
  * Remove a data set if you no longer want to include it.
* Turn shared display options on or off:
  * **Show title** displays the chart title at the top.
  * **Show labels** displays labels directly in the chart, depending on the chart type.
  * **Show legend** shows which color belongs to which data set.
  * **Show tooltips** shows values when you move over chart elements.
  * **Show data table** displays the chart values in a table below the chart.
* Use chart-specific options:
  * **Stacked bars** in **Bar chart** combines multiple data sets into one bar per group.
  * **Smooth lines** in **Line chart** displays curved lines instead of straight segments.
  * **Show data points** in **Line chart** marks each individual value on the line.
  * **Donut** in **Pie chart** turns the pie chart into a donut chart.
* Use [**Filter**](#filter-records-in-a-view) to include only the records you want to consider in the chart.

Use **Export chart as image** to download the current chart as an image.


# Maps view

Display locations on a map based on a Location field.

Use a Maps view to display records on a map based on a Location field. Each record appears as a marker on the map.

<figure><img src="/files/5PVpj56DX31SUuL0Alt7" alt=""><figcaption></figcaption></figure>

In **Maps view** you can:

* Click **Fields** and choose:
  * the field for the marker position in **Location field**
  * the text field for the marker title in **Title field**
  * the field for the marker color in **Color field**
* Use [**Filter**](#filter-records-in-a-view) to show only the records you need.

To use a Maps view, first create a **Location** field in the table.

To use record-based colors, first create a **Color** field in the table. Ninox then applies the stored color to each map marker.

You can open records directly from the map by clicking a marker.


# Gallery view

Display records as visual cards with images and key field values.

Use a Gallery view to display records as visual cards. Each card can show an image, a title, a background color, and selected field values.

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

In **Gallery view** you can:

* Use **Sort** to control the card order in ascending or descending order.
* Use **Configure cards** to adjust the information shown on the cards.
  * To identify records more quickly, choose a field in **Title field**.
  * To make cards more visual, choose a field in **Image field**.
  * To distinguish categories at a glance, choose a field in **Color field**.
  * Turn individual fields on or off to decide which values appear on the card.
  * Use **Hide all** or **Show all** to update all field toggles at once.
* Use [**Filter**](#filter-records-in-a-view) to show only the records you need in the gallery.

To use record-based colors, first create a **Color** field in the table. Ninox then applies the stored color to each gallery card.

To show an image on the card, first create an **Image** field in the table.

You can open records directly from the Gallery board with a click on the card.


# Pivot view

Summarize and compare data in a pivot table.

Use a Pivot view to group records and calculate summary values across rows and columns.

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

In **Pivot view** you can:

* Click **Configure pivot** to define how the pivot table is built.

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

* In **Rows**, choose the fields that should appear as row groups.
  * The selected values appear in the first column of the pivot table.
  * Add more than one row field if you want to break groups down further.
* In **Columns**, choose the fields that should appear as column groups.
  * The selected values appear as column headers at the top of the pivot table.
  * Add more than one column field if you want nested column groups.
* In **Values**, choose the fields you want to calculate.
  * Select an aggregation such as **Sum**, **Count**, **Average**, **Min**, **Max**, or **Unique**, depending on the field type.
  * For some field types, only specific aggregations are available.
  * Add more than one value field to compare several results in the same pivot table.
* Use the arrow icons to change the order of row, column, or value fields.
  * The order changes how the pivot table groups and displays the results.
* Remove a field if you no longer want to include it in the pivot table.
* Use [**Filter**](#filter-records-in-a-view) to show only the records you need in the pivot.

[Export data](/builder-hub/design-your-app/import-and-export-data/export-data) downloads the pivot as an Excel file with the rows and columns shown in the current view.


# Create and customize pages

Create pages to build dashboards, structure information, and guide users through your app.

Pages let you turn table data into dashboards, landing pages, and focused workspaces. You can combine text, actions, views, charts, and layouts in one place. \
Pages do not store records themselves. They display content from your existing tables and help users focus on the right information.&#x20;

Open the page in **Builder mode** to add content in **Add**, adjust the selected component in **Settings**, and review the page hierarchy in **Structure**.

Pages work especially well as dashboards when users need to review information from several tables in one place. Start with the key question users need the page to answer. Then choose the smallest set of components that supports that goal.

When you design a page, keep it focused:

* Use charts for summary and views for record-level work
* Group related content with **Container**, **Tabs**, or **Accordion**
* Refine each component in **Settings** after the data displays correctly
* Hide source tables from navigation when the page is the main entry point

## **Create a page**

{% stepper %}
{% step %}
**Open Create page**

In the app navigation, click the arrow next to **+ Create table**.\
Select **Create page**.
{% endstep %}

{% step %}
**Enter the page name**

Enter a value in **Name**.\
Ninox creates the **Internal name** automatically.\
Change the **Internal name** only if you need a different value.
{% endstep %}

{% step %}
**Choose an icon and color**

Click the icon picker.\
Select an icon and a color.\
Click **Confirm**.
{% endstep %}

{% step %}
**Create the page**

Click **Create page**.\
The new page appears in the app navigation.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
To delete a page, open it in **Builder mode**. In the Settings panel, switch to **Form**, open **Settings**, and click the red <i class="fa-trash-can">:trash-can:</i> trash icon next to **Page**.
{% endhint %}

## **Add and arrange components on a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add a component**

Choose the component you want to use.\
Drag and drop it onto the page.
{% endstep %}

{% step %}
**Move and resize the component**

Select the component.\
Drag the component to move it on the page.\
Use the resize handles to adjust its size, if that option is available on the chosen component.
{% endstep %}

{% step %}
**Adjust the settings**

Select the component.\
If the component **Settings** are not already shown in the settings panel, go to **Form** and then to **Settings**.\
Refine its data source, display, and behavior.
{% endstep %}
{% endstepper %}

## **What you can add to a page**

The **Add** panel includes **Basic components** like Text, **Controls** like Button, **Views**, **Charts**, and **Layouts**.\
Open these options from the **Add** tab in the **Settings** panel. You can also use the blue <i class="fa-circle-plus">:circle-plus:</i> **Add component** button on the page.

* Use **Text** for headings, short instructions, and helper content.
* Use **Button** for actions on the page.
* **Views** and **Charts** show key data and statistics.
* Use **Layouts** to structure and organize the data on your page.

{% hint style="info" %}
A view on a page is a page component inside the page layout. You can add more than one view to the same page. For standalone views, see [Work with views](/builder-hub/visualize-and-organize-your-data/work-with-views).
{% endhint %}

### **Views and charts**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Table component</strong><br>Show records in rows and columns on a page</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/59rFNpbmlsPKeNnz85iN">/spaces/YwCp7NT87JGgngrkhfHT/pages/59rFNpbmlsPKeNnz85iN</a></td></tr><tr><td><strong>Kanban component</strong><br>Group records into columns by stage</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/pi6R1tJgkWIVJHTFy9cg">/spaces/YwCp7NT87JGgngrkhfHT/pages/pi6R1tJgkWIVJHTFy9cg</a></td></tr><tr><td><strong>Calendar component</strong><br>Show records by date on a page</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/XGWcg5UIJ4wrRW7jfk5n">/spaces/YwCp7NT87JGgngrkhfHT/pages/XGWcg5UIJ4wrRW7jfk5n</a></td></tr><tr><td><strong>Map component</strong><br>Display records with location data</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/AalSMcet5W3Hq5oCeaLw">/spaces/YwCp7NT87JGgngrkhfHT/pages/AalSMcet5W3Hq5oCeaLw</a></td></tr><tr><td><strong>Metric card component</strong><br>Highlight one key value on a page</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/hYmi1VQCKwNs3I2sHXfD">/spaces/YwCp7NT87JGgngrkhfHT/pages/hYmi1VQCKwNs3I2sHXfD</a></td></tr><tr><td><strong>Chart components</strong><br>Compare values and show trends</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/sjl07OSUkhMER5p08jYk">/spaces/YwCp7NT87JGgngrkhfHT/pages/sjl07OSUkhMER5p08jYk</a></td></tr></tbody></table>

### **Layouts**

<table data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Container component</strong><br>Group related components in one area</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/kvxCQiCtKkIxBP2pSHHs">/spaces/YwCp7NT87JGgngrkhfHT/pages/kvxCQiCtKkIxBP2pSHHs</a></td></tr><tr><td><strong>Tabs component</strong><br>Switch between related sections</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/H7R1xkoW7O206AfbjF5D">/spaces/YwCp7NT87JGgngrkhfHT/pages/H7R1xkoW7O206AfbjF5D</a></td></tr><tr><td><strong>Accordion component</strong><br>Keep sections collapsed until needed</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/MfHzJAMUb7VqOtBRdh1F">/spaces/YwCp7NT87JGgngrkhfHT/pages/MfHzJAMUb7VqOtBRdh1F</a></td></tr></tbody></table>

## **Share a page without showing source tables**

Pages work well when users need insight from several tables, but do not need to open those tables directly. For example, one page can combine data from projects, tasks, and invoices and stay visible for users who only need the dashboard view. To keep the interface focused, hide the source tables from the app navigation and leave the page visible.

Hiding a table from navigation only removes it from the menu. If the source tables contain sensitive data, also use table and field permissions to control access. For more on roles and permissions, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).


# Table component

Add a Table component to a page to show records in rows and columns.

Use a **Table** component to show records in rows and columns on a page when users need to scan several records at once.

Before you add a **Table** component, make sure your table has:

* Clear field labels so columns are easy to scan
* The fields users need for quick decisions
* Fields to filter the records if the page should show only relevant ones

## **Add a Table component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Table**

Under **Views**, drag **Table** onto the page.
{% endstep %}

{% step %}
**Configure the Table**

In the **Settings** of the component,

* Enter a **Label** and an **Internal name**.
* Choose the source table in **Behavior**.
* Select the fields to show using <i class="fa-eye">:eye:</i> x **hidden columns**.
* **Filter** or **Group** if you want to show only a selection of rows.
  {% endstep %}

{% step %}
**Review the result**

Check whether the expected records and columns appear.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Table component settings**

In **Settings**, you can define the basic component details:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Under **Behavior**, configure how the table works on the page:

* **Table** to choose the source table
* <i class="fa-eye">:eye:</i> x **hidden columns** to control which fields Ninox shows, search for fields, and use **Hide all** or **Show all**
* **Filter** to limit which records users can see with one or more conditions
* **Group** to group records by one displayed text, date, status, linked-record, or location field
* **Show title** to show or hide the component **Label**.
* **Show search field** to show a search field at the top of the table
* **Show add record button** to show a button that lets users add new records
* **Quick add at the bottom** to show a blank row at the bottom of the table for quick entry
* **Multi-select and bulk actions** to let users select multiple records and perform bulk actions
* **Inline editing** to let users edit records directly in the table

Under **Visibility**, choose how the component is shown on the page:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden

  Use **Conditional** when the table should appear only in specific cases.

  Build the condition based on **Fields** and **Tables**.

  This only affects what is shown on the page. It does not change records or permissions.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Kanban component

Track work by stage in a Kanban.

Use a **Kanban** component on a page when records move through clear stages. It works well for tasks, leads, approvals, and support tickets.

Before you add a **Kanban** component, make sure your table has:

* One field that defines the stage or status
* Clear values for each stage
* Optional fields for card details, colors, or thumbnails

{% hint style="info" %}
Use one clear **Single-choice** field, such as Status, to define the columns. This keeps the board easy to understand.
{% endhint %}

## **Add a Kanban component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Kanban**

Under **Views**, drag **Kanban** to the preferred location on the page.
{% endstep %}

{% step %}
**Configure the Kanban**

In the component **Settings**:

* Choose the source **Table**.
* Choose the Single-choice field that defines the columns in **Group by field**.
* **Filter** if you want to show only a selection of records.
  {% endstep %}

{% step %}
**Review the result**

Check whether the columns and cards show the records you expect.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Kanban component settings**

In **Settings**, you can define the basic component details:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Under **Behavior**, configure how the board works on the page:

* **Table** to choose the source table
* **Group by field** to choose the Single-choice field that defines the columns
* <i class="fa-eye">:eye:</i> x **hidden columns** to control which fields Ninox shows on the cards, search for fields, and use **Hide all** or **Show all**
* **Filter** to limit which records users can see with one or more conditions
* **Show empty lane** to show columns even when they contain no records
* **Show search field** to show a search field at the top of the board

Under **Visibility**, choose how the component is shown on the page:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden

  Use **Conditional** when the Kanban should appear only in specific cases.

  Build the condition based on **Fields** and **Tables**.

  This only affects what is shown on the page. It does not change records or permissions.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Calendar component

Organize date-based records in a calendar layout.

Use a **Calendar** component on a page to show records by date.

Before you add a Calendar component, make sure your table has:

* A field with a **Date** or **Appointment**
* A **Text** field that can be used as an identifier of the record
* Fields to filter the records if the calendar component should show only relevant ones

## **Add a Calendar component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Calendar**

Under **Views**, drag **Calendar** to the preferred location on the page.
{% endstep %}

{% step %}
**Configure the Calendar**

In the **Settings** of the component,&#x20;

* Choose the source **Table**&#x20;
* Pick the **Date field** to display. That can also be an appointment field.
* Set a dynamic color for the entry if applicable in **Color field**.
  {% endstep %}

{% step %}
**Check the schedule**

Review whether the expected records appear on the correct dates.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Calendar component settings**

In **Settings**, you can define the basic component details:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Under **Behavior**, configure how the calendar works on the page:

* **Table** to choose the source table
* **Date field** to choose which date or appointment field places records on the calendar
* **Title field** to choose which field Ninox shows as the entry title
* **Color field** to choose which field defines the entry color
* **Filter** to limit which records users can see with one or more conditions
* **Calendar type** to choose the default view as **Month**, **Week**, or **Day**
* **Show calendar view selector** to show a dropdown for switching between month, week, and day views
* **Show search field** to show a search field at the top of the calendar

Under **Visibility**, choose how the component is shown on the page:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden

  Use **Conditional** when the calendar should appear only in specific cases.

  Build the condition based on **Fields** and **Tables**.

  This only affects what is shown on the page. It does not change records or permissions.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Map component

Show location-based records on a map with markers.

Use a **Map** component on a page to display records with location data. It works well for visits, deliveries, service areas, projects, and site records.

Before you add a Map component, make sure your table has:

* A **Location** field with valid values
* Clear record names so markers are easy to identify
* Fields to filter the records if the map should show only relevant ones

## **Add a Map component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Map**

Under **Views**, drag **Map** to the preferred location on the page.
{% endstep %}

{% step %}
**Configure the Map**

In the **Settings** of the component,&#x20;

* Choose the source **Table**.
* Select the **Location field** that determines each marker's position.
* Select the **Color field** to use dynamic marker colors.
  {% endstep %}

{% step %}
**Review the displayed markers**

Check whether the expected records appear in the right places.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Map component settings**

In **Settings**, you can define the basic component details:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Under **Behavior**, configure how the map works on the page:

* **Table** to choose the source table
* **Location field** to choose which field places markers on the map
* **Title field** to choose which field Ninox shows if you hold the cursor over the marker
* **Color field** to choose which field defines the marker color
* **Map type** to choose the default map style as **Roadmap**, **Satellite**, **Hybrid**, or **Terrain**
* **Filter** to limit which records users can see with one or more conditions
* **Show search field** to show a search field at the top of the map to search a location

Under **Visibility**, choose how the component is shown on the page:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden

  Use **Conditional** when the map should appear only in specific cases.

  Build the condition based on **Fields** and **Tables**.

  This only affects what is shown on the page. It does not change records or permissions.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Metric card component

Highlight one key value with a metric card.

Use a **Metric card** component to highlight one important number on a page. Metric cards work well for totals, counts, averages, and other summary values.

Before you add a **Metric card** component, make sure you have:

* A clear number users should see first
* A source table with the records you want to summarize
* A field that supports the aggregation you want to use

## **Add a Metric card component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Metric card**

Under Views, drag **Metric card** to the preferred location on the page.
{% endstep %}

{% step %}
**Configure the source**

In the **Settings** of the component,&#x20;

* Choose the source **Table.**
* Select the **Field**, you want to aggregate.
* Choose the **Aggregation**.
* Add a **Filter** if you want to display a **Trend.**
  {% endstep %}

{% step %}
**Adjust the display**

Choose the **Number format**.\
Optionally add an **Icon** and enable **Trend**.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
To enable **Trend**, add a date field to the filter first.
{% endhint %}

## **Metric card component settings**

In **Settings**, you can define the basic component details:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Under **General**, configure how the card behaves:

* **On click** to define what happens when users click the card.

Under **Source**, configure the value shown on the card:

* **Table** to choose the source table
* **Field** to choose the field Ninox should summarize
* **Aggregation** to choose **Count**, **Sum**, **Average**, **Median**, **Min**, or **Max**\
  Use **Count** to show the number of matching records. Use the other aggregation options to summarize values from the selected field.

Under **Display**, configure how the card appears:

* **Number format** to show the value as **Number**, **Currency**, **Percentage**, or **Compact**
* **Icon** to add a visual icon to the card
* **Trend** to show a trend indicator when a date filter is set

  If Trend is enabled, you can set:

  * **Period** to be for **Yesterday**, **Last week**, **Last month**, or **Last year**
  * **Trend format** as **Percentage** or **Absolute** **value**
  * **Positive** to choose if **Up-** or **Down is good**

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Chart components

Visualize table data on a page with bar, line, pie, and progress charts.

Use chart components on a page to turn table data into a quick visual summary.

Choose the chart type based on the question you want to answer:

* **Bar chart** for comparing values across categories
* **Line chart** for showing changes over time
* **Pie chart** for comparing proportions
* **Progress chart** for tracking progress toward a goal

Before you add a chart component, make sure you have:

* A clear question the chart should answer
* Numeric values and grouped records to visualize
* Fields to filter the records if the chart should show only relevant ones

## **Add a chart component to a page**

{% stepper %}
{% step %}

#### **Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}

#### **Choose a chart type**

From **Charts**, drag **Bar chart**, **Line chart**, **Pie chart**, or **Progress chart** to the preferred location on the page.
{% endstep %}

{% step %}

#### **Configure the chart**

In the **Settings** of the component, choose the source and select field values, or expressions the chart should show.
{% endstep %}

{% step %}

#### **Check the result**

Review whether the chart answers the question the page should support.\
Then drag the component to move it on the page.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Shared chart component settings**

In **Settings**, all chart components share these options:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.
* **Visibility** to show, hide, or conditionally display the component on the page

Use **Visibility** to choose one of these options:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden.

  This only affects what is shown on the page. It does not change records or permissions.

## **Chart-specific settings**

### **Bar chart component settings**

Under **Source**, configure the chart data:

* **Type** to choose **Bar chart**, **Line chart**, or **Pie chart**
* **Table** to choose the source table
* **X-axis** to choose how Ninox groups the records
* **Y-axis** to add one or more number data fields with an aggregation, and color. If you do not select a field here, Ninox uses the **X-axis** field and applies **Count** as the default aggregation.

Use **+ Add data set** to compare more than one value in the same chart.

Under **Display**, configure how the chart appears:

* **Label position** to show labels **Inside** or **Outside**
* **Bar orientation** to show bars **Vertical** or **Horizontal**

Under **Behavior**, configure how the chart behaves:

* **Stacked bars** to combine data sets into one bar per group
* **Show title** to show or hide the chart Label
* **Show labels** to show or hide labels in the chart
* **Show legend** to show or hide the legend
* **Show tooltips** to show values when users move over chart elements
* **Show data table** to show or hide the chart values in a table below the chart

### **Line chart component settings**

Under **Source**, configure the chart data:

* **Type** to choose **Bar chart**, **Line chart**, or **Pie chart**
* **Table** to choose the source table
* **X-axis** to choose how Ninox groups the records
* **Y-axis** to add one or more number data fields with an aggregation, and color. If you do not select a field here, Ninox uses the **X-axis** field and applies **Count** as the default aggregation.

Use **+ Add data set** to compare more than one value in the same chart.

Under **Display**, configure how the chart appears:

* **Label position** to show labels **Inside** or **Outside**

Under **Behavior**, configure how the chart behaves:

* **Smooth lines** to connect values with curved lines
* **Show data points** to show or hide markers on the line
* **Show title** to show or hide the chart Label
* **Show labels** to show or hide labels in the chart
* **Show legend** to show or hide the legend
* **Show tooltips** to show values when users move over chart elements
* **Show data table** to show or hide the chart values in a table below the chart

### **Pie chart component settings**

Under **Source**, configure the chart data:

* **Type** to choose **Bar chart**, **Line chart**, or **Pie chart**
* **Table** to choose the source table
* **Category** to choose one field for how Ninox splits the pie into segments
* **Data source** to choose the field and aggregation for the values.\
  Available aggregations are **Sum**, **Average**, **Median**, **Minimum**, **Maximum**, or **Count**\
  Use **None** when you do not want to aggregate a field.

Under **Display**, configure how the chart appears:

* **Label position** to show labels **Outside**, **Inside**, or **Center**
* **Style** to choose **Default**, **Rounded corner**, **Semicircle**, or **Pie with pad angle**

Under **Behavior**, configure how the chart behaves:

* **Donut** to show the chart as a donut
* **Show title** to show or hide the chart Label
* **Show labels** to show or hide labels in the chart
* **Show legend** to show or hide the legend
* **Show tooltips** to show values when users move over chart elements
* **Show data table** to show or hide the chart values in a table below the chart

### **Progress chart component settings**

Under **Display**, configure how the chart appears:

* **Color** to choose a fixed or dynamic color for the progress ring

Under **Behavior**, configure how the chart behaves:

* **Total** to define the full target value\
  For example:\
  `sum((select invoices where creation_date > today() - 90).gross_total)`
* **Value** to define the current progress value\
  For example:\
  `sum((select invoices where creation_date > today() - 30).gross_total)`

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Container component

Group related page components with shared layout and spacing.

Use a **Container** component to group related components in one area on a page. Use it when components belong together and should share spacing or visibility settings.

You can use **Flow** to organize elements inside the container. You can also add a **Background** color to visually separate one section from the rest of the page.

## **Add a Container component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Container**

Under **Layouts**, click **Container**.\
Place it where you want it on the page.
{% endstep %}

{% step %}
**Move components into the container**

Drag the views, charts, buttons, or text components you want to group.\
Then select the container again.
{% endstep %}

{% step %}
**Adjust the container**

Open **Settings**.\
Review the **Flow**, **Background**, spacing, and visibility options.\
Use the resize handles to adjust its size.
{% endstep %}
{% endstepper %}

## **Configure a Container component**

In **Settings**, review these options:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Use **Display** to configure the container layout and style:

* **Flow** to define how components are arranged inside the container, for example left to right or top to bottom
* **Padding** to set the inner spacing inside the container
* **Margin** to set the outer spacing around the container
* **Border** to choose the border style, border color, and border width in px
* **Border radius** to round the container corners
* **Background** to choose no color, a preset color, or a custom hex or RGB color
* **Shadow** to add depth around the container
* **Gap** to set the space between components inside the container
* **Overflow** to control how content behaves when it exceeds the container

For settings with the dynamic value icon, click it to define the value with logic.

Use **Visibility** to choose one of these options:

* **Visible** to show the component on the page
* **Hidden** to hide the component on the page
* **Conditional** to define a **Visibility condition** that controls when the component is shown or hidden

  Use **Conditional** when the container should appear only in specific cases.

  Build the condition based on **Fields** and **Tables**.

  This only affects what is shown on the page. It does not change records or permissions.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Tabs component

Use tabs to organize related sections on a page.

Use the **Tabs** component to keep related sections on one page. Use tabs when sections have equal importance. Users can view one section at a time.

## **Add the Tabs component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Tabs**

Under **Layouts**, drag **Tabs** to the preferred location on the page.
{% endstep %}

{% step %}
**Create the tab sections**

Use the **+** in the tab bar to add a new tab.\
Rename each tab so users know what it contains.
{% endstep %}

{% step %}
**Add content to each tab**

Drag views, charts, text, or buttons into the active tab **Container**.\
Move and resize each component as needed.\
To adjust tab options in the **Settings**, click an empty area of the container or its border.\
The border appears when you hover over the container.
{% endstep %}
{% endstepper %}

## **Configure the Tabs component**

In **Settings**, review these basic options first:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Use **Display**

* **Variant** to choose **Pills** or **Underlined**

Use **Behavior**

* **On change** to run logic when the active tab changes

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Accordion component

Organize longer page content into expandable sections.

Use an **Accordion** component to keep sections collapsed until users open them. An accordion component helps you shorten long pages and hide optional detail until it is needed.

## **Add an Accordion component to a page**

{% stepper %}
{% step %}
**Open the Add tab**

In the **Settings** panel, open **Add**.
{% endstep %}

{% step %}
**Add Accordion**

Under **Layouts**, drag **Accordion** to the preferred location on the page.
{% endstep %}

{% step %}
**Create the sections**

Use **+ Add section** to add a new accordion section.\
Rename each section so users know what it contains.
{% endstep %}

{% step %}
**Add content to each section**

Drag the views, charts, text, or buttons into the open section **Container**.\
Use the resize handles to adjust the added components' size.\
Go to the **Settings** in the right side panel to adjust the accordion options.
{% endstep %}
{% endstepper %}

## **Configure the Accordion component**

In **Settings**, review these basic options first:

* **Label** for the title shown on the component
* **Internal name** is filled automatically. Change it only if needed and carefully. When you script, you use **Internal name**, not **Label**.

Use **Display**

* **Gap** to set the space between accordion sections

For settings with the dynamic value icon, click it to define the value with logic.

{% hint style="info" %}
To remove a component from a page, select the component, then click <i class="fa-trash-can">:trash-can:</i> **Delete component** in the blue menu above it.
{% endhint %}


# Create and adjust print layouts

Create print layouts to visualize your data and generate the PDF files you need.

## Create your first print layout <a href="#create-your-first-print-layout" id="create-your-first-print-layout"></a>

Use a print layout to control how a record turns into a PDF.

Print layouts help you decide what a PDF includes and how it is structured. Use them for customer-facing documents such as quotes, invoices, or confirmations, and for internal summaries. You can add text, images, fields, and linked records, then arrange them so each PDF shows the right information for its audience.

{% hint style="info" %}
Enable **Builder mode** to create or edit print layouts.
{% endhint %}

{% stepper %}
{% step %}

#### Open the print editor

In a record form, click the <i class="fa-print">:print:</i> printer icon in the top right.\
You can also open the three-dot menu and select **Print record**.

<figure><img src="/files/X7bwOJIOd59kadG49QG4" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

#### Review the first layout

The first time you open the print editor for a table, Ninox creates a layout with all current fields.\
Review this automatic layout before you start editing.
{% endstep %}

{% step %}

#### Add the content you need

Click **+ Insert** in the top bar.\
You can add **Text**, a static **Image**, and **Data** fields from your current table.

{% hint style="info" %}
Use **Text** to display static text or a value returned by a script.

For example, to show the client name from a linked record on an invoice, use `client.full_name`.
{% endhint %}
{% endstep %}

{% step %}

#### Arrange and edit the layout

Select an element to highlight its frame.\
Drag it to move it.\
Drag the square handles to resize it.\
Click **Edit script** <i class="fa-code-simple">:code-simple:</i> to change the content of a field or element.
{% endstep %}

{% step %}

#### Check the settings panel

Use the right-side panel to adjust page and object settings.\
The available options depend on what is selected.\
For a full settings reference, see the overview below.
{% endstep %}

{% step %}

#### Save the layout

Click **Save changes** when you are done.\
If this is your first layout, enter a **Layout name** and click **Save**.
{% endstep %}
{% endstepper %}

## Manage print layouts

{% hint style="info" %}
You can save multiple print layouts in the same table.
{% endhint %}

After you save your first layout, Ninox opens it by default. If you save more than one layout, choose one from the drop-down list next to **Back**.

If you add fields to the table later, Ninox does not update saved layouts automatically. Add the new fields to the layout yourself if you want them to appear in the PDF.

Use the arrow next to **Save changes** to manage layouts:

Choose **New layout** when one table needs different PDF outputs.

* Enter a layout name.
* Choose a layout type:
  * **Blank** starts with an empty page.
  * **Automatic** adds all current fields and their labels.
  * **Copy current layout** creates a copy of the current layout.

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

From the same menu, you can also:

* Use **Save as** to save the current layout as a copy with a different name.
* **Rename** the current layout.
* **Discard changes** if you do not want to keep your edits.
* **Delete** the current layout.

## Edit layout elements

Existing print layouts stay editable at any time. When you open the print editor, you are already in edit mode.

* At the bottom of the page, use **Show grid** to show or hide the grid.
* Use the **Zoom** slider to zoom in or out.
* Use **Undo** and **Redo** to reverse or restore changes.
* Use **Cut**, **Copy**, and **Paste** to reuse recurring styles and content.
* Open the three-dot menu in the top bar to arrange and align elements:
  * **Send to front** and **Send to back**
  * **Align left**, **center**, or **right**
  * **Align top**, **middle**, or **bottom**
  * **Distribute horizontally**
* To remove an element, select its frame and click <i class="fa-trash-can">:trash-can:</i> **Remove**, or press <i class="fa-delete-left">:delete-left:</i> delete or <i class="fa-delete-right">:delete-right:</i> backspace on your keyboard.

Use the settings panel to adjust the layout. Available options depend on what you select.

Select the page to change page settings. Select a text, data, image, or linked table element to adjust its position, size, styling, and display options.

### Adjust page settings

Click an empty area or the page margin to edit the page layout. You can set:

* **Paper size**
* **Header and footer** height
* Page **Margin** width
* **Print attachments** to include record attachments in the PDF

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

### Adjust element settings for text, logic, or data fields

If you select a text box, logic, or data field, but not an image field, you can set:

* The page area, such as **Flow with content** or a repeating **Header** or **Footer**
* A fixed or automatic element **Height**
* The exact element **Position** with X and Y coordinates, plus **Width** and **Height**
* Inner **Padding** between the content and the element border
* **Colors** for the background and text
* **Border** color, width, and radius
* **Font** family and size
* Text formatting such as **Bold**, **Italic**, or **Underline**
* **Text** alignment
* Text **Line height**

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

### Adjust file and image field settings

For a file field and the static image, you can set:

* The page area, such as **Flow with content** or a repeating **Header** or **Footer**
* A fixed or automatic height
* The exact element **Position** with X and Y coordinates, plus **Width** and **Height**
* **Background color** for field areas not covered by the image
* **Border** color, width, and radius

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

### Adjust content and column settings for linked tables

This section applies when the print layout shows records from a linked table.

Use these settings to control which linked records and columns appear in the PDF. This is useful, for example, when a customer should see only relevant details.

{% hint style="info" %}
These changes apply only to the print layout. They do not change the underlying linked table.
{% endhint %}

Select the table shown in the print layout for a field of type <i class="fa-arrow-left">:arrow-left:</i> **Link many records** to control its content and presentation in the PDF. You can use all options listed above for **Text**, **Logic**, and **Data** fields, except **Text** alignment and text **Line height**.

You can also use these linked-table options:

* **Show header** to show or hide the column titles
* **Show footer** to show or hide aggregation results for columns where you set an **Aggregation**
* **Hide columns**, **Filter**, and **Sort**
* **Border style** to choose how the table grid looks
* **Cell padding** to define the distance between the value and the cell borders

You can also change table columns directly in the selected table frame:

* Use <i class="fa-eye-slash">:eye-slash:</i> x **hidden columns**, **Filter**, and **Sort** at the top right
* In the drop-down menu for each column:
  * **Rename column**
  * **Duplicate column**
  * **Insert column left** or **right**
  * **Sort** in ascending or descending order
  * **Aggregation**, depending on the data type, which you can display in the footer with **Show footer**
  * **Hide column**

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

## Generate a PDF <a href="#generate-a-pdf" id="generate-a-pdf"></a>

When your print layout is ready, click **Generate document** in the top right. By default, the PDF opens in your browser.

Click the arrow next to **Generate document** to choose what to generate:

* **Generate for selected record**
* **Generate for all records**\
  This option creates a single PDF containing all records of the open table view on separate pages.

{% hint style="info" %}
**Generate for all records** is available only when you open the record from a table view.
{% endhint %}


# Style your tables with conditional formatting

Use conditional formatting to style table views and view elements based on conditions.

Use conditional formatting to make table views and table elements on a record form easier to scan with colors and icons based on conditions.

## Set up the conditions and styling

{% stepper %}
{% step %}

#### Choose the table

* Go to the table view you want to format.
* Click one of the column headers.
* Choose **Conditional formatting**.
  {% endstep %}

{% step %}

#### Set up a rule

* Set the condition by choosing a column, an operator, and a comparison value.
* Choose whether to format the **Cell** or the whole **Row**.
* Set the text style, colors, or icon in **Value**.\
  Available highlighting options are:
  * **Row**
    * Text styles: **Bold**, **Italic**, **Strikethrough**
    * **Text color**, **Background color**
  * **Cell**
    * Text styles: **Bold**, **Italic**, **Strikethrough**
    * **Text color**, **Background color**, **Text highlight color**
    * **Recently used icons**
* Click <i class="fa-circle-plus">:circle-plus:</i> **More colors** or <i class="fa-circle-plus">:circle-plus:</i> **Select icon** to chose from more color options or icons.

<figure><img src="/files/1CEa2u5Agz5YI9pTjPkw" alt=""><figcaption></figcaption></figure>

* Click **Apply** to confirm your choices or **+ Add rule** to add more rules if needed.
  {% endstep %}

{% step %}

#### Arrange the rule order

In some cases, more than one rule applies to the same **Cell** or **Row**. Because only one format can be shown at a time, arrange the rules according to their [ranking](#ranking-order-of-rules).\
Use the **`⋮⋮`** handle on the left to drag a rule up or down.
{% endstep %}
{% endstepper %}

### Ranking order of rules

Rules need a ranking because more than one rule can apply to the same **Cell** or **Row**.

When multiple rules apply:

* The first matching rule wins for each formatting option.
* If a rule does not set a formatting option, Ninox uses the next applicable rule for that option.
* A matching **Cell** rule overrides a matching **Row** rule, even if the **Row** rule appears first.

{% hint style="info" %}
Rule ranking is applied to each formatting option separately. For example, if a higher-ranked rule sets only the background color, Ninox can still take **Italic** from a lower-ranked applicable rule.
{% endhint %}

Let's take a look at an example:

Set two rules that target the same records. In the first rule, set a background color and a text color. In the second rule, set a different background color.

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

The second rule does not apply because the first rule already set the background color.

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

Now change the order of the two rules. In the new first rule, set *`I`* **Italic**.\
Then add a third rule for a cell. In that rule, set **Bold**, **Text color**, **Background color**, **Text highlight color**, and an **Icon**.

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

The final result is built in layers:

* Rule 1 sets the background color and italic text style for matching rows.
* Rule 2 sets the text color for those rows.
* Rule 3 sets the background color, text color, and icon for the matching cell.

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

This example shows how Ninox evaluates each formatting option separately. A row can take its background color from one rule, its text color from another, and a cell-specific style or icon from a third rule.


# Manage your organization

Manage settings, access, subscriptions, and workspaces at the organization level.

Manage the parts of Ninox that apply across your whole organization. You can control organization settings, member access, billing, and workspace administration.

Choose a topic to go straight to the task you need.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Manage organization settings</strong><br>Change the organization name, review the internal name, and delete the organization when needed.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/eaemNnRUsvo1dkLg2CUE">/spaces/YwCp7NT87JGgngrkhfHT/pages/eaemNnRUsvo1dkLg2CUE</a></td></tr><tr><td><strong>Manage organization access</strong><br>Invite members, assign organization roles, and manage workspace custom roles.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/ZXcZswQ6lyL8vSKVXp0D">/spaces/YwCp7NT87JGgngrkhfHT/pages/ZXcZswQ6lyL8vSKVXp0D</a></td></tr><tr><td><strong>Subscriptions and usage</strong><br>Review your plan, manage billing, and track usage across the organization and its workspaces.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/WdD9s26ngS7lTLvzkIHE">/spaces/YwCp7NT87JGgngrkhfHT/pages/WdD9s26ngS7lTLvzkIHE</a></td></tr></tbody></table>


# Manage organization settings

Change your organization name, review the internal name, and delete an organization when needed.

Manage settings that apply across your organization.

In **Organization settings** you can:

* change the **Organization name**
* review and update the **Internal name**
* delete the organization

Changes you make here affect all workspaces and apps in the organization.

{% hint style="info" %}
Only users with the role **Admin** can update or delete an organization. For role details, see [Manage organization access](/builder-hub/manage-your-organization-and-workspace/manage-your-organization/manage-organization-access).
{% endhint %}

### Change organization details

Use this screen when the displayed organization name changes or when you need to review the internal name.

{% stepper %}
{% step %}

#### Open organization settings

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, open the organization settings screen.
{% endstep %}

{% step %}

#### Update the organization details

Edit **Organization name**.\
Choose a clear name that matches your company or team.

Review **Internal name** and change it only if you need a different value.\
Change the internal name only when you need a specific value for your setup.
{% endstep %}

{% step %}

#### Save the changes

Confirm the change in the settings screen with **Update organization**.\
The updated details apply across the organization.
{% endstep %}
{% endstepper %}

### Delete an organization

Delete an organization only when you no longer need any workspace or app inside it. When you start deletion, Ninox asks you to confirm the action explicitly before it is carried out.\
Deleting an organization cannot be undone.

{% hint style="warning" %}
Deleting the organization permanently deletes all workspaces inside it and all related data.
{% endhint %}

Before you delete the organization, make sure you have saved anything you still need. In **Organization settings**, click **Delete organization**. Then complete the required confirmation steps.


# Manage organization access

Manage members, assign organization roles, and control who can manage your organization.

With organization access, you decide who can manage members, settings, billing, subscriptions, and other tasks across your organization.

Organization access is separate from workspace access. You can make someone an organization admin and still limit their access in a workspace. For workspace-specific access, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

Give each member one organization role. That role defines what they can manage at the organization level.

* **Admin:** Full control of organization settings, users, roles, billing, subscriptions, and organization-level administration.
* **Admin W/O Billing:** Manage users, roles, settings, and workspaces, but not billing or subscriptions.
* **Billing:** Manage payments and subscriptions only.
* **Member:** Regular organization member with access to workspaces, but no organization administration rights.

{% hint style="info" %}
Inviting someone to a workspace also adds them to the organization as a **Member**.
{% endhint %}

Use custom roles to define more specific access inside workspaces. Create them at the organization level and reuse them across workspaces in the same organization.

In the **Organization users & roles** screen, use the **User management** tab to manage organization members and roles. Use the **Workspace custom role management** tab to create and manage custom roles for workspaces.

You can also create a custom role while inviting someone to a workspace. In **Role**, start typing in **Search custom role**. If the role does not exist yet, select **Create "..." as custom role**. The new role then appears in the custom roles list and is selected right away.

Some role changes only apply after the invited user accepts the invitation and joins the organization.

A custom role only takes effect after you assign it in a workspace and use it in app, table, or field permissions.

If you delete a custom role, you also remove its assignments and related permission associations in workspaces. This includes app, table, and field permissions. This action cannot be undone.

### Add and review members

Use the **Organization users & roles** screen to review everyone in your organization.

In the **User management** tab, you can search by email, filter by status, and review each member's role, workspaces, joined or invited date, verification, and status.

{% stepper %}
{% step %}

#### Open user management

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, select **Users & roles**.

Stay on **User management**.
{% endstep %}

{% step %}

#### Invite a user

Select **Invite users** and enter the user's email address.
{% endstep %}

{% step %}

#### Choose an organization role

Select one of these roles before you send the invite:

* **Admin**
* **Admin W/O Billing**
* **Billing**
* **Member**
  {% endstep %}

{% step %}

#### Send the invite

The user appears in the member list. The invite stays pending until they accept it.
{% endstep %}
{% endstepper %}

Use the member list to review invited and active users, check their status, and update access when needed.

### Change organization roles

Change a user's organization role from the member list when their organization-level responsibilities change.

Use this when someone needs full administration, billing access, or standard member access.

{% stepper %}
{% step %}

#### Open user management

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, select **Users & roles**.

Stay on **User management**.
{% endstep %}

{% step %}

#### Find the user

Use search or filters to find the invited or active user.
{% endstep %}

{% step %}

#### Change the organization role

In the user's row, select the current role and choose **Admin**, **Admin W/O Billing**, **Billing**, or **Member**.
{% endstep %}

{% step %}

#### Review workspace access if needed

Changing the organization role does not change the user's workspace roles.

Update workspace access separately if the user also needs different access inside a workspace.
{% endstep %}
{% endstepper %}

Keep in mind:

* Changes for active users apply right away.
* Changes for invited users apply after they accept the invitation and join the organization.
* Organization roles control organization administration, not workspace-specific access.

### Remove a user from the organization

Remove a user from the organization when they should no longer have any access to your organization's workspaces or settings.

{% stepper %}
{% step %}

#### Open user management

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, select **Users & roles**.

Stay on **User management**.
{% endstep %}

{% step %}

#### Find the user

Use search or filters to find the invited or active user you want to remove.
{% endstep %}

{% step %}

#### Remove the user

Select the checkbox next to the user.

Then select <i class="fa-trash-can">:trash-can:</i> **Remove user**.

You can also remove one user directly from their row.
{% endstep %}

{% step %}

#### Confirm the removal

Confirm the action to remove the user from the organization.
{% endstep %}
{% endstepper %}

Keep in mind:

* Removing a user from the organization also removes their access to every workspace in that organization.
* Removing an invited user cancels the invitation.
* If someone should keep access to the organization but lose access to one workspace, update their workspace access instead. See [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).

### Manage workspace custom roles

Create workspace custom roles at the organization level and reuse them across workspaces in the same organization.

The role list shows each role's name, description, and creation date.

{% stepper %}
{% step %}

#### Open workspace custom role management

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, select **Users & roles**.

Select the **Workspace custom role management** tab.
{% endstep %}

{% step %}

#### Create a custom role

Select **Create role**, enter a role name, and add an optional description.
{% endstep %}

{% step %}

#### Reuse the role in workspaces

After you create a custom role, workspace admins can assign it in any workspace in the same organization. They can then use it for app, table, and field permissions.

They can also create a new custom role directly from the workspace invite dialog, where it appears in the custom roles list right away.
{% endstep %}

{% step %}

#### Delete the role if you no longer need it

Select the role and choose **Delete role(s)**.
{% endstep %}
{% endstepper %}


# Subscriptions and usage

Use this screen to manage your organization plan, billing, and purchases, and to monitor usage across your organization and workspaces.

### Manage subscriptions

{% hint style="info" %}
Only users with the organization role **Admin** or **Billing** can change the subscription or make purchases.
{% endhint %}

In the **Manage subscriptions** section you can:

* See which plan is active. The current plan is marked on its card.
* Switch between **Monthly** and **Annual** billing.
* Compare **Free**, **Team**, and **Business** side by side.

The available plans include:

* **Free** for individuals getting started
* **Team** for small teams building and sharing apps
* **Business** for teams that need advanced security and control

Use the plan cards to compare included features, limits, and pricing.

### Track usage

In the **Track usage** section you can:

* Switch between **Organization** and **Workspace** usage.
* Check when usage data was last updated.
* Review current usage against the included limit for each metric.

In **Organization** usage you can track:

* **Storage**
* **Records**
* **API calls**
* **Documents generated**
* **Linked emails**

In **Workspace** usage you can:

* Search for a workspace
* Compare usage across workspaces in one table
* Review **Storage**, **Records**, **API calls**, **Documents generated**, **Sent emails**, and **Linked emails** for each workspace

This gives you one place to manage billing and monitor usage for the organization and its workspaces.


# Organize your workspace

Manage settings, backups, access, API keys, and email connections for one workspace.

Manage the parts of Ninox that apply to one workspace. You can control workspace settings, backups, member access, API keys, and email connections.

Choose a topic to go straight to the task you need.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Manage workspace settings</strong><br>Change the workspace name, review the internal name, and delete the workspace when needed.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/RBLCyyZrAxm8QZZDXl44">/spaces/YwCp7NT87JGgngrkhfHT/pages/RBLCyyZrAxm8QZZDXl44</a></td></tr><tr><td><strong>Manage workspace access</strong><br>Invite members, assign workspace roles, and control access inside one workspace.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/VMyGm52ou8KLj0OSiY7Y">/spaces/YwCp7NT87JGgngrkhfHT/pages/VMyGm52ou8KLj0OSiY7Y</a></td></tr><tr><td><strong>API &#x26; integrations</strong><br>Create, review, and revoke workspace API keys for the Ninox public API.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/hOQVmoUDv1hUUGyPBmJi">/spaces/YwCp7NT87JGgngrkhfHT/pages/hOQVmoUDv1hUUGyPBmJi</a></td></tr><tr><td><strong>Email integration</strong><br>Connect or disconnect a Google or Microsoft inbox for workspace email features.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/D6UxzKRPdHnlbxLivRjY">/spaces/YwCp7NT87JGgngrkhfHT/pages/D6UxzKRPdHnlbxLivRjY</a></td></tr><tr><td><strong>Backup and restore your data</strong><br>Restore a workspace from a saved point in time and understand how backup retention works.</td><td><a href="/spaces/YwCp7NT87JGgngrkhfHT/pages/3N3a2h2wAHMGW7Tdnhu8">/spaces/YwCp7NT87JGgngrkhfHT/pages/3N3a2h2wAHMGW7Tdnhu8</a></td></tr></tbody></table>


# Manage workspace settings

Change your workspace name, review the internal name, and delete a workspace when needed.

Manage settings that apply to one workspace.

In **Workspace settings** you can:

* change the **Workspace name**
* review and update the **Internal name**
* delete the workspace

Changes you make here affect this workspace only.

{% hint style="info" %}
Only users with the workspace role **Admin** can update or delete a workspace. For role details, see [Manage workspace access](/builder-hub/manage-your-organization-and-workspace/organize-your-workspace/manage-workspace-access).
{% endhint %}

### Change workspace details

Use this screen when the displayed workspace name changes or when you need to review the internal name.

{% stepper %}
{% step %}

#### Open workspace settings

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **Settings**.
{% endstep %}

{% step %}

#### Update the workspace details

Edit **Workspace name**.\
Choose a clear name for the team or business area.

Review **Internal name** and change it only if needed.\
The internal name is the system identifier for the workspace.
{% endstep %}

{% step %}

#### Save the changes

Confirm the change in the settings screen with **Update workspace**.\
The updated details apply to this workspace.
{% endstep %}
{% endstepper %}

### Delete a workspace

Delete a workspace only when you no longer need the apps and data inside it. When you start deletion, Ninox asks you to confirm the action explicitly before it is carried out.\
Deleting a workspace cannot be undone.

{% hint style="warning" %}
Deleting the workspace permanently deletes all apps and data inside that workspace.
{% endhint %}

Before you delete the workspace, make sure you have saved anything you still need.

{% stepper %}
{% step %}

#### Open the delete action

In **Workspace settings**, go to **Danger zone**.\
Click **Delete workspace**.
{% endstep %}

{% step %}

#### Confirm the deletion

Select the confirmation checkbox.\
Confirm your email address.\
Enter the exact workspace name.
{% endstep %}

{% step %}

#### Delete the workspace

Click **Delete workspace**.

The workspace and all data inside it are permanently deleted.
{% endstep %}
{% endstepper %}


# Manage workspace access

Manage members, assign workspace roles, and control access inside one workspace.

Workspace access controls what someone can do inside one workspace.

Workspace access is separate from organization access. You can make someone an organization admin and still limit their access in a specific workspace. For organization-wide access, see [Manage organization access](/builder-hub/manage-your-organization-and-workspace/manage-your-organization/manage-organization-access).

Give each member one default workspace role. That role defines their baseline access.

* **Admin**: Full access to the workspace.
* **Editor**: Can read, create, edit, and delete data.
* **Viewer**: Can read and export data, but cannot create, edit, or delete it.
* **None**: No default workspace role. Use this when access should come only from custom roles.

Use custom roles when the default role is too broad. Create them at the organization level and reuse them across workspaces in the same organization.

{% hint style="info" %}
A user can have custom roles with or without a default workspace role.
{% endhint %}

In Builder mode, you can apply permissions at three levels:

* **App level**: Control which roles can access one app. In **App settings**, use **Allow access to** to limit access to selected workspace roles or custom roles.
* **Table level**: Control who can read, edit, create, and delete records in a table.
* **Field level**: Control who can read specific fields, such as email addresses or phone numbers.

This lets you control access at the right level. For example, you can limit one app to selected roles, let a support role view a table, and let only a delivery role see the **Address** field.

A custom role only takes effect after you assign it in a workspace and use it in app, table, or field permissions. If you do not use a custom role in permissions, the member's default workspace role decides their access.

Custom roles can also narrow access. For example, someone can be an **Editor** in the workspace but still be blocked from editing one table unless they also have the required custom role.

{% hint style="info" %}
**Admin** does not appear in restricted permission pickers. Workspace admins always keep full access.
{% endhint %}

### Add and review members

Use the **Workspace users & roles** screen to review everyone who can access the workspace.

You can search by email, filter by status, and review each user's role, joined or invited state, verification, and status.

{% stepper %}
{% step %}

#### Open workspace users

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **Workspace users**.
{% endstep %}

{% step %}

#### Invite a user

Select **Invite users** and enter one or more email addresses.
{% endstep %}

{% step %}

#### Choose the workspace role

Select one default workspace role:

* **None**
* **Admin**
* **Editor**
* **Viewer**
  {% endstep %}

{% step %}

#### Add custom roles if needed

Select one or more custom roles to add more specific access rules.

To create a new custom role, start typing in **Search custom role**. If the role does not exist yet, select **Create "..." as custom role**.

After you create it, the new role appears in the custom roles list and is selected in the same dialog.

{% hint style="warning" %}
If you assign only a custom role, make sure that role is already used in app, table, or field permissions.

If no permissions are configured for that custom role yet, the invited user can join the workspace but will land on a blank screen with no access.
{% endhint %}
{% endstep %}

{% step %}

#### Choose the invitation language

Select the language for the invitation email.
{% endstep %}

{% step %}

#### Send the invite

The user appears in the workspace member list. The invite stays pending until they accept it.
{% endstep %}
{% endstepper %}

Keep in mind:

* If the invited user is not already part of the organization, inviting them to the workspace also adds them to the organization as a **Member**.
* If you assign or change roles for an invited user, the change only takes effect after they accept the invitation and join the organization.

Use the member list to review invited and active users, check their status, and update access when needed.

### Change workspace roles

Change a user's default workspace role from the member list when their baseline access changes.

Use this when someone needs broader access, read-only access, or no default role. If you only need to allow or restrict one app, table, or field, keep the default role and adjust custom roles or permissions instead.

{% stepper %}
{% step %}

#### Open workspace users

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **Workspace users**.
{% endstep %}

{% step %}

#### Find the user

Use search or filters to find the invited or active user.
{% endstep %}

{% step %}

#### Change the default role

In the user's row, select the workspace role and choose **Admin**, **Editor**, **Viewer**, or **None**.
{% endstep %}

{% step %}

#### Review custom roles if needed

Keep or update custom roles if the user also needs more specific app, table, or field access.
{% endstep %}
{% endstepper %}

Keep in mind:

* Changes for active users apply right away.
* Changes for invited users apply after they accept the invitation and join the organization.
* **None** removes default workspace access. Any remaining access must come from custom roles used in permissions.
* If a user has only custom roles and those roles are not used in any app, table, or field permissions yet, they will see a blank screen with no access.

### Create and assign custom roles

Create workspace custom roles at the organization level and reuse them across workspaces in the same organization.

The role list shows each role's name, description, and creation date.

{% stepper %}
{% step %}

#### Open workspace custom role management

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **ORGANIZATION**, select **Users & roles**.

Select the **Workspace custom role management** tab.
{% endstep %}

{% step %}

#### Create a custom role

Select **Create role**, enter a role name, and add an optional description.
{% endstep %}

{% step %}

#### Reuse the role in workspaces

After you create a custom role, workspace admins can assign it while inviting or editing a workspace user.

They can then use it for app, table, and field permissions.

To create a new custom role while inviting someone, start typing in **Search custom role**. If the role does not exist yet, select **Create "..." as custom role**.
{% endstep %}

{% step %}

#### Delete the role if you no longer need it

Select the role and choose **Delete role(s)**.

{% hint style="warning" %}
Deleting a custom role also removes its assignments and related permission associations in workspaces. This includes app, table, and field permissions. This action cannot be undone.
{% endhint %}
{% endstep %}
{% endstepper %}


# API and integrations

Create, review, and revoke workspace API keys for the Ninox public API.

Use **API & integrations** to manage API access for one workspace. Here you create, review, and revoke API keys for the Ninox public API, which lets external systems access workspace data programmatically.

In **API & integrations** you can:

* create API keys for external tools
* review each key's scope, expiry, creator, and creation date
* revoke keys you no longer need

You can also open **Swagger UI** or download the **JSON schema** and **YAML schema**.

{% hint style="info" %}
Each API key only works in the current workspace.
{% endhint %}

### Create an API key

Create one key per integration. This makes review and revocation easier.

{% stepper %}
{% step %}

#### Open API & integrations

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **API & integrations**.
{% endstep %}

{% step %}

#### Start the key creation

Click **Create API key**.
{% endstep %}

{% step %}

#### Enter the key details

In **API key name**, enter a descriptive name for the key.\
Use a name that helps you identify the integration or purpose later.

In **Expiration date**, select the date and time when the key should expire. \
To keep the key without an expiration date, leave this field empty.
{% endstep %}

{% step %}

#### Create the key

Click **Create API key**.

Use the key in the external system that calls the Ninox API.
{% endstep %}
{% endstepper %}

### Review API keys

Use the key list to review all API access for the workspace.

For each key, Ninox shows:

* **API key name**
* **Scope**
* **Expires at**
* **Created by**
* **Created at**

Review this list regularly to remove old or unused access.

### Revoke an API key

Revoke a key when an integration is retired, replaced, or no longer trusted.

{% stepper %}
{% step %}

#### Open the key list

Open **API & integrations** under **WORKSPACE**.
{% endstep %}

{% step %}

#### Select the key

Find the key you want to remove. Open its action menu or select it in the list.
{% endstep %}

{% step %}

#### Revoke the key

Choose the revoke action.
{% endstep %}
{% endstepper %}

### Open the API reference

Use the links at the top of the screen when you build or test an integration.

* **Swagger UI** opens the interactive API reference.
* **JSON schema** provides the API schema in JSON format.
* **YAML schema** provides the API schema in YAML format.

You can track workspace API usage in [Subscriptions and usage](/builder-hub/manage-your-organization-and-workspace/manage-your-organization/subscriptions-and-usage).


# Email integration

Connect or disconnect a Google or Microsoft inbox for workspace email features.

Use **Email integration** to connect or disconnect a Google or Microsoft inbox for one workspace. You can also review which email address is currently connected. \
Email connections are set up per workspace. If you use multiple workspaces, connect your inbox in each one separately.

### Connect an inbox

Connect an inbox before you use email features in the workspace.

{% stepper %}
{% step %}

#### Open email integration

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **Email integration**.

You can also start from the setup prompt in **Inbox** when no inbox is connected.
{% endstep %}

{% step %}

#### Choose the provider

Select **Continue with Google** or **Continue with Microsoft**.
{% endstep %}

{% step %}

#### Confirm the connection

Complete the sign-in flow for the selected provider.

Ninox uses the prefilled email details to finish the connection.
{% endstep %}

{% step %}

#### Review the connected inbox

After the setup is complete, the connected email address appears in **Email integration**.
{% endstep %}
{% endstepper %}

### Disconnect an inbox

Disconnect the inbox when you no longer want to use it in this workspace.

{% stepper %}
{% step %}

#### Open email integration

If you are not already on the settings screen, click the gear icon **Settings** in the main navigation.

Under **WORKSPACE**, select **Email integration**.
{% endstep %}

{% step %}

#### Disconnect the inbox

Select **Disconnect**.
{% endstep %}

{% step %}

#### Review the result

This removes the email account connection from the workspace.
{% endstep %}
{% endstepper %}


# Backup and restore your data

Restore a workspace from a saved point in time and understand how workspace backups work.

{% hint style="info" %}
**Backups** is currently in **BETA**. More functionality and retention details will follow soon.
{% endhint %}

Use **Backups** to restore a workspace from a saved point in time. Restore it as a new workspace or overwrite the current workspace.

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

Backups are created daily. Ninox shows each available backup by date, save time, and file size. The **Backups** screen shows the backups that still fall within your plan's retention period.

{% hint style="info" %}
Replacing a workspace restores it to the selected backup. Changes made after that backup are removed.
{% endhint %}

## Restore a workspace from a backup

Go to **Settings**. Under **WORKSPACE**, select **Backups**. Then choose a backup by date. You can restore it as a new workspace or replace the current workspace.

### Restore as a new workspace

{% stepper %}
{% step %}

#### Open the Backups screen

Go to **Settings**. Under **WORKSPACE**, select **Backups**.
{% endstep %}

{% step %}

#### Choose a backup

Find the backup you want to restore.\
Review the backup date, save time, and size.
{% endstep %}

{% step %}

#### Start the restore

Click **Restore as new** on the backup card.
{% endstep %}

{% step %}

#### Enter the new workspace details

Enter a **Name**.\
Review or edit the **Internal name**.\
Select a workspace icon.
{% endstep %}

{% step %}

#### Create the restored workspace

Click **Restore as new**.

Ninox creates a new workspace from the selected backup.\
After the restore finishes, you land in the newly created workspace automatically.

Your original workspace stays unchanged.
{% endstep %}
{% endstepper %}

### Replace the current workspace

Use this option to overwrite the current workspace with the selected backup.

{% hint style="warning" %}
Replacing a workspace overwrites all current data. This action cannot be undone.
{% endhint %}

{% stepper %}
{% step %}

#### Open the Backups screen

Go to **Settings**. Under **WORKSPACE**, select **Backups**.
{% endstep %}

{% step %}

#### Choose a backup

Find the backup you want to restore.\
Review the backup date, save time, and size.
{% endstep %}

{% step %}

#### Replace the workspace

Click **Replace existing** on the backup card.

Review the confirmation message. Click **Replace** to overwrite the current workspace with the selected backup.
{% endstep %}
{% endstepper %}


# Ninox Scripting

Ninox scripting lets you calculate, automate, and connect your app with custom logic.

## **Start here**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Introduction to scripting at Ninox</strong><br>Learn what scripting is, where it runs, and which core terms matter first.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/I3xpSNfSzaIQEtl7Nd5w">/spaces/kPhymvwY495t6ZTxhW8Q/pages/I3xpSNfSzaIQEtl7Nd5w</a></td></tr><tr><td><strong>Step-by-Step Ninox script</strong><br>Build a script in small steps and see how the parts work together.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/Q92DRSIHogTgDRjpo8ZJ">/spaces/kPhymvwY495t6ZTxhW8Q/pages/Q92DRSIHogTgDRjpo8ZJ</a></td></tr><tr><td><strong>Explore core scripting elements</strong><br>Understand statements, variables, operators, and editor basics.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/4oweNaShTqTuEcjOGaiK">/spaces/kPhymvwY495t6ZTxhW8Q/pages/4oweNaShTqTuEcjOGaiK</a></td></tr></tbody></table>

## **Learn by topic**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Work with functions</strong><br>Find the right function for text, dates, math, records, files, and integrations.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/zTdRTs33ne7kLCWzXtPc">/spaces/kPhymvwY495t6ZTxhW8Q/pages/zTdRTs33ne7kLCWzXtPc</a></td></tr><tr><td><strong>Triggers and automation</strong><br>Run logic automatically when records change or events happen.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/q0BO6RVF5YLS4yk5xZeF">/spaces/kPhymvwY495t6ZTxhW8Q/pages/q0BO6RVF5YLS4yk5xZeF</a></td></tr><tr><td><strong>Scripting patterns for common tasks</strong><br>Reuse proven approaches for updates, queries, checks, and record handling.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/qLvaw8RgdH1mO3OlQikY">/spaces/kPhymvwY495t6ZTxhW8Q/pages/qLvaw8RgdH1mO3OlQikY</a></td></tr><tr><td><strong>Best practices and common pitfalls</strong><br>Avoid slow scripts, hidden side effects, and hard-to-debug automation.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/jrSJ1YA0YQJOxpNKF1cs">/spaces/kPhymvwY495t6ZTxhW8Q/pages/jrSJ1YA0YQJOxpNKF1cs</a></td></tr></tbody></table>

## **Browse function categories**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Text and strings</strong><br>Clean, combine, search, and format text values.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/MFgyhVFydCcTVsiFS5om">/spaces/kPhymvwY495t6ZTxhW8Q/pages/MFgyhVFydCcTVsiFS5om</a></td></tr><tr><td><strong>Numbers and math</strong><br>Calculate totals, round values, and work with numeric logic.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/Kd2LGBjXgGJXyXZ7LUcl">/spaces/kPhymvwY495t6ZTxhW8Q/pages/Kd2LGBjXgGJXyXZ7LUcl</a></td></tr><tr><td><strong>Dates and time</strong><br>Build dates, compare periods, and calculate durations.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/pkJ4ttZJZMAvLD8tTGNc">/spaces/kPhymvwY495t6ZTxhW8Q/pages/pkJ4ttZJZMAvLD8tTGNc</a></td></tr><tr><td><strong>Records and tables</strong><br>Query, inspect, sort, and update records.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/yrsmPC9E6UUzy3MY8CVU">/spaces/kPhymvwY495t6ZTxhW8Q/pages/yrsmPC9E6UUzy3MY8CVU</a></td></tr><tr><td><strong>User Interface and navigation</strong><br>Show messages, open pages, and guide users through the app.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/ITPAoceKYUyGGuyGVuYc">/spaces/kPhymvwY495t6ZTxhW8Q/pages/ITPAoceKYUyGGuyGVuYc</a></td></tr><tr><td><strong>Files and export</strong><br>Import, create, inspect, and share files.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/PSGegaMb7QkbmkN1ih3J">/spaces/kPhymvwY495t6ZTxhW8Q/pages/PSGegaMb7QkbmkN1ih3J</a></td></tr><tr><td><strong>Users and roles</strong><br>Adapt logic to the current user, role, and workspace context.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/uHl8tI7lNVcgA5ysrpFM">/spaces/kPhymvwY495t6ZTxhW8Q/pages/uHl8tI7lNVcgA5ysrpFM</a></td></tr><tr><td><strong>Location and devices</strong><br>Work with GPS, links, calls, and barcode scans.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/o1eHswbZz2sRJaRDpT8n">/spaces/kPhymvwY495t6ZTxhW8Q/pages/o1eHswbZz2sRJaRDpT8n</a></td></tr><tr><td><strong>Integration and HTTP</strong><br>Connect Ninox to external services and APIs.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/2pmR3zEq8erLHQifiH63">/spaces/kPhymvwY495t6ZTxhW8Q/pages/2pmR3zEq8erLHQifiH63</a></td></tr><tr><td><strong>System and flow control</strong><br>Control timing, caching, sync, and environment checks.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/aNHJamYfOfRT1qtfOKd4">/spaces/kPhymvwY495t6ZTxhW8Q/pages/aNHJamYfOfRT1qtfOKd4</a></td></tr></tbody></table>

## **Full reference**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Functions library</strong><br>Browse the full documented function set in one place.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/nzgnJwAbsk6XKnjlwJrE">/spaces/kPhymvwY495t6ZTxhW8Q/pages/nzgnJwAbsk6XKnjlwJrE</a></td></tr><tr><td><strong>Data types and operators</strong><br>Find common value types, operators, and conversion helpers fast.</td><td><a href="/spaces/kPhymvwY495t6ZTxhW8Q/pages/ODshFpryNDHVF5t8W3W5">/spaces/kPhymvwY495t6ZTxhW8Q/pages/ODshFpryNDHVF5t8W3W5</a></td></tr></tbody></table>


# Introduction to Ninox script

Learn what Ninox script is, where you can use it, and the core terms you need to start writing scripts.

## **What is Ninox script** <a href="#what-is-ninox-script" id="what-is-ninox-script"></a>

Ninox script is the built-in language you use to tell Ninox what to do. It lets your app calculate, react, and automate.

You usually add short scripts to a field, button, or automation.

Use Ninox script when you want to:

* calculate values in general, or based on several conditions
* display fields and elements based on certain conditions
* update other records automatically
* run actions when something changes
* connect Ninox to another service

If Ninox already offers a built-in setting for your goal, use that first. Use scripting when you need custom logic or automation.

A small script can already do useful work:

```ninox
if total > 100 then "High" else "Normal" end
```

This script checks a value and returns a result. That is the basic idea behind many Ninox scripts.

Scripts in Ninox help you to:

* automate repetitive tasks
* calculate values dynamically
* validate input and enforce rules
* update related records
* react automatically to events
* connect Ninox to external services

### **Key concepts and terminology** <a href="#key-concepts-and-terminology" id="key-concepts-and-terminology"></a>

You do not need many terms to get started. These are the ones you will see most often:

* **Table**: a group of records of the same kind, such as invoices or contacts.
* **Field**: one value stored on a record, such as a name, date, or status.
* **Record**: one entry in a table.
* **Script**: a block of Ninox logic that reads data, returns a value, or changes data.
* **Statement**: one instruction in a script, such as `if`, `select`, or `for`.
* **Variable**: a named temporary value inside a script.
* **Data type**: the kind of value a script works with, such as Text, Number, Date, Record, or Array. (JSON is rather a *format* than a *data type*, the data type is text which has a certain structure like XML etc.)
* **Operator**: a symbol or keyword that calculates, compares, or combines values, such as `+`, `=`, `and`, or `:=`.
* **Function**: a ready-made operation such as `sum()`, `date()`, or `text()`.
* **Selection**: a list of records returned by a query such as `select`.
* **Context**: the place where the script runs, such as a field, button, or automation. Context affects what values are available.
* **Automation**: logic that runs automatically when a defined event happens.
* **Logic editor**: the editor where you write, format, and troubleshoot scripts.

{% hint style="info" %}
If these terms feel abstract, that is normal. They become clear once you see them in a short script. Find more definitions in our [Glossary](/getting-started/basics/glossary).
{% endhint %}

### **Where you can use scripts in Ninox** <a href="#where-you-can-use-scripts-in-ninox" id="where-you-can-use-scripts-in-ninox"></a>

You can use Ninox script in different places:

* **Logic fields** to calculate values automatically
* **Buttons** to run actions or logic on click
* **Automations** to run logic automatically after an event
* **Queries, filters, and selections** to find and sort records
* **Integrations** to send data to or receive data from other systems

The language stays the same, but the context changes. For example, a button runs logic when a user decides it should run, while an automation runs because an event happened.

Typical examples are:

* calculate a discount in a logic field
* print and save an invoice by clicking a button
* set a status with an automation
* send data to an external service

To learn the basic language patterns, see [Explore core scripting elements](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements). To learn automation behavior, see [Automations](/ninox-scripting/automate-your-workflows/automations).

### **Getting started with Ninox script** <a href="#getting-started-with-ninox-script" id="getting-started-with-ninox-script"></a>

Start with one small, visible result. That is the fastest way to learn.

{% stepper %}
{% step %}

### Start with a simple **Button**

Buttons are easy to test. You click once and see what happens.
{% endstep %}

{% step %}

### Learn the core building blocks

Read [Explore core scripting elements](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements) to understand statements, variables, data types, and operators.
{% endstep %}

{% step %}

### Use the editor to work faster

Read [Logic editor features](/ninox-scripting/automate-your-workflows/explore-core-scripting-elements/logic-editor-features) to learn how Ninox helps you format, search, troubleshoot logic, and use AI assistance.
{% endstep %}

{% step %}

### Add more functions

Read [Work with functions](/ninox-scripting/automate-your-workflows/work-with-functions) when you need dates, text handling, calculations, selections, or integrations.
{% endstep %}

{% step %}

### Automate once the manual version works

Move to [Automations](/ninox-scripting/automate-your-workflows/automations) after your logic works reliably in a **Button** or field.
{% endstep %}
{% endstepper %}




---

[Next Page](/llms-full.txt/1)

