Custom domain
Serve your public site from your own address, like help.example.com.
median site domain set help.example.com
A custom domain becomes the site’s address. Once it is live,
<slug>.median.website redirects to it.
Any domain you own works: a subdomain like docs.example.com or
support.example.com, a deeper one, or the apex example.com itself.
Connect a domain
Add the domain
Go to Site → Overview → Custom domain. Enter the hostname and press Connect.
Add the DNS records
Copy each record into your DNS provider. Names are relative to your
domain: help for help.example.com, @ for example.com itself.
Wait for Live
The status moves from Waiting for DNS to Live once the records are found. Check now checks straight away.
DNS records
| Domain | Type | Name | Value |
|---|---|---|---|
A subdomain, like help.example.com |
CNAME |
help |
The target shown, like cname.vercel-dns.com |
The apex, like example.com |
A |
@ |
The address shown, like 76.76.21.21 |
| Any, when listed | TXT |
_vercel |
The value shown. Proves you own a domain that is already used elsewhere on Vercel |
Use the values the dashboard shows. They can differ from these examples.
Status
| Status | Meaning |
|---|---|
| Waiting for DNS | Records are missing, or have not spread yet. The records still to add are listed |
| Live | The site answers on the domain over HTTPS. <slug>.median.website redirects to it with a 308 |
| Fact | Detail |
|---|---|
| Checks | On connect, then on their own: after 2 minutes, then further apart, for about 4 days. Daily once live |
| Certificate | Issued and renewed for you |
| Paths | The redirect keeps the path and query. /support goes to /support |
| Broken records | A live domain whose records stop resolving goes back to Waiting for DNS, and the redirect stops |
| One per site | Connecting another domain replaces the first |
| Remove | The site answers on <slug>.median.website again |
| Sign-in | Works on both addresses |
Plan and access
| Requirement | Detail |
|---|---|
| Plan | The Site add-on, or Pro. See Plans |
| Role | Admins and owners |
API and CLI
| Action | CLI | REST |
|---|---|---|
| Show | median site domain get |
GET /v1/site/domain |
| Connect | median site domain set <hostname> |
POST /v1/site/domain |
| Check now | median site domain check |
POST /v1/site/domain/check |
| Remove | median site domain remove |
DELETE /v1/site/domain |
MCP: median.site.domain(), setDomain({ domain }), checkDomain(). See
the management API.
Troubleshooting
| Message | Fix |
|---|---|
Enter the whole domain, like docs.yourcompany.com. |
Include the domain, not only the subdomain |
No domain ends in .<ending>. Check the spelling. |
The ending does not exist in DNS. Check it against your registrar |
Domains can only use letters, numbers and hyphens, and a part can't start or end with a hyphen. |
Underscores and other symbols can’t be in a hostname |
Use a domain name, not an IP address. |
Enter the hostname, not the address it points at |
Your median.website address comes from your slug. Change it in Settings under General. |
A different median.website address is a slug change, not a custom domain |
vercel.app addresses belong to Vercel. Use a domain you own. |
Connect your own domain, not the Vercel address |
localhost only works on your own computer. Use a public domain. |
Use a domain that resolves on the internet |
median.sh addresses are only for Median's own site. |
Median keeps its own domain for its own site |
That domain is already connected to another site. |
Remove it from the other organization’s site first |
That domain is already in use somewhere else. Remove it there first. |
It is attached to another Vercel project. Remove it there |
That domain can't be used. Check the spelling and try again. |
Check the spelling |
This feature requires an eligible paid plan. |
Add Site, or move to Pro |
Custom domains are not available right now. Please try again later. |
Try again later |
We couldn't check this domain just now. We'll try again soon. |
Nothing. The next check runs on its own |
| Stuck on Waiting for DNS | Run dig help.example.com. It has to return the value shown, with no proxy in front |