---
title: Brands
description: The context your agents read before they write anything — one body of markdown — plus the website, files, logo and ad accounts that go with it.
---

A **Brand** is what your organization writes down about who it is and what it intends, so that a connected agent can read it _before_ it produces anything. It is the difference between an assistant that writes generic ad copy and one that writes yours.

A Brand is deliberately **not** a structured record. Its substance is one body of free-form markdown you author, not a form of typed values we validate — because what an agent needs to know about a brand is exactly the sort of thing a dropdown cannot hold.

Brands are **private to your organization**, and a Brand is the sibling of a [Skill](/console/skills): a Skill teaches an agent _how_ to run a workflow, a Brand tells it _who it is working for_. They are unrelated on purpose — an agent that needs both loads both.

## The brand wall

Open **Brands** in the console sidebar. The wall at `/brands` is one tile per brand, and the tile **is** the logo. A brand with no logo gets a **monogram** — its initials on a colour derived from its slug, so it still holds a distinct, stable place rather than sitting in a row of identical grey.

Under each tile:

- the **name**, and under it the **handle** agents use,
- the avatars of the [Assignees](#assignees) of the brand. A tile shows at most three avatars and a count of the others, such as **+2**. Screen readers read the name of each Assignee,
- the words **Not written** when the brand has no **body**. A brand with a body shows nothing more.

### Assigned to me

The **Assigned to me** button is above the wall. Select it to see only the brands where you are an Assignee. The address of the page holds the filter (`?assignee=me`), so a reload keeps it. Select the button again to show every brand.

When the filter is on and you are not an Assignee of any brand, the page says that nothing is assigned to you. Select **Clear the filter** to show every brand again.

Hovering or keyboard-focusing a tile reveals the brand's **description**. That is what an _agent_ reads when choosing between brands; a human recognizes the one they want from the mark long before finishing a sentence about it.

With the logo and that marker, the wall answers its two real questions without asking you to read a word: which one is it, and is it briefed enough to point an agent at.

## Create a brand

**New brand** opens [the Adgent](/console/adgent) beside the brand wall, and sends it "I want to create a new Brand." The Adgent asks you for the website of the brand, or for a short description.

- **Give it the website.** The Adgent reads the home page with [`read_web_page`](/mcp/tools/read-web-page), and then at most four more pages of the same site, such as the about page and the pricing page. It obeys the `robots.txt` of the site.
- **Give it a description.** The Adgent writes the brand from your words.

The Adgent then creates the brand at once. There is no draft. The brand gets the name, a one-line description, the Website, and one body that holds what the site or your words state. The Adgent writes the body under the suggested headings Identity, Voice, Guidelines and Messaging. It writes a heading only when it has content for it, and it does not invent content. It names the other headings in the chat, so you can supply them. To give the brand a logo, add the image to the conversation. Then ask the Adgent to use it as the logo. See [Add a file](/console/adgent#add-a-file).

The page of the new brand opens on the left of the screen. The Adgent stays open beside it. Read the result on that page, and edit it as any other brand. Close the Adgent to give the page its full width. The brand wall shows the new brand.

### Create with the form

Cmd-click a **New brand** button to open a form instead of the Adgent. On Windows and Linux, Ctrl-click it. The form asks for three things, two of them required:

| Field | Required | What it is |
| --- | --- | --- |
| **Name** | yes | The display name. |
| **Description** | yes | One line. How agents recognize this brand when choosing between them. |
| **Website** | no | The brand's public site. AdCrunch keeps the address, and an agent reads it from the brand. Setting it reads nothing. |

The handle that agents use, also called the slug, comes from the name. The body is deliberately absent from this form: asking for an essay before the brand exists is the wrong first step. Name it, then write it. After the create, the page of the brand opens on its **Overview**.

:::warning[Changing the handle is a rename]

The handle is editable later, in the rail of the brand's own page, but it is a real rename: any agent, saved prompt or teammate that referenced the old handle needs updating. Deleting a brand frees its handle for re-use.

:::

## The body

A brand's own page is mostly its **body**: one free-form markdown text of up to 50,000 characters. The body is optional, and a brand is meant to be authored incrementally: a name and a description is a valid brand.

The headings are your choice. These four are advice:

| Heading | What belongs under it |
| --- | --- |
| **Identity** | Who the brand is, what it makes, who it is for. Positioning, mission, category. |
| **Voice** | How it sounds — register, sentence length, what it never says. |
| **Guidelines** | Rules an agent must not break. Claims to avoid, legal, tone limits. |
| **Messaging** | The lines worth reusing — value props, proof points, offers. |

An empty body is not a blank waiting to be filled in. It is genuinely **absent from what agents receive**. An empty editor shows the four headings as its placeholder.

## The page of a brand

The app header shows the path, **Brands / the name of the brand**, and a star button after the name. Select the star to add the brand to your favorites. Select it again to remove the brand. The star is on both tabs. Below it, one row holds the two tabs, **Overview** and **Personas**, then the state of the saves and a **⋯** menu. The rail is on the right of both tabs. On a narrow screen, the Overview shows the rail between the description and the body.

A brand that you add to your favorites also shows in the **Favorites** section at the top of the sidebar, above Monitor. Select the name to open the brand. The oldest favorite shows first. The section is hidden when you have no favorites.

## Editing: each field saves itself

The **Overview** shows the name, the description and the body, and you edit each one in place. There is no **Save** button:

- The name and the description save when you leave the field, or when you press Enter.
- The body is a Markdown editor. It saves one second after you stop typing. The counter under it shows how many characters you use, out of 50,000.
- Each change in the rail saves at once.

Only what you changed is sent. The top row says **Saving…**, **Saved** or **Not saved**. After **Not saved**, **Try again** sends your edits again. While a save waits or runs, your browser asks before it closes the page.

### If an agent changes the brand while you edit

A Brand is agent-writable, so this is a real race rather than a theoretical one. When your save is refused, the page reads the brand again, and **your writing is kept**. The page folds in the fields that the other writer changed, tells you what they were, and saves your edits once more. If that save is refused too, the top row says **Not saved**, and your edits stay on the page.

:::info[Agents can write brands too]

Anything you can do here, a connected agent can do over MCP with the `brand:write` scope — see [`brand_update`](/mcp/tools/brand-update). Its edits are guarded by the same revision as yours.

:::

## The rail

The rail starts with the **properties** of the brand. A click on a property opens a small window that changes it, and the change saves at once:

| Property | What it is |
| --- | --- |
| **Handle** | The handle agents use. A new handle changes the address of the page. A handle that another brand uses is refused, and the old handle stays. |
| **Website** | The brand's public site, a full address that starts with `http://` or `https://`. **Remove the website** clears it. |
| **Logo** | The mark of the brand. Choose one of the brand's images, or **Remove the logo**. |
| **Assignees** | The members who are accountable for the brand. See [Assignees](#assignees). |
| **Created by** | Who created the brand. You cannot change it. |

### Assignees

An **Assignee** is a member of your organization who is accountable for the brand. The **Assignees** property shows a stack of avatars. Select it to open a list of the members, with a check box for each one. Check a member to add that member as an Assignee. Clear the check box to remove the Assignee. The change shows at once, and a reload keeps it. If the change fails, the page restores the stack and shows an error.

A brand has at most 10 Assignees. At 10, the list shows a message, and you must remove an Assignee before you add another.

An Assignee gets no extra access. Every member whose role can edit brands can still edit the brand.

Below the properties come the **Advertisers** and the **Documents** of the brand.

## Documents and the logo

The rail holds the brand's files. **Upload** accepts PDFs and images — PNG, JPEG, GIF, WebP — up to 25 MB each. SVG is not accepted. Put reference material here: a brand book, a tone guide, a positioning deck. An agent gets these as URLs it can fetch, listed alongside the brand's context.

The **logo** is a nomination, not a separate upload. Upload an image as one of the brand's documents, then choose it in the **Logo** property. That makes it the brand's mark on the wall, and the one document an agent is pointed at as the mark when it loads the brand. Exactly one document is the logo at a time. **Remove the logo** drops the nomination without deleting the file, and deleting the nominated file drops it for you.

:::tip[Everything in the rail commits at once]

Uploading a document takes effect on the click. Deleting one asks you to confirm, then takes effect at once. Choosing a logo saves at once too.

:::

The Adgent can also copy a file into a document of the brand. Add the file to a conversation with the Adgent. Then ask the Adgent to copy it into the documents of the brand. Ask for a logo, and the Adgent also nominates the document as the logo. For the types and the limits of a file in a conversation, see [Add a file](/console/adgent#add-a-file).

A brand's documents are **not** [Assets](/mcp/tools/bring-your-own-creative). An Asset is source media that gets registered into an ad account's provider-side library so an ad can use it; a document is reference material an agent reads, and it never leaves AdCrunch. They share an upload mechanism and nothing else — if what you want is a video or image _in an ad account's library_, that is [Bring your own creative](/mcp/tools/bring-your-own-creative), not this rail.

## Attach ad accounts

This is what makes a brand reachable from the work. An agent acting on an ad account looks up the brands attached to it, so a brand with nothing attached is one that nothing will find on its own — however well it is written.

In the **Advertisers** part of the rail, **Attach** opens a menu of your organization's ad accounts that are not already on this brand; each attached row detaches from its trash control. Both take effect immediately.

- **Every ad account you own is offered**, including disabled ones and ad accounts on providers we cannot write to. Attaching is a record in AdCrunch, not a call out to the provider, so there is nothing to filter for.
- **An ad account can be attached to several brands.** Attaching to a second does not detach the first; an agent resolving that ad account gets both, and picks.
- **Attaching twice is harmless.** The second attach says the same thing as the first.
- **Detaching removes only the link.** The brand, its context and its files are untouched.
- An attachment whose ad account your organization can no longer see shows as a **bare id** rather than a name. The link is still real, but removing it needs the ad account back: detaching one AdCrunch can no longer confirm you own is refused.

Nothing connected yet? The rail says so and links to the console's integrations — connect an ad account first ([Meta](/connect/meta)), then come back and attach it.

:::info[The same thing over MCP]

This part of the rail does exactly what [`brand_attach_advertiser`](/mcp/tools/brand-attach-advertiser) and [`brand_detach_advertiser`](/mcp/tools/brand-detach-advertiser) do for an agent. The reason to attach at all is [`brand_resolve`](/mcp/tools/brand-resolve): given an ad account, it answers _who am I working for_.

:::

## Personas: who the brand talks to

A brand's page has two tabs. **Overview** is the brief above: the name, the description and the body. **Personas** is who that brief is aimed at. The rail, with the documents and the ad accounts, shows on both.

The body says who the brand _is_. A **persona** says who it is talking _to_: an audience archetype described as a person. The Personas tab lists them with their age range and whether each has a body, so you can see at a glance which audience is still a name and nothing else.

Add one with **New persona**. It opens [the Adgent](/console/adgent) beside the Personas tab, and sends it "I want to create a new Persona." The Adgent asks you who the audience is. It then creates the persona at once, from your words. It writes only what your words state. The page of the new persona opens on the left of the screen. To open the form instead, Cmd-click **New persona** (Ctrl-click on Windows and Linux).

A persona has its own page, because each persona is edited and saved independently of the brand and of the other personas. It has its own body, with four suggested headings:

| Heading         | What belongs under it                                      |
| --------------- | ---------------------------------------------------------- |
| **Profile**     | Who they are: life stage, situation, role, context.        |
| **Motivations** | What they want, and what sets them off looking for it.     |
| **Frictions**   | Objections, doubts and inertia — why they do not act.      |
| **Language**    | Their own words for the problem. Verbatims, not your copy. |

Same rules as a brand's body: free-form markdown, optional, the headings are advice, and an unwritten body is genuinely absent from what agents receive. An empty editor shows the four headings as its placeholder.

### The page of a persona

The app header shows the path, **Brands / the name of the brand / Personas / the name of the persona**. The **Personas** link goes back to the Personas tab of the brand. The page has no tabs. One row holds the state of the saves and a **⋯** menu with **Delete persona…**.

The main column shows the name, the description and the body, and you edit each one in place. There is no **Save** button, as on the page of a brand:

- The name and the description save when you leave the field, or when you press Enter. If you leave one of them blank, it goes back to the saved text.
- The body saves one second after you stop typing.
- Each change in the rail saves at once.

On a narrow screen, the rail shows between the description and the body. If an agent changes the persona while you edit, the page keeps your writing and handles it as it does for a brand.

The rail holds the properties of the persona:

| Property | What it is |
| --- | --- |
| **Handle** | The handle agents use. A new handle changes the address of the page. A handle that another persona of the brand uses is refused. The old handle stays, and the window shows the error. |
| **Age range** | The one structured field a persona has. Leave either end blank for an open end. For example, 35 with no maximum means "35 and older". If the range is not valid, for example a minimum above the maximum, the window shows the error and the range does not save. |
| **Created by** | Who created the persona. You cannot change it. |

The form that Cmd-click opens on **New persona** asks only for the name and the description. The handle comes from the name.

Besides the age range, everything else that might look structured — where they live, what they do, what they are into — is written into **Profile** as prose, because those resolve differently on every ad platform and a persona describes an audience rather than specifying a targeting setup.

:::info[Personas belong to one brand]

A persona's handle only has to be unique within its brand, so two brands can each have a `loyalists`. There is no way to share one between brands — and that is deliberate: seen from a competing brand's brief, the same real person has different frictions and different language. Describe them twice.

:::

Deleting a brand deletes its personas with it.

## Delete a brand

**Delete brand…**, in the **⋯** menu next to the tabs, removes the brand and everything authored on it — body, documents and personas alike — and detaches it from its ad accounts. Agents can no longer fetch it, and the handle is freed for re-use. The confirmation counts the personas and documents that go with it, and the ad accounts it leaves. It cannot be undone from the console. If you want the same context under a different handle, change the handle instead.

## Next

**[brand_resolve](/mcp/tools/brand-resolve)**

How an agent gets from an ad account to the brand context that applies.

**[brand_get](/mcp/tools/brand-get)**

What an agent actually receives when it loads a brand.

**[persona_get](/mcp/tools/persona-get)**

How an agent reads one of a brand's personas before it writes.

**[Skills](/console/skills)**

The other half of the context you write for your agents: ad-ops playbooks.
