Vercel automatically provisions free Let's Encrypt SSL certificates for all deployments — including custom domains — with zero configuration required. When you add a custom domain in Vercel Dashboard → your project → Settings → Domains, Vercel handles the ACME challenge and certificate renewal automatically. You never need to manually install or renew Let's Encrypt certificates on Vercel.
SSL Certificates and HTTPS for Your V0 App
Every V0 app deployed to Vercel gets HTTPS automatically — Vercel provisions and manages Let's Encrypt TLS certificates for both the default .vercel.app subdomain and any custom domains you attach. This means the classic Let's Encrypt workflow (installing Certbot, running ACME challenges, setting up cron jobs for renewals) does not apply to V0 apps at all. Vercel handles certificate issuance within minutes of domain verification and renews certificates automatically before they expire.
Understanding this is important because many tutorials you find online about Let's Encrypt assume you are managing your own server. Those instructions are for Apache, Nginx, or other traditional web servers where you have filesystem access. Vercel is a managed platform — you cannot SSH into the servers, so manual Certbot installation is not possible or needed. The ACME protocol that Let's Encrypt uses runs between Vercel's infrastructure and Let's Encrypt's servers, not between your laptop and a server you own.
There are edge cases where manual Let's Encrypt management becomes relevant even for Vercel users: if you are running a companion backend service on a VPS (like a Node.js WebSocket server alongside your V0 Next.js frontend), if you need wildcard certificates for subdomains that Vercel does not manage, or if you are doing certificate pinning for a mobile app that connects to your V0 API. This guide covers both the standard automatic path and these advanced manual scenarios.
Integration method
Let's Encrypt SSL is handled automatically by Vercel for all V0 deployments — you configure your domain in the Vercel Dashboard and Vercel's infrastructure completes the ACME challenge, issues the certificate, and renews it before expiry. For cases where you need manual Let's Encrypt certificate management (self-hosted infrastructure alongside Vercel, certificate pinning, or wildcard certs for non-Vercel environments), this guide covers both the automatic Vercel path and the manual ACME workflow.
Prerequisites
- A V0 account with a Next.js project deployed at v0.dev
- A Vercel account with your V0 project deployed via GitHub
- A custom domain registered with any domain registrar (Namecheap, GoDaddy, Google Domains, etc.)
- Access to your domain registrar's DNS management panel to set CNAME or A records
- For advanced manual certificate scenarios: a VPS or server where you have SSH and root access
Step-by-step guide
Understand How Vercel Handles Let's Encrypt Automatically
Understand How Vercel Handles Let's Encrypt Automatically
Before configuring anything, it helps to understand what Vercel does automatically so you know you do not need to do it manually. When you deploy a V0 app to Vercel, the deployment immediately gets HTTPS via a shared certificate on *.vercel.app. When you add a custom domain, Vercel initiates the Let's Encrypt certificate issuance process using the ACME protocol. Specifically, Vercel uses the ACME HTTP-01 challenge: it temporarily serves a specific file at /.well-known/acme-challenge/ on your domain to prove to Let's Encrypt that Vercel controls that domain. Let's Encrypt verifies the file exists at that URL, then issues a 90-day certificate. Vercel renews the certificate automatically before it expires — you never need to think about 90-day renewals. All of this happens without any action from you beyond setting the correct DNS records. The certificate covers your exact domain and, on Vercel Pro plans, also covers the www subdomain if you configure it. Vercel uses a certificate authority called Let's Encrypt for standard domains, but may use other CAs (like ZeroSSL) depending on rate limits and infrastructure decisions — you do not control this choice. The key practical implication: if your V0 app is deployed to Vercel and you use a custom domain, your SSL is handled. The scenarios where you might manually interact with Let's Encrypt are: (1) you have a companion service running on a different server that your V0 app communicates with, (2) you need a wildcard certificate for *.yourapp.com for dynamic subdomains that Vercel does not support on your plan, or (3) you are evaluating moving off Vercel and want to understand the certificate management implications. For the vast majority of V0 users, this step is the end of the SSL configuration journey — add your domain in Vercel Dashboard and you are done.
Pro tip: You can verify the current SSL certificate for any domain using your browser: click the lock icon in the address bar → Certificate → Issuer. For Let's Encrypt certificates, you will see 'Let's Encrypt' as the issuer organization. Vercel-managed certificates typically show an expiry 90 days from issuance.
Expected result: You understand that Vercel handles Let's Encrypt certificate issuance and renewal automatically. No manual certificate configuration is needed for standard V0 apps with custom domains.
Add a Custom Domain in Vercel to Trigger SSL Provisioning
Add a Custom Domain in Vercel to Trigger SSL Provisioning
When you add a custom domain to your Vercel project, Vercel begins the Let's Encrypt certificate provisioning process automatically. Here is the exact sequence to follow. In your Vercel Dashboard, open your project and click the Settings tab, then click Domains in the left sidebar. Click the Add Domain button and enter your custom domain (e.g., myapp.com). Vercel will show you DNS configuration instructions — typically one of two patterns: a CNAME record pointing to cname.vercel-dns.com, or an A record pointing to Vercel's IP address (76.76.21.21) for apex domains. Log into your domain registrar's control panel and add the DNS record Vercel specifies. DNS propagation typically takes 5-30 minutes, though it can take up to 48 hours in rare cases. During this time, Vercel's dashboard shows the domain status as 'Pending' or 'Invalid Configuration' until the DNS change propagates. Once Vercel detects the correct DNS configuration, it automatically requests a certificate from Let's Encrypt. This usually completes within 2-3 minutes. The Vercel Domains panel shows a green checkmark and 'Valid Configuration' when the certificate is successfully issued and the domain is live. For the www subdomain, add www.myapp.com as a second domain in Vercel and set up a redirect from www to your apex domain (or vice versa, depending on your preference). Vercel provisions a separate certificate for each domain variant. Note that on Vercel's Hobby plan, you can add up to 50 domains; the Pro plan supports unlimited domains with wildcard options. One subtlety with apex domains (the root domain without www): some DNS providers use ALIAS, ANAME, or CNAME flattening records for apex domains instead of standard CNAME records, because standard DNS does not allow CNAME at the apex. Consult your domain registrar's documentation for the correct record type. Cloudflare, Namecheap, and most modern registrars support the necessary record types.
Pro tip: Use DNS Checker (dnschecker.org) to verify your DNS changes have propagated globally before debugging SSL issues. If the DNS check shows your CNAME pointing to cname.vercel-dns.com from most locations but not all, wait another 30 minutes — Vercel will pick up the certificate once global propagation is complete.
Expected result: Vercel Dashboard shows your custom domain with a green 'Valid Configuration' status and a Let's Encrypt certificate issued. Your V0 app loads over HTTPS at your custom domain.
Enforce HTTPS Redirects and Add Security Headers in Next.js
Enforce HTTPS Redirects and Add Security Headers in Next.js
Even with Vercel's automatic SSL, your V0 app benefits from explicitly enforcing HTTPS redirects and adding security headers. HTTP Strict Transport Security (HSTS) tells browsers to always use HTTPS for your domain, even if a user types http:// — the browser converts it to HTTPS locally before making a request. This prevents SSL stripping attacks and improves user experience. In Next.js App Router, you can add security headers in next.config.ts using the headers() configuration function. These headers apply to all responses from your Vercel deployment. The most important headers for HTTPS enforcement are: Strict-Transport-Security (HSTS): tells browsers to use HTTPS exclusively for a specified duration. A max-age of 31536000 (1 year) is standard for production. The includeSubDomains directive extends this to all subdomains. The preload flag submits your domain to browser preload lists — only add preload when you are sure your entire domain hierarchy supports HTTPS. X-Content-Type-Options: set to 'nosniff' to prevent browsers from interpreting files as a different MIME type than declared. This prevents MIME confusion attacks. X-Frame-Options: set to 'SAMEORIGIN' to prevent clickjacking by disallowing your pages from being embedded in iframes on other domains. For the HTTP to HTTPS redirect itself, Vercel automatically redirects HTTP to HTTPS for all deployments at the infrastructure level — you do not need to handle this in your Next.js middleware. However, if you see cases where HTTP requests are not redirecting (particularly for API routes), adding an explicit middleware redirect gives you a safety net. Vercel also supports Next.js redirects configuration in next.config.ts for managing URL redirects independent of SSL — for example, redirecting www to non-www or handling old URL patterns. These are application-level redirects, separate from the infrastructure-level HTTPS redirect Vercel handles automatically.
Add security headers to next.config.ts including Strict-Transport-Security (max-age 31536000, includeSubDomains), X-Content-Type-Options (nosniff), X-Frame-Options (SAMEORIGIN), and Referrer-Policy (strict-origin-when-cross-origin). Apply these headers to all routes. Also add a redirect from http to https for any incoming HTTP requests using Next.js middleware.
Paste this in V0 chat
1// next.config.ts2import type { NextConfig } from 'next';34const nextConfig: NextConfig = {5 async headers() {6 return [7 {8 // Apply security headers to all routes9 source: '/(.*)',10 headers: [11 {12 key: 'Strict-Transport-Security',13 value: 'max-age=31536000; includeSubDomains',14 },15 {16 key: 'X-Content-Type-Options',17 value: 'nosniff',18 },19 {20 key: 'X-Frame-Options',21 value: 'SAMEORIGIN',22 },23 {24 key: 'Referrer-Policy',25 value: 'strict-origin-when-cross-origin',26 },27 {28 key: 'Permissions-Policy',29 value: 'camera=(), microphone=(), geolocation=()',30 },31 ],32 },33 ];34 },35};3637export default nextConfig;Pro tip: Do not add the HSTS preload directive until your domain is fully running on HTTPS with all subdomains covered. Preloading incorrectly can make your domain inaccessible if you ever need to temporarily serve HTTP content — the preload list change can take months to propagate to browsers.
Expected result: Security headers are added to all responses from your V0 app. A browser security scan (using securityheaders.com) shows A or A+ rating. HSTS header instructs browsers to always use HTTPS for your domain.
Troubleshoot SSL Certificate Issues
Troubleshoot SSL Certificate Issues
If your V0 app's SSL certificate is not working correctly after adding a custom domain, follow this diagnostic sequence to identify and fix the issue. First, check the Vercel Dashboard status for your domain: Settings → Domains. Vercel shows specific error messages when certificate provisioning fails. Common status messages include 'Invalid Configuration' (DNS not pointing to Vercel), 'Certificate Pending' (DNS is correct but certificate is still being issued), and 'Error' (certificate issuance failed, usually due to Let's Encrypt rate limits or DNS propagation issues). Let's Encrypt rate limits are a real concern: Let's Encrypt limits certificate issuance to 50 certificates per registered domain per week and 5 failures per account per hour. If you or Vercel has hit rate limits (common in active development with many domain reconfigurations), certificate issuance will fail silently or with a rate limit error. The solution is to wait until the rate limit window resets (typically within hours for the failures limit, up to a week for the domain limit). For DNS configuration issues, the most common mistake is setting a CNAME record for an apex domain (yourdomain.com without www). Standard DNS does not allow CNAME records at the apex — use an A record pointing to 76.76.21.21 instead, or if your DNS provider supports it, use ALIAS/ANAME records. Using a CNAME for www.yourdomain.com is correct and recommended. If your custom domain shows 'Your connection is not private' in the browser even though Vercel shows 'Valid Configuration', clear your browser's HSTS cache for that domain: in Chrome, go to chrome://net-internals/#hsts, enter your domain under 'Delete domain security policies', and click Delete. Then test in a fresh incognito window. For expired certificate warnings, Vercel's automatic renewal should prevent this, but if it occurs, go to Vercel Dashboard → your project → Settings → Domains, remove the domain, and re-add it to trigger a fresh certificate issuance.
Pro tip: Use SSL Labs (ssllabs.com/ssltest) to get a comprehensive analysis of your domain's SSL configuration — it tests certificate chain validity, protocol support, cipher suites, and HSTS configuration. Aim for an A or A+ rating before launching your V0 app publicly.
Expected result: SSL certificate issues are identified and resolved. Your V0 app serves over HTTPS with a valid Let's Encrypt certificate and no browser security warnings.
Manual Let's Encrypt for Companion Services Outside Vercel
Manual Let's Encrypt for Companion Services Outside Vercel
If your V0 app communicates with a backend service you host yourself (a Node.js WebSocket server, a Python API, a database proxy, etc.), that companion service also needs HTTPS with a valid SSL certificate for secure communication. Vercel cannot manage certificates for servers you own — that is where manual Let's Encrypt configuration comes in. For a VPS or dedicated server running Ubuntu or Debian, the recommended approach is Certbot from the Electronic Frontier Foundation. Certbot automates certificate issuance and sets up automatic renewal via a cron job or systemd timer. The commands look like: sudo certbot --nginx -d yourapi.yourdomain.com for an Nginx server, or sudo certbot --apache for Apache. However, if you are running a Node.js API server without a web server in front, you can use the acme-client npm package to implement the ACME protocol directly in Node.js without installing system tools. The acme-client package supports both HTTP-01 and DNS-01 challenges and can store certificates in any location your Node.js app can write to. For this scenario, your V0 Next.js app calls your self-hosted API using HTTPS with the Let's Encrypt certificate. Store the API's base URL as an environment variable in Vercel (e.g., API_BASE_URL=https://api.yourdomain.com) and reference it in your Next.js API routes with process.env.API_BASE_URL. Since both Vercel and Let's Encrypt issue trusted certificates, the HTTPS connection between them is valid without any additional configuration. For development environments, avoid self-signed certificates if possible — they require disabling certificate verification in fetch calls (NODE_TLS_REJECT_UNAUTHORIZED=0), which is a bad habit that can leak into production. Instead, use tools like mkcert to generate locally trusted development certificates or proxy all requests through your Vercel deployment URL during development.
1// app/api/external/route.ts — calling a self-hosted service with HTTPS2import { NextRequest, NextResponse } from 'next/server';34const API_BASE_URL = process.env.API_BASE_URL;56export async function GET(request: NextRequest) {7 if (!API_BASE_URL) {8 return NextResponse.json(9 { error: 'API_BASE_URL not configured' },10 { status: 500 }11 );12 }1314 // Calls your self-hosted service over HTTPS15 // Let's Encrypt cert on the API server makes this connection trusted16 const response = await fetch(`${API_BASE_URL}/your-endpoint`, {17 headers: {18 // Auth between V0 app and your API19 Authorization: `Bearer ${process.env.API_SECRET_KEY}`,20 },21 });2223 if (!response.ok) {24 return NextResponse.json(25 { error: 'External API call failed' },26 { status: response.status }27 );28 }2930 const data = await response.json();31 return NextResponse.json(data);32}Pro tip: When your self-hosted companion service's Let's Encrypt certificate expires and is not auto-renewed, your V0 app will start getting certificate errors when calling that service. Set up monitoring (like UptimeRobot's SSL monitoring) on your companion service domain to alert you before the 90-day expiry.
Expected result: Your companion service has a valid Let's Encrypt certificate and your V0 app communicates with it over a trusted HTTPS connection. No certificate warnings appear in Vercel function logs when calling the external service.
Common use cases
Adding a Custom Domain to Your V0 App
A founder wants their V0-generated app to serve from myapp.com instead of myapp.vercel.app. They add the domain in Vercel Dashboard, update their domain registrar's DNS settings, and Vercel automatically provisions a Let's Encrypt certificate. The entire process takes under 10 minutes and requires no certificate configuration.
Copy this prompt to try it in V0
Enforcing HTTPS Redirects in Next.js
A developer wants to ensure all HTTP requests to their V0 app redirect to HTTPS and adds the correct security headers. They use V0 to generate the Next.js middleware and next.config.ts configuration for strict HTTPS enforcement and HSTS headers.
Add Next.js middleware that redirects all HTTP requests to HTTPS. Also add security headers to next.config.ts including Strict-Transport-Security with a max-age of one year, X-Frame-Options set to SAMEORIGIN, and X-Content-Type-Options set to nosniff.
Copy this prompt to try it in V0
Verifying SSL Certificate Status for a V0 App
A developer notices their custom domain shows a security warning in the browser and wants to diagnose whether the issue is with the Let's Encrypt certificate, DNS propagation, or Vercel domain verification. They check the certificate status in Vercel Dashboard and browser developer tools.
Copy this prompt to try it in V0
Troubleshooting
Vercel Dashboard shows 'Invalid Configuration' for custom domain even after updating DNS
Cause: DNS changes have not propagated yet, or the DNS record type is incorrect. Apex domains (without www) require an A record pointing to Vercel's IP, not a CNAME record — standard DNS does not support CNAME at the apex.
Solution: Wait 30 minutes for DNS propagation and check with dnschecker.org to verify the change has propagated globally. If using an apex domain, confirm you have set an A record pointing to 76.76.21.21, not a CNAME to cname.vercel-dns.com. Remove any conflicting DNS records for the same hostname.
Browser shows 'Your connection is not private' (NET::ERR_CERT_INVALID) even after Vercel shows a valid certificate
Cause: Your browser has cached the HSTS policy from an earlier incorrect configuration, or there is a cached invalid certificate in the browser. This is especially common during development when you have accessed the domain with a different (possibly self-signed) certificate.
Solution: In Chrome, open chrome://net-internals/#hsts, enter your domain name in the 'Delete domain security policies' section, and click Delete. Then open a fresh incognito window and test the URL. Alternatively, clear the browser cache and cookies for the domain.
Let's Encrypt certificate for a self-hosted companion service keeps expiring without renewal
Cause: The automatic renewal cron job or systemd timer set up by Certbot is not running, or the web server is not accessible on port 80 during the renewal challenge. Port 80 must be accessible for HTTP-01 ACME challenges even on an HTTPS-only server.
Solution: Run 'sudo certbot renew --dry-run' on your server to test the renewal process manually. Check that port 80 is open in your firewall rules. Verify the cron job exists: 'crontab -l' for user-level or check /etc/cron.d/certbot. If the renewal fails due to the server being offline during the challenge window, consider switching to DNS-01 challenges which do not require port 80.
V0 app API route shows SSL certificate error when calling a self-hosted API over HTTPS
Cause: The certificate on your companion API server is expired, self-signed, or the Let's Encrypt certificate chain is not properly installed. Node.js (which Vercel's serverless functions use) strictly validates certificate chains by default.
Solution: Verify the certificate on your companion server using SSL Labs. If expired, renew with Certbot. If self-signed, replace with a Let's Encrypt certificate. Never set NODE_TLS_REJECT_UNAUTHORIZED=0 as a workaround in production — this disables all certificate validation and creates a security vulnerability.
1// WRONG — disables certificate validation, dangerous in production:2process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';34// CORRECT — fix the certificate on the remote server instead.5// Verify the chain with:6// openssl s_client -connect yourapi.com:443 -showcertsBest practices
- Trust Vercel to manage Let's Encrypt certificates automatically for your V0 apps — do not attempt to install Certbot or manually manage certificates on the Vercel platform.
- Add HSTS headers in next.config.ts to enforce HTTPS at the application level, providing defense-in-depth alongside Vercel's infrastructure-level HTTPS redirect.
- Wait for full DNS propagation (use dnschecker.org) before debugging SSL certificate issues — most 'certificate not working' problems resolve themselves once DNS has propagated globally.
- Use SSL Labs (ssllabs.com/ssltest) to get an objective SSL configuration grade and identify any security improvements before launching publicly.
- For companion services outside Vercel, use Certbot with automatic renewal rather than manual certificate management — and set up SSL monitoring alerts to catch renewal failures before expiry.
- Avoid self-signed certificates in development — use mkcert to generate locally trusted development certificates that work without disabling certificate validation.
- Do not add the HSTS preload directive until your domain fully supports HTTPS on all subdomains — once preloaded, removing HSTS takes months to take effect in browsers.
- Store companion service API base URLs as Vercel environment variables (API_BASE_URL=https://...) so your V0 app can communicate with them securely without hardcoded URLs.
Alternatives
Duo Security is an alternative security layer to consider if your security requirements go beyond SSL certificates into multi-factor authentication and identity verification for your V0 app.
Okta is an alternative if you need enterprise-grade identity management with SSO and SAML alongside your HTTPS infrastructure for B2B SaaS applications.
Frequently asked questions
Do I need to do anything to get HTTPS on my V0 app?
No. All V0 apps deployed to Vercel automatically use HTTPS. The default .vercel.app subdomain is covered by Vercel's shared certificate. When you add a custom domain, Vercel automatically provisions a Let's Encrypt certificate within minutes of verifying your DNS configuration. There is nothing to install or configure for SSL on Vercel.
Why is my V0 app's certificate showing Let's Encrypt as the issuer?
Vercel uses Let's Encrypt as its default certificate authority for domain certificates because it is free, automated, and widely trusted by all modern browsers. Let's Encrypt certificates are identical in security to certificates from paid CAs. The issuer showing as Let's Encrypt is normal and expected for Vercel-hosted apps.
Can I use a custom SSL certificate on Vercel instead of Let's Encrypt?
Vercel Pro and Enterprise plans support custom (paid) SSL certificates that you upload directly through the Vercel Dashboard under your domain's settings. This is useful if your organization has compliance requirements for a specific CA, or if you need EV (Extended Validation) certificates that display a green bar in some older enterprise browsers. For most applications, Let's Encrypt certificates are fully adequate.
My Let's Encrypt certificate says it expires in 90 days — do I need to renew it?
No, if your domain is on Vercel. Vercel's infrastructure renews certificates automatically before they expire — you will never see an expired certificate warning for a properly configured Vercel domain. The 90-day expiry is a Let's Encrypt policy choice that encourages automation (instead of year-long manual certificates). Vercel's automation handles renewal transparently.
What happens to my SSL certificate if I transfer my domain to a new registrar?
Transferring your domain registrar does not affect your Vercel SSL certificate as long as the DNS records pointing to Vercel remain the same during and after the transfer. Domain transfers typically lock DNS for 60 days but do not change existing DNS records. If you need to update DNS records after a transfer, the certificate may temporarily show as invalid while Vercel re-verifies your domain — it will re-provision automatically once DNS is confirmed.
Can I get a wildcard SSL certificate (*.myapp.com) on Vercel?
Wildcard certificates are available on Vercel Pro and Enterprise plans. With a wildcard certificate, any subdomain of your domain (like blog.myapp.com, api.myapp.com, or tenant1.myapp.com) is covered without adding each subdomain separately. Vercel uses a DNS-01 ACME challenge to issue wildcard certificates, which requires access to your DNS provider's API. Configure this in Vercel Dashboard → your project → Settings → Domains.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation