<env-name>-<service>-<id>.<platform-apps-domain> — for example test-api-3f9a2c1b.app.slipway.sh. The <id> is a short, stable identifier derived from the environment-instance (every service of one instance shares it, and it survives redeploys). If you’d rather serve previews under your own zone — <env-name>-<service>-<id>.preview.acme.com, for example — claim a custom domain in your org.
Custom domains are managed at the org level. Your slipway.yaml references a verified zone by name in ports[].domain; the zone itself is claimed and verified in the UI. Every plan includes unlimited custom domains.
Claim a domain
Open Domains in the sidebar, click Add domain, and enter the parent zone you want to serve previews under (e.g.preview.acme.com). Slipway gives you a CNAME target — copy it into your DNS provider as a wildcard record:
Use it in a spec
Adddomain: to the public port:
<id> the environment-instance’s stable identifier):
- PR previews:
myenv-web-3f9a2c1b.preview.acme.com - Default-branch / manual:
myenv-web-9f8e7d6c.preview.acme.com
domain: in a spec doesn’t match a verified domain for the org, the deploy fails at the deploy phase with a clear error. Slipway won’t issue a certificate for a zone the org hasn’t proven it owns.
Set it on a whole environment
Instead of repeatingdomain: in every service’s spec, pick a verified zone on the environment itself — either in the composer’s Settings step (the Domain dropdown, when creating the environment) or later on the environment detail page under Settings → General → Custom domain. Every public service in that environment is then served under it by default — no spec change needed. Both dropdowns list only your org’s verified zones; leave them on the default for the platform apps domain.
Precedence, highest first:
- A per-port
domain:in the spec (overrides everything for that port). - The environment’s custom domain (the default for the whole env).
- The platform apps domain.
Pin a subdomain per service
The computed host always carries the stable<id> hash so URLs never collide. For the permanent deployment of a service, under a verified custom domain, you can drop the hash and pick the subdomain yourself: serve api at a clean api.acme.com instead of myenv-api-3f9a2c1b.acme.com.
Set it per public service:
- On an existing environment, open Settings → Domains. Pick the custom domain at the top, then each public service gets a subdomain field below it. The Composition tab shows the resulting host read-only.
- In the composer, on a component card, once you’ve chosen a custom domain and enabled the permanent deployment, each public service shows a subdomain field next to its URL preview.
- The value is a single label (for example
api,app,dashboard). It sits directly under the environment’s verified zone, soapibecomesapi.acme.com. - Each label must be unique within a zone across your org. Two services can’t both claim
api.acme.com. - Leave it blank to fall back to the computed
<env>-<service>-<id>.<zone>host.
<id> host so their throwaway copies never collide. A change takes effect on the next deploy, so the environment shows a Stale marker until you redeploy.