---
title: Brands
description: The context your agents read before they write anything — identity, voice, guidelines, messaging — 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 four pieces of free-form prose 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](/use/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 the **slug** (the handle agents use),
- a four-segment **coverage strip** — one segment per section, filled when that section is written, faint when it is empty.

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.

Between the mark and the strip, 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** asks for four 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. Fill it in and we read it and propose the four sections. |
| **Slug** | no | The handle agents use. Left blank, it is derived from the name. |

The four sections are deliberately absent from this form: asking for four essays before the brand exists is the wrong first step. Name it, then write it — or give a Website and start from what your own site already says.

:::warning[Renaming a slug moves the handle]

The slug is editable later, on 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 slug for re-use.

:::

## Start from your website

Almost everything the four sections want is already written down, publicly, on the brand's own site. Give the **Website** on the create form and AdCrunch reads it and proposes all four, so that the first thing you do on a new brand is edit rather than stare at four empty boxes.

Submitting creates the brand and then starts the read, and you land on the brand rather than waiting on the form. The four sections show they are being written, and fill in about a minute later. If the read cannot even be started, you are told and the brand is still created — a website that does not work never costs you the brand you were making.

**Nothing is written on your behalf.** What arrives are **unsaved changes** in the editor you would have typed into anyway, with **Save changes** and the section-level **Cancel** exactly where they already are. Read it, fix what is wrong, then save — or leave without saving and nothing was ever stored.

Three things about it are worth knowing before you rely on it:

- **It happens at creation, and only at creation.** It never runs against a brand that already has writing in it, and nothing you do to the Website afterwards starts one. The only way to run it again is the **Read it again** offered on a failed read — see below.
- **A section it could not ground stays empty.** That is a true answer rather than a failure: marketing sites essentially never state their own guardrails, so **Guidelines** in particular often comes back blank. An empty section reads as uncovered in the usual way, and confidently invented guardrails — read later by an agent as real constraints — would be far worse than a blank.
- **What you typed is kept.** A section is filled only if it is still empty _and_ you have not touched it, so both writing during the read and saving during the read leave your words alone.

The brand also shows **which pages were read**, so you can judge whether it had the right material to work from. The read is bounded: up to fifteen pages, following links two levels from the address you gave rather than crawling the whole site, and skipping the parts that dilute rather than describe — blog, news, careers, and legal pages like privacy and terms.

Close the tab mid-read and the proposal is waiting when you come back: the brand says one is ready and offers **Apply** or **Dismiss**. It is offered rather than applied, because unsaved changes you did not ask for _in this session_ are an ambush rather than a convenience.

:::warning[Editing the Website later reads nothing]

The Website is an ordinary editable field on the brand's page, like the slug. Changing it, setting it, or clearing it triggers **nothing** — no read, ever. It is a locator: where the brand lives on the web, for agents that need what the sections do not cover.

:::

### If the read fails

The brand says which of four things happened, and offers **Read it again** where retrying can help.

- **The site refused to be read.** Its `robots.txt` disallowed the crawler on every page it found, or it published a signal refusing this use. Both are one line in a file you own.
- **We could not reach the site.** Nothing readable came back. Check the URL and that the site answers from outside your own network — and note that **a WAF returning `403` lands here rather than under "refused"**, because from outside a firewall's refusal and a broken site look the same. The detail line under the message carries the status your origin actually returned, which is how you tell them apart.
- **The site said too little.** A one-page splash or a mostly-image site does not carry enough text to describe a brand. This is only reported after a second pass with a real browser, so a JavaScript-rendered site has already been retried before you see it. Writing the sections by hand is the honest answer.
- **We could not write the sections.** The site was read; our end did not finish. That one is ours rather than yours, and trying again is the whole fix.

:::tip[Letting the crawler through a WAF]

On Cloudflare, add a WAF custom rule that skips bot protection for **bot detection id `128292352`**. Other WAFs need the equivalent allowance. This fixes both of the first two failures above, since a WAF can produce either.

:::

**Read it again** appears only while the brand still has a Website and every section is still empty — the same precondition that makes this a create-time feature. Once you have written something, nothing can overwrite it, a re-read included.

## The four sections

A brand's own page is mostly these, and each one is free-form markdown:

| Section | What belongs in 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. |

Every section is **independently optional**, and a brand is meant to be authored incrementally: a name, a description and one written section is a valid, useful brand. There is no fifth catch-all section on purpose — a new kind of context earns a named one.

An empty section is not a blank waiting to be filled in. It is genuinely **absent from what agents receive**, and the page says so where the writing would have been — "Nothing written yet — agents will not see a Voice section" — because that is the most useful thing a context author can be told.

## Editing: read first, one save

The page renders the sections as the brief an agent actually gets, not as a stack of text boxes. Click **Edit** on a section and that one becomes an editor, one at a time.

Neither way out of an editor writes anything:

- **Done** returns the section to prose and keeps your text, marked **Unsaved**.
- **Cancel** — or **Esc** — puts back what the section said when you opened it.

**Save changes** — at the top of the page — is the only write, and it carries everything at once: the sections, the name, the description, the Website, a rename, and the logo nomination. Only what you actually changed is sent.

### If someone saved while you were editing

A Brand is agent-writable, so this is a real race rather than a theoretical one. The save is refused, the page reloads the brand, and **your writing is kept** — the notice names which sections the other writer changed. Saving again overwrites theirs, which the notice says outright; **Discard mine and take theirs** is the one button that goes the other way.

:::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.

:::

## Documents and the logo

The rail beside the writing 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 **Use as logo** on it. 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; **Clear** drops the nomination without deleting the file, and deleting the nominated file drops it for you.

:::tip[Files commit; the logo waits for the save]

Uploading and removing a document takes effect on the click — those are their own operations and never touch the brand itself. The logo nomination is the exception: it is written **on** the brand, so it lands with **Save changes**.

:::

A brand's documents are **not** [Assets](/mcp/assets). 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/assets), 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 rail's **Advertisers** card, **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 card says so and links to the console's integrations — connect an ad account first ([Meta](/use/connect/meta)), then come back and attach it.

:::info[The same thing over MCP]

This card 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 — name, description, the four sections, its documents and ad accounts. **Personas** is who that brief is aimed at.

The four sections say 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 which of their sections are written, so you can see at a glance which audience is still a name and nothing else.

Add one with **New persona**; it opens its own page, because each persona is edited and saved independently of the brand and of the other personas. A persona has its own four sections:

| Section         | What belongs in 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 sections: free-form markdown, independently optional, and an unwritten one is genuinely absent from what agents receive.

Above the sections sits the one structured field a persona has, an **age range**. Leave either end blank for an open end — a lower bound on its own means "and older". 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**, at the foot of the brand's page, removes the brand and everything authored on it — sections, documents and personas alike; agents can no longer fetch it, and the slug is freed for re-use. It cannot be undone from the console. If you want the same context under a different handle, rename the slug 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](/use/console/skills)**

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