
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Wed, 15 Apr 2026 00:13:59 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Waiting Room adds multi-host and path coverage, unlocking broader protection and multilingual setups]]></title>
            <link>https://blog.cloudflare.com/multihost-waiting-room/</link>
            <pubDate>Wed, 04 Oct 2023 13:00:44 GMT</pubDate>
            <description><![CDATA[ Today, we are thrilled to announce that Waiting Room now supports coverage of multiple hostname and path combinations with a single waiting room, giving customers more flexibility and offering broader site coverage without interruptions to end-user flows ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4ifF5x8IwXAYRztjYxlQOW/b9680e3b38df8bb0eae48d4444b80c65/image4.png" />
            
            </figure><p><a href="https://www.cloudflare.com/application-services/products/waiting-room/">Cloudflare Waiting Room</a> protects sites from overwhelming traffic surges by placing excess visitors in a fully customizable virtual waiting room, admitting them dynamically as spots become available. Instead of throwing error pages or delivering poorly-performing site pages, Waiting Room empowers customers to take control of their end-user experience during unmanageable traffic surges.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4pq031M9XklIgj4DHLZN8O/b1083ed0bfc0b6cb0fd4aea86b21f7ac/image1.png" />
            
            </figure><p>A key decision customers make when setting up a waiting room is what pages it will protect. Before now, customers could select one hostname and path combination to determine what pages would be covered by a waiting room. Today, we are thrilled to announce that Waiting Room now supports coverage of multiple hostname and path combinations with a single waiting room, giving customers more flexibility and offering broader site coverage without interruptions to end-user flows. This new capability is available to all Enterprise customers with an Advanced Purchase of Waiting Room.</p>
    <div>
      <h3>Waiting Room site placement</h3>
      <a href="#waiting-room-site-placement">
        
      </a>
    </div>
    <p>As part of the simple, no-coding-necessary process for deploying a waiting room, customers specify a hostname and path combination to indicate which pages are covered by a particular waiting room. When a site visitor makes a preliminary request to that hostname and path or any of its subpaths, they will be issued a waiting room cookie and either be admitted to the site or placed in a waiting room if the site is at capacity.</p><p>Last year, we added <a href="/waiting-room-bypass-rules/">Waiting Room Bypass Rules</a>, giving customers many options for creating exceptions to this hostname and path coverage. This unlocked capabilities such as User Agent Bypassing, geo-targeting, URL exclusions, and administrative IP bypassing. It also allowed for some added flexibility regarding which pages a waiting room would apply to on a customer’s site by adding the ability to exclude URLs, paths, and query strings. While this update allowed for greater specificity regarding which traffic should be gated by Waiting Room, it didn’t offer the broader coverage that many customers still needed to protect greater portions of their sites with a single waiting room.</p>
    <div>
      <h3>Why customers needed broader Waiting Room coverage</h3>
      <a href="#why-customers-needed-broader-waiting-room-coverage">
        
      </a>
    </div>
    <p>Let’s review some simple yet impactful examples of why this broader coverage option was important for our customers. Imagine you have an online store, example.com, and you want to ensure that a single waiting room covers the entire customer journey — from the homepage, to product browsing, to checkout. Many sites would delineate these steps in the flow using paths: example.com/, example.com/shop/product1, example.com/checkout. Because Waiting Room assumes an implied wildcard at the end of a waiting room’s configured path, this use case was already satisfied for these sites. Thus, placing a waiting room at example.com/ would cover all the URLs associated with every step of this customer journey. In this setup, once a site visitor has passed the waiting room, they would not be re-queued at any step in their user flow because they are still using the same waiting room’s cookie, which indicates to Waiting Room that they are the same user between URLs.</p><p>However, many sites delineate different steps of this type of shopping flow using subdomains instead of or as well as paths. For example, many sites will have their checkout page on a different subdomain, such as checkout.example.com. Before now, if a customer had this site structure and wanted to protect their entire site with a single waiting room, they would have needed to deploy a waiting room at example.com/ and another at checkout.example.com/. This option was not ideal for many customers because a site visitor could be queued at two different parts of the same customer journey. This is because the waiting room at checkout.example.com/ would count the same visitor as a different user than the waiting room covering example.com/.</p><p>That said, there are cases where it is wise to separate waiting rooms on a single site. For example, a ticketing website could place a waiting room at its apex domain (example.com) and distinct waiting rooms with pre-queues on pages for specific events (example.com/popular_artist_tour). The waiting room set at example.com/ ensures that the main point of entry to the site does not get overwhelmed and crash when ticket sales for any one event open. The waiting room placed on the specific event page ensures that traffic for a single event can start queuing ahead of the event without impacting traffic going to other parts of the site.</p><p>Ultimately, whether a customer wants one or multiple waiting rooms to protect their site, we wanted to give our customers the flexibility to deploy Waiting Room however was best for their use cases and site structure. We’re thrilled to announce that Waiting Room now supports multi-hostname and path coverage with a single waiting room!</p>
    <div>
      <h3>Getting started with multi-host and path coverage</h3>
      <a href="#getting-started-with-multi-host-and-path-coverage">
        
      </a>
    </div>
    <p>Customers can now configure a waiting room on multiple hostname and path combinations — or routes — belonging to the same zone. To do so, navigate to Traffic &gt; Waiting Room and select Create. The name of your domain will already be populated. To add additional routes to your waiting room configuration, select Add Hostname and Path. You can then enter another hostname and path to be covered by the same waiting room. Remember, there is an implied wildcard after each path. Therefore, creating a waiting room for each URL you want your waiting room to cover is unnecessary. Only create additional routes for URLs that wouldn’t be covered by the other hostname and path combinations you have already entered.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3VNkM6S6x01KPvXmCgOSyw/6457b0c19b97437c52d9273ec5f9a6cd/image3.png" />
            
            </figure><p>When deploying a waiting room that covers multiple hostname and path combinations, you must create a unique cookie name for this waiting room (more on that later!). Then, proceed with the <a href="https://developers.cloudflare.com/waiting-room/how-to/create-waiting-room/">same workflow</a> as usual to deploy your waiting room.</p>
    <div>
      <h3>Deploying a multi-language waiting room</h3>
      <a href="#deploying-a-multi-language-waiting-room">
        
      </a>
    </div>
    <p>A frequent customer request was the ability to cover a multi-language site with a single waiting room — offering different text per language while counting all site traffic toward the same waiting room limits. There are various ways a site can be structured to delineate between different language options, but the two most common are either by subdomain or path. For a site that uses path delineation, this could look like example.com/en and example.com/es for English and Spanish, respectively. For a site using subdomain delineation, this could look like en.example.com/ and es.example.com/. Before multihost Waiting Room coverage, the subdomain variation would not have been able to be covered by a single waiting room.</p><p>Waiting Room’s existing configuration options already supported the path variation. However, this was only true if the customer wanted to gate the entire site, which they could do by placing the waiting room at example.com/. Many e-commerce customers asked for the ability to gate different high-demand product pages selling the same product but with different language options. For instance, consider example.com/en/product_123 and example.com/es/product_123, where the customer wants the same waiting room and traffic limits to cover both URLs. Before now, this would not have been possible without some complex bypass rule logic.</p><p>Now, customers can deploy a waiting room that accommodates either the subdomain or path approach to structuring a multi-language site. The only remaining step is setting up your waiting room to serve different languages when a user is queued in a waiting room. This can be achieved by constructing a template that reads the URL to determine the locale and define the appropriate translations for each of the locales within the template.</p><p>Here is an example of a template that determines the locale from the URL path, and renders the translated text:</p>
            <pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;Waiting Room powered by Cloudflare&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;section&gt;
      &lt;h1 id="inline-msg"&gt;
        You are now in line.
      &lt;/h1&gt;
      &lt;h1 id="patience-msg"&gt;
        Thank you for your patience.
      &lt;/h1&gt;
    &lt;/section&gt;
    &lt;h2 id="waitTime"&gt;&lt;/h2&gt;

    &lt;script&gt;
      var locale = location.pathname.split("/")[1] || "en";
      var translations = {
        "en": {
          "waittime_60_less": "Your estimated wait time is {{waitTime}} minute.",
          "waittime_60_greater": "Your estimated wait time is {{waitTimeHours}} hours and {{waitTimeHourMinutes}} minutes.",
          "inline-msg": "You are now in line.",
          "patience-msg": "Thank you for your patience.",
        },
        "es": {
          "waittime_60_less": "El tiempo de espera estimado es {{waitTime}} minuto.",
          "waittime_60_greater": "El tiempo de espera estimado es {{waitTimeHours}} de horas y {{waitTimeHourMinutes}} minutos.",
          "inline-msg": "Ahora se encuentra en la fila de espera previa.",
          "patience-msg": "Gracias por su paciencia.",
        }
      };

      {{#waitTimeKnown}}
      var minutes = parseInt( {{waitTime}} , 10);
      var time = document.getElementById('waitTime');

      if ( minutes &lt; 61) {
        time.innerText = translations[locale]["waittime_60_less"]
      } else {
        time.innerText = translations[locale]["waittime_60_greater"]
      }
      {{/waitTimeKnown}}

      // translate template text for each of the elements with “id” suffixed with “msg”
      for (const msg of ["inline-msg", "patience-msg"]) {
        const el = document.getElementById(msg);
        if (el == null) continue;
        el.innerText = translations[locale][msg];
      }
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
            <p>Here’s how the template works: given a site distinguishes different locales with various paths such as <code>/en/product_123</code> or <code>/es/product_123</code> in the <code>&lt;script /&gt;</code> body after the rendering the page, the locale is extracted from the <code>location.pathname</code> via <code>locale = location.pathname.split(“/”)[1]</code>. If there isn’t a locale specified within the <code>translations</code> object we default it to “en”. For example, if a user visits example.com/product_123, then by default render the English text template.</p><p>Similarly, in order to support a multi-language waiting room for sites that delineate site structure via subdomain, it would only require you to update how you extract the locale from the URL. Instead of looking at the <code>pathname</code> we look at the <code>hostname</code> property of the <code>window.location</code> object like <code>locale = location.hostname.split(“.”)[0]</code>, given, we have site structure as following: en.example.com, es.example.com.</p><p>The above code is a pared down example of starter templates we have added to our <a href="https://developers.cloudflare.com/waiting-room/how-to/customize-waiting-room/#multiple-language-support">developer documentation</a>, which we have included to make it easier for you to get started with a multi-language waiting room. You can download these templates and edit them to have the look and feel aligned with your site and with the language options your site offers.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7jf9G0L2xNFyVKFmxOjlgy/b5f4fdbcb3ba6ea7ac836b8463e7342b/image2.png" />
            
            </figure><p>This is an example of the starter template provided in dev docs. This waiting room is in Queue-all mode and displays the Spanish text when the user visits example.com/es/product_123.</p><p>These templates can further be expanded to include other languages by adding translations to the `translations` object for each of the locales. Thus, a single template is able to serve multiple languages depending on whatever the locale the site is being served as either via subdomain or path.</p>
    <div>
      <h3>How we handle cookies with a multihostname and path waiting room</h3>
      <a href="#how-we-handle-cookies-with-a-multihostname-and-path-waiting-room">
        
      </a>
    </div>
    <p>The waiting room assigns a <code>__cfwaitingroom</code> <a href="https://developers.cloudflare.com/waiting-room/reference/waiting-room-cookie/">cookie</a> to each user to manage the state of the user that determines the position of the user in line <a href="/building-waiting-room-on-workers-and-durable-objects/#:~:text=What%20is%20in%20the%20cookie%20returned%20to%20an%20end%20user%3F">among other properties</a> needed to make the queueing decisions for the user. Traditionally, for a single hostname and path configuration it was trivial to just set the cookie as <code>__cfwaitingroom=[cookie-value]; Domain=example.com; Path=/es/product_123</code>. This ensured that when the page refreshed it would send us the same Waiting Room cookie for us to examine and update. However, this became non-trivial when we wanted to share the same cookie across different subdomain or path combinations, for example, on <code>example.com/en/product_123</code>.</p>
    <div>
      <h3>Approaches to setting multiple cookies</h3>
      <a href="#approaches-to-setting-multiple-cookies">
        
      </a>
    </div>
    <p>There were two approaches that we brainstormed and evaluated to allow the sharing of the cookie for the same waiting room.</p><p>The first approach we considered was to issue multiple <code>Set-Cookie</code> headers in the HTTP response. For example, in the multi-language example above, we could issue the following in the response header:</p>
            <pre><code>Set-Cookie: __cfwaitingroom=[cookie-value]…Domain=example.com; Path=/en/product_123 …
Set-Cookie: __cfwaitingroom=[cookie-value]...Domain=example.com; Path=/es/product_123 …</code></pre>
            <p>This approach would allow us to handle the multiple hostnames and paths for the same waiting room. However, it does not present itself as a very scalable solution. Per <a href="https://datatracker.ietf.org/doc/html/rfc6265#section-5.2">RFC6265</a>, there isn’t a strict limit defined in the specification, browsers have their own implementation-specific limits. For example, Chrome allows the response header to grow up to <a href="https://source.chromium.org/chromium/chromium/src/+/main:net/http/http_stream_parser.h;l=168;drc=4cc7ba01d3c5dc996ddc98f9d0bd709e3d5bbfd3?q=ERR_RESPONSE_HEADERS_TOO_BIG&amp;ss=chromium">256K bytes</a> before throwing the transaction with ERR_RESPONSE_HEADERS_TOO_BIG. Additionally, in this case, the response header would grow proportionally to the number of unique hostname and path combinations, and we would be redundantly repeating the same cookie value N (where N is the number of additional routes) number of times. While this approach would have allowed us to effectively handle a bounded list of hostname and path combinations that need to be set, it was not ideal for cases where we can expect more than a handful routes for a particular site.</p><p>The second approach that we considered and chose to move forward with was to set the cookie on the apex domain (or the most common subdomain). In other words, we would figure out the most common subdomain from the list of routes and use that as the domain. Similarly, for the paths, this would entail determining the least common prefix from the list of paths and use that as the value to be set on the path attribute. For example, consider a waiting room with the following two routes configured, a.example.com/shoes/product_123 and b.example.com/shoes/product_456.</p><p>To determine the domain that would be set for the cookie, we can see that <code>example.com</code> is the most common subdomain among the list of domains. Applying the most common subdomain algorithm, we would get <code>example.com</code> as the domain. Applying the least common prefix algorithm on the set of paths, <code>/shoes/product_123</code> and <code>/shoes/product_456</code>, we would get <code>/shoes</code> as the path. Thus, the set-cookie header would be the following:</p>
            <pre><code>Set-Cookie: … __cfwaitingroom=[cookie-value]; Domain=example.com; Path=/shoes …</code></pre>
            <p>Now, when a visitor accesses any of the pages covered by this waiting room, we can guarantee Waiting Room receives the right cookie and there will only be Set-Cookie included in the response header.</p><p>However, we are still not there yet. Although we are able to identify the common subdomain (or apex domain) and common path prefix, there would still be a problem if routes from one waiting room would overlap with another waiting room. For example, say we configure two waiting rooms for the same site where we are selling our special shoes:</p><p>Waiting Room A<br />
    a.example.com/shoes/product_123<br />
    b.example.com/shoes/product_456</p>

<p>Waiting Room B<br />
    c.example.com/shoes/product_789<br />
    d.example.com/shoes/product_012</p><p>If we apply the same algorithm as described above, we would get the same domain and path properties set for the two cookies. For Waiting Room A, the domain would be <code>example.com</code> and the path would be <code>/shoes</code>. Similarly, for Waiting Room B, the most common subdomain would also be example.com and least common path prefix would be <code>/shoes</code>. This would effectively prevent us from distinguishing the two cookies and route the visitor to the right waiting room. In order to solve the issue of overlapping cookie names, we introduced the requirement of setting a custom suffix that is unique to the customer’s zone. This is why it is required to provide a custom cookie suffix when configuring a waiting room that covers multiple hostnames or paths. Therefore, if Waiting Room A was assigned cookie suffix “a” and Waiting Room B was assigned cookie suffix “b”, the two <code>Set-Cookie</code> definitions would look like the following:</p><p><b>Waiting Room A</b></p>
            <pre><code>Set-Cookie: __cfwaitingroom_a=[cookie-value]; Domain=example.com; Path=/shoes</code></pre>
            <p><b>Waiting Room B</b></p>
            <pre><code>Set-Cookie: __cfwaitingroom_b=[cookie-value]; Domain=example.com; Path=/shoes</code></pre>
            <p>When a visitor makes a request to any pages where the two different waiting rooms are configured, Waiting Room can distinguish and select which cookie corresponds to the given request and use this to determine which waiting room’s settings apply to that user depending on where they are on the site.</p><p>With the addition of multihost and multipath Waiting Room coverage, we’re thrilled to offer more flexible options for incorporating Waiting Room into your site, giving your visitors the best experience possible while protecting your site during times of high traffic. Make sure your site is always protected from traffic surges. Try out <a href="https://dash.cloudflare.com/?to=/:account/:zone/traffic/waiting-rooms">Waiting Room</a> today or <a href="https://www.cloudflare.com/application-services/products/waiting-room/">reach out to us</a> to learn more about the Advanced Waiting Room!</p> ]]></content:encoded>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[Always Online]]></category>
            <category><![CDATA[Traffic]]></category>
            <guid isPermaLink="false">55w0QUCoPwqzUfaTJm5LRg</guid>
            <dc:creator>Arielle Olache</dc:creator>
            <dc:creator>Yawar Jamal</dc:creator>
        </item>
        <item>
            <title><![CDATA[Understand the impact of Waiting Room settings with Waiting Room Analytics]]></title>
            <link>https://blog.cloudflare.com/understand-the-impact-of-your-waiting-rooms-settings-with-waiting-room-analytics/</link>
            <pubDate>Wed, 07 Jun 2023 13:00:44 GMT</pubDate>
            <description><![CDATA[ Today, we are thrilled to announce the launch of Waiting Room Analytics and tell you more about how we built this game-changing feature. Waiting Room Analytics provides insights into end-user experience and visualizations of your waiting room traffic ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3y5ATrfMtMfpdbyB9kJlz8/bb381e09b5d22635ecf09255a37d9041/download--1--3.png" />
            
            </figure><p>In January 2021, we gave you a behind-the-scenes look at how we built <a href="/building-waiting-room-on-workers-and-durable-objects/">Waiting Room on Cloudflare’s Durable Objects</a>. Today, we are thrilled to announce the launch of Waiting Room Analytics and tell you more about how we built this feature. Waiting Room Analytics offers insights into end-user experience and provides visualizations of your waiting room traffic. These new metrics enable you to make well-informed configuration decisions, ensuring an optimal end-user experience while protecting your site from overwhelming traffic spikes.</p><p>If you’ve ever bought tickets for a popular concert online you’ll likely have been put in a virtual queue. That’s what Waiting Room provides. It keeps your site up and running in the face of overwhelming traffic surges. Waiting Room sends excess visitors to a customizable virtual waiting room and admits them to your site as spots become available.</p><p>While customers have come to rely on the protection Waiting Room provides against traffic surges, they have faced challenges analyzing their waiting room’s performance and impact on end-user flow. Without feedback about waiting room traffic as it relates to waiting room settings, it was challenging to make Waiting Room configuration decisions.</p><p>Up until now, customers could only monitor their waiting room's status endpoint to get a general idea of waiting room traffic. This endpoint displays the current number of queued users, active users on the site, and the estimated wait time shown to the last user in line.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3fOglidb4tQ5LGfkrUOPu4/f085a0622740f08ca10a6483d950c1ed/a1.png" />
            
            </figure><p>The status endpoint is still a great tool for at a glance understanding of the near real-time status of a waiting room. However, there were many questions customers had about their waiting room that were either difficult or impossible to answer using the status endpoint, such as:</p><ul><li><p>How long did visitors wait in the queue?</p></li><li><p>What was my peak number of visitors?</p></li><li><p>How long was the pre-queue for my online event?</p></li><li><p>How did changing my waiting room's settings impact wait times?</p></li></ul><p>Today, Waiting Room is ready to answer those questions and more with the launch of Waiting Room Analytics, available in the Waiting Room dashboard to all Business and Enterprise plans! We will show you the new waiting room metrics available and review how these metrics can help you make informed decisions about your waiting room's settings. We'll also walk you through the unique challenge of how we built Waiting Room Analytics on our distributed network.</p>
    <div>
      <h2>How Waiting Room settings impact traffic</h2>
      <a href="#how-waiting-room-settings-impact-traffic">
        
      </a>
    </div>
    <p>Before covering the newly available Waiting Room metrics, let's review some key settings you configure when creating a waiting room. Understanding these settings is essential as they directly impact your waiting room's analytics, traffic, and user experience.</p><p>When configuring a waiting room, you will first define traffic limits to your site by setting two values–Total active users and New users per minute. Total active users is a target threshold for how many simultaneous users you want to allow on the pages covered by your waiting room. Waiting Room will kick in as traffic ramps up to keep active users near this limit. The other value which will control the volume of traffic allowed past your waiting room is New users per minute. This setting defines the target threshold for the maximum rate of user influx to your application. Waiting Room will kick in when the influx accelerates to keep this rate near your limits. Queuing occurs when traffic is at or near your New users per minute or Total active users target values.</p><p>The two other settings which will impact your traffic flow and user wait times are Session duration and session renewal. The session duration setting determines how long it takes for end-user sessions to expire, thereby freeing up spots on your site. If you enable session renewal, users can stay on your site as long as they want, provided they make a request once every <i>session_duration</i> minutes. If you disable session renewal, users' sessions will expire after the duration you set for session_duration has run out. After the session expires, the user will be issued a new waiting room cookie upon their next request. If there is active queueing, this user will be placed in the back of the queue. Otherwise, they can continue browsing for another <i>session_duration</i> minutes.</p><p>Let's walk through the new analytics available in the Waiting Room dashboard, which allows you to see how these settings can impact waiting room throughput, how many users get queued, and how long users wait to enter your site from the queue.</p>
    <div>
      <h3>Waiting Room Analytics in the dash</h3>
      <a href="#waiting-room-analytics-in-the-dash">
        
      </a>
    </div>
    <p>To access metrics for a waiting room, navigate to the Waiting Room dashboard, where you can find pre-built visualizations of your waiting room traffic. The dashboard offers at-a-glance metrics for the peak waiting room traffic over the last 24 hours.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6TCj0fwsD4c8wpZ5dhHuw1/4cf9ab0f5845ee600e919b2b11ce78ba/a2.png" />
            
            </figure><p>Get at-a-glance metrics of the last 24 hours of Waiting Room traffic.</p><p>To dig deeper and analyze up to 30 days of historical data, open your waiting room's analytics by selecting View more.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5nveI9Qo2i6q2dS8evggsm/33bbb59edda0ce303b75c3fb5602e682/a3.gif" />
            
            </figure><p>Review up to 30 days of waiting room metrics by selecting View more.</p><p>Alternatively, we've made it easy to hone in on analytics for a past <a href="/waiting-room-event-scheduling/">waiting room event</a> (within the last 30 days). You can automatically open the analytics dashboard to a past event's exact start and end time, including the pre-queueing period by selecting the blue link in the events table.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2Kexln2cQOSi7n27rMgR8V/47445b0c5f1ba495588cc3aa91acf9f2/a4.png" />
            
            </figure><p>To get data tied to a past event, simply select the link in the Waiting Room Events table.</p>
    <div>
      <h4>User insights</h4>
      <a href="#user-insights">
        
      </a>
    </div>
    <p>The first two metrics–Time in queue and Time on origin–provide insights into your end-users' experience and behavior.  The <i>time in queue</i> values help you understand how long queued users waited before accessing your site over the time period selected. The <i>time on origin</i> values shed light on end-user behavior by displaying an estimate of the range of time users spend on your site before leaving. If session renewal is disabled, this time will max out at session_duration and reflect the time at which users are issued a new waiting room cookie. For both metrics, we provide time for both the typical user, represented by a range of the 50th and 75th percentile of users, as well as for the top 5% of users who spend the longest in the queue or on your site.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7xYxDmpcV3mPLEuhtz3ukJ/cca9e9d5f5f82179d5dc8aea74ef0b82/a5.png" />
            
            </figure><p>The Time in queue and Time on origin are given for the typical user as well as for the 95th percentile of users.</p><p>If session renewal is disabled, keeping an eye on Time on origin values is especially important. When sessions do not renew, once a user's session has expired, they are given a new waiting room cookie upon their next request. The user will be put at the back of the line if there is active queueing. Otherwise, they will continue browsing, but their session timer will start over and your analytics will never show a Time on origin greater than your configured session duration, even if individual users are on your site longer than the session duration. If session renewal is disabled and the typical time on origin is close to your configured session duration, this could be an indicator you may need to give your users more time to complete their journey before putting them back in line.</p>
    <div>
      <h4>Analyze past waiting room traffic</h4>
      <a href="#analyze-past-waiting-room-traffic">
        
      </a>
    </div>
    <p>Scrolling down the page, you will find visualizations of your user traffic compared to your waiting room's target thresholds for Total active users and New users per minute. These two settings determine when your waiting room will start queueing as traffic increases. The Total active users setting controls the number of concurrent users on your site, while the New users per minute threshold restricts the flow rate of users onto your site.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/15dYn07CaChldpZOoTqLvq/3fc7a2f9c653e44dbca630ff0cddaf4b/a6.gif" />
            
            </figure><p><i>To zoom in on a time period, you can drag your cursor from the left to the right of the time period you are interested in and the other graphs, in addition to the insights will update to reflect this time period.</i></p><p>On the Active users graph, each bar represents the maximum number of queued users stacked on top of the maximum number of users on your site at that point in time. The example below shows how the waiting room kicked in at different times with respect to the active user threshold. The total length of the bar illustrates how many total users were either on the site or waiting to enter the site at that point in time, with a clear divide between those two values where the active user threshold kicked in. Hover over any bar to display a tooltip with the exact values for the period you are interested in.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6GGSRvWJYGx6KxOTALOxZU/e9a95d8519905c2d96855a18a96363df/a7.png" />
            
            </figure><p>Easily identify peak traffic and when waiting room started queuing to protect your site from a traffic surge.</p><p>Below the Active users chart is the New users per minute graph, which shows the rate of users entering your application per minute compared to your configured threshold. Make sure to review this graph to identify any surges in the rate of users to your application that may have caused queueing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/18ARuNhm8JUrclAZ1qzxHj/be86627ff03979b62b71ef6946114b43/a8.png" />
            
            </figure><p>The New users per minute graph helps you identify peaks in the rate of users entering your site which triggered queueing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6L7rMLgDdWh4rbyfAwGMdW/1f8f6f3156c988bc2fa93c7f0f0f3c64/a9.png" />
            
            </figure><p>This graph shows queued user and active user data from the same time period as the spike seen in New users per minute graph above. When analyzing your waiting room’s metrics, be sure to review both graphs to understand which Waiting Room traffic setting triggered queueing and to what extent.</p>
    <div>
      <h3>Adjusting settings with Waiting Room Analytics</h3>
      <a href="#adjusting-settings-with-waiting-room-analytics">
        
      </a>
    </div>
    <p>By leveraging the insights provided by the analytics dashboard, you can fine-tune your waiting room settings while ensuring a safe and seamless user experience. A common concern for customers is longer than desired wait times during high traffic periods. We will walk through some guidelines for evaluating peak traffic and settings’ adjustments that could be made.</p><p><b>Identify peak traffic.</b> The first step is to identify when peak traffic occurred. To do so, zoom out to 30 days or some time period inclusive of a known high traffic event. Reviewing the graph, locate a period of time where traffic peaked and use your cursor to highlight from the left to right of the peak. This will zoom in to that time period, updating all other values on the analytics page.</p><p><b>Evaluate wait times.</b> Now that you have honed in on the time period of peak traffic, review the Time in queue metric to analyze if the wait times during peak traffic were acceptable. If you determine that wait times were significantly longer than you had anticipated, consider the following options to reduce wait times for your next traffic peak.</p><p><b>Decrease session duration when session renewal is enabled.</b> This is a safe option as it does not increase the allowed load to your site. By decreasing this duration, you decrease the amount of time it takes for spots to open up as users go idle. This is a good option if your customer journey is typically request heavy, such as a checkout flow. For other situations, such as video streaming or long-form content viewing, this may not be a good option as users may not make frequent requests even though they are not actually idle.</p><p><b>Disable session renewal.</b>  This option also does not increase the allowed load to your site. Disabling session renewal means that users will have <i>session_duration</i> minutes to stay on the site before being put back in the queue. This option is popular for high demand events such as product drops, where customers want to give as many users as possible a fair chance to participate and avoid inventory hoarding. When disabling session renewal, review your waiting room’s analytics to determine an appropriate session duration to set.</p><p>The Time on origin values will give you an idea of how long users need before leaving your site. In the example below, the session duration is set to 10 minutes but even the users who spend the longest only spend around 5 minutes on the site. With the session renewal disabled, this customer could reduce wait times by decreasing the session duration to 5 minutes without disruption to most users, allowing for more users to get access.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/74sEnoEXPq6KHfToDvxG3G/abaa9a81a20dbf326f2cf0b358b639df/a10.png" />
            
            </figure><p><b>Adjust Total active users or New users per minute settings.</b> Lastly, you can decrease wait times by increasing your waiting room’s traffic limits–Total active users or New users per minute. This is the most sure-fire way to reduce wait times but it also requires more consideration. Before increasing either limit, you will need to evaluate if it is safe to do so and make small, iterative adjustments to these limits, monitoring certain signals to ensure your origin is still able to handle the load. A few things to consider monitoring as you adjust settings are origin CPU usage and memory utilization, and increases in 5xx errors which can be reviewed in Cloudflare’s Web Analytics tab. Analyze historical traffic patterns during similar events or periods of high demand. If you observe that previous traffic surges were successfully managed without site instability or crashes, it provides a strong signal that you can consider increasing waiting room limits.</p><p>Utilize the Active user chart as well as the New users per minute chart to determine which limit is primarily responsible for triggering queuing so that you know which limit to adjust. After considering these signals and making adjustments to your waiting room’s traffic limits, closely monitor the impact of these changes using the waiting room analytics dashboard. Continuously assess the performance and stability of your site, keeping an eye on server metrics and user feedback.</p>
    <div>
      <h3>How we built Waiting Room Analytics</h3>
      <a href="#how-we-built-waiting-room-analytics">
        
      </a>
    </div>
    <p>At Cloudflare, we love to build on top of our own products. Waiting Room is built on <a href="/building-waiting-room-on-workers-and-durable-objects/">Workers and Durable Objects</a>. Workers have the ability to auto-scale based on the request rate. They are built using <a href="/cloud-computing-without-containers/">isolates</a> enabling them to spin up hundreds or thousands of isolates within 5 milliseconds without much overhead. Every request that goes to an application behind a waiting room, goes to a Worker.</p><p>We optimized the way in which we track end users visiting the application while maintaining their position in the queue. Tracking every user individually would incur more overhead in terms of maintaining state, consuming more CPU &amp; memory. Instead, we decided to divide the users into buckets based on the timestamp of the first request made by the end user. For example, all the users who visited a waiting room between 00:00:00 and 00:00:59 for the first time are assigned to the bucket 00:00:00. Every end user gets a unique encrypted cookie on the first request to the waiting room. The contents of the cookie keep getting updated based on the status of the users in the queue. Once the end user is accepted to the origin, we set the cookie expiry to <i>session_duration</i> minutes, which can be set in the dashboard, from the last request timestamp. In the cookie we track the timestamp of when the end user joined the queue which is used in the calculation of time waited in queue.</p>
    <div>
      <h4>Collection of metrics in a distributed environment</h4>
      <a href="#collection-of-metrics-in-a-distributed-environment">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5PhNDWwGlL9HyuZhyh5zSK/2efde37fe13c8293cb4d99fd636ec73d/a11.png" />
            
            </figure><p>The Waiting Room is a distributed system that receives requests from multiple locations around the globe</p><p>In a distributed environment, the challenge when building out analytics is to collect data from multiple nodes and aggregate them. Each worker running at every data center sees user requests and needs to report metrics based on those to another coordinating service at every data center. The data aggregation could have been done in two ways.</p><p><b>i) Writing data from every worker when a request is received</b>In this design, every worker that receives a request is responsible for reporting the metrics. This would enable us to write the raw data to our analytics pipeline. We would not have the overhead of aggregating the data before writing. This would mean that we would write data for every request, but Waiting Room configurations are minute based and every user is put into a bucket based on the timestamp of the first request. All our configurations are minute and user based and the data written from workers is not related to time or user.</p><p><b>ii) Using the existing aggregation pipeline</b>Waiting Room is designed in such a way that we do not track every request, instead we group users into buckets based on the first time we saw them. This is tracked in the cookie that is issued to the user when they make the first request. In the current system, the data reported by the workers is sent upstream to the data center coordinator which is responsible for aggregating the data seen from all the workers for that particular data center. This aggregated data is then further processed and sent upstream to the global Durable Object which aggregates the data from all the other data centers. This data is used for making decisions whether to queue the user or to send them to the origin.</p><p>We decided to use the existing pipeline that is used for Waiting Room routing for analytics. Data aggregated this way provides more value to customers as it matches the model we use for routing decisions. Therefore, customers can see directly how changing their settings affects waiting room behavior. Also, it is an optimization in terms of space. Instead of writing analytics data per request, we are writing a pre-processed and aggregated analytics log every minute. This way the data is much less noisy.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6yadAlbwltDgqZeYQwN4nf/ac4e6782682ea83e94e0f171d1b8bf25/a12.png" />
            
            </figure><p>This diagram depicts that multiple workers from different locations receive requests and talk to the data center coordinators respectively which aggregate data and report the aggregated keys upstream to the Global Durable Object. The Global Durable Objects further aggregate all the keys received from the data center coordinators to compute a global aggregate key.</p>
    <div>
      <h3>Histograms</h3>
      <a href="#histograms">
        
      </a>
    </div>
    <p>The metrics available via Cloudflare’s GraphQL API are a combination of configured values set by the customer when creating a waiting room and values that are computed based on traffic seen by a waiting room. Waiting Room aggregates data every minute for each metric based on the requests it sees. While some metrics like <i>new users per minute</i>, <i>total active users</i> are counts and can be pre-processed and aggregated with a simple summation, metrics like <i>time on origin</i> and <i>total time waited in queue</i> cannot simply be added together into a single metric.</p><p>For example, there could be users who waited in the queue for four minutes and there could be a new user who joined the queue two minutes ago. However, if we simply sum these two data points, it would not make sense because six minutes would be an incorrect representation of the total time waited in the queue. Therefore, to capture this value more accurately, we store the data in a histogram. This enables us to represent the typical case (50th percentile) and the approximate worst case (in this case 95th percentile) for that metric.</p><p>Intuitively, we decided to store <i>time on origin</i> and <i>total time waited in queue</i> into a histogram distribution so that we would be able to represent the data and calculate quantiles precisely. We used <a href="http://hdrhistogram.org/">Hdr Histogram</a> - A High Dynamic Range Histogram for recording the data in histograms. Hdr Histograms are scalable and we were able to record dynamic numbers of values with auto-resizing without inflating CPU, memory or introducing latency. The time to record a value in the Hdr Histograms range from 3-6 nanoseconds. Querying and recording values can be done in constant time. Two histogram data structures can simply be added together into a bigger histogram. Also, the histograms can be compressed and encoded/decoded into base64 strings. This enabled us to scalably pass the data structure within our internal services for further aggregation.</p><p>The memory footprint of hdr histograms is constant and depends on the size of the bucket, precision and range of the histogram. The size of the bucket we use is the default 32 bits bucket size. The precision of the histogram is set to include up to three significant digits. The histogram has a dynamic range of values enabled through the use of the auto-resize functionality. However, to ensure efficient data storage, a limit of 5,000 recorded points per minute has been imposed. Although this limit was chosen arbitrarily, it has proven to be adequate for storing data points transmitted from the workers to the Durable Objects on a minute-by-minute basis.</p><p>The requests to the website behind a Waiting Room go to a Cloudflare data center that is close to their <a href="https://www.cloudflare.com/network/">location</a>. Our workers from around the world record values in the histogram which is compressed and sent to the data center Durable Object periodically. The histograms from multiple workers are uncompressed and aggregated into a single histogram per data center. The resulting histogram is compressed and sent upstream to the Global Durable objects where the histograms from all data centers receiving traffic are uncompressed and aggregated. The resulting histogram is the final data structure which is used for statistical analysis. We directly query the aggregated histogram for the quantile values. The histogram objects were instantiated once at the start of the service, they were reset after every successful sync with the upstream service.</p>
    <div>
      <h4>Writing data to the pipeline</h4>
      <a href="#writing-data-to-the-pipeline">
        
      </a>
    </div>
    <p>The global Durable Object aggregates all the metrics, computes quantiles and sends the data to a worker which is responsible for analytics reporting. This worker reads data from Workers KV in order to get the Waiting Room configurations. All the metrics are aggregated into a single analytics message. These messages are written every minute to Clickhouse. We leveraged an internal version of <a href="https://developers.cloudflare.com/analytics/analytics-engine/">Workers Analytics Engine</a> in order to write the data. This allowed us to quickly write our logs to Clickhouse with minimum interactions with all the systems involved in the pipeline.</p><p>We write analytics events from the runtime in the form of blobs and doubles with a specific schema and the event data gets written to a Clickhouse cluster. We extract the data into a Clickhouse view and apply <a href="/explaining-cloudflares-abr-analytics/">ABR</a> to facilitate fast queries at any timescale. You can expand the time range to vary from 30 minutes to 30 days without any lag. ABR adaptively chooses the resolution of data based on the query. For example, it would choose a lower resolution for a long time range and vice versa. As of now, the analytics data is available in the Clickhouse table for 30 days, implying that you can not query data older than 30 days in the dashboard as well.</p>
    <div>
      <h4>Sampling</h4>
      <a href="#sampling">
        
      </a>
    </div>
    <p>Waiting Room Analytics samples the data in order to effectively run large queries while providing consistent response times. Indexing the data on Waiting Room id has enabled us to run quicker and more efficient scans, however we still need to elegantly handle unbounded data. To tackle this we use <a href="/explaining-cloudflares-abr-analytics/">Adaptive Bit Rate</a> which enables us to write the data at multiple resolutions (100%, 10%, 1%...) and then read the best resolution of the data. The sample rate “adapts” based on how long the query takes to run. If the query takes too long to run in 100% resolution, the next resolution is picked and so on until the first successful result. However, since we pre-process and aggregate data before writing to the pipeline, we expect 100% resolution of data on reads for shorter periods of time (up to 7 days). For a longer time range, the data will be sampled.</p>
    <div>
      <h4>Get Waiting Room Analytics via GraphQL API</h4>
      <a href="#get-waiting-room-analytics-via-graphql-api">
        
      </a>
    </div>
    <p>Lastly, to make metrics available to customers and to the Waiting Room dashboard, we exposed the analytics data available in Clickhouse via GraphQL API.</p><p>If you prefer to build your own dashboards or systems based on waiting room traffic data, then Waiting Room Analytics via GraphQL API is for you. Build your own custom dashboards using the GraphQL framework and use a GraphQL client such as GraphiQL to run queries and explore the schema.</p><p>The Waiting Room Analytics dataset can be found under the Zones Viewer as waitingRoomAnalyticsAdaptive and waitingRoomAnalyticsAdaptiveGroups. You can filter the dataset per zone, waiting_room_id and the request time period, see the dataset schema under ZoneWaitingRoomAnalyticsAdaptive. You can order the data by ascending or descending order of the metric values.</p><p>You can explore the dimensions under waitingRoomAnalyticsAdaptiveGroups that can be used to group the data based on time, Waiting Room id and so on. The "max", “min”, “avg”, “sum” functions give the maximum, minimum, average and sum values of a metric aggregated over a time period. Additionally, there is a function called "avgWeighted" that calculates the weighted average of the metric. This approach is used for metrics stored in histograms, such as the time spent on the origin and total time waited. Instead of using a simple average, the weighted average is computed to provide a more accurate representation. This approach takes into account the distribution and significance of different data points, ensuring a more precise analysis and interpretation of the metric.</p><p>For example, to evaluate the weighted average for time spent on origin, the value of <i>total active users</i> is used as a weight. To better illustrate this concept, let’s consider an example. Imagine there is a website behind a Waiting Room and we want to evaluate the average time spent on the origin over a certain time period, let’s say an hour. During this hour, the number of active users on the website fluctuates. At some points, there may be more users actively browsing the site while at other times the number of active users might decrease. To calculate the weighted average for the time spent on the origin, we take into account the number of <i>total active users</i> at each instant in time. The rationale behind this is that the more users are actively using the website, the more representative their time spent on origin becomes in relation to the overall user activity.</p><p>By incorporating the <i>total active users</i> as weights in the calculation, we give more importance to the time spent on the origin during periods when there are more users actively engaging with the website. This provides a more accurate representation of the average time spent on the origin, accounting for variations in user activity throughout the designated time period.</p><p>The value of <i>new users per minute</i> is used as a weight to compute the weighted average for total time waited in queue. This is because when we talk about the total time weighted in the queue, the value of new users per minute for that instant in time takes importance as it signifies the number of users that joined the queue and certainly went into the origin.</p><p>You can apply these aggregation functions to the list of metrics exposed under each function. However, if you just want the logs per minute for a time period, rather than the breakdown of the time period (minute, fifteen minutes, hours), you can remove the datetime dimension from the query. For a list of sample queries to get you started, refer to our <a href="https://developers.cloudflare.com/waiting-room/waiting-room-analytics/#graphql-analytics">dev docs</a>.</p><p>Below is a query to calculate the average, maximum and minimum of <i>total active users, estimated wait time, total queued users and session duration</i> every fifteen minutes. It also calculates the weighted average of <i>time spent in queue</i> and <i>time spent on origin</i>. The query is done on the zone level. The response is obtained in a JSON format.</p><p>Following is an example query to find the weighted averages of time on origin (50th percentile) and total time waited (90th percentile) for a certain period and aggregate this data over one hour.</p>
            <pre><code>{
 viewer {
   zones(filter: {zoneTag: "example-zone"}) {
     waitingRoomAnalyticsAdaptiveGroups(limit: 10, filter: {datetime_geq: "2023-03-15T04:00:00Z", datetime_leq: "2023-03-15T04:45:00Z", waitingRoomId: "example-waiting-room-id"}, orderBy: [datetimeHour_ASC]) {
       avgWeighted {
         timeOnOriginP50
         totalTimeWaitedP90
       }
       dimensions {
         datetimeHour
       }
     }</code></pre>
            <p>Sample Response</p>
            <pre><code>{
  "data": {
    "viewer": {
      "zones": [
        {
          "waitingRoomAnalyticsAdaptiveGroups": [
            {
              "avgWeighted": {
                "timeOnOriginP50": 83.83,
                "totalTimeWaitedP90": 994.45
              },
              "dimensions": {
                "datetimeHour": "2023-05-24T04:00:00Z"
              }
            }
          ]
        }
      ]
    }
  },
  "errors": null
}</code></pre>
            <p>You can find more examples in our developer <a href="https://developers.cloudflare.com/waiting-room/waiting-room-analytics/">documentation</a>.Waiting Room Analytics is live and available to all Business and Enterprise customers and we are excited for you to explore it! Don’t have a waiting room set up? Make sure your site is always protected from unexpected traffic surges. Try out <a href="https://dash.cloudflare.com/?to=/:account/:zone/traffic/waiting-rooms">Waiting Room</a> today!</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[Analytics]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <guid isPermaLink="false">2rtjX1BlNurlYL9QUV42p7</guid>
            <dc:creator>Arielle Olache</dc:creator>
            <dc:creator>Aditi Paul</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Waiting Room Bypass Rules]]></title>
            <link>https://blog.cloudflare.com/waiting-room-bypass-rules/</link>
            <pubDate>Thu, 19 Jan 2023 14:00:00 GMT</pubDate>
            <description><![CDATA[ Waiting Room now offers customers more fine-tuned control over what traffic a waiting room covers. Queue only the traffic you want to with Bypass Waiting Room Rules, now available to all Enterprise customers with an Advanced Purchase of Waiting Room. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Leveraging the power and versatility of Cloudflare's Ruleset Engine, Waiting Room now offers customers more fine-tuned control over their waiting room traffic. Queue only the traffic you want to with Waiting Room Bypass Rules, now available to all Enterprise customers with an Advanced Purchase of Waiting Room.</p><p>Customers depend on <a href="/cloudflare-waiting-room/">Waiting Room</a> for always-on protection from unexpected and overwhelming traffic surges that would otherwise bring their site down. Waiting Room places excess users in a fully customizable virtual waiting room, admitting new visitors dynamically as spots become available on a customer’s site. Instead of throwing error pages or delivering poorly-performing site pages, Waiting Room empowers customers to take control of their end-user experience during unmanageable traffic surges.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6n3SXyNyJTLfNHzKSadZEQ/500878a533c197451d1afc42e6a1beb9/image7-2.png" />
            
            </figure><p>Take control of your customer experience with a fully customizable virtual waiting room</p><p>Additionally, customers use <a href="/waiting-room-event-scheduling/">Waiting Room Event Scheduling</a> to manage user flow and ensure reliable site performance before, during, and after online events such as product restocks, seasonal sales, and ticket sales. With Event Scheduling, customers schedule changes to their waiting rooms' settings and custom queuing page ahead of time, with options to pre-queue early arrivers and offload event traffic from their origins after the event has concluded.</p><p>As part of the simple, no-coding-necessary process for deploying a waiting room, customers specify a hostname and path combination, which defines <a href="https://developers.cloudflare.com/waiting-room/get-started/#location">the location</a> of their waiting room on their site. When a site visitor makes a preliminary request to that hostname and path or any of its subpaths, they will be issued a waiting room cookie and placed in the queue if the waiting room is queuing at that time.</p><p>The hostname and path approach to defining the placement of a waiting room is intuitive and makes it easy to deploy a waiting room to a site. But, many customers needed more granular control over what traffic and parts of their site their waiting room did or did not cover under a waiting room’s configured hostname and path. Use cases for allowing specific traffic to bypass a waiting room were varied.</p><p>Examples included allowing internal administrators site access at all times, never blocking internal user agents performing operations like synthetic monitoring, not applying waiting room to specific subpaths or query strings, or queuing only traffic from certain countries. Given the diversity of our customers’ requests to exclude traffic from a waiting room’s coverage, we built a bypass feature that gave customers the versatility necessary to deploy waiting rooms aligned with their existing site architecture and use cases. With the release of Event Scheduling, Waiting Room customers could queue <i>when</i> they wanted to; now, we are excited to announce that customers now have more flexibility to queue <i>who</i> and <i>where</i> they want to with Waiting Room Bypass Rules.</p>
    <div>
      <h2>Who gets queued is up to you</h2>
      <a href="#who-gets-queued-is-up-to-you">
        
      </a>
    </div>
    <p>Waiting Room Bypass Rules allow customers to write expressions that define what traffic should bypass their waiting room. A waiting room will not apply to incoming requests matching conditions based on one or more <a href="https://developers.cloudflare.com/waiting-room/additional-options/waiting-room-rules/bypass-rules/">available fields</a>, like IP address, URI path, query string, and country. Bypass rules supersede all Waiting Room features; even in <a href="https://developers.cloudflare.com/waiting-room/how-to/control-waiting-room/#queue-all-visitors">Queue-all mode</a>, event pre-queuing, or any other waiting room state, traffic matching your enabled rules’ expressions will never be queued or issued a waiting room cookie. Waiting Room rules are created via the Waiting Room API or the Waiting Room dashboard using a familiar rule management interface found throughout the Cloudflare dashboard. Waiting Room rules are managed at the individual waiting room level for precise control over each waiting room’s traffic.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2qU9yyQgWm9n7sohikI5LL/a9415c27aac27e2dd617df2876a75250/Screen-Shot-2022-11-28-at-11.35.50-AM.png" />
            
            </figure><p>Use the familiar rule builder found throughout the Cloudflare dashboard to define which traffic should bypass your waiting room.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/732mVjGlMIDtW3rOOhglfK/417683285c722cca7fd1d3538d443ccc/Screen-Shot-2022-11-28-at-12.20.02-PM.png" />
            
            </figure><p>Manage bypass rules at the individual waiting room level for precise control over each waiting room’s traffic coverage.</p>
    <div>
      <h2>Built with the Ruleset Engine</h2>
      <a href="#built-with-the-ruleset-engine">
        
      </a>
    </div>
    <p>We love building Cloudflare products on top of Cloudflare products; we knew that the versatility we wanted to offer to our customers with regard to what traffic a waiting room should apply to would best be achieved by integrating with Cloudflare’s powerful <a href="https://developers.cloudflare.com/ruleset-engine/">Ruleset Engine</a>. The Ruleset Engine provides the infrastructure for many of our highly customizable products, such as the new <a href="https://developers.cloudflare.com/rules/origin-rules/">Origin Rules</a> feature and our <a href="https://developers.cloudflare.com/waf/managed-rulesets/">WAF Managed Rulesets</a>, by providing a unified way to represent the concept of “rules” and an easy-to-integrate software library for consistently executing those rules. This allows all sorts of Cloudflare products to provide extremely similar rules capabilities, with the same language for defining conditions (which can grow quite complex!) and very similar APIs.</p><p>We’ve even found that some of Waiting Room’s product functionality can be best implemented on top of the Ruleset Engine; earlier this year we migrated some select core Waiting Room logic into the Ruleset Engine, implemented as rulesets that we now transparently deploy to every zone with a waiting room. This newly migrated implementation has been running for months, and the flexibility of the Ruleset Engine will make certain future Waiting Room features easier than ever to build.</p><p>The Ruleset Engine works on two major concepts: rulesets and rules. A ruleset is a list of rules that the engine executes in order. A rule consists of a condition and an action, with the action being executed if the condition evaluates to “true”.</p><p>Under the hood, when you create the first rule for a waiting room, we create a hidden ruleset attached to that waiting room. We put together a ruleset of our own which runs on every request to your zone, dispatching to your custom ruleset if a request matches the attached waiting room. This all sounds somewhat complicated, but don’t worry. You simply manage rules at the individual waiting room level, while we abstract away the complexity of the underlying rulesets.</p><p>The Waiting Room Bypass action’s core implementation is quite simple: when the condition on one of your bypass rules is true for a request, the bypass action simply clears the flag on the request that would have told the waiting room code to kick in. This way, the bypass action ensures that Waiting Room doesn’t touch your request and the request doesn’t affect your waiting room’s statistics or queuing.</p>
    <div>
      <h2>Bypass rules in action</h2>
      <a href="#bypass-rules-in-action">
        
      </a>
    </div>
    <p>Creating a bypass rule is easy and requires no coding or application changes. Let's walk through a couple of real-world scenarios to demonstrate how easy it is to deploy a bypass rule from the Waiting Room dashboard or API.</p>
    <div>
      <h3>Set up an Administrative IP Bypass Rule via the Waiting Room Dashboard</h3>
      <a href="#set-up-an-administrative-ip-bypass-rule-via-the-waiting-room-dashboard">
        
      </a>
    </div>
    <p>As mentioned before, many customers wanted to ensure that their site administrators and other internal employees–which they identify by IP address–could access their site at all times, regardless of a waiting room's queueing status. Allowing unrestricted access to specific internal employees is especially important before online events when customers pre-queue early site visitors ahead of an event's start time. Without the ability to bypass the waiting room before the event starts, internal employees could not review their event pages in a production environment, adding friction and uncertainty to their review process. Let's see how we can fix that with a Waiting Room bypass rule.</p><p>Before setting up your administrator bypass rule, you can <a href="https://developers.cloudflare.com/firewall/cf-dashboard/rules-lists/manage-items/">create an IP</a> list if you have more than a handful of IPs you'd like to bypass your waiting room. Then, you will need to <a href="https://developers.cloudflare.com/waiting-room/how-to/create-waiting-room/">configure a waiting room</a> from the Waiting Room dashboard. From that waiting room's expanded view, navigate to Manage rules, where you can create, disable, and delete rules for a waiting room.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7nLXLofqRK0U1S8hhCwpBB/d3f9e719e190a59833947020bc20e584/Untitled-3.png" />
            
            </figure><p>Once you have created your waiting room, from that waiting room’s expanded view, select Manage rules to create Waiting Room bypass rules.</p><p>Using the rule builder, give your rule a descriptive name and build your expression. To build an expression for this example, we will select “IP Source Address” from the Field drop-down, “is in list” from the Operator drop-down, and then select the name of the IP list we created earlier.  Once we've built the expression, we can either save this rule as a draft and deploy it later or save the rule and deploy it now.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7GVmQpVKb3VixCNl5cJMiJ/661656758a8964c5d7b6533e1cc02317/Untitled--1--2.png" />
            
            </figure><p>Allow site administrators to bypass your waiting room by creating a Waiting Room bypass rule via the Waiting Room dashboard.</p><p>Once saved, the rule will appear on this waiting room's rules management page along with all other rules for this waiting room. All requests for which this rule's expression evaluates to true will bypass the waiting room. Thus, any user with an IP address from this managed list will never be queued when this rule is enabled.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3Nhijav5NcNydJBITXNrC5/b0ab6e47d6bfa28a419888f5759a9e49/Untitled--2-.png" />
            
            </figure><p>Enable or disabled Waiting Room rules from an individual waiting room’s rule management dashboard.</p><p>For added oversight, there are indicators on the Waiting Room dashboard that clearly signal if a waiting room has any bypass rules enabled. Now that we have deployed the admin bypass rule, we can see from the Waiting Room table that there is an active rule for this waiting room.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4JhsSbz8HTYPiNyvHk6vSo/9f347fbe55a1a99e28582ede188147ec/Screenshot-2022-12-09-at-9.51.26-AM.png" />
            
            </figure><p>Easily glean which waiting rooms have bypass rules active from the Waiting Room table.</p>
    <div>
      <h2>Bypass rules via the Waiting Room API - path bypass example</h2>
      <a href="#bypass-rules-via-the-waiting-room-api-path-bypass-example">
        
      </a>
    </div>
    <p>Another common customer request now achievable using Waiting Room Bypass Rules is path exclusions. As mentioned previously, a waiting room applies to all requests hitting the hostname and path combination of the configured waiting room and any URLs under that path. For many Waiting Room customers, there were specific URLs, paths, or query strings that they did not want a waiting room to apply to under their configured hostname and path. There are various reasons why a customer would want to make exceptions like this but let's consider the following use case to illustrate the utility of bypassing specific parts of a site or application.</p><p>Consider a movie ticketing platform that wants to protect its ticketing web application from purchasing surges due to blockbuster releases. They create a waiting room to cover their ticketing web app by placing it at ticketing.example.com/. After tickets are purchased, the ticketing platform sends movie-goers an email or a text which links back to a URL under ticketing.example.com/. The URL the user receives via text or email is: ticketing.example.com/myaccount/mobiletickets/userverified?ticketid=</p><p>This link opens a page in the user’s mobile browser containing a QR code that the movie theater will scan in place of a physical ticket. They want to ensure that the waiting room does not apply to customers trying to open their mobile tickets.</p><p>To do this, they would create the following bypass rule via the Waiting Room API as follows:</p><p>With a <a href="https://developers.cloudflare.com/waiting-room/how-to/create-waiting-room/#create-a-waiting-room-via-the-api">waiting room already configured</a> at ticketing.example.com/, use the following API call to create a bypass rule:</p>
            <pre><code>curl -X POST \"https://api.cloudflare.com/client/v4/zones/&lt;ZONE_ID&gt;/waiting_rooms/&lt;ROOM_ID&gt;/rules" \-H "Authorization: Bearer &lt;API_TOKEN&gt;" \
-d '{    
"description": "ticket holders bypass waiting room",    
"expression": "ends_with(http.request.uri.path, \"/userverified\")  
 "action": "bypass_waiting_room"
}'</code></pre>
            <p>Let’s break down this call. First, there is the URL, which needs to be populated with the zone id and the waiting room id. Then we pass our API token in the Authorization header. This call will create a new Waiting Room rule that will be added after any existing rules for this waiting room.</p><p>Within the body of the call, first define an optional description parameter. Give the rule an optional <code>description</code> to indicate the purpose of the rule for easy reference later.</p><p><code>"description": "ticket holders bypass waiting room"</code></p><p>Next, write the expression, which defines the exact traffic which should bypass the waiting room. In this example, customers using the direct link sent via text should bypass the waiting room. These direct links end with the path <code>userverified</code> so create an <code>ends_with</code> condition.</p><p><code>"expression": "ends_with(http.request.uri.path, \"/userverified\")</code></p><p>When creating a bypass rule for path, query string, or URLs, make sure to include in the expression exclusions for <a href="https://developers.cloudflare.com/waiting-room/additional-options/waiting-room-rules/bypass-rules/#a-note-on-subrequests">subrequests that load assets</a> on the pages covered by a waiting room. Let’s assume in this example we are hosting assets on a different subdomain not covered by the waiting room. Therefore, we do not need to include these subrequests in the expression.</p><p>Lastly, set the action parameter to <code>bypass_waiting_room</code> to indicate that this traffic should bypass the waiting room and deploy the rule. This customer's waiting room now covers precisely the parts of their application they want to cover. Their waiting room will protect their web application from ticket purchasing traffic while ensuring that customers who need to display their mobile tickets at the movie theater can do so reliably without being placed in a Waiting Room queue.</p><p>With the addition of Waiting Room Bypass Rules, customers now have more flexibility to deploy waiting rooms on their terms, to cover exactly the traffic they want. For more on Waiting Room Bypass Rules and Waiting Room, <a href="https://developers.cloudflare.com/waiting-room/additional-options/waiting-room-rules/bypass-rules/">check out our developer documentation</a>.</p><p>Not using Cloudflare yet? Start now with our <a href="https://www.cloudflare.com/plans/business/">Business plan</a> which includes one basic Waiting Room or <a href="https://www.cloudflare.com/plans/enterprise/discover/contact/">contact us</a> about our advanced Waiting Room with Event Scheduling, Customized Templates, and Waiting Room Bypass Rules available on our <a href="https://www.cloudflare.com/plans/enterprise/">Enterprise plan</a>.</p> ]]></content:encoded>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Application Services]]></category>
            <guid isPermaLink="false">5WrPFRu8C4Q6DQPN7d9rOW</guid>
            <dc:creator>Arielle Olache</dc:creator>
            <dc:creator>Piper McCorkle</dc:creator>
        </item>
        <item>
            <title><![CDATA[Waiting Room Event Scheduling protects your site during online events]]></title>
            <link>https://blog.cloudflare.com/waiting-room-event-scheduling/</link>
            <pubDate>Tue, 12 Jul 2022 12:57:16 GMT</pubDate>
            <description><![CDATA[ With Event Scheduling for Waiting Room, you can protect your servers from being overloaded during your event while delivering a user experience that is unique to the occasion and consistent with your brand ]]></description>
            <content:encoded><![CDATA[ <p></p><p>You've got big plans for your ecommerce strategy in the form of online events — seasonal sales, open registration periods, product drops, ticket sales, and more. With all the hype you've generated, you'll get a lot of site traffic, and that's a good thing! With Waiting Room Event Scheduling, you can protect your servers from being overloaded during your event while delivering a user experience that is unique to the occasion and consistent with your brand. Available now to enterprise customers with an advanced <a href="https://www.cloudflare.com/waiting-room/">Waiting Room</a> subscription, Event Scheduling allows you to plan changes to your waiting room’s settings and custom queueing page ahead of time, ensuring flawless execution of your online event.</p>
    <div>
      <h2>More than always-on protection</h2>
      <a href="#more-than-always-on-protection">
        
      </a>
    </div>
    <p><a href="/cloudflare-waiting-room/">We launched Waiting Room</a> to protect our customers' servers during traffic spikes. Waiting Room sends excess visitors to a virtual queue during traffic surges, letting visitors in dynamically as spots become available on your site. By automatically queuing traffic that exceeds your site's capacity, Waiting Room protects your origin servers and your customer experience. Additionally, the Waiting Room's queuing page can be customized to match the look and feel of your site so that your users never feel as though they have left your application, ensuring a seamless customer experience.</p><p>While many of our customers use Waiting Room as an always-on failsafe against potential traffic spikes, some customers use Waiting Room to manage traffic during time-boxed online events. While these events can undoubtedly result in traffic spikes that Waiting Room safeguards against, they present unique challenges for our customers.</p><p>In the lifecycle of an online event, various stages of the event generally require the settings of a waiting room to be updated. While each customer's event requirements are unique, consider the following customer use cases. To prevent a mad rush to a landing page that could overwhelm their site ahead of an event, some customers want to queue early arrivers in the days or hours leading up to the event. During an event, some customers want to impose stricter limits on how long visitors have to browse and complete transactions to ensure that as many visitors as possible get a fair chance to partake. After an event has concluded, many customers want to offload event traffic, blocking access to the event pages while informing users that the event has ended.</p><p>For each of these scenarios, our customers want to communicate expectations to their users and customize the look and feel of their queuing page to ensure a seamless, on-brand user experience. Combine all the use cases in the example above into one timeline, and you've got at least three event stages that would require waiting room settings and queuing pages to be updated, all with perfect timing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6JiYnl7UEDs6x57aYP0mhg/424f29fa37b8412a09543717651ceac6/image3-4.png" />
            
            </figure><p>While these use cases were technically feasible with Waiting Room, they required on-the-spot updates to its configuration settings. This strategy was not ideal or practical when customers needed to be absolutely sure their waiting room would update in lockstep with the timeline of their event. In short, many customers needed to schedule changes to the behavior of their waiting room ahead of time. We built Event Scheduling to give our customers flexibility and control over when and how their waiting room settings change, ensuring that these changes will happen automatically as planned.</p>
    <div>
      <h2>Introducing Waiting Room Event Scheduling</h2>
      <a href="#introducing-waiting-room-event-scheduling">
        
      </a>
    </div>
    <p>With Event Scheduling, you can schedule cascading changes to your waiting room ahead of time as discrete events. For each waiting room event, you can customize traffic thresholds, session duration, queuing method, and the content and styling of your queuing page. <a href="https://api.cloudflare.com/#waiting-room-create-event">Refer to the Create Event API documentation</a>, for a complete list of customizable event settings.</p>
    <div>
      <h3>New Queuing Methods</h3>
      <a href="#new-queuing-methods">
        
      </a>
    </div>
    <p>Giving our customers the ability to schedule changes to a waiting room's settings is a game-changer for customers with event-based Waiting Room requirements, but we didn't stop there. We've also added two new queueing methods — Reject and Passthrough — to give our customers more options for controlling user flow before, during and after their online events.</p><p>In the example where customers wanted to offload site traffic after an event, the Reject queuing method would do just that! A waiting room with the Reject queuing method configured will offload traffic from your site, presenting users with a static, fully customizable HTML page. Conversely, the Passthrough queuing method allows all visitors unrestricted access to your site. Unlike simply disabling your waiting room to achieve this, Passthrough has the advantage of being scheduled to turn on or off ahead of time and providing user traffic stats through the Waiting Room status endpoint.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5beqwg6B4YfxAIqADp6bcw/160b1935c378eba668bcfdab7c532369/1.png" />
            
            </figure><p>If you prefer to have the waiting room in a completely passive state, having the waiting room on and configured with the Passthrough queueing method allows you to turn on Queue All quickly. Queue All places all new site visitors in a queue, which is a life-saver in the case of unexpected site downtime or any other crisis. Before deactivating Queue All, you can see how many users are waiting to enter your site. Queue All also overrides any active waiting room event, giving you authoritative, fast control in an emergency.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7cIleNThhUIezinKuOhApI/74d121a6e998da54ef6f689f9a5174a2/2.png" />
            
            </figure>
    <div>
      <h3>Event Pre-queuing</h3>
      <a href="#event-pre-queuing">
        
      </a>
    </div>
    <p>As part of an event's configuration, you can also enable a pre-queue, a virtual holding area for visitors that arrive at your event before its start time. Pre-queues add extra protection against traffic spikes that can cause your site to crash.</p><p>To illustrate how, imagine your customer is a devoted fan trying to get tickets to their favorite band's upcoming concert. Ticket sales open in one hour, so they visit your sales page about ten minutes before sales open. There is a static landing page on your site where the ticket sales page will be. The fan starts refreshing the page in the minutes leading up to the start time, hoping to get access as soon as sales open. Now multiply that one hopeful concert-goer by many thousands of fans, and before your sale has even begun, your site is already overwhelmed and at risk of crashing. Having a pre-queue in place protects your site from this type of user activity that has the potential to overwhelm your site at a time when stakes are very high for your brand. And with the ability to fully customize the pre-queuing page, you can still generate the same excitement you would have with your event's landing page.</p><p>Taking it a step further, you can elect to shuffle the pre-queue, randomly assigning users who reach your application during the pre-queue period a place in line when the event starts. If your event uses the First in First Out queuing method, randomizing your pre-queue can help promote fairness, especially if your pre-queuing period spans many time zones. <a href="/waiting-room-random-queueing-and-custom-web-mobile-apps/#:~:text=Random%20queueing%20is,make%20a%20purchase!">Like the Random queuing method</a>, implementing a randomized pre-queue neutralizes the advantage customers in earlier time zones have to grab a place in line ahead of the event's start time. Ultimately, fairness for your event is unique to you and your customers' perspectives and needs. With the order of entry options available for both the pre-queue and overflow queuing during your event, you have control over managing fairness of entry to align with your unique requirements.</p>
    <div>
      <h2>Creating a waiting room event</h2>
      <a href="#creating-a-waiting-room-event">
        
      </a>
    </div>
    <p>Similarly to configuring a waiting room, <a href="https://developers.cloudflare.com/waiting-room/additional-options/create-events/">scheduling events with Waiting Room</a> is incredibly easy and requires no coding or application changes. You will first need to <a href="https://developers.cloudflare.com/waiting-room/how-to/create-waiting-room/">have a baseline waiting room configured</a>. Then, you can schedule events for this waiting room from the <a href="https://dash.cloudflare.com/?to=/:account/:zone/traffic/waiting-rooms">Waiting Room dashboard</a>. In the event creation workflow, you'll indicate when you would like the event to start and end and configure an optional pre-queue.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7tBvOIrSsQL1tlqcDQadv3/d7536cde5cc2a235c617d0e5ad12baec/3.png" />
            
            </figure><p>Unless specified otherwise, your event will always inherit the configuration settings of its associated waiting room. That way, you only need to update the waiting room settings that you would like to change for the duration of the event. You can optionally create a queuing page for your users that is unique to the event and preview what your event queuing page will look like in different queuing states and browsers, ensuring that your end-user’s experience doesn’t result in garbled CSS or broken looking pages!</p><p>Before saving your event, you will be able to review your waiting room and event settings side by side, making it easy to verify how the behavior of your waiting room will change for the duration of the event.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2FHJ5PWMak8d2jztdMPdu1/ad88f845a85661dd9ab223b4ae9bfd14/image2-5.png" />
            
            </figure><p>Once created, your event will appear in the Waiting Room dashboard nested under its associated waiting room. The date of each waiting room's next event is indicated in the dashboard's default view so that you can tell at a glance if any waiting room's settings may change due to an upcoming event. You can expand each waiting room's row to list upcoming events and associated durations. Additionally, if an event is live, a green dot will appear next to this date, adding extra assurance that it has kicked in.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3Ah7XO9MuZMXEYXaMDyjlt/2322b0670a7c40ed75494cf6b6ccde44/4.png" />
            
            </figure>
    <div>
      <h2>Event Scheduling in action</h2>
      <a href="#event-scheduling-in-action">
        
      </a>
    </div>
    <p>Tying it all together, let's walk through a real-world scenario to demonstrate the versatility and practicality of Event Scheduling. In this example, we have a major women's fashion retailer, let's call them Shopflare, with an upcoming flash sale. A flash sale is an online sales event that is different from a regular sale in that it lasts for a brief time and offers substantial discounts or limited stock. Often, retailers target a specific audience using marketing campaigns in the days leading up to a flash sale.</p><p>In our example, Shopflare's marketing team plans to send an email campaign to a set of target customers, promoting their Spring Flash Sale, where they will be offering free shipping and 40% off on their freshest spring arrivals for one day only! How could Shopflare use Waiting Room and Event Scheduling to help this sales event go off without a hitch?</p>
    <div>
      <h3>Preparing for the flash sale</h3>
      <a href="#preparing-for-the-flash-sale">
        
      </a>
    </div>
    <p>One week before the sale, Shopflare's web team creates a landing page with a countdown for their spring flash sale at example.com/sales/spring_flash_sale. They place a waiting room at this URL with a First In First Out queuing method and their desired traffic thresholds to allow traffic while ensuring their site remains performant. They then send an email campaign to their target audience directly linking to the sale's landing page. With their baseline waiting room in place, early traffic to the URL will not overwhelm their site. Shopflare's team also prepares for the upcoming sale by scheduling two cascading waiting room events ahead of time. Let's review Shopflare's flash sale requirements related to Waiting Room and review the steps they would take with Event Scheduling to satisfy them.</p>
    <div>
      <h3>Pre-queueing and event overflow queuing</h3>
      <a href="#pre-queueing-and-event-overflow-queuing">
        
      </a>
    </div>
    <p>A few hours before the sale starts, Shopflare wants to allow shoppers to start "lining up" to secure a spot ahead of those who arrive after the event start time. They want to create a lottery for these early arrivers, randomly assigning them a place in line when the sale starts to mitigate the advantage that customers from earlier time zones have to secure a spot in line. To do this, they would create an event for the waiting room they have already configured.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5daYKQ0DnbB3V9zAFSiTv0/3df051a276fa0ac2691c1b874735bf25/5.png" />
            
            </figure><p>The event creation workflow consists of four main steps: Details, Settings, Customization, and Review. On the Details page of the event creation workflow, they would enter their sale start and end times, set the start time of the pre-queue and enable “Shuffle at Event Start” to create a randomized pre-queue.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2obbiR3ZzeQDAQiIYyW8qa/f0c3cd5c98a0d5acc6760cbee5e5938c/10.png" />
            
            </figure><p>While the sale is in progress, Shopflare wants an overflow queue to protect their site from being overwhelmed by traffic in excess of their waiting room limits, letting these users in First in First Out when spots open up on their site. Since their underlying waiting room is already configured with the traffic thresholds they want to enforce for the duration of the event, they would simply leave the Settings page of the event creation workflow unchanged and proceed to Customization.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3PjA2bwadKhdpNRqZtFPqE/833dc9240d2cde90a6fb5796de05840b/image13-2.png" />
            
            </figure><p>On the Customization step, Shopflare will create a custom queuing experience for their sale by uploading a custom HTML template that contains the HTML for both their pre-queueing page and their overflow queue.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1mi7TXOylH1RWARU3Alm3x/d130733626976ef9fffe5823bb91fc41/6.png" />
            
            </figure><p>Shopflare wants their pre-queuing page to get shoppers excited about the beginning of the sale. They ensure it is branded and unique to the flash sale while setting clear expectations for shoppers. For their overflow queue, they want the same look and feel of their pre-queueing page, with updated messaging that gives shoppers an estimated wait time and explains the reason for queuing. Check out the two sample queuing pages below to see how they create a unique and informative experience for their queued customers in both the pre-queue and overflow queue.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3itstmAHvGAeHQEtv5ZllB/f34cd4b317f040cff990531fca66d6a4/unnamed-3.png" />
            
            </figure><p>Shopflare’s pre-queuing page is customized for the brand and the flash sale. Shoppers are informed of the time until the event starts as well as are reassured that the page is automatically refreshing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6vsBVyNBPDZjPJNuATIdeB/3e4803cdb2b229391f739200d9c6aebd/unnamed2.png" />
            
            </figure><p>Shopflare’s overflow queuing page is also customized for the brand and the flash sale. Shoppers are assured they are in the right place, given an estimated wait time, and an explanation for queuing.</p>
    <div>
      <h3>Sale conclusion</h3>
      <a href="#sale-conclusion">
        
      </a>
    </div>
    <p>Once the sale has ended, Shopflare wants to allow active shoppers a five-minute grace period to complete their purchases without admitting any more new visitors. For 48 hours post-sale, they would like to present all visitors with a static page letting them know the sale has concluded while providing a redirect link back to their homepage. To achieve this, Shopflare would create another event for the baseline waiting room that starts when the previous event ends without a pre-queue enabled.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2WnZg7Vv2BNvUzCb7F3TaN/374aba95071fccf84088a812985e2b87/image14-2.png" />
            
            </figure><p>To offload all new site traffic after the sale has ended while giving active shoppers a five-minute grace period, from the Settings page of the event creation workflow, they would set session duration to five minutes, disable session renewal and select the Reject All queuing method.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7ie2hwOKbORMOUucnXEJpq/725011dd369560e5d0bf2b746cb389c9/image12-1.png" />
            
            </figure><p>Once again, on the Customization tab, they would elect to override the underlying waiting room template with a custom event template and upload their custom Reject page HTML. They would then Review and save their event and it will appear along with their previously created event in the Waiting Room dashboard.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5F5NZrdA6XjLS1TXES15cI/a3cf3305ef742d1dcddd98a189a873e2/7.png" />
            
            </figure><p>And that's it! With their waiting room events in place, Shopflare can rest assured that their site will be protected and that their customers have an on-brand and transparent shopping experience on the big day. Each customer and online event is unique. However, you choose to manage your user traffic for your online event, Event Scheduling for Cloudflare Waiting Rooms offers the options necessary to deliver a stellar and fair user experience while protecting your application during your online event. We can't wait to support you in your next online event!</p><p>For more on Event Scheduling and Waiting Room, <a href="https://developers.cloudflare.com/waiting-room/additional-options/create-events/">check out our developer documentation.</a></p><p>Not using Cloudflare yet? Start now with our <a href="https://www.cloudflare.com/plans/business/">Business plan</a> which includes one basic Waiting Room or <a href="https://www.cloudflare.com/plans/enterprise/discover/contact/">contact us</a> about our advanced Waiting Room with Event Scheduling available on our <a href="https://www.cloudflare.com/plans/enterprise/">Enterprise plan</a>.</p> ]]></content:encoded>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">4mCrcQxvaWybzaWmuEmswc</guid>
            <dc:creator>Arielle Olache</dc:creator>
        </item>
        <item>
            <title><![CDATA[Get updates on the health of your origin where you need them]]></title>
            <link>https://blog.cloudflare.com/get-updates-on-the-health-of-your-origin-where-you-need-them/</link>
            <pubDate>Tue, 22 Mar 2022 15:08:45 GMT</pubDate>
            <description><![CDATA[ We are thrilled to announce Health Checks availability within Cloudflare’s centralized Notification tab, available to all Pro, Business, and Enterprise customers. Now, you can get critical alerts on the health of your origin without checking your inbox! ]]></description>
            <content:encoded><![CDATA[ <p></p><p>We are thrilled to announce the availability of Health Checks in the Cloudflare Dashboard’s Notifications tab, available to all Pro, Business, and Enterprise customers. Now, you can get critical alerts on the health of your origin without checking your inbox! Keep reading to learn more about how this update streamlines notification management and unlocks countless ways to stay informed on the health of your servers.</p>
    <div>
      <h2>Keeping your site reliable</h2>
      <a href="#keeping-your-site-reliable">
        
      </a>
    </div>
    <p>We first announced Health Checks when we realized some customers were setting up Load Balancers for their origins to monitor the origins’ availability and responsiveness. The Health Checks product provides a similarly powerful interface to Load Balancing, offering users the ability to ensure their origins meet criteria such as reachability, responsiveness, correct HTTP status codes, and correct HTTP body content. Customers can also receive email alerts when a Health Check finds their origin is unhealthy based on their custom criteria. In building a more focused product, we’ve added a slimmer, monitoring-based configuration, Health Check Analytics, and made it available for all paid customers. Health Checks run in multiple locations within Cloudflare’s edge network, meaning customers can monitor site performance across geographic locations.</p>
    <div>
      <h2>What’s new with Health Checks Notifications</h2>
      <a href="#whats-new-with-health-checks-notifications">
        
      </a>
    </div>
    <p>Health Checks email alerts have allowed customers to respond quickly to incidents and guarantee minimum disruption for their users. As before, Health Checks users can still select up to 20 email recipients to notify if a Health Check finds their site to be unhealthy. And if email is the right tool for your team, we’re excited to share that we have jazzed up our notification emails and added details on which Health Check triggered the notification, as well as the status of the Health Check:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6wQaM5dANtGNveurNe8YL8/ff5aba1af881fa0fcde15b0067cde725/image9-1.png" />
            
            </figure><p><i>New Health Checks email format with Time, Health Status, and Health Check details</i></p><p>That being said, monitoring an inbox is not ideal for many customers needing to stay proactively informed. If email is not the communication channel your team typically relies upon, checking emails can at best be inconvenient and, at worst, allow critical updates to be missed. That's where the Notifications dashboard comes in.</p><p>Users can now create Health Checks notifications within the Cloudflare Notifications dashboard. By integrating Health Checks with Cloudflare's powerful Notification platform, we have unlocked myriad new ways to ensure customers receive critical updates for their origin health. One of the key benefits of Cloudflare's Notifications is webhooks, which give customers the flexibility to sync notifications with various external services. Webhook responses contain JSON-encoded information, allowing users to ingest them into their internal or third-party systems.</p><p>For real-time updates, users can now use webhooks to send Health Check alerts directly to their preferred instant messaging platforms such as Slack, Google Chat, or Microsoft Teams, to name a few. Beyond instant messaging, customers can also use webhooks to send Health Checks notifications to their internal APIs or their <a href="https://www.cloudflare.com/learning/security/what-is-siem/">Security Information and Event Management (SIEM)</a> platforms, such as DataDog or Splunk, giving customers a single pane of glass for all Cloudflare activity, including notifications and event logs. For more on how to configure popular webhooks, <a href="https://developers.cloudflare.com/fundamentals/notifications/create-notifications/configure-webhooks">check out our developer docs</a>. Below, we'll walk you through a couple of powerful webhook applications. But first, let's highlight a couple of other ways the update to Health Checks notifications improves user experience.</p><p>By including Health Checks in the Notifications tab, users need only to access one page for a single source of truth where they can manage their account notifications.  For added ease of use, users can also migrate to Notification setup directly from the Health Check creation page as well.  From within a Health Check, users will also be able to see what Notifications are tied to it.</p><p>Additionally, configuring notifications for multiple Health Checks is now simplified. Instead of configuring notifications one Health Check at a time, users can now set up notifications for multiple or even all Health Checks from a single workflow.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5KkiuxbDOJYQxkDjWPkkeu/74d1bfbb4303e7f4cab1b656721a392e/image6-8.png" />
            
            </figure><p>Also, users can now access Health Checks notification history, and Enterprise customers can integrate Health Checks <a href="https://developers.cloudflare.com/fundamentals/notifications/create-notifications/create-pagerduty">directly with PagerDuty</a>. Last but certainly not least, as Cloudflare’s Notifications infrastructure grows in capabilities, Health Checks will be able to leverage all of these improvements. This guarantees Health Checks users the most timely and versatile notification capabilities that Cloudflare offers now and into the future.</p>
    <div>
      <h2>Setting up a Health Checks webhook</h2>
      <a href="#setting-up-a-health-checks-webhook">
        
      </a>
    </div>
    <p>To get notifications for health changes at an origin, <a href="https://support.cloudflare.com/hc/en-us/articles/4404867308429-About-Health-Checks">we first need to set up a Health Check for it.</a> In this example, we'll monitor HTTP responses: leave the Type and adjacent fields to their defaults. We will also monitor HTTP response codes: add `200` as an expected code, which will cause any other HTTP response code to trigger an unhealthy status.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6x9auU4cTDBaE0jmDBrhxZ/3aa5c3f88ab7ea8914e83c770b19c548/image13.png" />
            
            </figure>
    <div>
      <h3>Creating the webhook notification policy</h3>
      <a href="#creating-the-webhook-notification-policy">
        
      </a>
    </div>
    <p>Once we’ve got our Health Check set up, we can create a webhook to link it to. Let’s start with a popular use case and send our Health Checks to a Slack channel. Before creating the webhook in the Cloudflare Notifications dashboard, we <a href="https://api.slack.com/messaging/webhooks">enable webhooks in our Slack workspace and retrieve the webhook URL of the Slack channel we want to send notifications to.</a> Next, we navigate to our account’s Notifications tab to add the Slack webhook as a Destination, entering the name and URL of our webhook — the secret will populate automatically.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/tZHXzAsptIeB2zPRASSXc/2d98e2b05b16508f8a5942bf090214e9/image2-91.png" />
            
            </figure><p><i>Webhook creation page with the following user input: Webhook name, Slack webhook url, and auto-populated Secret</i></p><p>Once we hit <b>Save and Test</b>, we will receive a message in the designated Slack channel verifying that our webhook is working.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7Is2c2YurjdOtduCuqNJB1/b50c6e395d4407023a1484945e1751f7/image5-23.png" />
            
            </figure><p><i>Message sent in Slack via the configured webhook, verifying the webhook is working</i></p><p>This webhook can now be used for any notification type available in the Notifications dashboard. To have a Health Check notification sent to this Slack channel, simply add a new Health Check notification from the Notifications dashboard, selecting the Health Check(s) to tie to this webhook and the Slack webhook we just created. And, voilà! Anytime our Health Check detects a response status code other than 200 or goes from unhealthy to healthy, this Slack channel will be notified.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7vlEAwkWNFpTbQBd3h8nj3/a9ed32ad15594f48f9b0b49059223053/image10-1.png" />
            
            </figure><p><i>Health Check notification sent to Slack, indicating our server is online and Healthy.</i></p>
    <div>
      <h3>Create an Origin Health Status Page</h3>
      <a href="#create-an-origin-health-status-page">
        
      </a>
    </div>
    <p>Let’s walk through another powerful webhooks implementation with Health Checks. Using the Health Check we configured in our last example, let’s create a simple status page using Cloudflare Workers and Durable Objects that stores an origin’s health, updates it upon receiving a webhook request, and displays a status page to visitors.</p><p><b>Writing our worker</b>You can find the code for this example <a href="https://github.com/georgethomas111/status-page">in this GitHub repository</a>, if you want to clone it and try it out.</p><p>We’ve got our Health Check set up, and we’re ready to write our worker and durable object. To get started, we first need to <a href="https://developers.cloudflare.com/workers/cli-wrangler/install-update">install</a> wrangler, our CLI tool for testing and deploying more complex worker setups.</p>
            <pre><code>$ wrangler -V
wrangler 1.19.8</code></pre>
            <p>The examples in this blog were tested in this wrangler version.</p><p>Then, to speed up writing our worker, we will use a template to generate a project:</p>
            <pre><code>$ wrangler generate status-page [https://github.com/cloudflare/durable-objects-template](https://github.com/cloudflare/durable-objects-template)
$ cd status-page</code></pre>
            <p>The template has a Durable Object with the name <code>Counter</code>. We’ll rename that to <code>Status</code>, as it will store and update the current state of the page.</p><p>For that, we update <code>wrangler.toml</code> to use the correct name and type, and rename the <code>Counter</code> class in <code>index.mjs</code>.</p>
            <pre><code>name = "status-page"
# type = "javascript" is required to use the `[build]` section
type = "javascript"
workers_dev = true
account_id = "&lt;Cloudflare account-id&gt;"
route = ""
zone_id = ""
compatibility_date = "2022-02-11"
 
[build.upload]
# Upload the code directly from the src directory.
dir = "src"
# The "modules" upload format is required for all projects that export a Durable Objects class
format = "modules"
main = "./index.mjs"
 
[durable_objects]
bindings = [{name = "status", class_name = "Status"}]</code></pre>
            <p>Now, we’re ready to fill in our logic. We want to serve two different kinds of requests: one at <code>/webhook</code> that we will pass to the Notification system for updating the status, and another at <code>/</code> for a rendered status page.</p><p>First, let’s write the <code>/webhook</code> logic. We will receive a JSON object with a <code>data</code> and a <code>text</code> field. The `data` object contains the following fields:</p>
            <pre><code>time - The time when the Health Check status changed.
status - The status of the Health Check.
reason - The reason why the Health Check failed.
name - The Health Check name.
expected_codes - The status code the Health Check is expecting.
actual_code - The actual code received from the origin.
health_check_id - The id of the Health Check pushing the webhook notification. </code></pre>
            <p>For the status page we are using the Health Check <code>name</code>, <code>status</code>, and <code>reason</code> (the reason a Health Check became unhealthy, if any) fields. The <code>text</code> field contains a user-friendly version of this data, but it is more complex to parse.</p>
            <pre><code> async handleWebhook(request) {
  const json = await request.json();
 
  // Ignore webhook test notification upon creation
  if ((json.text || "").includes("Hello World!")) return;
 
  let healthCheckName = json.data?.name || "Unknown"
  let details = {
    status: json.data?.status || "Unknown",
    failureReason: json.data?.reason || "Unknown"
  }
  await this.state.storage.put(healthCheckName, details)
 }</code></pre>
            <p>Now that we can store status changes, we can use our state to render a status page:</p>
            <pre><code> async statusHTML() {
  const statuses = await this.state.storage.list()
  let statHTML = ""
 
  for(let[hcName, details] of statuses) {
   const status = details.status || ""
   const failureReason = details.failureReason || ""
   let hc = `&lt;p&gt;HealthCheckName: ${hcName} &lt;/p&gt;
         &lt;p&gt;Status: ${status} &lt;/p&gt;
         &lt;p&gt;FailureReason: ${failureReason}&lt;/p&gt; 
         &lt;br/&gt;`
   statHTML = statHTML + hc
  }
 
  return statHTML
 }
 
 async handleRoot() {
  // Default of healthy for before any notifications have been triggered
  const statuses = await this.statusHTML()
 
  return new Response(`
     &lt;!DOCTYPE html&gt;
     &lt;head&gt;
      &lt;title&gt;Status Page&lt;/title&gt;
      &lt;style&gt;
       body {
        font-family: Courier New;
        padding-left: 10vw;
        padding-right: 10vw;
        padding-top: 5vh;
       }
      &lt;/style&gt;
     &lt;/head&gt;
     &lt;body&gt;
       &lt;h1&gt;Status of Production Servers&lt;/h1&gt;
       &lt;p&gt;${statuses}&lt;/p&gt;
     &lt;/body&gt;
     `,
   {
    headers: {
     'Content-Type': "text/html"
    }
   })
 }</code></pre>
            <p>Then, we can direct requests to our two paths while also returning an error for invalid paths within our durable object with a <code>fetch</code> method:</p>
            <pre><code>async fetch(request) {
  const url = new URL(request.url)
  switch (url.pathname) {
   case "/webhook":
    await this.handleWebhook(request);
    return new Response()
   case "/":
    return await this.handleRoot();
   default:
    return new Response('Path not found', { status: 404 })
  }
 }</code></pre>
            <p>Finally, we can call that <code>fetch</code> method from our worker, allowing the external world to access our durable object.</p>
            <pre><code>export default {
 async fetch(request, env) {
  return await handleRequest(request, env);
 }
}
async function handleRequest(request, env) {
 let id = env.status.idFromName("A");
 let obj = env.status.get(id);
 
 return await obj.fetch(request);
}</code></pre>
            
    <div>
      <h3>Testing and deploying our worker</h3>
      <a href="#testing-and-deploying-our-worker">
        
      </a>
    </div>
    <p>When we’re ready to deploy, it’s as simple as running the following command:</p><p><code>$ wrangler publish --new-class Status</code></p><p>To test the change, we create a webhook pointing to the path the worker was deployed to. On the Cloudflare account dashboard, navigate to Notifications &gt; Destinations, and create a webhook.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7DXxm3RcVgUe1EWhozBBqR/8d1436e9588ce2de2967b150ea8a2f08/image11.png" />
            
            </figure><p><i>Webhook creation page, with the following user input: name of webhook, destination URL, and optional secret is left blank.</i></p><p>Then, while still in the Notifications dashboard, create a Health Check notification tied to the status page webhook and Health Check.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/ltPFjk9hURZNEk1DfzXSm/d2432cc32fb4cf5a9c1294a3673a4a38/image4-26.png" />
            
            </figure><p><i>Notification creation page, with the following user input: Notification name and the Webhook created in the previous step added.</i></p><p>Before getting any updates the <code>status-page</code> worker should look like this:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5vSrpTmAC3habEEBTyvuzu/437509c50d8649a232e4cf4e05aff26e/image1-103.png" />
            
            </figure><p><i>Status page without updates reads: “Status of Production Servers”</i></p><p>Webhooks get triggered when the Health Check status changes. To simulate the change of Health Check status we take the origin down, which will send an update to the worker through the webhook. This causes the status page to get updated.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1Bv5XIq7lDRy5KdGMNxs9i/5422ab4e4091c0237c76dc445cd3e823/image8-3.png" />
            
            </figure><p><i>Status page showing the name of the Health Check as "configuration-service", Status as "Unhealthy", and the failure reason as "TCP connection failed".</i> </p><p>Next, we simulate a return to normal by changing the Health Check expected status back to 200. This will make the status page show the origin as healthy.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6lyFS1mDPReF5CPG4ZU6jK/1b07d824de54eebce83879300820ccb0/image7-3.png" />
            
            </figure><p><i>Status page showing the name of the Health Check as "configuration-service", Status as "Healthy", and the failure reason as "No failures".</i> </p><p>If you add more Health Checks and tie them to the webhook durable object, you will see the data being added to your account.</p>
    <div>
      <h3>Authenticating webhook requests</h3>
      <a href="#authenticating-webhook-requests">
        
      </a>
    </div>
    <p>We already have a working status page! However, anyone possessing the webhook URL would be able to forge a request, pushing arbitrary data to an externally-visible dashboard. Obviously, that’s not ideal. Thankfully, webhooks provide the ability to authenticate these requests by supplying a secret. Let’s create a new webhook that will provide a secret on every request. We can generate a secret by generating a pseudo-random UUID with Python:</p>
            <pre><code>$ python3
&gt;&gt;&gt; import uuid
&gt;&gt;&gt; uuid.uuid4()
UUID('4de28cf2-4a1f-4abd-b62e-c8d69569a4d2')</code></pre>
            <p>Now we create a new webhook with the secret.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3DvDHuoGw8qliF2bsYP7rZ/38e29d91df8569ded442bd7bd4bb95b8/image3-42.png" />
            
            </figure><p><i>Webhook creation page, with the following user input: name of webhook, destination URL, and now with a secret added.</i></p><p>We also want to provide this secret to our worker. Wrangler has a command that lets us save the secret.</p>
            <pre><code>$ wrangler secret put WEBHOOK_SECRET
Enter the secret text you'd like assigned to the variable WEBHOOK_SECRET on the script named status-page:
4de28cf2-4a1f-4abd-b62e-c8d69569a4d2
? Creating the secret for script name status-page
✨ Success! Uploaded secret WEBHOOK_SECRET.</code></pre>
            <p>Wrangler will prompt us for the secret, then provide it to our worker. Now we can check for the token upon every webhook notification, as the secret is provided by the header <code>cf-webhook-auth</code>. By checking the header’s value against our secret, we can authenticate incoming webhook notifications as genuine. To do that, we modify <code>handleWebhook</code>:</p>
            <pre><code> async handleWebhook(request) {
  // ensure the request we receive is from the Webhook destination we created
  // by examining its secret value, and rejecting it if it's incorrect
  if((request.headers.get('cf-webhook-auth') != this.env.WEBHOOK_SECRET) {
    return
   }
  ...old code here
 }</code></pre>
            <p>This origin health status page is just one example of the versatility of webhooks, which allowed us to leverage Cloudflare Workers and Durable Objects to support a custom Health Checks application. From highly custom use cases such as this to more straightforward, out-of-the-box solutions, pairing webhooks and Health Checks empowers users to respond to critical origin health updates effectively by delivering that information where it will be most impactful.</p>
    <div>
      <h2>Migrating to the Notifications Dashboard</h2>
      <a href="#migrating-to-the-notifications-dashboard">
        
      </a>
    </div>
    <p>The Notifications dashboard is now the centralized location for most Cloudflare services. In the interest of consistency and streamlined administration, we will soon be limiting Health Checks notification setup to the Notifications dashboard.  Many existing Health Checks customers have emails configured via our legacy alerting system. Over the next three months, we will support the legacy system, giving customers time to transition their Health Checks notifications to the Notifications dashboard. Customers can expect the following timeline for the phasing out of existing Health Checks notifications:</p><ul><li><p>For now, customers subscribed to legacy emails will continue to receive them unchanged, so any parsing infrastructure will still work. From within a Health Check, you will see two options for configuring notifications–the legacy format and a deep link to the Notifications dashboard.</p></li><li><p>On <b>May 24, 2022,</b> we will disable the legacy method for the configuration of email notifications from the Health Checks dashboard.</p></li><li><p>On <b>June 28, 2022,</b> we will stop sending legacy emails, and adding new emails at the <code>/healthchecks</code> endpoint will no longer send email notifications.</p></li></ul><p>We strongly encourage all our users to migrate existing Health Checks notifications to the Notifications dashboard within this timeframe to avoid lapses in alerts.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Notifications]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">5bgBhuIdy5M2zE86JGhvp7</guid>
            <dc:creator>Darius Jankauskas</dc:creator>
            <dc:creator>Arielle Olache</dc:creator>
            <dc:creator>George Thomas</dc:creator>
        </item>
    </channel>
</rss>