logo
Domains

Fix a custom domain that is not working

Why a custom domain stays unverified or stops serving links — Cloudflare proxy, CAA records, conflicting DNS, caching, and the 30-day suspension.

Avatar for undefined
CodeQR Team
Content Team

A custom domain that will not verify almost always has one of six causes. This page goes through them in the order they are worth checking, with the command that tells you which one you have.

Availability

  • Plan: Starter and above.
  • Where: Domains in the sidebar, then Refresh on the domain card.

Start here

Ask the internet what your domain resolves to, from outside your own network:

dig +short go.example.com CNAME
dig +short example.com A
dig +short _vercel.example.com TXT

A subdomain should answer cname.codeqr.io., a root domain should answer 76.76.21.21, and the TXT record should return the vc-domain-verify=… value shown on the domain card. Anything else is the problem, and the sections below name it.

The Cloudflare proxy is on

The most common cause by a wide margin. If your DNS is on Cloudflare and the record has the orange cloud enabled, Cloudflare answers for your domain with its own addresses. Verification never sees the record you added, and the domain sits on Pending Verification or Invalid Configuration forever.

Fix: open the DNS record in Cloudflare and switch the proxy status to DNS only — the gray cloud. The record value stays the same.

Symptoms that point here even before you check: dig returns two addresses that are not 76.76.21.21, or the site loads with a Cloudflare error page — 526, 525 or 1014. A redirect loop ending in ERR_TOO_MANY_REDIRECTS is the same family, caused by Cloudflare's Flexible SSL mode; Full (strict) is the setting that works with an origin that has its own certificate.

A CAA record is blocking the certificate

The domain resolves correctly, but https:// never starts working. If certificate issuance fails with a message naming CAA — CAA record for example.com prevents issuance — the domain has a CAA record that lists which certificate authorities may issue for it, and the one used here is not on the list.

dig +short example.com CAA

Fix: if the command returns nothing, CAA is not your problem — an absent CAA record allows every authority. If it returns entries, add letsencrypt.org to them. Note that CAA is inherited: a record on example.com also governs go.example.com.

The domain is already in use somewhere else

A domain can be attached to one place at a time on the underlying infrastructure. If it is already connected to another account, verification is refused until ownership moves, which is exactly what the TXT _vercel record does.

Fix: add the TXT record shown on your domain card, at the root of the domain, and select Refresh. If the domain currently serves a live website on the same infrastructure, be deliberate: this transfer takes the domain away from that site.

There is a conflicting record

A hostname cannot hold a CNAME next to an A, AAAA or another CNAME. Providers often accept both silently and then serve the wrong one.

Fix: delete every other record for that exact name, keep the one from Point your domain with a CNAME or A record, and check with dig that only one answer comes back.

You are looking at a cached answer

The record is right, dig from a colleague's machine agrees, and your browser still lands somewhere else. Resolvers hold the previous answer for as long as its TTL said, and your own machine holds it again on top of that.

Fix: wait — the ceiling is the old TTL, not a fixed number of hours. To check without your own cache in the way, query a public resolver:

dig +short go.example.com CNAME @1.1.1.1

The record is right and links still do not open

Two details catch people here:

  • A trailing dot. Some panels require cname.codeqr.io. and some reject it. Follow the format the other records in your zone already use.
  • An accented or non-Latin domain. It must be entered in its punycode form (xn--…), which is what your registrar shows in the zone file.

What happens if it stays broken

CodeQR checks configured domains hourly. If a domain stays invalid, everyone in the workspace gets an email after 14 days and another after 28. After 30 days the domain is suspended and flagged for manual review.

Suspension does not delete anything. The domain, its links, its QR codes and their statistics stay in place, and fixing the DNS record clears the state on the next check. The email you receive is more alarming than the behavior — it says the domain will be deleted, which is not what happens.

Verify it works

curl -sSI https://go.example.com/summer
HTTP/2 302
location: https://example.com/menu

If you get a 302 with your destination, the domain is healthy regardless of what any panel says. A 404, a Cloudflare error page or a certificate warning each point back to a section above.

Troubleshooting

The status says Invalid Configuration

DNS answers, but with the wrong value. Compare what dig returns against the record on the domain card. The Cloudflare proxy is the first thing to rule out.

Links on the domain suddenly stopped working

Something changed in DNS: a zone migration, a nameserver change at the registrar, or a record deleted during unrelated maintenance. Re-add the record and select Refresh.

My domain expired at the registrar

Nothing in CodeQR can compensate for that — the domain no longer resolves for anyone. Renew it, and the links resume once DNS is restored. If the domain is gone for good, read Change or remove a domain without losing links before touching anything in the workspace.

Everything checks out and it still will not verify

Select Refresh rather than reloading the page, and give it a few minutes between attempts. Repeated checks in a short window can be rate limited upstream, which shows up as a check that fails for no visible reason.

Related articles