# Templates in the dashboard

> Part of the Cowliss docs. Markdown for every page: append `index.md` to its URL. Site map: /llms.txt

The dashboard's **Templates** section shows every template your organization has, lets you edit it, renders the copy that will actually go out, and sends it to you so you can look at it in a real inbox. Both kinds are edited here: a [doc template](/emails/#a-doc-template) in the same editor as a broadcast, a [Liquid template](/emails/#a-liquid-template) as code.

## The list

One row per template key: the key, its tags, its latest version with when it was pushed, and the automations that send it. Search filters on the key. Opening a row opens the template.

A key is unique per app, not per organization: two apps that each push `welcome` each have their own, with their own page, and each app's automations send only their own.

## The template page

- **Overview**: the subject, its purpose under the label your `cow.json` gave it, the app it belongs to, and every automation that sends it.
- **Preview**: the latest version rendered with props you type as JSON, so you can see the copy a given send produces. This is the same renderer a send uses, so what you read is what a recipient reads.
- **Edit**: a doc in the doc editor, or a Liquid template's subject, preview text, purpose, tags and HTML in a code editor. Saving takes an admin and files the next version, which the next send uses; Liquid that does not parse is refused with the reason under the editor. It is the same write as `cow templates update`, so the next push that would replace the template asks first, naming it as a [conflict](/guides/repo/#conflicts), and `cow pull` brings the edit back into your repo.
- **Source**: on a Liquid template's Overview, its HTML as stored, to read and copy.
- **Send test**: sends the message you are previewing to your own address, from an address on the domain your organization verified first. It goes to you and to nobody else: no consent is checked against a recipient, nothing is metered, and the row it leaves is a test. It shows under **Recent sends** on this page and on no one's timeline.
- **Versions**: every version of the key, newest first, with its digest, when it was written, and who wrote it: a push, or the dashboard and the API.

## Deleting

Delete is a row action and a last resort. It is refused while any automation still sends the template, and the message names them: delete those automations first, or push a version that stops sending it. Deleting removes every version of the key in that app, and leaves another app's template of the same key alone.

## The same from the CLI

```sh
cow templates list
cow templates get abandoned-checkout
cow templates preview abandoned-checkout --props '{"firstName":"Ada"}'
cow templates testSend abandoned-checkout --props '{"firstName":"Ada"}'
cow templates delete abandoned-checkout
```

While one app has a key, the key alone names it. Once a second app pushes the same key, name the app too, or the command is refused with both apps named:

```sh
cow templates get welcome --app-id app_shop
```

The test goes to the address on your own account, never to one you name, so this is not a way to mail somebody. All of these need a signed-in session: a pipeline key does not reach templates.

From your own code, `cow.templates.preview({ key, props })` in the SDK renders a template with props you compose, exactly as `cow.emails.send` to an address would, and sends nothing. It takes your API key, so your app can show its operators the message before it goes.

## Where next

- [Email templates](/emails/): Liquid and doc templates, purposes, and the links Cowliss mints.
- [Sending and delivery](/emails/delivery/): the gates every send passes and what each status means.
- [Your repo](/guides/repo/): how a push turns a file into the version this page shows, and how `cow pull` turns it back.
