# Noloco Overview

The operating system for professional services firms — built with no-code and AI.

### Welcome to Noloco

**Noloco is the operating system for professional services firms.** Whether you run an agency, a law firm, or any project-based business, Noloco gives you one place to manage client work, run projects, automate operations, and see how your firm is performing — without the chaos that usually comes with growth.

Under the hood, Noloco is a no-code platform powered by AI. You describe what you need and our AI Cobuilder Nola scaffolds the app for you; from there, you customize it through a point-and-click interface to match exactly how your firm runs.

### What can I build with Noloco?

Most Noloco customers use it to run their entire firm in one place:

* **Project & client management** — track every project, deadline, deliverable, and team assignment with full visibility across the business.
* **Branded client portals** — give clients a dedicated, on-brand space to see updates, share files, submit requests, and approve work.
* **Workflows & automations** — replace manual hand-offs with automated approvals, notifications, status updates, and integrations with Slack, Gmail, Zapier, Make, and more.
* **Dashboards & profitability** — see project workload, team capacity, and revenue performance at a glance.
* **Back-office tools & custom CRMs** — anything else your team needs, built to match your workflows instead of forcing you to match theirs.

If you'd rather see this in action, our pre-built [Agency OS solution](/solutions/agency-os) is a complete starter app you can clone and customize — designed end-to-end for professional services firms.

{% embed url="<https://youtu.be/tyM02cGHmqg>" %}

{% hint style="info" %}
For more inspiration, browse our free [templates](https://noloco.io/templates).
{% endhint %}

### How does it work?

Every Noloco app is built on top of your data. You can either create [Noloco Tables](/data/collections) (database tables hosted by us) or connect an external data source like [Airtable](/data/airtable), [Xano](/data/xano), [PostgreSQL](/data/postgresql), [MySQL](/data/mysql), or [Google Sheets](/data/google-sheets).

From there, you add [views](/pages/views) to display the records in each table. Every view ships with [record pages](/record-pages/overview) (so you can click into a single record) and built-in forms (so you can add new records without extra setup).

If you work with an AI assistant like Claude, ChatGPT, or Gemini, you can connect it to Noloco using our MCP servers. Your assistant gets access to your live app data and these guides, so it can act as an expert architect — recommending tables, fields, views, and workflows that suit your firm, and running data tasks for you in natural language. See [Connect your own AI agent](/quickstart/connect-an-ai-agent) for setup.

### How do I get started?

Sign up for Noloco Free at [portals.noloco.io/register](https://portals.noloco.io/register), then follow the [Quickstart](/quickstart) — it walks through the four ways to create an app, how to customize it, and how to invite your team and clients.

{% hint style="info" %}
**Business email required.** Noloco only accepts business email addresses for account registration. Free email providers (Gmail, Outlook, Yahoo, etc.) are not permitted — use a custom business domain like `yourcompany.com` or `organization.org`.
{% endhint %}

<details>

<summary>Account registration troubleshooting</summary>

If you can't create an account, the most common causes are:

* **Email address rejected.** Make sure you're using a business email domain (not Gmail, Outlook, Hotmail, Yahoo, etc.).
* **What counts as a business email?** Examples include `john@noloco.io`, `sarah@accenture.com`, and `admin@yourcompany.org`.
* **Educational emails.** University and school domains (like `.edu`) are generally accepted.
* **Government emails.** Government domains (like `.gov`) are accepted.
* **Non-profit emails.** Organization domains (like `.org`) are typically accepted.

If you're still having trouble registering with a legitimate business email, please contact support.

</details>

### What if I need further help?

We're here for you:

* [Live chat support (in-app)](/settings/support)
* [Noloco Community](https://community.noloco.io)
* These support guides
* [Video tutorials](https://noloco.io/video-tutorials) — we recommend [subscribing to our YouTube](https://www.youtube.com/@Noloco) channel for the latest


# Quickstart

Quick guide on creating and publishing custom apps with Noloco.

Getting a custom app into the hands of your team or clients is exciting. With Noloco, you can build and share your app in minutes. The quickstart below covers the three things you need to do — create the app, customize it, and go live — plus an optional power-up at the end for teams who use an AI assistant.

## Step 1: Create an app

{% hint style="warning" %}
**Account required.** You'll need a Noloco account before creating an app. Sign up at [portals.noloco.io/register](https://portals.noloco.io/register) using a business email address. Free email providers (Gmail, Outlook, etc.) are not accepted.
{% endhint %}

There are four ways to create an app. Pick the one that matches how you'd like to start.

### Method 1: Start with Nola (Recommended)

**Best for:** anyone who'd rather describe what they want than fill in a wizard.

Nola is the conversational AI Cobuilder in the Noloco studio. Tell her about your business and what you need to track, and she'll scaffold the whole app — tables, relationships, layouts, sample data, and views — explaining each step as she works. You can keep iterating in the same conversation until the app fits.

{% content-ref url="/pages/mQC4PzZpNUyqd8hzWq2C" %}
[Start with Nola](/quickstart/start-with-nola)
{% endcontent-ref %}

{% hint style="success" %}
**New to Noloco?** Starting with Nola is the easiest way to learn the platform while building exactly what you need.
{% endhint %}

### Method 2: Start with AI

**Best for:** people who'd rather pick from menus than chat.

A guided onboarding wizard asks about your industry, team, and the problems you want to solve, then generates a tailored app for you. It's a structured alternative to Nola — less open-ended, but quick if you know roughly what you need.

{% content-ref url="/pages/JPgFmkfrEt16fyhMKQwE" %}
[Start with AI](/quickstart/start-with-ai)
{% endcontent-ref %}

### Method 3: Start with your data

**Best for:** teams with existing data in an external source.

If you already have data in [Airtable](/data/airtable), [Google Sheets](/data/google-sheets), [SmartSuite](/data/smartsuite), [Xano](/data/xano), [PostgreSQL](/data/postgresql), or [MySQL](/data/mysql), connect the source and Noloco will import the schema and data, then generate a starting layout around it.

{% content-ref url="/pages/nuEgDTgPnnQDIvWb38WV" %}
[Start with your data](/quickstart/start-with-your-data)
{% endcontent-ref %}

### Method 4: Start with a template

**Best for:** common use cases that already have a template.

Browse our pre-built templates for CRMs, project management, client portals, and more. Copy the one that's closest to your use case and customize from there.

{% content-ref url="/pages/cLT1II1YLJN9Ktd7T1YS" %}
[Start with a template](/quickstart/start-with-a-template)
{% endcontent-ref %}

## Step 2: Customize and personalize

Once you have your initial app (whether built by Nola, generated from the wizard, imported from data, or copied from a template), make it your own.

### Personalize your app

1. [Change your app's theme](/settings/theme-and-design) to match your brand
2. [Upload your own app logo](/settings/general-settings/custom-logos)
3. Update the app's title, description, and email settings

### Add functionality

The power of Noloco is customizing your app to match your exact workflows:

1. [Add views](/pages/views) to display your data
2. [Update the record page](/record-pages/overview)
3. [Customize forms](/forms/forms) for data entry
4. Automate with [action buttons](/actions/action-buttons) and [workflows](/workflows/workflows)
5. Set up [user roles and permissions](/users-and-permissions/user-roles-and-permissions)

{% hint style="info" %}
**Need help customizing?** You can always ask [Nola](/nola) to add features, build workflows, or modify your app's structure.
{% endhint %}

## Step 3: Go live and invite users

After you've customized your app, you're ready to share it with your team or clients:

1. [**Turn on live mode**](/settings/general-settings/live-mode) — make your app accessible to users.
2. [**Invite users**](/users-and-permissions/user-management) — add users via the User table, or sync them from your data source with a [User List](/settings/user-lists).
3. **Share your app's URL** — send the link to your team or clients. They'll receive an email to confirm their login.

{% hint style="success" %}
**Congratulations!** Your app is now live. You can continue to make changes and improvements at any time — updates are reflected immediately.
{% endhint %}

## Build with your own AI agent

Once your app is up and running, you can take it further by connecting an AI assistant like Claude, ChatGPT, or Gemini directly to Noloco. Your assistant gets access to your live app data (via the Noloco MCP server) and these guides (via our GitBook MCP server), so it can answer questions, advise on schema and workflow design, and run data tasks for you in natural language.

Many builders also use this connection *before* their app is fully built — letting their AI plan the structure first, then bringing those decisions into Nola or the studio.

{% content-ref url="/pages/Vnk1O3RGkSVgtEqnnerb" %}
[Connect your own AI agent](/quickstart/connect-an-ai-agent)
{% endcontent-ref %}


# Start with Nola

The fastest way to build a custom app - let Nola create it for you based on your requirements

Nola is your AI Cobuilder that can build a complete custom app for you in minutes. Simply describe what you need, and Nola will scaffold your entire app—creating tables, designing layouts, generating sample data, and setting up views—all while explaining what she's doing.

This is the fastest and easiest way to get started with Noloco, especially if you're new to the platform or want to quickly prototype an idea.

{% hint style="info" %}
Prefer a guided wizard with menus instead of a conversation? See [Start with AI](/quickstart/start-with-ai).
{% endhint %}

{% embed url="<https://www.youtube.com/watch?v=X50mXE9-ewg>" %}

## How it works

Building an app with Nola is a conversation. You provide context about your needs, and Nola builds your app step by step, asking clarifying questions along the way.

### The Process

**1. Give Nola Context About Your Business**

Start by telling Nola about your industry and what you need. The more context you provide, the better your app will be.

**Example opening messages:**

* "I work in construction and need a CRM and project management tool"
* "I run a real estate agency and need to track properties, clients, and showings"
* "I manage a consulting firm and need to track clients, projects, timesheets, and invoicing"

**2. Describe Your Unique Requirements**

Tell Nola what makes your app special. What specific workflows, data, or features do you need?

**Example follow-up:**

* "We need to track multiple projects per client, with each project having tasks, budgets, and change orders. We also need to manage subcontractors and their schedules"
* "Each property needs photos, pricing history, and we need to schedule showings with multiple agents. We also want to track offers and negotiations"
* "Projects should track multiple team members with different hourly rates. We need to log hours against projects and generate invoices automatically"

**3. Nola Scaffolds Your App**

Nola will start building your app, explaining each step:

* **Creating tables** - "I'm creating a Clients table, a Projects table, and a Tasks table..."
* **Setting up relationships** - "I'm linking Projects to Clients so each project belongs to a client..."
* **Designing layouts** - "I'm creating a Kanban view for tasks grouped by status..."
* **Generating sample data** - "I'm adding 20 sample projects so you can see how it looks..."
* **Previewing results** - "Here's your Projects page with a timeline view showing project schedules..."

You'll see your app taking shape in real-time as Nola works.

**4. Customize and Refine**

Once Nola has built the initial version, you can ask for changes:

* "Add a priority field to tasks"
* "Create a dashboard showing project budgets vs actuals"
* "Add a workflow that notifies the project manager when a task is marked complete"
* "Generate more realistic sample data with different project types"

Nola will make adjustments and continue building based on your feedback.

## Getting Started with Nola

### Step 1: Access Nola

1. Log into your Noloco account at [portals.noloco.io](https://portals.noloco.io)
2. Create a new app or open an existing one
3. Click the **Nola** tab in the top-left of the app studio

{% hint style="info" %}
Nola is available on the Free, Build, and Enterprise plans. If you don't see the Nola tab, check your plan or [learn more about Nola](/nola).
{% endhint %}

### Step 2: Start the Conversation

Begin with a clear description of what you want to build.

**Great opening prompts:**

* "I need to build \[type of app] for \[industry/use case]. We need to track \[key data/entities] and manage \[key workflows]."
* "I'm building a \[specific use case] app. The main things we need are \[feature 1], \[feature 2], and \[feature 3]."
* "We're a \[type of company] and need an app to \[main purpose]. Our unique requirements are \[specific needs]."

### Step 3: Provide Details

Nola may ask clarifying questions, or you can proactively share details:

* **Key entities:** What are the main "things" you need to track? (Clients, Projects, Tasks, Products, etc.)
* **Relationships:** How do these entities connect? (Each project has one client, each task belongs to a project)
* **Key fields:** What information needs to be captured? (Names, dates, statuses, amounts)
* **Workflows:** What processes need to happen? (Notifications, status updates, approvals)
* **Views:** How do you want to see the data? (Lists, calendars, Kanban boards, dashboards)

### Step 4: Review and Iterate

As Nola builds, review what she creates:

* Check the [tables](/data/collections) and [fields](/data/collections/field-types)
* Review the [relationships](/data/collections/relationships) between tables
* Look at the [views](/pages/views) and [display layouts](/views/display)
* Test with the generated sample data
* Request changes or additions

Continue the conversation until your app structure is complete.

### Step 5: Enhance Your App

Once the foundation is built, you can:

* Fine-tune the visual design manually
* Add [custom branding](/settings/general-settings/custom-logos)
* Set up [user roles and permissions](/users-and-permissions/user-roles-and-permissions)
* Configure [workflows](/workflows/workflows) for automation
* Add [custom forms](/forms/forms)
* Replace sample data with real data

## Example Conversation

Here's a real example of building an app with Nola:

**You:** "I run a construction company and need an app to manage our projects, track subcontractors, and handle change orders. We work on multiple projects at once, and each project has a client, budget, timeline, and many tasks."

**Nola:** "I'll build a construction project management app for you. Let me start by creating the core tables:

1. **Clients** - to store customer information
2. **Projects** - to track each construction project
3. **Tasks** - to break down work within each project
4. **Subcontractors** - to manage your contractors
5. **Change Orders** - to track scope changes and budget adjustments

Should I also include:

* A Budget Tracking feature to compare estimated vs actual costs?
* A Schedule/Timeline view to see project timelines?
* Equipment tracking?"

**You:** "Yes to budget tracking and timeline view. We don't need equipment tracking. Also add a field to track project status like 'Bidding', 'Active', 'On Hold', and 'Complete'."

**Nola:** "Perfect! I'm building your app now:

✓ Created Clients table with company name, contact info, and address ✓ Created Projects table linked to Clients with budget, timeline, and status fields ✓ Added Status field with options: Bidding, Active, On Hold, Complete ✓ Created Tasks table linked to Projects with assignee, due date, and completion tracking ✓ Created Subcontractors table with contact details and specialties ✓ Created Change Orders table linked to Projects with cost impact and approval status ✓ Added Budget fields to track estimated cost, actual cost, and variance ✓ Set up a Timeline view for Projects showing start and end dates ✓ Created a Kanban board for Tasks grouped by status ✓ Generated 15 sample projects with realistic data

Your app is ready to preview! Would you like me to:

* Add a dashboard showing budget summaries?
* Create a workflow to notify project managers when change orders are submitted?
* Set up a calendar view for task deadlines?"

**You:** "Yes, add the dashboard and the change order notification workflow."

**Nola:** "Done! I've added:

✓ A dashboard page with charts showing:

* Total projects by status
* Budget vs actual costs across all projects
* Upcoming task deadlines this week

✓ A workflow that:

* Triggers when a change order is created
* Sends an email to the project manager
* Includes the change order details and cost impact

Your construction management app is ready! You can now customize the design, add your team members, and start using it."

## Tips for Building with Nola

### Be Descriptive

The more details you provide, the better your app will be. Instead of "I need a CRM," try "I need a CRM for a B2B sales team that tracks leads, companies, deals, and activities."

### Think About Relationships

Describe how your data connects. "Each project belongs to one client, but clients can have multiple projects" helps Nola set up the right structure.

### Share Your Workflows

Tell Nola about your processes: "When a deal is marked as won, we need to create a project and send a notification to the delivery team."

### Iterate Gradually

Start with core functionality, then add features. "Let's start with clients and projects, then we'll add the scheduling features."

### Ask Questions

Not sure if something is possible? Ask! "Can we track the time each team member spends on tasks?" or "Is it possible to create recurring tasks?"

## What Nola Can Build

When starting with Nola, she can create:

* [**Tables**](/data/collections) with all [field types](/data/collections/field-types) (text, numbers, dates, select options, etc.)
* [**Relationships**](/data/collections/relationships) between tables (one-to-many, many-to-many)
* [**Calculated fields**](/data/collections/rollups) ([rollups](/data/collections/rollups), [lookups](/data/collections/lookup-fields), [formulas](/data/collections/formulas))
* [**Views**](/pages/views) with different [display types](/views/display) ([tables](/views/display/tables), [Kanban](/views/display/kanban-boards), [calendar](/views/display/calendar), [charts](/views/display/charts), etc.)
* [**Filters**](/views/filters) and [sorting](/views/sort-and-limit) on views
* [**Workflows**](/workflows/workflows) with triggers and actions
* **Dashboard pages** with [charts](/views/display/charts) and summaries
* **Sample data** that matches your use case

## After Building with Nola

Once Nola has built your initial app, you can:

### 1. Customize the Design

* Adjust [theme colors](/settings/theme-and-design)
* Upload [custom logos](/settings/general-settings/custom-logos)
* Fine-tune page layouts manually

### 2. Set Up Security

* Create [user roles](/users-and-permissions/user-roles-and-permissions)
* Configure [permissions](/users-and-permissions/user-roles-and-permissions)
* Set up [page visibility rules](/pages/page-visibility-rules)

### 3. Add Real Data

* Replace sample data with real information
* [Import data](/data-management/import-data) from CSV files
* Connect to [external data sources](/data/data-overview)

### 4. Expand Functionality

* Add more [workflows](/workflows/workflows) for automation
* Create [custom forms](/forms/forms)
* Set up [action buttons](/actions/action-buttons)
* Build additional views and dashboards

### 5. Go Live

* [Turn on live mode](/settings/general-settings/live-mode)
* [Invite users](/users-and-permissions/user-management)
* [Set up a custom domain](/settings/custom-domain) (optional)
* [Publish your app](/settings/publishing)

## Common Use Cases for Starting with Nola

Nola excels at building these types of apps:

### CRM & Sales

"Build a CRM to track leads, companies, deals, and activities for our B2B sales team"

### Project Management

"Create a project management app with projects, tasks, milestones, and team assignments"

### Client Portals

"Build a client portal where customers can view their projects, submit requests, and track progress"

### Asset Management

"Create an app to track our equipment inventory, maintenance schedules, and locations"

### HR & Onboarding

"Build an employee directory with onboarding workflows, time-off requests, and performance reviews"

### Event Management

"Create an event planning app to track events, attendees, vendors, and budgets"

## Need Help?

If you get stuck while building with Nola:

* **Ask Nola herself** - "I'm not sure what to do next, can you suggest some improvements?"
* **Check the** [**Nola guides**](/nola) - Learn more about what Nola can do
* **See** [**Tips and Best Practices**](/nola/tips-and-best-practices) - Get expert tips
* **Review the** [**Nola FAQ**](/nola/nola-faq) - Find answers to common questions

## Next Steps

Once Nola has built your app, continue with the quickstart guide:

{% content-ref url="/pages/hTTuGk0IyJhqvk53037H" %}
[Quickstart](/quickstart)
{% endcontent-ref %}

Or learn more about working with Nola:

{% content-ref url="/pages/dSUcNaPNOh8hR4oPryWL" %}
[Nola - AI Cobuilder](/nola)
{% endcontent-ref %}

{% hint style="success" %}
**Pro Tip**: You can always come back to Nola later to add features, create new tables, or build workflows. She's there whenever you need help!
{% endhint %}


# Start with AI

A guided AI onboarding flow that builds a custom app from your answers.

The Start with AI flow is a guided wizard that asks a few quick questions about your business and the problems you want to solve, then generates a tailored app for you to preview and customize.

{% hint style="info" %}
Prefer a conversational approach? See [Start with Nola](/quickstart/start-with-nola), where you describe what you need in your own words and Nola scaffolds the app from the chat.
{% endhint %}

{% @arcade/embed url="<https://app.arcade.software/share/bLZcLzWaNJLdGrTl0qAz>" flowId="bLZcLzWaNJLdGrTl0qAz" %}

### 1. Name your app

Give your app a name to set the context. For a customer management system, something like **"Company CRM"** works well.

{% hint style="info" %}
You can't rename a Noloco app after it's been created, but you can add a custom domain or clone it and rename the copy. Pick something unique and simple — we auto-suggest options for you.
{% endhint %}

### 2. Set the app context

A few quick questions help shape your app:

* **Team or department.** Who will use the app — sales, HR, operations?
* **Industry.** What kind of business is this — real estate, construction, healthcare?
* **Company size.** From solo operators to growing teams.

The more context you provide, the closer the generated app will be to what you need.

### 3. Define the problems to solve

Tell us what you want the app to do. You can:

* Pick from a curated list of common Noloco use cases — CRM, client management, HR, and more.
* Add your own custom requirements in plain language.
* Review the goals you've selected before continuing.

This is the input that shapes your app's structure, pages, and features.

### 4. Build and personalize

Once you confirm your choices, Noloco's AI builds the app behind the scenes. While it's working:

* Pick a **color theme** to match your brand.
* Wait for the AI to generate the pages, filters, and layouts based on your input.

### 5. Preview and test your app

Once generation is complete, you'll be dropped into a live preview with sample data. Things to try:

* Click a record (for example a client) to view or edit the details.
* Test out a feature you selected, like a task manager or event calendar.
* Open a record to see how editing works.
* Explore the different views and how they apply to your use case.

If something isn't right, you can go back and adjust your answers.

### 6. Enter Build Mode and customize

When you're ready, click through to **Build Mode** to start editing your app in the Noloco studio. You'll land on the Quickstart Guide, which walks through:

* Your app's core structure
* Key features and components
* How to customize pages, permissions, and data connections

From here, you can tailor the app to your exact workflows and team needs.

### What's next

That's it — you've built your first Noloco app. Whether you're managing clients, tracking projects, or streamlining HR processes, Noloco gives you the tools to bring those workflows to life without writing code.

If you need more help, check the rest of these guides or reach out to support.

{% content-ref url="/pages/z1D6gFHddGLC6f1Bx836" %}
[Intro to Data & Tables](/data/data-overview)
{% endcontent-ref %}

{% content-ref url="/pages/rt7Tk8EAr0ClfVzam8DV" %}
[Views](/pages/views)
{% endcontent-ref %}

{% content-ref url="/pages/Px5YHpdcv9H0bI0qc5yV" %}
[Overview](/record-pages/overview)
{% endcontent-ref %}

{% content-ref url="/pages/o270zMbCeiHuIlNJIpjF" %}
[Forms](/forms/forms)
{% endcontent-ref %}

### FAQs

<details>

<summary>Can I change my app settings after the AI creates it?</summary>

Yes. After your app is generated, enter Build Mode to fully customize everything — rename your app, adjust features, update layouts, connect data sources, and more.

</details>

<details>

<summary>Is the sample data in my app real?</summary>

No. The initial data is demo content so you can explore your app's structure and features. You can delete or replace it with your actual business data at any time.

</details>

<details>

<summary>What if the AI didn't build exactly what I need?</summary>

The AI gives you a strong starting point, but Noloco is completely flexible. You can tweak page layouts, create new views, change relationships, or add automations to match your workflows.

</details>

<details>

<summary>Can I connect external data sources like Airtable or Google Sheets later?</summary>

Yes. Even if you don't connect a data source during onboarding, you can integrate with Airtable, Google Sheets, Postgres, and more from the Noloco studio whenever you're ready.

</details>

<details>

<summary>Do I need any coding skills to use Noloco?</summary>

No. Noloco is a 100% no-code platform. Everything is built visually — whether you're setting up permissions, designing interfaces, or automating workflows.

</details>


# Start with your data

Get started with Noloco by importing & syncing your data

If you already have business data in a spreadsheet in one of our [supported sources](#supported-sources) you should be able to get started with Noloco in just a few clicks.

Every app you create in Noloco is powered by data. Once you connect a data source to your app, it remains in two-way sync. This means changes to one are reflected in the other.

### Connecting a data source

When creating your project, choose your data source from one of the available options, and then follow the instructions on the next screen to connect your data source.

Noloco uses secure connections to connect to your data source and encrypts the credentials where necessary to ensure your data is secure.

{% @arcade/embed url="<https://app.arcade.software/share/7G4bibJCVYKNBG40FzV1>" flowId="7G4bibJCVYKNBG40FzV1" %}

After you connect your data source, Noloco will determine the tables and columns in your source, then start to import that data to Noloco.

While the data is being imported, Noloco will use AI to generate the layout of your app, creating a page for each table.

Once done, you will be redirected to your new app.

#### Supported Sources

* [Airtable](/data/airtable)
* [Google Sheets](/data/google-sheets)
* [Xano](/data/xano)
* [PostgresSQL](/data/postgresql)
* [MySQL](/data/mysql)

Once you have created your app, you can continue finishing your app's setup by following the rest of the Quickstart guide

{% content-ref url="/pages/hTTuGk0IyJhqvk53037H" %}
[Quickstart](/quickstart)
{% endcontent-ref %}


# Start with a template

Get started with Noloco by copying a template

Noloco has many [templates](https://noloco.io/templates) that you can use to quickly get started with a custom app.

Templates are brilliant for kick-starting your app, and the template directory has a template for all types of use cases, and you can use them to get your apps closer to sharing with your team

{% @arcade/embed url="<https://app.arcade.software/share/YxP215pwmYMKMPsYvxbu>" flowId="YxP215pwmYMKMPsYvxbu" %}

Once you have created your app, you can continue finishing your app's setup by following the rest of the Quickstart guide

{% content-ref url="/pages/hTTuGk0IyJhqvk53037H" %}
[Quickstart](/quickstart)
{% endcontent-ref %}


# Connect your own AI agent

Connect Claude, ChatGPT, Gemini, or another AI assistant to Noloco using our MCP servers — your agent reads your live app data and these guides, and can act as your expert builder.

Most teams already work with an AI assistant. By connecting yours directly to Noloco, your assistant can read your live app data, query these guides in real time, and write back to your app on your behalf — all from the chat interface you already use.

The connection uses two [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) servers:

* The **Noloco app data MCP** gives your assistant access to your apps' tables, schemas, and records.
* The **Noloco guides MCP** gives your assistant read-only access to these guides — the same documentation you're reading now.

Together, these two connections turn your assistant into an expert architect. It already knows your business; it can now read both your live data and our recommended patterns, so it can tell you exactly what tables to create, what relationships you need, which views to add, and how to set up workflows and permissions for your use case. Once your app is live, the same connection lets your assistant answer questions about your data and run updates for you in natural language.

{% hint style="warning" %}
A connected client acts with the same permissions as your data admin role on every Noloco app you approve during sign-in. Only connect AI clients you trust. See [MCP Integration](/settings/mcp-integration) for the full security model.
{% endhint %}

## What you can do with a connected AI

A few prompts that show the range:

* *"I run a small HVAC company. Design the tables and relationships I need for a job-tracking app, using Noloco's recommended patterns."*
* *"Review the schema in my current app and suggest improvements based on Noloco best practices."*
* *"Walk me through setting up a permission rule so contractors only see their own jobs."*
* *"Look up the 20 most recent records in my Jobs table and summarize which are at risk of slipping."*
* *"Create five test customers in my CRM with realistic data."*

You don't need to know Noloco's table or field names — your assistant will inspect the schema itself and use the guides MCP to look up anything it needs.

## The two MCP servers

### Noloco app data MCP

* **URL:** `https://api.core.noloco.io/mcp`
* **Auth:** OAuth — sign in to Noloco the first time you connect a client. No API key.
* **What it gives the agent:** list projects, list tables, read schemas, list/get/create/update/delete records
* **Scope:** every Noloco app where you're a data admin and which you approve during sign-in. One connection per client covers your entire portfolio — the agent picks which app to act on per request.

For the full list of available tools, scope rules, and rate-limit behavior, see [MCP Integration](/settings/mcp-integration).

### Noloco guides MCP

* **URL:** `https://guides.noloco.io/~gitbook/mcp`
* **Auth:** none — public
* **What it gives the agent:** read-only access to these guides

Hosted by GitBook. Anyone can connect — no sign-in required.

## Setting up your agent

The blocks below show how to add both servers together for each major MCP client. The app data MCP triggers an OAuth sign-in the first time you use it — a browser window opens, you sign in to Noloco, and you pick which apps and which scope (read or read + write) the client gets.

### Claude Desktop

The fastest way in is one click: [**Add Noloco to Claude**](https://claude.ai/customize/connectors?modal=add-custom-connector\&connectorName=Noloco\&connectorUrl=https%3A%2F%2Fapi.core.noloco.io%2Fmcp) opens Claude's **Add custom connector** dialog with the name and URL already filled in.

To do it by hand instead, open **Settings → Connectors**. You have two ways to add Noloco:

* **Directory** — find **Noloco** in the connector directory and click **Connect**. This is the quickest if Noloco is listed for your account.
* **Custom connector** — click **Add custom connector**, enter a name (e.g. `Noloco`) and `https://api.core.noloco.io/mcp` as the remote MCP server URL, then click **Add**. Use this if you don't see Noloco in the directory.

{% hint style="info" %}
Free Claude plans allow only **one** custom connector, so you may need to remove an existing one first.
{% endhint %}

Either way, a browser window opens — sign in to Noloco, pick which apps the client can access, and choose the scope (read or read + write). Add the **Noloco guides** connector the same way using `https://guides.noloco.io/~gitbook/mcp` (no auth).

<figure><img src="/files/uFdz6tzW65ejqJropOOr" alt="" width="375"><figcaption><p>The Noloco consent screen — pick which apps the client can use, and whether it gets read or write on each.</p></figcaption></figure>

Once approved, you'll see the Noloco tools in Claude's tool list. You can disconnect or re-run the consent step at any time from the same Connectors screen.

### Claude Code

Run:

```bash
claude mcp add --transport http noloco https://api.core.noloco.io/mcp
```

For the guides MCP:

```bash
claude mcp add --transport http noloco-guides https://guides.noloco.io/~gitbook/mcp
```

The next time you start a session, Claude Code opens the Noloco consent screen in your browser.

### Cursor

In Cursor, open **Settings → MCP** and add the following:

```json
{
  "mcpServers": {
    "noloco": {
      "url": "https://api.core.noloco.io/mcp"
    },
    "noloco-guides": {
      "url": "https://guides.noloco.io/~gitbook/mcp"
    }
  }
}
```

The first time Cursor calls a Noloco tool, a browser window opens for you to sign in and approve access.

### Windsurf

In Windsurf, open the MCP configuration panel and add the same JSON shown for Cursor. The browser will open for OAuth sign-in on first use.

### ChatGPT — Custom MCP Plugins

First switch on **Developer mode** in the ChatGPT web app under **Settings → Apps → Advanced settings**. That unlocks creating your own plugin — in the **New Plugin** dialog, add each server as a **Server URL** connection:

* For the **Noloco app data MCP**, enter `https://api.core.noloco.io/mcp` and set **Authentication** to **OAuth**. ChatGPT discovers our OAuth details itself — no key, header, or client secret to configure.
* For the **Noloco guides MCP**, enter `https://guides.noloco.io/~gitbook/mcp` with no auth.

{% hint style="info" %}
Custom MCP plugins need a **Plus, Pro, Business, Enterprise, or Education** plan, and have to be created in the ChatGPT web app. If your plan doesn't include them, Claude Desktop and Gemini CLI both offer free MCP support.
{% endhint %}

For the full walkthrough — every field in the dialog, what to put in the description, and what to do if the Developer mode toggle is missing on a Business or Enterprise workspace — see [ChatGPT](/settings/mcp-integration#chatgpt) on the MCP Integration page.

### Gemini CLI

Edit `~/.gemini/settings.json` (create it if it doesn't exist) and add:

```json
{
  "mcpServers": {
    "noloco": {
      "httpUrl": "https://api.core.noloco.io/mcp"
    },
    "noloco-guides": {
      "httpUrl": "https://guides.noloco.io/~gitbook/mcp"
    }
  }
}
```

Restart `gemini` after saving. The first Noloco tool call will open a browser for OAuth sign-in. Run `/mcp` inside the CLI to confirm both servers are connected.

### Other MCP clients

Any client that supports OAuth over the [Streamable HTTP transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) can connect. You need one URL per server:

* **Noloco app data MCP** — `https://api.core.noloco.io/mcp` (OAuth handled by the client on first call).
* **Noloco guides MCP** — `https://guides.noloco.io/~gitbook/mcp` (no auth).

See [MCP Integration](/settings/mcp-integration#other-mcp-clients) for additional notes.

## A sample conversation

Once both servers are connected, the interaction feels like working with a Noloco expert who already knows your business. A short example:

**You:** "I run a residential cleaning company with around 10 cleaners. I want to track customers, recurring cleaning jobs, and which cleaner is assigned to each visit. Can you design the table structure I need?"

**Your assistant:** "Let me check the Noloco guides for the recommended way to model recurring jobs and assignees…" *(reads the guides via the MCP)* "Here's what I'd suggest:

* **Customers** — name, address, phone, email, notes
* **Cleaning Jobs** — linked to Customer, frequency (one-off, weekly, fortnightly, monthly), duration, hourly rate
* **Visits** — linked to Job, scheduled date, status (Scheduled / Completed / Cancelled), assigned cleaner
* **Cleaners** — linked to Noloco's User table so each cleaner can log in

For the *assigned cleaner*, Noloco has a dedicated Assignee field type that handles this exact pattern — it links to a User and powers 'My visits' filters and notifications. Want me to use that?"

**You:** "Yes. We also need to send a reminder email to the customer the day before each visit."

**Your assistant:** "Got it. That's a Workflow on the Visits table with a *scheduled trigger* (1 day before the visit date) and a *send email* action. I can see exactly how to set it up from the guides — want me to walk you through the steps in the studio, or just outline what you need to do?"

The assistant won't create those tables for you (see the next section) — but with a complete plan in hand, the build itself takes minutes.

## What this can and can't do

**Your connected assistant can:**

* Read and write records in any Noloco app you approved during sign-in
* Read those apps' table schemas and field definitions
* Look up anything in these guides in real time
* Recommend tables, fields, relationships, views, workflows, and permission rules suited to your business
* Walk you through setting up features step by step, referencing the live guides

**It can't (today):**

* Create tables, pages, views, or workflows in the Noloco studio for you — for that, use [Nola](/quickstart/start-with-nola), Noloco's in-studio AI Cobuilder
* Modify your app's design, theme, or layout
* Access settings, billing, or user management

## Security notes

* A connected client has the same permissions as your data admin role on every app you approved during sign-in. Only connect clients you trust.
* No long-lived API key is shared — OAuth tokens are issued per client and can be revoked individually.
* Permissions changes (role revoked, removed from workspace) take effect on the next tool call, no token reissue needed.
* The MCP server enforces HTTPS — plain HTTP connections are not accepted.
* To disconnect a client, remove it from your Noloco connected applications.

For the full security model and a complete list of tools available on the app data MCP, see:

{% content-ref url="/pages/x2Etj6jf6m7fSkuKZE8s" %}
[MCP Integration](/settings/mcp-integration)
{% endcontent-ref %}


# Nola - AI Cobuilder

Meet Nola, your AI Cobuilder for building powerful Noloco apps faster

Nola is your AI Cobuilder, designed to help you build and customize your Noloco apps with ease. Think of Nola as your expert sidekick—ready to help you add [tables](/data/collections), generate data, create [relationships](/data/collections/relationships), customize your interface, build [workflows](/workflows/workflows), and even [publish](/settings/publishing) your app.

{% hint style="info" %}
Nola is available on all plans (Free, Build, and Enterprise). Nola's AI usage runs on [credits](/nola/credits-and-usage), and every plan includes a monthly allowance.
{% endhint %}

## What is Nola?

Nola is an AI-powered assistant that understands the Noloco platform inside and out. Instead of manually clicking through menus and configuring settings, you can simply tell Nola what you want to accomplish, and she'll help you get it done.

Whether you're:

* Setting up your first app
* Adding complex data relationships
* Building automated workflows
* Customizing your app's interface
* Building a [Canvas](/nola/canvas) — a custom page that goes beyond standard layouts
* Or preparing to publish

Nola can guide you through the process or even do the work for you.

## Who can use Nola?

Nola is available to users on the following plans:

* **Free**
* **Build**
* **Enterprise**

{% hint style="warning" %}
Nola is **not available** on some legacy plans. If you're on a legacy plan and want access to Nola, consider upgrading to one of our current plans.
{% endhint %}

## Why use Nola?

### Save Time

Instead of searching through documentation or figuring out where settings are located, simply ask Nola. She can perform tasks in seconds that might otherwise take minutes of clicking and configuring.

### Learn as You Build

Nola doesn't just do the work—she helps you understand what's happening. Use Nola to learn Noloco's features while building your app.

### Get Unstuck

Hit a roadblock? Not sure how to implement a specific feature? Nola can suggest solutions and walk you through implementation.

### Build Faster

From generating sample data to creating complex [workflows](/workflows/workflows), Nola accelerates every stage of your app development process.

## Getting Started

Ready to start working with Nola? Check out these guides to learn more:

{% content-ref url="/pages/0XtlO9qufGMLCf5IYpLT" %}
[Getting Started with Nola](/nola/getting-started-with-nola)
{% endcontent-ref %}

{% content-ref url="/pages/OZcYeVgozL69b8jLqLgq" %}
[What Nola Can Do](/nola/what-nola-can-do)
{% endcontent-ref %}

{% content-ref url="/pages/JibagdJYh1r2cJ4jUXQJ" %}
[Canvas](/nola/canvas)
{% endcontent-ref %}

{% content-ref url="/pages/FXlVuntbZ6IeJDTMFNXq" %}
[Nola's Memory](/nola/memory)
{% endcontent-ref %}

{% content-ref url="/pages/VF06FPep5ovuLiftwC6a" %}
[Credits & Usage](/nola/credits-and-usage)
{% endcontent-ref %}

{% content-ref url="/pages/0647kJQ2WZkWSoFTDaXF" %}
[Tips and Best Practices](/nola/tips-and-best-practices)
{% endcontent-ref %}

{% content-ref url="/pages/RXyFKKJ9bomokW83O78u" %}
[Nola FAQ](/nola/nola-faq)
{% endcontent-ref %}

## Video Overview

{% embed url="<https://www.youtube.com/watch?v=X50mXE9-ewg>" %}
Watch this quick introduction to Nola
{% endembed %}

{% hint style="success" %}
**Pro Tip**: The more specific you are with your requests to Nola, the better results you'll get. Instead of "add a table," try "create a Projects table with fields for name, description, due date, status, and assigned team member."
{% endhint %}


# Getting Started with Nola

Learn how to access and start using Nola in your Noloco app

Getting started with Nola is simple. This guide will show you how to access Nola and start using her to build your app.

## How to Access Nola

Nola is available directly within the Noloco app builder. Here's how to open Nola:

1. **Open your Noloco app** in Build Mode
2. **Look for the Nola tab** in the top-left tab of your app studio
3. **Click the icon** to open the Nola chat interface

That's it! Nola is now ready to help you build.

{% hint style="info" %}
If you don't see the Nola tab, make sure you're on a supported plan (Free, Build, or Enterprise). Some legacy plans don't have access to Nola.
{% endhint %}

## Your First Conversation with Nola

When you first open Nola, you'll see a friendly welcome message and some suggested actions to get started. Here are some great first requests to try:

### Example Starter Requests

**For New Apps:**

* "Help me create a Customers table with contact information"
* "Generate 10 sample records for my Projects table"
* "Set up a basic CRM structure for my business"

**For Existing Apps:**

* "Link my Customers table to my Orders table"
* "Create a [workflow](/workflows/workflows) that sends an email when a task is marked complete"
* "Add a [dashboard page](/pages/blank-pages) with [charts](/views/display/charts) showing my sales data"

## Understanding Nola's Responses

When you make a request, Nola will:

1. **Confirm she understands** what you're asking for
2. **Take action** or ask clarifying questions if needed
3. **Explain what she did** so you can learn and verify
4. **Suggest next steps** to continue building

### Example Conversation

**You:** "Create a Tasks table"

**Nola:** "I'll create a Tasks table for you. What fields would you like to include? I suggest:

* Task Name (text)
* Description (long text)
* Due Date (date)
* Status (single select: To Do, In Progress, Complete)
* Assigned To (linked to Users)

Would you like me to proceed with these fields, or would you like to customize them?"

**You:** "That looks perfect, go ahead"

**Nola:** "Done! I've created your Tasks table with those 5 fields. The table is now available in your data sources. Would you like me to:

* Create a view to display these tasks?
* Generate some sample data?
* Set up a workflow for task notifications?"

## Tips for Communicating with Nola

### Be Specific

The more details you provide, the better Nola can help.

❌ **Vague:** "Add a form" ✅ **Specific:** "Add a form for creating new customer records that includes name, email, phone, and company fields"

### Break Down Complex Requests

For complex tasks, consider breaking them into steps.

❌ **Too Complex:** "Build me a complete project management system with tasks, clients, timesheets, and invoicing" ✅ **Step by Step:**

1. "Create a Projects table with name, client, start date, and status"
2. "Now create a Tasks table linked to Projects"
3. "Add a timesheet tracking feature"

### Use Natural Language

You don't need special commands or syntax—just talk to Nola naturally.

✅ "Can you help me..." ✅ "I need to..." ✅ "How do I..." ✅ "Show me how to..."

### Ask Questions

Not sure how something works? Just ask!

✅ "How do [workflows](/workflows/workflows) work in Noloco?" ✅ "What's the difference between a [rollup](/data/collections/rollups) and a [lookup field](/data/collections/lookup-fields)?" ✅ "Can you explain [permissions](/users-and-permissions/user-roles-and-permissions) to me?"

## Attaching files and images

You can give Nola more than words. Use the attachment control in the chat to add files and images to a request:

* **Images and screenshots** — share a mockup, a screenshot of another tool, or a design for Nola to work from ("build a page that looks like this").
* **Documents and specs** — attach a brief or specification and ask Nola to build from it.
* **Data files** — upload a CSV, or a document such as a receipt, and Nola can create records from it. She'll ask you to approve the records before they're added.

## Using voice input

If you'd rather talk than type, use the voice input control in the chat to dictate your request. It's useful for longer, more detailed prompts — describe what you want out loud and Nola works from what you say.

## How Nola works through a request

For anything beyond a quick change, Nola works like a capable teammate rather than a single-shot command:

* **She plans first** — for a larger task, Nola lays out a short plan of the steps she'll take, so you can see her approach before she starts.
* **She shows her thinking** — as she works, Nola streams her reasoning and the steps she's taking, which you can expand or collapse.
* **She asks when it matters** — if a request could go a few ways, Nola asks a quick multiple-choice question rather than guessing. Pick an option, or skip it to let her decide.
* **She checks before big changes** — Nola asks for your approval before actions that change or remove things, so nothing significant happens without your say-so.

And once changes are made:

* **Changes are immediate** — you'll see them reflected in your app builder.
* **Changes can be undone** — use Noloco's undo button or manually revert changes.

{% hint style="warning" %}
Always review changes Nola makes, especially before [publishing](/settings/publishing) your app to your team or clients.
{% endhint %}

## Controlling what needs your approval

By default, Nola asks for your approval before actions that **change or remove** things, while read-only actions run without interrupting you. You decide where that line sits — both in the moment and up front.

### From the approval card

When Nola pauses for approval, you can **Approve** or **Deny** the action for that one time. To make your choice stick — so Nola stops asking for the same kind of action — expand **More approval options**:

* **Allow for this chat** — until the current conversation ends.
* **Allow "*****this table*****" only** (or a specific page or workflow) — every time that particular table, page, or workflow is used.
* **Always allow** — every time, anywhere in this app.

Anything you choose here is saved to your **Tool permissions** settings, so the two always stay in sync.

### From your Tool permissions settings

Nola's settings include a **Tool permissions** page where you can decide up front how much Nola can do on its own. These settings apply to you, in this app.

Actions are grouped into categories you can expand — **Records**, **Tables and fields**, **Pages**, **Action buttons**, **Workflows**, **App and settings**, and **Memory**. For each action you can choose:

* **Always ask** — Nola pauses for your approval every time.
* **Always allow** — Nola never pauses for it.

Until you set an action yourself, it follows **Nola's default** — asking before changes and removals, and running reads without a prompt. You can set an entire category in one go, and any per-table, per-page, or per-workflow exceptions you've granted from an approval card appear here as badges you can remove at any time.

This lets you give Nola a longer leash for routine work while still requiring a check on the things that matter most.

{% hint style="info" %}
Some larger jobs are carried out by a sub-agent — building page sections, editing workflows, and generating [Canvas](/nola/canvas) pages. This work runs without pausing, regardless of your Tool permissions settings.
{% endhint %}

<figure><img src="/files/kEzsU5V0a9uIO1r7AkHE" alt=""><figcaption><p>Nola's Tool permissions settings</p></figcaption></figure>

## Nola's Context

Nola is context-aware, meaning she understands:

* What app you're working on
* What page you're looking at
* What tables and fields you have
* Where you are in the builder
* What you've previously discussed in the conversation

This means you can have natural, flowing conversations without repeating context.

**Example:** **You:** "Create a Customers table" **Nola:** \[creates table] **You:** "Now add an Orders table linked to it" **Nola:** \[knows "it" refers to Customers and creates the link]

### Point Nola at a specific element

When you want Nola to focus on one part of a page, select that element in the builder. The selected element is shown in the chat as context — so instead of describing which piece you mean, you can select it and simply say what you want changed.

### Remembering across conversations

Within a chat, Nola remembers what you've discussed. Beyond a single chat, she also keeps a longer-term [memory](/nola/memory) of your preferences and app conventions, so she stays consistent from one conversation to the next.

## Working across conversations

Your work with Nola is organised into conversations, so you can keep separate threads for separate pieces of work:

* **Start a new conversation** for a fresh task, to keep its context focused.
* **Switch between conversations** from the conversation list and pick up where you left off — your history is kept.
* **Delete a conversation** you no longer need.
* **Edit and resend a previous message** to try a request a different way, without retyping it.

## When to Use Nola vs. Manual Building

### Use Nola When:

* Setting up new data structures
* Generating sample data
* Creating [workflows](/workflows/workflows)
* Learning new features
* You want to save time on repetitive tasks

### Build Manually When:

* Fine-tuning visual design
* Making small tweaks to existing elements
* You want precise control over every detail
* Nola can't *yet* do what you need her to

{% hint style="success" %}
**Best Practice**: Use Nola to get 80% of the way there quickly, then manually fine-tune the remaining 20% to your exact preferences.
{% endhint %}

## Getting Help

If you're not sure what Nola can do, just ask:

* "What can you help me with?"
* "Show me examples of what you can do"
* "Help me understand \[feature name]"

## Next Steps

Now that you know how to access and communicate with Nola, learn more about what she can do:

{% content-ref url="/pages/OZcYeVgozL69b8jLqLgq" %}
[What Nola Can Do](/nola/what-nola-can-do)
{% endcontent-ref %}

{% content-ref url="/pages/0647kJQ2WZkWSoFTDaXF" %}
[Tips and Best Practices](/nola/tips-and-best-practices)
{% endcontent-ref %}


# What Nola Can Do

Discover the full range of capabilities and tools Nola can use to help build your app

Nola is equipped with a wide range of tools and capabilities to help you build powerful Noloco apps. Here's a comprehensive overview of what Nola can help you accomplish.

You can talk to Nola by typing, by [voice, or by attaching files and images](/nola/getting-started-with-nola#attaching-files-and-images), and she [remembers your preferences across conversations](/nola/memory). You can even ask her to report a bug to the Noloco team. This page focuses on what she can build.

## Data & Tables

### Create and Modify Tables

Nola can help you set up and manage your data structure:

* **Create new** [**tables**](/data/collections) with custom [field types](/data/collections/field-types)
* **Add fields** to existing tables (text, numbers, dates, select options, [formulas](/data/collections/formulas) etc.)
* **Modify field properties** (change field type, update options)
* **Delete or rename** tables and fields
* **Generate data** and create new records

**Example Requests:**

* "Create a Products table with name, price, description, and category"
* "Add a 'Priority' field to my Tasks table with options: Low, Medium, High"
* "Rename the 'Clients' table to 'Customers'"

### Create Relationships Between Tables

Nola understands how to link your data together:

* **Set up** [**linked record fields**](/data/collections/relationships) between tables
* **Create many-to-many** [**relationships**](/data/collections/relationships)
* **Configure** [**automatic links**](/data/collections/automatic-links)
* **Add** [**lookup fields**](/data/collections/lookup-fields) to pull data from linked records
* **Set up** [**rollup fields**](/data/collections/rollups) to calculate values from linked records

**Example Requests:**

* "Link my Projects table to my Customers table"
* "Create a many-to-many relationship between Tasks and Team Members"
* "Add a rollup field to show total order value per customer"

### Generate Sample Data

Need test data to visualize your app? Nola can create realistic sample records:

* **Generate realistic dummy data** for any table
* **Create relationships** between generated records
* **Customize data volume** (e.g., "generate 50 records")
* **Match your data structure** and field types

**Example Requests:**

* "Generate 20 sample customers with realistic names and email addresses"
* "Create 10 sample projects and link them to existing customers"
* "Fill my Products table with 30 example items"

## Pages & Views

### Create and Configure Pages

Nola can build out your app's structure:

* **Add new** [**view pages**](/pages/views) for your tables
* **Create** [**blank pages**](/pages/blank-pages) for custom dashboards
* **Set up** [**record pages**](/record-pages/overview) with custom layouts
* **Add** [**page folders**](/pages/parent-pages-and-folders) to organize navigation
* **Configure** [**page visibility rules**](/pages/page-visibility-rules) (Soon)

**Example Requests:**

* "Create a page showing all active projects"
* "Add a dashboard page with charts for sales data"
* "Set up a Kanban view for my Tasks table"

### Customize View Display

Nola can configure how your data is displayed:

* **Choose** [**display types**](/views/display) ([table](/views/display/tables), [cards](/views/display/cards), [columns](/views/display/columns), [Kanban](/views/display/kanban-boards), [calendar](/views/display/calendar), [timeline](/views/display/timeline), [charts](/views/display/charts), [maps](/views/display/maps))
* **Add** [**filters**](/views/filters) to views
* **Set up** [**sorting**](/views/sort-and-limit) and [grouping](/views/display/grouping-records)
* **Configure visible fields**
* **Add** [**in-app filters**](/views/filter-fields) for user controls (Soon)

**Example Requests:**

* "Show my Projects page as a Kanban board grouped by status"
* "Add a calendar view for events based on their event date field"
* "Create a chart showing sales by month"
* "Add a filter so users can filter by assigned team member"

## Workflows & Automation

### Build Automated Workflows

Nola can create powerful automation:

* **Set up** [**workflow triggers**](/workflows/workflows) (when records are created, updated, etc.)
* **Configure** [**workflow actions**](/workflows/workflows) ([send emails](/workflows/workflows/send-automated-emails), [update records](/workflows/workflows/update-a-record-action), [create records](/workflows/workflows/create-a-record-action))
* **Add** [**conditional logic**](/workflows/workflows/only-continue-if) ("only continue if...")
* **Create multi-step** [**workflows**](/workflows/workflows)

**Example Requests:**

* "Create a workflow that sends an email when a task is marked complete"
* "Set up an automation that notifies us in Slack when an order is placed"
* "Build a workflow that assigns tasks to team members based on their workload"

### Configure Action Buttons

Nola can add interactive buttons to your app:

* **Create** [**record action buttons**](/actions/action-buttons)
* **Set up** [**bulk action buttons**](/actions/action-buttons/bulk-actions)
* **Configure button triggers** for workflows
* **Add confirmation dialogs**
* **Edit or remove existing buttons**

**Example Requests:**

* "Add a button to mark projects as complete"
* "Create a bulk action to assign selected tasks to a team member"
* "Add an 'Archive' button that moves records to archived status"

## Forms & Data Entry

### Customize Forms

Nola can configure your data entry [forms](/forms/forms):

* **Customize** [**form field labels**](/forms/forms/customizing-form-fields) and help text
* **Set default values** for fields
* **Configure** [**field visibility conditions**](/field-formatting/field-visibility-conditions) (Soon)
* **Set up** [**dynamic form filters**](/forms/forms/dynamic-form-field-filters) (Soon)
* **Add validation rules** (Soon)

**Example Requests:**

* "Make the 'Company' field required on the customer form"
* "Hide the 'Internal Notes' field from the public contact form"
* "Set the default status for new tasks to 'To Do'"
* "Create a public form for customer inquiries"

## User Management & Permissions

### Configure Access Control

Nola can help you secure your app:

* **Create and edit** [**user roles**](/users-and-permissions/user-roles-and-permissions)
* **Configure** [**record-level permissions**](/users-and-permissions/user-roles-and-permissions/record-level-permissions), including the filters that decide which records each role can see
* **Set** [**field-level permissions**](/users-and-permissions/user-roles-and-permissions/field-level-permissions) to hide or expose individual fields
* **Set up** [**user table**](/users-and-permissions/user-table) **configurations**

**Example Requests:**

* "Create a 'Manager' role that can edit all records"
* "Can users can only see their own tasks?"
* "Hide salary information from non-admin users"
* "Set up permissions so clients can only see their own projects"

## App Customization

### Adjust App Settings

Nola can change your app's settings for you, so you don't have to hunt through menus:

* **Update app-wide settings** like your app's name and general configuration
* **Adjust** [**theme and design**](/settings/theme-and-design) options
* **Change navigation and layout settings**

**Example Requests:**

* "Rename my app to 'Client Portal'"
* "Switch the app to our brand colours"

### Build a Custom Page with a Canvas

When a standard layout can't express what you have in mind, Nola can build you a [**Canvas**](/nola/canvas) — a fully custom page such as a bespoke dashboard, portal home, or interactive view. Nola writes and maintains the code behind a Canvas, reusing your data and Noloco's building blocks, so you get a custom result without any code to manage yourself.

* **Create a Canvas** from a plain-language description
* **Add a** [**Canvas component**](/nola/canvas/canvas-components) to an existing record or blank page for a single custom, dynamic section
* **Refine it by chatting**, or [point at a specific element](/nola/canvas/editing-canvases) to change just that part
* **Add charts and visualizations** built on your data
* **Add your own images** and place them exactly where you want

**Example Requests:**

* "Add a Canvas with a sales dashboard: KPI cards and a revenue chart"
* "Create a landing page for our customer portal as a Canvas"
* "Make this section a two-column layout"

Learn more in the [Canvas guides](/nola/canvas).

## Publishing & Deployment

### Prepare Your App for Launch

Nola can help you get your app live:

* **Guide you through** [**publishing**](/settings/publishing) **checklist**
* **Configure** [**live mode**](/settings/general-settings/live-mode) **settings**
* **Set up** [**user invitations**](/users-and-permissions/user-management)
* **Help with** [**domain configuration**](/settings/custom-domain)

**Example Requests:**

* "Help me publish my app"
* "Walk me through the steps to go live"
* "How do I invite users to my app?"

## Learning & Guidance

### Get Help and Explanations

Nola is also a great teacher:

* **Explain Noloco features** and concepts
* **Provide step-by-step guidance**
* **Suggest best practices**
* **Answer questions** about how things work
* **Help you understand** how your tables are linked, or should be linked
* **Recommend solutions** for specific use cases

**Example Requests:**

* "How do [rollup fields](/data/collections/rollups) work?"
* "What's the best way to set up a project management system?"
* "Explain the difference between [permissions](/users-and-permissions/user-roles-and-permissions) and [visibility rules](/pages/page-visibility-rules)"
* "Show me how to create a client portal"

## What Nola Can't Do (Yet)

While Nola is powerful, there are some things she can't currently help with:

* **External integrations** ([Zapier](/integrations/zapier), [Make](/integrations/make), etc.) - You'll need to set these up manually
* **Manual** [**custom code**](/settings/custom-code) **blocks** - Nola doesn't write into your app's custom CSS/JavaScript code blocks. (For custom layouts, ask her to build a [Canvas](/nola/canvas) instead — she generates and maintains the code for you.)
* **Data source connections** - Connecting to [Airtable](/data/airtable), [PostgreSQL](/data/postgresql), etc. must be done manually, but she can point you in the right direction
* [**Billing**](/settings/billing-and-usage) **and subscription management** - Contact support for account-related issues
* **Debugging external API issues** - Nola focuses on Noloco features

{% hint style="info" %}
Nola's capabilities are constantly expanding! Features she can't help with today might be available tomorrow.
{% endhint %}

## Staying in Control

Nola can create, change, and remove a lot — and you decide how much of that needs your sign-off. By default she asks before anything that changes or removes something, and you can adjust exactly which actions she checks with you first in [Controlling what needs your approval](/nola/getting-started-with-nola#controlling-what-needs-your-approval).

## Combining Nola's Capabilities

The real power comes from combining Nola's capabilities. Here are some examples:

### Example 1: Complete Feature Setup

**Request:** "Set up a task management system for my team"

**Nola will:**

1. Create a [Tasks table](/data/collections) with appropriate fields, and generate sample data
2. Link it to a Team Members table
3. Create a [Kanban view](/views/display/kanban-boards) grouped by status
4. Add [in-app filters](/views/filter-fields) for assigned team member and due date
5. Set up a [workflow](/workflows/workflows) to notify team members when assigned
6. Generate sample data to visualize

### Example 2: Client Portal

**Request:** "Help me build a client portal where customers can view their projects"

**Nola will:**

1. Set up appropriate [tables](/data/collections) with data (Clients, Projects)
2. Create [relationships](/data/collections/relationships) between tables
3. Configure [record-level permissions](/users-and-permissions/user-roles-and-permissions/record-level-permissions)
4. Set up [filtered views](/views/filters)
5. Create a client-facing navigation structure
6. Guide you through [user invitation](/users-and-permissions/user-management) setup

### Example 3: Automated Workflow

**Request:** "When a new order is created, I need to send a confirmation email and create related tasks"

**Nola will:**

1. Create a [workflow](/workflows/workflows) triggered on order creation
2. Configure an [email action](/workflows/workflows/send-automated-emails) with dynamic content
3. Add actions to [create task records](/workflows/workflows/create-a-record-action)
4. Set up any necessary field mappings
5. Help you test the workflow

## Next Steps

Now that you know what Nola can do, learn how to get the most out of your AI sidekick:

{% content-ref url="/pages/0647kJQ2WZkWSoFTDaXF" %}
[Tips and Best Practices](/nola/tips-and-best-practices)
{% endcontent-ref %}

{% content-ref url="/pages/RXyFKKJ9bomokW83O78u" %}
[Nola FAQ](/nola/nola-faq)
{% endcontent-ref %}


# Nola's Memory

How Nola remembers your preferences and app details across conversations

Nola remembers things across your conversations. Beyond the [context she holds within a single chat](/nola/getting-started-with-nola#nolas-context), Nola keeps a longer-term **memory** of your preferences and the details that matter for your app — so you don't have to explain them again every time you start a new conversation.

## What Nola remembers

Memory is for the durable things that shape how you want Nola to work, such as:

* **Preferences** — "always use British date formats", "keep field names in Title Case", "prefer concise summaries"
* **Terminology** — "we call them *clients*, not *customers*"
* **App conventions** — "our fiscal year starts in April", "every project must be linked to an account"
* **Working style** — "check with me before deleting anything"

Nola draws on these memories automatically in future conversations, so her work stays consistent with how your team operates.

## Asking Nola to remember something

The simplest way to add a memory is to tell Nola directly:

* "Remember that our financial year starts in April."
* "From now on, always use our brand colours on any page you build."
* "Keep in mind that only admins should ever see salary fields."

Nola will also pick up on durable preferences as you work and keep them for next time. Memory is best for things that stay true — one-off instructions for the task at hand don't need to be remembered.

## Viewing and managing memories

You're always in control of what Nola remembers. In Nola's **settings** you'll find a memory section where you can:

* **Review** everything Nola currently remembers
* **Edit** a memory whose details have changed
* **Delete** anything that's no longer relevant

If Nola ever behaves in a way you didn't expect, the memory section is a good first place to look — a stale preference is easy to update or remove.

<figure><img src="/files/4fcR98nVOVupmBfTeJXJ" alt=""><figcaption><p>Reviewing and managing what Nola remembers</p></figcaption></figure>

{% hint style="info" %}
Memory is about *preferences and context*, not your records. Nola remembering "we call them clients" doesn't change any data — it just shapes how she talks and builds. Your actual app data always lives in your [tables](/data/collections).
{% endhint %}

## Related

{% content-ref url="/pages/0XtlO9qufGMLCf5IYpLT" %}
[Getting Started with Nola](/nola/getting-started-with-nola)
{% endcontent-ref %}

{% content-ref url="/pages/0647kJQ2WZkWSoFTDaXF" %}
[Tips and Best Practices](/nola/tips-and-best-practices)
{% endcontent-ref %}


# Canvas

Ask Nola to build a Canvas — a fully custom page that goes beyond standard layouts, built on your data, with no code for you to write

A **Canvas** is custom, Nola-built functionality you can add to your app, just by describing what you want. When a standard [view](/pages/views), [record page](/record-pages/overview), or [dashboard](/pages/blank-pages) can't quite express the layout or interaction you have in mind, you can ask Nola for a Canvas instead.

A Canvas comes in two forms:

* A **Canvas page** — a full, standalone custom page.
* A [**Canvas component**](/nola/canvas/canvas-components) — a custom section you add to an existing record page or blank page, to give a standard page a bit of dynamic functionality.

Behind the scenes Nola writes and maintains the code for a Canvas, but you never see files, terminals, or build tooling. You describe what you want in plain language, watch it build, and refine it by chatting — exactly like every other conversation with Nola.

**The speed and flexibility of AI, with the reliability of Noloco.** No code required, and nothing to rebuild — a Canvas is built on the data, permissions, and processes you already manage in your app, so it feels like a natural part of it from the moment it's created.

{% hint style="info" %}
A Canvas is generated and edited entirely through Nola. There's nothing to install and no code for you to manage — Nola owns the code, you own the outcome.
{% endhint %}

## See it in action

{% @arcade/embed url="<https://app.arcade.software/share/yrDwUAYoTdpxKtXy88hv>" flowId="yrDwUAYoTdpxKtXy88hv" %}

## When to use a Canvas

Noloco's standard no-code pages are the right choice most of the time, and they stay the fastest way to build the common patterns. Reach for a Canvas when you want something that config alone doesn't cover, such as:

* A **custom dashboard** that combines stats, charts, and summaries in a bespoke layout
* A **landing or overview page** with a designed, marketing-style structure
* A **portal home** that mixes several data sources and call-to-action sections
* A **mini-tool or calculator** — a small interactive utility like a link generator, proposal builder, or payment calculator
* An **interactive view** with a layout or behaviour that goes beyond the built-in [display types](/views/display)

Think of a Canvas as the "escape hatch" for the times when you'd otherwise wish you could hand a designer a sketch. You get the freedom of a custom build with the speed of describing it to Nola.

## What a Canvas can reuse

Nola doesn't rebuild things Noloco already does well. When she generates a Canvas, she draws on the platform you already have:

* **Your data** — Nola reads your [tables](/data/collections), fields, and [relationships](/data/collections/relationships) and fetches live records for the page
* **Charts and visualizations** — bring your data to life with [charts](/views/display/charts) and custom visual summaries
* **Your app's look and feel** — a Canvas inherits your app's [theme](/settings/theme-and-design), navigation, and chrome, so it feels native
* **Your permissions** — a Canvas respects the same [user roles, spaces, and visibility rules](/nola/canvas/configuring-canvases) as any other page

This means a Canvas slots into your app like a page you built by hand — same navigation, same access control, same styling.

{% hint style="warning" %}
**Not available in a Canvas yet.** Some of Noloco's most advanced components — [Kanban boards](/views/display/kanban-boards), [timelines](/views/display/timeline), and the [data grid](/views/display/tables) — aren't available inside a Canvas for now. If you need one of those, use a standard [view](/pages/views) instead. A Canvas also can't bring in third-party tools or libraries that Noloco doesn't already support.
{% endhint %}

## How a Canvas fits alongside no-code pages

A Canvas doesn't replace Noloco's no-code builder — it sits next to it. A single app can freely mix standard pages and Canvases. Nola will often suggest the standard, config-first approach first, and use a Canvas only when it's genuinely the better fit.

You don't have to choose one or the other for a whole page, either: with a [Canvas component](/nola/canvas/canvas-components) you can keep a standard record page or blank page and drop a custom, dynamic section into just the part that needs it.

{% hint style="success" %}
**A good rule of thumb:** start with a standard page. If you find yourself fighting the layout to get a bespoke result, ask Nola to build it as a Canvas — a whole [Canvas page](/nola/canvas), or a single [Canvas component](/nola/canvas/canvas-components) on the page you already have.
{% endhint %}

## Get started

{% content-ref url="/pages/0R2msA13l8bSqOalCJKN" %}
[Creating a Canvas](/nola/canvas/creating-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/DZBcSGZN9soOyDFbboga" %}
[Canvas components](/nola/canvas/canvas-components)
{% endcontent-ref %}

{% content-ref url="/pages/T3oRwEaHeuXCakVTGeqb" %}
[Editing a Canvas](/nola/canvas/editing-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/tPyvzlaISWStg0LRdl0O" %}
[Configuring a Canvas](/nola/canvas/configuring-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/XO0diqL1H6pd9QAcnv4n" %}
[Troubleshooting a Canvas](/nola/canvas/troubleshooting-canvases)
{% endcontent-ref %}


# Creating a Canvas

Describe the page you want and watch Nola build it as a Canvas

Creating a Canvas works just like any other request to Nola — you describe what you want, and she builds it. There's no separate mode to switch into and nothing to configure up front.

This guide covers building a full **Canvas page**. If you'd rather add a custom section to a page you already have, see [Canvas components](/nola/canvas/canvas-components) instead.

## Create a Canvas

1. Open [Nola](/nola/getting-started-with-nola) in your app builder.
2. Describe the page you want. Be specific about the data it should show and how it should be laid out.
3. Nola confirms what she's going to build, then starts generating the Canvas.
4. While she works, a placeholder page appears so you can see it taking shape.
5. When she's done, Nola takes you straight to the finished Canvas so you can review it.

{% hint style="success" %}
**The more specific your request, the better the first result.** Instead of "make a dashboard," try "add a Canvas with a sales dashboard: total revenue and deal count at the top, a bar chart of revenue by month, and a table of the ten most recent deals."
{% endhint %}

### Example requests

* "Add a Canvas with an executive summary: KPI cards for revenue, active customers, and churn, plus a line chart of monthly growth."
* "Create a customer portal home as a Canvas, with a welcome banner, the customer's open tickets, and a button to submit a new request."
* "Build a Canvas that shows a project overview — a health summary and upcoming milestones for each active project."

{% @arcade/embed url="<https://app.arcade.software/share/yrDwUAYoTdpxKtXy88hv>" flowId="yrDwUAYoTdpxKtXy88hv" %}

## What happens while Nola builds

Generating a Canvas takes a little longer than a standard no-code action, because Nola is composing the layout, wiring in your data, and pulling in the right components.

* A **placeholder appears immediately** so the page looks intentional while it builds, rather than empty or broken.
* Nola streams her progress into the chat as she works.
* When generation finishes, you're **redirected to the completed Canvas** automatically — no need to hunt for it in the navigation.

## What you can build

Because Nola reuses the platform underneath, a Canvas can combine the things you'd expect from a hand-built page:

* **Live data from your tables** — records, [rollups](/data/collections/rollups), and [related records](/data/collections/relationships), fetched through Noloco so they respect your data model
* **Charts and visualizations** — [charts](/views/display/charts) and custom visual summaries of your data
* **Custom sections** — KPI cards, summary blocks, banners, tabbed layouts, and call-to-action areas
* **Links and navigation** — buttons and links that route to other pages and records in your app

{% hint style="info" %}
Nola builds on Noloco's building blocks and your app's styling rather than reinventing them, so your Canvases look and behave consistently. Some advanced components — [Kanban boards](/views/display/kanban-boards), [timelines](/views/display/timeline), and the [data grid](/views/display/tables) — aren't available in a Canvas yet; use a standard [view](/pages/views) when you need one of those.
{% endhint %}

## Ideas to get you started

A Canvas suits almost any custom layout — and it's just as good for small interactive **mini-tools** as it is for rich dashboards. Here are some ideas, grouped by what teams commonly build — use them as a starting point and adapt them to your own data.

### Mini-tools and calculators

Some of the handiest Canvases are small utilities that take a few inputs, apply some logic, and produce an output — a link, a price, a document — which is exactly the kind of interactive behaviour standard pages can't express.

**Generators & builders**

* "Build a link generator: pick a client, plan, and discount code, and produce a prefilled sign-up URL I can send them."
* "Create a proposal generator — choose a client and the services included, and produce a formatted proposal with pricing."
* "Build a quote builder: add line items and quantities and generate a branded quote with totals."
* "Make an email template generator that fills in a client's details and the right message for their stage."

**Calculators**

* "Add a payment calculator where someone enters quantity and billing term and sees the total and monthly cost."
* "Build an ROI calculator that turns a few inputs into a savings estimate to show prospects."
* "Create a commission calculator that works out each rep's payout from their closed deals."
* "Add a margin calculator that shows profit and markup as you change cost and price."

**Checkers & lookups**

* "Build an eligibility checker: answer a few questions and see which plan or service fits."
* "Make a status lookup where a client enters a reference number and sees their order's progress."
* "Create an availability checker that shows open slots for a chosen consultant and week."

### Client portals & reporting

* "Build a client portal home that shows each client their active projects, latest updates, and shared documents."
* "Create a client reporting dashboard with project health, budget status, and upcoming milestones."

### Executive & leadership dashboards

* "Add a Canvas with an executive summary: revenue, active customers, and churn as KPI cards, plus a chart of monthly growth."
* "Build a project portfolio overview for leadership, with each project's status, owner, and risk level."

### Onboarding & delivery workspaces

* "Create a client onboarding workspace showing onboarding status, upcoming tasks, key stakeholders, and required documents."
* "Build a project delivery workspace grouped by team, with each project's milestones and deadlines."

### Operations

* "Create a resource planning page grouped by consultant and availability."
* "Add a ticket triage view that surfaces the highest-priority open tickets first."
* "Show projects at risk first, with a health score for each."

{% hint style="success" %}
Every one of these is built on the data, permissions, and processes you already have — so a client portal only ever shows each client their own records, and an internal dashboard respects your team's [roles](/users-and-permissions/user-roles-and-permissions).
{% endhint %}

## Building good Canvases, step by step

Just like the rest of your app, a Canvas comes together best when you build incrementally rather than trying to one-shot a complex screen.

1. **Start with the structure.** "Add a Canvas with three KPI cards and a chart below them."
2. **Layer in detail.** "Add a table of recent orders under the chart."
3. **Refine the specifics.** "Group the chart by month and make the KPI cards blue."

Each request builds on the last, and you can [target individual parts of the Canvas](/nola/canvas/editing-canvases) to fine-tune them without regenerating the whole thing.

## Next steps

Once your Canvas exists, learn how to refine it and control who sees it:

{% content-ref url="/pages/T3oRwEaHeuXCakVTGeqb" %}
[Editing a Canvas](/nola/canvas/editing-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/tPyvzlaISWStg0LRdl0O" %}
[Configuring a Canvas](/nola/canvas/configuring-canvases)
{% endcontent-ref %}


# Canvas components

Add a Canvas to an existing record page or blank page as a component, to give a standard page a bit of custom, dynamic functionality

A Canvas doesn't have to be a whole page. When a standard [record page](/record-pages/overview) or [blank page](/pages/blank-pages) is almost right but you want **one** bespoke, dynamic section, you can add a Canvas to it as a **Canvas component** — a custom, Nola-built block that sits alongside your normal [components](/components).

This gives you the best of both: keep the standard page you already have, and drop in custom functionality exactly where you need it — without rebuilding the whole page as a [Canvas page](/nola/canvas).

## How to add a Canvas component

You add a Canvas component by **asking Nola** — there's nothing to drag in from a component menu. While you're on the page you want to add it to, describe what you need:

* "Add a Canvas component to this page that generates a prefilled sign-up link for this customer."
* "Add a section here that calculates this project's budget burn-down."

Nola builds the component and places it on the page. Tell her where it should go if it matters — "put it at the top", "below the details" — and refine it from there.

{% hint style="info" %}
Nola will also add a Canvas component **herself** when it's the best way to deliver something you've asked for. If you request custom functionality that a standard component can't provide, she may build it as a Canvas component rather than a whole new page.
{% endhint %}

<figure><img src="/files/8wT697UPU95SUuvaM7uT" alt=""><figcaption><p>A Canvas component alongside standard components on a record page</p></figcaption></figure>

## Working with the current record

When you add a Canvas component to a **record page**, it automatically knows which record is being viewed. That means it can show and act on **that record's** data — making it ideal for record-specific tools and summaries.

For example, on a Customer record page you could add a Canvas component that generates an upgrade link prefilled with that customer's details, or on a Project record page one that shows a live budget summary for that project.

On a **blank page or dashboard**, a Canvas component works with your app's data like any Canvas — there's no single "current record", so you point it at the data it should use.

{% hint style="success" %}
This pairs perfectly with [mini-tools](/nola/canvas/creating-canvases#mini-tools-and-calculators): a small generator or calculator, dropped onto a record page, that already knows the record it's working with.
{% endhint %}

## Editing a Canvas component

A Canvas component is edited exactly like any other Canvas — by chatting with Nola, or by [selecting an element](/nola/canvas/editing-canvases) on it and telling her what to change. See [Editing a Canvas](/nola/canvas/editing-canvases) for the full flow.

## What it can reuse, and what it can't

A Canvas component draws on the same platform capabilities as a [Canvas page](/nola/canvas) — your data, [charts](/views/display/charts), your app's theme — and the same limits apply: the advanced components (Kanban, timelines, and the data grid) aren't available in a Canvas yet, and it [uses credits](/nola/credits-and-usage) like any Canvas work.

## Visibility

A Canvas component follows the same [component visibility rules](/record-pages/visibility-settings) as every other component on the page — show or hide it by user role or by page values. Unlike a [Canvas page](/nola/canvas/configuring-canvases), a component doesn't have its own route or assigned spaces; it lives wherever you place it on the host page.

## Next steps

{% content-ref url="/pages/0R2msA13l8bSqOalCJKN" %}
[Creating a Canvas](/nola/canvas/creating-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/T3oRwEaHeuXCakVTGeqb" %}
[Editing a Canvas](/nola/canvas/editing-canvases)
{% endcontent-ref %}


# Editing a Canvas

Point at any part of a Canvas and tell Nola what to change — no full-page rewrite required

Once a Canvas exists, you refine it by chatting with Nola. You can ask for broad changes ("add a section for open tickets") or pinpoint a single element and change just that. This targeted approach is called **hybrid editing**.

## Editing by chatting

The simplest way to change a Canvas is to describe the change in the Nola chat:

* "Make the header background darker."
* "Add a column to the table for the deal owner."
* "Move the chart above the stats."

Nola applies the change and updates the preview. Because she edits the Canvas in place, small tweaks stay fast — she doesn't rebuild the whole page for every request.

## Editing a specific element (hybrid editing)

When you want to change one particular thing on a Canvas, you can point Nola straight at it instead of describing where it is in words.

1. Hover over the page. Editable elements highlight as you move over them, so you can see what you're able to target.
2. **Click the element** you want to change — a card, a heading, a chart, an image, a section.
3. The selected element is added to the chat as context, and it's clearly marked so you know exactly what Nola will act on.
4. Type your change — for example, "make this bigger" or "change this to show last month instead."
5. Nola applies the change to just that element.

When you're done, **clear the selection** to go back to talking about the whole Canvas.

{% hint style="success" %}
Selecting an element removes all the guesswork. Instead of "change the second card on the right," you can just click the card and say "make this green" — Nola knows precisely what "this" is.
{% endhint %}

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

### Why targeted edits matter

Hybrid editing keeps changes surgical:

* **Faster** — Nola changes only what you selected rather than regenerating the page.
* **Safer** — the rest of your Canvas stays exactly as it was.
* **Clearer** — you and Nola are always talking about the same element.

## Adding and replacing images

You can bring your own images into a Canvas — logos, banners, illustrations, product photos.

1. Upload the image in the Nola chat.
2. To control **where** it goes, [select the element](/nola/canvas/editing-canvases) or area where you want it first, then upload — or describe the placement, e.g. "put this logo in the header."
3. Nola places the image in the Canvas.

To swap an image out, select it and upload the replacement, or ask Nola to "replace this image."

{% hint style="info" %}
Combining selection with an upload is the most reliable way to place an image. Click where it should go, add the file, and Nola has everything she needs to put it in the right spot.
{% endhint %}

<figure><img src="/files/gURhLdPzJ3HI6cTfYwS9" alt=""><figcaption><p>Uploading an image to Nola</p></figcaption></figure>

<figure><img src="/files/LekB2CXSIZHcOqROlslh" alt=""><figcaption><p>The image placed on the Canvas</p></figcaption></figure>

## Iterating with confidence

Every edit is part of your normal build history, so you can experiment freely:

* Keep refining conversationally until the Canvas is right.
* If a change isn't what you wanted, tell Nola what to adjust — you don't have to start over.
* If something goes wrong, you can [restore an earlier version](/nola/canvas/troubleshooting-canvases#restoring-a-previous-version) of the Canvas.

## Next steps

{% content-ref url="/pages/tPyvzlaISWStg0LRdl0O" %}
[Configuring a Canvas](/nola/canvas/configuring-canvases)
{% endcontent-ref %}

{% content-ref url="/pages/XO0diqL1H6pd9QAcnv4n" %}
[Troubleshooting a Canvas](/nola/canvas/troubleshooting-canvases)
{% endcontent-ref %}


# Configuring a Canvas

Set a Canvas's route, spaces, and visibility rules just like any other page

A Canvas is a real page in your app, so it's configured the same way as every other page. You use the right-hand sidebar to set where it lives in your app, who it's for, and when it appears — while you continue to edit the page's content by chatting with [Nola](/nola).

This keeps the experience consistent: **Nola handles the page body, the sidebar handles the page settings.**

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

## Route

The **route** is the page's address within your app. Set a clear, readable route so the Canvas has a sensible URL and is easy to link to.

See [renaming pages](/pages/renaming-pages) for how routes and page names work together.

## Assigned spaces

If your app uses [spaces](/settings/spaces), you can assign a Canvas to one or more spaces to control which part of your app it belongs to. The page appears in the navigation for the spaces you assign it to, exactly like a standard page.

## Visibility rules

Use [visibility rules](/pages/page-visibility-rules) to decide who can see the Canvas and when. You can:

* Show the page only to specific [user roles](/users-and-permissions/user-roles-and-permissions)
* Show or hide it based on the logged-in user or their data
* Combine conditions to fine-tune access

Because a Canvas uses the same visibility system as the rest of your app, the permissions you already understand apply here without any special handling.

{% hint style="info" %}
Visibility rules control who can **see** the page. The data inside a Canvas still respects your [record-level](/users-and-permissions/user-roles-and-permissions/record-level-permissions) and [field-level permissions](/users-and-permissions/user-roles-and-permissions/field-level-permissions), so users only ever see the records they're allowed to.
{% endhint %}

## Publishing

A Canvas publishes with the rest of your app. When you [publish](/settings/publishing), the current version of each Canvas goes live alongside your other changes, so what your users see always matches what you last published.

## Next steps

{% content-ref url="/pages/XO0diqL1H6pd9QAcnv4n" %}
[Troubleshooting a Canvas](/nola/canvas/troubleshooting-canvases)
{% endcontent-ref %}


# Troubleshooting a Canvas

What happens when a Canvas hits an error, and how to recover

A Canvas is designed to fail gracefully and recover easily. If something goes wrong, it stays contained to the page in question, and Nola can usually fix it for you.

## Errors stay contained

Each Canvas runs independently. If one Canvas runs into a problem:

* **Only that page is affected.** The rest of your app — its navigation, other pages, and standard no-code pages — keeps working normally.
* The Canvas shows a **clear, contained error state** instead of a broken or blank screen.
* You get plain-language messaging, not raw technical output.

This isolation means a single misbehaving Canvas can never take down your whole app.

## Letting Nola fix it

When a Canvas hits an error, Nola can inspect what went wrong and repair it.

1. Ask Nola to fix the page, or use the fix option shown with the error.
2. While she works, the Canvas shows a **"fixing" indicator** rather than the error state, so you know a repair is underway.
3. Nola applies the fix and the page re-renders.

{% hint style="success" %}
**Fixes are free.** If a Canvas generates successfully but then fails to render correctly, asking Nola to fix it doesn't cost you any [credits](/nola/credits-and-usage) — you're never charged twice for one working result.
{% endhint %}

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

## Restoring a previous version

If you want to roll a Canvas back to how it was before a set of changes, you can use your app's version history.

A Canvas is included in [app version history](/settings/publishing/app-version-history). When you restore a previous version of your app, its Canvases are restored along with everything else — so you can recover a Canvas's earlier state the same way you'd recover any other part of your app.

{% hint style="info" %}
Restoring a version brings back your Canvases exactly as they were at that point, including their content and configuration.
{% endhint %}

## If a Canvas won't publish

Noloco checks each Canvas before it goes live so a page that can't render correctly doesn't reach your users. If a Canvas is blocking [publishing](/settings/publishing), Nola will flag it with a clear explanation and help you resolve it — usually by fixing the page — so you can publish with confidence.

## Getting more help

If you're stuck, you can always:

* **Ask Nola directly** — describe what you're seeing and she'll try to resolve it
* **Use the in-app support chat** for help from the Noloco team
* Review the [Nola FAQ](/nola/nola-faq) for common questions


# Credits & Usage

How Nola credits work — what uses them and what's included with your plan

Nola's AI-powered work — especially building and editing a [Canvas](/nola/canvas) — is measured in **credits**. Credits are a simple way to track usage without you ever having to think about tokens, models, or the technical detail underneath. You describe what you want, Nola does the work, and the cost is shown to you in plain credits.

{% hint style="info" %}
Credits are **shared across your whole workspace**, not per user. Everyone building in your app draws from the same balance, which matches how teams actually share AI work.
{% endhint %}

## What uses credits

Credits are consumed by AI actions, and the cost scales naturally with how much work the action involves. A quick restyle of a component costs a fraction of a credit, while generating a whole page from scratch costs more.

The exact cost of any action depends on its complexity. Your available credits, and the cost of each action, are always shown to you as you work, so there are no surprises.

## What's free

You're only charged for work that produces a result:

* **Failed generations are never charged.** If a model error, network problem, or cancellation stops an action before it produces anything, no credits are used.
* **Fixes are free.** If a page generates but doesn't render correctly, asking Nola to [fix it](/nola/canvas/troubleshooting-canvases#letting-nola-fix-it) doesn't cost credits — you're never charged twice for one working result.

Being unhappy with an output isn't the same as a failure — if a generation completes and works, it uses credits even if you then ask Nola to change it. Iterating on a working page is a normal edit.

## What's included with your plan

Every plan includes a **monthly credit allowance** that refreshes at the start of your billing cycle. Higher plans include more credits.

| Plan       | Monthly credits              | Daily allowance | Rollover |
| ---------- | ---------------------------- | --------------- | -------- |
| Free       | 30                           | 5 per day       | —        |
| Build      | 250, adjustable up to 10,000 | —               | 1 month  |
| Enterprise | Custom                       | Custom          | Custom   |

* **Free** gets a small **daily allowance** on top of its monthly credits. The daily amount refreshes each day and is used first, so light daily use doesn't eat into your monthly balance. Unused daily credits don't roll over to the next day.
* **Build** gets a monthly allowance that **rolls over** for one month if unused (annual plans roll over until the end of your contract). If you regularly need more, you can [change your credit allowance](#changing-your-credit-allowance) yourself.

{% hint style="info" %}
You can see your plan's allowance and current usage any time in [Plan limits & usage](/settings/plan-limits-and-usage) and [Billing & usage](/settings/billing-and-usage).
{% endhint %}

## Changing your credit allowance

On **Build**, your monthly credit allowance is part of your subscription, so you can raise or lower it yourself without talking to us. Go to **Settings** > [**Billing & Usage**](/settings/billing-and-usage) and open the **monthly credits** dropdown on the Build plan card, then confirm the change.

Build starts at **250** credits a month, and you can move to **400**, **800**, **1,200**, **2,000**, **3,000**, **4,000**, **5,000**, or **10,000**. Larger allowances cost less per credit, so stepping up gets you a better rate. The price of each level is shown beside it in the dropdown, and on the [pricing page](https://noloco.io/pricing).

Lowering your allowance works the same way — choose a smaller level and confirm. Whichever level you pick becomes your recurring monthly allowance, and the [rollover](#whats-included-with-your-plan) rules are unchanged.

The other plans work a little differently:

* **Free** is fixed at 30 credits a month plus its daily allowance. To raise it, upgrade to Build.
* **Enterprise** has a custom credit limit, pooled across your workspace and sized with your account team.

{% hint style="info" %}
If you need more than 10,000 credits a month, that's an Enterprise conversation — [contact sales](mailto:sales@noloco.io) and we'll size an allocation around your use case.
{% endhint %}

## Reaching your limit

An action that's already started always runs to completion — Nola never stops mid-way. It's the **next** action that's paused if you've run out of credits. When that happens, Nola tells you exactly which limit you hit and what to do:

* **Daily limit (Free):** resets in a few hours, or upgrade to remove the daily limit.
* **Monthly limit (Free):** resets on your renewal date, or upgrade to keep building.
* **Monthly limit (Build):** resets on your renewal date, or [raise your monthly credit allowance](#changing-your-credit-allowance) to keep building.

## Where to see your balance

Your available credits are shown in the Nola panel. Hover over the balance to see your monthly allowance, any daily allowance, rollover status, and your next reset date. After each action, Nola shows how many credits it used and how many you have left.

You can also review your workspace's credit usage in the billing section of your [app settings](/settings/billing-and-usage).

<figure><img src="/files/phyQHx5wK5hE5hN9AIit" alt=""><figcaption><p>Your credit balance in the Nola panel</p></figcaption></figure>


# Tips and Best Practices

Expert tips and best practices for getting the most out of Nola

Learn how to work effectively with Nola to build better apps faster. These tips will help you get the most out of your AI sidekick.

## Communication Tips

### Be Specific and Detailed

The more context and detail you provide, the better Nola can help you.

❌ **Too Vague:** "Add some fields to my table"

✅ **Specific and Clear:** "Add these fields to my Customers table: Company Name (text), Industry (single select with options: Tech, Healthcare, Finance, Retail), Annual Revenue (currency), and Last Contact Date (date)"

### Use Examples

When describing what you want, examples help Nola understand your intent.

✅ **Good:** "Create a Status field with workflow stages like 'New Lead', 'Contacted', 'Qualified', 'Proposal Sent', 'Won', 'Lost'"

✅ **Also Good:** "I need a priority field similar to what you'd see in a project management tool - something like Urgent, High, Medium, Low"

### Break Complex Tasks into Steps

Instead of one massive request, break it down into manageable chunks.

❌ **Too Complex:** "Build me a complete CRM with contacts, companies, deals, tasks, email tracking, reporting dashboards, and automated lead scoring"

✅ **Step by Step:**

1. "First, create a Contacts table with name, email, phone, and company fields"
2. "Now create a Companies table and link it to Contacts"
3. "Add a Deals table with value, stage, and close date"
4. \[Continue building incrementally]

### Provide Context About Your Use Case

Help Nola understand your business needs.

✅ **Good:** "I run a real estate agency and need to track properties. Each property should have an address, price, bedrooms, bathrooms, square footage, and listing status. Properties are shown to multiple clients."

This context helps Nola suggest appropriate field types, relationships, and features.

## Working Efficiently with Nola

### Start with Structure, Then Refine

Get the basics in place quickly with Nola, then fine-tune manually.

**Nola is great for:**

* Creating [tables](/data/collections) and [fields](/data/collections/field-types)
* Setting up basic [relationships](/data/collections/relationships)
* Generating sample data
* Creating initial [views](/pages/views) and pages
* Building [workflow](/workflows/workflows) logic

**You might prefer manual control for:**

* Exact color choices and styling
* Precise layout positioning
* Fine-tuning form field order
* Detailed visual design

### Use Nola for Repetitive Tasks

Don't waste time on repetitive work. Let Nola handle it.

✅ **Great uses:**

* "Generate 50 sample products with realistic names, prices, and descriptions"
* "Create [workflow](/workflows/workflows) email templates for each stage of my sales process"
* "Add the same 5 custom fields to all my tables"

### Keep the Conversation Going

You don't need to start fresh each time. Build on previous requests.

**Example conversation flow:**

1. "Create a Tasks table"
2. "Add a priority field"
3. "Now link it to my Projects table"
4. "Generate 20 sample tasks across my projects"
5. "Create a [Kanban view](/views/display/kanban-boards) grouped by status"

Each request builds on the previous, and Nola maintains context throughout.

### Give Nola Richer Input

Words aren't your only option. For anything visual or detailed, hand Nola more to work from:

* **Attach a screenshot or mockup** when you want a layout to match something you've seen.
* **Attach a spec or brief** and let Nola build from it, rather than retyping the requirements.
* **Upload a data file** (like a CSV or a receipt) to have Nola create records from it.
* **Use voice input** for long, detailed prompts — it's often faster than typing.

### Teach Nola Your Preferences

If you find yourself repeating the same instruction, tell Nola to [remember](/nola/memory) it: "always use British date formats", "we call them clients, not customers". She'll apply it in future conversations, and you can review or change what she remembers in her settings.

### Ask Nola to Explain Her Suggestions

If Nola recommends something you don't understand, ask for clarification.

✅ **Ask questions like:**

* "Why did you suggest a [rollup field](/data/collections/rollups) instead of a [formula](/data/collections/formulas)?"
* "Can you explain how this [workflow](/workflows/workflows) will work?"
* "What's the benefit of setting it up this way?"

## Best Practices for Different Tasks

### Creating Tables

**DO:**

* Think through your data structure before requesting
* Consider relationships between tables upfront
* Use descriptive field names
* Specify field types (text, number, date, etc.)

**Example:** "Create an Invoices table with: Invoice Number (text), Customer (linked to Customers table), Issue Date (date), Due Date (date), Amount (currency), Status (single select: Draft, Sent, Paid, Overdue), and Line Items (linked to Line Items table)"

**DON'T:**

* Create tables without thinking about relationships
* Use vague field names like "Field1" or "Data"
* Forget to specify whether fields should be required

### Building Workflows

**DO:**

* Clearly describe the trigger event
* Specify what should happen step by step
* Consider edge cases and conditions
* Test with sample data first

**Example:** "Create a [workflow](/workflows/workflows) that triggers when a task's status changes to 'Complete'. It should: 1) [Send an email](/workflows/workflows/send-automated-emails) to the project manager, 2) [Update](/workflows/workflows/update-a-record-action) the project's completion percentage, 3) [If all tasks are complete](/workflows/workflows/only-continue-if), mark the project as Complete too"

**DON'T:**

* Assume Nola knows complex business rules without explanation
* Create overly complex workflows in one go
* Forget to specify conditional logic

### Generating Sample Data

**DO:**

* Specify how many records you need
* Request realistic data that matches your use case
* Ask for variety in the data
* Include relationships in the request

**Example:** "Generate 30 sample customer records with realistic company names from various industries. Make sure they have diverse locations and company sizes. Also link 2-5 orders to each customer."

**DON'T:**

* Generate too much unnecessary data
* Forget to clean up sample data before going live
* Use sample data that doesn't reflect real use cases

### Setting Up Permissions

**DO:**

* Describe who should see what
* Explain your [user roles](/users-and-permissions/user-roles-and-permissions) and responsibilities
* Consider data privacy requirements
* Test with different user accounts

**Example:** "I need three [user roles](/users-and-permissions/user-roles-and-permissions): Admins (can see and edit everything), Team Members (can see all projects but only edit their own tasks), and Clients (can only see projects where they're listed as the client, and can't edit anything)"

**DON'T:**

* Set up permissions without thinking through security
* Forget about record-level access
* Ignore testing with different user roles

## Power User Tips

### Use Nola to Learn Noloco Features

When exploring new features, ask Nola to show you how they work.

✅ **Learning requests:**

* "Show me how to use [rollup fields](/data/collections/rollups) by creating an example"
* "Walk me through creating a conditional [workflow](/workflows/workflows) step by step"
* "What are the different ways I can [filter views](/views/filters)? Give me examples"

### Iterate and Improve

Your first implementation doesn't have to be perfect. Iterate with Nola's help.

**Example iteration:**

1. "Create a basic customer tracking system"
2. \[Review what Nola created]
3. "This is good, but I also need to track customer interactions"
4. "Add a sentiment field to track how happy they are"
5. "Create a dashboard showing customer health scores"

### Combine Manual and AI Work

The best workflow often combines both approaches.

**Example workflow:**

1. Use Nola to create table structure (fast)
2. Manually adjust field order for optimal form layout (precise control)
3. Use Nola to generate sample data (fast)
4. Manually create custom views (visual control)
5. Use Nola to build workflows (fast)
6. Manually test and refine (quality assurance)

### Save Time with Templates

Once Nola helps you build something good, you can reuse patterns.

✅ **Reusable patterns:**

* "Create a table structure similar to my Customers table but for Vendors"
* "Set up the same workflow for Orders that we have for Projects"
* "Copy the permission structure from App A to App B"

## Common Pitfalls to Avoid

### Don't Assume Nola Knows Your Business Rules

Always explain your specific requirements clearly.

❌ "Set up normal permissions for a CRM" ✅ "Sales reps should see all leads assigned to them but not other reps' leads. Managers should see all leads for their team. Admins should see everything."

### Don't Skip Review and Testing

Always review what Nola creates before relying on it.

**Before going live:**

* ✅ Test [workflows](/workflows/workflows) with sample data
* ✅ Verify [permissions](/users-and-permissions/user-roles-and-permissions) with test accounts
* ✅ Check that [relationships](/data/collections/relationships) work correctly
* ✅ Review generated sample data accuracy

### Don't Forget to Clean Up

Remove test data and unused elements before publishing.

**Before** [**publishing**](/settings/publishing)**:**

* Delete sample/test data
* Remove unused fields and tables
* Clean up test [workflows](/workflows/workflows)
* Verify all user-facing content is professional

### Don't Treat Nola Like a Magic Wand

Nola is powerful, but she works best when you:

* Understand your own requirements
* Provide clear instructions
* Review and refine her work
* Use her as a tool, not a replacement for thinking

## Getting Unstuck

### Nola Didn't Understand Your Request

If Nola seems confused:

1. **Rephrase your request** more simply
2. **Break it into smaller steps**
3. **Provide a specific example** of what you want
4. **Ask Nola what information she needs** from you

### The Result Isn't What You Expected

If Nola's output isn't quite right:

1. **Explain what's different** from what you wanted
2. **Ask Nola to modify** the specific part that's wrong
3. **Be specific** about what needs to change

Example: "That's close, but the Status field should have different options. Change it to: New, In Progress, On Hold, Complete, Cancelled"

### You're Not Sure What's Possible

Ask Nola directly:

* "What are all the ways I could display this data?"
* "What options do I have for automating this process?"
* "Show me examples of how other users handle this use case"

## Getting the Most from Nola

### Be Patient with Complex Requests

For a big task, Nola works through several steps — give her a moment to plan and build. If something doesn't come out right, rephrase or break the request into smaller steps.

### Provide Feedback

If Nola does something particularly helpful (or unhelpful), let the Noloco team know through the support chat.

### Mind Your Credits

Nola's AI work runs on [credits](/nola/credits-and-usage). To get the most from your allowance:

* Combine related requests into one
* Lean on Nola for the tasks that save the most time
* Keep an eye on your balance in the Nola panel

## Next Steps

With these tips in mind, you're ready to make the most of Nola. If you have questions, check out the FAQ:

{% content-ref url="/pages/RXyFKKJ9bomokW83O78u" %}
[Nola FAQ](/nola/nola-faq)
{% endcontent-ref %}

{% hint style="success" %}
**Remember**: Nola is your sidekick, not a replacement for your expertise. The best results come from combining your knowledge of your business with Nola's knowledge of Noloco.
{% endhint %}


# Nola FAQ

Frequently asked questions about Nola, your AI Cobuilder for building Noloco apps

Find answers to common questions about Nola, Noloco's AI Cobuilder.

## General Questions

<details>

<summary>What is Nola?</summary>

Nola is an AI-powered assistant built into Noloco that helps you build and customize your apps faster. She can create [tables](/data/collections), generate data, build [workflows](/workflows/workflows), customize your interface, and much more—all through simple conversation.

</details>

<details>

<summary>Does using Nola cost anything?</summary>

Nola is available on all Noloco plans: Free, Build, and Enterprise. Nola's AI work runs on [credits](/nola/credits-and-usage), and every plan includes a monthly credit allowance, with more on higher plans. See [Credits & Usage](/nola/credits-and-usage) for the full breakdown.

</details>

<details>

<summary>What plans include access to Nola?</summary>

Nola is available on:

* Free plan
* Build plan
* Enterprise plan

Nola is **not available** on some legacy plans. If you're on a legacy plan and want access, consider upgrading to a current plan.

</details>

<details>

<summary>What usage limits are there on the Free plan?</summary>

Nola's usage runs on [credits](/nola/credits-and-usage). The Free plan includes a monthly credit allowance plus a small daily allowance; higher plans include more. See [Credits & Usage](/nola/credits-and-usage) for the details.

</details>

<details>

<summary>Does building a Canvas use credits?</summary>

Nola's AI-powered work — especially building and editing a [Canvas](/nola/canvas) — is measured in **credits**. Simple edits cost a fraction of a credit; generating a whole page costs more. Failed generations are never charged, and asking Nola to fix a page that didn't render is free. Every plan includes a monthly credit allowance, and paid plans roll unused credits over for a month. See [Credits & Usage](/nola/credits-and-usage) for the full breakdown.

</details>

<details>

<summary>How do I access Nola?</summary>

Nola is accessible directly in your Noloco app builder:

1. Open your app in Build Mode
2. Look for the Nola tab in the top-left of your app studio
3. Click to open the Nola interface

For more details, see [Getting Started with Nola](/nola/getting-started-with-nola).

</details>

## Using Nola

<details>

<summary>What can Nola help me with?</summary>

Nola can help with:

* Creating and modifying [tables](/data/collections) and [fields](/data/collections/field-types)
* Setting up [relationships](/data/collections/relationships) between tables
* Generating sample data
* Building [views](/pages/views) and pages
* Creating [workflows](/workflows/workflows) and automations
* Configuring [permissions](/users-and-permissions/user-roles-and-permissions)
* Customizing [forms](/forms/forms)
* [Publishing](/settings/publishing) your app
* Explaining Noloco features

For a complete list, see [What Nola Can Do](/nola/what-nola-can-do).

</details>

<details>

<summary>Do I need to use special commands or syntax?</summary>

No! Just talk to Nola naturally. Use plain language to describe what you want to accomplish. For example: "Create a Customers table with name, email, and phone number" or "Help me set up a workflow that sends emails."

</details>

<details>

<summary>Does Nola understand context from earlier in the conversation?</summary>

Yes! Nola maintains context throughout your conversation. She remembers what tables you have, what you've asked her to do, and can reference previous parts of your conversation. This means you can have natural, flowing conversations without repeating information.

</details>

<details>

<summary>Does Nola remember things between conversations?</summary>

Yes. As well as the context she keeps within a single chat, Nola has a longer-term [memory](/nola/memory) of your preferences and app conventions — so you don't have to repeat them each time you start a new conversation. You can review, edit, and delete everything she remembers in Nola's settings. See [Nola's Memory](/nola/memory).

</details>

<details>

<summary>Can I attach files or use voice instead of typing?</summary>

Yes. You can attach images, screenshots, documents, and data files (such as a CSV or a receipt) to a request, and Nola can build from them or create records from them. You can also dictate your request with voice input. See [Getting Started with Nola](/nola/getting-started-with-nola#attaching-files-and-images).

</details>

<details>

<summary>Can I keep separate conversations with Nola?</summary>

Yes. Your work is organised into conversations, so you can keep separate threads for separate tasks, switch between them, and delete ones you no longer need. You can also edit and resend an earlier message to try a request a different way.

</details>

<details>

<summary>Can I undo changes that Nola makes?</summary>

Yes. Changes Nola makes are immediate and visible in your app builder. You can use Noloco's undo button or manually revert any changes just like you would with manual edits. Always review Nola's changes before [publishing](/settings/publishing) your app.

</details>

<details>

<summary>Will Nola make changes without asking me first?</summary>

Nola asks for your approval before actions that change or remove things, so nothing significant happens without your say-so. For a larger task she'll also show a short plan before she starts, and if a request could go a few ways she'll ask a quick multiple-choice question rather than guessing. Quick, low-risk changes are made directly. You can always ask her to "explain what you're going to do" first, and you can adjust exactly which actions she checks with you in [Controlling what needs your approval](/nola/getting-started-with-nola#controlling-what-needs-your-approval).

</details>

<details>

<summary>Can I control which actions Nola asks me to approve?</summary>

Yes. Nola's **Tool permissions** settings let you set each kind of action — creating records, editing pages, changing workflows, and so on — to **Always ask** or **Always allow**, so you can give Nola a free hand for routine work while keeping a check on the rest. You can also make a choice stick straight from an approval card as you chat — "allow for this chat", "allow this table only", or "always allow". See [Controlling what needs your approval](/nola/getting-started-with-nola#controlling-what-needs-your-approval) for the details.

</details>

<details>

<summary>How specific should I be in my requests?</summary>

The more specific, the better! Instead of "add a table," try "create a Projects table with fields for project name, start date, end date, status, and assigned team member." Specific requests get better results on the first try.

See [Tips and Best Practices](/nola/tips-and-best-practices) for more guidance.

</details>

## Technical Questions

<details>

<summary>Can Nola connect external data sources like Airtable or PostgreSQL?</summary>

Not currently. Connecting to external data sources ([Airtable](/data/airtable), [Google Sheets](/data/google-sheets), [PostgreSQL](/data/postgresql), [MySQL](/data/mysql), etc.) must be done manually through the Noloco interface. Once connected, Nola can help you work with that data.

</details>

<details>

<summary>Can Nola build custom pages that go beyond standard layouts?</summary>

Yes. When a standard layout can't express what you want, Nola can build you a fully custom page called a [Canvas](/nola/canvas). Nola writes and maintains the code behind it, so you get a bespoke result **without any code to manage yourself**. You never see files, terminals, or build tooling — you describe the page, watch it build, and refine it by chatting.

For your app's manual [custom code](/settings/custom-code) blocks (custom CSS/JavaScript you inject yourself), Nola doesn't write into those — but for custom layouts, a Canvas is almost always the better route.

</details>

<details>

<summary>What is a Canvas?</summary>

A Canvas is a custom page Nola builds for you when standard [views](/pages/views) and [dashboards](/pages/blank-pages) aren't flexible enough — bespoke dashboards, portal home pages, and interactive layouts. A Canvas is built on your existing data, [charts](/views/display/charts), and your app's [theme](/settings/theme-and-design), navigation, and permissions, so it feels like a natural part of your app. (Some advanced components — Kanban, timelines, and the data grid — aren't available in a Canvas yet.)

See the [Canvas guides](/nola/canvas) to learn more.

</details>

<details>

<summary>Can I add a Canvas to a page I already have?</summary>

Yes. As well as building a full Canvas page, Nola can add a [**Canvas component**](/nola/canvas/canvas-components) — a custom, dynamic section — to an existing [record page](/record-pages/overview) or [blank page](/pages/blank-pages). You add one by asking Nola (there's no component to drag in), and on a record page it automatically knows the current record, so it's great for record-specific tools and summaries.

</details>

<details>

<summary>Can Nola set up Zapier or Make integrations?</summary>

Not directly. Nola can't configure external integrations like [Zapier](/integrations/zapier), [Make](/integrations/make), or other third-party services. You'll need to set these up manually. However, Nola can help you set up [webhooks in workflows](/workflows/workflows/trigger-webhooks) that connect to these services.

</details>

<details>

<summary>Does Nola work with all field types?</summary>

Yes! Nola understands all Noloco [field types](/data/collections/field-types) including text, numbers, dates, select fields, [linked records](/data/collections/relationships), [lookups](/data/collections/lookup-fields), [rollups](/data/collections/rollups), [formulas](/data/collections/formulas), files, and more. Just describe what you need and she'll set it up correctly.

</details>

<details>

<summary>Can Nola help with data migrations?</summary>

Nola can help structure tables to receive migrated data and can generate sample data for testing. However, for large-scale [data imports](/data-management/import-data) from external sources, you'll want to use Noloco's import features or connect your external database directly.

</details>

## Troubleshooting

<details>

<summary>Nola didn't understand my request. What should I do?</summary>

Try these approaches:

1. **Rephrase more simply** - Break down complex requests into smaller steps
2. **Add more detail** - Provide specific examples or field names
3. **Ask Nola for clarification** - "What information do you need from me?"
4. **Check your terminology** - Use Noloco terms like "table" instead of "database"

</details>

<details>

<summary>Nola created something different from what I wanted. How do I fix it?</summary>

Just tell Nola what needs to change! For example: "The Status field should have different options" or "Change the [relationship](/data/collections/relationships) to many-to-many instead of one-to-many." Nola can iterate and refine based on your feedback.

</details>

<details>

<summary>I don't see the Nola tab in my app. Why?</summary>

Possible reasons:

* You're on a legacy plan that doesn't include Nola (check your plan)
* You're not in Build Mode (make sure you're editing, not viewing your app)
* There may be a temporary issue (try refreshing your browser)

If none of these solve it, contact Noloco support.

</details>

<details>

<summary>I've run out of credits. What now?</summary>

Nola's usage runs on [credits](/nola/credits-and-usage). If you've used your allowance:

* Your allowance resets on your renewal date (Free plans also get a small daily allowance that refreshes each day)
* Prioritize Nola for the tasks that save the most time
* Consider upgrading for a larger allowance
* Handle simple tasks manually

See [Credits & Usage](/nola/credits-and-usage) for how allowances and resets work.

</details>

<details>

<summary>Can I report issues or bugs with Nola?</summary>

Yes! Feedback is always valuable, and you can even ask Nola to report a bug to the Noloco team for you. You can also report issues through:

* The in-app support chat
* The Noloco Community forum
* Your account's support channel

Include details about what you asked Nola to do and what happened.

</details>

## Best Practices

<details>

<summary>Should I use Nola or build manually?</summary>

Use both! Nola is great for:

* Setting up structure quickly ([tables](/data/collections), [fields](/data/collections/field-types), [relationships](/data/collections/relationships))
* Generating sample data
* Building [workflows](/workflows/workflows)
* Learning features

Build manually when you want:

* Precise visual control
* Fine-tuned styling
* Exact layout positioning

The best approach is often: Nola for structure, manual for polish.

</details>

<details>

<summary>How can I learn Noloco features with Nola's help?</summary>

Ask Nola to explain as she works! Try requests like:

* "Explain [rollup fields](/data/collections/rollups) and show me an example"
* "Walk me through creating a [workflow](/workflows/workflows) step by step"
* "What are the different [permission](/users-and-permissions/user-roles-and-permissions) types and how do they work?"

Nola is both a builder and a teacher.

</details>

<details>

<summary>Should I review everything Nola creates?</summary>

Yes! Always review Nola's work, especially:

* Before [publishing](/settings/publishing) to live users
* When setting up [permissions](/users-and-permissions/user-roles-and-permissions) and security
* When building [workflows](/workflows/workflows) that send emails or modify data
* When working with real customer data

Think of Nola as a very helpful assistant, but you're still the boss.

</details>

<details>

<summary>Can I use Nola for production apps with real users?</summary>

Yes! Nola can help build production apps. However:

* Always test thoroughly before going live
* Review all [permissions](/users-and-permissions/user-roles-and-permissions) and security settings
* Verify [workflows](/workflows/workflows) work correctly
* Clean up any sample/test data
* Test with real-world scenarios

Nola builds production-ready features, but testing is still essential.

</details>

## Data & Privacy

<details>

<summary>Can Nola see my app data?</summary>

Nola has access to your app's structure ([tables](/data/collections), [fields](/data/collections/field-types), [views](/pages/views), [workflows](/workflows/workflows)) and can read data to help you build and troubleshoot. This access is necessary for Nola to help you effectively.

</details>

<details>

<summary>Is my conversation with Nola private?</summary>

Conversations with Nola are associated with your Noloco account and app. Noloco takes data privacy seriously. For specific details about data handling, see Noloco's privacy policy or contact support.

</details>

<details>

<summary>Does Nola store my data?</summary>

Nola needs to access your app's structure and data to help you build. Conversation history may be stored to improve Nola's performance. For specific data retention policies, refer to Noloco's privacy policy.

</details>

## Future & Feedback

<details>

<summary>Is Nola getting new features?</summary>

Yes! Nola is actively being developed. New capabilities, improvements, and integrations are being added regularly. Check Noloco's changelog or community announcements for updates.

</details>

<details>

<summary>How can I request new features for Nola?</summary>

Share your ideas through:

* The in-app support chat
* The Noloco Community forum
* Feature request form (if available)
* Your account's support channel

The team actively considers user feedback for development priorities.

</details>

<details>

<summary>Will Nola always be free?</summary>

Every plan — including Free — includes a monthly allowance of [credits](/nola/credits-and-usage) for Nola at no extra cost, so there's always a free tier of usage. Beyond that allowance, usage runs on credits, with larger allowances on higher plans. See [Credits & Usage](/nola/credits-and-usage).

</details>

## Getting More Help

<details>

<summary>Where can I learn more about using Nola effectively?</summary>

Check out these guides:

* [Getting Started with Nola](/nola/getting-started-with-nola) - Learn the basics
* [What Nola Can Do](/nola/what-nola-can-do) - See all capabilities
* [Tips and Best Practices](/nola/tips-and-best-practices) - Expert strategies

You can also ask Nola herself: "What are some tips for working with you effectively?"

</details>

<details>

<summary>I have a question that's not answered here. Where should I ask?</summary>

For additional help:

* **Ask Nola directly** - She might be able to answer!
* **Use in-app support chat** - Quick help from the Noloco team
* **Visit the Noloco Community** - Learn from other users
* **Check the full documentation** - Comprehensive guides and tutorials

</details>

## Still Have Questions?

Can't find what you're looking for? Try these resources:

{% content-ref url="/pages/0XtlO9qufGMLCf5IYpLT" %}
[Getting Started with Nola](/nola/getting-started-with-nola)
{% endcontent-ref %}

{% content-ref url="/pages/OZcYeVgozL69b8jLqLgq" %}
[What Nola Can Do](/nola/what-nola-can-do)
{% endcontent-ref %}

{% content-ref url="/pages/0647kJQ2WZkWSoFTDaXF" %}
[Tips and Best Practices](/nola/tips-and-best-practices)
{% endcontent-ref %}

Or reach out to the Noloco support team through the in-app chat—they're always happy to help!


# Data to App

Learn how Noloco transforms your data into a shareable app for your team and clients.

When you build an app or add a new data source to an existing app, Noloco will build a basic layout based on the data that it finds in your tables. As you build new screens, forms and actions, and discover new corners of your app, it can be a little unclear how your data maps to the app's layout.

In this guide, you'll learn how to structure your data well and understand how your data appears in Noloco.

### Your data structure

There are many different [spreadsheets, databases and APIs](/data/data-overview) that you can use with Noloco. Some sources like Airtable are databases, and don't need to be re-structured to be used with Noloco and some, like Google Sheets, are more flexible and allow you to organize your cells however you want. However, for your data to work in Noloco, it must be a simple tabular format, i.e. in neat cells and rows.

<figure><img src="/files/uB0PeL5FwlukesH9p36A" alt=""><figcaption><p>A spreadsheet with neat columns and rows</p></figcaption></figure>

Within each table that you import to Noloco, every column should have a **unique** name. Your column names describe the properties or attributes of your rows (or records). Some of our data sources like [Airtable](/data/airtable), [Xano](/data/xano), SmartSuite, or [Postgres](/data/postgresql)/[MySQL](/data/mysql) automatically have **unique** column names, but in spreadsheets, you'll need to make sure the first row is reserved for this, and only this.

Let's look at the above example, if you are making a list of students in a class, you might have a table for the *Class Data.* In the *Class Data* table, you would have columns for Student Name, Gender, Class Level, Home State, Major, and Extracurricular activity. Note that these names are in the first row, and are unique.

### Understanding how Noloco displays your data

When you import your data source to Noloco, Noloco will use AI to generate the best possible page for each of your tables as a starting point. Noloco looks at your table name, column names and column types to determine what layout you should use, and what data to show, but you can always adjust this when you start to customize your app.

When you land in your app for the first time, you will see that we created a page for the first 10 tables.

Let's break down how your data relates to the layout view in Noloco:

1. Tables become sidebar pages
2. Rows become Records
3. A single row becomes a Record View
4. Column values (a single cell in a row) are displayed in Sections & List components

#### Tables → Pages

When you create an app from a data source, Noloco will try to make a tab for every table it finds. You can create new tabs whenever you like, but they must have a table as a source. You can create multiple Tabs from the same Data Source.

Each page comes with three main components:

* [View](/pages/views) This is the view that displays multiple records in a table, kanban board, calendar or more Filters can be applied to customize the records that are shown, and the columns (or fields) can be customized to your liking
* [Record Page](#row-record-page) This is the view of a single record (or row) from the View. Clicking on a record in the View will open the Record Page for that record, where you can customize which sections, tabs, action buttons and details are shown for that record (and related records)
* [New Record Form](/forms/forms) This is the view (or form) used to create new records that will get added to your table. The form can be customized to your liking, hiding and showing fields, setting default values, placeholder, help text and validation rules.

#### Rows → View

If your data source has multiple rows, you'll see those items in a [View](/pages/views)

When you open the View Page, with build-mode enabled, you'll be able configure the layout, by choosing a different display option, adding a filter or changing the fields that are shown. Modifying your View is one of the first ways you start customizing your app in Noloco.

{% @arcade/embed url="<https://app.arcade.software/share/MFlMbWSaHu0aqyP28EOF>" flowId="MFlMbWSaHu0aqyP28EOF" %}

#### Row → Record Page

When you click on one of the records (rows, cards or items) in a View, Noloco's default action is to take you to a record view that represents all the information available for that row. Noloco adds default sections for some of the columns (fields) that it finds in your table, and adds related List components for linked fields, but all of this can be adjusted.

So if you added a table with project task info, your Record Page might look like this:

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

Noloco is very customizable, you don't have to show every single column/field on the record page. You can display the data you want and hide other columns using the build-mode editor panel in the left sidebar.

{% @arcade/embed url="<https://app.arcade.software/share/J615DF8o5uXBtKNZdUCI>" flowId="J615DF8o5uXBtKNZdUCI" %}

#### Columns → Fields

In Noloco, a column in your spreadsheet is known as a **Field**. A field has a type (like a Date Field) and a name. Depending on the type of the field, you can use it in different places in your app.

On a Record Page, different sections require you to use one field (such as the video section) or other sections can let you show multiple fields at the same time (such as the details or highlights fields)

For a more comprehensive overview of Record Pages and the fields, you can read the [Record Page Overview](/record-pages/overview)


# Database Consolidation

Migrating from a multi-base world to a unified database, then syncing it with Noloco, offers many benefits. This guide aims to walk you through the process step by step on how to achieve that

One of the most frequent questions asked by new users of Noloco is whether to adopt a single-app or multi-app strategy.

Most of the time, this question is raised by those

1\) bound by the constraints of living in a multiple spreadsheet world

2\) Those who have created individual databases or spreadsheets as a mechanism to control data access for a subset of users. For example, creating an Airtable base or a Smartsuite Workspace/App for each Client.

However, by creating a single app connected to a single database, you can focus your energy on improving and iterating on one product rather than spreading your resources thin across multiple platforms. This is especially beneficial for smaller teams where focus and rapid iteration can make or break the success of an application.

In this guide, we walk you through the process of database consolidation, to setting up user roles and permissions in Noloco, giving you the power to control access to your data at scale.

The benefit of using Noloco is that it's dynamic. This means in many cases you can create one app, one design that updates dynamically depending on the logged-in user who is accessing it.

## Step 1: Database Consolidation

**1. Identify Databases:** List all of the databases (i.e Airtable bases, Smartsuite Workspaces, Google Spreadsheets) you currently use.

{% hint style="info" %}
If you are a Smartsuite User, that has created individual 'Apps' within your Workspace, where each App is shared with an individual client or partner for permission or visibility reasons, this is also relevant for you. See more info below, re: "What is a Database?"
{% endhint %}

**2. Analyse Data**: Examine the data schema and commonalities between databases.

{% hint style="info" %}
The “schema” refers to the columns, column names, data types and rows stored in your database or spreadsheet. Columns in your data source will represent your ‘fields’ once connected to Noloco. The rows of data in your data source will be converted to records.
{% endhint %}

**3. Create a New or Choose your Master Database:** Based on the commonalities, create a new consolidated database or choose the main existing database to act as your master database that can hold all of your essential data. This will serve as your 'single source of truth.' Ensure the master database contains all of the columns that exist in your child databases.

{% hint style="info" %}
**What is a Database?**

If you are using ***Airtable***, this refers to your Airtable base.

If you are using ***Google Sheets***, your entire worksheet (i.e spreadsheet) will be treated as your database and each tab in your sheet will be treated like a table in Noloco.

If you are using ***Smartsuite***, a workspace will be treated as your database, with each 'App' within your workspace treated like a table in Noloco
{% endhint %}

**4. Migrate Data:** Copy the data from the multiple child databases and transfer it into your chosen master database. You could achieve this by exporting the data via CSV from the child databases you plan to stop using followed by importing this data into your selected master database.

## **Step 2: Create a table for Clients and link them with your existing data**

1. **Create A Client Table:** Navigate to your consolidated data source or spreadsheet. Create a new table or tab and call it something like "Clients" for easy identification. Create fields (i.e columns) that will store essential client information such as First Name, Last Name, and Email address etc. Once complete add in some new records to your table to test with. Or alternatively, import all of your Client details if you have them stored somewhere.
2. **Create Linked Tables Records:** Navigate to the tables where Clients need to be associated e.g 'Orders' or 'Invoices', etc. Add a new column or field type that allows you to link the Client to each row in the spreadsheet or database. In Airtable or Smartsuite, you will create a new linked field. In Google Sheets, you will need to create a column that will store a unique identifier which references the specific row from the Client tab in your spreadsheet. In Airtable, you will have the ability to choose whether many clients or only one client can be associated with the table of records you're creating the link on.
3. **Link Clients to Records:** Navigate to each of the tables where Client data needs to be associated. Populate each record with a Client value.

{% @arcade/embed url="<https://app.arcade.software/share/q6xjMiwGgiEDkk8gbOUc>" flowId="q6xjMiwGgiEDkk8gbOUc" %}

## Step 3: Connect the Consolidated Database to Noloco

**1. Log in to Noloco:** Open your Noloco Dashboard and create a new app or open the app you plan on connecting your consolidated database to

**2. Connect Database:** Connect your data during the new app creation process OR navigate to the Data Tab in your existing app where you can manage and add external database connections. From here, select ‘New Source’. Follow the prompts to link your consolidated database to Noloco.

{% @arcade/embed url="<https://app.arcade.software/share/7G4bibJCVYKNBG40FzV1>" flowId="7G4bibJCVYKNBG40FzV1" %}

## Step 4: Create User Roles in Noloco

**1. Navigate to 'Users’:** Select the Users tab from the admin sidebar. Locate the button to the left of the **Add User** button represented by three vertical dots. Click this button and select **Manage Roles**

**2. Create Roles:** Click on **Add a Role** and define the any custom user roles you would like to create for your app Users (e.g., Client, Vendor, Freelancer, Manager).

**3. Determine Role Settings:** For each role, specify what kind of app access they should have—Internal Team Member, Access all Data, Modify App.

{% @arcade/embed url="<https://noloco.share.arcade.software/share/8jeXewhyKW5zpZZfy0M8>" flowId="8jeXewhyKW5zpZZfy0M8" %}

## Step 5: Sync Users into Noloco

**1. Navigate to 'User List Sync’:** Locate the button represented with three vertical dots and select ***Sync your Users.*** A user list sync allows you to control which users can access your app by syncing a list from one of your tables in your connected database.

**2. Choose Source Database:** Select the table from your consolidated database that stores your app users as the source for the user list.

**3. Configure Sync Settings:** Make sure the correct fields for their Name, Email address, and the field criteria to assign the correct User Role is mapped. Press save.

{% @arcade/embed url="<https://noloco.share.arcade.software/share/wkrv7LS7dBAx3nE4i3iC>" flowId="wkrv7LS7dBAx3nE4i3iC" %}

## Step 6: Enable Permission Rules for Each Table of Data

**1. Navigate to Data Tab:** Locate your synced tables from the external database in the Data tab

**2. Add Permission Rule:** For each table, navigate to the Permissions section and click on 'Enable Permissions' followed by 'Add New Rule.'

**3. Set Criteria:** In most cases, you will configure a rule to only show records to the logged in user where their User is associated in a linked field somewhere on the record. Thanks to the User list sync you have previously created, Noloco can access this information from your tables.

{% @arcade/embed url="<https://noloco.share.arcade.software/share/kgomV85zSuM4Ik9ozYzG>" flowId="kgomV85zSuM4Ik9ozYzG" %}

## Step 7: Validate & Test

**1. View the app as Different User Roles:** Check to ensure that data visibility and permissions work as intended. From the build mode toggle, select the 👥icon and choose the User you want to view the app as.

**2. Navigate through your views:** Go through each of your app views from the sidebar to verify that the correct records display to the User based on their assigned role and the permissions you have enabled on each table for this role.

{% @arcade/embed url="<https://noloco.share.arcade.software/share/h9DxU7cPRdWeGNYmiAwx>" flowId="h9DxU7cPRdWeGNYmiAwx" %}

## When to Use Multiple Apps Instead

While database consolidation is often the best approach, there are scenarios where multiple apps make more sense:

### Separate Apps for Different User Types

**Trade vs Client Apps**: Create completely separate experiences for different audiences:

1. **Different Branding**: Trade app with professional styling, client app with customer-friendly design
2. **Different Data Views**: Show different tables and fields to each audience
3. **Separate URLs**: Each app gets its own domain/subdomain for branding
4. **Independent Workflows**: Different onboarding, navigation, and feature sets

**Setup Process**:

1. Connect the same data source to multiple Noloco apps
2. Configure different user roles and permissions in each app
3. Design different page layouts and navigation for each app
4. Set up separate user lists or authentication for each app

### Public vs Private App Separation

**Scenario**: You need both a private internal tool and a public-facing portal

**Internal App**:

* Full CRUD permissions for employees
* Complex workflows and admin features
* Access to all sensitive data

**Public App**:

* Read-only access for customers
* Simple, focused interface
* Limited data exposure with public access settings

### Regional or Departmental Apps

**When Different Groups Need Completely Different Experiences**:

1. **Regional Apps**: Same data, different languages, currencies, or local regulations
2. **Departmental Apps**: Sales team app vs Support team app with completely different workflows
3. **Client-Specific Apps**: High-value clients get their own branded portal

### Multi-App Visibility Strategies

#### Sharing Data Between Apps

**Same Database, Different Views**:

* Connect multiple apps to the same Airtable base or database
* Each app can have different table permissions and visibility rules
* Changes in the data source appear in all apps instantly
* Each app maintains its own user roles and permissions

#### Managing User Access Across Apps

1. **Separate User Lists**: Each app can sync users from different tables
2. **Shared Authentication**: Use SSO to allow access to multiple apps
3. **Cross-App Navigation**: Link between apps for users who need access to both

#### Testing Multi-App Setups

1. **Consistent Data Testing**: Ensure data changes appear correctly in all apps
2. **Permission Verification**: Test that each app's permissions work independently
3. **User Experience Testing**: Navigate between apps to ensure smooth transitions
4. **Performance Testing**: Monitor load times and data sync across multiple apps

### Troubleshooting Multi-App Scenarios

#### Data Not Syncing Between Apps

1. **Check Data Source Connection**: Verify all apps are connected to the same database
2. **Manual Sync**: Trigger manual data refresh in each app
3. **Permission Issues**: Ensure data source permissions allow access from all apps
4. **Field Mapping**: Check that field mappings are consistent across apps

#### Users Can't Access Multiple Apps

1. **Separate User Lists**: Each app may need its own user list configuration
2. **Role Assignments**: Check that users have appropriate roles in each app
3. **Email Verification**: Ensure users are using the same email across apps
4. **SSO Configuration**: Set up Single Sign-On if users need seamless access

#### Conflicting Permissions

1. **App-Specific Rules**: Each app's permissions are independent - check each separately
2. **Data Source Permissions**: Some restrictions may come from the underlying database
3. **User Role Conflicts**: Same user might have different roles in different apps

## Decision Framework: Single App vs Multiple Apps

### Choose Single App (Database Consolidation) When:

* ✅ Users need access to similar functionality
* ✅ Data relationships are complex and interconnected
* ✅ You want to maintain one codebase/design
* ✅ User roles can be managed with permissions and visibility rules
* ✅ Branding and user experience can be unified

### Choose Multiple Apps When:

* ✅ User groups need completely different experiences
* ✅ Branding requirements are significantly different
* ✅ Regulatory or security requirements demand separation
* ✅ Different apps serve different business functions
* ✅ Public vs private access requirements
* ✅ You need different domains/URLs for different audiences

**Conclusion**

By following these steps, you'll move from a fragmented multi-database world to a centralized, well-managed system. Using Noloco's robust feature set, you can effectively manage user roles, permissions, and visibility settings from one dashboard, making your operations more efficient and secure.

For scenarios requiring multiple apps, you can still leverage shared data sources while providing completely customized experiences for different user groups.


# App Settings

Personalize your app's design, look and feel, privacy, and data.

Open your app's settings to personalize your app's design, look and feel, your login settings, and what data you integrate with.

This guide is an overview of the main elements of your app's settings. For a more comprehensive breakdown of all of your app's settings, explore the Settings section 👇

{% content-ref url="/pages/LwkX3U6uxPFZ4LcG8fl7" %}
[General Settings](/settings/general-settings)
{% endcontent-ref %}

### Personalize your App's Theme

Your theme controls the color of your app's sidebar, the primary buttons, your links, and more. So it's important that your Noloco app matches your brand.

You can choose from one of our 10 default themes, which are tuned to beautifully present your data. Or, if you want your app to match your company's brand, you can set a custom color.

You can change your app's theme from the 'Theme & design' section of your app's settings or using this link: <https://portals.noloco.io/~/_/settings/theme>

{% @arcade/embed url="<https://app.arcade.software/share/FaJxOEy7rcCbM9kDjQuX>" flowId="FaJxOEy7rcCbM9kDjQuX" %}

{% content-ref url="/pages/BQnWQguB5gXABKOIRVXu" %}
[Theme & Design](/settings/theme-and-design)
{% endcontent-ref %}

### Update your App's logo

To further customize your app's design, you can personalize and customize the logos used in the app's navigation sidebar, the logo used on the login, and invitation pages, the logo used in your app's automated emails, and finally, the logo used in your app's browser tab.

Each logo can be different and has different size requirements to make the most of your app.

To get started, go to the `App Settings` section of your app's settings or use this link: <https://portals.noloco.io/~/_/settings/project>

{% @arcade/embed url="<https://app.arcade.software/share/k9dHXOhlstT5YV6CJ0ev?embed=true>" flowId="k9dHXOhlstT5YV6CJ0ev" %}

{% content-ref url="/pages/USGJU8INGkH8zVb7AkEP" %}
[Custom Logos](/settings/general-settings/custom-logos)
{% endcontent-ref %}

### Update your App's name, description & email settings

Your app's name & description play a crucial role in forming the first impression for your users.

You can specify a name and description that will show up in any tab that your app is open in from the General Settings page.

<figure><img src="/files/7bSvsy7W4iCDrMYfOt6e" alt=""><figcaption></figcaption></figure>


# Components

Learn how to use components to customize your app

Components are the building blocks of Noloco. They can be added to [Record Pages](/data-to-app#row-record-page) and [Blank Pages](/pages/blank-pages) to truly customize your app.

Components display and let your app's users interact with data in different and powerful ways.

For example, the **List** component can show multiple data records, in different layout styles, like **Table, Kanban Board, Cards,** while other components, like the **Stages,** will only display one field value at a time.

You can see which components are visible on your page, add new components, and manage their order from the left side of the **Build Mode Sidebar**.

To edit a component, switch on **Build Mode** and then simply click the component you want to edit - this will open the **Build Mode Sidebar** for that component.

### Supported Components

Noloco supports a wide range of components that can help you display and edit your app's data with ease.

* **Title** Add a title, subtitle, or some action buttons to your page. The title component is very useful for adding context to other components on the page. The *subtitle* field supports Markdown, which allows you to get very flexible with the styling and content of your title.
* **List** Adds a list or table of records that can be related to the page's record when on a [Record Page](/data-to-app#row-record-page). This can be very useful for displaying related records, such as the Tasks on a Project.
* **Details** Add record fields to your page to display and update your data. Perhaps the most versatile component, the Details component presents you with a list of fields that you can display and customize individually. The details block can also let your users edit the field values by enabling inline editing on a field.

  You can also display the field with the following supported **Display as** options:

  * Default
  * Link
  * Button
  * Image
  * Markdown / Richtext
  * Formatted JSON
  * QR Code
  * Bold
  * Headings (H1 - H4)

  Dates:

  * Relative days (time since date)
* **Highlights** Adds a card that highlights your selected fields. Highlights allow you to present the most important information in a larger format. Note that fields in the highlight component are not editable.
* **Video** Adds a video element to your page that can be powered by a file field or a custom URL.
* **Iframe** Embed an iframe on your app's page, where the iframe URL is powered by a field or a custom URL.
* **Stages** Display a Single Option field's value in a stages element, useful for things like a Project's status or a lead's status.
* **Chart** Add a chart group to your page that can be powered by the related data Read more about [Charts](/views/display/charts)
* **Buttons** Add a group of action buttons to quickly take action on the data on the page. Read more about [Action Buttons](/actions/action-buttons)
* **Links** Add a visually appealing set of links to link your app's users to specific parts of the app, or to external links like your companies support page.
* **Text** Similar to the **Title** component, the **Text** component adds a markdown compatible text block to your page that you can customise with dynamic values.
* **Gallery** Showcase a file field on your page, for single files, it just shows the file, for multiple files, it allows your users to browse through the files.
* **Notice** Add a notice to your project to draw the users' attention to a specific piece of content. Customise the appearance of your notices by setting the appearance to be `Primary`,`Success`,`Warning`, `Danger`or `Default`, and by adding an optional icon.
* **Divider** Add a divider to your page to create some visual breathing space and to break sections up into logical groups.
* **Comments** Make your records interactive with our powerful Comments component. Users get a full rich-text editor with the ability to add attachments and customise notifications.
* **Image** Add images to your project using this component. You have the option to either upload the file, specify the file URL, or link to a file field in one of your tables.
* **Embed** Embed content from third-party sites using iFrames with this component.
* **Container** Group multiple sections or components together on your pages. Read more about [Containers](/components/containers)

{% hint style="info" %}
**Need something the built-in components can't do?** Beyond the components above, you can ask [Nola](/nola) to add a [**Canvas component**](/nola/canvas/canvas-components) — a custom, AI-built section that goes right onto your record page or blank page. On a record page it's aware of the current record, so it's great for record-specific tools and summaries. There's no palette entry for it — you add one by asking Nola.
{% endhint %}

### Configuring Components

The configuration options of your component will depend on what component you are customizing. Generally, most components have some or all of the following setting groups:

* **Data** Control which data is shown or used in your components
* **Actions** Some components, such as the Title, Action Buttons, or Details section allow you to configure [Action Buttons](/actions/action-buttons) on the component
* **Visibility rules** Configure whether the component should be visible at all times, or dependent on page values, or user role. [Read more](/charts/overview#line-charts). Visibility rules are present on all components.

### Adding a component

To add a component, make sure **Build Mode** is enabled. On the page you want to add a component, there should be a dotted outlined box with all of the components that you can add to the page.

Simply choose the component you want, and it will be added to the page.

If you don't see this box, then you are either on a [View](/pages/views) or you are not in **Build Mode.**

{% @arcade/embed url="<https://app.arcade.software/share/HANawLJHY6cITYktamrC>" flowId="HANawLJHY6cITYktamrC" %}

### Moving Components

You can re-order the components on a page from either the **Build Mode Sidebar** or by dragging and dropping the components into a new order using the drag handle of the selected components.

{% @arcade/embed url="<https://app.arcade.software/share/YPlbMLOOLACIQ5xTjqhO>" flowId="YPlbMLOOLACIQ5xTjqhO" %}

### Removing Component

When you delete a component, they don't affect the data in your app. It just deletes the component that was showing that data. You can use Command Z (Mac) or Control Z (PC) to undo any of your actions at any time, including deleting a component.

To delete a component simply use the Trash can icon on the selected component.

{% @arcade/embed url="<https://app.arcade.software/share/DthxbjrGfCLYuYYaEB7X>" flowId="DthxbjrGfCLYuYYaEB7X" %}


# Containers

Containers in Noloco allow you to organize and group multiple components on your pages, providing enhanced flexibility and control over your layout and visibility settings.

A container is a versatile component that can be added to both blank pages and record pages. Unlike other components, containers can nest multiple components within them, enabling better organization and layout customization.

### Using Containers in Noloco

{% embed url="<https://www.youtube.com/watch?v=IlLoW_RZFZ4>" %}

### **Benefits of Using Containers**

* **Visibility Rules**: Easily set visibility rules for multiple components at once.
* **Flexible Layouts**: Introduce columns and more complex layouts by grouping components within a container.
* **Denser Layouts:** Fit more information on the screen by adding a container that lets your content fit better together

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

### **How to Use Containers**

1. **Add a Container**: Navigate to the page where you want to add a container and select “Add Container”.
2. **Add Components**: Place new components inside the container or drag existing components into it.
3. **Arrange and Customize**: Adjust the placement and settings of the components within the container to suit your needs.

{% @arcade/embed url="<https://app.arcade.software/share/zH1nocwyUok6x8JcQVs8>" flowId="zH1nocwyUok6x8JcQVs8" %}

### **Optimizing Layouts with Containers**

Containers are particularly useful for creating side-by-side layouts with [charts](/charts/overview) and other components. Here's how to optimize your page layouts:

#### **Creating Side-by-Side Layouts**

To align charts and components horizontally:

1. Add a container to your [blank page](/pages/blank-pages) or [record page](/record-pages/overview)
2. Place your chart in one column of the container
3. Add your additional component (such as text, a [collection](/views/display), or another chart) in an adjacent column

#### **Adjusting Component Widths**

To ensure components align properly within a container:

* Set explicit widths for each component inside the container
* For balanced layouts, configure components to each occupy 50% of the container's width
* Manually adjust widths to your desired proportions if the default alignment doesn't meet your needs

{% hint style="info" %}
If you'd like a list displayed next to a chart, set both to occupy half the container's width. This ensures they render cleanly side-by-side without unnecessary empty space.
{% endhint %}

#### **Maximizing Space Usage**

To eliminate extra white space around charts:

* Set your chart to **Full width** to fill the available container space
* Ensure the parent container is also set to full width
* This allows charts and components to utilize the maximum available area

### **Example Use Cases**

* **Dashboard Customization**: Group related widgets and control their visibility based on user roles.
* **Form Layouts**: Create multi-column forms by nesting input fields within containers.
* **Chart Dashboards**: Display [charts](/charts/overview) alongside data lists or statistics for quick comparison and analysis.


# Video

The Video component in Noloco allows you to show video content, from a wide variety of sources such as YouTube, Vimeo and more, directly on your pages

Whether you're building an eLearning portal to just want to add a quick introduction to your platform, video is a powerful medium to communicate with your users in a visual way. Your videos can be hosted on many of the most popular streaming platforms or for smaller files you can upload them to your Noloco account too.

## Adding Videos in Noloco

Follow the steps below to see what it looks like to add a YouTube video a project.

{% @arcade/embed url="<https://app.arcade.software/share/vMV9nk1uTAkU2eGLDNZJ>" flowId="vMV9nk1uTAkU2eGLDNZJ" %}

## Supported Video Sources

### YouTube

The Video URL property in Noloco accepts both regular youtube.com links as well as shortened youtu.be links. For example you can expect both `https://www.youtube.com/watch?v=VIDEOID` and `https://youtu.be/VIDEOID` links to perform equally well.

#### Privacy Settings

Note that your video needs to be public or unlisted, otherwise it will not load in your app. If you encounter any playback issues please take a look at your videos privacy setting as a first port of call.

#### YouTube Shorts

A quick note on YouTube shorts: currently the Video component does not support playback of YouTube's new vertical video format, Shorts. These videos can also be identified by their different URL structure; `https:/youtube.com/`**`shorts`**`/VIDEOID`

If you need to add YouTube Shorts to your app please use the [embed](/pages/iframe-embeds) component.

### Loom

Loom videos are great for product tours and feature walk-throughs. The Video URL property in Noloco accepts links in the form`https://loom.com/share/VIDEO_UUID` as well as `https://loom.com/embed/VIDEO_UUID`

### Vimeo

Adding a Vimeo video to your app is incredibly easy; simply copy and paste the URL from your address bar into Noloco. The URL is in the format `https://vimeo.com/VIDEOID`

Please note that URLs in the format `https://player.vimeo.com/video/VIDEOID` are not supported at this time but can be used with the [embed](/pages/iframe-embeds) component

### Video Streaming

If you have access to any hosted video file, i.e. a URL ending in `./mp4` for example, then you can use that in Noloco to play videos too.

Please note that services such as Noloco Tables and Google Drive are not intended to be used as video streaming services and as such do not do not offer any performance guarantees. Video files can often be quite large, so if you are uploading to Noloco be mindful of your storage allowance, which starts at 1Gb for most customers. It is your responsibility to check with any file hosting service whether or not video streaming is within the Terms and Conditions of their Service Agreement.


# Templates

Learn how templates can help streamline the creation process of your application

### **What Are Templates?**

In the dynamic world of no-code app development, **Templates** serve as pre-designed blueprints that can help streamline the creation process of your application. They are predesigned layouts or structures that represent common use-cases or functionalities, allowing you to quickly set up and customize apps without starting from scratch.

### **Why Use Templates?**

1. **Time-Efficient**: Instead of building everything from the ground up, templates provide you with a ready-to-use structure, saving you hours of work.
2. **Consistency**: Templates offer a consistent design and functionality base, ensuring your app maintains a professional look and feel.
3. **Learning Tool**: For those new to Noloco, templates can act as a learning aid, giving insights into how different features and functionalities can be integrated.

### **How Can They Be Used?**

Using a template is straightforward:

1. **Browse & Choose**: Go through our extensive library of templates and select one that aligns with your needs. [Browse templates 👉](https://portals.noloco.io) You can also see our full list of [templates here](https://noloco.io/templates)
2. **Customize**: Once you've chosen a template, you can customize it. Change the color scheme, modify functionalities, or add new features – make it uniquely yours!
3. **Invite**: After customization, invite your team or clients. It’s that simple!

### **Where to Browse Templates?**

Our diverse range of templates can be browsed directly from your [Noloco dashboard](https://portals.noloco.io). Navigate to the "Templates" section, where you'll find categorizations based on functionalities, industries, and other criteria. Whether you're building a project management tool, a custom CRM, or a real estate listing app, there's a template waiting for you.

{% @arcade/embed url="<https://app.arcade.software/share/l0MPXPcMkpbfZEgt9F42>" flowId="l0MPXPcMkpbfZEgt9F42" %}

**Remember**: While templates provide a fantastic starting point, the true power of Noloco lies in your creativity. Mix, match, and modify to create an app that truly represents your vision. If you have questions or need assistance, our community and support team are always here to help.

### Airtable Templates

Some of the templates you can use with Noloco are powered by an Airtable base that the Noloco team have created. To use these templates you will need to have, or create, an Airtable account and then clone the base that powers the template to your Airtable workspace.

When you choose to clone the template in Noloco you will be given the option to connect your Airtable account and then open the template base and clone it.

After that, the process is the same as above, Noloco will import your tables and data from your new Airtable template, and you will be able to use a template that's powered by an Airtable base.

See how it looks below:

{% @arcade/embed url="<https://app.arcade.software/share/YdVDECwN0DyPq6ZDGrKn>" flowId="YdVDECwN0DyPq6ZDGrKn" %}


# Agency OS

A ready-to-use operating system for agency owners to centralise and manage their work — and deliver a premium client experience.

## Your agency, all in one place

Agency OS is a pre-built Noloco app designed for growing agencies. It replaces disconnected spreadsheets and fragmented tools with a single connected system — covering your sales pipeline, client relationships, project delivery, team management, and financials.

{% @arcade/embed url="<https://app.arcade.software/share/KMqmFvGXTmD8b5i3a5xv>" flowId="KMqmFvGXTmD8b5i3a5xv" %}

***

## The problem it solves

Most growing agencies run on a patchwork of tools — a CRM here, a project tracker there, invoices in a spreadsheet, client updates by email. None of it talks to each other. Data gets copied manually, things fall through the gaps, and every "what's the status?" email costs you time you don't have.

Agency OS is one connected system. A deal won in CRM becomes a client. A client gets a project. A project generates tasks, time entries, expenses, and invoices. Your client sees their project progress and invoices in a branded portal — without ever seeing your internal data. Everything flows forward automatically.

***

## What's included

### CRM & Sales

Track every deal from first contact to signed client — Kanban pipeline, sales performance dashboard, company and contact management, and a full interaction log.

### Clients

A gallery of your active clients, each with a 5-tab record covering deals, projects, invoices, interactions, and company details. One status change converts a lead to a client — no duplication.

### Project Management

Three pages covering every dimension of delivery: Projects (with Project Health and Budget Health % monitoring), All Tasks (Board View and List View), and Team Workload (the manager's view for balancing assignments and surfacing overdue work).

### Team

A team directory grouped by Employment Type, with a Skills field for finding the right person fast. An admin-only Team Cost tab shows Hourly Rate and Monthly Cost — financial data that powers budget monitoring across every project.

### Financials

Four pages: Client Invoices (with paid history by client), Revenue Dashboard (collected revenue, trends, and outstanding by client), Team Billables (hours and value by employee, project, and client), and Team Expenses.

### Client Portal

A branded, real-time portal where clients see their projects, tasks, and invoices — and nothing else. No internal data, no other clients' information, no team costs. Use it in sales demos to show prospects what their experience will look like before they sign.

***

## Who it's for

Agency OS is built for **B2B agencies between 5 and 50 people** — marketing agencies, consulting firms, design studios, and digital services companies.

It's the right fit if you're:

* Running your agency on spreadsheets and ready for something better
* Paying for multiple disconnected tools (CRM + project management + finance) that don't talk to each other
* Growing fast and need a system that scales with you without breaking

***

## Ready to use. Easy to customise.

Agency OS works on Day 1 — sample data included so you can see how everything connects before adding your own. When you're ready to adapt it, use Build Mode to rename pages, add fields, adjust views, and extend the system to match your exact workflows. No code required.

***

## Get started

{% hint style="success" %}
**Create your Agency OS** → [Get started here](https://portals.noloco.io/onboarding/?type=agency-os\&entry=guides)
{% endhint %}

Once you're in:

{% content-ref url="/pages/snm0yuTmDYWejd7kgeH3" %}
[Getting Started](/solutions/agency-os/getting-started)
{% endcontent-ref %}

{% content-ref url="/pages/VGpvTe8Ya8XcdMGly3zt" %}
[Your First Steps](/solutions/agency-os/your-first-steps)
{% endcontent-ref %}

***

## Guide index

| Guide                                                                         | What it covers                                               |
| ----------------------------------------------------------------------------- | ------------------------------------------------------------ |
| [App Structure](/solutions/agency-os/app-structure)                           | How every section connects                                   |
| [CRM & Sales](/solutions/agency-os/crm-and-sales)                             | Sales Pipeline, Dashboard, Companies, Contacts, Interactions |
| [Managing Clients](/solutions/agency-os/managing-clients)                     | Client gallery, 5-tab record, portal access                  |
| [Projects & Delivery](/solutions/agency-os/projects-and-delivery)             | Projects, All Tasks, Team Workload, time tracking            |
| [Team Management](/solutions/agency-os/team-management)                       | Directory, Team Cost, billing chain                          |
| [Billing & Expenses](/solutions/agency-os/billing-and-expenses)               | Invoices, Revenue Dashboard, Team Billables, Expenses        |
| [Home Page](/solutions/agency-os/home-page)                                   | My Work, My Time, My Expenses                                |
| [Client Portal](/solutions/agency-os/client-portal)                           | What clients see, access setup, Reply vs Note                |
| [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) | Build Mode, integrations, optional extensions                |
| [Best Practices](/solutions/agency-os/best-practices)                         | Tips for getting the most out of the system                  |

***

## Need help?

* **Ask Nola** — Noloco's AI assistant can help you navigate and customise
* **Book a call** — [Schedule onboarding support with the Noloco team](https://noloco.io/onboarding)
* **In-app chat** — contact Noloco support at any time from within the app


# Getting Started

Get up and running with Agency OS — explore the sample data and understand the system.

Welcome to Agency OS. This guide walks you through what you'll see when you first log in and how to get oriented quickly.

## Create your Agency OS app

If you haven't created your Agency OS app yet:

{% hint style="success" %}
**Create your Agency OS:** [Start for free](https://portals.noloco.io/onboarding/?type=agency-os\&entry=guides).
{% endhint %}

***

## What you'll see on first login

You land on the **Home** page — your personal daily dashboard. From here you can see your tasks, log time, and track expenses.

### Sample data — "Golden Agency"

Agency OS ships with a coherent set of sample data built around a fictional agency called **Golden Agency**. It's there to show you how the system works with real-looking data before you add your own.

The sample data includes:

* 10 companies (a mix of leads, clients, past clients)
* 12 contacts linked to those companies
* 10 deals at various pipeline stages
* \~20 interactions (calls, emails, meetings, notes)
* 8 projects across multiple clients
* 32 tasks in various statuses
* \~45 time entries with billable values
* \~9 expenses across projects
* \~11 invoices (paid and outstanding)
* 6 employee records with hourly rates and monthly costs
* 7 users

Use this data to click around and understand how everything connects — you can't break anything. When you're ready to start with your own data, select all sample records in each table and delete them.

{% hint style="info" %}
**Try "View as" early.** Click your profile icon → View as → pick a client user to see the Client Portal exactly as a client sees it. It's the fastest way to understand what your clients will experience.
{% endhint %}

***

## Navigation overview

The sidebar organises everything into sections:

```
🏠 Home          — Your personal dashboard (tasks, time, expenses)
📊 CRM           — Sales Pipeline, Sales Dashboard, Contacts, Companies, Interactions
👥 Clients       — Your active client gallery
📁 Project Management — Projects, All Tasks, Team Workload
👤 Team          — Directory + Team Cost (admin only)
💰 Financials    — Client Invoices, Revenue Dashboard, Team Billables, Team Expenses
🌐 Client Portal — Visible to clients only
```

Each section maps to a stage in the Agency OS operating loop:

```
Lead → Won Deal → Convert to Client → Create Project
→ Assign Tasks + Track Time → Deliver → Invoice → Client Portal → Repeat
```

***

## Home Page — your starting point

Home has three personal tabs:

* **My Work** (default) — your upcoming meetings, task summary KPIs, and your task list
* **My Time** — your billable hours, active timer, and time log
* **My Expenses** — your project expense log

Everything on Home is filtered to you. Organisation-level views (revenue, team workload, pipeline performance) live in their own sections.

***

## Build Mode vs Live Mode

Agency OS has two modes:

* **Live Mode** (default) — use the app, add data, manage work
* **Build Mode** — customise the app structure, add fields, modify views, set up automations

Toggle Build Mode using the floating switch in the bottom-left corner. You can move it out of the way while working. Changes in Build Mode can be undone — experiment freely.

***

## Initial setup checklist

Once you've explored the sample data, work through these before inviting your team:

**Personalise:**

* [ ] Upload your agency logo (Settings → General → Custom Logo)
* [ ] Set your brand colours (Settings → Theme & Design)
* [ ] Customise the Portal Home welcome message in Build Mode

**Configure:**

* [ ] Review user roles and permissions
* [ ] Set up login options — enable Google Sign In for easier client access (Settings → Integrations → Google Sign In)
* [ ] Connect Slack for team notifications (Settings → Integrations → Slack)

**Add your data:**

* [ ] Add your team members with Hourly Rates and Monthly Cost
* [ ] Create your active clients (or convert from CRM)
* [ ] Create your active projects with Engagement Type and Budget
* [ ] Delete the Golden Agency sample data when ready

{% hint style="info" %}
**Don't rush setup.** Agency OS works on Day 1 with the default configuration. Add your real data gradually as you learn the system — you don't need everything perfect before you start.
{% endhint %}

***

## Getting help

* **Nola AI Assistant** — ask Nola to help you navigate, customise, or understand features
* **These guides** — comprehensive coverage of every section
* **Onboarding call** — [schedule a call with the Noloco team](https://noloco.io/onboarding)
* **In-app chat** — contact Noloco support at any time from within the app

***

## What's next?

Ready to add your first real data? Head to [Your First Steps](/solutions/agency-os/your-first-steps) for a hands-on walkthrough of the core operating loop — from adding a company in CRM through to setting up a project and inviting a client to the portal.


# Your First Steps

A hands-on walkthrough of the Agency OS operating loop — from lead to client portal.

This tutorial walks you through the core operating loop of Agency OS. By the end you'll have added a company to CRM, converted them to a client, created a project with tasks, and seen the client portal exactly as your client would.

**Time required:** About 20–30 minutes.

***

## Step 1: Add a company to CRM

Everything starts in CRM — even if you already know someone will be a client, adding them as a company first keeps your history intact.

1. In the sidebar, click **CRM → Companies**
2. Click **+ New Company** (top right)
3. Fill in:
   * **Company name** — e.g. "Acme Studio"
   * **Status** — select "Lead"
   * **Owner** — defaults to you
   * **Industry** and **Size** (optional, but useful for filtering later)
4. Click Save

You've added your first company. Now create a deal for them.

5. Click **CRM → Sales Pipeline**
6. Click **+ New Deal**
7. Fill in:
   * **Deal name** — format: "Acme Studio — Website Redesign"
   * **Company** — select the company you just created
   * **Stage** — select "Qualified" (or wherever they are in your pipeline)
   * **Value** — estimated deal value
8. Click Save

The deal appears on the Kanban board. When you win it, you'll update the Company Status to "Client" — which is what we'll do next.

***

## Step 2: Convert the company to a client

When a deal is won, one field change is all it takes.

1. Go to **CRM → Companies**
2. Open the Acme Studio record
3. Click **Edit** and change **Status** to **"Client"**
4. Save

Acme Studio now appears in the **Clients** gallery. Open it and you'll see the full 5-tab client record:

* **Details** — company profile, KPI stat cards (Total Invoiced, Client Since, Client Owner, Last Interaction), and inline Contacts
* **Deals** — the deal history
* **Projects** — empty for now (you'll add one next)
* **Invoices** — empty for now
* **Interactions** — empty for now

{% hint style="info" %}
**One record, two views.** The same company record powers both the CRM Companies page and the Clients gallery — with different layouts optimised for each job. No duplication, no re-entry.
{% endhint %}

***

## Step 3: Create a project

Now create a project for your new client.

1. In the sidebar, click **Project Management → Projects**
2. Click **+ New Project** (top right)
3. Fill in the form:
   * **Name** — e.g. "Website Redesign"
   * **Client** — select Acme Studio
   * **Engagement Type** — select one (e.g. "Fixed-Price") — this field is required
   * **Budget** — estimated value of the project
   * **Lead** — the team member responsible for delivery
   * **Status** — "In Progress"
   * **Start Date / End Date**
   * **Description** — brief scope overview
4. Click Save

You're taken to the project record. Notice the five tabs: **Details · Tasks · Time · Expenses · Comments**.

The **Project Health** badge at the top defaults to "On Track" — update it to "Needs Attention" or "Critical" if something changes.

***

## Step 4: Add a task

1. On the project record, click the **Tasks** tab
2. Click **+ New Task**
3. Fill in:
   * **Title** — e.g. "Discovery call and brief"
   * **Project** — pre-filled with your project
   * **Assignee** — assign to yourself
   * **Priority** — "High"
   * **Due Date** — required (set to next week)
4. Click Save

Open the task. Notice:

* **Task status** — moves from To Do → In Progress → Done
* **File field** — attach a deliverable or brief directly to this task
* **Comments** — two types:
  * **Reply** — client-visible. Use for updates, questions, approvals.
  * **Note** — internal only. Clients never see this.

Try adding both. Add a Note ("Internal: need to confirm scope with the team") and a Reply ("Hi, we've kicked off discovery — we'll share a brief by Friday"). This is the most important distinction in the system for client-facing work.

{% hint style="warning" %}
**Always check Reply vs Note before posting.** A Reply is visible to the client in their portal immediately. If you post the wrong type, edit or delete it quickly.
{% endhint %}

***

## Step 5: See the client portal

Now see exactly what your client sees.

1. Click your **profile icon** (top right)
2. Select **View as...**
3. Choose a client user from the sample data

You're now seeing Agency OS as that client sees it. The sidebar shows only:

* **Portal Home** — welcome page with action cards
* **Projects** — their projects and tasks
* **Tasks** — their tasks
* **Client Invoices** — their invoices

Everything internal — CRM, Team, Financials, other clients' data — is hidden completely.

**What to check:**

* Navigate to Projects → click into a project → open a task
* You can see the **Reply** comment you added — but not the **Note**
* The client can add their own Reply comments

4. Click your profile icon again and select **Stop viewing as** to return to your admin view

{% hint style="success" %}
**Use "View as" before every client invite.** This 30-second check confirms that clients see exactly what you intend — and nothing they shouldn't.
{% endhint %}

***

## What you've covered

| Step | What you did                                      | Why it matters                                                       |
| ---- | ------------------------------------------------- | -------------------------------------------------------------------- |
| 1    | Added a company to CRM and created a deal         | Starts the operating loop with a complete history                    |
| 2    | Converted the company to a client                 | One status change — no duplication                                   |
| 3    | Created a project with Engagement Type and Budget | Required fields that power budget monitoring and financial reporting |
| 4    | Added a task and tested Reply vs Note             | Controls what clients see in the portal                              |
| 5    | Used "View as" to see the client portal           | Confirms the client experience before you invite anyone              |

***

## The operating loop

```
Lead → Won Deal → Convert to Client → Create Project
→ Assign Tasks + Track Time → Deliver → Invoice → Client Portal → Repeat
```

You've walked through the first half. The rest — time tracking, invoicing, and financial reporting — works the same way: data you enter at the task and project level rolls up automatically to the Financials section.

***

## What's next?

Explore the full guide for each section of the system:

* [App Structure](/solutions/agency-os/app-structure) — how all the sections connect
* [CRM & Sales](/solutions/agency-os/crm-and-sales) — managing your full pipeline
* [Managing Clients](/solutions/agency-os/managing-clients) — the client record in detail
* [Projects & Delivery](/solutions/agency-os/projects-and-delivery) — tasks, workload, and time tracking
* [Billing & Expenses](/solutions/agency-os/billing-and-expenses) — invoicing and revenue reporting
* [Client Portal](/solutions/agency-os/client-portal) — setting up real client access


# Understanding the Home Page

Your personal daily dashboard — tasks, time, and expenses filtered to you.

> Home is your personal starting point in Agency OS — everything here is filtered to you. Organisation-level dashboards live in their own sections (Sales Dashboard, Team Workload, Revenue Dashboard).

**Page subtitle:** "Your daily snapshot — meetings, tasks, and time in one place."

## What's included

Home has three tabs, each focused on a different dimension of your personal work:

| Tab             | What it shows                                       |
| --------------- | --------------------------------------------------- |
| **My Work**     | Your upcoming meetings, task summary, and task list |
| **My Time**     | Your billable hours, active timer, and time log     |
| **My Expenses** | Your project expense log                            |

***

## My Work (default tab)

My Work is the tab you'll land on every time you open Home. It's built around four sections, stacked top to bottom.

### My upcoming meetings

A section for tracking your scheduled meetings.

* **CTA:** "+ New Meeting" (top right)
* **Empty state:** "No meetings coming up. Add one manually, or connect your calendar via Make or Zapier to sync them automatically."

Meetings added here are personal log entries. For automatic sync, connect your Google Calendar or Outlook to Agency OS via Make or Zapier — new calendar events will create meeting records automatically. See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for setup details.

### Task Summary

Three KPI stat cards showing the state of your tasks:

* **Due soon** — tasks with a due date approaching
* **Overdue** — tasks past their due date and not yet done
* **Missing Due Date** — tasks assigned to you with no due date set

The Missing Due Date card is a useful nudge — tasks without due dates are invisible to workload views and easy to forget.

### My Tasks

Your personal task list, filtered automatically to you.

**Sub-text:** "Filtered to you. Grouped by status."

**Filters:** Search · Filter Project · Filter Priority · Filter Client

**CTA:** "+ New Task"

Tasks are grouped by status. Click any task to open it, update its status, log time, or add a comment.

**Empty state:** "There are no ongoing tasks. Tasks will appear here once a project manager assigns work, or create one yourself."

### Completed Tasks

A section showing your recently completed tasks — useful for a quick end-of-day review or to confirm that what you marked done is recorded correctly.

***

## My Time

**Tab header text:** "Track and manage your time, so hours are always accurate and ready to bill."

My Time is your personal time tracking hub.

### Two KPI stat cards

* **Billable Hours** (sub-label: "Last 4 weeks") — total hours logged in the past 4 weeks
* **Billable Value** (sub-label: "Last 4 weeks") — hours × your Hourly Rate for the same period

These update as you log time — your personal contribution to the agency's Total Billable Value.

### Active timer

The timer prompt shows: **"No active timer. Pick a task to start tracking."**

Click the **My Tasks** button to jump to your task list and start tracking against a specific task. Time logged this way links automatically to the task, project, and client — no manual linking needed.

### Time log

**Sub-text:** "All tracked hours. Edit or add entries anytime."

**Filter:** Filter Task

**CTA:** "+ Log Time" — for manual time entries when you forgot to start the timer

The time log shows all your entries in reverse chronological order. Click any entry to edit the hours, task, or date.

***

## My Expenses

**Section title:** "Project Expenses Log"

**Sub-text:** "Track and manage your project expenses, so your costs are always accurate and ready to bill."

**CTA:** "+ New Expenses"

Log any project-related expense here — travel, software, supplies, client lunches. Each expense links to a project and rolls up to the project's Expenses tab and the organisation-level Team Expenses page in Financials.

***

## Make it yours

Home works out of the box for every team member on Day 1. If you want to adapt it:

* **Sync your calendar:** Connect Google Calendar or Outlook via Make or Zapier so meetings appear automatically in "My upcoming meetings" — no manual entry needed.
* **Customise task filters:** In Build Mode, adjust the default filters on My Tasks to match how your team typically works (e.g. default to a specific project or priority level).
* **Add expense categories:** If your team logs expenses in categories not currently in the list, add them in Build Mode → Expenses table → Category field.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide.

***

## Tips

**Start the day on My Work.** Check the three Task Summary KPI cards first — Due soon, Overdue, and Missing Due Date. These three numbers tell you what needs attention before you open a single task.

**Use the active timer, not manual entry.** Starting the timer when you pick up a task keeps your billable hours accurate. Manual entries at end-of-day rely on memory — and memory is unreliable after 6 hours of work.

**Missing Due Date is a signal, not a decoration.** If that card is non-zero, your tasks are invisible to Team Workload. Ask your project manager to set due dates, or set them yourself — it takes 10 seconds and makes workload planning possible.

**My Time shows the last 4 weeks, not all time.** If you need to see billable hours across a longer period, go to Financials → Team Billables and filter by your name.

***

## What's next?

Home gives you your personal view. When you need the organisational view — who's overloaded, what's overdue across the team, how the pipeline is performing — head to the relevant section:

* Team workload → [Projects & Delivery](/solutions/agency-os/projects-and-delivery) → Team Workload page
* Sales performance → [CRM & Sales](/solutions/agency-os/crm-and-sales) → Sales Dashboard
* Revenue overview → [Billing & Expenses](/solutions/agency-os/billing-and-expenses) → Revenue Dashboard


# App Structure Overview

How Agency OS is organised and how every section connects

> Agency OS is built around one operating loop: win a lead, convert them to a client, deliver the work, and invoice — all in a single connected system.

## The operating loop

```
Lead → Won Deal → Convert to Client → Create Project → Assign Tasks + Track Time → Deliver → Invoice → Client Portal → Repeat
```

Every section of the app maps to a stage in this loop. Understanding the structure means you'll always know where to go and what each section is for.

***

## Navigation structure

The sidebar organises everything into six sections plus the Client Portal:

```
📁 Home
📁 CRM
   ├── Sales Pipeline
   ├── Sales Dashboard
   ├── Contacts
   ├── Companies
   └── Interactions
📁 Clients
   └── Clients (gallery)
📁 Project Management
   ├── Projects
   ├── Tasks
   └── Team Workload
📁 Team
   └── Directory (2 tabs: Directory + Team Cost)
📁 Financials
   ├── Client Invoices
   ├── Revenue Dashboard
   ├── Team Billables
   └── Team Expenses
📁 Client Portal  ← visible to clients only
   ├── Portal Home
   ├── Projects
   ├── Tasks
   └── Client Invoices
```

**Hidden pages** (exist in the template but not shown in the nav by default): Departments, Offices. These can be enabled as optional extensions — see [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os).

***

## Section by section

### Home — your personal dashboard

Home is filtered to **you**. Everything here is personal — your tasks, your time, your expenses. Organisation-level dashboards live in their respective sections.

**Three tabs:**

* **My Work** (default) — upcoming meetings, task summary KPIs, your tasks grouped by status, completed tasks
* **My Time** — billable hours and value (last 4 weeks), active timer prompt, time log
* **My Expenses** — your project expense log

**Who uses it:** Everyone, every day. It's the starting point for any team member's working session.

**Learn more:** [Home Page](/solutions/agency-os/home-page)

***

### CRM — sales pipeline

CRM covers everything **before** a company becomes a client. Track deals, log interactions, and manage the relationship from first contact to signed agreement.

**Five pages:**

* **Sales Pipeline** — Kanban board for working deals day to day (stages: New Lead → Discovery → Qualified → Proposal Sent → Negotiation → Closed-Won / Closed-Lost)
* **Sales Dashboard** — pipeline KPIs, closing-this-month table, win/loss performance charts
* **Contacts** — every person you work with, linked to their company
* **Companies** — every organisation you have a relationship with (leads, clients, past clients, lost)
* **Interactions** — chronological log of every call, email, meeting, and note

**Who uses it:** Sales leads, account managers, founders.

**Key concept:** Companies is the single source of truth for all organisations. Status drives where they appear — a Company with Status = "Lead" is in CRM; Status = "Client" means they're in the Clients section too. One record, different views.

**Learn more:** [CRM & Sales](/solutions/agency-os/crm-and-sales)

***

### Clients — active relationships

Once a company converts to a client, their record appears here. The Clients section is built for ongoing relationship management — not sales tracking.

**One page:** a gallery of all active clients, each linking to a 5-tab client record (Details · Deals · Projects · Invoices · Interactions).

**Who uses it:** Account managers, project leads, founders.

**Key concept:** No data is duplicated. When a Company Status changes to "Client", that same record powers both the CRM view and the Clients view — with different layouts optimised for each job.

**Learn more:** [Managing Clients](/solutions/agency-os/managing-clients)

***

### Project Management — delivery

Everything needed to plan, execute, and monitor client work.

**Three pages:**

* **Projects** — all client engagements. Two tabs: Active Projects (grouped by status) and All Projects (includes completed). Filters by Engagement Type, Project Health, Lead, Client.
* **Tasks** — titled "All Tasks". Two tabs: Board View (Kanban: To Do / In Progress / Done) and List View (table with export/import).
* **Team Workload** — the manager's page. Shows tasks by assignee, a bar chart of task distribution, and a dedicated overdue tasks section.

**Who uses it:** Project managers and team members daily. Founders and leads for oversight.

**Key concept:** Project Health (On Track / Needs Attention / Critical) and Engagement Type (Retainer / Fixed-Price / Time-Based / On-Demand / Workshop / Advisory) are visible on every project row — giving a quick read on the portfolio without opening individual records.

**Learn more:** [Projects & Delivery](/solutions/agency-os/projects-and-delivery)

***

### Team — people and cost

Your team directory and cost overview in one page, with two tabs.

**One page, two tabs:**

* **Directory** (all roles) — team members grouped by Employment Type, with Skills badges and Start Date
* **Team Cost** (admin only) — Hourly Rate and Monthly Cost per team member, plus Total Monthly Cost and Team Size KPIs

**Who uses it:** Admins for cost visibility. Everyone for the directory.

**Key concept:** Hourly Rate on the Team record powers the billing chain across the entire system — it flows into time entry costs, project billable value, and Budget Health %.

**Learn more:** [Team Management](/solutions/agency-os/team-management)

***

### Financials — revenue and expenses

Four pages covering every financial dimension of the agency.

**Four pages:**

* **Client Invoices** — all invoices grouped by status. Tab 2: paid invoices by client (pivot table, month by month).
* **Revenue Dashboard** — collected revenue, outstanding amounts, trends by month, client, and engagement type.
* **Team Billables** — billable hours and value by employee, project, and client. The profitability page.
* **Team Expenses** — flat log of all project expenses submitted by the team.

**Who uses it:** Founders and finance leads. Admins for operational management.

**Key concept:** Financials uses a three-level architecture. The same data appears at three scales — personal (Home), project (record), and organisation (Financials) — so every user sees the right level of detail for their role.

| Level                     | Time / Billables | Expenses        |
| ------------------------- | ---------------- | --------------- |
| Personal (Home)           | My Time tab      | My Expenses tab |
| Project (record)          | Time tab         | Expenses tab    |
| Organisation (Financials) | Team Billables   | Team Expenses   |

**Learn more:** [Billing & Expenses](/solutions/agency-os/billing-and-expenses)

***

### Client Portal — the client experience

The Client Portal is what your clients see when they log in. It's a branded, real-time view of their projects and invoices — completely separate from your internal workspace.

**Four pages (client-facing only):**

* **Portal Home** — welcome page with action cards
* **Projects** — their projects and tasks
* **Tasks** — their tasks
* **Client Invoices** — their invoices only

**What clients cannot see:** Team Workload, Revenue Dashboard, Team Billables, Team Expenses, other clients' data, hourly rates, or budget health figures. None of it is visible, even accidentally.

**Key concept:** The Client Portal is a competitive differentiator. Agencies use it in sales demos — showing a prospect their future portal experience is often what closes the deal.

**Learn more:** [Client Portal](/solutions/agency-os/client-portal)

***

## How the data connects

Everything flows through a single chain. No copying between tools.

```
COMPANY (Lead)
    │
    ▼
DEAL (Sales Pipeline)
    │ won
    ▼
COMPANY (Client) ──── CONTACTS
    │
    ▼
PROJECT ──── TEAM MEMBERS
    │
    ├── TASKS ──── TIME ENTRIES ──── Billable Value
    │
    ├── EXPENSES
    │
    └── INVOICES ──── Client Portal
```

* A **Company** record serves both CRM and Clients — status determines which section it appears in
* A **Project** links to a Client, a Lead (project owner), and an Engagement Type
* **Tasks** link to Projects and are assigned to Team Members
* **Time Entries** link to Tasks and use the Team Member's Hourly Rate to calculate billable value
* **Invoices** link to Clients and Projects — and appear in the Client Portal automatically

***

## Role-based access

| Role            | What they see                                                               |
| --------------- | --------------------------------------------------------------------------- |
| **Admin**       | Everything — all sections, financial data, Team Cost tab, all dashboards    |
| **Team Member** | Home (personal), Projects, Tasks assigned to them, time and expense logging |
| **Client**      | Client Portal only — their projects, tasks, and invoices                    |

***

## Make it yours

The navigation structure is a starting point. In Build Mode you can:

* **Rename** any page or section to match your agency's language
* **Reorder** sidebar items to match your workflow
* **Hide** pages you don't use (e.g. Team Expenses if you track costs elsewhere)
* **Unhide** optional pages like Departments and Offices when you need them
* **Add** new pages for custom tables as your needs grow

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide.

***

## What's next?

Start with the section most relevant to where you are right now:

* **Just getting started?** → [Getting Started](/solutions/agency-os/getting-started)
* **Setting up your sales process?** → [CRM & Sales](/solutions/agency-os/crm-and-sales)
* **Onboarding a new client?** → [Managing Clients](/solutions/agency-os/managing-clients)
* **Kicking off a project?** → [Projects & Delivery](/solutions/agency-os/projects-and-delivery)
* **Setting up the client portal?** → [Client Portal](/solutions/agency-os/client-portal)


# CRM & Sales

Track every deal from first contact to signed client — all in one connected system.

> The CRM section is your sales command center — track prospects, manage deals, log every interaction, and move companies through your pipeline until they become clients.

## What's included

The CRM section has five pages:

| Page                | What it does                                                       |
| ------------------- | ------------------------------------------------------------------ |
| **Sales Pipeline**  | Kanban board for managing active deals day to day                  |
| **Sales Dashboard** | Charts and KPIs for reviewing pipeline health and team performance |
| **Contacts**        | Directory of every person you work with, linked to their company   |
| **Companies**       | Every lead, client, and past relationship in one list              |
| **Interactions**    | A chronological log of every call, email, meeting, and note        |

{% hint style="info" %}
**CRM vs Clients:** The CRM section covers prospects and the sales process. Once a company becomes a client, their record moves to the **Clients** section — where active project work and invoicing happen. It's one connected system; the data flows automatically.
{% endhint %}

***

## Sales Pipeline

The Sales Pipeline is where deals get worked. It opens in a Kanban board view so you can see every active deal at a glance and drag cards as they progress.

**Page subtitle:** "Track every deal from first contact to closed — filter by owner, stage, or company."

### Deals in Pipeline (default tab) — Kanban view

The board has six stages running left to right:

**NEW LEAD → DISCOVERY → QUALIFIED → PROPOSAL SENT → NEGOTIATION → CLOSED-WON / CLOSED-LOST**

Each column shows:

* Stage name
* Number of deals in that stage
* Total dollar value of deals at that stage

Each deal card shows:

* Deal name (format: "Company — Deal Description", e.g. "Greenline — Leadership Comms Program")
* Value
* Owner
* Company (linked)

Filters at the top let you narrow by **Owner**, **Expected Close Date**, or **Company** — useful for sales leads reviewing their own pipeline or managers checking in on a specific account.

Use the **+ New Deal** button (top right) to create a deal directly from the board.

### All Deals (tab 2) — Table view

The All Deals tab shows every deal, including closed ones, in a table grouped by status. Columns include:

**DEAL · COMPANY · STATUS · VALUE · OWNER · EXPECTED CLOSE DATE · PRIORITY**

Status and Priority are displayed as coloured badges for quick scanning:

* Status: New Lead (pink), Discovery (blue), Qualified (green), Proposal Sent (pink), Negotiation (yellow), Closed-Won (green), Closed-Lost (red)
* Priority: High (pink), Medium (yellow), Low (green)

Use the **Search** bar and **Owner** filter to narrow the view.

***

## Sales Dashboard

The Sales Dashboard is your analytical view — step back from individual deals and see how the pipeline is performing as a whole.

**Page subtitle:** "Track your active pipeline, monitor deal progress and review your team's sales performance."

### Active Pipeline (default tab)

Four KPI stat cards give you an instant snapshot:

* **Open Deals** — number of deals currently active
* **Closing This Month** — deals with an expected close date this month
* **Pipeline Value** — total dollar value of all active deals
* **Avg Deal Value** — average value across open deals

Below the KPIs, a **Pipeline Value by Stage** bar chart shows how much revenue sits at each stage. This is useful for spotting where deals are getting stuck.

At the bottom, the **Closing This Month** table lists every deal expected to close this month — with Company, Value, Status, Owner, and Expected Close Date.

Filters: Owner, Expected Close Date.

### Sales Performance (tab 2)

Three KPI stat cards cover closed outcomes:

* **Won Revenue** — total value of Closed-Won deals
* **Deals Won** — count
* **Deals Lost** — count

Charts include:

* **Revenue by Owner** — bar chart showing won revenue per team member
* **Closed Won Deals** — table with totals
* **Closed Lost Deals** — table including a **Lost Reason** column, so you can learn from what didn't work

Filters: Owner, Expected Close Date.

***

## Contacts

The Contacts page is your directory of every individual you work with — prospects, client contacts, and key stakeholders — each linked to their company.

**Page subtitle:** "Everyone you're working with — linked to their company and deal."

**Table columns:** NAME · COMPANY · TITLE · EMAIL · LINKEDIN · LAST INTERACTION

Filters: **Search** bar and **Company** dropdown.

Use the **+ New Contact** button to add a contact. When logging an Interaction or creating a Deal, you link contacts directly — no duplication needed.

{% hint style="info" %}
**From prospect to portal user:** When a company converts to a client, their contacts can be given access to the Client Portal. They'll see project progress and invoices without ever seeing your internal data.
{% endhint %}

***

## Companies

Companies is the single list that holds every organisation you have a relationship with — leads you're pursuing, active clients, past clients, and lost opportunities.

**Page subtitle:** "Leads, clients, and past relationships — all in one place."

**Table columns:** STATUS · COMPANY · INDUSTRY · SIZE · OWNER · LAST INTERACTION

Status is shown as coloured badges:

* **Lead** (blue) — actively pursuing
* **Client** (teal) — active relationship, work in progress
* **Past Client** (grey) — previously engaged, relationship warm
* **Lost** (red) — no longer pursuing

Filters: Search, Owner, Industry, Status.

Use the **+ New Company** button to add a company. Start here before creating a deal — the company record anchors everything.

### Company record

Each company record has two tabs:

**Details tab:**

* Company Details: Owner, Industry, Size, HQ Address, Website, LinkedIn, Notes
* Associated Contacts: inline list of linked contacts with a + New Contact button

**Activity tab:**

* Interaction History: every logged call, email, meeting, and note with this company
* Deals: all associated deals and their current status

At the top of the record, a **status tracker** shows the lifecycle at a glance: **Lead → Client → Past Client → Lost**

The current stage is highlighted in teal.

### Moving a company through the lifecycle

When you win a deal, update the Company Status to **"Client"** — the company immediately appears in the Clients section with a full 5-tab client record ready to use. No duplication, no re-entry. One record, two views.

***

## Interactions

Interactions is the chronological log of every communication with your prospects and clients — calls, emails, meetings, and notes — all in one place.

**Page subtitle:** "Every call, email, and meeting is logged in one place."

**Table columns:** TYPE · SUBJECT · DEAL · COMPANY · DATE · OWNER · CONTACT

Type is shown as coloured badges: **Call** (grey) · **Email** (teal) · **Meeting** (green) · **Note** (pink)

Filters: Search, Type, Owner, Company.

The **+ Log Interaction** button (top right) opens a quick-entry form. Fill in:

* Type (Call / Email / Meeting / Note)
* Subject
* Company and Contact
* Deal (if applicable)
* Summary and Next Steps

The list is flat and chronological — most recent at the top. Use filters to zoom in on a specific company or deal.

{% hint style="info" %}
**Meetings are logged as Interactions.** Use Type = Meeting to log meeting notes directly in the CRM. For calendar sync, connect Agency OS to Google Calendar or Outlook via Make or Zapier — meeting records will create automatically. See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for setup details.
{% endhint %}

***

## Key fields and concepts

| Field           | Where                         | What it does                                           |
| --------------- | ----------------------------- | ------------------------------------------------------ |
| **Company**     | Deals, Contacts, Interactions | Universal link — replaces "Account" everywhere         |
| **Status**      | Companies                     | Tracks lifecycle: Lead → Client → Past Client → Lost   |
| **Stage**       | Deals (Sales Pipeline)        | Tracks deal progress: New Lead → … → Closed-Won / Lost |
| **Priority**    | Deals                         | High / Medium / Low — helps focus daily sales effort   |
| **Lost Reason** | Deals (Closed-Lost)           | Captures why deals were lost — improves future pitches |
| **Source**      | Interactions                  | Manual / Auto-Pipeline / Auto-Gmail / Auto-Calendar    |
| **Next Steps**  | Interactions                  | What needs to happen after this touchpoint             |

***

## Make it yours

Agency OS ships with a pipeline that works for most agencies on Day 1. When you're ready to tailor it:

* **Change pipeline stages:** In Build Mode, go to the Deals table → Stage field → edit the options to match your sales process. Add a "Contract Review" stage or rename "Qualified" to something that fits your language.
* **Add custom fields:** Track lead source, service interest, budget range, or ideal client fit score directly on the Company or Deal record — no code needed.
* **Automate follow-ups:** Use Noloco's Slack integration to notify your team when a deal reaches Proposal Sent, or connect via Zapier/Make to auto-log Gmail and Google Calendar activity as Interactions.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full list of integrations and extensions.

***

## Tips

**Log interactions immediately.** A brief note logged now ("Sent proposal — awaiting sign-off") is worth more than a detailed entry written three days later. It keeps your pipeline accurate and your team informed.

**Use the Sales Dashboard for your Monday review.** Check Active Pipeline KPIs, spot deals that haven't moved, and identify what's closing this month — all in one page.

**Keep Lost Reasons honest.** The Closed Lost Deals table on the Sales Performance tab shows Lost Reason for every lost deal. Over time this becomes your best source of product and process feedback.

**Use "Note" interactions freely.** Not every touchpoint is a call or email. Log a LinkedIn message, a conference conversation, or a referral context as a Note — it builds a richer history.

***

## What's next?

Once a company converts from Lead to Client, head to [Managing Clients](/solutions/agency-os/managing-clients) to see how the client record is structured and how to kick off project delivery.


# Managing Clients

Everything about your active clients — one record, full history, real-time portal.

> The Clients section is where your active client relationships live — from company details and deal history through to projects, invoices, and interactions in one connected record.

## What's included

The Clients section is a single page: a gallery of all your active clients.

Each client card links to a **5-tab client record** — the hub for everything related to that relationship. Revenue reporting lives in the Financials section under Revenue Dashboard, keeping the Clients section focused on relationship management.

{% hint style="info" %}
**One company, two views:** Clients are not a separate table — they are Companies with Status = "Client". Winning a deal and updating the Company Status to "Client" is all it takes. The same company record powers both your CRM and your Clients section, with different layouts optimised for each job.
{% endhint %}

***

## Clients gallery

**Page subtitle:** "Your active clients. Click any client to see projects, invoices, and activity."

The gallery shows your clients as cards — three per row. Each card displays:

* Company logo / avatar
* Company name
* **Total Invoiced** — all-time invoiced value for this client
* **Last Interaction** — how long ago you last had contact (e.g. "12 days ago")

Cards are clickable and lead directly to the client record.

Use the **Search** bar to find a specific client quickly. Click **+ New Client** to add a client directly (or convert from CRM by updating Company Status — see below).

### Adding a client

**From CRM (recommended):**

1. Win the deal in the Sales Pipeline
2. Open the Company record
3. Update the Status to **"Client"**
4. The company appears immediately in the Clients gallery

**Direct creation:**

1. Go to **Clients**
2. Click **+ New Client**
3. Fill in company details and save

Starting from CRM keeps the full deal history, interaction log, and contact relationships intact — no re-entry needed.

***

## Client record

Click any client card to open their record. The **"Active Client"** green banner at the top confirms their status.

Below the banner, four KPI stat cards give you the relationship at a glance:

* **Total Invoiced** — all invoices raised for this client
* **Client Since** — the date the relationship started
* **Client Owner** — the team member responsible for this account
* **Last Interaction** — most recent logged contact

The record has five tabs:

### Details tab

The Details tab is the full profile of the client.

**About \[Company Name]** section:

* Industry (coloured badge)
* Size (coloured badge)
* Notes — free text for context about the relationship
* Address, Website, LinkedIn

**Contacts** section (inline, below About):

* Card layout per contact: Name, Title, Email, Last Interaction date
* **+ New Contact** button to add contacts directly from the client record

### Deals tab

All deals associated with this company — won, lost, and in progress. Useful for reviewing the sales history before a client check-in or renewal conversation.

### Projects tab

All projects for this client — active, planned, and completed. Click any project to open it. This is the fastest way to jump from client to delivery.

### Invoices tab

All invoices raised for this client, with amounts and statuses. For the full financial picture across all clients, see the **Revenue Dashboard** in Financials.

### Interactions tab

Every logged call, email, meeting, and note with this client — in chronological order. Use this tab to review the relationship history before a meeting or check-in.

***

## Client Portal access

One of the most valuable things you can give a client is their own portal — a branded, real-time window into project progress and invoices. No more "what's the status?" emails.

Clients with portal access see:

* **Portal Home** — a welcome page with action cards
* **Projects** — their projects and tasks, updated in real time
* **Client Invoices** — their invoices only

They do not see any internal data — no team costs, no other clients' projects, no budget health figures.

To grant portal access:

1. Go to the Contact record for the person you want to invite
2. Invite them as a user and assign the **Client** role
3. Their access is scoped to their company's data automatically

{% hint style="info" %}
**Use the portal in sales demos.** Showing a prospect what their client experience will look like is a powerful differentiator. Many agencies close deals faster once prospects see the portal.
{% endhint %}

See [Client Portal](/solutions/agency-os/client-portal) for the full guide on what clients see and how permissions work.

***

## Key fields and concepts

| Field                | What it does                                                                                               |
| -------------------- | ---------------------------------------------------------------------------------------------------------- |
| **Status**           | "Client" makes a company appear in this section. Change to "Past Client" when work ends — don't delete.    |
| **Client Since**     | Replaces "Created at" — shows when the relationship started, not when the record was made.                 |
| **Client Owner**     | The team member responsible for this account. Shown on the KPI card and used in Revenue Dashboard filters. |
| **Total Invoiced**   | Shown on both the gallery card and the Details KPI — gives an instant lifetime value view.                 |
| **Last Interaction** | Pulled from the most recent Interaction record linked to this company.                                     |

***

## Make it yours

The Clients gallery and record work out of the box. When you're ready to extend them:

* **Add a client tier field:** Create a single-select field (e.g. Strategic / Standard / Starter) on the Companies table and add it to the client record layout in Build Mode.
* **Track NPS or satisfaction scores:** Add a number or rating field to log post-project satisfaction scores directly on the client record.
* **Connect to Slack:** Use Noloco's native Slack integration to send a notification to your team channel when a new client is added — Settings → Integrations → Slack.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for more.

***

## Tips

**Don't delete churned clients.** Update their Status to "Past Client" or "Lost" — this keeps the full history intact and means they'll reappear correctly if they return. The Companies table is your long-term relationship record.

**Keep the Contacts section current.** When contacts change roles or companies, update their records — your Interactions log stays accurate and portal access can be adjusted cleanly.

**Use the Interactions tab before every client call.** A 30-second scroll through recent interactions means you walk into every conversation informed.

**Log interactions consistently.** Every call, email, and meeting logged here builds a relationship history that's visible to your whole team — not trapped in one person's inbox.

***

## What's next?

With your client set up, it's time to create their first project. Head to [Projects & Delivery](/solutions/agency-os/projects-and-delivery) to see how project tracking, task management, and time logging work.


# Projects & Delivery

Plan projects, manage tasks, track time, and monitor team workload — all in one place.

> The Project Management section is your delivery hub — from scoping and task assignment through to time tracking and budget monitoring, everything your team needs to do the work and prove the value.

## What's included

The Project Management section has three pages:

| Page              | What it does                                                |
| ----------------- | ----------------------------------------------------------- |
| **Projects**      | All client engagements — track health, budget, and progress |
| **All Tasks**     | Every task across every project — Board View and List View  |
| **Team Workload** | Who's working on what, and what's overdue                   |

***

## Projects

**Page subtitle:** "All client engagements — track project delivery, budget, and team."

### Active Projects (default tab)

The Active Projects tab is your operational view. Projects are grouped by status, with filters to narrow by Engagement Type, Project Health, Lead, or Client.

**Columns:** PROJECT HEALTH · NAME · CLIENT · LEAD · ENGAGEMENT TYPE · BUDGET · BUDGET SPENT · START DATE · END DATE

**Project Health** is the first column — a coloured badge that gives an immediate read on every project:

* **On Track** (green) — delivery is proceeding as planned
* **Needs Attention** (yellow) — something needs a look
* **Critical** (red) — intervention required

**Engagement Type** is shown as a coloured badge: Retainer · Fixed-Price · Time-Based / On-Demand · Workshop · Advisory

**Budget Spent** includes a visual progress bar — a teal bar showing percentage of budget consumed. This updates automatically as time entries and expenses are logged.

Helper text below the tabs: "Filter by health, type, or lead to find what needs attention."

### All Projects (tab 2)

Shows every project including completed ones, grouped by status: Planned · In Progress · Completed. Useful for portfolio reviews and client history.

Additional filter: Status.

### Creating a project

Click **+ New Project** (top right). The form field order is:

**Name → Client → Engagement Type → Budget → Lead → Status → Start Date → End Date → Description**

* **Engagement Type** is required — it drives financial reporting in Team Billables
* **Lead** is the team member responsible for delivery
* **Project Health** defaults to "On Track"

### Project record — 5 tabs

Click any project to open its record:

**Details tab** — project overview with KPI cards, engagement details, and budget summary. Budget Health % is calculated automatically based on total billable value + expenses vs budget.

**Tasks tab** — all tasks for this project. Create and manage tasks without leaving the project record.

**Time tab** — all time entries logged against this project. Filter by team member or date range. Total Billable Value is calculated from hours × each team member's Hourly Rate.

**Expenses tab** — all project expenses logged by the team. Categories include Travel, Software, Supplies, Client Lunch, and Other. Add expenses directly from this tab.

**Comments tab** — project-level discussion. Use for milestone updates, scope notes, and internal coordination.

{% hint style="info" %}
**Budget Health %** is automated. As your team logs time and expenses, Budget Health % updates in real time — no manual calculation needed. When it turns yellow or red, it's a signal to review scope or timeline before the budget is exhausted.
{% endhint %}

***

## All Tasks

**Page title:** "All Tasks"

### Board View (default tab)

A Kanban board showing all tasks across every project.

**Section header:** "All tasks across every project" — sub-text: "Drag cards to update status."

**Kanban columns:** TO DO · IN PROGRESS · DONE (with task counts)

Each card shows: Task name (linked), Assignee, Priority (coloured badge), Due Date.

Cards are **draggable** — move a card between columns to update its status instantly.

**Filters:** Search, Project, Priority, Client, Assignee.

### List View (tab 2)

A table showing all tasks with full detail. Ideal for bulk review, sorting, and exporting.

**Helper text:** "List views are ideal for bulk review, sorting, and exporting data."

**Buttons:** Export · Import · + New Tasks

**Filters:** Filter Project · Filter Priority · Filter Client · Filter Assignee

**Columns:** TASK STATUS · TITLE · PROJECT · CLIENT · ASSIGNEE · PRIORITY · DUE DATE

Tasks are grouped by status: TO DO · IN PROGRESS · DONE

### Creating a task

From any task view, click **+ New Task**. Required fields:

* **Project** — required (links the task to its parent project and client)
* **Due Date** — required
* **Priority** — High / Medium / Low
* **Assignee** — who is responsible

Tasks also have a **File** field for attaching deliverables or reference materials directly to the task record.

### Task statuses and Priority

| Status      | Badge colour | Meaning         |
| ----------- | ------------ | --------------- |
| To Do       | Grey         | Not yet started |
| In Progress | Teal         | Being worked on |
| Done        | Green        | Completed       |

| Priority | Badge colour |
| -------- | ------------ |
| High     | Pink         |
| Medium   | Yellow       |
| Low      | Green        |

***

## Team Workload

**Page subtitle:** "Check who's working on what — spot overload and rebalance."

Team Workload is the manager's page. Scroll through it once and you know exactly who has too much, who has capacity, and what's overdue.

### What you'll see (top to bottom)

**Three KPI stat cards:**

* **Active Tasks** — all open tasks across the team
* **Overdue Tasks** — tasks past their due date and not yet done
* **Unassigned Tasks** — tasks with no assignee (a risk indicator)

**Tasks per team member** — a bar chart showing how many open tasks each person has. Hover for exact counts. Use this to spot imbalance at a glance.

**Task table grouped by assignee** — filters: Filter Project, Filter Priority, Filter Task Status. Columns: TITLE · PROJECT · TASK STATUS · PRIORITY · DUE DATE. Each group shows all open tasks for that team member.

**Overdue Tasks section** — a separate table at the bottom. Sub-heading: "Past due and not yet completed." Columns: TITLE · PROJECT · ASSIGNEE · TASK STATUS · DUE DATE · PRIORITY. This surfaces everything that needs chasing without any filtering.

***

## Time tracking

Time tracking is woven into the system at every level — Home (personal), project record (project), and Financials (organisation).

### Logging time

**From Home → My Time tab:**

* The active timer prompt shows: "No active timer. Pick a task to start tracking."
* Click **My Tasks** to jump to your task list, start a task, and the timer begins
* Click **+ Log Time** to add a manual entry

**From any task record:**

* Log time directly against the task
* Time links automatically to the project and client

### How time becomes billable value

Every time entry uses the team member's **Hourly Rate** to calculate its billable value:

```
Hours logged × Hourly Rate = Time Entry Billable Cost
↓
Sum of all entries → Task Total Billable Value
↓
Sum across all tasks → Project Total Billable Value
↓
Project Budget − Total Billable Value − Expenses = Remaining Budget
↓
Remaining Budget ÷ Budget = Budget Health %
```

This chain is fully automated. Keep Hourly Rates accurate on the Team page to keep these numbers reliable.

***

## Key fields and concepts

| Field               | Where   | What it does                                                                                                 |
| ------------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
| **Engagement Type** | Project | Required. Retainer / Fixed-Price / Time-Based / On-Demand / Workshop / Advisory. Drives financial reporting. |
| **Project Health**  | Project | On Track / Needs Attention / Critical. Shown as first column on Active Projects tab.                         |
| **Budget Health %** | Project | Automated formula — remaining budget as % of total budget.                                                   |
| **Lead**            | Project | The team member responsible for delivery. Filter by Lead to see your own projects.                           |
| **Priority**        | Task    | High / Medium / Low. Required at task creation.                                                              |
| **File**            | Task    | Attach deliverables or reference files directly to a task.                                                   |

***

## Make it yours

The Project Management section works on Day 1. When you're ready to extend it:

* **Add custom task stages:** Add "Client Review" or "QA" stages to the Task Status field in Build Mode — useful if your workflow has more steps than To Do / In Progress / Done.
* **Add a Project Brief field:** Add an editable long-text field to the Project record for storing scope documents or briefs — no more digging through email.
* **Automate notifications:** Use Noloco's native Slack integration to alert your team when a task is overdue, or when Budget Health % drops below a threshold. Connect via Zapier or Make for more complex automations (e.g. auto-create a Google Drive folder when a new project is created).
* **Switch to a Gantt view:** On any Projects or Tasks view, set the Display to [Timeline](/views/display/timeline) and pick the Gantt Layout type to plot dependencies, drag-shift dates and add milestones across a project plan.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide.

***

## Tips

**Use Project Health actively.** Update it when something changes — don't leave everything as "On Track" by default. A yellow badge on the Active Projects tab is a prompt for a 5-minute conversation, not a crisis.

**Go to Team Workload before assigning new tasks.** The bar chart tells you in 3 seconds who has capacity. Assigning work to someone already at capacity is how deadlines slip.

**Log time daily, not weekly.** Memory degrades fast. A quick time log at the end of each working session keeps your billable data accurate and your Budget Health % trustworthy.

**Due Date is required on tasks — use it.** The Overdue Tasks section on Team Workload only works if tasks have due dates. A task without a due date is invisible to the workload view.

***

## What's next?

Once projects are delivering and time is being tracked, it's time to invoice. Head to [Billing & Expenses](/solutions/agency-os/billing-and-expenses) to see how Client Invoices, the Revenue Dashboard, and Team Billables work together.


# Team Management

Your team directory, employment details, skills, and cost overview — all in one place.

> The Team section gives you a clear view of who's on your team, what they're working on, and what they cost — with financial data kept visible only to admins.

## What's included

The Team section is a single page with two tabs:

| Tab           | Who sees it | What it shows                                                             |
| ------------- | ----------- | ------------------------------------------------------------------------- |
| **Directory** | Everyone    | All team members, grouped by Employment Type, with skills and start dates |
| **Team Cost** | Admins only | Monthly cost and hourly rate per team member                              |

**Page subtitle:** "Your team at a glance — roles, skills, availability and cost."

{% hint style="info" %}
**Departments and Offices pages** exist in the template but are hidden from the navigation by default — they're available as optional extensions when you need them. See the Make it yours section below.
{% endhint %}

***

## Directory tab

The Directory is your team roster — open to everyone in your agency.

**CTA button:** "+ Add Team Member" (top right)

**Table columns:** USER · EMPLOYMENT TYPE · JOB TITLE · SKILLS · START DATE

Team members are grouped by Employment Type:

* **Full-Time**
* **Part-Time**
* **Contractor**
* **Freelancer**

Employment Type is shown as a coloured badge next to each person's name. Skills are shown as coloured multi-select badges — useful for quickly finding who has the right expertise for a project.

The sample data includes six team members across all Employment Types, with skills including AI & Automations, Project Management, Content Marketing, Video & Media, Product Design (UX/UI), Engineering & IT, and Data Analytics.

***

## Team Cost tab

The Team Cost tab is visible to **admins only**. Regular team members and clients cannot see hourly rates or monthly costs.

**Two KPI stat cards:**

* **Total Monthly Cost** — SUM of monthly cost across all active team members
* **Team Size** — count of active team members

**Table columns:** USER · EMPLOYMENT TYPE · JOB TITLE · HOURLY RATE · MONTHLY COST · START DATE

The table is flat (not grouped) — showing all team members with their financial details in one view.

### Why Hourly Rate matters

Hourly Rate is not just a cost field — it powers the entire billing chain across Agency OS:

```
Hourly Rate → Time Entry Billable Cost → Task Total Billable Value
→ Project Total Billable Value → Remaining Budget → Budget Health %
```

Every time a team member logs time against a task, their Hourly Rate is used to calculate the billable value of that entry. This flows up to the project's total billable value, which feeds into Budget Health % — the automated budget monitoring indicator visible on the Projects page.

Keep Hourly Rate accurate for all team members to get reliable budget and profitability data across the system.

***

## Team member record

Click any team member's name to open their record. It has two tabs:

### Profile tab

Role and team information, plus contact details:

* Employment Type
* Job Title
* Skills
* Start Date
* Contact Details

### Work tab

Active Projects — a collection of all projects this team member is currently assigned to. Useful for checking workload before adding new assignments, or for reviewing a team member's current commitments in a one-on-one.

{% hint style="info" %}
**For workload across the whole team**, use the **Team Workload** page in the Project Management section. It shows active tasks by assignee, a bar chart of task distribution, and a separate overdue tasks table — the manager's view for rebalancing work. See [Projects & Delivery](/solutions/agency-os/projects-and-delivery).
{% endhint %}

***

## Key fields and concepts

| Field               | What it does                                                                                                     |
| ------------------- | ---------------------------------------------------------------------------------------------------------------- |
| **Employment Type** | Single-select: Full-Time / Part-Time / Contractor / Freelancer. Used to group the Directory and categorise cost. |
| **Skills**          | Multi-select badges. Use these to find the right person for a project quickly.                                   |
| **Hourly Rate**     | Drives the billing chain — feeds into time entry costs, project billable value, and Budget Health %.             |
| **Monthly Cost**    | Total monthly spend on this team member. Used in the Total Monthly Cost KPI on the Team Cost tab.                |
| **Start Date**      | Shown in both tabs. Useful for tenure tracking and filtering.                                                    |

***

## Make it yours

The Team page works without any setup. When you're ready to extend it:

* **Unhide Departments:** If you want to organise your team by function, go to Build Mode → Navigation and make the Departments page visible. Add each department and link team members to it.
* **Unhide Offices:** For multi-location or hybrid agencies, unhide the Offices page the same way — useful for tracking where team members are based.
* **Add custom Skills options:** In Build Mode, go to the Team table → Skills field → edit the options to reflect your agency's actual skill set.
* **Track leave and absences:** The template doesn't include a leave tracker by default. Add a custom table for absence requests, or connect Agency OS to a dedicated HR tool via Zapier or Make.
* **Hiring rounds:** Use Projects + Tasks to manage hiring — create a project per role and track candidates as tasks moving through stages.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full extensions list.

***

## Tips

**Keep Hourly Rates up to date.** Stale rates mean inaccurate budget monitoring across every active project. Update them in the Team Cost tab whenever a rate changes.

**Use Skills badges actively.** Before assigning a task or staffing a project, filter the Directory by the skill you need — it's faster than remembering who does what.

**The Team Cost tab is your payroll sanity check.** The Total Monthly Cost KPI gives you a quick read on committed team spend before you take on new work or plan hiring.

**Don't delete former team members.** Deactivate their user account and update their record, but keep the record itself — historical time entries, project contributions, and billing data all stay accurate.

***

## What's next?

Head to [Projects & Delivery](/solutions/agency-os/projects-and-delivery) to see how projects are structured, how tasks are assigned to your team, and how Team Workload helps you manage capacity.


# Billing & Expenses

Invoice clients, track revenue, monitor billable output, and log expenses — all connected.

> The Financials section connects your team's billable time and project expenses to client invoices and revenue reporting — so you always know what you've earned, what's outstanding, and where the money is coming from.

## What's included

The Financials section has four pages:

| Page                  | What it does                                                          |
| --------------------- | --------------------------------------------------------------------- |
| **Client Invoices**   | Create, send, and track invoices — grouped by status                  |
| **Revenue Dashboard** | Agency-level revenue overview — collected, outstanding, and trending  |
| **Team Billables**    | Billable hours and value broken down by employee, project, and client |
| **Team Expenses**     | All project expenses logged by the team                               |

### The three-level architecture

Financial data in Agency OS exists at three scales — personal, project, and organisation. The Financials section is the organisation level:

| Level                         | Time / Billables   | Expenses          |
| ----------------------------- | ------------------ | ----------------- |
| Personal (Home)               | My Time tab        | My Expenses tab   |
| Project (record)              | Time tab           | Expenses tab      |
| **Organisation (Financials)** | **Team Billables** | **Team Expenses** |

Every time entry and expense logged at the personal or project level rolls up automatically to the Financials section — no manual aggregation needed.

***

## Client Invoices

**Page subtitle:** "Track, send, and follow up on every invoice — grouped by status."

### Invoices Status (default tab)

Three KPI stat cards at the top:

* **Collected This Month** — invoices marked Paid with a due date in the current month
* **Outstanding** — total value of all pending invoices
* **Overdue** — total value of invoices past their due date

**Table columns:** CLIENT · PROJECT · NET AMOUNT · DUE DATE · DESCRIPTION · LINE ITEMS · INVOICE

Invoices are grouped by status. The **Line Items** column shows linked tags for each line item on the invoice — a quick way to see what's included without opening the record.

Filters: Due Date, Project Name.

**CTA:** "+ New Invoice" (top right)

### Paid Invoices by Client (tab 2)

A bar chart showing total paid invoice value per client — useful for a quick read on your top revenue relationships.

Below the chart: **Paid Invoices History** — a pivot table with clients as rows, months as columns, and a TOTAL column. This is your month-by-month revenue by client, all time.

Filters: Client, Due Date.

### Creating an invoice

1. Click **+ New Invoice**
2. Select Client and Project
3. Set Invoice Date and Due Date
4. Add Line Items — each line item has a Description, Quantity, Rate, and calculated Amount
5. Save

Line Items are linked records — they can reference time entries or be added manually as fixed-fee items.

Once ready, update the invoice status to make it visible in the client's portal. Clients see their invoices in the **Client Invoices** section of the Client Portal — filtered to their company only.

{% hint style="info" %}
**Connect Stripe** to manage invoice payments directly from Agency OS. Clients can pay via card without leaving the portal. Set up in Settings → Integrations → Stripe.
{% endhint %}

***

## Revenue Dashboard

**Page subtitle:** "Your agency's revenue health: collected, outstanding, and trending."

The Revenue Dashboard is the agency owner's financial pulse. It answers the three questions that matter most: how much have we collected, what's still outstanding, and where is the money coming from?

**Four KPI stat cards:**

* **Invoices Paid** — count of paid invoices
* **Total Revenue Collected** — sum of all paid invoices
* **Largest Invoice** — highest single invoice value
* **Average Invoice Value** — across all invoices

**Filter:** Filter Date (top right — narrows all charts to a date range)

**Five charts (scrolling down):**

1. **Monthly Collected Revenue** — bar chart showing paid invoice totals per month. Spot seasonal patterns and revenue trajectory at a glance.
2. **Revenue by Client** — bar chart showing collected revenue per client. Identify your highest-value relationships.
3. **Outstanding by Client** — bar chart showing unpaid amounts per client. Know who to chase.
4. **Invoice Status Breakdown** — donut chart. Segments: Paid · Pending · Overdue. Gives an instant read on your AR health.
5. **Revenue by Engagement Type** — donut chart. Segments: Retainer · Fixed-Price · Workshop / Advisory · Time-Based / On-Demand. Shows which engagement types are driving the most revenue.

***

## Team Billables

**Page subtitle:** "Billable hours, value, and team output over time."

Team Billables is the deepest financial page in the template. It answers "where is the money coming from?" at every level: by person, by project, by client, and by engagement type.

**Three KPI stat cards:**

* **Total Billable Hours** — all time entries across the team
* **Total Billable Value** — hours × each team member's Hourly Rate
* **Total Time Entries** — count of individual time log entries

**Filters:** Start Time, Team Member

**Charts (top section):**

* **Total Billables by Employee** — bar chart showing billable value per team member
* **Billables Over Time** — line chart showing billable value by month

**Project Billables Breakdown section:**

* **Billable Output by Engagement Type** — donut chart showing what proportion of billable value comes from each engagement type
* Bar chart showing billable value per project

**Three pivot tables (scrolling down):**

| Table                 | Rows              | Columns |
| --------------------- | ----------------- | ------- |
| Billables by Employee | Team member names | Months  |
| Billables by Project  | Project names     | Months  |
| Billables by Client   | Client names      | Months  |

Each pivot table has a SUM row at the bottom showing monthly totals. These tables are the most granular view of billable output in the system.

{% hint style="info" %}
**Total Billable Value ≠ Revenue.** Billable value is what your team's time is worth based on Hourly Rates. Revenue is what clients actually pay (Client Invoices). The gap between the two is where you analyse profitability.
{% endhint %}

***

## Team Expenses

**Page subtitle:** "All project expenses logged by your team."

Team Expenses is a flat log of every project expense submitted across the agency — the organisation-level view of what your projects are costing beyond team time.

**Buttons:** Export · Import · + New Expense

**Filters:** Project, Client, Created By, Category

**Table columns:** PROJECT · CATEGORY · COST · DATE · CREATED BY · RECEIPT

* Project names are clickable links
* Created By names are clickable links
* Categories: Supplies · Software · Other · Travel · Client Lunch
* Receipt column holds file uploads (proof of expense)
* Flat list — no grouping. Use filters to narrow by project or team member.

The detail view for individual expenses lives on each **Project record → Expenses tab**. Team Expenses is the org-level rollup for the agency owner or finance lead.

***

## Key fields and concepts

| Term                     | Meaning                                                                                         |
| ------------------------ | ----------------------------------------------------------------------------------------------- |
| **Total Billable Value** | What the team's logged hours are worth (hours × Hourly Rate). Not the same as invoiced revenue. |
| **Total Expenses**       | Sum of all expense records linked to a project or the organisation.                             |
| **Expense Amount**       | The cost of an individual expense record (displayed as "Cost" in the table).                    |
| **Remaining Budget**     | Project Budget minus Total Billable Value minus Total Expenses.                                 |
| **Budget Health %**      | Automated formula: Remaining Budget ÷ Budget. Visible on the Projects page and project record.  |

***

## Make it yours

The Financials section works out of the box for most agencies. When you're ready to extend it:

* **Generate PDF invoices:** Connect DocsAutomator (native Noloco integration) to auto-generate branded invoice PDFs from your invoice records — Settings → Integrations → DocsAutomator.
* **Add per-expense markup:** Markup Percent and Billable Amount fields exist on expense records but are hidden by default. Unhide them in Build Mode if you bill expenses to clients at a marked-up rate.
* **Automate overdue alerts:** Use Noloco's Slack integration to send a message to your finance channel when an invoice becomes overdue — no more manual checking.
* **Connect Stripe** for client card payments directly from the portal.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full integrations guide.

***

## Tips

**Check the Revenue Dashboard weekly, not monthly.** The Outstanding by Client chart tells you who to chase before the overdue date arrives — proactive beats reactive.

**Understand the difference between billable value and revenue.** Team Billables shows what your time is worth. Client Invoices shows what you've charged. If the gap is growing, your pricing or invoicing cadence needs attention.

**Log expenses the same day.** Receipt uploads go cold fast — so do memories of what the expense was for. A 60-second expense log at the time of purchase saves 20 minutes of reconstruction later.

**Use Paid Invoices by Client (tab 2) for account reviews.** The pivot table shows you at a glance how much each client has paid, month by month. It's the fastest way to prepare for a renewal or upsell conversation.

***

## What's next?

With your financial tracking in place, set up your client-facing experience. Head to [Client Portal](/solutions/agency-os/client-portal) to see exactly what clients see — and how to configure their access.


# Client Portal

A branded, real-time view of project progress and invoices — built for your clients.

> The Client Portal gives your clients a professional, real-time window into their projects and invoices — without exposing a single piece of your internal data.

## What clients see

When a client logs in, they see four pages — and nothing else:

| Page                | What it shows                                   |
| ------------------- | ----------------------------------------------- |
| **Portal Home**     | Welcome page with action cards                  |
| **Projects**        | Their projects and tasks                        |
| **Tasks**           | Their tasks across all projects                 |
| **Client Invoices** | Their invoices — filtered to their company only |

Everything else in Agency OS — CRM, Team, Team Workload, Revenue Dashboard, Team Billables, Team Expenses, other clients' data, hourly rates, budget health figures — is completely hidden. Not just restricted. Not visible at all.

{% hint style="info" %}
**Use the portal in sales demos.** Before a prospect signs, show them what their client experience will look like. Seeing a branded, real-time project view is often what closes the deal. It signals that your agency is organised, transparent, and professional — before the work has even started.
{% endhint %}

***

## Portal Home

The Portal Home is the client's welcome page. It greets them by name and gives them three action cards to navigate from:

1. **View Projects** — "See the latest updates on the projects we're working with you"
2. **Pay Your Bills** — "View your past and upcoming invoices"
3. A third card for quick actions (configurable in Build Mode)

Below the action cards, clients see their ongoing tasks — a live snapshot of what your team is currently working on for them.

***

## Projects

Clients see a list of their projects — active, planned, and completed. Each project shows its name, status, timeline, and team.

Clicking into a project opens the project record, showing:

* Project details and description
* All tasks for this project, with status, assignee, priority, and due date
* **Reply comments** from your team (client-visible)
* **Not Notes** — internal comments are completely hidden

Clients can click into individual tasks to read full descriptions, see current status, and add their own Reply comments — questions, feedback, approvals.

**What clients can do:**

* View projects and tasks
* Add Reply comments on tasks
* See deliverables attached to tasks (File field)

**What clients cannot do:**

* Create or edit projects or tasks
* Change task status or assignments
* See internal Notes
* See any other client's data
* See team workload, rates, or budget health

***

## Client Invoices

Clients see their invoices in the Client Invoices page — filtered automatically to their company. They can view:

* Invoice status (Pending / Overdue / Paid)
* Full line item breakdown
* Due dates and amounts

If Stripe is connected, clients can pay directly from the portal. Set up in Settings → Integrations → Stripe.

***

## Granting portal access

### Step 1: Make sure the company is a Client

The client's Company record must have Status = "Client". If they came through CRM, this is already done when you won the deal.

### Step 2: Add the contact

On the Client record → Details tab → Contacts section, add the person who should have portal access. Their email address is required.

### Step 3: Invite them as a user

From the Contact record, invite them to Agency OS and assign the **Client** role. They'll receive an email with a login link.

The Client role is pre-configured — it restricts access to the portal pages only and filters all data to their company automatically.

### Step 4: Enable Google Sign In (recommended)

Clients can log in with their Google account — no separate password to manage. This reduces friction at onboarding and means clients don't abandon the portal because they forgot their password.

Set up in Settings → Integrations → Google Sign In.

### Step 5: Test before you send

Use **"View as \[Client Name]"** (click your profile icon → View as) to see Agency OS exactly as that client sees it. Check:

* Only their projects visible?
* Only their invoices visible?
* No internal Notes showing?
* No team cost data visible?

Only invite the client once you've confirmed everything looks right.

***

## Reply vs Note — the most important rule

Every comment in Agency OS is either a **Reply** (client-visible) or a **Note** (internal only). This distinction is what makes the portal safe to use.

**Use Reply for:**

* Progress updates ("The homepage design is ready for your review")
* Questions for the client ("Could you confirm the copy by Friday?")
* Deliverable notifications
* Responses to client questions

**Use Note for:**

* Internal team coordination
* Budget concerns
* Technical blockers
* Anything you wouldn't say directly to the client

{% hint style="warning" %}
**Always check before posting.** A Reply posted by mistake is visible to the client immediately. If it happens, edit or delete the comment as quickly as possible and switch to Note.
{% endhint %}

***

## Key concepts

| Concept            | How it works                                                                                  |
| ------------------ | --------------------------------------------------------------------------------------------- |
| **Data filtering** | Clients only see data linked to their company — automatic, no manual configuration per client |
| **Client role**    | Pre-configured permissions — view only, no editing, portal pages only                         |
| **Reply**          | Client-visible comment on a task or project                                                   |
| **Note**           | Internal-only comment — never visible to clients                                              |
| **Google Sign In** | Native integration — clients log in with their Google account                                 |

***

## Make it yours

The portal works securely out of the box. When you're ready to enhance it:

* **Add your branding:** Upload your agency logo, set brand colours, and add a custom domain (your-portal.youragency.com) in Settings → General.
* **Enable Google Sign In:** Reduce login friction for clients — Settings → Integrations → Google Sign In.
* **Customise the Portal Home:** In Build Mode, edit the welcome message, adjust the action cards, or add a meeting booking link.
* **Automate client notifications:** Use Noloco's Slack integration or Zapier/Make to email clients when a task is marked Done, or when a new invoice is available.

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide.

***

## Tips

**Set up the portal before the project kicks off, not after.** Sending a client their portal login on Day 1 sets the tone — it signals that your agency is organised and that they'll always know what's happening.

**Walk new clients through the portal in your kickoff call.** A 5-minute screen share ("here's where you'll see your tasks, here's where invoices live") means they'll actually use it. Clients who never log in don't get the benefit.

**Keep task statuses current.** The portal is only as useful as the data in it. A client who logs in and sees all tasks as "To Do" will go back to emailing for status updates.

**Test "View as" regularly.** Do a quick "View as" check before any client meeting or check-in — it takes 30 seconds and ensures you're not surprised by what they've been seeing.

***

## What's next?

With your client portal configured, explore how to tailor Agency OS to your agency's specific workflows. Head to [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide on Build Mode, integrations, and optional extensions.


# Customizing Your Agency OS

Make Agency OS fit your agency's workflows, terminology, and tools.

Agency OS comes with proven defaults that work on Day 1 — and Build Mode lets you adapt everything to your exact needs when you're ready. No code required.

## When to customise

{% hint style="success" %}
**Make it yours early.** Agency OS is designed to be customised. The sooner it reflects your terminology, your workflow, and your tools — the faster your team will adopt it. Start with the changes that matter most and build from there.
{% endhint %}

**Good places to start:**

* Rename pages to match your terminology ("Engagements" instead of "Projects")
* Hide pages your agency doesn't need
* Add fields specific to your service type or client mix
* Connect the tools you already use

{% hint style="info" %}
**Customise faster with AI.** Upload these guides to Claude, ChatGPT, or Gemini and ask for step-by-step help with any change. It's the fastest way to learn Build Mode without trial and error.
{% endhint %}

***

## Accessing Build Mode

1. Look for the **Build Mode** toggle in the bottom-left corner
2. Click to turn it on — the interface shows customisation options
3. Turn it off when you're done to return to normal use

In Build Mode you can: add/edit fields, create new tables, modify views and layouts, set up automations, configure permissions, and customise pages.

{% hint style="info" %}
**You can't break it.** Changes in Build Mode can be undone, and your data is always safe.
{% endhint %}

***

## Shaping Agency OS to fit your agency

Agency OS ships with every page you might need. That doesn't mean you have to use all of it. The fastest way to make the template feel like *your* system is to strip out what doesn't apply — before your team ever logs in.

All of this happens in the **left-hand panel in Build Mode**, which shows your full page structure at a glance. You can rename pages, reorder them by dragging, and hide or delete them in a few clicks.

**Hide vs. delete — which to use:**

* **Hide** — removes the page from navigation, data stays intact. You can unhide at any time. Use this when you're unsure.
* **Delete** — permanent. Use this only when you're certain a page doesn't apply to your agency.

When in doubt, hide. It costs nothing and keeps your options open.

**How to hide or delete a page:**

1. Turn on Build Mode (toggle, bottom-left)
2. In the left panel, hover over any page name
3. Click the **⋯ menu** that appears
4. Select **Hide** or **Delete**

To reorder, drag pages up or down in the left panel. The order here is what your team sees in navigation.

{% hint style="warning" %}
Some hidden pages exist to power click-through navigation inside the app — not everything in the hidden list is optional. If you're unsure what a page does, hide it rather than delete it.
{% endhint %}

***

## Common customisations

### 1. Adding custom fields

**On Projects:**

* Service line (Web, Branding, Marketing, Strategy)
* Lead source (Referral, Website, Event)
* Contract value
* Project risk level

**On Companies / Clients:**

* Account tier (Standard, Strategic, Enterprise)
* Annual contract value
* Decision maker

**On Tasks:**

* Difficulty level
* Design mockup URL
* GitHub issue link

**How to add a field:**

1. Build Mode → Data tab
2. Select the table (e.g. "Projects")
3. Click **+ New field**
4. Choose field type: Text, Number, Date, Single/Multiple select, Boolean, Relationship, Formula, and more
5. Configure name, required status, and default value
6. Save

### 2. Customising task workflow stages

The default workflow is: **To Do → In Progress → Done**

Common custom workflows:

**Design agency:**

```
Backlog → Design → Client Review → Revisions → Approved → Done
```

**Development agency:**

```
Backlog → In Development → Code Review → QA → Client UAT → Deployed
```

**Marketing agency:**

```
Planned → In Progress → Review → Client Approval → Published
```

How to customise: Build Mode → Data tab → Tasks table → Status field → edit options (add, rename, reorder, set colours).

### 3. Creating custom dashboards

Build dashboards for different roles:

**Finance dashboard:**

* Revenue collected vs outstanding
* Invoice status breakdown
* Overdue invoices by client

**Project manager dashboard:**

* Active projects by health status
* Team workload summary
* Upcoming deadlines

How to create: Build Mode → create new page → add components (charts, stat cards, tables, pivot tables) → configure filters and data sources → set role-based visibility.

### 4. Adding new tables

Create tables for data not covered by defaults:

**Retainers table:** Client, Monthly Amount, Start Date, End Date, Status, Services Included

**Contracts table:** Client, Contract Start/End, Signed Document (file), Renewal Date

**Deliverables table:** Project, Deliverable Name, Due Date, Status, File, Client Approval

How to create: Build Mode → Data tab → + New table → add fields → create relationships to existing tables → add pages to display the data → set permissions.

### 5. Setting up automations

Build Mode → Workflows → + New workflow.

**Trigger options:** Record created, record updated, field changed, scheduled (time-based), on-demand (manual button).

**Action options:** Send email, create/update record, send webhook, send Slack message, run AI action.

**Common automations to build:**

* New Project created → notify delivery team in Slack + create standard initial tasks
* Task completed → notify project manager
* All tasks done → email client requesting feedback
* Payment overdue → send reminder + escalate to account manager after 14 days
* Company Status → Client → send welcome email + create onboarding project

***

## Optional extensions

These features exist in the template but are turned off by default to keep the experience clean on Day 1. Enable them when you need them.

| Extension                    | How to enable                                                                       | When to use                                                                       |
| ---------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| **Departments page**         | Build Mode → left panel → unhide                                                    | When you need to organise team by function (Creative, Dev, Ops, etc.)             |
| **Offices page**             | Build Mode → left panel → unhide                                                    | Multi-location or hybrid agencies                                                 |
| **Per-expense markup**       | Build Mode → Expenses table → unhide Markup Percent and Billable Amount fields      | If you bill expenses to clients at a marked-up rate                               |
| **Project Brief field**      | Build Mode → Projects table → add long text field                                   | Store scope documents directly on the project record                              |
| **Gantt views**              | Build Mode → Projects or Tasks view → Display → Timeline → set Layout type to Gantt | When you need to show task dependencies and shift schedules across a project plan |
| **Leave / absence tracking** | Add a custom table, or integrate with an HR tool via Zapier/Make                    | When you need to track PTO and absences                                           |
| **Hiring / recruitment**     | Use Projects + Tasks (create a project per role, tasks = candidates)                | Lightweight hiring pipeline without a separate ATS                                |

***

## Integrations

Noloco connects to the tools your agency already uses. Because Agency OS is built on a no-code platform, every integration is configurable without writing a single line of code — you decide what connects, what triggers what, and how data flows between systems.

### Native integrations — connect in Settings

These plug directly into Noloco. No middleware needed. Set them up in **Settings → Integrations**.

| Integration        | What it does for your agency                                                                                                                    |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Slack**          | Send automatic alerts to your team — deal won, budget warning, invoice overdue. Keeps your team informed without checking Agency OS constantly. |
| **DocsAutomator**  | Generate branded invoice PDFs, proposals, or reports directly from your Agency OS data.                                                         |
| **OpenAI**         | Power AI features inside your app — auto-summarise meeting notes, draft interaction summaries, enrich company data.                             |
| **Google Sign In** | Let clients log into the Client Portal using their Google account — no separate password needed. Reduces friction at client onboarding.         |
| **Stripe**         | Connect Stripe to manage invoices and accept card payments directly from Agency OS. Clients can pay from the portal.                            |

### Workflow orchestrators — connect via Zapier, Make, or n8n

This is where Agency OS becomes a true operations hub. Zapier, Make, and n8n act as the connective tissue between Noloco and the rest of your tech stack — triggering actions across tools whenever something happens in Agency OS, and vice versa. No engineering required.

**What this unlocks in practice:**

| Integration                 | What it does                                                                                    | Recipe                                                       |
| --------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| **Google Calendar**         | Auto-log client meetings as Interactions in your CRM. No manual entry needed.                   | Calendar event → create Interaction in Noloco                |
| **Gmail / Outlook**         | Auto-log important client emails as Interactions. Filter by label so only relevant emails sync. | Email received → create Interaction in Noloco                |
| **Google Drive / OneDrive** | Auto-create a project folder when a new Project is created, and link it back to the record.     | New Project → create Drive folder → write URL back to record |

These three are just starting points. Agencies use the same pattern to auto-create onboarding tasks when a deal closes, sync project status to client Slack channels, push invoice data to accounting tools, or trigger internal reviews at project milestones. The logic lives in your workflow orchestrator; Agency OS is the system of record it reads from and writes to.

### Data source connections

If your agency already runs on Airtable, Google Sheets, SmartSuite, or HubSpot, Noloco can sync those directly as a data source. That means you can run Agency OS on top of your existing data — no re-entry, no migration headache.

{% hint style="info" %}
**Already have your client data in Airtable or Google Sheets?** Connect it as a data source and skip the import entirely. Ask the Noloco team during your onboarding call.
{% endhint %}

***

## Permissions and roles

Beyond the default roles (Admin, Team Member, Client), create specialised roles:

**Finance role:**

* Access to Financials section
* View all client data
* No access to Team Cost tab (or set as read-only)

**Freelancer / Contractor role:**

* See only their assigned tasks
* Log time
* No access to other projects, team data, or financials

**Client Admin role:**

* Full portal access for their company
* Can invite additional portal users

How to create: Settings → Roles → + New role → configure table-level, record-level, and field-level permissions → save → assign to users.

***

## Branding

**Logo:** Upload your agency logo — appears in the top-left corner and in the Client Portal. Settings → General → Custom Logo.

**Theme:** Set primary colour, background colours, and font. Settings → Theme & Design.

**Custom domain:** Use your own URL (portal.youragency.com) for a fully branded client experience. Settings → Custom Domain.

**Email branding:** Customise email templates and add your agency footer. Settings → Email Settings.

***

## Advanced customisations

Once the basics are in place, Noloco's more powerful features let you turn Agency OS into a genuinely intelligent system — one that calculates, connects, and responds to your data automatically.

### Formulas and calculations

Formula fields let you create calculated values that update automatically as your data changes. You define the logic once, and Noloco does the rest.

**What you can calculate:**

* **Project profitability** — `Revenue - (Time Cost + Expenses)` — know your margin on every project without a spreadsheet
* **Days until due** — `Due Date - Today()` — always know what's coming up
* **Hourly blended rate** — `Fixed Price / Estimated Hours` — useful for benchmarking against actuals

Formulas use standard logic: add, subtract, multiply, divide, compare dates, combine text, and apply IF conditions. Build Mode → Data tab → select a table → + New field → Formula.

### Linking data across tables (Lookups and Rollups)

This is where Agency OS starts to feel truly connected. Rather than re-entering data, you pull it from where it already lives.

**Lookups** pull a single value from a related record:

* Show the Client name on a Task (via Project → Client) — so your team always knows who the work is for
* Pull the Project Manager's email onto an invoice for automated notifications

**Rollups** summarise multiple related records into one number:

* Total logged hours across all time entries on a project
* Count of open tasks per project
* Sum of all invoice values per client

Both are set up in Build Mode → Data tab → select a table → + New field → Lookup or Rollup → choose the related table and the field to pull or summarise.

### Conditional visibility

Control what people see based on the state of the data — keeping interfaces clean and relevant.

* Only show an "Overdue reason" field when Status = Overdue
* Only show "Contract end date" when Engagement Type = Retainer
* Hide internal cost fields from any client-facing view

Set up in Build Mode → select a field → Conditional visibility → define the rule.

{% hint style="info" %}
**Advanced customisations are where AI assistance pays off most.** Formulas, lookups, and rollup logic can get complex quickly. Paste your question into Claude, ChatGPT, or Gemini — describe what you want to calculate or connect — and get the exact steps and formula syntax to copy in.
{% endhint %}

***

## Customisation best practices

**Start with what matters most.** Rename, hide, and connect before adding net-new fields or tables. Quick wins build momentum.

**Test before rolling out.** Use "View as" to check client views after any change. Try customisations on real data before announcing them to the team.

**Document what you change.** Keep a note of what you customised, why, and when. Makes it easier to onboard new admins and revert if something doesn't work.

**Train your team on changes.** Announce significant changes in advance, provide a quick walkthrough, and give the team time to adjust.

***

## Getting help with customisation

* **Nola AI Assistant** — ask Nola to help: "Add a field for project margin" or "Create a workflow to notify on overdue tasks"
* **Noloco documentation** — detailed guides for every feature
* **Onboarding call** — [schedule support with the Noloco team](https://noloco.io/onboarding)
* **In-app chat** — contact Noloco support at any time

{% hint style="info" %}
**Use AI as your personal Noloco coach.** Create a project in Claude or ChatGPT, upload these guides as context files, and ask anything — step-by-step instructions for specific changes, how to set up a workflow, what fields to add for your use case, and more. The more guides you upload, the more precise the guidance. It won't click the buttons for you, but it'll tell you exactly where to click.
{% endhint %}

***

## Your agency, your OS

Agency OS is ready to use on Day 1 — but the real power is what you build with it over time. Every page, field, workflow, and integration is configurable in Build Mode without touching code. Rename things to match your language, connect the tools you already rely on, automate the tasks you do every week, and build the views your team actually needs.

Import your data. Customise anything. Connect your stack. What you build with it is entirely up to you.


# Best Practices

Tips, workflows, and lessons learned from agencies successfully using Agency OS

Learn from agencies already using Agency OS. This guide shares proven strategies, common pitfalls to avoid, and tips for getting maximum value from your system.

## Getting Started Right

### Week 1: Learn & Explore

**Don't rush to production**. Take time to understand the system:

✅ **Do:**

* Complete the "Your First Steps" tutorial
* Explore all sections with sample data
* Click through every page
* Test the "View as" feature
* Try creating test records

❌ **Don't:**

* Delete all sample data immediately
* Start customizing before understanding defaults
* Invite real clients in first week
* Import all your data on day one

**Goal**: Understand how Agency OS works before using it for real.

### Week 2-3: Soft Launch

**Start using alongside existing tools**:

✅ **Do:**

* Add 2-3 real clients
* Create current active projects
* Start logging time
* Have team create and update tasks
* Run both systems in parallel

❌ **Don't:**

* Abandon old system completely
* Expect perfection immediately
* Force everyone to use it
* Get frustrated with learning curve

**Goal**: Build confidence while maintaining safety net.

### Week 4: Go Live

**Make Agency OS primary system**:

✅ **Do:**

* Announce official launch to team
* Retire old project tracking
* Invite first friendly client to portal
* Establish daily habits (check tasks, log time)
* Celebrate early wins

❌ **Don't:**

* Keep maintaining two systems
* Let people opt out
* Skip training stragglers
* Ignore feedback

**Goal**: Full commitment and adoption.

## Team Adoption

### Making It Sticky

**Morning Standup in Agency OS:**

* Start meetings with Home → My Work tab
* Review Task Summary KPIs and My Tasks
* Update statuses live during meeting
* Makes Agency OS the daily habit

**Replace Slack for Project Updates:**

* Use task comments instead of Slack threads
* Context stays with the work
* Searchable history
* Clients can see (when using Reply)

**Make Time Tracking Non-Negotiable:**

* Daily expectation, not weekly
* Start/stop timers in real-time
* Review at end of day
* Tied to invoicing and profitability

**Celebrate Portal Wins:**

* When client praises portal, share with team
* When status email avoided, highlight it
* Track metrics: logins, comments, satisfaction
* Show ROI of adoption

### Common Objections & Solutions

**"It's another tool to check"** → *Make it THE tool, not another tool*

* Morning standup starts here
* All project info lives here
* No need to check multiple places

**"Takes too long to update"** → *Use action buttons for speed*

* "Start" button = one click to update status
* Time tracker = auto-logging
* Comments = faster than email threads

**"I prefer spreadsheets"** → *Show the power*

* Relationships between data (not copy/paste)
* Real-time updates (not stale exports)
* Client portal (can't do that in sheets)
* Filtering and views (more flexible than sheets)

**"Clients won't use the portal"** → *Train them well*

* Start with one friendly client
* Short walkthrough call
* Quick wins (they see progress immediately)
* Gentle nudging ("I've updated your portal!")

### Training Resources

**Create:**

* 10-minute walkthrough video
* One-page quick reference
* GIFs for common tasks
* FAQ document

**Assign Champions:**

* One per team/department
* They learn deeply and help others
* First line of support
* Gather feedback

**Regular Check-ins:**

* First month: Weekly team Q\&A
* Office hours for questions
* Share tips in team chat
* Update training based on questions

## Data Hygiene

### Daily Habits

**Update Status in Real-Time:**

* Move task to "In Progress" when you start
* Mark "Done" when finished
* Don't wait until end of day
* Keeps everyone informed

**Log Time Immediately:**

* Start timer when beginning work
* Stop when switching tasks
* Log manually if you forgot
* Don't try to remember Friday what you did Monday

**Add Context to Comments:**

* Explain the "why" not just "what"
* Add enough detail for others
* Use Reply for client-visible updates
* Use Note for internal coordination

### Weekly Habits

**Review Your Tasks:**

* Check upcoming due dates
* Identify blockers
* Request help if overloaded
* Update estimates if needed

**Update Project Health:**

* Review project progress
* Update Project Health badge (On Track / Needs Attention / Critical)
* Check Budget Health % on active projects
* Communicate changes to clients via Reply

**Client Portal Check:**

* Use "View as" for each active client
* Check for unanswered Reply comments
* Ensure nothing looks stale
* Update before client meetings

**Archive Completed Items:**

* Mark projects as "Completed"
* Keep completed tasks — don't delete
* Maintain clarity in active views

### Monthly Habits

**Deep Clean:**

* Review overdue tasks (close or reschedule)
* Update company statuses where needed (Client, Past Client, Lost)
* Check for duplicate contacts
* Review and clean up expense categories

**Data Audit:**

* Ensure all projects linked to clients with an Engagement Type set
* Verify time entries linked to tasks
* Check that team Hourly Rates are current
* Fix any data quality issues

**Workflow Review:**

* Are automations working?
* Any errors in workflows?
* New automations needed?
* Retire unused automations

## Naming Conventions

Consistency makes everything easier to find and understand:

### Projects

**Format**: `[Client Name] - [Project Type]`

✅ Good:

* "Acme Corp - Website Redesign"
* "TechStart - Brand Identity"
* "LocalCafe - Monthly Retainer - Q1 2025"

❌ Avoid:

* "Website" (which client?)
* "Project 1" (meaningless)
* "The new site for Acme" (too verbose)

### Tasks

**Format**: `[Verb] [Object/Deliverable]`

✅ Good:

* "Design homepage mockup"
* "Write blog post about AI"
* "Review contract with legal"
* "Deploy production update"

❌ Avoid:

* "Homepage" (what about it?)
* "Work on the thing" (what thing?)
* "URGENT!!!" (use the Priority field)

### Deals

**Format**: `[Company] — [Deal Description]`

✅ Good:

* "Beacon Digital — Q2 Retainer Renewal"
* "TrueNorth — Employer Brand Refresh"

❌ Avoid:

* "New deal" (for which company?)
* "Website project" (which client, which project?)

### Interactions

**Format**: `[Company] — [Deal Name] - [type]`

✅ Good:

* "Beacon Digital — Q2 Retainer Renewal - call"
* "TrueNorth — Brand Refresh - email"

## Communication Best Practices

### Internal Team Communication

**Use Notes for:**

* Technical discussions
* Budget concerns
* Timeline worries
* Strategy questions
* Team coordination

**Use Reply for:**

* Updates on progress
* Questions for the client
* Deliverable ready notifications
* Responses to client questions

{% hint style="warning" %}
**Default to Note**: When in doubt, use Note. You can't unsend a Reply that clients see.
{% endhint %}

### Client Communication

**Proactive Updates:**

* Don't wait for clients to ask
* Update portal regularly
* Use Reply at milestones
* Keep them informed

**Response Times:**

* Reply to portal comments within 24 hours
* Set expectations clearly
* Use email for truly urgent issues
* Portal for everything else

**Training Clients:**

* Walk them through on kickoff call
* Send quick reference guide
* Reply to first portal comment quickly
* Gently redirect email questions to portal

**Sample Redirect:** *Client emails: "What's the status on the homepage?"*

Your reply:

> "Great question! I've updated your portal with the latest progress. The homepage design is 80% complete and on track for Friday. You can see all the details here: \[link to portal]
>
> Feel free to add any questions directly on the task and I'll respond there so we keep all the context in one place!"

## Workflow Optimization

### Automate as you go

Agency OS connects to Noloco's native integrations (Slack, DocsAutomator, OpenAI, Stripe, Google Sign In) and to automation tools like Zapier, Make, and n8n for custom workflows.

Start with the highest-impact automations first:

**High value, quick to set up:**

* Slack notification when a deal is won
* Slack alert when Budget Health % drops below a threshold
* Email client when invoice is overdue

**Add next:**

* Auto-create a Google Drive folder when a new project is created
* Auto-log Gmail / Google Calendar activity as Interactions in CRM
* Weekly project summary email to clients

**Level up later:**

* Monthly recurring invoice generation
* New lead → notify sales team in Slack
* All tasks complete → request client feedback

See [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full integrations guide.

## Measuring Success

### Efficiency Metrics

**Track:**

* Time from project start to completion
* Number of "status update" emails (should decrease)
* Client portal login frequency
* Time logged per project vs estimated

**Targets:**

* Significant reduction in status emails
* 70%+ clients logging in monthly
* 90%+ of time logged within 24 hours
* Estimates within 20% of actuals

### Quality Metrics

**Track:**

* On-time delivery rate
* Client satisfaction scores
* Number of revisions per deliverable
* Scope creep incidents

### Financial Metrics

**Track:**

* Days sales outstanding (DSO)
* Project profitability (Budget Health % across active projects)
* Team Billables vs invoiced revenue
* Revenue by engagement type (Revenue Dashboard)

## Common Pitfalls to Avoid

### 1. Over-customising too early

❌ **Mistake**: Spending weeks customising before first project

✅ **Better**: Use defaults for 2-4 weeks, then customise based on real needs

### 2. Not testing "View as" before inviting clients

❌ **Mistake**: Giving clients access before testing with "View as"

✅ **Better**: Always test the client view thoroughly before sending an invite

### 3. Forgetting Reply vs Note

❌ **Mistake**: Writing "Client is being difficult" in a Reply comment

✅ **Better**: Always double-check before commenting. Default to Note.

### 4. Inconsistent time tracking

❌ **Mistake**: Trying to remember all hours on Friday

✅ **Better**: Start/stop timer in real-time, or log daily from Home → My Time

### 5. Tasks without due dates

❌ **Mistake**: Creating tasks with no due date set

✅ **Better**: Due dates are required — they power the Team Workload overdue view and the Missing Due Date KPI on Home

### 6. Poor task breakdown

❌ **Mistake**: Tasks like "Build entire website" (never gets completed)

✅ **Better**: "Design homepage", "Code navigation", "Add contact form" (specific, achievable)

### 7. Inviting all clients at once

❌ **Mistake**: 20 clients get portal access on the same day

✅ **Better**: Start with 1-2 friendly clients, perfect the process, then roll out

### 8. Stale Hourly Rates

❌ **Mistake**: Not updating team Hourly Rates when rates change

✅ **Better**: Update rates in the Team Cost tab whenever they change — stale rates mean inaccurate Budget Health % across every project

### 9. Abandoning too quickly

❌ **Mistake**: "This isn't working after 3 days"

✅ **Better**: Commit to a 30-day trial, address issues, iterate

### 10. Not celebrating wins

❌ **Mistake**: Taking adoption for granted

✅ **Better**: Recognise team members using it well, share client praise, highlight status emails avoided

## Scaling your Agency OS

### 5-10 people

**Focus on:**

* Basic structure works perfectly
* Simple workflows
* Clear communication habits
* Consistent time logging

### 10-25 people

**Add:**

* More granular project ownership (Lead field)
* Team Workload reviews in weekly standups
* Stricter naming conventions
* More automations

**Consider:**

* Enabling the Departments page (Build Mode → Navigation) to organise the team by function
* Dedicated person responsible for Agency OS admin

### 25-50+ people

**Implement:**

* Full department structure (unhide Departments in nav)
* Offices page if multi-location (unhide in nav)
* Advanced role customisation
* Resource capacity planning using Team Workload
* Integration with accounting software

## Tips from successful agencies

### "Start with Projects Only"

*Sarah, 15-person design agency*

> "We ignored CRM for the first month. Just focused on delivering projects well. Once that was solid, we added sales tracking. Trying to do everything at once was overwhelming."

### "Champion the Portal"

*Michael, 30-person development agency*

> "Our account managers became portal evangelists. When clients emailed for status, they'd reply: 'I've answered in your portal at \[link].' Took 2 months, but now clients check the portal first."

### "Make Time Tracking Non-Negotiable"

*Jessica, 20-person marketing agency*

> "We made time tracking mandatory from day one. Now we actually know which clients and project types are profitable. Game changer for pricing."

### "Portal = Competitive Advantage"

*Chris, 40-person digital agency*

> "We demo the client portal during sales pitches. Prospects see transparency and professionalism other agencies don't offer. It's closed multiple deals."

### "Customise Your Language"

*Amanda, 12-person branding agency*

> "We renamed 'Projects' to 'Engagements' to match how we talk. Small change, but the team adopted much faster when it felt like ours."

## Your first 90 days

### Days 1-7: Foundation

* [ ] Create your Agency OS account
* [ ] Complete the "Your First Steps" tutorial
* [ ] Explore all sections with sample data
* [ ] Invite your core team
* [ ] Set up basic branding

### Days 8-30: Real data, real habits

* [ ] Add 2-3 current clients and projects
* [ ] Start logging time daily
* [ ] Run morning standups from Home → My Work
* [ ] Train all team members
* [ ] Delete sample data when ready

### Days 31-60: Client portal

* [ ] Invite first friendly client
* [ ] Get feedback and refine
* [ ] Roll out to 3-5 more clients
* [ ] Track portal adoption
* [ ] Redirect email status questions to portal

### Days 61-90: Optimise & scale

* [ ] Set up key automations (Slack, calendar sync, invoice alerts)
* [ ] Add custom fields as real needs emerge
* [ ] Retire old systems completely
* [ ] Plan continued improvements

## Getting help

* **Nola AI Assistant** — ask Nola to help you navigate or customise
* **These guides** — comprehensive coverage of every section
* **Book a call** — [schedule onboarding support with the Noloco team](https://noloco.io/onboarding)
* **In-app chat** — contact Noloco support at any time

## What's next?

Ready to extend and connect Agency OS to your existing tools? Head to [Customising Your Agency OS](/solutions/agency-os/customizing-your-agency-os) for the full guide on Build Mode, integrations, and optional extensions.


# Intro to Data & Tables

Data is the foundation on which your Noloco app is built.

Noloco was designed to make it possible for anyone to build internal tools without needing to be a highly skilled software engineer.

However, even app no-code apps need some data to start with. This is why you can connect your Noloco app to several different data sources. We like to say that Noloco is a backend agnostic platform - ultimately helping our customers build internal tools from any data source without writing a single line of code.

If your data is already set up in one of our supported data sources, you can simply connect that and build your app. Otherwise, if you're yet to set up a database elsewhere, you can build out your database directly in Noloco without writing any code using [Noloco tables](/data/collections).

If you're new to databases and tables, check out our [What are Tables?](/data/data-overview/what-are-tables) guide to understand the fundamentals.

If you'd like to connect a data source that we don't yet support, please do get in touch! We'd love to hear about your use case.

Read our guides below on how to connect each of our available data sources to your Noloco app.

{% hint style="info" %}
**Create a single source of truth in Noloco 🤩**

The great news is that we support multiple external data sources connections in one app. For example, If your team is using a mix of PostgreSQL & Google Sheets to store data, you can connect your app to both of these data sources enabling your team to access disconnected data from one central place.
{% endhint %}

{% content-ref url="/pages/pu7KErCHn9rJQFAid7IO" %}
[Airtable](/data/airtable)
{% endcontent-ref %}

{% content-ref url="/pages/ZQxfvf9n0hOgQen1Rlow" %}
[Google Sheets](/data/google-sheets)
{% endcontent-ref %}

{% content-ref url="/pages/ACp3zNSw70F23qPxXOvS" %}
[MySQL](/data/mysql)
{% endcontent-ref %}

{% content-ref url="/pages/RhbCG0xEJTTOVWEPl2iZ" %}
[PostgreSQL](/data/postgresql)
{% endcontent-ref %}

{% content-ref url="/pages/-MiftzQcOGORhPFIqwEf" %}
[Noloco Tables](/data/collections)
{% endcontent-ref %}

{% content-ref url="/pages/wsGeOUmOD0eo3KPspmvZ" %}
[Xano](/data/xano)
{% endcontent-ref %}

## Choosing which of your tables are synced

When you connect an external data source to Noloco you will be able to select which tables Noloco will import and keep in sync. Toggling off unneeded tables may improve sync times and will help keep your app from getting too cluttered to manage.

<figure><img src="/files/50dvIj5Ihh2ahHB2w8XF" alt="" width="563"><figcaption><p><br>Tables can be disabled when first connecting a data source to avoid them ever being synced.</p></figcaption></figure>

<figure><img src="/files/hJjeC4Opyq0mh8dnb7s8" alt="" width="330"><figcaption><p><br>Tables can also be disabled at any point in the future from the data page.</p></figcaption></figure>

After disabling a table it will no longer be synced into Noloco and you will not see it as an option when building views around your data.

To re-enable a disabled table:

1. Click on the hamburger menu
2. Select ***Enable tables***
3. Toggle on the slider next to the table and click on ***Done***

<figure><img src="/files/jq2DjwbVNOQSZFBQW0t1" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/fmmYcsVQGaRynDEMWptk" alt="" width="375"><figcaption><p><br>Disabled tables can be re-enabled from the data source menu on the data page.</p></figcaption></figure>


# What are Tables?

A table is like the brain of your app. It keeps everything organized behind the scenes so your users see the right things at the right time. If you're building something like a client portal, CRM, or inventory tracker, you'll need an easy way to store and manage your data—that's where tables come in.

## Why do you need tables?

Imagine your app is a filing cabinet. Without folders and labels, it would be chaos. A table works the same way—it helps you store your information in a clear, structured way.

Here's why it matters:

* **Keeps things organized**: You can track people, products, tasks—whatever your app needs.
* **Shows the right info to the right user**: For example, a client only sees their own projects.
* **Updates automatically**: When someone adds or changes something, your app reflects it right away.

Starting with tables helps you figure out what kinds of information your app needs, how different pieces connect, and how they'll change over time.

## Tables, Records, and Fields

Tables are actually pretty simple once you break them down:

* **Tables**: Think of these as folders. Each table holds a group of similar items, like a list of customers or products.
* **Records**: These are individual items in your table. One customer = one record.
* **Fields**: These are details about each item. A customer might have a name, email, and company name.

You can mix and match different [field types](/data/collections/field-types)—like text, numbers, dates, and even images—to match your app's needs.

## Linked (Related) Records

Let's say you have two tables for your business:

* One lists your customers
* The other lists the orders they've placed

Now you want to know:

👉 Which customers placed which orders?

👉 And which orders belong to which customers?

That's where [linked records](/data/collections/relationships) (also called relationships) come in. They let your tables talk to each other so you can connect the dots without copying and pasting the same info everywhere.

Instead of managing scattered bits of data, linked records help you build a clear, connected view of your work. For example:

* On a customer's record, you can instantly see all their past orders
* On an order's record, you can check which customer placed it and when

Learn more about [relationships](/data/collections/relationships), [rollup fields](/data/collections/rollups), and [lookup fields](/data/collections/lookup-fields).

## CRM Database Example

Here is an example of a database structure for a simple CRM. This setup lets you track companies, contacts, and deals all in one place.

**Tables:**

* **Companies**
  * Fields: Company Name, Industry, Website, Contacts (Linked to Contacts table)
* **Contacts**
  * Fields: Full Name, Email, Phone Number, Company (Linked to Companies table), Deals (Linked to Deals table)
* **Deals**
  * Fields: Deal Name, Value, Status, Close Date, Contact (Linked to Contacts table)

If you have not created a structured database yet, we recommend first defining the database structure before you start building it, so you can consider what information you want to display to your users and what tables and fields you will need.

## Tracking Changes

Every change made to a record is automatically tracked — who made it, when, and exactly what changed. This gives you a full history of your data over time, whether a change was made by a user, a workflow, or an external sync.

You can view this history from any record in the data table, or see a full log of all changes across an entire table. Learn more in [Record History](/data-management/record-history).

## What data sources should you use?

You can set up your database in different ways depending on what works best for you:

* **Noloco Tables**: Easy to use, built right into your app, and great for performance. Perfect if you're starting from scratch.
* **External data sources**: Already using tools like [Airtable](/data/airtable), [Google Sheets](/data/google-sheets), [PostgreSQL](/data/postgresql), or [MySQL](/data/mysql)? You can connect those to Noloco right away. [Explore available data sources](/data/data-overview).
* **Multiple sources**: You don't have to restrict yourself to one database; you can connect different data sources to bring all your data into one place.

**Tip**: If you want to streamline your app and data storage in one tool, you can [import your data](/data/collections/import-a-file) into Noloco Tables and store it all in one place.


# Database Examples for Beginners

If you're coming from Excel or Google Sheets, thinking about databases might feel a bit different at first. In a spreadsheet, you might put everything in one big sheet with lots of columns. But with a database, you split your information into multiple tables and connect them together using **relationships** (also called linked records or foreign keys).

## Why use a database instead of a spreadsheet?

Databases offer several key advantages over spreadsheets:

* **Typed columns prevent errors**: Each field has a specific type ([Date](/data/collections/field-types/date), [Number](/data/collections/field-types/number-integer), [Email](/data/collections/field-types/text), etc.), so you can't accidentally enter "abc" in a number field or an invalid date format.
* **Linked records eliminate duplication**: Instead of copying customer details across hundreds of rows, you store them once and link to them. Update once, see the change everywhere.
* **Consistent formulas**: [Formula fields](/data/collections/formulas) and [Rollup fields](/data/collections/rollups) automatically calculate across all records. No more copying formulas down and accidentally breaking them.
* **Better data validation**: Set rules for what data can be entered (e.g., [Single Select](/data/collections/field-types/single-option-select) fields ensure consistent categories, no more "High", "high", and "HIGH" variations).
* **Powerful filtering and permissions**: Show different users different data based on [permissions](/users-and-permissions/user-roles-and-permissions) without creating separate copies of your data.
* **Scalability**: Databases handle thousands of records efficiently, while large spreadsheets become slow and difficult to manage.

This guide will walk you through three common examples to help you understand how to structure your data in Noloco.

## Why split data into multiple tables?

In Excel, you might have a sheet that looks like this:

| Client Name | Client Email     | Project Name     | Project Status | Project Deadline |
| ----------- | ---------------- | ---------------- | -------------- | ---------------- |
| Acme Corp   | <john@acme.com>  | Website Redesign | In Progress    | 2024-03-15       |
| Acme Corp   | <john@acme.com>  | Mobile App       | Planning       | 2024-06-01       |
| TechStart   | <sarah@tech.com> | Logo Design      | Completed      | 2024-01-20       |

Notice how "Acme Corp" and "<john@acme.com>" are repeated? If John changes his email, you'd have to update it in multiple rows. That's where databases shine—you can split this into two tables and link them.

**The database way:**

**Clients Table:**

| Name      | Email            |
| --------- | ---------------- |
| Acme Corp | <john@acme.com>  |
| TechStart | <sarah@tech.com> |

**Projects Table:**

| Project Name     | Status      | Deadline   | Client (linked) |
| ---------------- | ----------- | ---------- | --------------- |
| Website Redesign | In Progress | 2024-03-15 | → Acme Corp     |
| Mobile App       | Planning    | 2024-06-01 | → Acme Corp     |
| Logo Design      | Completed   | 2024-01-20 | → TechStart     |

Now John's email exists in just one place. If it changes, you update it once and all related projects automatically reflect the change.

***

## Example 1: CRM (Customer Relationship Management)

A CRM helps you track companies, contacts, and sales deals. Here's how to structure it:

### Tables you'll need:

#### 1. **Companies** Table

This is where you store information about each company you work with.

**Fields:**

* **Company Name** ([Text](/data/collections/field-types/text))
* **Industry** ([Single Select](/data/collections/field-types/single-option-select): Technology, Healthcare, Finance, etc.)
* **Website** ([Text](/data/collections/field-types/text))
* **Notes** ([Long Text](/data/collections/field-types/text))
* **Contacts** ([Linked](/data/collections/relationships) to Contacts table - allows multiple)

#### 2. **Contacts** Table

This stores individual people at each company.

**Fields:**

* **Full Name** ([Text](/data/collections/field-types/text) or [Full Name field](/data/collections/field-types/full-name))
* **Email** ([Text](/data/collections/field-types/text))
* **Phone Number** ([Phone Number field](/data/collections/field-types/phone-number))
* **Job Title** ([Text](/data/collections/field-types/text))
* **Company** ([Linked](/data/collections/relationships) to Companies table - single link)
* **Deals** ([Linked](/data/collections/relationships) to Deals table - allows multiple)

#### 3. **Deals** Table

This tracks sales opportunities.

**Fields:**

* **Deal Name** ([Text](/data/collections/field-types/text))
* **Value** ([Number - Decimal](/data/collections/field-types/number-decimal))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): Prospecting, Proposal, Negotiation, Closed Won, Closed Lost)
* **Close Date** ([Date](/data/collections/field-types/date))
* **Contact** ([Linked](/data/collections/relationships) to Contacts table - single link)
* **Company** ([Lookup](/data/collections/lookup-fields) from Contact → Company)

### How the relationships work:

1. **Companies ↔ Contacts**: One company can have many contacts. Each contact belongs to one company.
2. **Contacts ↔ Deals**: One contact can have many deals. Each deal is associated with one primary contact.
3. **Companies ← Deals**: Using a [Lookup field](/data/collections/lookup-fields), you can automatically show which company a deal belongs to by looking through the contact.

### Why this structure works:

* If a contact changes companies, you update one field
* You can see all contacts at a company instantly
* You can see all deals for a specific contact or company
* You can use [Rollup fields](/data/collections/rollups) to calculate total deal value per company

***

## Example 2: Project Management Tool

A project management tool helps teams track projects, tasks, and who's working on what.

### Tables you'll need:

#### 1. **Projects** Table

**Fields:**

* **Project Name** ([Text](/data/collections/field-types/text))
* **Description** ([Long Text](/data/collections/field-types/text))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): Planning, Active, On Hold, Completed)
* **Start Date** ([Date](/data/collections/field-types/date))
* **End Date** ([Date](/data/collections/field-types/date))
* **Project Manager** ([Linked](/data/collections/relationships) to Team Members table - single link)
* **Tasks** ([Linked](/data/collections/relationships) to Tasks table - allows multiple)

#### 2. **Tasks** Table

**Fields:**

* **Task Name** ([Text](/data/collections/field-types/text))
* **Description** ([Long Text](/data/collections/field-types/text))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): To Do, In Progress, Review, Done)
* **Priority** ([Single Select](/data/collections/field-types/single-option-select): Low, Medium, High, Urgent)
* **Due Date** ([Date](/data/collections/field-types/date))
* **Project** ([Linked](/data/collections/relationships) to Projects table - single link)
* **Assigned To** ([Linked](/data/collections/relationships) to Team Members table - single link)
* **Time Estimate** ([Duration field](/data/collections/field-types/duration): hours)
* **Subtasks** ([Linked](/data/collections/relationships) to Tasks table - allows multiple, links to same table)

#### 3. **Team Members** Table

**Fields:**

* **Name** ([Text](/data/collections/field-types/text) or [Full Name field](/data/collections/field-types/full-name))
* **Email** ([Text](/data/collections/field-types/text))
* **Role** ([Single Select](/data/collections/field-types/single-option-select): Designer, Developer, Manager, etc.)
* **Projects** ([Linked](/data/collections/relationships) to Projects table - allows multiple)
* **Tasks** ([Linked](/data/collections/relationships) to Tasks table - allows multiple)

### How the relationships work:

1. **Projects ↔ Tasks**: One project has many tasks. Each task belongs to one project.
2. **Team Members ↔ Projects**: Team members can work on multiple projects. Projects can have multiple team members.
3. **Team Members ↔ Tasks**: Team members can be assigned to multiple tasks. Each task is assigned to one person.
4. **Tasks ↔ Tasks** (Self-linking): Tasks can have subtasks, creating a parent-child relationship within the same table.

### Advanced features you can add:

* [**Rollup field**](/data/collections/rollups) on Projects: Count how many tasks are "Done" vs total tasks
* [**Rollup field**](/data/collections/rollups) on Projects: Sum up time estimates to see total project hours
* [**Rollup field**](/data/collections/rollups) on Team Members: Count how many tasks are assigned to each person
* [**Formula field**](/data/collections/formulas) on Projects: Calculate project duration (End Date - Start Date)

### The Excel vs Database comparison:

**Excel approach (problematic):**

* One row per task with all project and team member details repeated
* If a project name changes, you update dozens of rows
* Hard to see all tasks for a specific project or team member

**Database approach (better):**

* Project details stored once in Projects table
* Tasks link back to their project
* Change project name once, all linked tasks reflect the change
* Use [views](/pages/views) to see all tasks for a project, or all tasks for a team member

***

## Example 3: Client Portal

A client portal lets clients log in to see their own projects and files, but nothing from other clients.

### Tables you'll need:

#### 1. **Clients** Table

**Fields:**

* **Company Name** ([Text](/data/collections/field-types/text))
* **Primary Contact Name** ([Text](/data/collections/field-types/text) or [Full Name field](/data/collections/field-types/full-name))
* **Email** ([Text](/data/collections/field-types/text)) - This will be used for login
* **Phone** ([Phone Number field](/data/collections/field-types/phone-number))
* **Account Status** ([Single Select](/data/collections/field-types/single-option-select): Active, Inactive, Trial)
* **Projects** ([Linked](/data/collections/relationships) to Projects table - allows multiple)
* **Invoices** ([Linked](/data/collections/relationships) to Invoices table - allows multiple)

#### 2. **Projects** Table

**Fields:**

* **Project Name** ([Text](/data/collections/field-types/text))
* **Description** ([Long Text](/data/collections/field-types/text))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): Not Started, In Progress, Review, Completed)
* **Start Date** ([Date](/data/collections/field-types/date))
* **Deadline** ([Date](/data/collections/field-types/date))
* **Client** ([Linked](/data/collections/relationships) to Clients table - single link)
* **Files** ([Linked](/data/collections/relationships) to Files table - allows multiple)
* **Tasks** ([Linked](/data/collections/relationships) to Tasks table - allows multiple)

#### 3. **Tasks** Table

**Fields:**

* **Task Name** ([Text](/data/collections/field-types/text))
* **Description** ([Long Text](/data/collections/field-types/text))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): To Do, In Progress, Done)
* **Due Date** ([Date](/data/collections/field-types/date))
* **Project** ([Linked](/data/collections/relationships) to Projects table - single link)
* **Client** ([Lookup](/data/collections/lookup-fields) from Project → Client)

#### 4. **Files** Table

**Fields:**

* **File Name** ([Text](/data/collections/field-types/text))
* **File** ([File/Upload field](/data/collections/field-types/file-upload))
* **Description** ([Long Text](/data/collections/field-types/text))
* **Upload Date** ([Date](/data/collections/field-types/date) - can be auto-filled)
* **Project** ([Linked](/data/collections/relationships) to Projects table - single link)
* **Client** ([Lookup](/data/collections/lookup-fields) from Project → Client)

#### 5. **Invoices** Table

**Fields:**

* **Invoice Number** ([Text](/data/collections/field-types/text))
* **Amount** ([Number - Decimal](/data/collections/field-types/number-decimal))
* **Status** ([Single Select](/data/collections/field-types/single-option-select): Draft, Sent, Paid, Overdue)
* **Issue Date** ([Date](/data/collections/field-types/date))
* **Due Date** ([Date](/data/collections/field-types/date))
* **Client** ([Linked](/data/collections/relationships) to Clients table - single link)
* **Project** ([Linked](/data/collections/relationships) to Projects table - single link)

### How the relationships work:

1. **Clients ↔ Projects**: One client can have many projects. Each project belongs to one client.
2. **Projects ↔ Tasks**: One project has many tasks. Each task belongs to one project.
3. **Projects ↔ Files**: One project can have many files. Each file belongs to one project.
4. **Clients ↔ Invoices**: One client can have many invoices. Each invoice belongs to one client.

### The key insight: Lookup fields for permissions

Notice how Tasks and Files tables have a **Client** field that's a Lookup? This is crucial for security:

* The Client field on Tasks looks up through Project → Client
* The Client field on Files looks up through Project → Client

This means when you set up [permissions](/users-and-permissions/user-roles-and-permissions) where clients can only see records where "Client = Logged in User," they automatically see:

* Their own projects
* All tasks in those projects
* All files in those projects
* Their invoices

You don't have to manually link every task and file to the client—the lookup does it automatically!

### Setting up client portal permissions:

1. Make your Clients table your [User Table](/users-and-permissions/user-table)
2. Create a "Client" user role
3. Set [record-level permissions](/users-and-permissions/user-roles-and-permissions/record-level-permissions) so clients can only view/edit records where the Client field equals the logged-in user
4. Clients log in with their email and only see their own data

***

## Key Concepts to Remember

### 1. Linked Records (Relationships)

Think of links as connections between tables. Instead of copying the same information across multiple rows, you create it once and link to it.

**Types of relationships:**

* **One-to-Many**: One company has many contacts (but each contact has one company)
* **Many-to-Many**: Team members work on many projects, and projects have many team members

Learn more about [Relationships](/data/collections/relationships).

### 2. Lookup Fields

Lookup fields pull information from a linked record. For example:

* A Task is linked to a Project
* The Project is linked to a Client
* You can add a Lookup on the Task that shows the Client name by "looking through" the Project link

This is like Excel's VLOOKUP, but it updates automatically!

### 3. Rollup Fields

Rollup fields calculate something across multiple linked records. For example:

* Count how many tasks are in a project
* Sum the value of all deals for a company
* Calculate the average of all invoice amounts for a client

Learn more about [Rollup fields](/data/collections/rollups).

### 4. Formula Fields

Formula fields let you calculate values within a single record, like:

* Days until a deadline (Deadline - Today)
* Full name (First Name + " " + Last Name)
* Project duration (End Date - Start Date)

Learn more about [Formula fields](/data/collections/formulas).

***

## Tips for Beginners

### Start simple

Don't try to build everything at once. Start with 2-3 core tables and add more as you need them.

### Plan on paper first

Sketch out your tables and how they connect before building in Noloco. Ask yourself:

* What are the main "things" I need to track? (These become tables)
* How do these things relate to each other? (These become relationships)
* What information do I need about each thing? (These become fields)

### Think about "has many" relationships

If you find yourself saying "One X has many Y," that's probably a relationship:

* One company HAS MANY contacts
* One project HAS MANY tasks
* One client HAS MANY projects

### Use Noloco Tables when starting out

If you're new to databases, start with [Noloco Tables](/data/collections) rather than connecting external sources. It's easier to learn the concepts, and you can always migrate later.

### Test with real data

Once you've built your structure, add some real data (or realistic test data) and see if it makes sense. It's easier to restructure early than after you've entered hundreds of records.

***

## Next Steps

Now that you understand how to structure your data, check out these guides:

* [What are Tables?](/data/data-overview/what-are-tables) - More fundamentals about tables
* [Relationships](/data/collections/relationships) - Deep dive into linking records
* [Rollup Fields](/data/collections/rollups) - Calculate across linked records
* [Lookup Fields](/data/collections/lookup-fields) - Pull data from linked records
* [Field Types](/data/collections/field-types) - All available field types
* [User Roles & Permissions](/users-and-permissions/user-roles-and-permissions) - Control who sees what data


# Setting a Table's Primary Field

Learn how to control what field you see in your app when a record is linked to another record

A table's **Primary Field** is what is used to identify a record when it is linked to another record, or when you are choosing it from a dropdown.

In the example below we are trying to select an **Agency** record, and the Agency's name is being used as the primary field.

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

### Changing a tables primary field

To change what field gets shown as a preview, you need to follow these steps:

1. Go to that table in the data table.
2. Click the field you wish to make the primary field. This will open the field's settings:

   If the field you have chosen is one of the valid fields (more on this below) there will be a button that says '**Set as primary field**'

   Simply click that and your views should automatically update.

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

### Why doesn't my field have the 'Set as primary field' button?

The button to change the primary field will only show up on valid fields. Firstly, only the following field types are considered valid to be the primary field:

* Text
* Numbers (Integer and Decimal)
* Single Option
* Any formula field

The second thing to consider is that some data sources sync the primary field from the external data source, for consistency. **Airtable** data sources can not change their primary field in Noloco. If you need to change it you will need to change the contents/values of your first field in Airtable.


# Syncing

Syncing data from external data sources to your custom Noloco applications

Noloco offers two robust methods for syncing data from external sources to your custom applications: **Scheduled Syncing** and **Live Syncing**. Understanding how these processes work can help you maximize the efficiency and reliability of your data flow, ensuring your application always reflects the most current information in your data source.

| Data Source   | Live Syncing | Scheduled Syncing |
| ------------- | :----------: | :---------------: |
| Airtable      |       ✅      |                   |
| Google Sheets |              |         ✅         |
| Hubspot       |       ✅      |                   |
| MySQL         |              |         ✅         |
| PostgreSQL    |              |         ✅         |
| SmartSuite    |       ✅      |                   |
| Stripe        |       ✅      |                   |
| Xano          |              |         ✅         |

## Scheduled Syncing

Scheduled syncing is enabled for data sources that require regular data updates;

* [Google Sheets](/data/google-sheets)
* [MySQL](/data/mysql)
* [PostgreSQL](/data/postgresql)
* [Xano](/data/xano)

### How Scheduled Syncing Works

* **Frequency**: The frequency of scheduled syncing depends on your [Noloco subscription plan](https://guides.noloco.io/account/pricing#understanding-database-records-limits). Each plan offers different syncing intervals (priority or standard), allowing you to choose one that best fits your business needs.
* **Process**: On the set schedule, Noloco reads all of the data in your external data source. It checks for any new or updated data since the last sync. This includes additions, deletions, or modifications to the records in your tables.
* **Application Update**: Once the syncing process is complete, the changes are reflected in your Noloco application, ensuring your data remains current up to the latest sync. You can verify exactly which fields changed during a sync using [Record History](/data-management/record-history).

## Live Syncing

For businesses requiring their applications to reflect data changes almost instantly, live syncing is the ideal solution. This method is supported exclusively for [Airtable](/data/airtable) and [SmartSuite](/data/smartsuite), and [Stripe](/data/stripe) data sources with limited support for [Hubspot](/data/hubspot) too

### How Live Syncing Works

* **Real-time Updates**: Unlike scheduled syncing, live syncing listens for changes in your external data source in real-time. When a change occurs, it's immediately communicated to Noloco and reflected in your application.
* **Setup**: Live syncing is enabled by default for Airtable and SmartSuite, providing an effortless setup for instant data updates.

## Schema Syncing

In addition to syncing data content, Noloco also periodically syncs the schema (structure) of your external data sources. This ensures that any changes to the tables or fields in those tables are accurately reflected in your Noloco application.

* **Periodic Checks**: Noloco periodically reviews the schema of your connected external data sources for any changes every few minutes.
* **Automatic Updates**: If a change is detected, Noloco automatically updates your application to align with the new schema, ensuring structural consistency.

### Updating or creating data in Noloco

When you make changes to any data source in your Noloco app, or through our [Make](/integrations/make) or [Zapier](/integrations/zapier) integration or through the [API](/api-documentation/api-overview) the data will **instantly** be updated in your external data source too.

For example, if you use Airtable as an external data source and create a new record in your Noloco app, that record will be instantly created in Airtable and stored in Noloco.

## Manual Syncing

Despite the efficiency of scheduled and live syncing, there might be instances where an immediate update is necessary, or an inconsistency arises.

* **Immediate Action**: In such cases, Noloco allows for manual syncing. Users can initiate a manual sync for a specific table or the entire data source directly from the data table in their application.
* **Problem Resolution**: This feature is particularly useful for quickly resolving any discrepancies or ensuring data is up-to-date following unforeseen changes.

### How do I manually sync a table?

{% @arcade/embed url="<https://noloco.share.arcade.software/share/H5xGFiyzlaeZF4jjsw1B>" flowId="H5xGFiyzlaeZF4jjsw1B" %}

1. Click the Data tab to access data management features.
2. Select the table you want to sync in the sidebar
3. Open the Syncing menu to view or manage data synchronization options.
4. Click Sync Now to manually update the data and ensure the latest information is displayed.
5. This process might take a few minutes but you will be notified once it's complete

### How do I manually sync a data source?

{% @arcade/embed url="<https://noloco.share.arcade.software/share/likl1j4dCUMc17iZ7bcT>" flowId="likl1j4dCUMc17iZ7bcT" %}

1. Open the Data tab to begin managing and syncing your tables.
2. Click the more options icon next to the Data Source to access advanced table actions.
3. Select Queue data sync to start synchronizing all the tables in the connected source and ensure your data is up to date.
4. You'll receive an email when the process is complete

### How do I manually sync a data source schema?

{% @arcade/embed url="<https://noloco.share.arcade.software/share/xDd9T04Cuc5eUnUZjNrl>" flowId="xDd9T04Cuc5eUnUZjNrl" %}

1. Open the Data tab to access data management features in the portal.
2. Click the more options icon next to the data source you want to sync to reveal additional data actions or settings.
3. Select Queue schema sync to update your data schema and reflect structural changes.
4. You'll receive an email when the process is complete


# Noloco Tables

A table contains a list of items of the same type, like users, companies or tasks. Your portal will come with several tables by default, such as Users and Companies.

Your portal's data tab allows you to view your existing tables, create new tables, add additional fields to your existing tables and create, update and delete table records. It's your very own database.

### What's a table?

A table contains a list of items of the same type, like *users*, *companies* or *tasks.* Your portal will come with several tables by default, such as **Users** and **Companies**. But you can add a table to store any sort of list that you'll need for your company.

Each table is built of **records** and **fields**. Again, each table comes with some default fields such as **id**, **uuid** and **created at**.

### What's a record?

A record is simply an individual item in a table. Imagine a row in a table or a row in a spreadsheet. If you have a table of users, then an individual user is represented by a record.

### What's a field?

Information related to each record is stored in **fields**. Each field can store different types of information such as **text, checkboxes, select options** or a **relationship to another record.**

You can add any number of fields to each table, including the **User** and **Company** tables. This will help you track and store even the most complex of records.

Each field is defined by a **Type** and a **Name.** The type controls what type of data you can store in the field (more on that later) and what sort of input box you and your clients will see when they interact with the field.

### Can we have an example?

Before diving any further into tables and field types it makes sense to start with a simple example. As mentioned, each portal comes with a **User** and **Company** table. But what if you wanted to list your client's **Project**s?

#### Create your new table:

* Visit the data tab in your portal's builder. Click **New Table** at the top of the left sidebar.
* Choose a name for your table; in this case, **Project.** **Pro tip:** It's much easier if your table name is **singular.** Even though it will be a list of Projects, each individual record will be a Project.
* Press **Save**

![](/files/wI58Czs0f5ANup0zyA4m)

#### Add fields to your table:

It's time to start thinking about what a project is. It's probably got a **Name,** it might have a **Description.** When we work on a project it's for a specific client, so we'll have to store what **Company** it's belonging to. We might want to specify the project **Owner**, that's the person on our team who looks after the project. And then we might have a **Start Date** and a **Due Date** and a **cost** fiel&#x64;**.**

Breaking it down, that's 6 new fields we will have to add to our new table, but first we need to decide what field type each will need to be.

* **Name** A simple **text** field
* **Description** A simple **text** field
* **Company** This will need to be a **relationship** between **Project** and **Company.** There will be 4 different options that let you describe the relationship (more on this later). \&#xNAN;*A Project can only have one Company. A Company can be associated with many Projects.*
* **Owner** Similar to the above, this will need to be a **relationship** between **Project** and **User**. The relationship is as follows: \&#xNAN;*A Project can only have one Owner. A User can be associated with many Projects.*
* **Start Date** A simple **date** field
* **Due Date** A simple **date** field
* **Cost** A simple Integer (decimal) field

Don't forget to hit **Save**.

![](/files/e29RQWgiduApgeDFpjW6)

### How to create and add a new field

Once you have created your table, you can easily add new fields to store additional information. Here's a step-by-step guide on adding fields to your table:

{% @arcade/embed url="<https://app.arcade.software/share/ZX7Z2tyxTBeQqD7Vmy6t>" flowId="wh1rnUBV3sugoSMrusxH" %}

#### Steps to add a new field:

1. **Navigate to your table** in the data tab of your portal's builder
2. **Click "Add Field"** or the "+" button to create a new field
3. **Choose a field name** that clearly describes what information will be stored
4. **Select the field type** that best matches your data (text, date, number, etc.)
5. **Configure field settings** such as whether it's required, default values, or formatting options
6. **Save your field** to add it to your table

### What are field types?

As you saw in the above example, field types help us model the table in a reasonable way, and then link records to other records (often in other tables).

There are several field types and you can have as many as each as you like. For complete details on each field type including configuration options, use cases, and best practices, see the [Field Types documentation](/data/collections/field-types).


# Field Types

Understand the different field types that are supported on Noloco tables, or any external data source

Fields are the building blocks of Noloco and help you create powerful apps without code. They allow you to capture structured and unstructured data in the many ways you need to manage workflows and projects.

You can think of fields as columns in a spreadsheet, except the field type will dictate what type of value you can put in that column.

## Basic Field Types

### Text

Text fields hold basic text content like names, descriptions, and formatted text.

[Learn more about Text fields](/data/collections/field-types/text)

### Date

Date fields store date values with optional time information and timezone handling.

[Learn more about Date fields](/data/collections/field-types/date)

### Number (Integer)

Integer fields store whole numbers with various formatting options like currency, ratings, and sliders.

[Learn more about Integer Number fields](/data/collections/field-types/number-integer)

### Number (Decimal)

Decimal Number fields store numbers with decimal points, supporting currency, percentage, and precision formatting.

[Learn more about Decimal Number fields](/data/collections/field-types/number-decimal)

### Boolean (Yes/No)

Boolean fields store True/False values, perfect for status indicators and toggles.

[Learn more about Boolean fields](/data/collections/field-types/boolean)

### Single Option Select

Single Option Select fields allow selection from a predefined list with customizable colors and display options.

[Learn more about Single Option Select fields](/data/collections/field-types/single-option-select)

### Multiple Option Select

Multiple Option Select fields enable selection of multiple options from a predefined list.

[Learn more about Multiple Option Select fields](/data/collections/field-types/multiple-option-select)

### Duration

Duration fields store time durations for tracking elapsed time and event lengths.

[Learn more about Duration fields](/data/collections/field-types/duration)

## Advanced Field Types

### Street Address

Street Address fields store complete address information with automatic geocoding capabilities.

[Learn more about Street Address fields](/data/collections/field-types/street-address)

### Map Coordinates

Map Coordinates fields store precise latitude and longitude values for exact location tracking.

[Learn more about Map Coordinates fields](/data/collections/field-types/map-coordinates)

### Date Range

Date Range fields store start and end dates for events and time periods.

[Learn more about Date Range fields](/data/collections/field-types/date-range)

### Full Name

Full Name fields store complete names with titles, first, middle, and last name components.

[Learn more about Full Name fields](/data/collections/field-types/full-name)

### Phone Number

Phone Number fields store international phone numbers in E.164 format with country codes.

[Learn more about Phone Number fields](/data/collections/field-types/phone-number)

### File/Upload

File/Upload fields store various file types including documents, images, videos, and more.

[Learn more about File/Upload fields](/data/collections/field-types/file-upload)

## AI-Powered Field Types

### Noloco AI Fields

AI-powered fields bring intelligence to your tables by using AI to perform tasks like classification, summarization, sentiment analysis, grammar correction, keyword extraction, and custom operations.

[Learn more about Noloco AI fields](/data/collections/noloco-ai)

Available AI operations include:

* **Classify**: Automatically categorize data based on content
* **Summarize**: Condense lengthy text into concise summaries
* **Sentiment**: Analyze emotional tone of text (positive, negative, neutral)
* **Chat Prompt**: Use custom prompts for tailored AI responses
* **Correct Grammar**: Improve text quality and professionalism
* **Keyword Extraction**: Identify relevant keywords from text content

[Learn more about AI fields](/data/collections/noloco-ai)

## System Field Types

### Created By

The Created By field automatically links each record to the user who created it in Noloco.

[Learn more about the Created By field](/data/collections/field-types/created-by)

### Last Updated By

The Last Updated By field automatically tracks the last user who modified a record.

[Learn more about the Last Updated By field](/data/collections/field-types/last-updated-by)

### Assignee

The Assignee field links records to users with built-in assignment notifications and comment subscriptions.

[Learn more about the Assignee field](/data/collections/field-types/assignee)

## Computed Field Types

### Formula

Formula fields calculate values from other fields within the same record using spreadsheet-like formulas.

[Learn more about Formula fields](/data/collections/formulas)

### Rollup

Rollup fields summarize data from related records, providing aggregated insights across relationships.

[Learn more about Rollup fields](/data/collections/rollups)

### Lookup

Lookup fields pull data from related tables based on linked relationships, ensuring data consistency.

[Learn more about Lookup fields](/data/collections/lookup-fields)

### Link to Another Record

Relationship fields create links between records, enabling complex data relationships across tables.

[Learn more about Relationship fields](/data/collections/relationships)


# Text Fields

Learn about Text fields in Noloco tables

Text fields are designed to hold basic text content. They are handy for incorporating short, non-numeric, and unformatted text such as names or titles. For instance, a text field could hold a value like 'Sample Text'.

## Text Field Formats

* **Single Line** Store a single line of text, like a first name, or a company name
* **Long Text** Store multiple lines of text, like notes or description
* **Email address** Store an email address. Input fields ensure that all values are valid email addresses, like <name@example.com>
* **IP address** Store an IP address. Input fields ensure that all values are valid IP addresses, like 192.168.1.1
* **URL** Store a URL or website such as <https://noloco.io> or noloco.io.

## Use Cases

Text fields are perfect for:

* Names and titles
* Short descriptions
* Comments and notes
* Contact information (when using specific formats)
* Reference codes and IDs

## Best Practices

* Use Single Line for short, structured text like names or codes
* Use Long Text for descriptions, comments, or any multi-line content
* Choose Email, IP, or URL formats when you need validation for those specific data types
* Keep field names clear and descriptive to help users understand what information to enter


# Date Fields

Learn about Date fields in Noloco tables

Date fields specialize in storing date values and are beneficial for incorporating date-specific information such as event days or birthdates. An example value could be '2023-09-25'. These fields provide diverse date formatting options like YYYY-MM-DD and come with a user-friendly date picker for input.

## Date Field Formats

* **Date** Store only a date, this is useful for things like birthdays or multi-day events, where time doesn't come into play
* **Date & Time** This is the default behavior, store a date and time. Date times will be displayed in the user's local timezone as described in [Dates & Timezones](/field-formatting/dates-and-time-zones)
  * **Use a consistent Timezone** When using a Date & Time field you can specify that all of your dates use the UCT timezone, which is useful if you need a consistent time across all devices, regardless of location

## Use Cases

Date fields are ideal for:

* Event scheduling and deadlines
* Birth dates and anniversaries
* Created and updated timestamps
* Project milestones
* Appointment booking

## Working with Timezones

When using Date & Time fields, Noloco automatically handles timezone conversion based on each user's location. For applications requiring consistent global time, enable the "Use a consistent Timezone" option to store all dates in UTC.

## Integration with Views

Date fields work seamlessly with:

* [Calendar views](/views/display/calendar) for scheduling
* [Timeline views](/views/display/timeline) for project tracking
* Filtering and sorting options in all view types


# Number (Integer) Fields

Learn about Integer Number fields in Noloco tables

Integer fields are optimized for holding whole numbers. They are essential when you need to count items or denote a rank, storing values like 5. These fields use numeric inputs and allow for customization by setting minimum and maximum value limits, providing control over the range of acceptable inputs.

{% hint style="info" %}
**Technical Limits**: Integer fields are limited by JavaScript's maximum safe integer value of **9,007,199,254,740,991** (approximately 9 quadrillion). Values larger than this limit may not be handled correctly and could cause validation errors.
{% endhint %}

## Integer Number Field Formats

* **Default** By default, the integer number field shows a formatted number such as 1,234,000
* **Currency** Display the number as a currency, and choose the specific currency symbol. For example: £1,234,000
* **Rating** Display the number as a star rating. You can configure how many stars should be displayed (the max value)
* **Unformatted** This displays the number without formatting, such as 1234000. This is useful for numbers that aren't really numbers, like Postcodes, or Object IDs
* **Slider** Displays the number as a slider when used as an input, and a visually similar progress bar otherwise. Configure the min, max, and step value of the slider.

{% hint style="info" %}
**Numbers** are displayed based on your browser settings
{% endhint %}

## Integer Field Options

* **Allow negative numbers** Depending on the format chosen above, you can optionally enable or disable the use of negative numbers in the field, which will be enforced in all forms
* **Prefix** Configure a prefix for your numbers, such as `USD 123,000`
* **Suffix** Configure a suffix to your numbers, such as `12,000 Books`

## Use Cases

Integer fields are perfect for:

* Counting items (inventory, users, etc.)
* Rankings and scores
* Quantities and amounts
* Ratings and reviews
* IDs and reference numbers (using unformatted display)
* Progress tracking (using slider format)

## Best Practices

* Use Currency format for monetary values without decimals
* Use Rating format for user feedback and scoring systems
* Use Slider format for values within a specific range
* Set appropriate min/max limits to prevent invalid data entry
* Use prefixes and suffixes to provide context (e.g., "USD" prefix, "items" suffix)


# Number (Decimal) Fields

Learn about Decimal Number fields in Noloco tables

Decimal Number fields are for storing numbers with decimal points, and they are particularly useful when precision is essential, like when storing a rating value of 5.5.

{% hint style="info" %}
**Technical Limits**: Like integer fields, decimal fields are also limited by JavaScript's maximum safe integer value of **9,007,199,254,740,991**. This applies to the whole number portion of decimal values.
{% endhint %}

## Decimal Number Field Formats

* **Default** By default, the decimal number field shows a formatted number such as 1,234,000.00
* **Currency** Display the number as a currency, and choose the specific currency symbol. For example: £1,234,000.00
* **Percentage** Display the number as a percentage, values such as 0.2 will be displayed as 20%
* **Unformatted** This displays the number without formatting, such as 1234000.00. This is useful for numbers that aren't really numbers, like Postcodes, or Object IDs

{% hint style="info" %}
**Numbers** are displayed based on your browser settings
{% endhint %}

## Decimal Field Options

* **Allow negative numbers** Depending on the format chosen above, you can optionally enable or disable the use of negative numbers in the field, which will be enforced in all forms
* **Prefix** Configure a prefix for your numbers, such as `USD 123,000.00`
* **Suffix** Configure a suffix to your numbers, such as `12,000.00 Units`
* **Precision** Configure how many decimal places your decimal field should show, from 1 to 8

## Use Cases

Decimal fields are ideal for:

* Precise monetary calculations
* Scientific measurements
* Percentages and ratios
* Ratings with decimal precision
* Weight, height, and other measurements
* Price calculations requiring exact amounts

## Best Practices

* Set appropriate precision levels (number of decimal places) based on your use case
* Use Currency format for all monetary values
* Use Percentage format when storing rates, completion percentages, or ratios
* Consider using prefixes/suffixes to provide units of measurement
* Be mindful of precision requirements - more decimal places aren't always better for user experience


# Boolean (Yes/No) Fields

Learn about Boolean (Yes/No) fields in Noloco tables

Boolean fields hold True/False or Yes/No values and are excellent for indicating the status of a task. In forms, they can be displayed as a checkbox or a dropdown of Yes / No.

## Display Options

* **Checkbox** The field appears as a checkable box that users can click to toggle between true and false
* **Dropdown** The field appears as a dropdown menu with "Yes" and "No" options

## Use Cases

Boolean fields are perfect for:

* Task completion status (Done/Not Done)
* Feature toggles (Enabled/Disabled)
* Approval workflows (Approved/Pending)
* Subscription status (Active/Inactive)
* Availability indicators (Available/Unavailable)
* Permission flags (Public/Private)

## Best Practices

* Use clear, descriptive field names that indicate what "true" means (e.g., "Is Active" rather than just "Status")
* Consider the default value - should new records start as true or false?
* Use checkboxes for quick toggling, dropdowns when you want to be more explicit about the choice
* Boolean fields work great in filters and conditional logic for workflows


# Single Option Select

Learn about Single Option Select fields in Noloco tables

Single Option Select fields permit selection from a predefined list of options and are useful when assigning categories or status values. A typical value could be 'In Progress'. These fields can be displayed as dropdown or radio buttons, and the list of options is fully customizable to match your needs, offering flexibility in options, option order, and the color of each individual option.

You can bulk-add options by pasting in a list of your options.

## Display Options

* **Dropdown** Shows options in a dropdown menu (default)
* **Radio Buttons** Shows all options as radio button selections
* **Colored Options** Like the default dropdown, but options appear as colored badges

## Configuration Options

* **Custom Options** Add, remove, and reorder options to match your workflow
* **Badge Style** Choose how option badges look everywhere they appear — in the data grid, forms, and filter chips:
  * **Light** (default) — pastel background with colored text
  * **Contrasted** — solid color background with white text
* **Option Colors** Assign a color to each option for visual distinction. Each option shows a badge-shaped chip with its order number — click it to pick from the preset color palette.
* **Default Value** Set which option is selected by default for new records

## Editing in the data grid

When a Single Option Select field is editable in the data grid (or in a table view with inline editing enabled), double-clicking a cell opens a popover editor. The popover contains a search input and the full list of available options.

### Selecting a value

Click any option to replace the current value. The popover closes and the cell updates immediately.

You can also navigate and select with the keyboard:

* **Type** to filter the option list. The first matching result is highlighted automatically.
* **↑ / ↓ arrow keys** to move through the list.
* **Enter** to select the focused option.

### Creating a new option inline

If no existing option matches what you typed, a **Create "…"** entry appears at the bottom of the list. Press **Enter** or click it to create and select the new option in one step. The new option is added to the field's option list and synced with the field's property panel.

### Managing options from the editor

Hover any option in the list to reveal the option menu icon (**⋮**). From here you can:

* **Rename** the option (edited inline)
* **Change the colour** of the option
* **Delete** the option (a confirmation modal appears before deleting)

These changes apply everywhere the option is used and are reflected in the field's property panel — no need to open field settings separately.

## Use Cases

Single Option Select fields are ideal for:

* Project status (Active, Completed, On Hold)
* Priority levels (High, Medium, Low)
* Categories and types
* Workflow stages
* Approval states
* Geographic regions or locations

## Best Practices

* Keep option names short and clear
* Use colors strategically (e.g., red for urgent, green for complete)
* Order options logically (by priority, chronologically, or alphabetically)
* Consider how the field will appear in different views and reports
* Use radio buttons when you have 2-4 options that users should see all at once


# Multiple Option Select

Learn about Multiple Option Select fields in Noloco tables

Multiple Option Select fields allow the selection of multiple options from a predefined list, such as 'Apple', 'Banana'. They can be displayed as checkboxes or a multi-select dropdown, offering versatile interaction methods. The list of options is fully customizable to match your needs, offering flexibility in options, option order, and the color of each individual option.

## Display Options

* **Multi-select Dropdown** Shows options in a dropdown where multiple items can be selected (default)
* **Checkboxes** Shows all options as checkbox selections
* **Colored Options** Like the default multi-select dropdown, but options appear as colored badges

## Configuration Options

* **Custom Options** Add, remove, and reorder options to match your workflow
* **Badge Style** Choose how option badges look everywhere they appear — in the data grid, forms, and filter chips:
  * **Light** (default) — pastel background with colored text
  * **Contrasted** — solid color background with white text
* **Option Colors** Assign a color to each option for visual distinction. Each option shows a badge-shaped chip with its order number — click it to pick from the preset color palette.
* **Default Values** Set which options are selected by default for new records

## Editing in the data grid

When a Multiple Option Select field is editable in the data grid (or in a table view with inline editing enabled), double-clicking a cell opens a popover editor. The popover shows the current selected values as badges and a search input above the full list of available options.

### Adding values

Click any option to add it to the selection. You can keep clicking to add multiple values in one session.

You can also navigate and select with the keyboard:

* **Type** to filter the option list. The first matching result is highlighted automatically.
* **↑ / ↓ arrow keys** to move through the list.
* **Enter** to add the focused option.

### Removing values

Remove a selected value by clicking the **×** on its badge in the input, or by pressing **Backspace** or **Delete** while the cursor is in the search input.

### Reordering selected values

Drag the grab icon (⠿) on any selected-value badge to reorder it. The new order is synced with the field's property panel.

### Creating a new option inline

If no existing option matches what you typed, a **Create "…"** entry appears at the bottom of the list. Press **Enter** or click it to create and add the new option in one step. The new option is added to the field's option list and synced with the field's property panel.

### Managing options from the editor

Hover any option in the list to reveal the option menu icon (**⋮**). From here you can:

* **Rename** the option (edited inline)
* **Change the colour** of the option
* **Delete** the option (a confirmation modal appears before deleting)

These changes apply everywhere the option is used and are reflected in the field's property panel — no need to open field settings separately.

## Use Cases

Multiple Option Select fields are perfect for:

* Skills and competencies
* Tags and labels
* Services offered
* Features included
* Interests and preferences
* Team members assigned to a project
* Categories that can overlap

## Best Practices

* Keep the number of options manageable (typically under 20)
* Use clear, descriptive option names
* Group related options with similar colors
* Consider using checkboxes when you have a small number of important options
* Use multi-select dropdown for longer lists of options
* Think about how multiple selections will display in different views (lists, cards, etc.)


# Duration Fields

Learn about Duration fields in Noloco tables

Duration fields can store time durations, which makes them great for logging the length of events, with values like '2:30'. They can be displayed in HH:mm format and configured with time input options and limits to control the allowable duration range.

## Duration Field Formats

* **Default** By default, duration fields show HH:flag\_mm:ss, which is hours, minutes and seconds
* **Time** You can format a duration field as a time field, which limits the input to 24 hours, and shows the AM/PM selector depending on the user's language settings

## Use Cases

Duration fields are ideal for:

* Time tracking for projects and tasks
* Meeting lengths and event durations
* Service delivery times
* Process completion times
* Break durations
* Session lengths
* Response times

## Working with Duration Data

Duration fields store time as elapsed time rather than specific clock times. This makes them perfect for:

* Calculating total time spent on activities
* Setting time limits and expectations
* Measuring performance and efficiency
* Billing and invoicing based on time

## Best Practices

* Use the Default format (HH:flag\_mm:ss) for precise time tracking
* Use the Time format when dealing with scheduled times within a 24-hour period
* Consider setting reasonable minimum and maximum limits
* Duration fields work well with [Rollup fields](/data/collections/rollups) for calculating total times across related records


# Street Address Fields

Learn about Street Address fields in Noloco tables

Street Address fields allow you to store complete address values, storing Address Line 1, an optional Address Line 2, City, State, and Country.

Where possible, Noloco will **Geocode** the address to store the latitude and longitude values of the address, allowing you to use them in [Maps](/views/display/maps)

## Address Components

Street Address fields capture:

* **Address Line 1** (required)
* **Address Line 2** (optional)
* **City** (required)
* **State/Province** (required)
* **Country** (required)
* **Postal/ZIP Code** (optional)

## Geocoding

When you enter a complete address, Noloco automatically attempts to:

* Validate the address format
* Convert the address to latitude and longitude coordinates
* Store these coordinates for use in map displays

## Use Cases

Street Address fields are perfect for:

* Customer and client locations
* Office and store locations
* Delivery addresses
* Event venues
* Service territories
* Contact information

## Integration with Maps

Street Address fields work seamlessly with:

* [Map views](/views/display/maps) to display locations visually
* Geographic filtering and searching
* Distance calculations between addresses
* Route planning and logistics

## Best Practices

* Encourage users to enter complete addresses for better geocoding accuracy
* Consider the geographic scope of your application when designing address fields
* Use address fields in combination with [Map Coordinates](/data/collections/field-types/map-coordinates) for precise location data
* Test address validation with international addresses if your app serves global users


# Map Coordinates

Learn about Map Coordinates fields in Noloco tables

Map Coordinates fields hold Latitude and Longitude values, pinpointing locations on a map, with example values like '51.523767, -0.1585557'. They can be displayed as coordinates or integrated with a [map view](/views/display/maps)

## Coordinate Format

Map Coordinates store:

* **Latitude**: North-South position (-90 to +90 degrees)
* **Longitude**: East-West position (-180 to +180 degrees)

Coordinates are typically displayed as decimal degrees (e.g., 51.523767, -0.1585557).

## Data Entry

Coordinates can be entered:

* Manually as decimal degrees
* By clicking on a map interface
* Automatically via geocoding from [Street Address fields](/data/collections/field-types/street-address)
* Through API integrations with GPS devices or mapping services

## Use Cases

Map Coordinates are ideal for:

* Precise location tracking
* GPS data from mobile devices
* Asset location management
* Geographic analysis and reporting
* Delivery route optimization
* Emergency response systems

## Integration with Views

Map Coordinates work with:

* [Map views](/views/display/maps) to display points on interactive maps
* Geographic filtering and proximity searches
* Distance calculations between coordinates
* Spatial analysis and clustering

## Best Practices

* Use Map Coordinates for precise locations where GPS accuracy is important
* Combine with [Street Address fields](/data/collections/field-types/street-address) for user-friendly address display
* Consider data privacy when storing location information
* Validate coordinate ranges to ensure they fall within valid geographic boundaries
* Test coordinate accuracy for your specific use case requirements


# Date Range Fields

Learn about Date Range fields in Noloco tables

Date Range fields are configured to hold start and end dates, defining the duration of an event with values like '2023-09-25 to 2023-09-30'. It's a combination of two [Date Fields](/data/collections/field-types/date).

They can be used with the [calendar](/views/display/calendar) or timeline view as the start and end dates for the events.

## Components

A Date Range field stores:

* **Start Date**: When the event or period begins
* **End Date**: When the event or period ends

Both dates can include time information depending on your configuration.

## Use Cases

Date Range fields are perfect for:

* Event scheduling (conferences, meetings, workshops)
* Project timelines and milestones
* Vacation and leave tracking
* Booking and reservation systems
* Campaign durations
* Rental periods
* Contract terms

## Integration with Views

Date Range fields work excellently with:

* [Calendar views](/views/display/calendar) to show events with proper start and end times
* [Timeline views](/views/display/timeline) for project management, scheduling and Gantt-style planning with dependencies
* Filtering to find overlapping periods or events within date ranges

## Best Practices

* Ensure end dates are after start dates through validation rules
* Consider timezone handling for multi-day events
* Use Date Range fields instead of separate start/end date fields for better data integrity
* Date ranges display more intuitively in calendar and timeline views than separate date fields
* Consider default durations for common event types (1 hour meetings, full-day events, etc.)


# Full Name Fields

Learn about Full Name fields in Noloco tables

Full Name fields are designated to store first and last names, as well as optional Titles (such as Mr, Ms, Mrs etc.) and optional middle names. This makes them a great candidate for managing client and employee names. When used in text, the individual values are joined together as you would expect to see them written.

## Name Components

A Full Name field can store:

* **Title** (optional): Mr, Ms, Mrs, Dr, etc.
* **First Name** (required)
* **Middle Name** (optional)
* **Last Name** (required)

## Display Format

Names are automatically formatted and displayed as a complete name string, following standard naming conventions (e.g., "Dr. John Michael Smith" or "Jane Doe").

## Use Cases

Full Name fields are ideal for:

* Employee and staff directories
* Client and customer records
* Contact management systems
* User profiles and accounts
* Event attendee lists
* Professional directories

## Advantages Over Separate Text Fields

Using Full Name fields instead of separate first/last name fields provides:

* Consistent name formatting across your application
* Better sorting and searching capabilities
* Proper handling of titles and middle names
* Reduced data entry errors
* Automatic name display in forms and views

## Best Practices

* Use Full Name fields for any person-related data where you need professional name display
* Consider cultural naming conventions for your user base
* Full Name fields work well with [User tables](/users-and-permissions/user-table) and user management
* Use in combination with other contact fields like [Phone Numbers](/data/collections/field-types/phone-number) and email addresses


# Phone Number Fields

Learn about Phone Number fields in Noloco tables

Phone Number fields are structured to hold contact telephone numbers consisting of the country code and the number itself. Phone numbers are stored in the [E.164](https://en.wikipedia.org/wiki/E.164) standard format.

For example, if a user chooses "United States" and enters `(939) 555-3226` then the stored value will be `"+19395553226"`.

## Components

Phone Number fields include:

* **Country Code**: Automatically selected dropdown
* **Phone Number**: The actual phone number
* **Extension** (optional): Can be toggled on/off

## Format and Storage

All phone numbers are stored in E.164 international format, which:

* Starts with a '+' sign
* Includes the country code
* Contains only digits after the country code
* Has no spaces, hyphens, or other formatting characters

## Configuration Options

* **Show Extension** Toggle whether to include an extension field for the phone number
* **Default Country** Set which country appears as default in the country dropdown

## Use Cases

Phone Number fields are perfect for:

* Customer and client contact information
* Employee directories
* Emergency contact details
* Support and service phone lines
* International business contacts
* Mobile app user verification

## Limitations

This field type is not intended for:

* SMS short codes
* Numbers beginning with a \*
* Extension-only numbers
* Alphabetic phone numbers (like 1-800-FLOWERS)

For these cases, consider using a [Text field](/data/collections/field-types/text) instead.

## Best Practices

* Use Phone Number fields for all standard telephone numbers to ensure proper formatting
* Enable extensions only when necessary to keep forms simple
* The E.164 format ensures compatibility with telecommunications systems and APIs
* Phone Number fields work well with SMS and calling integrations
* Consider validation rules for specific country phone number formats if needed


# File/Upload Fields

Learn about File/Upload fields in Noloco tables

File/Upload fields serve as a storage point for various file types, allowing you to attach documents, images, or other files to a record. They offer easy uploading and secure storage options, accommodating diverse file formats.

## Supported File Types

Below is a table of the supported file types you can upload to Noloco:

| File Type            | Extension(s)                                            |
| -------------------- | ------------------------------------------------------- |
| JSON                 | .json                                                   |
| PDF                  | .pdf                                                    |
| XML                  | .xml                                                    |
| Audio                | .3gpp, .3gpp2, .aac, .mp3, .wav, .webm                  |
| Image                | .bmp, .gif, .heic, .jpeg, .jpg, .ico, .png, .svg, .webp |
| Email                | .eml                                                    |
| CSS                  | .css                                                    |
| CSV                  | .csv                                                    |
| HTML                 | .html                                                   |
| Markdown             | .md                                                     |
| JavaScript           | .js                                                     |
| Plain Text           | .txt                                                    |
| Video                | .3gpp, .3gpp2, .mpeg, .mp4, .mov, .webm                 |
| Compressed Files     | .zip, .7z                                               |
| Microsoft Word       | .doc, .docx, .dotx                                      |
| Microsoft Excel      | .xls, .xlsx, .xltx                                      |
| Microsoft PowerPoint | .ppt, .pptx, .potx, .ppsx                               |
| Microsoft Outlook    | .msg                                                    |

{% hint style="info" %}
If there's a file type you'd like us to support that isn't listed here, we'd love to hear from you! Please submit your request in our [community forum](https://community.noloco.io/c/feature-requests/7). Your suggestion helps us improve Noloco and better meet your needs.
{% endhint %}

## Configuration Options

* **Multiple Files** Allow users to upload multiple files to a single field
* **File Type Restrictions** Limit which file types can be uploaded (images only, documents only, etc.) These can be limited in the forms / action buttons the file field is used in

## Use Cases

File/Upload fields are essential for:

* Document management systems
* Image galleries and portfolios
* Resume and CV storage
* Contract and agreement storage
* Product images and specifications
* User profile pictures
* Report and invoice attachments

## Best Practices

* Set appropriate file type restrictions based on your use case
* Consider file size limits to manage storage costs
* Use descriptive field names that indicate what types of files should be uploaded
* File fields work well in forms for document collection
* Consider organizing files with clear naming conventions
* Use multiple file uploads when users need to submit several related documents


# Created By

Learn about the Created By field in Noloco tables

The Created By field automatically links each record to the user who created it. When a record is created through Noloco — via a form, action button, or workflow — the field is populated with a link to the creating user's record in the Users table.

{% hint style="info" %}
You can only add **one** Created By field per table. Once a record's Created By value is set, it cannot be changed.
{% endhint %}

## How It Works

* When a user creates a record in Noloco, the Created By field is automatically set to that user
* The field behaves like a read-only relationship to the [Users table](/users-and-permissions/user-table)
* Records created outside of Noloco (e.g. directly in your database or via an external sync) will not have a Created By value unless the creating user can be determined

## Adding a Created By Field

1. Open the table you want to add the field to
2. Click 'New Field'
3. Add a new field and choose **Created By** as the type
4. The field will begin tracking the creator for all new records going forward

{% hint style="warning" %}
The Created By field is only populated for records created **after** the field is added. Existing records will not have a value.
{% endhint %}

## Use Cases

Created By fields are ideal for:

* Tracking who submitted a request, order, or ticket
* Auditing record creation across your team
* Building permission rules based on record ownership — for example, only allowing users to edit records they created
* Combining with the existing **Created At** field to see both who created a record and when

## Integration with Other Features

* [**Record-level permissions**](/users-and-permissions/user-roles-and-permissions/record-level-permissions): Use the Created By field to restrict editing or viewing to the user who created the record
* [**Record History**](/data-management/record-history): Complements the audit trail by identifying the original creator
* [**Filters**](/views/filters/logged-in-user): Filter views to show only records created by the logged-in user
* **Record pages**: Display the creator alongside other record details

## Best Practices

* Add the Created By field early — it only tracks records created after the field exists
* Pair with **Created At** for a complete creation audit trail
* Use in combination with [logged-in user filters](/views/filters/logged-in-user) to build "My Records" views
* Consider using alongside the [Last Updated By](/data/collections/field-types/last-updated-by) field for full accountability

## FAQs

1. **What happens to records that already exist when I add a Created By field?**

   Existing records will not have a Created By value. The field is only populated for records created after the field is added.
2. **Can I manually set or change the Created By value?**

   No. The Created By field is read-only and is automatically set by Noloco when a record is created. It cannot be edited after the fact.
3. **Does Created By work if a record is created via the API?**

   Yes, if the API request is authenticated as a Noloco user, the Created By field will be set to that user.
4. **What if a record is created by a workflow?**

   Records created by a workflow will have the Created By field set to the user who triggered the workflow, where applicable.
5. **Can I add more than one Created By field to a table?**

   No, each table can only have one Created By field.
6. **Does Created By work with external data sources like Airtable or PostgreSQL?**

   The Created By field is tracked by Noloco, so it will capture the user who creates the record through Noloco regardless of the underlying data source. Records created directly in the external source will not have a value.


# Last Updated By

Learn about the Last Updated By field in Noloco tables

The Last Updated By field automatically links each record to the last user who modified it. Every time a record is updated through Noloco, this field is refreshed to point to the user who made the change.

{% hint style="info" %}
You can only add **one** Last Updated By field per table.
{% endhint %}

## How It Works

* When a user updates a record in Noloco, the Last Updated By field is automatically set to that user
* The field behaves like a read-only relationship to the [Users table](/users-and-permissions/user-table)
* The value changes each time the record is modified, always reflecting the most recent editor
* Updates made outside of Noloco (e.g. directly in your database) will not update this field unless the updating user can be determined

## Adding a Last Updated By Field

1. Open the table you want to add the field to
2. Click 'New Field'
3. Add a new field and choose **Last Updated By** as the type
4. The field will begin tracking the last editor for all subsequent updates

{% hint style="warning" %}
The Last Updated By field is only populated when records are updated **after** the field is added. Existing records will not have a value until they are next modified.
{% endhint %}

## Use Cases

Last Updated By fields are ideal for:

* Quickly seeing who last touched a record without opening the full [Record History](/data-management/record-history)
* Auditing changes across your team — especially useful in approval or review workflows
* Building views that highlight records recently modified by a specific user
* Investigating data issues by identifying who made the most recent change

## Integration with Other Features

* [**Record History**](/data-management/record-history): Provides a quick-glance complement to the full change log — see the last editor at a glance, then open history for the full story
* [**Record-level permissions**](/users-and-permissions/user-roles-and-permissions/record-level-permissions): Use the Last Updated By field in permission rules if needed
* [**Filters**](/views/filters/logged-in-user): Filter views to show records last modified by the logged-in user
* **Views**: Display the last editor in table, card, or row views for at-a-glance accountability

## Best Practices

* Pair with the existing **Updated At** field for a complete picture of when and who last modified a record
* Use alongside the [Created By](/data/collections/field-types/created-by) field for full record lifecycle tracking
* Display in table views so team leads can quickly scan who is actively working on records
* Combine with [Record History](/data-management/record-history) for thorough audit trails

## FAQs

1. **What's the difference between Last Updated By and Record History?**

   Last Updated By shows only the most recent editor at a glance — it's a single field on the record. [Record History](/data-management/record-history) provides the full chronological log of every change, including what was changed and by whom.
2. **Can I manually set or change the Last Updated By value?**

   No. The field is read-only and is automatically updated by Noloco whenever a record is modified.
3. **Does every field change trigger a Last Updated By update?**

   Yes. Any change to the record made through Noloco will update the Last Updated By field to the user who made the change.
4. **What if a record is updated by a workflow?**

   Records updated by a workflow will have the Last Updated By field set to the user who triggered the workflow, where applicable.
5. **Can I add more than one Last Updated By field to a table?**

   No, each table can only have one Last Updated By field.
6. **Does Last Updated By work with external data sources?**

   The field is tracked by Noloco, so it captures the user who updates the record through Noloco regardless of the underlying data source. Changes made directly in the external source will not update this field.


# Assignee

Learn about the Assignee field in Noloco tables

The Assignee field is a first-class field type that links records to users in your app. It works like a relationship to the [Users table](/users-and-permissions/user-table) without requiring you to manually set up the relationship, and it comes with built-in assignment notifications.

## How It Works

* The Assignee field creates a direct link between a record and one or more users
* You can configure the field to allow a **single assignee** or **multiple assignees**
* When a user is assigned to a record, they can optionally receive a notification
* Assigned users are automatically included in [record comment](/record-pages/record-comments) notifications while they remain assigned

## Adding an Assignee Field

1. Open the table you want to add the field to
2. Click 'New Field'
3. Add a new field and choose **Assignee** as the type
4. Choose whether to allow single or multiple assignees
5. Configure notification preferences

## Configuration Options

* **Single Assignee** Only one user can be assigned to a record at a time. Assigning a new user replaces the previous one.
* **Multiple Assignees** Multiple users can be assigned to a single record simultaneously, useful for shared ownership or team-based work.
* **Assignment Notifications** Optionally notify users when they are assigned to a record, so they know work is waiting for them.

## Notification Behavior

The Assignee field integrates with Noloco's [notification system](/notifications/notifications):

* **On assignment**: Users can receive a notification when they are assigned to a record
* **Comment notifications**: While assigned, users are automatically subscribed to [record comments](/record-pages/record-comments) and notes on that record
* **On unassignment**: When a user is unassigned, they are unsubscribed from that record's comment notifications — unless they are subscribed through other means (e.g. they commented on or were mentioned in the record)

## Use Cases

Assignee fields are ideal for:

* Task and ticket management — assign work items to team members
* Approval workflows — assign a reviewer or approver to a record
* Case management — assign a case owner to customer requests
* Project management — assign team members to deliverables
* Support queues — route issues to specific agents

## Integration with Other Features

* [**Record-level permissions**](/users-and-permissions/user-roles-and-permissions/record-level-permissions): Use the Assignee field to restrict access so users only see records assigned to them
* [**Filters**](/views/filters/logged-in-user): Filter views by the logged-in user to build "My Tasks" or "Assigned to Me" views
* [**Workflows**](/workflows/workflows): Trigger workflows when a record is assigned or reassigned
* [**Notifications**](/notifications/notifications): Keep assignees informed about activity on their records

## Assignee vs. a Manual User Relationship

You could achieve similar linking by creating a standard [relationship](/data/collections/relationships) to the Users table, but the Assignee field offers several advantages:

* **No manual wiring** — the link to the Users table is set up automatically
* **Built-in notifications** — assignment and comment notifications work out of the box
* **Automatic subscriptions** — assignees stay informed without extra configuration
* **Semantic clarity** — the field communicates its purpose clearly in your data model

## Best Practices

* Use a single assignee when records need a clear owner (e.g. a primary contact or responsible person)
* Use multiple assignees for collaborative work where several people share responsibility
* Enable assignment notifications so users know when they have new work
* Combine with [logged-in user filters](/views/filters/logged-in-user) to build personal dashboards
* Pair with status or priority fields to help assignees triage their work

## FAQs

1. **What's the difference between an Assignee field and a relationship to the Users table?**

   An Assignee field is a purpose-built relationship to the Users table that requires no manual wiring and comes with built-in assignment notifications and automatic comment subscriptions. A standard [relationship](/data/collections/relationships) gives you the same data link but without these extras.
2. **Can I have multiple Assignee fields on the same table?**

   Yes. For example, you could have one Assignee field for "Owner" and another for "Reviewer" if your workflow requires different assignment roles.
3. **What notifications do assignees receive?**

   Depending on your configuration, assignees can receive a notification when they are assigned. While assigned, they are also automatically subscribed to [record comment](/record-pages/record-comments) notifications on that record.
4. **What happens when a user is unassigned?**

   They are unsubscribed from that record's comment notifications — unless they are subscribed through other means, such as having commented on or been mentioned in the record.
5. **Can I turn off assignment notifications?**

   Yes. Assignment notifications are optional and can be configured when setting up the Assignee field.
6. **Does the Assignee field work with permissions?**

   Yes. You can use the Assignee field in [record-level permissions](/users-and-permissions/user-roles-and-permissions/record-level-permissions) to restrict access so users only see or edit records assigned to them.
7. **Can I assign users who haven't been invited to the app yet?**

   No. Only users who exist in your [Users table](/users-and-permissions/user-table) can be assigned.


# Relationships

Learn more about how relationship lets you link one record to another

A relationship lets you link one record to another (or many others). The examples above showed how you can relate Projects to Companies, and Projects to Owners, but there are 4 different types of relationships all together.

### **One to One**

This is when each side of the relationship can only be directly related to at most one other record. For example, if each **Company** needed to be assigned an **admin,** you could say that each Company can have exactly one admin, but an admin can only be the admin of at most one company. That way you can easily access the company's admin's details.

### **Many to One**

This is the most common relationship. The relationships used in our examples were examples of many to one relationships. That is to say, A given **Company** can have many projects, but a **Project** belongs to a single company.

If you are using this data in the builder, the company will have a list of projects associated with it, but the project will have only one company associated with it.

### **One to Many**

This behaves the same as many to one but in reverse. It's handy if you can't figure out exactly which side of the relationship to put the field on. Although it's always preferable to use a Many to One.

For example, instead of adding the Many to one relationship on the **Project** table, you could instead add a One to Many relationship on the **Company** table, the end result would be the same.

### **Many to Many**

This is the most complex of all the relationships, but it is very useful if you need to have multiple options on both sides of the relationship.

If we take our Project owner relationship, but instead of a project only having one owner, if we change it to allow it to have **multiple** owners, then we would need a many to many relationship.

Each project can have many owners, and an owner (user) can be the owner to many projects.

When using this data in your portal, each side of the relationship will have a list of the opposite type. I.e. users will have a list of owned projects and projects will have a list of owners.


# Automatic Links

Learn how to add an automatic link to any non-Noloco data source

An automatic link can be added to any non-Noloco data source, such as Google Sheets or Airtable.

It allows you to add a custom link to another table/record from an existing record and then automatically sync that value with a lookup value.

For example:

If you have two spreadsheets, one named `Software` and one named `Suppliers`

The `Software` sheet has a `Supplier Name` column and the `Supplier` sheet has a `Name` column. But there's no link between them (because it's a spreadsheet)

You can define a new Automatic link field on the `Software` table: `Supplier` Then you can make it automatically link when `Supplier Name` = `Supplier`

![Automatic link between Supplier and Supplier Name](/files/lHtv2eVLJZE7kVkCkYY4)

Automatic links are bi-directional, so if you then update the linked field on a record (say the Supplier field), Noloco will automatically prefil the `Supplier Name` field in your spreadsheet with the correct value.

This makes it much easier to work with, as it introduces better filters, better views and better permissions.


# Rollup Fields

Learn more about Rollups

A rollup field is a summary of related fields. Choose a relationship on the same table, choose which field on the related table you need to summarize and then choose how to summarize it.

An example would be if you wanted to calculate the total cost of all projects that each client/company has in the above example. You would add a **rollup** field to the **Company** table with the **projects** relationship we defined earlier. The field to summarize would be **Cost** and you would want to **SUM** the costs, so you get the total sum of costs of all projects associated with a given company.

### Creating a rollup field

* Go to the table you would like to add the rollup field to. In the above example this is the **Company** table.
* Open the table settings sidebar
* Add a new field and choose **Rollup** as the type.
* Choose from one of the multi-relationship fields associated with your table
* Choose the field you would like to summarize on the other table
* Choose which method of aggregation you would like

{% @arcade/embed url="<https://noloco.share.arcade.software/share/SpCRrayYX5ZYISiukNj5>" flowId="SpCRrayYX5ZYISiukNj5" %}

### Aggregation Types

| Aggregation Type | Description                                       |
| ---------------- | ------------------------------------------------- |
| SUM              | The sum of all non-empty numeric values           |
| COUNT            | The number of all non-empty values                |
| MAX              | The largest of all the non-empty numeric values   |
| MIN              | The smallest of all the non-empty numeric values  |
| AVERAGE          | The average of all the non-empty numeric values   |
| CONCATENATE      | Join all the text values into a single text value |
| AND              | True if all of the values are true and non-empty  |
| OR               | True if any of the values are true                |

### What about non-numeric types like Durations and Dates?

Aggregation of durations and dates will behave exactly as expected, where the sum of a duration field is the sum of all the times, and the min of a date field is the earliest date


# Lookup Fields

Lookups in Noloco allow you to fetch and display related information from other data tables, enhancing your data relationships and insights without duplicating data.

### **What is a Lookup Field?**

{% embed url="<https://www.youtube.com/watch?v=k506RVMGIuA>" %}

A lookup field in Noloco enables you to pull in data from a different table based on a linked relationship. This means you can display related information from another table without manually copying the data, ensuring consistency and reducing redundancy. Lookups are particularly useful for creating dynamic and interconnected datasets, such as referencing client details in a project management table or product information in an order tracking table.

### **Creating a Lookup Field**

1. **Navigate to Your Table**: Open the Noloco table where you want to add the lookup.
2. **Add a New Field**: Click on “Add Field” and select “Lookup”.
3. **Configure the Lookup**:
   * **Linked Field**: Select the linked field that connects the current table to the source table.
   * **Field to Lookup**: Choose the specific field from the source table you want to display.

{% @arcade/embed url="<https://noloco.share.arcade.software/share/YAYHImjWFUd5T4eHdpdP>" flowId="YAYHImjWFUd5T4eHdpdP" %}

**Example Use Cases**

* **Project Management**: Display client names from a clients table within a projects table.
* **Sales Tracking**: Show product details in an orders table.

### **Advanced Options**

* **Formulas**: Combine lookup fields with formulas for advanced data manipulation.

### **Best Practices**

* **Data Integrity**: Use lookups to maintain consistency and reduce data redundancy.
* **Performance**: Optimize lookup fields by filtering unnecessary data.

### **FAQs about Lookup Fields**

1. **What data sources are supported for Lookups?**

   Noloco supports lookups from all data sources, including [Noloco Tables](/data/collections), [Airtable](/data/airtable), [SmartSuite](/data/smartsuite) [Google Sheets](/data/google-sheets), [PostgreSQL](/data/postgresql), [MySQL](/data/mysql), and [Xano](/data/xano). You can even add a lookup to a linked field that links across two different data sources.
2. **What field types are supported for Lookups?**

   You can use lookup fields with various data types such as text, numbers, dates, and even linked fields. The only unsupported field at the moment are file/attachment fields.
3. **Can I filter the data in a Lookup field?**

   No, not at the moment, you can not apply filters to your lookups, but let us know if this is something you want to see in Noloco.
4. **How do Lookups help with data consistency?**

   By referencing data from a single source, lookups ensure that any updates to the source data are reflected across all linked tables, maintaining consistency.
5. **Can I use Lookups in formulas?**

   Yes, you can use lookup fields within formulas to perform advanced data manipulations.
6. **Are Lookups real-time?**

   Yes, lookups fetch the latest data from the source table, ensuring real-time updates and synchronization. They are updated whenever one of the underlying links or values are updated.


# Formulas

Overview of formula fields in Noloco — what they are, when they recalculate, and what types of values they output.

A **formula field** contains a value calculated from a spreadsheet-like expression. Formulas operate on other fields on the same record — including other formula fields — supporting mathematical, logical, text, and date-based processing. For example, a *full name* field on the **User** table could concatenate the *first name* and *last name* fields.

This page covers the concept and lifecycle. For task and reference content, see:

* [Creating a formula field](/data/collections/formulas/creating-formula-fields) — step-by-step setup
* [Examples](/data/collections/formulas/examples) — common formula recipes
* [Troubleshooting](/data/collections/formulas/troubleshooting) — fixing formulas that don't work
* [Operators reference](/data/collections/formulas/operators) — all supported operators, grouped by category:
  * [Date & time operators](/data/collections/formulas/operators/date-and-time)
  * [Logic operators](/data/collections/formulas/operators/logic)
  * [Math operators](/data/collections/formulas/operators/math)
  * [Text operators](/data/collections/formulas/operators/text)

### When do formulas calculate?

A formula's value for a given record recalculates when any of the following occur:

* The formula field is created
* The formula is updated
* A new record is added
* A field referenced in the formula is updated

If a formula doesn't reference any other fields, it will only recalculate when:

* The formula is added initially
* The formula is edited
* The record is initially created

### Output types

When a formula is added or updated, Noloco inspects the output and assigns a type based on the result pattern. The possible output types are:

* **Boolean** — formula must return `true` or `false`
* **Date** — formula must return a value wrapped in the `TODATE` operator
* **Decimal**
* **Integer**
* **Text**


# Creating a formula field

Step-by-step guide to creating a formula field on a Noloco table.

This page covers how to add a formula field to a table. For the concept overview, see [Formulas](/data/collections/formulas). For ready-to-use formula patterns, see [Examples](/data/collections/formulas/examples).

### Steps

1. On the **Data** tab of your portal, navigate to the table you'd like to add the formula field to.
2. Add a new field and choose **Formula** as the type.
3. Enter the formula. To reference another field, select it from the dropDown menu to insert the reference at the current cursor location.

### Next steps

* Browse the [Operators reference](/data/collections/formulas/operators) to see what's supported.
* See [Examples](/data/collections/formulas/examples) for common patterns (full names, deadlines, calculations).
* If the formula isn't producing the expected value, see [Troubleshooting](/data/collections/formulas/troubleshooting).


# Examples

Common formula recipes for Noloco — joining text, replacing parts of strings, adding days to dates, and basic calculations.

A collection of common formula patterns. Field references appear in **green** in the examples below.

For the full reference, see the [Operators](/data/collections/formulas/operators) pages. For setup steps, see [Creating a formula field](/data/collections/formulas/creating-formula-fields).

### Joining text fields

Create a full name from a first name and last name, adding a space in between only if both fields have a value:

*<mark style="color:green;">**`first name`**</mark>*` `` `` ``& ``IF(OR(ISBLANK( `*<mark style="color:green;">**`first name`**</mark>*`),ISBLANK(`*<mark style="color:green;">**`last name`**</mark>*`)),""," ")`` &`` ``_<mark style="color:green;">**`last name\`\*\*\_

### Replacing part of a text field

Replace `"-old"` with `" (discontinued)"` for a nicer record view:

`SUBSTITUTE(`<mark style="color:green;">`name`</mark>`, "-old", " (discontinued)")`

### Adding days to a date

Create a deadline one week after an important date:

`TODATE(`<mark style="color:green;">`important date`</mark>` ``+ 7)`

### Adding working days to a date

Create a deadline several working days after an important date, taking holidays and weekends into account:

`TODATE(WORKDAY(important date, 3, {"2024-06-03","2024-12-25"}))`

### Calculations

Calculate gross sales:

<mark style="color:green;">`(number sold`</mark>`-`<mark style="color:green;">`number refunded)`</mark>`*`<mark style="color:green;">`price`</mark>


# Troubleshooting

How to diagnose and fix formula fields that aren't returning the expected value in Noloco. Common pitfalls include comparing Single/Multiple Option fields against bare identifiers instead of quoted op

If your formula isn't working as expected, the most common cause is an **incompatible field type**. For example, trying to perform a calculation on a text field, or using a date field in a way that requires a number, will cause errors.

A frequent mistake is when fields are set up as **text fields** but used in a formula as if they were **numbers** — for instance, comparing two text values like `"45"` and `"60"` as though they were numeric. Since they're stored as text, the formula can't evaluate the comparison correctly.

{% hint style="info" %}
**Tip:** If you intend to run numeric operations, make sure the fields are set to a number type. Double-checking and adjusting field types usually resolves the issue quickly.
{% endhint %}

### Troubleshooting checklist

1. **Check field types** — confirm whether the fields in your formula are text, number, date, boolean, etc.
2. **Match field type to operation** — ensure the operation you're performing (e.g., addition, concatenation) is valid for that field type.
3. **Adjust if needed** — update the field type (for example, change from text to number) or rewrite the formula to match the data type.
4. **Test the formula** — try the formula by selecting a record and seeing if the preview result matches what you expect.

### Common pitfalls

#### Comparing against Single / Multiple Option fields

When you compare a [Single Option Select](/data/collections/field-types/single-option-select) or [Multiple Option Select](/data/collections/field-types/multiple-option-select) field, the comparison value must be the option's **name** (its underlying value) written as a **quoted string** — not a bare identifier.

* ✅ Correct: `status = "Approved"`
* ❌ Wrong: `status = APPROVED` — bare identifier; the formula treats `APPROVED` as a missing field reference.
* ❌ Wrong: matching against the option's display label when it differs from the underlying name — use the name, not the display value.

#### `NULL`, `TRUE`, and `FALSE` need parentheses

These are functions in Noloco formulas. They must be called with parentheses:

* ✅ Correct: `NULL()`, `TRUE()`, `FALSE()`
* ❌ Wrong: `NULL`, `TRUE`, `FALSE`

#### Spreadsheet functions that don't exist in Noloco

Some common spreadsheet operators have no Noloco equivalent. See the [Not supported](/data/collections/formulas/operators/date-and-time#not-supported) section on the date & time operators page — most notably:

* `NETWORKDAYS` is not supported. Use [`WORKDAY`](/data/collections/formulas/operators/date-and-time#workday) when you need a date N working days from a start date.
* `DATEADD` is not supported. Use the `+` operator (e.g. `date + 7`) or [`EDATE`](/data/collections/formulas/operators/date-and-time#edate) for months.

#### `NOW()` and `TODAY()` don't auto-refresh

`NOW()` and `TODAY()` are supported, but they're not live values. A formula field only recalculates when its referenced fields change (or when the formula or the record is created or edited) — so a `due_date - TODAY()` formula will not tick down on its own each day. If you need a live "days until" or "elapsed time" value, use a runtime filter or a workflow instead of a formula field.

### Related

* [Formulas overview](/data/collections/formulas)
* [Operators reference](/data/collections/formulas/operators)
* [Examples](/data/collections/formulas/examples)


# Operators

Complete cheat sheet of every operator supported in Noloco formula fields, grouped by category. Use this page to scan or search all operators at once; follow the category links for full details and ex

A single-page cheat sheet of **every operator** supported in Noloco [formulas](/data/collections/formulas). Use `Cmd/Ctrl+F` to search the whole catalog from this page.

For detailed entries with examples and parameter notes, see the category pages:

* [Date & time operators](/data/collections/formulas/operators/date-and-time)
* [Logic operators](/data/collections/formulas/operators/logic)
* [Math operators](/data/collections/formulas/operators/math)
* [Text operators](/data/collections/formulas/operators/text)

***

### Date & time

| Operator     | Description                                                             | Signature                                  |
| ------------ | ----------------------------------------------------------------------- | ------------------------------------------ |
| `+`          | Adds a number of days to a date                                         | `date + numberOfDays`                      |
| `-`          | Subtracts a number of days from a date                                  | `date - numberOfDays`                      |
| `TODATE`     | Converts a value to Noloco's date output format                         | `TODATE(date)`                             |
| `DATE`       | Builds a date from year, month, day                                     | `DATE(year, month, day)`                   |
| `DATEVALUE`  | Parses a date string (`"mm-dd-yyyy"` or `"yyyy-mm-dd"`)                 | `DATEVALUE(dateText)`                      |
| `DAY`        | Day component of a date                                                 | `DAY(date)`                                |
| `DAYS`       | Number of days between two dates                                        | `DAYS(end, start)`                         |
| `WORKDAY`    | Date N working days before/after start, excluding weekends and holidays | `WORKDAY(start, numberOfDays, [holidays])` |
| `EDATE`      | Date N months before/after a date                                       | `EDATE(date, numberOfMonths)`              |
| `EOMONTH`    | Last day of a month N months before/after a date                        | `EOMONTH(date, numberOfMonths)`            |
| `HOUR`       | Hours component of a datetime/time                                      | `HOUR(datetime)`                           |
| `MINUTE`     | Minutes component of a datetime/time                                    | `MINUTE(datetime)`                         |
| `SECOND`     | Seconds component of a datetime/time                                    | `SECOND(datetime)`                         |
| `TIME`       | Builds a fractional time from hour, minute, second                      | `TIME(hour, minute, second)`               |
| `TIMEVALUE`  | Parses a time string to a fractional time                               | `TIMEVALUE(timeText)`                      |
| `MONTH`      | Month of a date (numeric)                                               | `MONTH(date)`                              |
| `YEAR`       | Year of a date                                                          | `YEAR(date)`                               |
| `NOW`        | Current date and time as a serial number (does not auto-refresh)        | `NOW()`                                    |
| `TODAY`      | Current date as a serial number (does not auto-refresh)                 | `TODAY()`                                  |
| `WEEKNUM`    | Week number a date falls on                                             | `WEEKNUM(date)`                            |
| `ISOWEEKNUM` | ISO week number a date falls on                                         | `ISOWEEKNUM(date)`                         |
| `YEARFRAC`   | Years (with fraction) between two dates                                 | `YEARFRAC(start, end)`                     |

Full details: [Date & time operators](/data/collections/formulas/operators/date-and-time)

***

### Logic

| Operator   | Description                                    | Signature                               |
| ---------- | ---------------------------------------------- | --------------------------------------- |
| `<`        | Less than                                      | `value1 < value2`                       |
| `>`        | Greater than                                   | `value1 > value2`                       |
| `=`        | Equal to                                       | `value1 = value2`                       |
| `AND`      | True if all arguments are true                 | `AND(logicValue, logicValue, ...)`      |
| `OR`       | True if any argument is true                   | `OR(logicValue, logicValue, ...)`       |
| `NOT`      | Inverts a boolean                              | `NOT(logicValue)`                       |
| `IF`       | Returns one of two values based on a condition | `IF(logicValue, trueValue, falseValue)` |
| `TRUE`     | The value `true`                               | `TRUE()`                                |
| `FALSE`    | The value `false`                              | `FALSE()`                               |
| `NULL`     | The value `null`                               | `NULL()`                                |
| `ISNUMBER` | True if the argument is a number               | `ISNUMBER(value)`                       |

Full details: [Logic operators](/data/collections/formulas/operators/logic)

***

### Math

| Operator    | Description                               | Signature                       |
| ----------- | ----------------------------------------- | ------------------------------- |
| `+`         | Addition                                  | `value1 + value2`               |
| `-`         | Subtraction                               | `value1 - value2`               |
| `*`         | Multiplication                            | `value1 * value2`               |
| `/`         | Division                                  | `value1 / value2`               |
| `ABS`       | Absolute value                            | `ABS(number)`                   |
| `CEILING`   | Rounds up to a multiple of significance   | `CEILING(number, significance)` |
| `FLOOR`     | Rounds down to a multiple of significance | `FLOOR(number, significance)`   |
| `ROUND`     | Rounds to N decimal places                | `ROUND(number, places)`         |
| `ROUNDUP`   | Rounds up to N decimal places             | `ROUNDUP(number, places)`       |
| `ROUNDDOWN` | Rounds down to N decimal places           | `ROUNDDOWN(number, places)`     |
| `INT`       | Rounds down to the nearest integer        | `INT(number)`                   |
| `EVEN`      | Rounds to nearest even integer            | `EVEN(number)`                  |
| `ODD`       | Rounds to nearest odd integer             | `ODD(number)`                   |
| `TRUNC`     | Returns the integer component             | `TRUNC(number)`                 |
| `MOD`       | Modulo                                    | `MOD(number, divisor)`          |
| `POWER`     | Raises to a power                         | `POWER(number, power)`          |
| `SQRT`      | Positive square root                      | `SQRT(number)`                  |
| `LOG`       | Logarithm with a given base               | `LOG(number, base)`             |
| `FACT`      | Factorial                                 | `FACT(number)`                  |
| `SIGN`      | -1, 0, or 1 depending on sign             | `SIGN(number)`                  |
| `SUM`       | Sum of arguments                          | `SUM(number, number2, ...)`     |
| `PRODUCT`   | Product of arguments                      | `PRODUCT(number, number2, ...)` |
| `DECIMAL`   | Parses a numeric string to a decimal      | `DECIMAL(text)`                 |

Full details: [Math operators](/data/collections/formulas/operators/math)

***

### Text

| Operator      | Description                                       | Signature                                                          |
| ------------- | ------------------------------------------------- | ------------------------------------------------------------------ |
| `&`           | Concatenates two strings (alias of `CONCATENATE`) | `text1 & text2`                                                    |
| `CONCATENATE` | Concatenates two strings                          | `CONCATENATE(text1, text2)`                                        |
| `LEFT`        | Substring from the start                          | `LEFT(text, numberOfCharacters)`                                   |
| `RIGHT`       | Substring from the end                            | `RIGHT(text, numberOfCharacters)`                                  |
| `MID`         | Substring from the middle                         | `MID(text, startPosition, numberOfCharacters)`                     |
| `LEN`         | String length                                     | `LEN(text)`                                                        |
| `UPPER`       | Uppercase a string                                | `UPPER(text)`                                                      |
| `LOWER`       | Lowercase a string                                | `LOWER(text)`                                                      |
| `PROPER`      | Capitalize each word                              | `PROPER(text)`                                                     |
| `TRIM`        | Removes leading and trailing spaces               | `TRIM(text)`                                                       |
| `CLEAN`       | Removes non-printable characters                  | `CLEAN(text)`                                                      |
| `FIND`        | First position of a substring                     | `FIND(searchQuery, text)`                                          |
| `SEARCH`      | First position of a substring after a start index | `SEARCH(searchQuery, text, startPosition)`                         |
| `REPLACE`     | Replace part of a string by position              | `REPLACE(text, startPosition, replacementLength, replacementText)` |
| `SUBSTITUTE`  | Replace all occurrences of a substring            | `SUBSTITUTE(text, searchQuery, replacement)`                       |
| `REPT`        | Repeats a string N times                          | `REPT(text, numberOfTimes)`                                        |
| `EXACT`       | True if two strings are identical                 | `EXACT(text1, text2)`                                              |
| `ISBLANK`     | True if a string is blank                         | `ISBLANK(text)`                                                    |
| `TEXT`        | Formats a number as text                          | `TEXT(number, format)`                                             |

Full details: [Text operators](/data/collections/formulas/operators/text)

***

### How operator entries are structured (on category pages)

Each operator on the category pages follows the same shape:

* **Heading** — the operator name as you'd type it in a formula (`### WORKDAY`)
* **Signature** — call signature with parameter names, in a code block directly under the heading (`` `WORKDAY(start, numberOfDays, [holidays])` ``)
* **Description** — one-line summary of what it does
* **Example** — sample usage (where applicable), labelled `**Example:**`

### Related

* [Formulas overview](/data/collections/formulas)
* [Examples](/data/collections/formulas/examples)
* [Troubleshooting](/data/collections/formulas/troubleshooting)


# Date & time operators

Reference for all date and time operators supported in Noloco formula fields, including TODATE, DATE, DAY, DAYS, WORKDAY, EDATE, EOMONTH, HOUR, MINUTE, SECOND, MONTH, YEAR, WEEKNUM, ISOWEEKNUM, YEARFR

All date and time operators supported in Noloco [formulas](/data/collections/formulas). To return a value typed as a Date, wrap the result in `TODATE`.

**Available operators:** `+`, `-`, `TODATE`, `DATE`, `DATEVALUE`, `DAY`, `DAYS`, `WORKDAY`, `EDATE`, `EOMONTH`, `HOUR`, `ISOWEEKNUM`, `MINUTE`, `MONTH`, `NOW`, `SECOND`, `TIME`, `TIMEVALUE`, `TODAY`, `WEEKNUM`, `YEAR`, `YEARFRAC`.

***

### +

`date + numberOfDays`

Adds a number of days to a date.

**Example:** `date + 1`

### -

`date - numberOfDays`

Subtracts a number of days from a date.

**Example:** `date - 2`

### TODATE

`TODATE(date)`

Converts a date to the correct output format for a Noloco date. Required wrapper when a formula's output type should be Date.

**Example:** `TODATE(important date + 7)`

### DATE

`DATE(year, month, day)`

Converts a provided year, month, and day to a serial date.

**Example:** `DATE(2024, 6, 3)`

### DATEVALUE

`DATEVALUE(dateText)`

Converts a date from text in one of the two formats `"mm-dd-yyyy"` or `"yyyy-mm-dd"` to a serial date.

**Example:** `DATEVALUE("2024-06-03")`

### DAY

`DAY(date)`

Returns the day component of a date.

### DAYS

`DAYS(end, start)`

Returns the number of days between two dates.

### WORKDAY

`WORKDAY(start, numberOfDays, [holidays])`

Date representing the number of working days before or after the starting date. Working days exclude weekends and any dates identified as holidays.

**Example:** `WORKDAY(start_date, 3, {"2024-06-03","2024-12-25"})`

### EDATE

`EDATE(date, numberOfMonths)`

Date representing a date a given number of months before or after a provided date.

### EOMONTH

`EOMONTH(date, numberOfMonths)`

Date representing the last day of a month a given number of months before or after a provided date.

### HOUR

`HOUR(datetime)`

The hours from a datetime or time value.

### ISOWEEKNUM

`ISOWEEKNUM(date)`

The ISO week number a date falls on.

### MINUTE

`MINUTE(datetime)`

The minutes from a valid datetime or time value.

### MONTH

`MONTH(date)`

The month of a provided date in numeric format.

### NOW

`NOW()`

Returns the current date and time as a serial number. Useful for date arithmetic against the current moment.

**Example:** `NOW() - start_date`

{% hint style="warning" %}
`NOW()` does **not** refresh in real time. Like every formula, its value is only recalculated when one of the [formula's recalculation triggers](/data/collections/formulas#when-do-formulas-calculate) fires (the field is created, edited, a new record is added, or a referenced field changes). If you need a live current time, do not rely on `NOW()` — use a workflow or a runtime filter instead.
{% endhint %}

### SECOND

`SECOND(datetime)`

The seconds from a valid datetime or time value.

### TIME

`TIME(hour, minute, second)`

Converts a provided hour, minute, and second to a fractional time.

### TIMEVALUE

`TIMEVALUE(timeText)`

Converts a time in an accepted format to a valid fractional time. Accepts: `"1:10 AM"`, `"1:10:05 AM"`, `"18:20"`, `"18:20:15"`.

### TODAY

`TODAY()`

Returns the current date as a serial number. Useful for date arithmetic like "days until due".

**Example:** `due_date - TODAY()`

{% hint style="warning" %}
`TODAY()` does **not** refresh in real time. It only updates when one of the [formula's recalculation triggers](/data/collections/formulas#when-do-formulas-calculate) fires. Records that aren't otherwise edited will keep a stale `TODAY()` value. For live "days until" indicators, prefer a runtime filter or a workflow rather than a formula field.
{% endhint %}

### WEEKNUM

`WEEKNUM(date)`

The week number the date falls on.

### YEAR

`YEAR(date)`

The year from a date.

### YEARFRAC

`YEARFRAC(start, end)`

The number of years (and fractional years) between two dates.

***

### Not supported

The following spreadsheet-style date functions are **not** supported in Noloco formulas. Use the alternatives listed below.

| Not supported | Use instead                                                                                                                                                                  |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `NETWORKDAYS` | [`WORKDAY`](#workday) — returns a date after N working days. For counting working days *between* two dates, there is no direct equivalent; combine `DAYS` with custom logic. |
| `DATEADD`     | The `+` operator — e.g. `date + 7` adds 7 days. To add months, use [`EDATE`](#edate).                                                                                        |

***

### Related

* [Formulas overview](/data/collections/formulas)
* [Examples](/data/collections/formulas/examples) — including "Adding days to a date" and "Adding working days to a date"
* [Logic operators](/data/collections/formulas/operators/logic)
* [Math operators](/data/collections/formulas/operators/math)
* [Text operators](/data/collections/formulas/operators/text)


# Logic operators

Reference for all logic and comparison operators supported in Noloco formula fields, including IF, AND, OR, NOT, TRUE, FALSE, NULL, ISNUMBER, and the comparison operators <, >, =. NULL, TRUE, and FALS

All logic and comparison operators supported in Noloco [formulas](/data/collections/formulas). Use these for conditional values, boolean composition, and value comparisons.

**Available operators:** `<`, `>`, `=`, `AND`, `OR`, `NOT`, `IF`, `TRUE`, `FALSE`, `NULL`, `ISNUMBER`.

***

### <

`value1 < value2`

Returns `true` if the first value is less than the second.

**Example:** `1 < 2`

### >

`value1 > value2`

Returns `true` if the first value is greater than the second.

**Example:** `1 > 2`

### =

`value1 = value2`

Returns `true` if the first value equals the second.

**Example:** `1 = 2`

### AND

`AND(logicValue, logicValue, ...)`

Returns `true` if all arguments are `true`.

### OR

`OR(logicValue, logicValue, ...)`

Returns `true` if any argument is `true`.

### NOT

`NOT(logicValue)`

Returns the opposite of a logical value.

**Example:** `NOT(TRUE())` returns `FALSE()`

### IF

`IF(logicValue, trueValue, falseValue)`

Returns one value when a condition is `true`, and another when it is `false`.

### TRUE

`TRUE()`

Returns the value `true`.

### FALSE

`FALSE()`

Returns the value `false`.

### NULL

`NULL()`

Returns the value `null`.

{% hint style="warning" %}
**Must be called as `NULL()` with parentheses.** Writing `NULL` (without parentheses) is not valid and will cause the formula to fail. The same applies to `TRUE()` and `FALSE()`.
{% endhint %}

### ISNUMBER

`ISNUMBER(value)`

Returns `true` if the argument is a number.

***

### Related

* [Formulas overview](/data/collections/formulas)
* [Examples](/data/collections/formulas/examples) — see "Joining text fields" for an `IF`/`OR`/`ISBLANK` pattern
* [Date & time operators](/data/collections/formulas/operators/date-and-time)
* [Math operators](/data/collections/formulas/operators/math)
* [Text operators](/data/collections/formulas/operators/text)


# Math operators

Reference for all math and numeric operators supported in Noloco formula fields, including +, -, \*, /, ABS, CEILING, FLOOR, ROUND, ROUNDUP, ROUNDDOWN, INT, EVEN, ODD, MOD, POWER, SQRT, LOG, FACT, SIGN

All math and numeric operators supported in Noloco [formulas](/data/collections/formulas). Use these for arithmetic, rounding, powers, and aggregation.

**Available operators:** `+`, `-`, `/`, `*`, `ABS`, `CEILING`, `DECIMAL`, `EVEN`, `FACT`, `FLOOR`, `INT`, `LOG`, `MOD`, `ODD`, `POWER`, `PRODUCT`, `ROUND`, `ROUNDDOWN`, `ROUNDUP`, `SIGN`, `SQRT`, `SUM`, `TRUNC`.

***

### +

`value1 + value2`

Adds the values on either side.

**Example:** `10 + 2`

### -

`value1 - value2`

Subtracts the values on either side.

**Example:** `10 - 2`

### \*

`value1 * value2`

Multiplies the values on either side.

**Example:** `10 * 2`

### /

`value1 / value2`

Divides the values on either side.

**Example:** `10 / 2`

### ABS

`ABS(number)`

Returns the absolute value of a number.

### CEILING

`CEILING(number, significance)`

Rounds a number up to the closest multiple of significance.

### DECIMAL

`DECIMAL(text)`

Converts text representation of a number to a decimal.

### EVEN

`EVEN(number)`

Rounds a number to the nearest even integer.

### FACT

`FACT(number)`

Returns the factorial of a number.

### FLOOR

`FLOOR(number, significance)`

Rounds a number down to the closest multiple of significance.

### INT

`INT(number)`

Rounds a number down to the nearest integer (less than or equal).

### LOG

`LOG(number, base)`

Logarithm of a number for a provided base.

### MOD

`MOD(number, divisor)`

Modulo of a number.

### ODD

`ODD(number)`

Rounds a number to the nearest odd integer.

### POWER

`POWER(number, power)`

Raises a number to a power.

### PRODUCT

`PRODUCT(number, number2, ...)`

Multiplies the arguments together.

### ROUND

`ROUND(number, places)`

Rounds a number to the closest value for a given number of decimal places.

### ROUNDDOWN

`ROUNDDOWN(number, places)`

Rounds a number down for a given number of decimal places.

### ROUNDUP

`ROUNDUP(number, places)`

Rounds a number up for a given number of decimal places.

### SIGN

`SIGN(number)`

Returns the sign of a number:

* `-1` if the number is negative
* `0` if zero
* `1` if positive

### SQRT

`SQRT(number)`

Returns the positive square root of a positive number.

### SUM

`SUM(number, number2, ...)`

Sums the arguments.

### TRUNC

`TRUNC(number)`

Returns the integer component of a number.

***

### Related

* [Formulas overview](/data/collections/formulas)
* [Examples](/data/collections/formulas/examples) — see "Calculations"
* [Date & time operators](/data/collections/formulas/operators/date-and-time)
* [Logic operators](/data/collections/formulas/operators/logic)
* [Text operators](/data/collections/formulas/operators/text)


# Text operators

Reference for all text and string operators supported in Noloco formula fields, including &, CONCATENATE, LEFT, RIGHT, MID, LEN, UPPER, LOWER, PROPER, TRIM, CLEAN, FIND, SEARCH, REPLACE, SUBSTITUTE, R

All text and string operators supported in Noloco [formulas](/data/collections/formulas). Use these for concatenation, substrings, search, case conversion, and formatting.

**Available operators:** `&`, `CLEAN`, `CONCATENATE`, `EXACT`, `FIND`, `ISBLANK`, `LEFT`, `LEN`, `LOWER`, `MID`, `PROPER`, `REPLACE`, `REPT`, `RIGHT`, `SEARCH`, `SUBSTITUTE`, `TEXT`, `TRIM`, `UPPER`.

***

### &

`text1 & text2`

Appends two strings to one another. Alias for `CONCATENATE`.

**Example:** `"Hello " & "World"`

### CONCATENATE

`CONCATENATE(text1, text2)`

Appends two strings to one another.

### CLEAN

`CLEAN(text)`

Removes non-printable characters from a string.

### EXACT

`EXACT(text1, text2)`

Checks if two strings are identical.

### FIND

`FIND(searchQuery, text)`

Returns the first position a string occurs within another string.

### ISBLANK

`ISBLANK(text)`

Returns `true` if a string is blank.

### LEFT

`LEFT(text, numberOfCharacters)`

Returns a substring from the beginning of a string.

### LEN

`LEN(text)`

Returns the length of a string.

### LOWER

`LOWER(text)`

Returns a string in lowercase.

### MID

`MID(text, startPosition, numberOfCharacters)`

Returns a substring from the middle of a string.

### PROPER

`PROPER(text)`

Returns a string with words capitalized.

### REPLACE

`REPLACE(text, startPosition, replacementLength, replacementText)`

Replaces part of a string with another provided string, based on position.

### REPT

`REPT(text, numberOfTimes)`

Repeats a string a number of times.

### RIGHT

`RIGHT(text, numberOfCharacters)`

Returns a substring from the end of a string.

### SEARCH

`SEARCH(searchQuery, text, startPosition)`

Returns the first position a string occurs in another string after a start character position.

### SUBSTITUTE

`SUBSTITUTE(text, searchQuery, replacement)`

Replaces all occurrences of a provided query with a provided replacement in a string.

**Example:** `SUBSTITUTE(name, "-old", " (discontinued)")`

### TEXT

`TEXT(number, format)`

Converts a number into text according to a specified format.

### TRIM

`TRIM(text)`

Removes spaces from the beginning and end of a string.

### UPPER

`UPPER(text)`

Returns a string in uppercase.

***

### Related

* [Formulas overview](/data/collections/formulas)
* [Examples](/data/collections/formulas/examples) — see "Joining text fields" and "Replacing part of a text field"
* [Date & time operators](/data/collections/formulas/operators/date-and-time)
* [Logic operators](/data/collections/formulas/operators/logic)
* [Math operators](/data/collections/formulas/operators/math)


# Noloco AI

AI-powered columns that bring intelligence to your tables by using AI to perform tasks like classification, summarization, sentiment analysis, grammar correction and more

### **What is Noloco AI?**

Noloco AI-powered columns bring intelligence to your data by leveraging advanced AI models to perform tasks like classification, summarization, sentiment analysis, grammar correction, keyword extraction, and custom operations using chat prompts.

With Noloco AI, you can automate data analysis, improve workflow efficiency, and enhance the overall usability of your tables.

### **How to Add an AI-Powered Column**

Follow these simple steps to add an AI-powered column to your Noloco table:

{% stepper %}
{% step %}
**Navigate to Your Table**: Open the data table where you'd like to add the AI-powered column.
{% endstep %}

{% step %}
**Click ‘New Field’**: Select the option to create a new column.

Provide a descriptive name for the new field
{% endstep %}

{% step %}
**Select Field Type**: Choose **AI Powered** as the field type.
{% endstep %}

{% step %}
**Choose an Operation**: Select from the following operations:

* **Classify**: Categorize data based on predefined options.
* **Summarize**: Condense lengthy text into concise summaries.
* **Sentiment**: Determine the emotional tone of the text.
* **Chat Prompt**: Use custom prompts to generate tailored outputs.
* **Correct Grammar**: Refine text for grammatical accuracy.
* **Keyword Extraction**: Identify relevant keywords from the input text.
  {% endstep %}

{% step %}
**Provide Input Text**: Depending on the operation, define the input text to the AI model

* **Static Text**: Fixed phrases or instructions.
* **Dynamic Content**: References to other fields in the row. Use the **field tokens** for easy selection.
  {% endstep %}
  {% endstepper %}

{% @arcade/embed url="<https://app.arcade.software/share/ZA1qKytsnccdpJ05lyHa>" flowId="6TtE588aIASSwxWKMMye" %}

### **Supported Operations**

#### **Classify**

Automatically categorize data based on specific criteria. Use predefined options to sort or group data effortlessly.

* **Description**: Assign categories to your data using static or dynamic inputs. Customize the output type as single or multiple options and define your categories for precision.
* **Example**:
  * **Task**: Classify maintenance issues based on descriptions.
  * **Input**: "Forklift overheating"
  * **Output**: Urgent

#### **Summarize**

Condense lengthy or complex information into short, meaningful summaries.

* **Description**: Simplify raw text or row values into concise outputs, saving time and improving data clarity.
* **Example**:
  * **Task**: Summarize incident reports for quick review.
  * **Input**: “Machine A stopped due to overheating after prolonged use.”
  * **Output**: “Machine A overheated during use.”

#### **Sentiment**

Gauge the emotional tone of text to prioritize and address issues effectively.

* **Description**: Analyze text to determine if it’s positive, negative, or neutral. Define sentiment categories that align with your use case.
* **Example**:
  * **Task**: Analyze employee feedback for morale.
  * **Input**: “Workload is overwhelming, but team support is excellent.”
  * **Output**: Negative

#### **Chat Prompt**

Leverage custom prompts to perform a variety of tasks tailored to your needs.

* **Description**: Design specific prompts and define the expected output type (text, date, boolean, or number). Use this flexible operation for creative and diverse use cases.
* **Example**:
  * **Task**: Generate personalized email responses.
  * **Input**: "Dear \[Customer Name], thank you for reaching out regarding \[Issue]."
  * **Output**: Polished email draft tailored to the customer.

#### **Correct Grammar**

Ensure professional communication by refining text for grammatical accuracy.

* **Description**: Transform informal or error-prone text into polished, client-ready outputs.
* **Example**:
  * **Task**: Refine internal quality control logs.
  * **Input**: “batch fail tests bcoz contamination.”
  * **Output**: “Batch failed tests due to contamination.”

#### **Keyword Extraction**

Identify the most relevant keywords from your data for actionable insights.

* **Description**: Extract important terms from raw text to uncover trends or guide decision-making.
* **Example**:
  * **Task**: Analyze customer feedback for marketing campaigns.
  * **Input**: “Great durability and affordable price; lacks color options.”
  * **Output**: “Durability, affordable price, color options”

### **Best Practices for Effective Prompts**

* **Be Clear and Specific**: Use precise language to avoid ambiguity.
* **Keep It Relevant**: Ensure input text is closely aligned with the operation’s purpose.
* **Leverage Structure**: Break down complex prompts into logical components.
* **Test and Iterate**: Regularly review outputs and refine prompts as needed.

### **Key Tips for Using Noloco AI**

* **Dynamic Text Integration**: Combine static text with references to other fields using **tokens** in the input box.
* **Preview Ideas**: Although Noloco currently doesn’t show resolved dynamic text, double-check your inputs for clarity.
* **No Length Limits**: Feel free to craft prompts as long as necessary, but structured prompts often yield better results.

### FAQs about Noloco AI

<details>

<summary><strong>When do AI columns regenerate?</strong></summary>

AI-powered columns automatically regenerate whenever the input data for a row changes. This ensures that the output remains up-to-date and aligned with the latest data in your table.

</details>

<details>

<summary><strong>How much does Noloco AI cost?</strong></summary>

While Noloco AI is in beta, it is completely free to use! You can explore its powerful features without any additional cost or the need for your own OpenAI API key.

</details>

<details>

<summary><strong>How many rows can Noloco AI process?</strong></summary>

Noloco AI can process as many rows as your table contains. There are no specific limits, but performance may vary with very large datasets. For optimal use, test with your data volume and let us know if you encounter any bottlenecks.

</details>

<details>

<summary><strong>Does Noloco AI work on synced data tables?</strong></summary>

Currently, Noloco AI is exclusively available on [**Noloco Tables**](/data/collections). It does not support synced data tables from integrations like [Airtable](/data/airtable).

</details>

<details>

<summary><strong>Can I use dynamic and static text together in prompts?</strong></summary>

Yes, you can seamlessly combine static text with dynamic content by referencing other fields in the row using tokens. This allows for highly customized and context-aware AI outputs.

</details>

<details>

<summary><strong>Can I preview how AI processes my inputs?</strong></summary>

At the moment, Noloco does not offer a preview of how combined static and dynamic text will appear after processing. It’s recommended to double-check your input for clarity and accuracy.

</details>

<details>

<summary><strong>Are there limits on the length of input text or prompts?</strong></summary>

No, there are currently no length limitations for input text or prompts. However, concise and structured inputs often produce more accurate results.

</details>

<details>

<summary><strong>What types of data can Noloco AI process?</strong></summary>

Noloco AI works best with text data but can also generate various outputs depending on the operation:

* Text
* Numbers
* Dates
* Boolean values (True/False)

</details>

<details>

<summary><strong>Can I create multiple AI-powered columns in one table?</strong></summary>

Yes, you can create as many AI-powered columns as needed in a single table. Each column can have its own operation, tailored to your specific workflow or analysis needs.

</details>

<details>

<summary><strong>How do I troubleshoot incorrect outputs?</strong></summary>

* Review your prompt for clarity and alignment with the operation’s purpose.
* Ensure the input text (static and dynamic) is formatted correctly.
* Test different variations of the prompt to refine results.

</details>

<details>

<summary><strong>What operations does Noloco AI support?</strong></summary>

Noloco AI supports six operations:

* Classify
* Summarize
* Sentiment
* Chat Prompt
* Correct Grammar
* Keyword Extraction

Each operation has unique use cases tailored to various workflows.

</details>

<details>

<summary><strong>Will Noloco AI support integrations in the future?</strong></summary>

While Noloco AI currently focuses on Noloco Tables, future updates may include compatibility with synced tables from external platforms like Airtable. Stay tuned for announcements!

</details>

### **Getting Started**

Noloco AI is currently free to use while in beta. Start creating smarter workflows and unlocking insights with AI-powered columns today!


# Import a file

Create a Noloco table from a file

If you already have your data in a CSV file, you can use that file to automatically create a corresponding Noloco table. We will automatically derive the field types, import your data, and even create the most appropriate view for the data in your app.

{% @arcade/embed url="<https://app.arcade.software/share/OFOW4RKH0gnxNyPUUgb4>" flowId="OFOW4RKH0gnxNyPUUgb4" %}

To get started, select 'Import a file' from the data source menu:

<figure><img src="/files/WwrgK3EVaN08yqKZrhBK" alt="" width="331"><figcaption></figcaption></figure>

You will then see the import modal appear, where you can first name the table:

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

Then, you can simply drop your CSV file, and we will automatically derive the structure for the table:

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

At this point, you can click on the column headings to either exclude or change the type of any fields. Once you're done, just click 'Import' and we will set everything up.

<figure><img src="/files/2FHUSzWDlrgKub2NCBJW" alt=""><figcaption></figcaption></figure>

### Troubleshooting

#### Why is the 'Import' button is greyed out?

This likely indicates that you have left the table name with its default value, creating a conflict with a previous import. Alternatively, it might mean you've renamed the table, and this name also conflicts with an existing table.


# Airtable

Learn how to build an app in Noloco around your Airtable base

### **Overview**

If you're storing data in Airtable, you can easily connect any of your Airtable bases to your Noloco apps. This allows your team or customers to read, update, and create records in Airtable directly from your Noloco app.

In this guide, you will learn how to [#connect-your-airtable-account](#connect-your-airtable-account "mention") to your Noloco Account and how to [#connect-your-airtable-base](#connect-your-airtable-base "mention") to your Noloco project.

### **Connect your Airtable account**

{% stepper %}
{% step %}
**Start the connect flow from your integration settings**

Go to your app settings or visit this link: <https://portals.noloco.io/~/_/settings/integrations>. Choose the app you want, or it will automatically open the last active app after 5 seconds. From the list, find the Airtable integration and click ***Connect***.

<img src="/files/IQSIaspw8bXon9Cn1wUt" alt="" data-size="original">
{% endstep %}

{% step %}
**Grant Noloco access to all of the bases you want to share.**

Select all of the bases that you want Noloco to have access to and then click Authorize. There are a couple of important things here to note:

* If you have previously connected Airtable bases with your personal API key and sharing link (i.e., the legacy Airtable integration), you must select all of these bases in addition to the new bases you are adding. Failure to do this will stop these old bases from being synced.
* One option to avoid not having access to future bases is to select "All current and future bases in this workspace." However, if you do this, just be aware that Noloco will then have access to all of your bases in the workspace.

<img src="/files/v5VMXqGCCdnXPumoLpdH" alt="" data-size="original">
{% endstep %}

{% step %}
**Review the accessible bases on your integration settings in Noloco.**

Here you will see a list of bases that you have shared with Noloco over OAuth, along with any bases connected to Noloco already. Any bases that are connected to Noloco with a Permission Level of `none` are not being synced, and you should grant Noloco access to them via your third-party integration settings on [airtable.com](https://airtable.com).

To review the bases that have granted access to Noloco, click on **View Accessible Bases** in the Airtable integration.

![](/files/Td7SD5OWh86gUmmY2JLa) ![](/files/0uOJnh6Z6kYZ7jXH7afk)
{% endstep %}
{% endstepper %}

### **Connect your Airtable base**

{% stepper %}
{% step %}
**Add your Airtable data source**

Navigate to the data tab in your Noloco app and click to add a new data source. From the list, choose Airtable.

<img src="/files/aLHCRhvXOtaaSChjDOR4" alt="" data-size="original">
{% endstep %}

{% step %}
**Find and select your base from the dropdown**

All of the bases you have shared with Noloco via OAuth will be in this dropdown. If any are missing, go to your third-party integrations on [airtable.com](https://airtable.com), find Noloco, and grant it access to the required bases.

<img src="/files/0J6DtTokeX7qyng7QO07" alt="" data-size="original">
{% endstep %}

{% step %}
**Name your data source**

It's best practice to give your data source in Noloco the same name your base has in Airtable to help you keep track of everything. Once you've entered all this information from Airtable, click ***Next***.

<img src="/files/oVEouDtiQANziiUN2qXB" alt="" data-size="original">
{% endstep %}

{% step %}
**Bring me to my app**

Noloco will analyze the data in your Airtable base and will automatically create tables and views in your app around your data from Airtable.

<img src="/files/5c4Z6Wwe5bdex0OsX1Kv" alt="" data-size="original">

For example, if you have a table with Properties data in Airtable, we'll automatically create a List view, a record view to edit individual records, and a form to add new Properties data. You can then use our App Builder to configure the display, add filters, and set user access levels (i.e., which users can see and update what information).

<img src="/files/mh8aSypx0IKw1Sv4k4pE" alt="" data-size="original">
{% endstep %}
{% endstepper %}

### Supported field types

The field types in Airtable can be broken down into the types that we fully support, types that we support reading (but not updating), and types we do not support and exclude from syncs.

#### Fully supported field types

The following field types are fully supported by Noloco, both to display in your app and be updated by it.

<table><thead><tr><th width="298">Field Type</th><th>API Name(s)</th></tr></thead><tbody><tr><td>AI Text</td><td><code>aiText</code></td></tr><tr><td>Attachment</td><td><code>multipleAttachments</code></td></tr><tr><td>Checkbox</td><td><code>checkbox</code></td></tr><tr><td>Currency</td><td><code>currency</code></td></tr><tr><td>Date</td><td><code>date</code>, <code>dateTime</code></td></tr><tr><td>Duration</td><td><code>duration</code></td></tr><tr><td>Email</td><td><code>email</code></td></tr><tr><td>Link to another record</td><td><code>multipleRecordLinks</code></td></tr><tr><td>Long text</td><td><code>multilineText</code>, <code>richText</code></td></tr><tr><td>Multiple select</td><td><code>multipleSelects</code></td></tr><tr><td>Number</td><td><code>number</code></td></tr><tr><td>Percent</td><td><code>percent</code></td></tr><tr><td>Phone number</td><td><code>phoneNumber</code></td></tr><tr><td>Rating</td><td><code>rating</code></td></tr><tr><td>Single line text</td><td><code>singleLineText</code></td></tr><tr><td>Single select</td><td><code>singleSelect</code></td></tr><tr><td>URL</td><td><code>url</code></td></tr><tr><td>Created by</td><td><code>createdBy</code></td></tr><tr><td>Last modified by</td><td><code>lastModifiedBy</code></td></tr><tr><td>Collaborator</td><td><code>singleCollaborator</code>, <code>multipleCollaborators</code></td></tr></tbody></table>

#### Field types supported only for reading

These field types will be imported into your Noloco app to be displayed, but cannot be updated by your app.

<table><thead><tr><th width="294">Field Type</th><th>API Name(s)</th></tr></thead><tbody><tr><td>Autonumber</td><td><code>autoNumber</code></td></tr><tr><td>Count</td><td><code>count</code></td></tr><tr><td>Created time</td><td><code>createdTime</code></td></tr><tr><td>Formula</td><td><code>computation</code>, <code>formula</code></td></tr><tr><td>Last modified time</td><td><code>lastModifiedTime</code></td></tr><tr><td>Lookup</td><td><code>lookup</code>, <code>multipleLookupValues</code></td></tr><tr><td>Rollup</td><td><code>rollup</code></td></tr></tbody></table>

#### Field types that are not supported

Any types that do not appear in one of the two sections above are not supported by Noloco. These fields will never be imported into your apps. A summary of these fields follows but please note that it may be non-exhaustive if Airtable adds new field types in the future.

<table><thead><tr><th width="291">Field Type</th><th>API Name(s)</th></tr></thead><tbody><tr><td>Barcode</td><td><code>barcode</code></td></tr><tr><td>Button</td><td><code>button</code></td></tr><tr><td>Multiple Collaborators</td><td><code>multipleCollaborators</code></td></tr><tr><td>Sync Source</td><td><code>externalSyncSource</code></td></tr></tbody></table>

If you are using Airtable user fields in your base and want to import these to Noloco, we would recommend setting up a user table that has a single user per row and information about the user in field types that are supported by Noloco. You can then import this table as a [user list](/settings/user-lists).

#### Synced Tables are not supported

Please note that where you have a synced table in Airtable (i.e., records in Base A and synced to records in Base B), we don't support updating the records in this table. This is due to the fact that the records in each base have unique record IDs. We do support disabling certain fields from syncing by using the sync menu on each table, which in many cases negates the need for a synced base in the first place. Please reach out to our Support team if this is something you require assistance with.

### FAQs

<details>

<summary><strong>How often does my data get synced?</strong></summary>

When your users update data from Noloco, it will be reflected *instantly* in your Airtable base.

If an update is made directly to your Airtable base for example, via an automation, then updated data should be reflected in Noloco in less than 2 minutes.

</details>

<details>

<summary><strong>Can I connect multiple Airtable bases to one Noloco app?</strong></summary>

Yes - you can connect multiple Airtable bases to the same Noloco app. You can also mix and match with other data sources like Noloco Tables or Google Sheets as well.

</details>

<details>

<summary><strong>Why isn't my Airtable base appearing in the dropdown to connect?</strong></summary>

This is caused by one of two scenarios:

1. **Your base is already connected to this app.** You can check this by going to your data page and looking for the base, or by going to your [project integration settings](https://portals.noloco.io/~/_/settings/integrations) and reviewing the accessible bases modal which will show you the bases which are connected from your account.
2. **Noloco doesn't have access to this base from your OAuth integration.** To fix this you can check the bases that Noloco has access to by going to your project integration settings and opening the accessible Airtable bases modal. If your base does not appear in this list you have not given Noloco permission to access it. You can grant permission by going to [your Airtable third-party integration settings](https://support.airtable.com/docs/third-party-integrations-via-oauth-overview#managing-integrations) and adding the base to your Noloco integration.

</details>

<details>

<summary><strong>How do I grant Noloco access to particular bases from within Airtable?</strong></summary>

Follow these steps to get to your third-party integration settings in Airtable and to ensure Noloco has access to the relevant Airtable base(s) on your account.

1. Click on your account icon in the top right corner

<img src="/files/44tskyV0QIEMhEKXQD1R" alt="" data-size="original">

2. Click on Integrations and choose ***Third-party integrations***

<img src="/files/L58hEWNZuodAepngAYAE" alt="" data-size="original">

3. Click into the Noloco integration and review the Workspaces and Bases that Noloco has access to.

<img src="/files/4JhoW3Jdwj5pNyJucDeb" alt="" data-size="original">

4. If necessary, you can ***Add a base*** to ensure that Noloco has sufficient access to a particular Airtable base for your app.

</details>

<details>

<summary><strong>Why won't one of my fields sync</strong>?</summary>

If you have tried doing a [manual sync of your Base's schema](https://guides.noloco.io/data/data-overview/syncing#manually-syncing-a-data-source-schema), but one of your fields still won't appear in Noloco this can mean one of two things:

* **We don't support that type of field.** See the [section above](#field-types-that-are-not-supported) on which field types are and aren't supported.
* **The name of the field clashes with a previous name of an existing column.** If you ever renamed a column and now the new field has the same name as that older column, we will not be able to sync that field to Noloco until the older, existing field is deleted, or the new field's name is changed in any way.
* **Single Select options must have unique names, not just unique colours.** Airtable allows you to have colour coded options in single selects, e.g a red "Option 1" and a blue "Option 1", but they do not pass this colour coding information to us, so we recommend always giving your options unique names.
* **Linked field to a table in another base.** Since we do not have those records, we cannot sync the linked field.

</details>

<details>

<summary><strong>Why won't my Synced Table records update?</strong></summary>

While we can read data from an Airtable synced table, Noloco does not support *updating* records in synced tables. This is due to the fact that the records in each base have unique record IDs and updates can't be done via the Airtable API.

You can however disable certain fields from syncing, by using the sync menu on each table which in many cases negates the need for a synced table in the first place.

</details>

<details>

<summary><strong>Why is my formula field being synced as the wrong type?</strong></summary>

Sometimes Airtable will choose different default formatting to Noloco for formula fields. For instance a formula field that is formatted as an integer in Airtable may appear as a decimal when synced to Noloco.

If this happens to one of your fields there is a simple fix to force Airtable to tell us about how we should format the field:

1. **Open up the type configuration for your formula field in Airtable**

<img src="/files/azF4rlFMR5fhbUE9FDyU" alt="" data-size="original">

**2. Navigate to the formatting options**

<img src="/files/4NkNliaoCj7PWXuJZfeV" alt="" data-size="original">

**3. Click save** Make sure to save the settings even if the selected format is what you currently see on Airtable; this will make Airtable explicitly tell Noloco how to format your field.

</details>

<details>

<summary><strong>Why is my lookup field being synced without its formatting?</strong></summary>

If your lookup field is based on a multi-relationship field (either many-to-many or one-to-many), when we sync it into Noloco we will convert it to a `TEXT` field and sync its contents as a comma-delimited list of values. The reason for this is that Noloco does not support array or list types, except for relationships. At the same time we want to make sure that you can see all data for a field displayed in it. To achieve this balance we convert these fields to comma-delimited lists and store the raw data from Airtable inside them, meaning you won't see your formatting applied.

Lookups based on single relationships (one-to-one or many-to-one) will be synced as their underlying type with any formatting brought along. If you need formatting to be applied to a multi-lookup we recommend you look at your data model to see if you can use relationship or single-lookup fields instead.

</details>

<details>

<summary><strong>How do I reset my Airtable Connection?</strong></summary>

If you want to completely reset your connection to Airtable, you can try to reconnect to your Airtable account. This can be done through your apps' Integrations & API Keys Settings

<img src="/files/1fBrcr4hA7BZBFyFqp4i" alt="" data-size="original">

1. Go to *Settings > Integrations & API Keys* on the left menu.
2. Scroll down to *Airtable* and click on *Reconnect.*
3. Click on + *Add a base.*
4. Locate the workspace and select *All current and future bases in this workspace.*
5. Click on *Grant access.*

Give it a minute or two to allow the syncing process to complete. If you still see that the table has not synced the latest changes, kick off a [manual sync](https://guides.noloco.io/data/data-overview/syncing#manually-syncing-a-table), and that should do it.

</details>

<details>

<summary><strong>Will reconnecting my Airtable base affect other apps?</strong></summary>

Yes, reconnecting or resetting your Airtable base from one app will also disconnect the Airtable connection from other apps. This happens when you choose "All bases" when you're trying to reconnect or reset your Airtable connection

</details>

<details>

<summary><strong>Can I connect Airtable as a data source while on the Free plan?</strong></summary>

No — Our Airtable integration requires a subscription to the Build plan or above

</details>

<details>

<summary><strong>Why is my Primary field on Airtable not the one showing in Noloco?</strong></summary>

As of the moment, the following are the field types supported as Primary fields: `Text`, `Decimal`, `Interger`, and `Single_Options`. Also, field names that are **exactly** named **ID** as your primary field in Airtable, won't sync over as the primary field in Noloco.

</details>

<details>

<summary><strong>Can I clone an app and replace the base?</strong></summary>

Yes! One thing to remember is that it will only appear as an option when cloning an app if you have exactly 1 base connected to the app. You can read more about this on our page [Cloning an App](/account/cloning-an-app)\
\ <img src="/files/LzKTfjDv95zIDzA569q8" alt="" data-size="original">

</details>

<details>

<summary><strong>Do you support ingesting linked-record fields between Airtable synced tables?</strong></summary>

Yes! If the link points to another table that's also synced to that base, basically both tables need to be there for this to work.\ <br>

</details>


# Google Sheets

Learn how to plug your Google Sheets into your Noloco app

### **Overview**

With Noloco you can connect multiple data sources to power your app. Which means you can create an app which is connected to many Airtable bases, Google sheets & Noloco tables at the same time. In doing so, we enable business' to unite many data sources into one single source of truth - their Noloco app.

In this guide we are going to walkthrough how easy it is to connect your Google sheet(s) to your Noloco app. Once connected, this will allow your team, customers &/or third party stakeholders to read, update and create records in your Google sheets directly from your Noloco app.

Before connecting your Google Sheet to Noloco, you should *check that it is formatted suitably.* We'll take you through this below.

### Supported worksheet format

First, we must ensure that your Google Sheet(s) are formatted correctly for Noloco. Specifically, Noloco requires that:

* **Column headings** are in Row 1
* The **first column** is in Column A
* The **first data row** starts in Row 2
* Your sheet is **not** a pivot table

{% hint style="danger" %}
This must be the case for ALL worksheets (sheets) within your Google spreadsheet. This includes any hidden sheets you may have in your spreadsheet. If any sheet is formatted incorrectly, the sync will fail.
{% endhint %}

![Correctly formatted Google Sheet](/files/ezDgB2s7Enzm0PTyR8F5)

Before proceeding, please verify each sheet(s):

* Has a column header titles for each column in Row 1
* Has at least x1 row of data starting in Row 2
* Does not have any **hidden** columns without a column header title
* Is **not** a pivot table

If your sheet does not follow the above format or includes any of the listed 'gotcha's', it will not work.

Before proceeding to the next step, you will need to remove and/or modify your sheet(s) until they resemble the format displayed in the screenshot above.

#### Using ImportRange formulae

We support sheets that populate their data using `=IMPORTRANGE` formulae, however we do have some recommendations to ensure a smooth integration into your Noloco app:

* Just use the formula to import data and hard code the column header title.
* Ideally import one column per formula rather than one formula pulling in multiple columns (use multiple formulae if you want to import a range across a number of columns).

### Connect your Google sheet

**1) Add your Google sheet connection**

Navigate to the data tab in your Noloco app and click to add a new data source. From the list, choose Google sheets.

![](/files/gV3GdnUVEhZR6xe1yPmz)

**2. Name your Data source & Sign-in with Google**

It's best practice to call the data source the same name as your google sheet to help you keep track.

Once you have specified a name, proceed to Connect your Google Account. Simply select 'Connect with Google' and you will be brought to the 'Sign in with Google' dialogue.

You can also go to this link: <https://portals.noloco.io/~/_/setup/google-sheets>, choose the app you want, or it will automatically open the last active app after 5 seconds.

![](/files/omxfC5P0pEtPm0bvpov9)

**3. Connect to the Google account where your google sheet is stored**.

![](/files/LoM0763YtVC0GYAWqUrj)

**4. Allow Noloco access to your Google Account**

![](/files/CzZDi1s6dw4a5NDFuEAg)

**5. Now specify which Google Sheet you want Noloco to sync**

Now, you must **open** the Google sheet you want Noloco to connect to. Once it is opened, copy the sheet URL link found in the browser bar (Ctrl + C *or* Cmd + C).

Then paste the sheet URL into the location specified in the below screenshot.

Select 'Next' to kick off the sync

{% hint style="info" %}
This can take up to 1 minute depending on how much data is stored in your Google sheet
{% endhint %}

![](/files/FESglAxdjelRQIL9Rds3)

Once the sync is complete select the **'Bring me to my app'** button and Voilá you may now access your google sheet data from within your Noloco app.. magic 🪄 🎉

### How to disconnect your Google Account

You can disconnect your Google Account from Noloco if you wish to prevent Noloco from accessing your Google Drive & Google Sheets, but also as a trouble-shooting step to reconnect your account properly.

* Go to [google.com](https://google.com)
* Click your Avatar in the top right-hand corner
* Click 'Manage your Google Account'

  ![](/files/lDllcG8tksTy0covSAKz)
* In the left side bar choose 'Security'

  ![](/files/UO15H7OUhND6AjqjYPw5)
* Scroll down until you find 'Third-party apps with account access' and click 'Manage third-party access'

  ![](/files/1atzu3HiD8363hl9tLy7)
* Find 'Noloco' on the list that appears and click it to expand it, then click 'Revoke Access' and accept any dialogues that appear

  ![](/files/0FUiAf4Wgrvh2GqMHo9i)

### Reconnecting to Noloco

To reconnect your account to Noloco, go back to the "Integrations" section in your App settings and follow the instructions to reconnect.

### Supported Field Types

When you connect your Google Sheets to Noloco, the platform intelligently assesses the structure of your spreadsheet to ensure a seamless integration. It automatically maps the format of your Google Sheets columns to the corresponding field types in Noloco. For example, any columns in your spreadsheet that contain date information will be translated into "Date" fields within Noloco, preserving the chronological data. Similarly, if your Google Sheets contain columns with dropdown menus, Noloco will convert these into "Single Option" fields. This automatic conversion process ensures that all data is consistently formatted and functional in Noloco, enabling you to maintain the integrity and usability of your data as you transition between platforms.

**FAQs**

<details>

<summary>Can I import a Pivot Table into Noloco?</summary>

No, we currently do not support importing Pivot Tables into Noloco, please import the raw data that your pivot table is based on instead

</details>

<details>

<summary>Can I have merged cells in Row 1 of my sheet?</summary>

No, when importing your data into Noloco we expect that row 1 contains all your column headers. Consider [#using-importrange-formulae](#using-importrange-formulae "mention") if you want to retain formatting in a different sheet

</details>


# SmartSuite

Learn how to build an app in Noloco around your SmartSuite solution

### **Overview**

If you're storing data in [SmartSuite](https://smartsuite.com), you can easily connect your SmartSuite solutions(s) to your Noloco apps and allow your team or customers to read, update and create records in SmartSuite directly from your Noloco app.

### **Connect your SmartSuite account**

1. **Start the connect flow when creating a new app** When choosing a data source, choose the SmartSuite to sync your tables and data from your SmartSuite solution

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

2\. **Connect your SmartSuite account with Noloco** Click the Connect with SmartSuite button to connect your account to Noloco. Securely log into SmartSuite using your SmartSuite credentials. Noloco uses OAuth2 to ensure these values are never passed to Noloco.

You can revoke access from your SmartSuite integration settings at any time.

<figure><img src="/files/qZTHExIK4FyxWk0df9un" alt="" width="563"><figcaption></figcaption></figure>

3. **Select your Workspace and then choose a SmartSuite Solution** Choose the SmartSuite workspace that your Solution is in, and then choose the Solution you want to sync to Noloco.

   <figure><img src="/files/IgraIQKxX8mYNnoWZmFd" alt="" width="563"><figcaption></figcaption></figure>
4. Once you've chosen your Workspace, and your solution, you can customize the name of the solution in Noloco, or leave it as the prepopulated name.

   Once you're ready, click **Next**

### What happens next?

Noloco will analyse the data in your SmartSuite solution and will automatically create tables and views in your app around your data from SmartSuite.

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

For example, if you have a table with Properties data in SmartSuite, we'll automatically create a [View](/pages/views), [record page ](/record-pages/overview)to edit individual records and [a form to add new Properties data](/forms/forms).

You can then use our App Builder to configure the display, add filters and set user access levels (i.e. which users can see and update what information).

![](/files/vC2BL1E3YSq9lc1KTFeY)

### Supported field types

The field types in SmartSuite can be broken down into the types that we fully support, types that we support reading (but not updating) and types we do not support and exclude from syncs.

[Fields according to SmartSuite](https://help.smartsuite.com/en/articles/4575342-supported-field-types-in-smartsuite)

#### Fully supported field types

The following field types are fully supported by Noloco

<table data-full-width="false"><thead><tr><th width="298">Field Type</th><th>Noloco Type</th></tr></thead><tbody><tr><td>Record Title</td><td>Text (Required, Unique)</td></tr><tr><td>Address</td><td>Street address</td></tr><tr><td>Assigned to</td><td>Link to another record (User)</td></tr><tr><td>Color Picker</td><td>Text (Readonly)</td></tr><tr><td>Count</td><td>Number (Integer, Readonly)</td></tr><tr><td>Currency</td><td>Number (Currency)</td></tr><tr><td>Date / Date &#x26; Time</td><td>Date &#x26; Time</td></tr><tr><td>Date Range</td><td>Date range</td></tr><tr><td>Due Date</td><td>Due date</td></tr><tr><td>Duration</td><td>Duration</td></tr><tr><td>Email</td><td>Text (Email address)</td></tr><tr><td>Files &#x26; Images</td><td>File</td></tr><tr><td>First Created</td><td>Created At (Date, Readonly)</td></tr><tr><td>Formula</td><td>Derived from formula (Readonly)</td></tr><tr><td>Full Name</td><td>Full name</td></tr><tr><td>IP Address</td><td>Text (IP address)</td></tr><tr><td>Last Updated</td><td>Updated At (Date, Readonly)</td></tr><tr><td>Link</td><td>Text (URL)</td></tr><tr><td>Linked record</td><td>Link to another record<br><em>Note: it must include a backlink</em></td></tr><tr><td>Lookup</td><td>Derived from lookup (Readonly)</td></tr><tr><td>Multiple Select</td><td>Multiple option select</td></tr><tr><td>Number</td><td>Number</td></tr><tr><td>Number slider</td><td>Number (Slider)</td></tr><tr><td>Percent</td><td>Number (Decimal, Percentage)</td></tr><tr><td>Percent Complete</td><td>Number (Integer, Slider, Percentage)</td></tr><tr><td>Phone</td><td>Phone number</td></tr><tr><td>Rating</td><td>Number (Integer, Rating)</td></tr><tr><td>Record ID</td><td>UUID (Text, Readonly)</td></tr><tr><td>Rollup</td><td>Derived from rollup (Readonly)</td></tr><tr><td>Single Select</td><td>Single option select</td></tr><tr><td>Status</td><td>Single option select</td></tr><tr><td>Tag</td><td>Multiple option select (options must be defined on the SmartSuite field)</td></tr><tr><td>Text</td><td>Text (Single line)</td></tr><tr><td>Text Area</td><td>Text (Long text)</td></tr><tr><td>Time</td><td>Duration (Time)</td></tr><tr><td>Vote</td><td>Link to another record (User, Readonly)</td></tr><tr><td>Yes/No</td><td>Boolean</td></tr></tbody></table>

#### Field types that are not supported

Any types that do not appear in the section above are not supported by Noloco at this time. These fields will not be imported into your apps. A summary of these fields follows but please note that it may be non-exhaustive if SmartSuite adds new field types in the future. While these fields are not currently supported, they might be planned for the future.

<table data-full-width="false"><thead><tr><th width="291">Field Type</th><th>Description</th></tr></thead><tbody><tr><td>Auto Number</td><td>The automatically generated number associated with the record.</td></tr><tr><td>Button</td><td>Button fields allow you to add actions to your SmartSuite views and records, allowing the user to control when the action fires.</td></tr><tr><td>Checklist</td><td>Checklist fields allow you to create, assign, and set a due date for action items associated with a record such as a project, milestone, sales opportunity, or client interaction.</td></tr><tr><td>Signature</td><td>The Signature Field captures electronic acknowledgments with the option to draw or type a signature in the cell.</td></tr><tr><td>Smart Doc</td><td>The SmartDoc field provides you with a robust tool for writing, supporting the features you've come to expect in any editor or word processor.</td></tr><tr><td>Social Network</td><td>The Social Network field makes it easy to add links to Facebook, Twitter, Instagram, and LinkedIn to records</td></tr><tr><td>Sub-items</td><td>The Sub Items field adds a layer to SmartSuite's base structure, creating a "parent-child" relationship between the parent Record and the child Sub Items.</td></tr><tr><td>Time Tracking Log</td><td>The Time Tracking Log field allows one or many members to log time in hour / minute increments or automatically track time directly in a single field within a record.</td></tr></tbody></table>

If you are using SmartSuite user fields in your base and want to import these to Noloco, we would recommend setting up a user table which has a single user per-row and information about the user in field types which are supported by Noloco. You can then import this table as a [user list](/settings/user-lists).

### FAQs

#### How often does my data get synced?

When your app users update data from Noloco, it will be reflected *instantly* in your SmartSuite solution (you might need to reload your SmartSuite app to see this).

If an update is made to your SmartSuite solution directly (e.g. via an automation, or directly in the table), the updated data should be reflected within a few seconds.

SmartSuite notifies Noloco that the data has changed, and Noloco responds by updating the data in Noloco, and then in your app.

#### Can I connect multiple SmartSuite solutions to my one Noloco app?

Yes - you can connect multiple SmartSuite solutions to the same Noloco app. You can also mix and match with other data sources as well (e.g. Noloco Tables, Airtable or Google Sheets).

#### **Why isn't my SmartSuite solution appearing in the dropdown to connect?**

This is caused by one of two scenarios:

1. **Your solution is already connected to this app.** You can check this by going to your data page and looking for the solution, or by going to your project integration settings and reviewing the accessible solutions modal which will show you the solutions which are connected from your account.
2. **Noloco doesn't have access to this solution from your OAuth integration.** To fix this you can check the solutions that Noloco has access to by going to your project integration settings and opening the accessible SmartSuite solutions modal. If your solution does not appear in this list you have not given Noloco permission to access it. This could mean the solution isn't shared with the SmartSuite account that you linked with Noloco.

#### Why can't I see my linked record field?

You will always be able to see linked record fields when the link is to another app within the same solution. Noloco also supports SmartSuite's linked record fields between apps across different solutions; however, both of the solutions must be connected to Noloco for these fields to be synced. If you've just connected them, try running a manual schema sync from the data table to refresh Noloco's model of your data.

#### Why won't one of my other fields sync?

If you have tried doing a manual sync of your Solution's schema but one of your columns still won't appear in Noloco this can mean one of two things:

* We don't support that type of columns See the section above on which field types are and aren't supported.
* The name of the field clashes with a previous name of an existing column If you ever renamed a column and now the new field has the same name as that older column we will not be able to sync that field to Noloco until the older, existing field is deleted, or the new field's name is changed (in any way).
* If it's a field that links to another record, does it have *Create a backlink* enabled? Without a backlink, Noloco can't correctly setup the field, so double check this setting, and enable it if your field isn't showing up in Noloco

#### **How do I change a Date & Time field to Date only?**

To adjust a Date & Time field to show only the Date, follow these steps:

1. Click on the Date & Time field.
2. In Format, select **Date**.
3. Click on **Save**.

#### Does Noloco's integration affect my API usage?

Yes, when you integrate your SmartSuite solution into Noloco, Noloco makes API requests to determine the tables and columns in your app, as well as fetching and updating the data in your SmartSuite solutions.

All of these actions are counted towards your [SmartSuite API Limits](https://help.smartsuite.com/en/articles/4856710-api-limits) but Noloco intelligently only makes requests to SmartSuite when SmartSuite notifies Noloco of any changes to your data, or when you make a change to your SmartSuite data in Noloco.


# MySQL

Learn how to build an app in Noloco around your MySQL database

Overview

In this guide we are going to walkthrough how easy it is to connect your MySQL database(s) to your Noloco app. Once connected, this will allow your team, customers &/or third party stakeholders to read, update and create records in your MySQL instance directly from your Noloco app.

### Connect your MySQL database

1. **Add your MySQL data source** Navigate to the data tab in your Noloco app and click to add a new data source. From the list, choose MySQL or click this link to be taken to the setup: <https://portals.noloco.io/~/_/setup/mysql>

<figure><img src="/files/ENwvHCOZUEyvbgnz7LOJ" alt="" width="300"><figcaption></figcaption></figure>

2\. **Name your data source** It's best practice to call the data source the same name as your database to help you keep track.

<figure><img src="/files/2Xa43Z32FJDIRDMJyxWY" alt="" width="375"><figcaption></figcaption></figure>

3\. **Enter the server connection information** The hostname is the URL that you access your server on and the port is the port you use to connect. By default MySQL uses port 3306 so if you're not sure try that.

<figure><img src="/files/u5DlEJpE9LSK5UVmYjF7" alt="" width="375"><figcaption></figcaption></figure>

4\. **Enter the database information** We need the name of the database on the server that you want us to connect to. The database will be something that you named.

<figure><img src="/files/iT6wviWphx6kOILs9zI2" alt="" width="375"><figcaption></figcaption></figure>

5\. **Enter the login details** You will need to provide a MySQL user's login details for us to use. Specifically we need the username and password for a user with `SELECT`, `INSERT`, `UPDATE` and `DELETE` permissions for tables within the database you are importing to Noloco.

<figure><img src="/files/6BrInmJuRPqrSjzeYknr" alt="" width="375"><figcaption></figcaption></figure>

#### Connecting as a read-only user

We support connecting to your database with only `SELECT` permissions, however you need to toggle this setting on in the last step of the new data source form.

#### Enabling SSL on connections

We support connecting to your database with SSL, just toggle it on in the last step of the new data source form.

#### Whitelisting Noloco's IP addresses

If you restrict connections to your MySQL database by IP, you can whitelist our three static IP addresses that we might connect from.

```
18.203.60.136
54.217.27.248
54.228.83.124
```

### Syncing tables

Noloco will import all tables from your MySQL database that have a primary key and whose name has some alpha-numeric or emoji characters. So for instance a table with just punctuation in the name would be ignored, as would a table with a valid name but no primary key.

{% hint style="warning" %}
We do not support MySQL tables with composite primary keys.
{% endhint %}

We only support regular tables and do not import views.

### Built-in data types

We categorise built-in data types of columns into three buckets; fully supported, partially supported and unsupported. When importing a column from a table, you will only see it in Noloco if its type is fully or partially supported.

#### Fully supported column types

Data types that Noloco fully supports will be imported into your Noloco project with full read-write capabilities to be updated as well as displayed.

<table><thead><tr><th width="293">MySQL Type</th><th>Noloco Type</th></tr></thead><tbody><tr><td><code>bigint</code></td><td><code>INTEGER</code></td></tr><tr><td><code>bool</code></td><td><code>BOOLEAN</code></td></tr><tr><td><code>boolean</code></td><td><code>BOOLEAN</code></td></tr><tr><td><code>char</code></td><td><code>TEXT</code></td></tr><tr><td><code>date</code></td><td><code>DATE</code></td></tr><tr><td><code>datetime</code></td><td><code>DATE</code></td></tr><tr><td><code>dec</code></td><td><code>DECIMAL</code></td></tr><tr><td><code>decimal</code></td><td><code>DECIMAL</code></td></tr><tr><td><code>double</code></td><td><code>DECIMAL</code></td></tr><tr><td><code>double precision</code></td><td><code>DECIMAL</code></td></tr><tr><td><code>enum</code></td><td><code>SINGLE_OPTION</code></td></tr><tr><td><code>float</code></td><td><code>DECIMAL</code></td></tr><tr><td><code>int</code></td><td><code>INTEGER</code></td></tr><tr><td><code>integer</code></td><td><code>INTEGER</code></td></tr><tr><td><code>longtext</code></td><td><code>TEXT</code></td></tr><tr><td><code>mediumint</code></td><td><code>INTEGER</code></td></tr><tr><td><code>mediumtext</code></td><td><code>TEXT</code></td></tr><tr><td><code>smallint</code></td><td><code>INTEGER</code></td></tr><tr><td><code>text</code></td><td><code>TEXT</code></td></tr><tr><td><code>time</code></td><td><code>DURATION</code></td></tr><tr><td><code>timestamp</code></td><td><code>DATE</code></td></tr><tr><td><code>tinyint</code></td><td><code>INTEGER</code> (except for <code>tinyint(1)</code> which is <code>BOOLEAN</code>)</td></tr><tr><td><code>tinytext</code></td><td><code>TEXT</code></td></tr><tr><td><code>varchar</code></td><td><code>TEXT</code></td></tr></tbody></table>

#### Partially supported column types

Other data types are partially supported which means that we will import them to your Noloco project and display them, but we do not support any write operations to them so you may not update them from Noloco.

<table><thead><tr><th width="291">MySQL Type</th><th>Noloco Type</th></tr></thead><tbody><tr><td><code>JSON</code></td><td><code>TEXT</code></td></tr><tr><td><code>YEAR</code></td><td><code>TEXT</code></td></tr></tbody></table>

### Foreign keys

Any table with a foreign key constraint on one or more of its columns to another synced table will have those foreign key(s) interpreted as a Noloco relationship field(s) when synced.

{% hint style="warning" %}
We do not support composite foreign keys. Only foreign key constraints on single columns will be synced as relationships in Noloco.
{% endhint %}

The type of relationship that will be created in Noloco depends on other constraints on the foreign key constrained column. However because MySQL requires all columns referenced by a foreign key to have a unique constraint, they will always be one of the two relationships below.

| FK-Constrained Column is Unique | Noloco Relationship |
| ------------------------------- | ------------------- |
| Yes                             | `ONE_TO_ONE`        |
| No                              | `MANY_TO_ONE`       |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the foreign key on your MySQL database.

### Join tables

As documented above, all MySQL foreign keys must reference a column with a unique constraint. This means that from one foreign key alone you cannot create `ONE_TO_MANY` or `MANY_TO_MANY` relationships in MySQL. The way that these are typically created are with join tables with multiple foreign keys that sit between two tables you want to relate. Noloco offers some limited support to interpret such join tables as multi-relationships.

Consider the following example:

```
Table A (id, value)
Table B (id, value)

Join Table (id, a_id, b_id)
```

The `Join Table` allows a `MANY_TO_MANY` relationship to be described between `Table A` and `Table B` by storing a normalised mapping of `a_id` and `b_id` along with its own primary key, `id` .

If a table in your database matches *all* of these criteria, then we will classify it as a join table:

* A primary key (`id` in the above example)
* It has exactly two foreign keys (pointing to separate tables)
* Either one or neither of the foreign keys has a unique constraint
* All columns in the table are either in the primary key or in one of the foreign keys

Join tables are not synced as their own data type like the other tables. Instead they will be synced as a relationship field on each side of the relationship they point to. The type of Noloco relationship that is created for a join table depends on whether there are any unique constraints in the join table for the two foreign keys.

| Number of FKs With Unique Constraints | Noloco Relationship                |
| ------------------------------------- | ---------------------------------- |
| 0                                     | `MANY_TO_MANY`                     |
| 1                                     | `ONE_TO_MANY`                      |
| 2                                     | N/A - not classified as join table |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the join table on your MySQL database.

### Reserved field names

The following (and any case variants) are reserved field names in Noloco:

* `createdAt`
* `id`
* `updatedAt`
* `uuid`

If your MySQL table has an `id` column we will still import it to Noloco, however it will be renamed to `[Table Name] Id` to avoid conflicting with our own `id`.

If you have `createdAt` or `updatedAt` field(s) and they are of type `date`, `datetime` or `timestamp`, we will map your column(s) to our own field(s). Otherwise we will manage the created/updated times ourselves.

If you have a `uuid` column it will not be imported.

### File fields

We support syncing columns containing a URL as a Noloco `FILE` field. Just open up the corresponding table in your data table and click on the field then change its type to `FILE`. After the table next has a data sync you will see your files at those URLs appearing in Noloco.

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

### Create query tables

In some cases importing the exact tables that exist on your MySQL database might not be as useful to you as importing the results of a query that curates your data in a certain way. Noloco supports creating a table from a query by opening up the menu for your data source:

![](/files/CxUHTZBA6C4D3EdwfrZV)

This will take you to the table query editor where you can set up the query that will build your table.

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

At the top of this page is an input for you to name your table. On the left you can see an overview of this data source from Noloco and on the right is a query editor for you to develop and test your query over time. The results of testing your query will appear in the section at the bottom of the page. To save your query you must have a successful test of it.

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

Any errors in your query will be surfaced in the section at the bottom of the page.

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

After saving the query you will be able to see and use it like any other data type in Noloco. It will also be kept in sync with the upstream database both in schema and in data. If you want to edit the query at any time you can do so by clicking on the edit button from the data table.

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


# PostgreSQL

Learn how to build an app in Noloco around your PostgreSQL database

Overview

In this guide we are going to walkthrough how easy it is to connect your PostgreSQL database(s) to your Noloco app. Once connected, this will allow your team, customers &/or third party stakeholders to read, update and create records in your PostgreSQL instance directly from your Noloco app.

### Connect your PostgreSQL database

{% hint style="warning" %}
We recommend using PostgreSQL 13 or later to ensure compatibility with Noloco
{% endhint %}

1. **Add your PostgreSQL data source** Navigate to the data tab in your Noloco app and click to add a new data source. From the list, choose Postgres or simply visit this link: <https://portals.noloco.io/~/_/setup/postgres>

![](/files/FPO2dkHX8LLRXimvZGJa)

2\. **Name your data source** It's best practice to call the data source the same name as your database to help you keep track.

![](/files/LbhzVfWKHswgvezEGGEA)

3\. **Enter the server connection information** The hostname is the URL that you access your server on and the port is the port you use to connect. By default PostgreSQL uses port 5432 so if you're not sure try that.

![](/files/eB6wugXEMig71H54uWq3)

4\. **Enter the database information** We need the name of the database on the server that you want us to connect to and the schema within the database that we should pull the tables from. By default the schema is probably called public, however the database will be something that you named.

![](/files/o8FY56cZqWPS8qyj9ShN)

5\. **Enter the login details** You will need to provide a PostgreSQL user's login details for us to use. Specifically we need the username and password for a user with `SELECT`, `INSERT`, `UPDATE` and `DELETE` permissions for tables within the schema you are importing to Noloco.

![](/files/xekA4MuMQYYvHLjw23zB)

#### Connecting as a read-only user

We support connecting to your database with only `SELECT` permissions, however you need to toggle this setting on in the last step of the new data source form.

#### Enabling SSL on connections

We support connecting to your database with SSL, just toggle it on in the last step of the new data source form.

#### Whitelisting Noloco's IP addresses

If you restrict connections to your PostgreSQL database by IP, you can whitelist our three static IP addresses that we might connect from.

```
18.203.60.136
54.217.27.248
54.228.83.124
```

### Syncing tables

Noloco will import all tables from your PostgreSQL schema that have a primary key and whose name has some alpha-numeric or emoji characters. So for instance a table with just punctuation in the name would be ignored, as would a table with a valid name but no primary key.

{% hint style="success" %}
We support tables with composite primary keys.
{% endhint %}

We only support regular tables and do not import views.

### Built-in data types

We categorise built-in data types of columns into three buckets; fully supported, partially supported and unsupported. When importing a column from a table, you will only see it in Noloco if its type is fully or partially supported.

{% hint style="warning" %}
We do not support arrays of any of the supported types.
{% endhint %}

#### Fully supported column types

Data types that Noloco fully supports will be imported into your Noloco project with full read-write capabilities to be updated as well as displayed.

| Postgres Type                | Noloco Type            |
| ---------------------------- | ---------------------- |
| `bigint`                     | `INTEGER`              |
| `bigserial`                  | `INTEGER`              |
| `bool`                       | `BOOLEAN`              |
| `boolean`                    | `BOOLEAN`              |
| `char`                       | `TEXT`                 |
| `character`                  | `TEXT`                 |
| `character varying`          | `TEXT`                 |
| `date`                       | `DATE`                 |
| `decimal`                    | `DECIMAL`              |
| `double precision`           | `DECIMAL`              |
| `float4`                     | `DECIMAL`              |
| `float8`                     | `DECIMAL`              |
| `int`                        | `INTEGER`              |
| `int2`                       | `INTEGER`              |
| `int4`                       | `INTEGER`              |
| `int8`                       | `INTEGER`              |
| `integer`                    | `INTEGER`              |
| `interval`                   | `DURATION`             |
| `money`                      | `DECIMAL` (`CURRENCY`) |
| `numeric`                    | `DECIMAL`              |
| `real`                       | `DECIMAL`              |
| `serial`                     | `INTEGER`              |
| `serial2`                    | `INTEGER`              |
| `serial4`                    | `INTEGER`              |
| `serial8`                    | `INTEGER`              |
| `smallint`                   | `INTEGER`              |
| `smallserial`                | `INTEGER`              |
| `text`                       | `TEXT`                 |
| `timestamp`                  | `DATE`                 |
| `timestamp with timezone`    | `DATE`                 |
| `timestamp without timezone` | `DATE`                 |
| `varchar`                    | `TEXT`                 |

#### Partially supported column types

Other data types are partially supported which means that we will import them to your Noloco project and display them, but we do not support any write operations to them so you may not update them from Noloco.

| Postgres Type | Noloco Type |
| ------------- | ----------- |
| `cidr`        | `TEXT`      |
| `inet`        | `TEXT`      |
| `json`        | `TEXT`      |
| `jsonb`       | `TEXT`      |
| `macaddr`     | `TEXT`      |
| `macaddr8`    | `TEXT`      |
| `pg_lsn`      | `TEXT`      |
| `uuid`        | `TEXT`      |
| `xml`         | `TEXT`      |

#### Unsupported column types

All other column types are unsupported and columns with those types will not be imported to Noloco (although the rest of the table's columns with supported types will be imported).

### Custom data types

We support a limited set of custom data types created via a `CREATE TYPE` query. Specifically we will sync [enumerated types](https://www.postgresql.org/docs/current/datatype-enum.html) as Noloco `SINGLE_OPTION` types. We will only sync these if the enum created is not empty. Right now we do not support enum arrays or any other custom types.

### Domain types

We offer support for [user-defined types](https://www.postgresql.org/docs/current/domains.html) created via a `CREATE DOMAIN` query. During schema syncing, domains will be mapped onto their underlying type and provided we offer full or partial support for that underlying type it will be synced to Noloco.

### Foreign keys

Any table with a foreign key constraint on one or more of its columns to another synced table will have those foreign key(s) interpreted as a Noloco relationship field(s) when synced.

{% hint style="warning" %}
We do not support composite foreign keys. Only foreign key constraints on single columns will be synced as relationships in Noloco.
{% endhint %}

The type of relationship that will be created in Noloco depends on other constraints on the foreign key constrained column. However because PostgreSQL requires all columns referenced by a foreign key to have a unique constraint, they will always be one of the two relationships below.

| FK-Constrained Column is Unique | Noloco Relationship |
| ------------------------------- | ------------------- |
| Yes                             | `ONE_TO_ONE`        |
| No                              | `MANY_TO_ONE`       |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the foreign key on your PostgreSQL database.

### Join tables

As documented above, all PostgreSQL foreign keys must reference a column with a unique constraint. This means that from one foreign key alone you cannot create `ONE_TO_MANY` or `MANY_TO_MANY` relationships in PostgreSQL. The way that these are typically created are with join tables with multiple foreign keys that sit between two tables you want to relate. Noloco offers some limited support to interpret such join tables as multi-relationships.

Consider the following example:

```
Table A (id, value)
Table B (id, value)

Join Table (id, a_id, b_id)
```

The `Join Table` allows a `MANY_TO_MANY` relationship to be described between `Table A` and `Table B` by storing a normalised mapping of `a_id` and `b_id` along with its own primary key, `id` .

If a table in your database matches *all* of these criteria, then we will classify it as a join table:

* A primary key (`id` in the above example)
* It has exactly two foreign keys (pointing to separate tables)
* Either one or neither of the foreign keys has a unique constraint
* All columns in the table are either in the primary key or in one of the foreign keys

Join tables are not synced as their own data type like the other tables. Instead they will be synced as a relationship field on each side of the relationship they point to. The type of Noloco relationship that is created for a join table depends on whether there are any unique constraints in the join table for the two foreign keys.

| Number of FKs With Unique Constraints | Noloco Relationship                |
| ------------------------------------- | ---------------------------------- |
| 0                                     | `MANY_TO_MANY`                     |
| 1                                     | `ONE_TO_MANY`                      |
| 2                                     | N/A - not classified as join table |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the join table on your PostgreSQL database.

### Reserved field names

The following (and any case variants) are reserved field names in Noloco:

* `createdAt`
* `id`
* `updatedAt`
* `uuid`

If your PostgreSQL table has an `id` column we will still import it to Noloco, however it will be renamed to `[Table Name] Id` to avoid conflicting with our own `id`.

If you have `createdAt` or `updatedAt` field(s) and they are of type `date`, `timestamp`, `timestamp without timezone` or `timestamp with timezone`, we will map your column(s) to our own field(s). Otherwise we will manage the created/updated times ourselves.

If you have a `uuid` column it will not be imported.

### File fields

We support syncing columns containing a URL as a Noloco `FILE` field. Just open up the corresponding table in your data table and click on the field then change its type to `FILE`. After the table next has a data sync you will see your files at those URLs appearing in Noloco.

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

### Create query tables

In some cases importing the exact tables that exist on your PostgreSQL database might not be as useful to you as importing the results of a query that curates your data in a certain way.

You can add a query table to your app, which creates a new table in your data source, from a custom SQL query. This table will sync with your database, **but will be read-only from Noloco.**

Noloco supports creating a query table by opening up the menu for your data source: ![](/files/M4uRy5zo07lPloT3XdMQ)

This will take you to the query editor where you can set up the query that will build your table.

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

At the top of this page is an input for you to name your table. On the left you can see an overview of this data source from Noloco and on the right is a query editor for you to develop and test your query over time. The results of testing your query will appear in the section at the bottom of the page. To save your query you must have a successful test of it.

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

Any errors in your query will be surfaced in the section at the bottom of the page.

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

After saving the query you will be able to see and use it like any other data type in Noloco, **except it will be read-only**. It will also be kept in sync with the upstream database both in schema and in data. If you want to edit the query at any time you can do so by clicking on the edit button from the data table.

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

### FAQs

<details>

<summary>Does editing a relationship create a new, empty record?</summary>

No, this will not happen if your foreign keys are of a similar type. Double check the types of the columns in your foreign key constraint - if one is a `bigint` or `int8` and another is an `int` or `int4` we will be treating the values differently and may not build the correct relationship in Noloco. We would recommend to keep any relationship fields the exact same type as the field they reference.

</details>

<details>

<summary>What is the minimum version of Postgres that you currently support?</summary>

Noloco uses a number of features that were introduced in v10 so anything before this will not work. To ensure maximum compatibility we recommend using Postgres 13 or higher which is the oldest version currently being maintained by the Postgres team.

</details>


# Supabase

Learn how to build an app in Noloco around your Supabase database that runs PostgreSQL under the hood.

Overview

In this guide we are going to walkthrough how easy it is to connect your Supabase database(s) to your Noloco app. Once connected, this will allow your team, customers &/or third party stakeholders to read, update and create records in your Supabase PostgreSQL instance directly from your Noloco app.

## Connect your Supabase database <a href="#connect-your-postgresql-database" id="connect-your-postgresql-database"></a>

1. **Add your Supabase data source** Navigate to the data tab in your Noloco app and click to add a new data source. From the list, choose Postgres or simply visit this link: <https://portals.noloco.io/~/_/setup/supabase>

   <figure><img src="/files/o7JykOC4hhV6RJ6JFMEB" alt=""><figcaption></figcaption></figure>
2. **Name your data source** It's best practice to call the data source the same name as your database to help you keep track.

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

3\. **Enter the server connection information** The hostname is the URL that you access your server on and the port is the port you use to connect. The connection information can be found in Supabase Project by clicking on Connect button. Change the connection type to PSQL and in Session Pooler section you will find all parameters needed to connect.

Since Supabase runs on top pf Postgres, by default PostgreSQL uses port 5432 so if you're not sure try that.

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

4\. **Enter the database information** We need the name of the database on the server that you want us to connect to and the schema within the database that we should pull the tables from. In Session Pooler section by default the database name is postgres and the schema is probably called public, however the database will be something that you named.

<div data-full-width="true"><figure><img src="/files/ilWnm6B4CqlIXRYThcui" alt=""><figcaption></figcaption></figure></div>

5\. **Enter the login details** In Session Pooler section View Parameters we need the user info and password for a user with `SELECT`, `INSERT`, `UPDATE` and `DELETE` permissions for tables within the schema you are importing to Noloco.

<div data-full-width="true"><figure><img src="/files/8iAk0nioPiQNLXLNYa8o" alt=""><figcaption></figcaption></figure></div>

#### Connecting as a read-only user

We support connecting to your database with only `SELECT` permissions, however you need to toggle this setting on in the last step of the new data source form.

#### Enabling SSL on connections

We support connecting to your database with SSL, just toggle it on in the last step of the new data source form.

#### Whitelisting Noloco's IP addresses

If you restrict connections to your PostgreSQL database by IP, you can whitelist our three static IP addresses that we might connect from.

```
18.203.60.136
54.217.27.248
54.228.83.124
```

### Syncing tables

Noloco will import all tables from your Supabase PostgreSQL schema that have a primary key and whose name has some alpha-numeric or emoji characters. So for instance a table with just punctuation in the name would be ignored, as would a table with a valid name but no primary key.

{% hint style="success" %}
We support tables with composite primary keys.
{% endhint %}

We only support regular tables and do not import views.

### Built-in data types

We categorise built-in data types of columns into three buckets; fully supported, partially supported and unsupported. When importing a column from a table, you will only see it in Noloco if its type is fully or partially supported.

{% hint style="warning" %}
We do not support arrays of any of the supported types.
{% endhint %}

#### Fully supported column types

Data types that Noloco fully supports will be imported into your Noloco project with full read-write capabilities to be updated as well as displayed.

| Postgres Type                | Noloco Type            |
| ---------------------------- | ---------------------- |
| `bigint`                     | `INTEGER`              |
| `bigserial`                  | `INTEGER`              |
| `bool`                       | `BOOLEAN`              |
| `boolean`                    | `BOOLEAN`              |
| `char`                       | `TEXT`                 |
| `character`                  | `TEXT`                 |
| `character varying`          | `TEXT`                 |
| `date`                       | `DATE`                 |
| `decimal`                    | `DECIMAL`              |
| `double precision`           | `DECIMAL`              |
| `float4`                     | `DECIMAL`              |
| `float8`                     | `DECIMAL`              |
| `int`                        | `INTEGER`              |
| `int2`                       | `INTEGER`              |
| `int4`                       | `INTEGER`              |
| `int8`                       | `INTEGER`              |
| `integer`                    | `INTEGER`              |
| `interval`                   | `DURATION`             |
| `money`                      | `DECIMAL` (`CURRENCY`) |
| `numeric`                    | `DECIMAL`              |
| `real`                       | `DECIMAL`              |
| `serial`                     | `INTEGER`              |
| `serial2`                    | `INTEGER`              |
| `serial4`                    | `INTEGER`              |
| `serial8`                    | `INTEGER`              |
| `smallint`                   | `INTEGER`              |
| `smallserial`                | `INTEGER`              |
| `text`                       | `TEXT`                 |
| `timestamp`                  | `DATE`                 |
| `timestamp with timezone`    | `DATE`                 |
| `timestamp without timezone` | `DATE`                 |
| `varchar`                    | `TEXT`                 |

#### Partially supported column types

Other data types are partially supported which means that we will import them to your Noloco project and display them, but we do not support any write operations to them so you may not update them from Noloco.

| Postgres Type | Noloco Type |
| ------------- | ----------- |
| `cidr`        | `TEXT`      |
| `inet`        | `TEXT`      |
| `json`        | `TEXT`      |
| `jsonb`       | `TEXT`      |
| `macaddr`     | `TEXT`      |
| `macaddr8`    | `TEXT`      |
| `pg_lsn`      | `TEXT`      |
| `uuid`        | `TEXT`      |
| `xml`         | `TEXT`      |

#### Unsupported column types

All other column types are unsupported and columns with those types will not be imported to Noloco (although the rest of the table's columns with supported types will be imported).

### Custom data types

We support a limited set of custom data types created via a `CREATE TYPE` query. Specifically we will sync [enumerated types](https://www.postgresql.org/docs/current/datatype-enum.html) as Noloco `SINGLE_OPTION` types. We will only sync these if the enum created is not empty. Right now we do not support enum arrays or any other custom types.

### Domain types

We offer support for [user-defined types](https://www.postgresql.org/docs/current/domains.html) created via a `CREATE DOMAIN` query. During schema syncing, domains will be mapped onto their underlying type and provided we offer full or partial support for that underlying type it will be synced to Noloco.

### Foreign keys

Any table with a foreign key constraint on one or more of its columns to another synced table will have those foreign key(s) interpreted as a Noloco relationship field(s) when synced.

{% hint style="warning" %}
We do not support composite foreign keys. Only foreign key constraints on single columns will be synced as relationships in Noloco.
{% endhint %}

The type of relationship that will be created in Noloco depends on other constraints on the foreign key constrained column. However because PostgreSQL requires all columns referenced by a foreign key to have a unique constraint, they will always be one of the two relationships below.

| FK-Constrained Column is Unique | Noloco Relationship |
| ------------------------------- | ------------------- |
| Yes                             | `ONE_TO_ONE`        |
| No                              | `MANY_TO_ONE`       |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the foreign key on your PostgreSQL database.

### Join tables

As documented above, all PostgreSQL foreign keys must reference a column with a unique constraint. This means that from one foreign key alone you cannot create `ONE_TO_MANY` or `MANY_TO_MANY` relationships in PostgreSQL. The way that these are typically created are with join tables with multiple foreign keys that sit between two tables you want to relate. Noloco offers some limited support to interpret such join tables as multi-relationships.

Consider the following example:

```
Table A (id, value)
Table B (id, value)

Join Table (id, a_id, b_id)
```

The `Join Table` allows a `MANY_TO_MANY` relationship to be described between `Table A` and `Table B` by storing a normalised mapping of `a_id` and `b_id` along with its own primary key, `id` .

If a table in your database matches *all* of these criteria, then we will classify it as a join table:

* A primary key (`id` in the above example)
* It has exactly two foreign keys (pointing to separate tables)
* Either one or neither of the foreign keys has a unique constraint
* All columns in the table are either in the primary key or in one of the foreign keys

Join tables are not synced as their own data type like the other tables. Instead they will be synced as a relationship field on each side of the relationship they point to. The type of Noloco relationship that is created for a join table depends on whether there are any unique constraints in the join table for the two foreign keys.

| Number of FKs With Unique Constraints | Noloco Relationship                |
| ------------------------------------- | ---------------------------------- |
| 0                                     | `MANY_TO_MANY`                     |
| 1                                     | `ONE_TO_MANY`                      |
| 2                                     | N/A - not classified as join table |

These relationships are fully functional Noloco relationships and any updates to the relationship values in Noloco will be propagated to the join table on your PostgreSQL database.

### Reserved field names

The following (and any case variants) are reserved field names in Noloco:

* `createdAt`
* `id`
* `updatedAt`
* `uuid`

If your PostgreSQL table has an `id` column we will still import it to Noloco, however it will be renamed to `[Table Name] Id` to avoid conflicting with our own `id`.

If you have `createdAt` or `updatedAt` field(s) and they are of type `date`, `timestamp`, `timestamp without timezone` or `timestamp with timezone`, we will map your column(s) to our own field(s). Otherwise we will manage the created/updated times ourselves.

If you have a `uuid` column it will not be imported.

### File fields

We support syncing columns containing a URL as a Noloco `FILE` field. Just open up the corresponding table in your data table and click on the field then change its type to `FILE`. After the table next has a data sync you will see your files at those URLs appearing in Noloco.

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

### Create query tables

In some cases importing the exact tables that exist on your PostgreSQL database might not be as useful to you as importing the results of a query that curates your data in a certain way.

You can add a query table to your app, which creates a new table in your data source, from a custom SQL query. This table will sync with your database, **but will be read-only from Noloco.**

Noloco supports creating a query table by opening up the menu for your data source: ![](/files/M4uRy5zo07lPloT3XdMQ)

This will take you to the query editor where you can set up the query that will build your table.

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

At the top of this page is an input for you to name your table. On the left you can see an overview of this data source from Noloco and on the right is a query editor for you to develop and test your query over time. The results of testing your query will appear in the section at the bottom of the page. To save your query you must have a successful test of it.

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

Any errors in your query will be surfaced in the section at the bottom of the page.

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

After saving the query you will be able to see and use it like any other data type in Noloco, **except it will be read-only**. It will also be kept in sync with the upstream database both in schema and in data. If you want to edit the query at any time you can do so by clicking on the edit button from the data table.

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

### FAQs

<details>

<summary>Does editing a relationship create a new, empty record?</summary>

No, this will not happen if your foreign keys are of a similar type. Double check the types of the columns in your foreign key constraint - if one is a `bigint` or `int8` and another is an `int` or `int4` we will be treating the values differently and may not build the correct relationship in Noloco. We would recommend to keep any relationship fields the exact same type as the field they reference.

</details>

<details>

<summary>What is the minimum version of Postgres that you currently support?</summary>

Noloco uses a number of features that were introduced in v10 so anything before this will not work. To ensure maximum compatibility we recommend using Postgres 13 or higher which is the oldest version currently being maintained by the Postgres team.

</details>


# HubSpot

Learn how to build customer portals, internal tools and partner apps from your HubSpot CRM

Integrating [HubSpot](https://hubspot.com) with Noloco allows you to seamlessly manage your CRM data within your custom applications. This guide will walk you through the steps to set up the integration, manage your data, and leverage the full potential of HubSpot within Noloco.

{% embed url="<https://www.youtube.com/watch?v=wEZWI0bzE6g>" %}

## **Connect your HubSpot Account to your Noloco App**

1. Go to your app's data tab
2. Click `+ New Source` or this link: <https://portals.noloco.io/~/_/setup/hubspot>
3. Find HubSpot in the list and click **Connect**.
4. Click the `Connect to HubSpot` button
5. Choose the permissions and scopes you wish to give Noloco Your choice here, will determine which HubSpot objects are improted to your Noloco app in the next few steps
6. From the list of objects you gave permissions to access, choose which ones you want to connect to Noloco. By default, contacts and engagements are enabled

{% @arcade/embed url="<https://app.arcade.software/share/KutEPzhKLf3RJir60fmH>" flowId="KutEPzhKLf3RJir60fmH" %}

### **Supported Base HubSpot Objects**

Noloco supports importing and syncing all of the basic HubSpot objects such as:

* Contacts
* Companies
* Deals
* Tickets

### Other Supported HubSpot Objects

There are many other objects that Noloco can sync from HubSpot to your Noloco app:

* Carts
* Feedback Submissions
* Goals
* Leads
* Line Items
* Orders
* Payments
* Products
* Quotes
* Subscriptions
* HubSpot Users
* Custom Objects

### **Supported Properties**

* All default properties for the supported objects
* Custom properties for custom objects

By supporting both standard and custom properties, Noloco ensures you can tailor the integration to meet your specific business needs.

### Unsupported Properties

Some of the default HubSpot tables have hundreds of default properties, most of which can be calculated in Noloco by using a [linked field](/data/collections/relationships), [rollup](/data/collections/rollups) or a [lookup](/data/collections/lookup-fields).

These are not synced with Noloco by default, but reach out to our support team if there's a field that's missing that you would like to use in Noloco.

{% @arcade/embed url="<https://app.arcade.software/share/rBKKnrr9nBzgVw2JWsJM>" flowId="rBKKnrr9nBzgVw2JWsJM" %}

### **Managing HubSpot Data in Noloco**

#### **Viewing and Managing Data**

1. Once connected, Noloco will automatically create tables and views for your HubSpot data.
2. The data will be kept in sync, so if you change anything in Noloco, the value will change in HubSpot, and if the value is changes in HubSpot, it will be synced back to Noloco
3. You can then customize the display of your data, apply filters, and set permissions based on your workflow requirements.

#### **Attribution and Relationships**

Noloco supports HubSpot attributions, enabling you to visualize and manage relationships between objects. For example:

* See which contacts belong to a company.
* Identify the primary contact at a company.

Noloco creates [linked fields](/data/collections/relationships) for each of your attributions in a HubSpot object, so you can use them in forms, filters, or permissions with ease.

### Prebuilt Layouts for HubSpot Objects

When you connect Noloco to HubSpot, it will automatically add prebuilt views for your Contacts, Companies, Deals, and Tickets to your app. These views provide a structured and organized way to view and manage your HubSpot data within your Noloco app. Here's what you can expect from each page:

**Contacts**:

* View contact details such as name, email, phone number, and company.
* See recent activities and interactions with each contact.
* Add notes, tasks and deals, related to the contact.
* Update contact information directly from the layout.

**Companies**:

* Access comprehensive company profiles, including industry, size, and location.
* View associated contacts and their roles within the company.
* Track recent company interactions and activities.
* Manage company details and update information as needed.

**Deals**

* Monitor deal stages and progress with in a kanbarn board.
* Access deal details like value, closing date, and associated contacts.
* Add and update deal information directly from the page.
* Track deal activities and set reminders for follow-ups.

**Tickets**

* Manage customer support tickets with detailed information on each case.
* View ticket status, priority, and related contacts.
* Update ticket details and add internal notes.
* Track ticket history and monitor resolution progress.

Each prebuilt view is fully customizable, allowing you to tailor the pages to your specific needs. You can add new fields, rearrange sections, and apply filters to create the most effective views for your team. This flexibility ensures that you can efficiently manage your CRM data and streamline your workflows within Noloco.

### **Troubleshooting and FAQs**

**How often does data sync?** Data updates in Noloco will reflect instantly in HubSpot. Updates in HubSpot should sync to Noloco within a few minutes, depending on your plan. [Read more about synced data sources.](/data/data-overview/syncing#scheduled-syncing)

**Can I connect multiple HubSpot accounts?** No, unlike our other data sources, each Noloco app can only connect to one HubSpot account at a time. This makes your integration experience smoother, and allows us to customize the experience when using HubSpot.

**Why isn't my HubSpot data appearing?** Ensure Noloco has the necessary permissions and that the selected objects and properties are correctly configured in the integration settings.

For more detailed troubleshooting, contact our support team for more help.


# Stripe

Seamlessly bring your Stripe data—like Customers, Invoices, Subscriptions, Products, and Prices—into your Noloco app.

With the Noloco **Stripe integration**, you can seamlessly bring your Stripe data—like Customers, Invoices, Subscriptions, Products, and Prices—into your Noloco app. Whether you're building an internal tool or a customer-facing portal, this guide will walk you through everything you need to get set up, customize your views, and make the most of your synced Stripe data.

### Getting Started

Before you begin, make sure you have:

* A **Stripe account**
* An existing **Noloco app** on the Build plan or higher

{% hint style="success" %}
The Stripe integration is available on the Build plan or higher
{% endhint %}

### **Step-by-Step Setup:**

1. **Go to the Data tab** of your Noloco app.
2. Click **+ New Source** and select **Stripe,** or click this link: <https://portals.noloco.io/~/_/setup/stripe>
3. Click **Connect with Stripe** to launch the OAuth flow.
4. Choose the Stripe account you want to connect and authorize access.
5. Noloco will:
   * Automatically create tables for each supported Stripe object.
   * Mirror the relationships between them (e.g. Customers → Subscriptions).
   * Use AI to generate initial views that fit seamlessly into your app.

Once complete, your Stripe data will be synced into Noloco and ready to use.

### Syncing

We keep your data **continuously up to date** using **Stripe webhooks**, meaning any changes in Stripe (like new invoices or customer updates) will be reflected in Noloco in near real-time—no manual syncing needed. [Learn more about Live syncing](/data/data-overview/syncing#live-syncing)

### Supported Stripe Objects

The following objects are synced as Noloco tables:

| Stripe Object     | Read / Write Support                                               |
| ----------------- | ------------------------------------------------------------------ |
| **Customers**     | Read + Write (most fields editable)                                |
| **Invoices**      | Read-only                                                          |
| **Subscriptions** | Mostly read-only (some editable fields like cancellation settings) |
| **Products**      | Read + Write                                                       |
| **Prices**        | Read-only                                                          |

**Relationships between tables are preserved**, just like in Stripe:

* Customers → Subscriptions, Invoices
* Subscriptions → Products, Prices
* Products → Prices

#### Editable Fields

Here are some common editable fields:

**Customers**

* Name
* Email
* Phone
* Address
* Description
* Balance
* Currency

**Subscriptions (Limited)**

* Cancel At
* Cancel At Period End
* Collection Method
* Days Until Due
* Trial End

**Products**

* Name
* Description
* Active status
* URL

Invoices and Prices are **fully read-only**, due to Stripe's restrictions and complexity.

### Customization in Noloco

You can fully tailor your Stripe data views just like any other data source:

* Change field labels and visibility
* Apply filters or grouping
* Add calculated fields (formulas, lookups, rollups)
* Customize layouts for internal dashboards or client portals

### Access Control

Use **Noloco's** [**permissions**](/users-and-permissions/user-roles-and-permissions) **engine** to control who can see or edit Stripe data:

* Show clients only their own invoices
* Limit finance data to specific roles
* Restrict editing of sensitive fields

### Example Use Cases

Here’s how teams are putting the Stripe integration to work:

* **Support Teams** – Access customer billing history and subscriptions without switching tools.
* **Finance Teams** – Build reports and dashboards on invoices and product revenue.
* **Client Portals** – Let customers log in and pay invoices directly.
* **Unified CRM** – Merge Stripe data with your CRM for a full view of each customer.

### FAQs

<details>

<summary><strong>Who can use the Stripe integration?</strong></summary>

It's available on the **Build** and **Enterprise** plans.

</details>

<details>

<summary><strong>Can I control who sees Stripe data?</strong></summary>

Yes—Noloco [permissions](/users-and-permissions/user-roles-and-permissions) work just like with any other data source.

</details>

<details>

<summary><strong>Can I update subscriptions?</strong></summary>

Not directly in Noloco. Subscriptions are mostly read-only. We provide **links back to Stripe** to manage them safely.

</details>

<details>

<summary><strong>What if I need more fields or objects?</strong></summary>

We’re actively expanding support based on user demand. Let us know what you need!

</details>

### Making Payments FAQ

<details>

<summary><strong>Can I collect payments through Noloco using the Stripe integration?</strong></summary>

**Not directly.** Noloco doesn’t currently support **native payment processing** within the app interface. However, the integration makes it **very easy to collect payments** by leveraging Stripe’s built-in invoice flow.

Each invoice synced into Noloco includes a **Hosted Invoice URL**—this is a secure Stripe-hosted page where your customers can view and pay their invoice.

You can use this URL to:

* Display a **"Pay Now" button** in your client portal
* Share payment links via custom views or email actions
* Embed the link in automations or workflows

</details>

<details>

<summary><strong>Can I collect payments through Noloco using the Stripe integration?</strong></summary>

Once the invoice is paid in Stripe, the **status will automatically update** in Noloco via live-sync—so you and your customers always have an up-to-date view.

{% hint style="info" %}
Combine invoice filtering with user permissions to ensure customers only see their own payment links.
{% endhint %}

</details>


# Xano

Learn how to build an app in Noloco around your Xano api

Xano is the No-Code backend that can power and scale any app. Xano comes with everything you need to quickly launch a Backend without worrying about scale.

### **Overview**

If you're storing data in [Xano](https://xano.com), you can easily connect your Xano workspace(s) to your Noloco apps and allow your team or customers to read, update and create database records in Xano directly from your Noloco app.

### **Connect your Xano account**

To connect your Xano account to Noloco, you will need to add a new data source to your app.

Navigate to this link and you will be taken to the Xano setup page of your app: <https://portals.noloco.io/~/_/setup/xano>

Noloco use's Xano's metadata API to sync your database schema and data to Noloco, so we will need some credentials to identify and securely access your workspace

1. Navigate to your [Xano Account](https://app.xano.com/admin/account?mode=master)
2. Create a new [Personal Access Token in Xano](https://docs.xano.com/metadata-api#personal-access-token). Noloco will need read and write permissions for your data, and at least read permissions on your schema.

   ![](/files/NipfJybz7eYZBFsKa9Y4) ![](/files/62f5VvFgKn3Rmyib5y50)
3. Copy the newly created access token and past it into the *Access Token* box input in Noloco
4. Choose the Xano workspace that you want to connect from the dropdown

Note: These instructions will be updated as we improve the connection experience and work with the Xano team to create the best no-code Xano experience.

### What happens next?

Noloco will analyse the data in your Xano database base and will automatically create tables and views in your app around your data from Xano.

For example, if you have a table with Properties data in Xano, we'll automatically create a List component, record view to edit individual records and a form to add new Properties data. You can then use our App Builder to configure the display, add filters, and set user access levels (i.e. which users can see and update what information).

![](/files/2JLyeaJa68EUDRBhNZY0)

### Supported field types

The field types in Xano can be broken down into the types that we fully support, types that we support reading (but not updating) and types we do not support and exclude from syncs.

#### Fully supported field types

The following field types are fully supported by Noloco, both to display in your app and be updated by it.

<table><thead><tr><th width="298">Field Type</th><th>API Name(s)</th><th>Noloco field type</th></tr></thead><tbody><tr><td>Integer</td><td><code>int</code></td><td>Integer</td></tr><tr><td>Decimal</td><td><code>decimal</code></td><td>Decimal</td></tr><tr><td>Timestamp (Date and Time)</td><td><code>timestamp</code></td><td>Datetime</td></tr><tr><td>Date</td><td><code>date</code></td><td>Date</td></tr><tr><td>Email</td><td><code>email</code></td><td>Text (single line)</td></tr><tr><td>Enum</td><td><code>enum</code></td><td>Single Option</td></tr><tr><td>Enum (list)</td><td><code>enum</code></td><td>Multiple Option</td></tr><tr><td>Bool</td><td><code>bool</code></td><td>Booleen / Checkbox</td></tr><tr><td>Image</td><td><code>blob_image</code></td><td>File / Attachment</td></tr><tr><td>Video</td><td><code>blob_video</code></td><td>File / Attachment</td></tr><tr><td>Audio</td><td><code>blob_audio</code></td><td>File / Attachment</td></tr><tr><td>Attachment</td><td><code>blob_attachment</code></td><td>File / Attachment</td></tr><tr><td>Object</td><td><code>object</code></td><td>These fields are split into many sub-fields</td></tr><tr><td>Geo Point</td><td><code>geo_point</code></td><td>Split into <code>Field Name > lat</code> and <code>Field Name > lng</code> which are both Decimal fields</td></tr><tr><td>Reference to table</td><td><code>int</code></td><td>Linked field (Many to One)</td></tr><tr><td>Reference to table (list)</td><td><code>int</code>[]</td><td>Linked field (Many to Many)</td></tr></tbody></table>

#### Field types supported only for reading

These field types will be imported into your Noloco app to be displayed, but cannot be updated by your app.

<table><thead><tr><th width="294">Field Type</th><th>API Name(s)</th><th>Noloco field type</th></tr></thead><tbody><tr><td>Json</td><td><code>json</code></td><td>Text (multi line)</td></tr></tbody></table>

#### Field types that are not supported

Any types that do not appear in one of the two sections above are not supported by Noloco. These fields will never be imported into your apps. A summary of these fields follows but please note that it may be non-exhaustive if Xano adds new field types in the future.

<table><thead><tr><th width="291">Field Type</th><th>API Name(s)</th></tr></thead><tbody><tr><td>Geo Multi Point</td><td><code>geo_multipoint</code></td></tr><tr><td>Geo Linestring</td><td><code>geo_linestring</code></td></tr><tr><td>Geo Multilinestring</td><td><code>geo_multilinestring</code></td></tr><tr><td>Geo Polygon</td><td><code>geo_polygon</code></td></tr><tr><td>Geo Multipolygon</td><td>geo_multipolygon</td></tr></tbody></table>

In addition, any column that is a list of values that is not an `enum` , `file` or `foreign key` will not be synced.

### FAQs

#### How often does my data get synced?

When your app users update data from Noloco, it will be reflected *instantly* in your Xano database.

If an update is made to your Xano base directly (e.g. via an automation), the updated data should be reflected in Noloco in less than 2 minutes.

#### Can I connect multiple Xano workspaces to my one Noloco app?

Yes - you can connect multiple Xano workspaces to the same Noloco app. You can also mix and match with other data sources as well (e.g. Noloco Tables, Google Sheets or Airtable).

#### **Why isn't my Xano base appearing in the dropdown to connect?**

This is caused by one of two scenarios:

1. **Your workspace is already connected to this app.**
2. **Noloco doesn't have access to this workspace from your personal access token.** To fix this you can check that you have given us the correct Personal Access Token.

#### Why won't one of my fields sync?

If you have tried doing a manual sync of your Workspace's schema but one of your fields still won't appear in Noloco this can mean one of two things:

* We don't support that type of field See the section above on which field types are and aren't supported.
* The name of the field clashes with a previous name of an existing column If you ever renamed a column and now the new field has the same name as that older column we will not be able to sync that field to Noloco until the older, existing field is deleted, or the new field's name is changed (in any way).

#### Why do I lose field permissions when I rename a field in Xano?

If you rename a field in Xano, unfortunately due to the how these changes are handled by Xano, we cannot persist permissions of the renamed field. These will need to be manually set again in your Noloco app.

This field will also need to be re-enabled in any forms you may have.

#### What about the custom functions I've built on the API

Noloco doesn't use your Xano API to interact with the data, so any custom functions you have setup to add additional data to your Xano database or trigger automation based on updates won't be applied.

However, if this is the case we would love to talk to you about some potential solutions and to understand how exactly you're using Xano.

#### I'm getting a \`There was a problem fetching your Xano workspaces.

Failed to fetch\` when connecting my database

If Xano has not issued a Let's Encrypt SSL certificate for the base URL, it cannot pair with Noloco, even if a certificate has already been issued for the custom domain. Once the certificate for the base URL is issued, the connection will work as expected


# Views

How to add views to your Noloco app

{% embed url="<https://youtu.be/6wEccR4NA4k>" %}

One of the quickest ways to get started with Noloco is by adding Views that list the data in any of your tables (from Airtable, Postgres, Google Sheets, etc.).

Views also automatically come with record pages and forms out of the box, so your team can easily view, update, and add new records via your app.

Watch the above video to learn how to:

* Add views
* Edit what data gets displayed in views
* Navigate to the record pages to view a particular record
* Add new records to your table via ready-made forms

Please take note that the *List* component was previously called *Collection*.


# Show record count

How to show your record count in the app sidebar.

{% embed url="<https://youtu.be/c4qDwr-D3OU>" %}

Sometimes you might want to show your record count in your app sidebar so that your teammates can see at a glance how many records are in a particular view.

Learn how to easily toggle on the record count on any of your views.


# Empty State

Customizing your view empty states to for a tailored app experience

Empty states in views (tables, boards, charts, lists, etc.) occur when no records or rows match a view's filters or a user's permissions.

### What are Empty States?

Empty states appear in a view when:

* No records match the view filters, or filter fields
* No records match the user's permissions

Customizing these states is a great way to give your users context on what to expect when there are nor matching records, and to make your app feel more intuitive.

### Importance of Customizing Empty States

Custom empty states provide clarity to users, explaining why no data is present and what actions they can take. It’s an opportunity to:

* Guide users on next steps, such as creating a new record.
* Maintain engagement.
* Improve branding and tone of the app

<figure><img src="/files/rp9FcsAcx29oHgBXjuic" alt=""><figcaption><p>Empty state on a View</p></figcaption></figure>

### How to Customize a View Empty State

1. Navigate to the view, either a [List component](/components#supported-components) or a [view](/pages/views)
2. Open the **Empty State** settings in the configuration panel
3. Customize the Empty State **message** Explain why no records are shown, suggest an action they can take\_
4. Add an optional **image** Choose an image that aligns with your message and brand. We reccomend browsing something like\_ [undraw.co](https://undraw.co/illustrations)

{% @arcade/embed url="<https://app.arcade.software/share/2lRklBXRWbZTPcRXqZ18>" flowId="Qz28xM1ZAJIQJcvYkWHL" %}

### Hide a List Component if no Records Exists

If you're using a List component on a [Record Page](/data-to-app#row-record-page) or [Blank Page](/pages/blank-pages) you can hide the whole component if no records exist. This can be very helpful for tidying up the page, if there are no linked records to show.

**Note:** If records do show by default, but the user filters the List such that no records are displayed, the Empty State will be shown, the component won't be hidden.

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


# Blank pages

How to add data from different tables to the same page with Blank pages

{% embed url="<https://www.youtube.com/watch?v=czr0U3GG6D4>" %}

When building tools for your team, you often want to create dashboards that display data from different tables all on the same page.

This is possible with Noloco by using our 'Blank page' experience.

Watch the above video to learn how to:

* Add a blank page to your app
* Learn what different types of elements you can add to a blank page
* Configure the data that gets shown in tables on blank pages
* Use filters to search for particular records in a table
* Add a chart to a blank page

{% @arcade/embed url="<https://app.arcade.software/share/Njd7yIpgljvCsYEokfHd>" flowId="iHsDJWYTeVGuJMMPMrEi" %}

{% hint style="info" %}
Need a layout that a blank page can't quite express? Ask [Nola](/nola) to build a [Canvas](/nola/canvas) — a fully custom page generated from a plain-language description, with no code for you to manage. You can also keep your blank page and ask Nola to add just a [Canvas component](/nola/canvas/canvas-components) for a single custom section.
{% endhint %}


# iFrame embeds

This page talks through how you can embed an iframe in your Noloco app.

{% embed url="<https://youtu.be/--AE8Br2AM4>" %}

In this video, you'll learn how to add static and dynamic iframe embeds to your Noloco app.

With static iframe embeds, you embed a URL where you want the same content to be visible to every user who can see that page. In our example, we embedded the Noloco support guides at [https://guides.noloco.io](https://www.youtube.com/redirect?event=video_description\&redir_token=QUFFLUhqbkVyMmRYNUVrbzYwU1l4cGF6eEg4a2xncGNxd3xBQ3Jtc0tuVUZfd25FMnRWaE52ZW4temRmc0xpcU1yUXctZnFPdmR4NjMtalk2ZVJaTWdaRTMwdUs2UUlEZ3Z5OU9yMjZKMjg5cU1wUUtlcUZkT1k3RVlGTlFaOGlIRVBNRjJ1MW9jSmplNkxuTGwzYVB0bkNBMA\&q=https%3A%2F%2Fguides.noloco.io%2F\&v=--AE8Br2AM4).

With dynamic iframe embeds, you can show different content to different users by pulling dynamic data associated with your Noloco Users table. Our example shows how you can embed different Calendly links for different users.

In the video above, we show how to use a static URL or pull a full URL from your data tables. However, there is a third option: you can simply append dynamic data to the end of the URL as well (as shown in the screenshot below).

![](/files/LdwmSNCqqkxnolKi6p7V)

## Enabling Microphone and Camera Access for an iFrame Embed in Noloco

These steps allow you to enable microphone and camera access for a web application embedded in a Noloco iframe page. The instructions assume you are using an iframe to host your application and require user access to the microphone/camera for functionalities like voice or video recording.

1. **Prepare Your iFrame Embed Code**

   Use the following iframe snippet as a template. Replace `https://example.com` with the URL of the web application you want to embed.

   ```html
   <iframe src="https://example.com" allow="camera https://example.com; microphone https://example.com"/>
   ```

   * The `allow` attribute explicitly grants permission for microphone and camera access to the specified URL.
   * Ensure the `src` attribute points to your application's URL.
2. **Embed the iFrame in a Noloco Page**

   To embed the iframe in a specific page in Noloco, follow these steps:

   * Enable build mode on your app
   * Click the + icon at the top left in the left-side panel
   * Select **Iframe embed**
   * In the right-side panel, select the **Options** tab. You will see a ***Type*** dropdown
   * Choose **Input a URL**, and paste the iframe snippet into the field
3. **Test the iFrame**
   * Open the Noloco page containing the iframe.
   * Confirm that the browser prompts the user to allow microphone access.

     <img src="/files/Yv2IJa1oqhsvEdTT4njz" alt="" data-size="original">
   * Test the embedded application to ensure audio and other features requiring microphone access function correctly.
4. **Troubleshooting**
   * If microphone access is not working, verify the `allow` attribute is correctly set and matches your application’s domain.
   * Refer to this [Stack Overflow post](https://stackoverflow.com/questions/57008648/accessing-camera-and-mic-in-sandboxed-iframe-from-different-subdomain) for additional insights on iframe permissions.


# External links

Learn how to add external links to your app sidebar navigation

{% embed url="<https://youtu.be/zkpgxf56c1g>" %}

Watch the above video to learn how to add external links to your app sidebar navigation.

In our example, we add a link to our Noloco support guides. When a user clicks on the 'Support Guides' menu item, they are brought to our support guides in a new tab.


# The Home Page

The home page is the first page seen by your users when they log in or visit the app directly.

The **home page** is the first page seen by your users when they log in or visit the app directly.

The home page is dynamic, which means it can be different for different users depending on visibility rules.

In practice, it is the **highest** page in the sidebar that the current user has permission to see.

For example, if there are three pages

* `Page A` (Only visible to Admins)
* `Page B`
* `Page C`

When an Admin logs in, they will see `Page A`

When a non-admin logs in, they will first see `Page B`

This allows you to control the experience your users see depending on their role, or their stage as user.

## Setting Up Role-Specific Homepages

To create different homepages for different user roles:

1. **Plan Your Homepage Structure**: Decide what the first page should be for each user role
2. **Arrange Pages in Order**: Drag pages in the sidebar to position role-specific pages at the top
3. **Set Visibility Rules**: Configure [page visibility](/pages/page-visibility-rules) so each role sees their intended homepage first
4. **Test Each Role**: Use "View as user" to verify the correct homepage appears for each role

{% hint style="info" %}
**Plan Requirements**: Role-based homepages and visibility rules are available on all Noloco plans. However, creating custom user roles beyond the built-in Team Admin and User roles requires the [Build plan or above](/account/pricing). Learn more about [User Roles & Permissions](/users-and-permissions/user-roles-and-permissions).
{% endhint %}

### Example Setup

For a system with Admin, Manager, and User roles:

1. **Admin Dashboard** (visible to: Admin only) - becomes homepage for Admins
2. **Manager Overview** (visible to: Manager + Admin) - becomes homepage for Managers
3. **User Tasks** (visible to: All users) - becomes homepage for regular Users
4. **Other pages** below in the hierarchy

## Troubleshooting Homepage Issues

### Homepage Shows Wrong Page After Login

**Common Causes:**

1. **Hidden pages above your intended homepage** - These still affect the homepage hierarchy
2. **Visibility rules not properly configured** - User can see pages you didn't intend
3. **User role assignment issues** - User doesn't have the expected role
4. **Publishing not complete** - Changes haven't taken effect yet

**Solutions:**

1. **Check Hidden Pages**: In build mode, look for greyed-out pages above your intended homepage
2. **Review Page Order**: Drag your intended homepage to the very top, or set visibility rules appropriately
3. **Verify User Roles**: Check the Users table to confirm role assignments
4. **Republish App**: Go to Settings > Publishing > "Publish Changes"

### Pages Missing After Onboarding

If essential pages like "My Profile & Preferences" don't appear after users complete onboarding:

1. **Check Conditional Filters**:
   * Review custom visibility rules on these pages
   * Ensure rules don't depend on fields that might be empty after onboarding
   * Temporarily remove conditional filters to test
2. **Verify User Data Population**:
   * Check that onboarding properly populates required user fields
   * Review any custom rules that depend on user field values
   * Test the complete onboarding flow using "View as user"
3. **Review Page Visibility Logic**:
   * Ensure pages are visible to the user's assigned role
   * Check if pages are accidentally hidden from all users
   * Verify parent folder visibility if using page folders

### Setting a Fixed Homepage for All Users

If you want the same homepage for everyone regardless of role:

1. **Create a Dashboard Page**: Add a blank page or view as your intended homepage
2. **Move to Top Position**: Drag this page to the very top of your sidebar
3. **Set Universal Visibility**: Configure visibility as "All User types"
4. **Hide Role-Specific Pages**: Move role-specific content to lower positions or separate folders

## Advanced Homepage Scenarios

### Different Homepages by User Properties

You can create dynamic homepages based on user properties (not just roles):

1. **Use Custom Visibility Rules**: Create rules based on user field values
2. **Example**: Homepage varies by department, location, or user status
3. **Setup**: Create multiple "homepage" options with custom visibility conditions
4. **Test Thoroughly**: Use "View as user" with different user property combinations

### Homepage Redirection Based on Onboarding Status

For apps with onboarding flows:

1. **Onboarding Page**: Set as homepage for users who haven't completed onboarding
2. **Main Dashboard**: Set as homepage for users who have completed onboarding
3. **Custom Rule**: Use a boolean field like "Onboarding Complete" to control visibility
4. **Seamless Transition**: Users automatically see the main app after completing onboarding

### FAQs

#### My home page is not the page I expect it to be

If the home page you're seeing is not the page you expect, it's likely that a page that is hidden from the sidebar is actually *above* the page you expect.

To fix this, visit the homepage by clicking your logo, and then turn on **Build Mode**. If the page you're on is hidden from the sidebar, first unhide it and then drag it lower in the order of pages.

Make sure it is beneath the page you want to be the home page.

#### How do I set up different homepages for Admins vs regular users?

1. Create an "Admin Dashboard" page and set its visibility to "Internal Users only" or specific admin roles
2. Create a "User Dashboard" page and set its visibility to "External Users only" or regular user roles
3. Position the Admin Dashboard above the User Dashboard in the sidebar
4. Admins will see the Admin Dashboard as their homepage, while regular users see the User Dashboard

#### Why don't new users see their expected homepage after completing onboarding?

This usually happens when:

* The homepage has visibility rules that depend on user fields not populated during onboarding
* The onboarding process doesn't properly set the user's role or required fields
* There are conditional visibility rules that are too restrictive

**Fix**: Review the visibility conditions on your intended homepage and ensure all required user data is populated during the onboarding process.


# User Profile Page

Adding a customizable user profile page to your Noloco is easy with these three steps

### Adding the View Profile menu item

In some of our templates you will probably have noticed that when you click on the user icon there is a "View profile" option in the drop-down menu

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

In this guide we outline the steps you need to follow to add this page to your app too.

{% stepper %}
{% step %}

#### Create a profile page

Add a new page to your app and, on the right hand side, change the URL property to `profile`

When use use this exact URL for a page we will automatically add the "View profile" menu item to the drop-down menu

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

{% step %}

#### Hide the Page

After you have created this page you probably want to [hide it ](/pages/hiding-pages)from the app menu. You can easily do this by adjusting the "Show in sidebar?" toggle at the very bottom of the page properties

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

{% step %}

#### Filter User Details

In order to limit the data displayed to the logged in user only you will also need to apply the following [filter](/views/filters)

```markup
id is equal to (=) Logged in User
```

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

And that's it - now you have a customizable user profile page in your Noloco app.

### FAQs

<details>

<summary>Will this work with Multiple User Lists?</summary>

Yes! If you have [multiple lists of users](/settings/user-lists#can-i-add-multiple-user-lists) in your app this will still work with the same `/profile`URL, you don't need to make any additional modifications to your app.

</details>


# Parent pages & folders

Learn when to use parent pages and folders in your app sidebar navigation.

{% embed url="<https://youtu.be/RvsAHvuaFZs>" %}

In this video, we'll talk you through when to use parent pages vs folders in your Noloco app sidebar navigation.

Parent pages can only have child pages that belong to the same table, whereas folders can have child pages from different tables as well as blank pages and iframe embeds.


# Page visibility rules

Set visibility rules to only show sidebar pages to certain app users.

{% embed url="<https://www.youtube.com/watch?v=0w5m3PpYEgM>" %}

Often it's important to set visibility rules for when certain pages or folders should be visible to which teammates in your Noloco app.

In this video, you'll learn how to:

* Set visibility rules by user role
* Preview as other app users to make sure your rules are applied
* Create custom visibility rules

Learn more about Visibility Rules across Noloco 👇

{% content-ref url="/pages/YG99vWt1nUGnxLcPzbh9" %}
[Visibility Settings](/record-pages/visibility-settings)
{% endcontent-ref %}

{% content-ref url="/pages/2XlGYMhHxR9c4q9e2lcY" %}
[Field visibility conditions](/field-formatting/field-visibility-conditions)
{% endcontent-ref %}

## Troubleshooting Page Visibility Issues

### Pages Invisible Despite Correct Rules

If your pages aren't showing up in Live mode even though visibility rules look correct:

1. **Publishing Required**: Page visibility changes require republishing your app
   * Go to Settings > Publishing > "Publish Changes"
   * Visibility rules only take effect after publishing
2. **Check User Role**: Verify the user has the expected role assigned
   * Navigate to your Users table
   * Check the "Role" field for the affected user
   * Use "View as user" feature to test from their perspective
3. **Multiple Conditions**: When multiple visibility rules are set, ALL conditions must be met
   * Review each visibility condition on the page
   * Consider if any condition might be excluding the page unintentionally
4. **Parent Page/Folder Visibility**: If a page is in a folder, the folder must also be visible
   * Check visibility rules on parent folders
   * Ensure parent pages aren't hidden from the user role

### Form Pages Not Appearing in Public Access

If your public forms aren't visible despite setting visibility to "Yes":

1. **Public Access Setup**: Ensure public access is properly configured
   * Go to Settings > Public Access
   * Verify the main toggle is enabled
   * Check that your app has been published
2. **Table Permissions**: The underlying table must allow public access
   * Go to Data & API tab > hover over table > Permissions
   * Create a permission rule for public users
   * Grant necessary field permissions (Create, Read as minimum for forms)
3. **Page-Level Settings**: Set the page visibility to Public
   * Select the form page in build mode
   * In the Visibility tab, select "All User types" or configure custom rules
   * Use the globe icon to explicitly mark as Public if available
4. **Form Configuration**: Verify the form itself is properly configured
   * Check that all required fields are visible
   * Ensure form submission is enabled
   * Test form submission in an incognito browser window

## Frequently Asked Questions

### Why can't I find the main menu to change user permissions?

**Location of Visibility Settings:**

1. **Page Visibility**:
   * Select page from sidebar > Enter build mode (Cmd/Ctrl + E) > Visibility tab
2. **User Permissions**:
   * Go to Settings > Users & Permissions or Data & API tab for table permissions
3. **Component Visibility**:
   * Navigate to record page > Build mode > Select component > Visibility tab

### How do I fix conflicting visibility rules?

If you're getting notifications about conflicting visibility rules:

1. **Review All Conditions**: Check every visibility condition set on the page
2. **Simplify Rules**: Start with basic rules (like User Role only) and add complexity gradually
3. **Test Incrementally**: Use "View as user" after each rule change
4. **Clear and Recreate**: If rules are broken, delete all conditions and start fresh

### Can I set different homepages for different user roles?

Yes, using page visibility and ordering:

1. **Arrange Pages**: Order pages in your sidebar with role-specific pages at the top
2. **Set Visibility**: Make the first page visible only to specific roles
3. **Cascade Logic**: The first visible page becomes the homepage for each user role
4. **Test Roles**: Use "View as user" to verify different homepages per role

### Why do 'My Profile & Preferences' pages not show after onboarding?

This usually happens when visibility conditions are too restrictive:

1. **Check Onboarding Filters**: Remove any conditional filters from essential pages temporarily
2. **Verify User Data**: Ensure the user has all required field values populated
3. **Review Custom Rules**: Check if custom visibility rules depend on fields that might be empty
4. **Test User Journey**: Walk through the complete onboarding process using "View as user"

### How do I create separate apps for different user types?

To create trade and client apps with different access:

1. **Duplicate App**: Create multiple apps connected to the same data source
2. **Different Roles**: Set up distinct user roles in each app
3. **Separate Permissions**: Configure different table permissions for each app
4. **Custom Views**: Create role-specific views and pages in each app
5. **Public Access**: Configure different public access rules if needed

### What's the difference between page visibility and permissions?

**Page Visibility**: Controls what users see in the UI - pages, components, buttons

* Set in build mode > Visibility tab
* UI-level control only
* Not secure (data still accessible via developer tools)

**Permissions**: Controls actual data access at the API level

* Set in Data & API tab > Table permissions
* Secure data access control
* Prevents unauthorized data access entirely

**Use Both**: Combine visibility (good UX) with permissions (security) for complete access control.


# Cloning pages

Learn how to clone pages in your Noloco app

{% embed url="<https://youtu.be/u5b3-lDP_Jk>" %}

In this video, you'll learn how to speed up building internal tools by cloning pages in your Noloco app.

Learn how to clone pages both as standalone pages and as nested views of parent pages.


# Renaming pages

Learn how to rename pages, page urls & change page icons

{% embed url="<https://youtu.be/ZkrDZdAq7js>" %}

In this video, you'll learn how to rename pages, update page urls and change the page icons that show in your app sidebar.




---

[Next Page](/llms-full.txt/1)

