> ## Documentation Index
> Fetch the complete documentation index at: https://www.courier.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Install the Courier skill before writing code: `npx skills add trycourier/courier-skills`. It carries the verified SDK shapes and the rules you cannot get wrong.
> Authenticate every request with `Authorization: Bearer <API_KEY>`. A workspace has several environments and each has its own keys, which are plain `pk_` strings with no environment prefix. Start with Test.
> Send with `client.send.message`, the default import of the v7 Node SDK. Reference a template by its `nt_` id or its alias.
> A send accepts a bare Elemental element list, but storing content on a template requires the top-level elements wrapped in a channel element.
> Templates and journeys can be built in the Courier app or created through the API. Either way they live in the workspace and are referenced by ID when you send.
> The hosted MCP server is https://mcp.courier.com. For a briefing on what Courier is and when to use it, read https://www.courier.com/llms.txt.
> Prefer the Guides tab for how-do-I questions and the Docs tab for how-does-it-behave questions. The API reference lives under /api-reference.

# Brands

> Apply one logo, color set, header, and footer across every template you send.

export const Endpoint = ({method, path, name, href, children, bare}) => {
  const verb = String(method || "").toUpperCase();
  const title = verb + " " + path;
  const label = children || name || path;
  if (bare) {
    return href ? <a href={href}><code>{title}</code></a> : <code>{title}</code>;
  }
  if (!href) {
    return <span className="cx-endpoint" data-method={verb} title={title}>
        <span className="cx-endpoint-label">{label}</span>
        <span className="cx-endpoint-method">{verb}</span>
      </span>;
  }
  return <a className="cx-endpoint" data-method={verb} href={href} title={title}>
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method">{verb}</span>
    </a>;
};

export const AppLink = ({href, children, name, bare}) => {
  const label = children || name || "Open in Courier";
  if (bare) {
    return <a href={href} target="_blank" rel="noreferrer">{label}</a>;
  }
  return <a className="cx-endpoint" data-kind="app" href={href} target="_blank" rel="noreferrer">
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method" aria-hidden="true">↗</span>
    </a>;
};

export const Doc = ({href, children, name, bare}) => {
  const label = children || name || href;
  if (bare) {
    return <a href={href}>{label}</a>;
  }
  return <a className="cx-endpoint" data-kind="doc" href={href}>
      <span className="cx-endpoint-label">{label}</span>
      <span className="cx-endpoint-method">DOC</span>
    </a>;
};

A brand is the visual appearance Courier applies to your notifications: logo, colors, header, footer, and custom styling.

Attach a brand to a template and every send inherits it, so styling stays consistent. Brands cover white-labeling, multiple product identities, and per-tenant styling.

## How it works

### The brand object

A brand's `settings` hold the stored configuration:

| Path                              | What it holds                                                                                                    |
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `settings.colors`                 | `primary` and `secondary`, plus any extra key you add. The designer offers `tertiary`.                           |
| `settings.email.header`           | `barColor`, and `logo.image` with an optional `logo.href`                                                        |
| `settings.email.footer`           | `markdown`, `inheritDefault`, and a `social` URL for `facebook`, `instagram`, `linkedin`, `medium`, or `twitter` |
| `settings.email.head`             | `content`, injected into the email's `<head>`                                                                    |
| `settings.email.templateOverride` | A custom MJML or Handlebars template, with its own background colors                                             |
| `settings.inapp`                  | In-app styling: colors, icons, placement, border radius, font family                                             |

A brand ID is prefixed `bnd_`. Legacy brands may use a slug like `default`.

Every workspace has a **default brand** that cannot be deleted. Every email uses it unless you disable brands in template settings. It is also the fallback when a send enables brands without naming one.

Manage brands through the <Endpoint method="GET" path="/brands" name="List Brands" href="/docs/api-reference/brands/list-brands">Brands API</Endpoint> or the <AppLink href="https://app.courier.com/content/brands">console</AppLink>.

### Brand variables in a template

At render time Courier flattens the brand into the `brand` namespace, **without** the `settings` level:

| Variable                                                                          | Resolves to                                           |
| --------------------------------------------------------------------------------- | ----------------------------------------------------- |
| `brand.id`                                                                        | The brand's ID                                        |
| `brand.colors.primary`, `.secondary`, `.tertiary`                                 | The brand's colors                                    |
| `brand.email.header.barColor`                                                     | The header bar color                                  |
| `brand.email.header.logo.image`, `.logo.href`                                     | The logo image and the link it wraps                  |
| `brand.email.backgroundColor`, `.blocksBackgroundColor`, `.footerBackgroundColor` | Layout colors from the active template override       |
| `brand.social.facebook`, `.instagram`, `.linkedin`, `.medium`, `.twitter`         | Each social URL. A network with no URL set is absent. |
| `brand.inapp`                                                                     | The in-app settings                                   |

Write it double-braced, so `{{brand.colors.primary}}` in template content, or `{{var "brand.colors.primary"}}` inside a brand's own MJML/Handlebars template. See <Doc href="/docs/design/templates/variables">variables</Doc>.

### Brand designer

The brand designer is the visual editor for a brand's logo, colors, header, and footer. It also takes a custom MJML/Handlebars template, so you can define the exact header and footer markup.

<Frame>
  <img src="https://mintcdn.com/courier-4f1f25dc/LdpdyPjJHKHJqFY9/assets/brand-designer.webp?fit=max&auto=format&n=LdpdyPjJHKHJqFY9&q=85&s=f4266505e6dc078f069075640b362f29" alt="The brand designer: brand logo and primary, secondary, and tertiary colors on the left, the head, header, and footer editors in the middle, and social URLs on the right" width="2568" height="1096" data-path="assets/brand-designer.webp" />
</Frame>

### Brand snippets

<Note>
  **Brand snippets are legacy and not recommended for new work.** They are a **Snippets** tab on the older brand designer that stores reusable Handlebars fragments on a brand. The new brand designer does not carry them forward, and they are not being developed further. Existing snippets keep rendering. For shared content in new templates, use the brand's header, footer, and **Head** editors, or a template override.
</Note>

### CSS class names

Courier puts a class on every part of a rendered email. Restyle any of them from the brand's **Head** editor.

Every rule takes the same shape: a `c--` class, a `*`, and `!important`.

```html theme={null}
<mj-style>
  .c--block-text * {
    font-family: Georgia, serif !important;
  }
</mj-style>
```

Both are load-bearing. The class sits on a wrapper, so `*` reaches the text inside it, and MJML's inline styles beat a plain stylesheet.

| Target | Classes                                                                                                                                                                                          |
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Layout | `c--email-body`, `c--email-content`, `c--email-header`, `c--email-footer`, `c--social`                                                                                                           |
| Blocks | `c--block`, and one of `c--block-text`, `c--block-image`, `c--block-action`, `c--block-list`, `c--block-quote`, `c--block-divider`, `c--block-markdown`, `c--block-template`, `c--block-columns` |
| Text   | `c--text-text`, `c--text-h1`, `c--text-h2`, `c--text-h3`, `c--text-subtext`, `c--text-quote`                                                                                                     |

### Email domain white-labeling

Sending from your own domain is configured on the **email provider integration**, not on the brand. Set your verified sending domain and From address on the provider (SendGrid, SES, and so on). Courier enforces the allowed domain at send time.

A branded **link and open tracking** domain is a separate setup, a CNAME to Courier's tracking infrastructure. See <Doc href="/docs/monitor/tracking#custom-link-tracking-domain">tracking</Doc>.

### Applying a brand to a send

Courier picks the brand in this order:

1. The `brand_id` on the send message.
2. The template's configured default brand, if brands are enabled on it.
3. The workspace default brand.

Override the brand per channel with `channels.<channel>.brand_id`. In multi-tenant apps, a <Doc href="/docs/tenants/context">tenant</Doc> can carry a default brand, so sends in that tenant's context pick it up automatically.

## Limits & behavior

* **The default brand is the fallback.** A brand-enabled send with no `brand_id` uses the workspace default. It cannot be deleted.
* **Custom CSS needs `*` and `!important`.** The class is on the wrapper, and the compiler's inline styles win otherwise.
* **Domain white-labeling is provider config, not a brand setting.** Configure the sending domain on the email integration.

## FAQ

<AccordionGroup>
  <Accordion title="How do I send from my own domain?">
    Set a verified sending domain and From address on your email provider integration. The brand controls visual styling only. A branded tracking domain is a separate CNAME setup.
  </Accordion>

  <Accordion title="What CSS classes can I target?">
    Layout classes like `c--email-body` and `c--email-footer`, `c--block` with a per-type variant such as `c--block-text`, and text classes from `c--text-text` to `c--text-h3`. Write `.c--block-text * { ... !important }`. The `*` reaches the text inside the wrapper, and `!important` beats the compiler's inline styles.
  </Accordion>

  <Accordion title="How do I brand notifications per tenant?">
    Give each tenant a brand and set it as the tenant's default, or pass `brand_id` on the send. Sends in a tenant's context pick up its brand automatically.
  </Accordion>
</AccordionGroup>
