> ## Documentation Index
> Fetch the complete documentation index at: https://docs.replit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom Domains

> Buy, connect, and manage a custom domain for your published Replit app.

Custom domains let you assign your own domain name, such as `www.my-incredible-app.com`, to your Replit published app.
While Replit provides a free subdomain in the format `<your-live-app-subdomain-name>.replit.app`, a custom
domain gives your app a more memorable address that builds brand recognition and trust with your visitors.

The **Domains** tab in the Publishing tool gives you everything you need in one place. You can:

* **Buy a new domain** through Replit and connect it to your project in one step.
* **Connect a domain you already own** from another registrar.
* **Manage** your connected domains — view which project each one points to, track renewals, and disconnect a domain.

Watch the following video for a quick overview of setting up custom domains:

<Frame>
  <iframe src="https://www.youtube.com/embed/rGYdyb58wJY" title="Custom Domains with Publishing" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen />
</Frame>

The following table compares Replit's subdomains with custom domains:

| Feature                         | Replit Subdomain   | Custom Domain            |
| :------------------------------ | :----------------- | :----------------------- |
| Hostname customization          | Subdomain only     | Any domain that you own  |
| DNS update time                 | Instant            | Up to 48 hours           |
| Security Certificates (TLS/SSL) | Provided by Replit | Provided by Replit       |
| Price                           | Free               | Pay your domain provider |

<Note>
  Publish your app before connecting a domain. The **Domains** tab becomes available once your app has a
  successful Deployment.
</Note>

## Buy a new domain on Replit

If you don't already own a domain, you can search for one and buy it without leaving Replit. Your new
domain points to your project automatically.

<Steps>
  <Step title="Open the Domains tab">
    Open the <img class="icon-svg" src="https://mintcdn.com/replit/rJldsgYVucXB_6kW/images/icons/deploy-icon.svg?fit=max&auto=format&n=rJldsgYVucXB_6kW&q=85&s=853c5ef39a8a7ac3648b3a2ce182fcb8" width="16" height="16" data-path="images/icons/deploy-icon.svg" /> **Publishing** tool and select the **Domains** tab.
  </Step>

  <Step title="Search for a domain">
    Select **Buy a new domain** and enter the name you want. Replit shows available options across
    extensions such as `.com`, `.ai`, and more. If you're not sure what to call it, Replit also
    suggests available names based on what your app does, so you can pick one without starting from
    scratch.

    <Frame>
      <img src="https://mintcdn.com/replit/jSmYU1wBTvl8UMyc/images/deployments/custom-domains/buy-domain.png?fit=max&auto=format&n=jSmYU1wBTvl8UMyc&q=85&s=b9370b56ffc2f86fba93b05309ed25d8" alt="Domain search interface showing available domains with extensions like .com and .ai" width="2172" height="1222" data-path="images/deployments/custom-domains/buy-domain.png" />
    </Frame>
  </Step>

  <Step title="Purchase and connect">
    Select your preferred domain and complete the purchase using your Replit account's payment method.
    Your app becomes accessible at the new domain right away, with no additional DNS configuration.
  </Step>
</Steps>

Domains bought through Replit include [WHOIS privacy protection](/build/domain-purchasing) at no extra cost, renew automatically, and let you add custom DNS records (for example, MX records for email). For the full reference on buying domains — pricing, renewals, transfers, and custom DNS records — see [Purchase a domain](/build/domain-purchasing).

## Connect a domain you already own

If you already own a domain at another registrar, connect it to your project from the **Domains** tab. Replit
offers a guided setup that configures your DNS for you, with a manual option as a fallback.

### Guided setup (recommended)

The simplest way to connect an existing domain is to let Replit set it up for you. Replit uses
[Entri](https://entri.com), a third-party domain-connection service: after you authorize it, Entri signs
in to your DNS provider and writes the required DNS records on your behalf, so you don't have to copy them
by hand.

<Note>
  DNS records are the settings that tell the internet where your domain should point. Setting them up by
  hand used to be the trickiest part of connecting a domain. Replit now handles this step for you for most
  domains and providers.
</Note>

<Steps>
  <Step title="Open the Domains tab">
    Open the <img class="icon-svg" src="https://mintcdn.com/replit/rJldsgYVucXB_6kW/images/icons/deploy-icon.svg?fit=max&auto=format&n=rJldsgYVucXB_6kW&q=85&s=853c5ef39a8a7ac3648b3a2ce182fcb8" width="16" height="16" data-path="images/icons/deploy-icon.svg" /> **Publishing** tool and select the **Domains** tab.

    <Frame>
      <img src="https://mintcdn.com/replit/jSmYU1wBTvl8UMyc/images/deployments/custom-domains/01.png?fit=max&auto=format&n=jSmYU1wBTvl8UMyc&q=85&s=5dc58a0cab37877093e55c9a2b3b1367" alt="Domains tab" width="2422" height="1130" data-path="images/deployments/custom-domains/01.png" />
    </Frame>
  </Step>

  <Step title="Enter the domain you want to connect">
    Select **Connect your own domain** and enter a domain you already own, such as `www.my-incredible-app.com`.
  </Step>

  <Step title="Authorize the guided setup">
    Confirm the connection. Replit opens the guided flow, where you sign in to your DNS provider so the
    DNS records can be applied to your account automatically. If the guided flow can't write the records
    for your provider, it shows you the records to add yourself instead.
  </Step>

  <Step title="Wait for your domain to verify">
    Your domain shows a **Verified** status once setup completes. This usually takes a few minutes, but DNS
    changes can take up to 48 hours to propagate. Load the domain in your browser to confirm it works.
  </Step>
</Steps>

<Tip>
  If your provider isn't supported for guided setup, or you prefer to add the records yourself, you can
  connect your domain manually. See [Connect a domain manually](#connect-a-domain-manually) below.
</Tip>

### Connect a domain manually

If your provider isn't supported for guided setup, or you prefer to add the records yourself, follow the
steps below to set up your custom domain manually.

<Warning>
  You might experience setup issues if you have one of the following:

  * Multiple `A` records for the same domain name that point to different servers.
  * `A` and `AAAA` records co-exist for the same domain, since Replit only supports `A` records.
  * Cloudflare proxied domain records, since Replit cannot automatically renew security certificates for that type. Set your record to **DNS only** (the gray cloud).
  * A missing or removed `replit-verify` `TXT` record. Replit needs this record to remain in place to renew your SSL/TLS certificate. See [Keep the TXT record in place](#keep-the-txt-record-in-place) below.
</Warning>

<Steps>
  <Step title="Add your custom domain">
    Enter your custom domain name in the text field. You can use a registered domain or include a subdomain.

    For example, `hat-tip.cc` is the registered domain and `my.hat-tip.cc` includes subdomain `my`.

    <Frame>
      <img src="https://mintcdn.com/replit/jSmYU1wBTvl8UMyc/images/deployments/custom-domains/02.png?fit=max&auto=format&n=jSmYU1wBTvl8UMyc&q=85&s=38485a8680fe6ae256ec2d7b0665a784" alt="screenshot of the DNS settings" width="1940" height="718" data-path="images/deployments/custom-domains/02.png" />
    </Frame>
  </Step>

  <Step title="Add the DNS records to your domain registrar">
    Replit generates DNS records that you must provide to your **domain registrar**.
    A domain registrar is the service that manages your domain name, such as GoDaddy or Namecheap.

    Copy the `A` and `TXT` record values from Replit and paste them into your domain registrar's
    DNS management section. If your domain registrar does not support `@` as a hostname, use your registered domain name.

    <Warning>
      **Keep the TXT record in place.** Replit issues and renews the SSL/TLS certificate for your
      custom domain through DNS validation. The `replit-verify=...` `TXT` record must stay in
      your DNS for the full lifetime of the domain — not only during initial setup. If you
      remove or change the record after verification, your next certificate renewal will fail
      and your domain will eventually serve an expired certificate, making your app unreachable
      in browsers. Treat the `TXT` record as permanent alongside your `A` record.
    </Warning>
  </Step>

  <Step title="Optional: Add a subdomain">
    Subdomains — including `www` — are not automatically resolvable when you link your apex
    domain. Each subdomain you want to serve must be added as its own entry in the **Domains**
    tab and given its own DNS records at your registrar.

    To add a subdomain, link it from the **Domains** tab the same way you linked the apex
    domain, then add the DNS records Replit generates for it to your domain registrar.
    For example, to add `my-subdomain.hat-tip.cc`:

    * In the **Publishing** tool, select the **Domains** tab and link `my-subdomain.hat-tip.cc`.
    * At your registrar, add a new `A` record with hostname `my-subdomain` pointing to the IP
      address Replit shows for the new entry.
    * At your registrar, add the matching `replit-verify=...` `TXT` record on hostname
      `my-subdomain` — each subdomain has its own `TXT` record, separate from the apex's.

    <Note>
      **`www` is a subdomain.** Linking `hat-tip.cc` does not automatically serve
      `www.hat-tip.cc`. If you want visitors to reach your app at both `hat-tip.cc` and
      `www.hat-tip.cc`, add `www.hat-tip.cc` as a separate entry in the **Domains** tab and
      publish the `A` and `TXT` records it generates on hostname `www`. Most builders who want
      a `www` address also configure a redirect from the apex to `www` (or vice versa) at
      their registrar.
    </Note>

    As with the apex domain, the `replit-verify=...` `TXT` record you add for each subdomain
    must stay in DNS permanently. See
    [Keep the TXT record in place](#keep-the-txt-record-in-place) below.
  </Step>

  <Step title="Wait for DNS propagation to complete">
    After adding the records, you must wait for them to propagate online.
    This can take between a few minutes and 48 hours.

    When the propagation completes, your Domains tab should show the "Verified" status next to the domain name as shown below:

    <Frame>
      <img src="https://mintcdn.com/replit/jSmYU1wBTvl8UMyc/images/deployments/custom-domains/domain-verified.png?fit=max&auto=format&n=jSmYU1wBTvl8UMyc&q=85&s=fe5c99d84ff0334119d2e94b2f07c99a" alt="screenshot of the verified domain status" width="1866" height="890" data-path="images/deployments/custom-domains/domain-verified.png" />
    </Frame>

    Load the domain in your browser to verify that it works.
  </Step>
</Steps>

## Manage your domains

The **Domains** tab lists every domain connected to your project and lets you manage each one. Select a domain
and choose **Manage** to:

* **See which project the domain points to.** If you try to connect a domain that's already linked to
  another of your projects, Replit warns you and lets you move it to the current project instead.
* **Review renewals (for domains bought on Replit).** The management view shows the renewal date and
  renewal price, and lets you turn **Auto renewal** off if you don't want the domain to renew automatically.
* **Edit DNS records (for domains bought on Replit).** Add custom `A`, `TXT`, or `MX` records — for
  example, MX records to use your domain for email. See [Custom DNS records](/build/domain-purchasing#custom-dns-records).
* **Disconnect the domain.** Disconnecting stops serving your app at that domain. The domain itself isn't
  deleted — it stays available to link to another of your projects.

<Frame>
  <img src="https://mintcdn.com/replit/jSmYU1wBTvl8UMyc/images/deployments/custom-domains/replit-domains.png?fit=max&auto=format&n=jSmYU1wBTvl8UMyc&q=85&s=af1ea8f250c6ab83ff016fc2fe075851" alt="Domain management interface showing connected domains and their connection status" width="3176" height="1556" data-path="images/deployments/custom-domains/replit-domains.png" />
</Frame>

## Troubleshooting

### Domain link failed or stuck on pending verification

If a connection fails or the domain stays on **Verifying**, work through these checks:

1. **Give DNS time to propagate.** Verification can take from a few minutes up to 48 hours. Use a DNS
   lookup tool to confirm your records are visible globally before changing anything else.
2. **Remove conflicting records.** Keep only one `A` record at your root domain pointing to Replit, and
   remove any `AAAA` (IPv6) records on the same hostname — they can block SSL.
3. **Turn off Cloudflare proxying.** Set your `A` record to **DNS only** (the grey cloud). Proxy mode
   (the orange cloud) interferes with SSL provisioning.
4. **Confirm the `TXT` record is present.** A missing or modified `replit-verify=...` `TXT` record blocks
   verification and certificate renewal. See [Keep the TXT record in place](#keep-the-txt-record-in-place).
5. **Disconnect and reconnect the domain** from the **Domains** tab to force a fresh certificate, then
   wait a few minutes and reload.

If you bought your domain through Replit and it still won't verify, [contact Replit Support](https://replit.com/support).

### DNS changes haven't taken effect yet

DNS changes are not instant. After you add or change records, expect to wait anywhere from a few minutes
to 48 hours for them to propagate worldwide. Your app keeps working on its `replit.app` subdomain during
this time. If the **Verified** status hasn't appeared after 48 hours, recheck your records against what
Replit shows — common mistakes are a trailing dot, an extra subdomain, or a stale record.

### `CNAME` records and authentication

You don't need a `CNAME` record for sign-in or authentication to work on your custom domain. Sign-in works
across your published domain automatically once the domain is verified.

`CNAME` records on a custom domain are only required for **email sending** — for example, so that
verification or transactional emails can be sent from your domain. If the Publishing tool shows a warning
asking you to add `CNAME` records, that's about email delivery, not login. Adding the records is only
necessary if you send email from your domain; it does not block your domain's verification, SSL, or
sign-in. For the email-related setup steps, see
[Clerk authentication](/features/auth-and-identity/clerk-auth).

### Keep the TXT record in place

Replit issues and renews the SSL/TLS certificate for each custom domain through DNS validation, which depends on the `replit-verify=...` `TXT` record you added during setup. The `TXT` record is not a one-time setup artifact — it must stay in your DNS for the full lifetime of the domain. If the record is removed, edited, or replaced after your domain is verified, the next renewal will fail silently and the existing certificate will eventually expire. Visitors will then see a browser security warning and the app will be unreachable.

If older domains on your account suddenly show certificate errors while newer ones work, a missing or modified `TXT` record is the most likely cause.

To restore an affected domain:

1. Open the **Publishing** tool and select the **Domains** tab.
2. Confirm the `replit-verify=...` `TXT` record Replit shows for the domain.
3. Add the `TXT` record back at your domain registrar exactly as shown, including the hostname and value.
4. Remove the domain in Replit and add it again to trigger a fresh issuance.
5. Wait for DNS propagation and re-check the **Verified** status on the **Domains** tab.
