There are at least a dozen open threads here with the same shape: a custom domain
times out, stalls or resets, while *.vercel.app loads normally from the same
network and the same device. They are spread across Morocco, Russia, Jio in India
and Starlink in Brazil, and most are being answered, where they are answered at
all, as individual DNS or certificate problems.
I think they are one thing, and I do not think it is Vercel's routing. Everything below is reproducible with curl and no Vercel credentials. I am measuring from Hamburg on a working network, so I can show what the infrastructure does; I cannot reproduce the failure, and the last section is the part only affected users can run.
The two hostnames are not on different networks
The common theory in these threads, and the one I started with, is that custom
domains live on an IP range some ISPs block. One thread names 216.198.79.1
directly. That is not what resolution shows:
swetaprangya-sahoo-portfolio.vercel.app 216.198.79.67, 64.29.17.67support-triage-app-one.vercel.app 216.198.79.3, 64.29.17.3jobhunt-console.vercel.app 216.198.79.195, 64.29.17.195swr.vercel.app 216.198.79.131, 64.29.17.131
kidzo.ru (custom) 216.198.79.65, 64.29.17.65Same /24. .65 and .67 are neighbours. The last octet does not track custom
versus vercel.app either: swr.vercel.app sits on .131, in among the custom
domains.
Older custom domains resolve elsewhere (76.76.21.0/24, 66.33.60.0/24), so a
project that has never been migrated is a separate case. But for anything on the
current range, the custom domain and the vercel.app hostname are neighbours.
The edges are interchangeable
Stronger than sharing a range: any of these IPs will serve any Vercel-hosted hostname, with a valid certificate, if you pin it and let SNI do the work.
curl -sv --resolve swetaprangya-sahoo-portfolio.vercel.app:443:216.198.79.67 https://swetaprangya-sahoo-portfolio.vercel.app/ HTTP 200curl -sv --resolve swetaprangya-sahoo-portfolio.vercel.app:443:216.198.79.65 https://swetaprangya-sahoo-portfolio.vercel.app/ HTTP 200curl -sv --resolve swetaprangya-sahoo-portfolio.vercel.app:443:216.198.79.131 https://swetaprangya-sahoo-portfolio.vercel.app/ HTTP 200curl -sv --resolve kidzo.ru:443:216.198.79.67 https://kidzo.ru/ HTTP 200All four complete TLS with ssl_verify_result=0. The edge that serves a custom
domain serves vercel.app hostnames, and the reverse. There is no
custom-domain IP and no vercel.app IP.
What that leaves
If the IP is reachable (the user's *.vercel.app proves it, since it is the same
range and often the same machine) and the certificate is valid, then the only thing
that differs between the request that works and the request that fails is the
hostname: in the TLS SNI field, and again in the Host header.
Filtering on the hostname rather than the address happens on the path, not at Vercel. That matches the geography in these threads, where SNI-level inspection is well documented, and it explains the strangest symptom in the cluster: several reports say the response stalls after HTTP 200 rather than failing to connect, which is a mid-stream reset rather than a blocked route.
I want to be careful about how far that goes. I have ruled out a Vercel-side IP split and shown the edges are interchangeable. I have not proved what is happening on any affected path, and I cannot from here.
Two commands, if your custom domain is affected
These separate the address from the name. Run both from the network where it fails and paste the output.
1. Is the IP reachable at all? Pin your custom domain's IP, but ask for a
vercel.app hostname:
curl -sv -o /dev/null --resolve swr.vercel.app:443:<YOUR_CUSTOM_DOMAIN_IP> https://swr.vercel.app/Succeeds: the address and the route are fine, and the problem is your hostname. Fails: the address itself is unreachable, which is a different problem.
2. Same IP, same route, only the name changes. This isolates SNI:
openssl s_client -connect <YOUR_CUSTOM_DOMAIN_IP>:443 -servername swr.vercel.app </dev/nullopenssl s_client -connect <YOUR_CUSTOM_DOMAIN_IP>:443 -servername <YOUR_DOMAIN> </dev/nullOne handshake completing and the other resetting, on the same IP in the same session, is the answer. If both complete, the TLS layer is fine and the stall is happening later, which is worth knowing too.
Find your IP with dig +short <YOUR_DOMAIN> or nslookup <YOUR_DOMAIN>.
Why this matters for the threads
If this holds, then asking these users to re-add DNS records, re-issue certificates or change nameservers cannot work, because nothing in their Vercel configuration is involved. The useful answers become different ones: which networks are affected, whether a different hostname on the same project is reachable, and what Vercel can tell an affected user to take to their ISP.
It would also be worth knowing whether Vercel can serve a custom domain from a
hostname the user controls on the vercel.app namespace as a temporary route,
since the edge clearly already does this.
The threads I think are the same issue
- 47582, 49530, 50512, 47833 (Morocco)
- 49387, 48756, 49339 (Russia)
- 49960, 50277 (Starlink Brazil)
- 49668 (Jio, India)
- 49526, 50885 (network path unspecified)
If your thread is in that list and the two commands above give a different result from what I predict, that is the most useful thing anyone could post here, because it would rule this out.