[▲ Vercel Community](/) · [Categories](/categories) · [Latest](/latest) · [Top](/top) · [Live](/live)

[Discussions](/c/community/4)

# Create a WEBSITE_URL env variable for all environments

1128 views · 4 likes · 1 post


Vincent Voyer (@vvoyer) · 2024-08-29 · ♥ 4

## Overview
---

When deploying a Next.js application on Vercel, you may need to access your website url in code to craft URLs and links to your apps for various needs.

Use cases:

- Create a magic login link and send it via email
- Crafting a webhook URL to be called by an external API
- Configuring OAuth in all environments
- Testing Open Graph in all environments
- Create absolute URLs for various application needs
- Add canonical URLs

The URL requirements are usually:

- It must be available in server (Route Handler, Server Actions, …) and client code.
- It must be valid and relevant for development, preview, and production environments
    - in development: `https://localhost:3000` or similar
    - in [Preview Deployments](https://vercel.com/docs/deployments/preview-deployments): the [GIT branch url](https://vercel.com/docs/deployments/generated-urls#url-with-git-branch), so you can easily share a static URL of your upcoming feature. Example: `https://some-project-git-new-feature-project.vercel.app` . This URL will not change between commits/deployments to your branch.
    - in production: `https://vercel.com`

If you want to do so when using Next.js and Vercel, here's how:

## Solution

---

We’ll create a `NEXT_PUBLIC_WEBSITE_URL` environment variable that is usable in all environments and situations. We’re prefixing it with `NEXT_PUBLIC` so it’s available in the context of the server and client.

**For development:**

1. Create a `.env.development.local` file
2. Add `NEXT_PUBLIC_WEBSITE_URL=http://localhost:3000` in it.
    1. `localhost:3000` could be a domain pointing to your local Next.js instance. In my setup, I love using [ngrok](https://ngrok.com/) with a custom domain, so I can test everything locally as if it was deployed on the internet.

**For Preview Deployments:**

1. Create a `.env.production` file (yes, Preview Deployments use `NODE_ENV=production`, so they use this file).
2. Add `NEXT_PUBLIC_WEBSITE_URL=https://$NEXT_PUBLIC_VERCEL_BRANCH_URL` 
    1. In most cases, this is what you want: a static branch url that won't change between commits to your branch. Alternatively, you can use `NEXT_PUBLIC_WEBSITE_URL=https://$VERCEL_URL`, which points to the [Generated Deployment URL](https://vercel.com/docs/deployments/generated-urls).

**For production:**

We’ll add a dedicated environment variable for production only:

1. Go to your project in the Vercel Dashboard
2. Click on the Settings tab (top right)
3. Click on Environment Variables
4. Create a new environment variable named (you guessed it) `NEXT_PUBLIC_WEBSITE_URL`
5. The value should be your production domain, like `https://vercel.com`

![CleanShot 2024-08-28 at 18.00.07@2x|690x399](upload://lmDIg7HU9eGP3sZjc5adQaoUjwr.png)


Ensure to check `Automatically expose System Environment Variables` in this UI too, which should be the default of any new Vercel project.

*Alternatively, you can define a value of `https://$VERCEL_PROJECT_PRODUCTION_URL`  in the UI, which will then expand to the shortest production domain for your project or a [vercel.app](http://vercel.app) domain if no production domain is configured.*

**Use the new environment variable:**

Now, whenever you need to craft an absolute URL pointing to:

- Your local server
- The preview branch url
- The production domain

You can do this in code:

```bash
const url = `{$process.env.NEXT_PUBLIC_WEBSITE_URL}/never-gonna-give-you-up.mp4`;
```

That's it!

## Resources

---

https://vercel.com/docs/projects/environment-variables/system-environment-variables

https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables

https://vercel.com/docs/deployments/generated-urls