> For the complete documentation index, see [llms.txt](https://academy.shade.inc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://academy.shade.inc/guides/custom-objects-and-metadata/model-projects-and-clients-as-custom-objects.md).

# Model projects and clients as custom objects

Track clients and projects inside Shade, link every asset to the work it belongs to, and see a client's media in one view.

**Outcome:** a **Clients** object and a **Projects** object in your drive, linked together and to your assets. You can open any asset to see its project and client, or open a client to see all of its work, and track projects on a Kanban board.

**Who it's for:** agencies, production companies, and in-house teams that track projects in a spreadsheet next to their media.

**Time:** about 30 minutes for the structure, plus however long it takes to enter your existing projects.

## Before you start

* Have edit access to the drive.
* Read [Custom Objects](https://academy.shade.inc/automations-and-custom-objects/custom-objects) for what objects, fields, and relations are.
* List the fields you actually track today. Shade works best when you add only the fields you'll use.

## The structure you'll build

```mermaid
erDiagram
  CLIENT ||--o{ PROJECT : has
  PROJECT ||--o{ ASSET : contains
  CLIENT {
    text Name
    text Contact_email
    single_select Tier
  }
  PROJECT {
    text Name
    relation Client
    single_select Status
    date Due_date
    user Producer
  }
```

## Steps

{% stepper %}
{% step %}

### Create the Clients object

In the left sidebar, open your drive, find **Objects**, and click **+**. Name it **Clients** and click **Create object**.

Add the fields you need, for example:

* **Contact email** (Text)
* **Tier** (Single Select: Retainer, Project, Prospect)

Each record already has a name, so you don't need a Name field.
{% endstep %}

{% step %}

### Create the Projects object

Create a second object named **Projects** with:

* **Client**: a **Relation** field that points to **Clients**
* **Status**: Single Select, for example Brief, In production, In review, Delivered
* **Due date**: Date
* **Producer**: a **User** field, which links to a workspace member

Once a project has a client, you can move through the relationship either way: from a project to its client, or from a client to all of its projects.
{% endstep %}

{% step %}

### Add your records

Open **Clients** and click **New record** for each client. Then open **Projects** and add each project, picking its client in the **Client** field.

Start with active work only. You can add past projects later, when you need to find their media.
{% endstep %}

{% step %}

### Link assets to projects

Assets connect to objects through a metadata field. In the drive's metadata settings, add a **Relation** field named **Project** that points to the **Projects** object. See [Metadata and Custom Fields](https://academy.shade.inc/ai-tools/custom-and-automated-metadata).

To fill it in for many files at once, open a list view, select the assets, and set **Project**. The [Auto-organize new uploads](/guides/automations/auto-organize-new-uploads.md) recipe can also set it for new uploads automatically.
{% endstep %}

{% step %}

### Show client data on every asset

In a list view of your assets, click **Add column**. Because assets now have a Relation field, the menu also lists fields from the linked project, such as **Status** and **Client**. Adding one creates a **Lookup** column, which shows the project's value next to each asset without copying it.
{% endstep %}

{% step %}

### Build the views you'll use every day

* **Projects board:** add a view to **Projects** and choose **Kanban**, grouped by **Status**.
* **Deadlines:** add a **Calendar** view to **Projects** using **Due date**.
* **Everything for one client:** filter an asset view by the project's client. Duplicate the view for each major client.

If an object doesn't have the field a layout needs, Shade creates one for you: a **Status** field for Kanban, or a **Date** field for Calendar.
{% endstep %}
{% endstepper %}

## Variations

* **Episodic work:** use **Series → Episode → Asset** in place of **Client → Project → Asset**.
* **Sports and talent:** use **Teams** and **Players**, and give players a **Person** field that links to the recognized person, so face recognition and records line up. See [Facial Recognition](https://academy.shade.inc/ai-tools/facial-recognition).
* **Approvals:** add a **Reviewers** object with internal and external reviewer emails, then have automations email the right person when a project's status changes. See [Tell a client their files are ready](/guides/automations/tell-a-client-their-files-are-ready.md).

{% hint style="info" %}
Objects belong to a single drive. With one drive per client, each drive has its own separate objects. If you want to see projects from every client in one place, keep the Clients and Projects objects in one shared drive.
{% endhint %}

## Related guides

* [Create a folder for every new project](/guides/custom-objects-and-metadata/create-a-folder-for-every-new-project.md)
* [Design a metadata schema that scales](/guides/custom-objects-and-metadata/design-a-metadata-schema-that-scales.md)
* [Auto-organize new uploads](/guides/automations/auto-organize-new-uploads.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://academy.shade.inc/guides/custom-objects-and-metadata/model-projects-and-clients-as-custom-objects.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `build a script that syncs our docs to a CMS` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
