Webflow staging subdomain

Learn how to use your Webflow staging subdomain.

site-settings
This video features an old UI. Updated version coming soon!

There are 2 types of domains you can publish your site to: your Webflow staging subdomain (e.g., yoursite.webflow.io) and custom domains (e.g., yourdomain.com). The Webflow staging subdomain is useful to test custom code and get approval on your site’s design before pushing your site live to your custom domain.

If you want to prevent your webflow.io site from appearing in search engine results, you can disable search engine indexing of the Webflow staging subdomain.

In this lesson, you’ll learn:

  1. How to edit your staging subdomain
  2. How to publish to your staging subdomain
  3. How staging subdomain cookies work

How to edit your staging subdomain

You can edit your subdomain under Site settings > General tab > General settings.

Note: If you change your site’s subdomain, both your staging subdomain (e.g., yoursite.webflow.io) and your site’s read-only link will be replaced instantly. Any read-only links you’ve previously shared will no longer function.
The Subdomain field is highlighted in the General settings section of the General tab.

How to publish to your staging subdomain

To publish your site to the staging subdomain without publishing to your custom domain: 

  1. Open your site in the Designer or go to Site settings
  2. Click Publish 
  3. Check the Webflow staging subdomain (e.g., yoursite.webflow.io)
  4. Uncheck your custom domain
  5. Click Publish to select domains
The staging subdomain is highlighted and checked in the Site settings publishing modal.
The publishing modal in Site settings.
The staging subdomain is highlighted and checked in the Designer publishing modal.
The publishing modal in the Designer.
Important: When you publish from the Editor, your site will publish to both the webflow.io staging subdomain and any custom domain(s) you’ve added to your site. To publish changes only to your staging subdomain, publish your site from the Designer or Site settings.

How staging subdomain cookies work

In April 2023, we submitted the Webflow staging domain to the Public suffix list. This increases the security and discoverability of websites published to the staging domain.

Beginning in June 2023, this change will also reset analytics cookies on URLs ending with webflow.io. If your site is only published to your Webflow staging subdomain — and not also published to a custom domain — your site’s analytics cookies will be reset in June 2023. This means that cookies for your site’s analytics tools (i.e., Google Analytics, Google Optimize, and Facebook Pixel) will be reset and existing visitors that return to your site won’t be recognized as “returning visitors” on their first visit following the cookie(s) reset.

If you want to preserve your site’s cookies on your staging subdomain, you can add the following script to your site:



// get all cookie names
function getCookieNames() {
  return document.cookie.split(';').map(c => c.trim().split('=')[0]);
}

// cookies to update
const COOKIES_TO_UPDATE = [
  // these are examples. You will likely want to run `getCookieNames()` 
  // to see what you are using on your site to determine which cookies 
  // to include in this list
  '_ga',
  '_fbp',
];

(function() {
  const psl = '_psl';
  const pslValue = getCookie(psl);
  // we set pslValue to `1` after migrating, so this guard ensures we
  // don't touch an already migrated cookie
  if (pslValue == '') {
    return;
  }

  function setCookie(name, value, days) {
    const d = new Date();
    d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
    const expires = 'expires=' + d.toUTCString();

    document.cookie = name + '=' + value + ';' + expires + ';path=/';
  }


  function getCookie(cname) {
    const decodedCookie = decodeURIComponent(document.cookie);
    const name = cname + '=';
    const ca = decodedCookie.split(';');
    for (let i = 0; i < ca.length; i++) {
      let c = ca[i];
      while (c.charAt(0) == ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(name) == 0) {
        return c.substring(name.length, c.length);
      }
    }
    return '';
  }

  function resetCookieToSubdomain(name) {
    const value = getCookie(name);
    if (value != '') {
      setCookie(name, value, 365);
    }
  }

  // Run the cookie rescoping migration
  COOKIES_TO_UPDATE.forEach(resetCookieToSubdomain);
  setCookie(psl, '1');
})();
Copy codeCopied!