# 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 service domain add shop.acme.com --service web ``` #### pnpm ```bash pnpm prisma service domain add shop.acme.com --service web ``` #### yarn ```bash yarn prisma service domain add shop.acme.com --service web ``` #### npm ```bash npx prisma 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 service domain wait shop.acme.com --service web ``` #### pnpm ```bash pnpm prisma service domain wait shop.acme.com --service web ``` #### yarn ```bash yarn prisma service domain wait shop.acme.com --service web ``` #### npm ```bash npx prisma 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 service domain wait shop.acme.com --service web --timeout 0 --json ``` #### pnpm ```bash pnpm prisma service domain wait shop.acme.com --service web --timeout 0 --json ``` #### yarn ```bash yarn prisma service domain wait shop.acme.com --service web --timeout 0 --json ``` #### npm ```bash npx prisma 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 service domain remove shop.acme.com --service web ``` #### pnpm ```bash pnpm prisma service domain remove shop.acme.com --service web ``` #### yarn ```bash yarn prisma service domain remove shop.acme.com --service web ``` #### npm ```bash npx prisma 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 service domain show shop.acme.com --service web bunx prisma service domain retry shop.acme.com --service web ``` #### pnpm ```bash pnpm prisma service domain show shop.acme.com --service web pnpm prisma service domain retry shop.acme.com --service web ``` #### yarn ```bash yarn prisma service domain show shop.acme.com --service web yarn prisma service domain retry shop.acme.com --service web ``` #### npm ```bash npx prisma service domain show shop.acme.com --service web npx prisma 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. - [`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. - [`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. - [`Environment variables`](https://www.prisma.io/docs/compute/environment-variables): Project configuration that gets injected into your deployments, scoped to production, preview, or a single branch. - [`Environments: production, staging and preview branches`](https://www.prisma.io/docs/compute/branching): Host a test version next to production on Prisma Compute: once deploy on push is set up, every pushed branch other than the default one gets a preview with its own services and, for databases the Composer module declares, its own new database; production data is not copied, and a branch you keep works as staging. If the app reads DATABASE_URL instead, a preview is only as separate as that variable's preview-scoped value.