# Domains (/docs/compute/domains)

> For the complete Prisma documentation index, see [llms.txt](https://www.prisma.io/docs/llms.txt). A markdown version of any docs page is available by appending `.md` to its URL.

Point a custom domain at a production app and the platform verifies DNS and provisions TLS for you.

Location: Compute > Domains

Configure custom domains that point to your [production app](https://www.prisma.io/docs/compute/branching). You can't configure custom domains for preview apps.

## Before you start [#before-you-start]

You'll need:

* A [linked project](https://www.prisma.io/docs/compute/getting-started).
* A production app with a [promoted, running deployment](https://www.prisma.io/docs/compute/deployments).
* Access to edit DNS records within your DNS provider.

Domain commands target the [production branch](https://www.prisma.io/docs/compute/branching). Pointing them at any other branch fails with a `BRANCH_NOT_DEPLOYABLE` error. Every domain subcommand also accepts `--project` and `--branch` flags.

## Add a custom domain [#add-a-custom-domain]

### 1. Add a domain [#1-add-a-domain]

  

#### bun

```bash
bunx prisma@latest service domain add shop.acme.com --service web
```

#### pnpm

```bash
pnpm dlx prisma@latest service domain add shop.acme.com --service web
```

#### yarn

```bash
yarn dlx prisma@latest service domain add shop.acme.com --service web
```

#### npm

```bash
npx prisma@latest service domain add shop.acme.com --service web
```

Registration verifies DNS up front. If the **CNAME** record isn't visible yet, the command fails with a `DOMAIN_DNS_NOT_CONFIGURED` error and prints the record name and value for you to create. Re-running `add` for a hostname that's already attached is safe: it shows the existing domain instead of failing.

### 2. Create CNAME Record [#2-create-cname-record]

Add the printed DNS record, which points at `switchboard.{region}.prisma.build`.

Example:

| Type  | Name            | Value                          | TTL |
| ----- | --------------- | ------------------------------ | --- |
| CNAME | `shop.acme.com` | `switchboard.cdg.prisma.build` | 300 |

The CLI prints the record name as the full hostname. If your DNS provider expects a relative name, enter just the label (`shop`).

> [!NOTE]
> What is switchboard?
> 
> Switchboard is the routing layer that sits in front of your Compute app. Switchboard verifies the domain, provisions and terminates TLS, then forwards traffic to your app.

### 3. Re-run `add`, then wait for provisioning [#3-re-run-add-then-wait-for-provisioning]

Once the CNAME record has propagated, re-run `service domain add`. This time registration succeeds and TLS provisioning starts. Track it with:

  

#### bun

```bash
bunx prisma@latest service domain wait shop.acme.com --service web
```

#### pnpm

```bash
pnpm dlx prisma@latest service domain wait shop.acme.com --service web
```

#### yarn

```bash
yarn dlx prisma@latest service domain wait shop.acme.com --service web
```

#### npm

```bash
npx prisma@latest service domain wait shop.acme.com --service web
```

`wait` polls until the domain is active, up to 15 minutes. For a single status check, use `--timeout 0`:

  

#### bun

```bash
bunx prisma@latest service domain wait shop.acme.com --service web --timeout 0 --json
```

#### pnpm

```bash
pnpm dlx prisma@latest service domain wait shop.acme.com --service web --timeout 0 --json
```

#### yarn

```bash
yarn dlx prisma@latest service domain wait shop.acme.com --service web --timeout 0 --json
```

#### npm

```bash
npx prisma@latest service domain wait shop.acme.com --service web --timeout 0 --json
```

A single check exits non-zero with `DOMAIN_VERIFICATION_TIMEOUT` while the domain is still provisioning, so automation should read the status event rather than the exit code. In `--json` mode, `wait` streams newline-delimited status events, so an agent can track provisioning as it progresses.

## Remove a domain [#remove-a-domain]

  

#### bun

```bash
bunx prisma@latest service domain remove shop.acme.com --service web
```

#### pnpm

```bash
pnpm dlx prisma@latest service domain remove shop.acme.com --service web
```

#### yarn

```bash
yarn dlx prisma@latest service domain remove shop.acme.com --service web
```

#### npm

```bash
npx prisma@latest service domain remove shop.acme.com --service web
```

Removing detaches the domain from the app. Pass `--yes` to skip the confirmation prompt. Prisma can't touch your DNS, so the CNAME record stays behind. Delete it at your provider once you no longer need it.

## States [#states]

A domain moves through these states:

| Status             | Meaning                                                         |
| ------------------ | --------------------------------------------------------------- |
| `pending_dns`      | The domain is registered; TLS provisioning hasn't started yet   |
| `provisioning_tls` | The TLS certificate is being issued                             |
| `active`           | The domain is fully provisioned and routing traffic to your app |
| `failed`           | Registration or provisioning failed; see the failure reason     |

## Limits [#limits]

* Custom domains are only available on production apps.
* DNS uses CNAME records only. Apex domains need a DNS provider that supports CNAME-like records (ALIAS, ANAME, or CNAME flattening) at the apex.
* Wildcard hostnames such as `*.acme.com` are rejected.
* Up to 3 custom domains per app. Adding more returns `DOMAIN_QUOTA_EXCEEDED`.
* There's no workspace-wide domain list in the CLI.

## Troubleshooting [#troubleshooting]

  

#### bun

```bash
bunx prisma@latest service domain show shop.acme.com --service web
bunx prisma@latest service domain retry shop.acme.com --service web
```

#### pnpm

```bash
pnpm dlx prisma@latest service domain show shop.acme.com --service web
pnpm dlx prisma@latest service domain retry shop.acme.com --service web
```

#### yarn

```bash
yarn dlx prisma@latest service domain show shop.acme.com --service web
yarn dlx prisma@latest service domain retry shop.acme.com --service web
```

#### npm

```bash
npx prisma@latest service domain show shop.acme.com --service web
npx prisma@latest service domain retry shop.acme.com --service web
```

`show` prints the exact state, certificate details, and any DNS hints. `retry` restarts stuck provisioning. If a domain isn't in a retryable state, it returns `DOMAIN_RETRY_NOT_ELIGIBLE`.

## Next steps [#next-steps]

* [Deployments](https://www.prisma.io/docs/compute/deployments): promote a deployment to production first.
* [Known limitations](https://www.prisma.io/docs/compute/limitations): what Compute can and can't do.
* [`service domain` reference](https://www.prisma.io/docs/cli/service#service-domain): every domain subcommand and flag.

## Related pages

- [`Alchemy`](https://www.prisma.io/docs/compute/alchemy): Provision Prisma Postgres and deploy applications to Prisma Compute in one TypeScript stack.
- [`Branching`](https://www.prisma.io/docs/compute/branching): Branches are isolated environments that map to your Git branches, so preview work never touches production.
- [`Deploy Button`](https://www.prisma.io/docs/compute/deploy-button): Add a Deploy with Prisma button that copies a public Composer repository and starts a Composer-managed deployment.
- [`Deploy on push`](https://www.prisma.io/docs/compute/deploy-on-push): Graduate a Composer app from manual deploys to a Git workflow, with production deploys on push and an isolated preview environment per branch.
- [`Deployments`](https://www.prisma.io/docs/compute/deployments): How deploys create service versions on Prisma Compute, and how to inspect, promote, roll back, start, and stop them.