[{"data":1,"prerenderedAt":748},["ShallowReactive",2],{"docs-\u002Fcustom-domains":3},{"id":4,"title":5,"body":6,"description":740,"extension":741,"meta":742,"navigation":743,"path":744,"seo":745,"stem":746,"__hash__":747},"docs\u002Fdocs\u002Fcustom-domains.md","Custom Domains",{"type":7,"value":8,"toc":716},"minimark",[9,13,26,34,37,42,71,73,77,112,114,118,123,136,140,143,182,187,205,209,216,219,239,242,246,249,259,262,264,268,275,287,293,296,298,302,312,315,374,385,484,495,499,537,541,547,561,566,570,601,603,607,611,640,644,658,662,673,675,679,690],[10,11,5],"h1",{"id":12},"custom-domains",[14,15,16,17,21,22,25],"p",{},"Custom domains let you serve assets and API proxy requests from your own hostname (e.g., ",[18,19,20],"code",{},"cdn.yourdomain.com",") instead of the default ",[18,23,24],{},"your-tenant.cachely.io"," subdomain.",[14,27,28,29,33],{},"Custom domains are available on the ",[30,31,32],"strong",{},"Pro plan",".",[35,36],"hr",{},[38,39,41],"h2",{"id":40},"what-you-get","What you get",[43,44,45,56,62,65],"ul",{},[46,47,48,49,52,53],"li",{},"Assets served from ",[18,50,51],{},"cdn.yourdomain.com\u002Fpath\u002Fto\u002Fimage.jpg"," instead of ",[18,54,55],{},"your-tenant.cachely.io\u002Fpath\u002Fto\u002Fimage.jpg",[46,57,58,59],{},"API proxy works the same: ",[18,60,61],{},"cdn.yourdomain.com\u002F~api\u002F...",[46,63,64],{},"Automatic SSL certificate provisioning",[46,66,67,68,70],{},"The default ",[18,69,24],{}," subdomain remains active alongside your custom domain — nothing breaks",[35,72],{},[38,74,76],{"id":75},"requirements","Requirements",[43,78,79,84,90,106],{},[46,80,81,83],{},[30,82,32],{}," — custom domains are not available on the free plan",[46,85,86,89],{},[30,87,88],{},"One custom domain per tenant"," — each tenant can have one custom domain",[46,91,92,95,96,98,99,102,103],{},[30,93,94],{},"Subdomains only"," — use ",[18,97,20],{}," or ",[18,100,101],{},"assets.yourdomain.com",", not bare\u002Fapex domains like ",[18,104,105],{},"yourdomain.com",[46,107,108,111],{},[30,109,110],{},"Access to your DNS provider"," — you'll need to create a CNAME record",[35,113],{},[38,115,117],{"id":116},"setup","Setup",[119,120,122],"h3",{"id":121},"_1-add-the-domain","1. Add the domain",[14,124,125,126,129,130,132,133,33],{},"On the tenant detail page, find the ",[30,127,128],{},"Custom domain"," card. Enter your desired subdomain (e.g., ",[18,131,20],{},") and click ",[30,134,135],{},"Add",[119,137,139],{"id":138},"_2-configure-dns","2. Configure DNS",[14,141,142],{},"After adding, you'll see a DNS record table showing exactly what to create at your DNS provider:",[144,145,146,162],"table",{},[147,148,149],"thead",{},[150,151,152,156,159],"tr",{},[153,154,155],"th",{},"Type",[153,157,158],{},"Name",[153,160,161],{},"Value",[163,164,165],"tbody",{},[150,166,167,171,177],{},[168,169,170],"td",{},"CNAME",[168,172,173,176],{},[18,174,175],{},"cdn"," (your chosen subdomain)",[168,178,179],{},[18,180,181],{},"proxy.cachely.io",[14,183,184],{},[30,185,186],{},"Tips:",[43,188,189,195,202],{},[46,190,191,192,194],{},"Enter just the subdomain label (e.g., ",[18,193,175],{},"), not the full hostname — most DNS providers append your root domain automatically",[46,196,197,198,201],{},"If your DNS provider is Cloudflare, make sure the record is ",[30,199,200],{},"DNS only"," (grey cloud), not proxied (orange cloud)",[46,203,204],{},"DNS changes usually take a few minutes but can take up to an hour",[119,206,208],{"id":207},"_3-verify","3. Verify",[14,210,211,212,215],{},"Once your DNS record is in place, click ",[30,213,214],{},"Check DNS",". This verifies the CNAME and provisions an SSL certificate.",[14,217,218],{},"Possible outcomes:",[43,220,221,227,233],{},[46,222,223,226],{},[30,224,225],{},"Active"," — DNS verified, SSL provisioned, domain is serving traffic",[46,228,229,232],{},[30,230,231],{},"Pending DNS"," — CNAME not yet detected. Wait a few minutes and check again",[46,234,235,238],{},[30,236,237],{},"Failed"," — verification failed. Check the error message and your DNS configuration",[14,240,241],{},"You can retry verification as many times as needed.",[119,243,245],{"id":244},"_4-start-using-it","4. Start using it",[14,247,248],{},"Once active, your custom domain works identically to the default subdomain:",[250,251,256],"pre",{"className":252,"code":254,"language":255},[253],"language-text","# Assets\nhttps:\u002F\u002Fcdn.yourdomain.com\u002Fpath\u002Fto\u002Fimage.jpg\n\n# API proxy\nhttps:\u002F\u002Fcdn.yourdomain.com\u002F~api\u002F...\n","text",[18,257,254],{"__ignoreMap":258},"",[14,260,261],{},"No application code changes are needed — both hostnames resolve to the same tenant and share the same cache, analytics, and configuration.",[35,263],{},[38,265,267],{"id":266},"removal","Removal",[14,269,270,271,274],{},"To remove a custom domain, click ",[30,272,273],{},"Remove domain"," and confirm. This immediately:",[276,277,278,281,284],"ol",{},[46,279,280],{},"Stops serving traffic on that hostname",[46,282,283],{},"Removes the SSL certificate",[46,285,286],{},"Removes the DNS-to-tenant mapping",[14,288,289,290,292],{},"Your default ",[18,291,24],{}," subdomain continues working. You can delete the CNAME record at your DNS provider afterwards.",[14,294,295],{},"When a tenant is deleted, any associated custom domain is cleaned up automatically.",[35,297],{},[38,299,301],{"id":300},"search-indexing-seo","Search indexing (SEO)",[303,304,305],"blockquote",{},[14,306,307,308,311],{},"These settings apply only to traffic routed through Cachely. Your origin domain, such as ",[18,309,310],{},"*.vercel.app",", must be configured in the origin app.",[14,313,314],{},"Website Proxy serves three possible hostnames for one tenant:",[144,316,317,330],{},[147,318,319],{},[150,320,321,324,327],{},[153,322,323],{},"Host",[153,325,326],{},"Example",[153,328,329],{},"Should it be indexed?",[163,331,332,349,361],{},[150,333,334,337,342],{},[168,335,336],{},"Your origin (outside Cachely)",[168,338,339],{},[18,340,341],{},"your-project.vercel.app",[168,343,344,345,348],{},"No — set ",[18,346,347],{},"noindex"," in the origin app itself.",[150,350,351,354,358],{},[168,352,353],{},"Cachely preview \u002F slug",[168,355,356],{},[18,357,24],{},[168,359,360],{},"No — hidden by default.",[150,362,363,366,371],{},[168,364,365],{},"Verified custom domain",[168,367,368],{},[18,369,370],{},"your-domain.com",[168,372,373],{},"Yes — this is the canonical public URL.",[14,375,376,377,380,381,384],{},"The Website Proxy section exposes a ",[30,378,379],{},"Search indexing"," control that drives ",[18,382,383],{},"X-Robots-Tag"," on website-proxy HTML responses. Asset and API proxy responses are never affected.",[144,386,387,406],{},[147,388,389],{},[150,390,391,394,401,403],{},[153,392,393],{},"Policy",[153,395,396,397,400],{},"Cachely preview (",[18,398,399],{},"\u003Cslug>.cachely.io",")",[153,402,365],{},[153,404,405],{},"Behavior on every host",[163,407,408,430,447,466],{},[150,409,410,416,421,427],{},[168,411,412,415],{},[30,413,414],{},"Default"," (recommended)",[168,417,418],{},[18,419,420],{},"X-Robots-Tag: noindex, nofollow",[168,422,423,424,426],{},"upstream ",[18,425,383],{}," removed → indexable",[168,428,429],{},"—",[150,431,432,437,440,442],{},[168,433,434],{},[30,435,436],{},"Preserve origin",[168,438,439],{},"upstream pass-through",[168,441,439],{},[168,443,423,444,446],{},[18,445,383],{}," is forwarded unchanged",[150,448,449,454,459,463],{},[168,450,451],{},[30,452,453],{},"Force indexable",[168,455,456,458],{},[18,457,383],{}," removed",[168,460,461,458],{},[18,462,383],{},[168,464,465],{},"always indexable (absence of header)",[150,467,468,473,477,481],{},[168,469,470],{},[30,471,472],{},"Force noindex",[168,474,475],{},[18,476,420],{},[168,478,479],{},[18,480,420],{},[168,482,483],{},"always noindex",[14,485,486,487,490,491,494],{},"Indexable means absence of the header — Cachely never sets ",[18,488,489],{},"X-Robots-Tag: index, follow",", which would override site-level ",[18,492,493],{},"\u003Cmeta name=\"robots\">"," tags unnecessarily.",[119,496,498],{"id":497},"recommended-setup","Recommended setup",[276,500,501,514,526],{},[46,502,503,506,507,509,510,513],{},[30,504,505],{},"Origin app"," — set ",[18,508,420],{}," (or ",[18,511,512],{},"\u003Cmeta name=\"robots\" content=\"noindex\">",") so the underlying Vercel\u002FNetlify\u002FCloudflare Pages URL never gets indexed.",[46,515,516,519,520,522,523,525],{},[30,517,518],{},"Cachely preview slug"," — leave the policy at ",[30,521,414],{}," so ",[18,524,399],{}," stays hidden.",[46,527,528,519,530,532,533,536],{},[30,529,365],{},[30,531,414],{}," so the canonical URL is indexable. Even if your origin app sends ",[18,534,535],{},"X-Robots-Tag: noindex",", Cachely strips it on the custom-domain path so the public site is discoverable.",[119,538,540],{"id":539},"behavior-change-in-this-release","Behavior change in this release",[14,542,543,544,546],{},"The ",[30,545,414],{}," policy is new. Tenants upgrading from an earlier version will see two changes the first time they receive traffic after the migration:",[43,548,549,555],{},[46,550,551,552,554],{},"The Cachely preview slug now returns ",[18,553,420],{}," and will be progressively de-indexed by search engines.",[46,556,557,558,560],{},"Upstream ",[18,559,535],{}," is now stripped from custom-domain responses (intentional — this is what fixes the original \"my canonical site is silently noindexed\" bug).",[14,562,563,564,33],{},"If you want the old pass-through behavior on either host, set the policy to ",[30,565,436],{},[119,567,569],{"id":568},"limits","Limits",[43,571,572,582,591],{},[46,573,574,575,577,578,581],{},"Cachely cannot control headers on traffic that doesn't pass through Cachely. The origin domain (",[18,576,310],{},", ",[18,579,580],{},"*.netlify.app",", etc.) must be hidden in the origin app's own configuration.",[46,583,584,587,588,590],{},[18,585,586],{},"robots.txt"," is not currently overridden by Cachely. If your origin serves a ",[18,589,586],{}," you want changed, edit it at the origin.",[46,592,593,594,596,597,600],{},"A tenant who sets ",[18,595,383],{}," via the security policy's ",[30,598,599],{},"Custom headers"," field will override the SEO policy — custom headers have precedence by design.",[35,602],{},[38,604,606],{"id":605},"troubleshooting","Troubleshooting",[119,608,610],{"id":609},"domain-stays-in-pending-dns","Domain stays in \"Pending DNS\"",[43,612,613,619,622,628],{},[46,614,615,616,618],{},"Verify the CNAME record exists and points to ",[18,617,181],{}," (not your CMS origin)",[46,620,621],{},"Check that the record is DNS-only, not proxied",[46,623,624,625,627],{},"Wait for DNS propagation and click ",[30,626,214],{}," again",[46,629,630,631,633,634,637,638,400],{},"Some DNS providers add the root domain automatically — entering ",[18,632,20],{}," as the name may create ",[18,635,636],{},"cdn.yourdomain.com.yourdomain.com",". Use just the subdomain label (e.g., ",[18,639,175],{},[119,641,643],{"id":642},"domain-shows-failed","Domain shows \"Failed\"",[43,645,646,649,652],{},[46,647,648],{},"The error reason is shown in the custom domain card",[46,650,651],{},"Common causes: CNAME missing, CNAME pointing to wrong target, CAA records blocking SSL issuance",[46,653,654,655],{},"Fix the DNS issue and click ",[30,656,657],{},"Retry verification",[119,659,661],{"id":660},"custom-domain-loads-but-returns-an-error","Custom domain loads but returns an error",[43,663,664,670],{},[46,665,666,667,669],{},"If you see \"Tenant not found\", the domain-to-tenant mapping may be missing — click ",[30,668,214],{}," to re-trigger activation",[46,671,672],{},"If you see a 525 SSL error, the SSL certificate may still be provisioning — wait a few minutes and try again",[35,674],{},[38,676,678],{"id":677},"how-it-works","How it works",[14,680,681,682,689],{},"Custom domains use ",[683,684,688],"a",{"href":685,"rel":686},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-for-platforms\u002Fcloudflare-for-saas\u002F",[687],"nofollow","Cloudflare for SaaS"," (Custom Hostnames):",[276,691,692,698,704,710],{},[46,693,694,697],{},[30,695,696],{},"Adding a domain"," creates a Cloudflare Custom Hostname entry and begins SSL certificate provisioning",[46,699,700,703],{},[30,701,702],{},"DNS verification"," confirms that your CNAME points to the proxy origin",[46,705,706,709],{},[30,707,708],{},"On activation",", a mapping is written so the edge proxy can route requests from your hostname to your tenant",[46,711,712,715],{},[30,713,714],{},"At request time",", the proxy checks the incoming hostname and resolves it to your tenant — same caching, same config, same analytics",{"title":258,"searchDepth":717,"depth":717,"links":718},2,[719,720,721,728,729,734,739],{"id":40,"depth":717,"text":41},{"id":75,"depth":717,"text":76},{"id":116,"depth":717,"text":117,"children":722},[723,725,726,727],{"id":121,"depth":724,"text":122},3,{"id":138,"depth":724,"text":139},{"id":207,"depth":724,"text":208},{"id":244,"depth":724,"text":245},{"id":266,"depth":717,"text":267},{"id":300,"depth":717,"text":301,"children":730},[731,732,733],{"id":497,"depth":724,"text":498},{"id":539,"depth":724,"text":540},{"id":568,"depth":724,"text":569},{"id":605,"depth":717,"text":606,"children":735},[736,737,738],{"id":609,"depth":724,"text":610},{"id":642,"depth":724,"text":643},{"id":660,"depth":724,"text":661},{"id":677,"depth":717,"text":678},"Serve CMS assets from your own subdomain (e.g. cdn.yourdomain.com) instead of the default *.cachely.io domain. Available on the Pro plan.","md",{},true,"\u002Fdocs\u002Fcustom-domains",{"title":5,"description":740},"docs\u002Fcustom-domains","8HBu0rtEGg8nTw-0zSwVQQhFGK_jQZTlxMJHIvyH9ts",1781192375468]