
<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>Sun, 05 Apr 2026 03:55:30 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Waiting Room: Random Queueing and Custom Web/Mobile Apps]]></title>
            <link>https://blog.cloudflare.com/waiting-room-random-queueing-and-custom-web-mobile-apps/</link>
            <pubDate>Thu, 07 Oct 2021 15:07:17 GMT</pubDate>
            <description><![CDATA[ Today, we are announcing Waiting Room’s general availability and several new features that have user experience in mind — an alternative queueing method and support for custom web/mobile applications! ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Today, we are announcing the general availability of <a href="/cloudflare-waiting-room/">Cloudflare Waiting Room</a> to customers on our <a href="https://www.cloudflare.com/plans/enterprise/">Enterprise plans</a>, making it easier than ever to protect your website against traffic spikes. We are also excited to present several new features that have user experience in mind — an alternative queueing method and support for custom web/mobile applications.</p>
    <div>
      <h3>First-In-First-Out (FIFO) Queueing</h3>
      <a href="#first-in-first-out-fifo-queueing">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5HimJUBjwlefUf3zFKz1kV/14b81b8142f7c074a02a0407fd94fdbb/image3-11.png" />
            
            </figure><p>Whether you’ve waited to check out at a supermarket or stood in line at a bank, you’ve undoubtedly experienced FIFO queueing. FIFO stands for First-In-First-Out, which simply means that people are seen in the order they arrive — i.e., those who arrive first are processed before those who arrive later.</p><p>When Waiting Room was introduced earlier this year, it was first deployed to protect COVID-19 vaccine distributors from overwhelming demand — a service we offer free of charge under <a href="/project-fair-shot/">Project Fair Shot</a>. At the time, FIFO queueing was the natural option due to its wide acceptance in day-to-day life and accurate estimated wait times. One problem with FIFO is that users who arrive later could see long estimated wait times and decide to abandon the website.</p><p>We take customer feedback seriously and improve products based on it. A frequent request was to handle users irrespective of the time they arrive in the Waiting Room. In response, we developed an additional approach: random queueing.</p>
    <div>
      <h3>A New Approach to Fairness: Random Queueing</h3>
      <a href="#a-new-approach-to-fairness-random-queueing">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6Y5uqRgnOlkffp4VrgWNyA/6ea17980be8c3453471dfaf7bf38bc4d/image8-9.png" />
            
            </figure><p>You can think of random queueing as participating in a raffle for a prize. In a raffle, people obtain tickets and put them into a big container. Later, tickets are drawn at random to determine the winners. The more time you spend in the raffle, the better your chances of winning at least once, since there will be fewer tickets in the container. No matter what, everyone participating in the raffle has an opportunity to win.</p><p>Similarly, in a random queue, users are selected from the Waiting Room at random, regardless of their initial arrival time. This means that you could be let into the application before someone who arrived earlier than you, or vice versa. Just like how you can buy more tickets in a raffle, joining a random queue earlier than someone else will give you more attempts to be accepted, but does not guarantee you will be let in. However, at any particular time, you will have the same chance to be let into the website as anyone else. This is different from a raffle, where you could have more tickets than someone else at a given time, providing you with an advantage.</p><p>Random queueing is designed to give everyone a fair chance. Imagine waking up excited to purchase new limited-edition sneakers only to find that the FIFO queue is five hours long and full of users that either woke up in the middle of the night to get in line or joined from earlier time zones. Even if you waited five hours, those sneakers would likely be sold out by the time you reach the website. In this case, you’d probably abandon the Waiting Room completely and do something else. On the other hand, if you were aware that the queue was random, you’d likely stick around. After all, you have a chance to be accepted and make a purchase!</p><p>As a result, random queueing is perfect for short-lived scenarios with lots of hype, such as product launches, holiday traffic, special events, and limited-time sales.</p><p>By contrast, when the event ends and traffic returns to normal, a FIFO queue is likely more suitable, since its widely accepted structure and accurate estimated wait times provide a consistent user experience.</p>
    <div>
      <h3>How Does Random Queueing Work?</h3>
      <a href="#how-does-random-queueing-work">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4DMz1FTEC6lJp9AV5Mdb1e/e198bba78f0fa5e5d77daece125b683d/image9-5.png" />
            
            </figure><p>Perhaps the best part about random queueing is that it maintains the same internal structure that powers FIFO. As a result, if you <a href="https://developers.cloudflare.com/waiting-room/reference/queueing-methods#changing-queueing-methods">change the queueing method</a> in the dashboard — even when you may be actively queueing users — the transition to the new method is seamless. Imagine you have users 1, 2, 3, 4, and 5 waiting in a FIFO queue in the order 5 →  4 → 3 → 2 → 1, where user 1 will be the next user to access the application. Let’s assume you switch to random queueing. Now, any user can be accepted next. Let’s assume user 4 is accepted. If you decide to immediately switch back to FIFO queueing, the queue will reflect the order 5 → 3 → 2 → 1. In other words, transitioning from FIFO to random and back to FIFO will respect the initial queue positions of the users! But how does this work? To understand, we first need to remember <a href="/building-waiting-room-on-workers-and-durable-objects/">how we built Waiting Room</a> for FIFO.</p><p>Recall the Waiting Room configurations:</p><ul><li><p><i>Total Active Users</i>. The total number of active users that can be using the application at any given time.</p></li><li><p><b><i>New Users Per Minute.</i></b> The maximum number of new users per minute that can be accepted to the application.</p></li></ul><p>Next, remember that Waiting Room is powered by cookies. When you join the Waiting Room for the first time, you are assigned an encrypted cookie. You bring this cookie back to the Waiting Room and update it with every request, using it to prove your initial arrival time and status.</p><p>Properties in the Waiting Room cookie include:</p><ul><li><p><b>bucketId</b>. The timestamp rounded down to the nearest minute of the user’s first request to the Waiting Room. If you arrive at 10:23:45, you will be grouped into a bucket for 10:23:00.</p></li><li><p><b>acceptedAt.</b> The timestamp when the user got accepted to the origin website for the first time.</p></li><li><p><b>refreshIntervalSeconds</b>. When queueing, this is the number of seconds the user must wait before sending another request to the Waiting Room.</p></li><li><p><b>lastCheckInTime</b>. The last time each user checked into the Waiting Room or origin website. When queueing, this is only updated for requests every refreshIntervalSeconds.</p></li></ul><p>For any given minute, we can calculate the number of users we can let into the origin website. Let’s say we deploy a Waiting Room on "<a href="https://example.com/waitingroom">https://example.com/waitingroom</a>" that can support 10,000 <i>Total Active Users</i>, and we allow up to 2,000 <i>New Users Per Minute.</i> If there are currently 7,000 active users on the website, we have 10,000 - 7,000 = 3,000 open slots. However, we need to take the minimum (3,000, 2,000) = 2,000 since we need to respect the <i>New Users Per Minute</i> limit. Thus, we have 2,000 available slots we can give out.</p><p>Let’s assume there are 2,500 queued users that joined over the last three minutes in groups of 500, 1,000, and 1,000, respectively for the timestamps 15:54, 15:55, and 15:56. To respect FIFO queueing, we will take our 2,000 available slots and try to reserve them for users who joined first. Thus, we will reserve 500 available slots for the users who joined at 15:54 and then reserve 1000 available slots for the users who joined at 15:55. When we get to the users for 15:56, we see that we only have 500 slots left, which is not enough for the 1,000 queued users for this minute:</p>
            <pre><code>{
	"activeUsers": 7000,
	"buckets": [{
			"key": "Thu, 27 May 2021 15:54:00 GMT",
			"data": {
				"waiting": 500,
				"reservedSlots": 500
			}
		},
		{
			"key": "Thu, 27 May 2021 15:55:00 GMT",
			"data": {
				"waiting": 1000,
				"reservedSlots": 1000
			}
		},
		{
			"key": "Thu, 27 May 2021 15:56:00 GMT",
			"data": {
				"waiting": 1000,
				"reservedSlots": 500
			}
		}
	]
}</code></pre>
            <p>Since we have reserved slots for all users with bucketIds of 15:54 and 15:55, they can be let into the origin website from any data center. However, we can only let in a subset of the users who initially arrived at 15:56.</p><table><tr><td><p><b>Timestamp (bucketId)</b></p></td><td><p><b>Queued Users</b></p></td><td><p><b>Reserved Slots</b></p></td><td><p><b>Strategy</b></p></td></tr><tr><td><p>15:54</p></td><td><p>500</p></td><td><p>500</p></td><td><p>Accept all users</p></td></tr><tr><td><p>15:55</p></td><td><p>1,000</p></td><td><p>1,000</p></td><td><p>Accept all users</p></td></tr><tr><td><p>15:56</p></td><td><p>1,000</p></td><td><p>500</p></td><td><p>Accept subset of users</p></td></tr></table><p>These 500 slots for 15:56 are allocated to each Cloudflare edge data center based on its respective historical traffic data, and further divided for each <a href="https://workers.cloudflare.com/">Cloudflare Worker</a> within the data center. For example, let’s assume there are two data centers — Nairobi and Dublin — which share 60% and 40% of the traffic, respectively, for this minute. In this case, we will allocate 500 * .6 = 300 slots for Nairobi and 500 * .4 = 200 slots for Dublin. In Nairobi, let’s say there are 3 active workers, so we will grant each of them 300 / 3 = 100 slots. If you make a request to a worker in Nairobi and your bucketId is 15:56, you will be allowed in and consume a slot if the worker still has at least one of its 100 slots available. Since we have reserved all 2,000 available slots, users with bucketIds after 15:56 will have to continue queueing.</p><p>Let’s modify this case and assume we only have 200 queued users, all of which are in the 15:54 bucket. First, we reserve 200 slots for these queued users, leaving us 2,000 - 200 = 1,800 remaining slots. Since we have reserved slots for all queued users, we can use the remaining 1,800 slots on <i>new users</i> — people who have just made their first request to the Waiting Room and don’t have a cookie or bucketId yet. Similar to how we handle buckets with fewer slots than queued users, we will distribute these 1,800 slots to each data center, allocating 1,800 * .6 = 1,080 to Nairobi and 1,800 * .4 = 720 to Dublin. In Nairobi, we will split these equally across the 3 workers, giving them 1,080 / 3 = 360 slots each. If you are a new user making a request to a worker in Nairobi, you will be accepted and take a slot if the worker has at least one of its 360 slots available, otherwise you will be marked as a queued user and enter the Waiting Room.</p><p>Now that we have outlined the concepts for FIFO, we can understand how random queueing operates. Simply put, random queueing functions the same way as FIFO, except we <i>pretend</i> that every user is new. In other words, we will not look at reserved slots when making the decision if the user should be let in. Let’s revisit the last case with 200 queued users in the 15:54 bucket and 2,000 available slots. When random queueing, we allocate the full 2,000 slots to new users, meaning Nairobi gets 2,000 * .6 = 1,200 slots and each of its 3 workers gets 1,200 / 3 = 400 slots. No matter how many users are queued or freshly joining the Waiting Room, all of them will have a chance at taking these slots.</p><p>Finally, let’s reiterate that we are only <i>pretending</i> that all users are new — we still assign them to bucketIds and reserve slots as if we were FIFO queueing, but simply don’t make any use of this logic while random queueing is active. That way, we can maintain the same FIFO structure while we are random queueing so that if necessary, we can smoothly transition back to FIFO queueing and respect initial user arrival times.</p>
    <div>
      <h3>How “Random” is Random Queueing?</h3>
      <a href="#how-random-is-random-queueing">
        
      </a>
    </div>
    <p>Since random queueing is basically a race for available slots, we were concerned that it could be exploited if the available user slots and the queued user check-ins did not occur randomly.</p><p>To ensure all queued users can attempt to get into the website at the same rate, we store (in the encrypted cookie) the last time each user checked into the Waiting Room (lastCheckInTime) to prevent them from attempting to gain access to the website until a number of seconds have passed (refreshIntervalSeconds). This means that spamming the page refresh button will not give you an advantage over other queued users! Be patient — the browser will refresh automatically the moment you are eligible for another chance.</p><p>Next, let’s imagine five queued users checking into the Waiting Room every refreshIntervalSeconds=30 at approximately the :00 and :30 minute marks. A new queued user joins the Waiting Room and checks in at approximately :15 and :45. If new slots are randomly released, this new user will have about a 50% chance of being selected next, since it monopolizes over the :00-15 and :30-45 ranges. On the other hand, the other five queued users share the :15-30 and :45-00 ranges, giving them about a 50% / 5 = 10% chance each. Let's consider that new slots are not randomly released and assume they are always released at :59. In this case, the new queued user will have virtually no chance to be selected before the other five queued users because these users will always check in one second later at :00, immediately consuming any newly released slots.</p><p>To address this vulnerability, we changed our implementation to ensure that slots are released randomly and encouraged users to check in at random offsets from each other. To help split up users that are checking in at similar times, we vary each user’s refreshIntervalSeconds by a small, pseudo-randomly generated offset for each check-in and store this new refresh interval in the encrypted Waiting Room cookie for validation on the next request. Thus, a user who previously checked in every 30 seconds might now check in after 29 seconds, then 31 seconds, then 27 seconds, and so on — but still averaging a 30-second refresh interval. Over time, these slight check-in variations become significant, spreading out user check-in times and strengthening the randomness of the queue. If you are curious to learn more about the apparent “randomness” behind mixing user check-in intervals, you can think of it as a <a href="https://en.wikipedia.org/wiki/Chaos_theory#Spontaneous_order">chaotic system</a> subjected to the <a href="https://en.wikipedia.org/wiki/Butterfly_effect">butterfly effect</a>.</p><p>Nevertheless, we weren’t convinced our efforts were enough and wanted to test random queueing empirically to validate its integrity. We conducted a simulation of 10,000 users joining a Waiting Room uniformly across 30 minutes. When let into the application, users spent approximately 1 minute “browsing” before they stopped checking in. We ran this experiment for both FIFO and random queueing and graphed each user’s observed wait time in seconds in the Waiting Room against the minute they initially arrived (starting from 0). Recall that users are grouped by minute using bucketIds, so each user’s arrival minute is truncated down to the current minute.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5r72Jc8hoJptY4q59jOw7u/7cc2c4e1213d3ea04e88b648fceb266d/image10-2.png" />
            
            </figure>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7F0FFNzDtgGkQqbwWUc6dm/63829b423bc953ef4f3b2bd3eae0b472/image7-7.png" />
            
            </figure><p>Based on our data, we can see immediately for FIFO queueing that, as the arrival minute increases, the observed wait time increases linearly. This makes sense for a FIFO queue, since the “line” will just get longer if there are more users entering the queue than leaving it. For each arrival minute, there is very little variation among user wait times, meaning that if you and your friend join a Waiting Room at approximately the same time, you will both be accepted around the same time. If you join a couple of minutes before your friend, you will almost always be accepted first.</p><p>When looking at the results for random queueing, we observe users experiencing varied wait times regardless of the arrival minute. This is expected, and helps prove the “randomness” of the random queue! We can see that, if you join five minutes after your friend, although your friend will have more chances to get in, you may still be accepted first! However, there are so many data points overlapping with each other in the plot that it is hard to tell how they are distributed. For instance, it could be possible that most of these data points experience extreme wait times, but as humans we aren’t able to tell.</p><p>As a result, we created heatmaps of these plots in Python using <a href="https://numpy.org/doc/stable/reference/generated/numpy.histogram2d.html">numpy.histogram2d</a> and displayed them with <a href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot</a>:</p>
            <pre><code>import json
import numpy as np
import matplotlib.pyplot as plt
import sys
 
filename = sys.argv[1]
 
with open(filename) as file:
   data = json.load(file)
 
   x = data["ArrivalMinutes"]
   y = data["WaitTimeSeconds"]
 
   heatmap, _, _ = np.histogram2d(x, y, bins=(30, 30))
 
   plt.clf()
   plt.title(filename)
   plt.xlabel('Arrival Minute Buckets')
   plt.ylabel('WaitTime Buckets')
   plt.imshow(heatmap.T, origin='lower')
   plt.show()</code></pre>
            <p>The heatmaps display where the data points are concentrated in the original plot, using brighter (hotter) colors to represent areas containing more points:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/F7MOVRWvAt4cnRWjtFv9q/5c8781a91232bf6ee1a6f755ae45745b/image2-13.png" />
            
            </figure>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6FvI5MK2XVjrLW3RcDQym0/66be2046b23542bb707a1fdddc6be82c/image1-14.png" />
            
            </figure><p>By inspecting the generated heatmaps, we can conclude that FIFO and random queueing are working properly. For FIFO queueing, users are being accepted in the order they arrive. For random queueing, we can see that users are accepted to the origin regardless of arrival time. Overall, we can see the heatmap for random queueing is well distributed, indicating it is sufficiently random!</p><p>If you are curious why random queueing has very hot colors along the lowest wait times followed by very dark colors afterward, it is actually because of how we are simulating the queue. For the simulation, we spoofed the bucketIds of the users and let them all join the Waiting Room at once to see who would be let in first. In the random queueing heatmap, the bright colors along the lowest wait time buckets indicate that many users were accepted quickly after joining the queue across all bucketIds. This is expected, demonstrating that random queueing does not give an edge to users who join earlier, giving each user a fair chance regardless of its bucketId. The reason why these users were almost immediately accepted in WaitTime Bucket 0 is because this simulation started with no users on the origin, meaning new users would be accepted until the Waiting Room limits were reached. Since this first wave of accepted users “browsed” on the origin for a minute before leaving, no additional users during this time were let in. Thus, the colors are very dark for WaitTime Buckets 1 and 2. Similarly, the second wave of users is randomly selected afterward, followed by another period of time when no users were accepted in WaitTime Bucket 5. As the wait time increases, the more attempts a particular user will have to be let in, meaning it is unlikely for users to have extreme wait times. We can see this by observing the colors grow darker as the WaitTime Bucket approaches 29.</p>
    <div>
      <h3>How Is Estimated Time Calculated for Random Queueing?</h3>
      <a href="#how-is-estimated-time-calculated-for-random-queueing">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/24BHsyypybgrHaVUFhdypo/9d4832d080b091ac74145ab48aeab534/image4-12.png" />
            
            </figure><p>In a random queue, you can be accepted at any moment… so how can you display an estimated wait time? For a particular user, this is an impossible task, but when you observe all the users together, you can accurately account for most user experiences using a probabilistic estimated wait time range.</p><p>At any given moment, we know:</p><ul><li><p><b>letInPerMinute</b>. The current average users per minute being let into the origin.</p></li><li><p><b>currentlyWaiting</b>. The current number of users waiting in the queue.</p></li></ul><p>Therefore, we can calculate the probability of a user being let into the origin in the next minute:</p><p>P(LetInOverMinute) = letInPerMinute / currentlyWaiting</p><p>If there are 100 users waiting in the queue, and we are currently letting in 10 users per minute, the probability a user will be let in over the next minute is 10 / 100 = .1 (10%).</p><p>Using P(LetInOverMinute), we can determine the n minutes needed for a p chance of being let into the origin:</p><p>p = 1 - (1 - P(LetInOverMinute))<sup>n</sup></p><p>Recall that the probability of getting in at least once is the complement of not getting in at all. The probability of not being let into the origin over n minutes is (1 - P(LetInOverMinutes))<sup>n</sup>. Therefore, the probability of getting in at least once is 1 - (1 - P(LetInOverMinute))<sup>n</sup>. This equation can be simplified further:</p><p>n = log(1 - p) / log(1 - P(LetInOverMinute))</p><p>Thus, if we want to calculate the estimated wait time to have a p = .5 (50%) chance of getting into the origin with the probability of getting let in during a particular minute P(LetInOverMinute) = .1 (10%), we calculate:</p><p>n = log(1 - .5) / log(1 - .1) ≈ 6.58 minutes or 6 minutes and 35 seconds</p><p>In this case, we estimate that 50% of users will wait less than 6 minutes and 35 seconds and the remaining 50% of users will wait longer than this.</p><p>So, which estimated wait times are displayed to the user? It is up to you! If you create a <a href="https://mustache.github.io/">Mustache</a> HTML template for a Waiting Room, you will now be able to use the variables waitTime25Percentile, waitTime50Percentile, and waitTime75Percentile to display the estimated wait times in minutes when p = .25, p = .5, and p = .75, respectively. There are also new variables that are used to display and determine the queueing method, such as queueingMethod, isFIFOQueue, and isRandomQueue. If you want to display something more dynamic like a custom view in a mobile app, keep reading to learn about our <a href="https://developers.cloudflare.com/waiting-room/how-to/mobile-traffic">new JSON response</a>, which provides a REST API for the same set of variables.</p>
    <div>
      <h3>Supporting Dynamic Applications with a JSON Response</h3>
      <a href="#supporting-dynamic-applications-with-a-json-response">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5pkXTi5JsH7w7tvLlUePDA/3d57ea5dc0fc8be9c69f7ee05ffdec5e/image5-11.png" />
            
            </figure><p>Before, customers could only deploy static <a href="https://mustache.github.io/">Mustache</a> HTML templates to customize the style of their Waiting Rooms. These templates work well for most use cases, but fall short if you want to display anything that requires state. Let’s imagine you’re queueing to buy concert tickets on your mobile device, and you see an embedded video of your favorite song. Naturally, you click on it and start singing along! A couple seconds later, the browser refreshes the page automatically to update your status in the Waiting Room, resetting your video to the start.</p><p>The purpose of the <a href="https://developers.cloudflare.com/waiting-room/how-to/mobile-traffic">new JSON response</a> is to give full control to a custom application, allowing it to determine what to display to the user and when to refresh. As a result, the application can maintain state and make sure your videos are never interrupted again!</p><p>Once the JSON response is enabled for a Waiting Room, any request to the Waiting Room with the header <code>Accept: application/json</code> will receive a JSON object with all the fields from the Mustache template.</p><p>An example request when the queueing method is FIFO:</p>
            <pre><code>curl -X GET "https://example.com/waitingroom" \
    -H "Accept: application/json"
{
    "cfWaitingRoom": {
        "inWaitingRoom": true,
        "waitTimeKnown": true,
        "waitTime": 10,
        "waitTime25Percentile": 0,
        "waitTime50Percentile": 0,
        "waitTime75Percentile": 0,
        "waitTimeFormatted": "10 minutes",
        "queueIsFull": false,
        "queueAll": false,
        "lastUpdated": "2020-08-03T23:46:00.000Z",
        "refreshIntervalSeconds": 20,
        "queueingMethod": "fifo",
        "isFIFOQueue": true,
        "isRandomQueue": false
    }
}</code></pre>
            <p>An example request when the queueing method is random:</p>
            <pre><code>curl -X GET "https://example.com/waitingroom" \
    -H "Accept: application/json"
{
    "cfWaitingRoom": {
        "inWaitingRoom": true,
        "waitTimeKnown": true,
        "waitTime": 10,
        "waitTime25Percentile": 5,
        "waitTime50Percentile": 10,
        "waitTime75Percentile": 15,
        "waitTimeFormatted": "5 minutes to 15 minutes",
        "queueIsFull": false,
        "queueAll": false,
        "lastUpdated": "2020-08-03T23:46:00.000Z",
        "refreshIntervalSeconds": 20,
        "queueingMethod": "random",
        "isFIFOQueue": false,
        "isRandomQueue": true
    }
}</code></pre>
            <p>A few important reminders before you get started:</p><ol><li><p>Don’t forget that Waiting Room uses a cookie to maintain a user’s status! Without a cookie in the request, the Waiting Room will think the user has just joined the queue.</p></li><li><p>Don’t forget to refresh! Inspect the ‘Refresh’ HTTP response header or the refreshIntervalSeconds property and send another request to the Waiting Room after that number of seconds.</p></li><li><p>Keep in mind that if the user’s request is let into the origin, JSON may not necessarily be returned. To gracefully parse all responses, send JSON from the origin website if the header <code>Accept: application/json</code> is present. For example, the origin could return:</p></li></ol>
            <pre><code>{
	"cfWaitingRoom": {
		"inWaitingRoom": false
	},
	"authToken": "abcd"
}</code></pre>
            
    <div>
      <h3>Embedding a Waiting Room in a Webpage: SameSite Cookies and IFrames</h3>
      <a href="#embedding-a-waiting-room-in-a-webpage-samesite-cookies-and-iframes">
        
      </a>
    </div>
    <p>What are <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite">SameSite</a> cookies and I<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe">Frames</a>?</p><p>SameSite and Secure are attributes in the HTTP response Set-Cookie header. SameSite is used to determine when cookies are sent to a website while Secure indicates if there must be a secure context (HTTPS).</p><p>There are three different values of SameSite:</p><ul><li><p><b>SameSite=Lax. </b> This is the default value when the SameSite attribute is not present. Cookies are not sent on cross-site sub-requests unless the user is following a link to the third-party site. If you are on <a href="http://example1.com/">example1.com</a>, cookies will not be sent to <a href="http://example2.com/">example2.com</a> unless you click a link that navigates to <a href="http://example2.com/">example2.com</a>.</p></li><li><p><b>SameSite=Strict.</b> Cookies are sent only in first-party contexts. If you are on <a href="http://example1.com/">example1.com</a>, cookies will never be sent to <a href="http://example2.com/">example2.com</a> even if you click a link that navigates to <a href="http://example2.com/">example2.com</a>.</p></li><li><p><b>SameSite=None.</b> Cookies are sent for all contexts, but the Secure attribute must be set. If you are on <a href="http://example1.com/">example1.com</a>, cookies will be sent to <a href="http://example2.com/">example2.com</a> for all sub-requests. If Secure is not set, the browser will block the cookie.</p></li></ul><p>IFrames (Inline Frames) allow HTML documents to embed other HTML documents, such as an advertisement, video, or webpage. When an application from a third-party website is rendered inside an IFrame, <b>cookies will only be sent to it if SameSite=None is set</b>.</p><p>Why is this all important? In the past, we did not set SameSite, meaning it defaulted to <b>SameSite=Lax</b> for all responses. As a result, a user queueing through an IFrame would never have its cookie updated and appear to the Waiting Room as joining for the first time on every request. Today, we are introducing customization for both the SameSite and Secure attributes, which will allow Waiting Rooms to be displayed in IFrames!</p><p>At the moment, this is only configurable through the <a href="https://developers.cloudflare.com/waiting-room/reference/waiting-room-api">Cloudflare API</a>. By default, the configuration for SameSite and Secure will be set to "auto", automatically selecting the most flexible option. In this case, SameSite will be set to None if <a href="/how-to-make-your-site-https-only/">Always Use HTTPS</a> is enabled, otherwise it will be set to Lax. Similarly, Secure will only be set if Always Use HTTPS is enabled. In other words, Waiting Room IFrames will work properly by default as long as Always Use HTTPS is toggled. If you are wondering why Always Use HTTPS is used here, remember that SameSite=None requires that Secure is also set, or else the browser will block the Waiting Room cookie.</p><p>If you decide to manually configure the behavior of SameSite and Secure through the API, be careful! We do guard against setting SameSite=None without Secure, but if you decide to set Secure on every request (secure="always") and don’t have Always Use HTTPS enabled, this means that a user who sends an insecure (HTTP) request to the Waiting Room will have its cookie blocked by its browser!</p><p>If you want to explore using IFrames with Waiting Room yourself, here is a simple example of a Cloudflare Worker that renders the Waiting Room on "<a href="https://example.com/waitingroom">https://example.com/waitingroom</a>" in an IFrame:</p>
            <pre><code>const html = `&lt;!DOCTYPE html&gt;
&lt;html&gt;
 &lt;head&gt;
   &lt;meta charset="UTF-8" /&gt;
   &lt;meta name="viewport" content="width=device-width,initial-scale=1" /&gt;
   &lt;title&gt;Waiting Room IFrame Example&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;
   &lt;h1&gt;Waiting Room IFrame!&lt;/h1&gt;
   &lt;iframe src="https://example.com/waitingroom" width="1200" height="700"&gt;&lt;/iframe&gt;
 &lt;/body&gt;
&lt;/html&gt;
`
 
addEventListener('fetch', event =&gt; {
 event.respondWith(handleRequest(event.request))
})
 
async function handleRequest(request) {
 return new Response(html, {
   headers: { "Content-Type": "text/html" },
 })
}</code></pre>
            
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6y2H55tauwVyQMONGeLoxW/d1d077d67a637f90ebfb91255c26bfb3/image6-10.png" />
            
            </figure>
    <div>
      <h3>Looking Forward</h3>
      <a href="#looking-forward">
        
      </a>
    </div>
    <p>Waiting Room still has plenty of room to grow! Every day, we are seeing more Waiting Rooms deployed to protect websites from traffic spikes. As Waiting Room continues to be used for new purposes, we will keep adding features to make it as customizable and user-friendly as possible.</p><p>Stay tuned — what we have announced today is just the tip of the iceberg of what we have planned for Waiting Room!</p> ]]></content:encoded>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[Project Fair Shot]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Load Balancing]]></category>
            <guid isPermaLink="false">4NWxYwdKUHfyxG5jR0vLPM</guid>
            <dc:creator>Tyler Caslin</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare and COVID-19: Project Fair Shot Update]]></title>
            <link>https://blog.cloudflare.com/cloudflare-and-covid-19-project-fair-shot-update/</link>
            <pubDate>Thu, 29 Jul 2021 13:00:43 GMT</pubDate>
            <description><![CDATA[ Cloudflare Waiting Room helping organizations around the world to stifle COVID-19 and aid with easy rapid vaccinations. ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/oMc5oJGNvoM3zY9UMJf7X/7ff04e8e12c8d19b33a7cd67d12b459b/image1-40.png" />
            
            </figure><p>In February 2021, Cloudflare launched <a href="/project-fair-shot/">Project Fair Shot</a> — a program that gave our Waiting Room product free of charge to any government, municipality, private/public business, or anyone responsible for the scheduling and/or dissemination of the COVID-19 vaccine.</p><p>By having our <a href="/cloudflare-waiting-room/">Waiting Room</a> technology in front of the vaccine scheduling application, it ensured that:</p><ul><li><p>Applications would remain available, reliable, and resilient against massive spikes of traffic for users attempting to get their vaccine appointment scheduled.</p></li><li><p>Visitors could wait for their long-awaited vaccine with confidence, arriving at a branded queuing page that provided accurate, estimated wait times.</p></li><li><p>Vaccines would get distributed equitably, and not just to folks with faster reflexes or Internet connections.</p></li></ul><p>Since February, we’ve seen a good number of participants in Project Fair Shot. To date, we have helped more than 100 customers across more than 10 countries to schedule approximately 100 million vaccinations. Even better, these vaccinations went smoothly, with customers like the County of San Luis Obispo regularly dealing with more than 20,000 appointments in a day.  “The bottom line is Cloudflare saved lives today. Our County will forever be grateful for your participation in getting the vaccine to those that need it most in an elegant, efficient and ethical manner” — Web Services Administrator for the <a href="https://www.cloudflare.com/case-studies/county-of-san-luis-obispo/">County of San Luis Obispo</a>.</p><p>We are happy to have helped not just in the US, but worldwide as well. In Canada, we partnered with a number of organizations and the Canadian government to increase access to the vaccine. One partner stated: “Our relationship with Cloudflare went from ‘Let's try Waiting Room’ to ‘Unless you have this, we're not going live with that public-facing site.'” — CEO of <a href="https://www.cloudflare.com/case-studies/verto/">Verto Health</a>. In another country in Europe, we saw over three million people go through the Waiting Room in less than 24 hours, leading to a significantly smoother and less stressful experience. Cities in Japan, — working closely with our partner, <a href="https://classmethod.jp/news/202106-cloudflare-en/">Classmethod</a> — have been able to vaccinate over 40 million people and are on track to complete their vaccination process across 317 cities. If you want more stories from Project Fair Shot, check out <a href="https://www.cloudflare.com/case-studies/?product=Waiting+Room">our case studies</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3JW3zznYeLCU0J8N1MDYcd/327e638ae0b710f938a93d8cd2207643/image2-28.png" />
            
            </figure><p>A European customer seeing very high amounts of traffic during a vaccination event</p><p>We are continuing to add more customers to Project Fair Shot every day to ensure we are doing all that we can to help distribute more vaccines. With the emergence of the Delta variant and others, vaccine distribution (and soon, booster shots) is still very much a real problem to keep everyone healthy and resilient. Because of these new developments, Cloudflare will be extending Project Fair Shot until at least July 1, 2022. Though we are not excited to see the pandemic continue, we are humbled to be able to provide our services and be a critical part in helping us collectively move towards a better tomorrow.</p> ]]></content:encoded>
            <category><![CDATA[Impact Week]]></category>
            <category><![CDATA[Waiting Room]]></category>
            <category><![CDATA[COVID-19]]></category>
            <category><![CDATA[Project Fair Shot]]></category>
            <category><![CDATA[Reliability]]></category>
            <guid isPermaLink="false">5HBc7sJzo5x35fCSj9DBji</guid>
            <dc:creator>Brian Batraski</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Project Fair Shot: Ensuring COVID-19 Vaccine Registration Sites Can Keep Up With Demand]]></title>
            <link>https://blog.cloudflare.com/project-fair-shot/</link>
            <pubDate>Fri, 22 Jan 2021 14:01:00 GMT</pubDate>
            <description><![CDATA[ Project Fair Shot provides Cloudflare's new Waiting Room service for free for any government, municipality, hospital, pharmacy, or other organization responsible for distributing COVID-19 vaccines. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Around the world government and medical organizations are struggling with one of the most difficult logistics challenges in history: equitably and efficiently distributing the COVID-19 vaccine. There are challenges around communicating who is eligible to be vaccinated, registering those who are eligible for appointments, ensuring they show up for their appointments, transporting the vaccine under the required handling conditions, ensuring that there are trained personnel to administer the vaccine, and then doing it all over again as most of the vaccines require two doses.</p><p>Cloudflare can't help with most of that problem, but there is one key part that we realized we could help facilitate: ensuring that registration websites don't crash under load when they first begin scheduling vaccine appointments. Project Fair Shot provides Cloudflare's new Waiting Room service for free for any government, municipality, hospital, pharmacy, or other organization responsible for distributing COVID-19 vaccines. It is open to eligible organizations around the world and will remain free until at least July 1, 2021 or longer if there is still more demand for appointments for the vaccine than there is supply.</p>
    <div>
      <h3>Crashing Registration Websites</h3>
      <a href="#crashing-registration-websites">
        
      </a>
    </div>
    <p>The problem of vaccine scheduling registration websites crashing under load isn't theoretical: it is happening over and over as organizations attempt to schedule the administration of the vaccine. This hit home at Cloudflare last weekend. The wife of one of our senior team members was trying to register her parents to receive the vaccine. They met all the criteria and the municipality where they lived was scheduled to open appointments at noon.</p><p>When the time came for the site to open, it immediately crashed. The cause wasn't hackers or malicious activity. It was merely that so many people were trying to access the site at once. "Why doesn't Cloudflare build a service that organizes a queue into an orderly fashion so these sites don't get overwhelmed?" she asked her husband.</p>
    <div>
      <h3>A Virtual Waiting Room</h3>
      <a href="#a-virtual-waiting-room">
        
      </a>
    </div>
    <p>Turns out, we were already working on such a feature, but not for this use case. The problem of fairly distributing something where there is more demand than supply comes up with several of our clients. Whether selling tickets to a hot concert, the latest new sneaker, or access to popular national park hikes it is a difficult challenge to ensure that everyone eligible has a fair chance.</p><p>The solution is to open registration to acquire the scarce item ahead of the actual sale. Anyone who visits the site ahead of time can be put into a queue. The moment before the sale opens, the order of the queue can be randomly (and fairly) shuffled. People can then be let in in order of their new, random position in the queue — allowing only so many at any time as the backend of the site can handle.</p><p>At Cloudflare, we were building this functionality for our customers as a feature called Waiting Room. (You can <a href="/cloudflare-waiting-room">learn more about the technical details of Waiting Room in this post by Brian Batraski</a> who helped build it.) The technology is powerful because it can be used in front of any existing web registration site without needing any code changes or hardware installation. Simply deploy Cloudflare through a simple DNS change and then configure Waiting Room to ensure any transactional site, no matter how meagerly resourced, can keep up with demand.</p>
    <div>
      <h3>Recognizing a Critical Need; Moving Up the Launch</h3>
      <a href="#recognizing-a-critical-need-moving-up-the-launch">
        
      </a>
    </div>
    <p>We planned to release it in February. Then, when we saw vaccine sites crashing under load and frustration of people eligible for the vaccine building, we realized we needed to move the launch up and offer the service for free to organizations struggling to fairly distribute the vaccine. With that, Project Fair Shot was born.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7uLLKSoVvU8DUWVz01jPSS/86836f828b64ad2b022e2e189d045887/Project-fair-shot-icon.png" />
            
            </figure><p>Government, municipal, hospital, pharmacy, clinic, and any other organizations charged with scheduling appointments to distribute the vaccine can apply to participate in Project Fair Shot by visiting: <a href="https://projectfairshot.org">projectfairshot.org</a></p>
    <div>
      <h3>Giving Front Line Organizations the Technical Resources They Need</h3>
      <a href="#giving-front-line-organizations-the-technical-resources-they-need">
        
      </a>
    </div>
    <p>The service will be free for qualified organizations at least until July 1, 2021 or longer if there is still more demand for appointments for the vaccine than there is supply. We are not experts in medical cold storage and I get squeamish at the sight of needles, so we can't help with many of the logistical challenges of distributing the vaccine. But, seeing how we could support this aspect, our team knew we needed to do all we could to help.</p><p>The superheroes of this crisis are the medical professionals who are taking care of the sick and the scientists who so quickly invented these miraculous vaccines. We're proud of the supporting role Cloudflare has played helping ensure the Internet has continued to function well when the world needed it most. Project Fair Shot is one more way we are living up to our mission of helping build a better Internet.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[COVID-19]]></category>
            <category><![CDATA[Free]]></category>
            <category><![CDATA[Better Internet]]></category>
            <category><![CDATA[Project Fair Shot]]></category>
            <category><![CDATA[Load Balancing]]></category>
            <guid isPermaLink="false">3glQ2MLiiKs61RP6DiGdGt</guid>
            <dc:creator>Matthew Prince</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare Waiting Room]]></title>
            <link>https://blog.cloudflare.com/cloudflare-waiting-room/</link>
            <pubDate>Fri, 22 Jan 2021 14:00:00 GMT</pubDate>
            <description><![CDATA[ Today, we are excited to announce Cloudflare Waiting Room! It will be first available to select customers through a new program called Project Fair Shot, with general availability in our Business and Enterprise plans in the near future.  ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2LySWqjpMJS9ugWRRi5gPv/e2cd9d09980b05f5585ee65574e88b7f/image3-14.png" />
            
            </figure><p>Today, we are excited to announce Cloudflare Waiting Room! It will first be available to select customers through a new program called <a href="/project-fair-shot/">Project Fair Shot</a> which aims to help with the problem of overwhelming demand for COVID-19 vaccinations causing appointment registration websites to fail. General availability in our Business and Enterprise plans will be added in the near future.</p>
    <div>
      <h3>Wait, you’re excited about a… Waiting Room?</h3>
      <a href="#wait-youre-excited-about-a-waiting-room">
        
      </a>
    </div>
    <p>Most of us are familiar with the concept of a waiting room, and rarely are we excited about the idea of being in one. Usually our first experience of one is at a doctor’s office — yes, you have an appointment, but sometimes the doctor is running late (or one of the patients was). Given the doctor can only see one person at a time… the waiting room was born, as a mechanism to queue up patients.</p><p>While servers can handle more concurrent requests than a doctor can, they too can be overwhelmed. If, in a pre-COVID world, you’ve ever tried buying tickets to a popular concert or event, you’ve probably encountered a waiting room online. It limits requests inbound to an application, and places these requests into a virtual queue. Once the number of users in the application has reduced, new users are let in within the defined thresholds the application can handle. This protects the origin servers supporting the application from being inundated with too many requests, while also ensuring equity from a user perspective — users who try to access a resource when the system is overloaded are not unfairly dropped and forced to reconnect, hoping to join their chance in the queue.</p>
    <div>
      <h3>Why Now?</h3>
      <a href="#why-now">
        
      </a>
    </div>
    <p>Given not many of us are going to live concerts any time soon, why is Cloudflare doing this now?</p><p>Well, perhaps we aren’t going to concerts, but the second order effects of COVID-19 have created a huge need for waiting rooms. First of all, given social distancing and the closing of many places of business and government, customers and citizens have shifted to online channels, putting substantially more strain on business and government infrastructure.</p><p>Second, the pandemic and the flow-on consequences of it have meant many folks around the world have come to rely on resources that they didn’t need twelve months earlier. To be specific, these are often health or government-related resources — for example, unemployment insurance websites. The online infrastructure was set up to handle a peak load that didn’t foresee the impact of COVID-19. We’re seeing a similar pattern emerge with websites that are related to vaccines.</p><p>Historically, the number of organizations that needed waiting rooms was quite small. The nature of most businesses online usually involves a more consistent user load, rather than huge crushes of people all at once. Those organizations were able to build custom waiting rooms and were integrated deeply into their application (for example, buying tickets).  With Cloudflare’s Waiting Room, no code changes to the application are necessary and a Waiting Room can be set up in a matter of minutes for any website without writing a single line of code.</p><p>Whether you are an engineering architect or a business operations analyst, setting up a Waiting Room is simple. We make it quick and easy to ensure your applications are reliable and protected from unexpected spikes in traffic.  Other features we felt were important are automatic enablement and dynamic outflow. In other words, a waiting room should turn on automatically when thresholds are exceeded and as users finish their tasks in the application, let out different sized buckets of users and intake new ones already in the queue. It should just work. Lastly, we’ve seen the major impact COVID-19 has made on users and businesses alike, especially, but not limited to, the <a href="/project-fair-shot">health and government sectors</a>. We wanted to provide another way to ensure these applications remain available and functional so all users can receive the care that they need and not errors within their browser.</p>
    <div>
      <h3>How does Cloudflare’s Waiting Room work?</h3>
      <a href="#how-does-cloudflares-waiting-room-work">
        
      </a>
    </div>
    <div></div><p>We built Waiting Room on top of our edge network and our Workers product. By leveraging Workers and our new <a href="/introducing-workers-durable-objects/">Durable Objects</a> offerings, we were able to remove the need for any customer coding and provide a seamless, out of the box product that will ‘just work’. On top of this, we get the benefits of the scale and performance of our Workers product to ensure we maintain extremely low latency overhead, keep estimated times presented to end users accurate as can be and not keep any user in the queue longer than needed. But building a centralized system in a decentralized network is no easy task. When requests come into an application from around the world, we need to be able to get a broad, accurate view of what that load looks like inbound and outbound to a given application.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/58SzyjWqUnxbAHlfw2NQlN/8b297e6b82cb4b5a373fa6ef502766af/image7-4.png" />
            
            </figure><p>Request going through Cloudflare without a Waiting Room</p><p>These requests, as fast as they are, still take time to travel across the planet. And so, a unique edge case was presented. What if a website is getting reasonable traffic from North America and Europe, but then a sudden major spike of traffic takes place from South America - how do we know when to keep letting users into the application and when to kick in the Waiting Room to protect the origin servers from being overloaded?</p><p>Thanks to some clever engineering and our Workers product, we were able to create a system that almost immediately keeps itself synced with global demand to an application giving us the necessary insight into when we should and should not be queueing users into the Waiting Room. By leveraging our global Anycast network and over 200+ data centers, we remove any single point of failure to protect our customers' infrastructure yet also provide a great experience to end-users who have to wait a small amount of time to enter the application under high load.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5A4dbEqx7QljSUT9sCrHDw/0927fd2fecf6d10cd9daf1615d2288f0/image.png" />
            
            </figure><p>Request going through Cloudflare with a Waiting Room</p>
    <div>
      <h3>How to setup a Waiting Room</h3>
      <a href="#how-to-setup-a-waiting-room">
        
      </a>
    </div>
    <p>Setting up a Waiting Room is incredibly easy and very fast! At the easiest side of the scale, a user needs to fill out only five fields: 1) the name of the Waiting Room, 2) a hostname (which will already be pre-populated with the zone it’s being configured on), 3) the total active users that can be in the application at any given time, 4) the new users per minute allowed into the application, and 5) the session duration for any given user. No coding or any application changes are necessary.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7jvd256hBoik5Q1vOrHaY7/eb3d44f17ed464c10a4a87a7ff596468/image2-10.png" />
            
            </figure><p>We provide the option of using our default Waiting Room template for customers who don’t want to add additional branding. This simplifies the process of getting a Waiting Room up and running.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/47mGOhBbYguIY0mR2PNqA6/f6dbb1eb9e291c4dab9f3c7674f74598/image4-13.png" />
            
            </figure><p>That’s it! Press save and the Waiting Room is ready to go!</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3SaV701UPb0yPHAsZveNvh/a4502cdcd5a1d5795245cfd37a148968/image1-13.png" />
            
            </figure><p>For customers with more time and technical ability, the same process is followed, except we give full customization capabilities to our users so they can brand the Waiting Room, ensuring it matches the look and feel of their overall product.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/57kJYj33S42WCATXuhDWPm/cbdd07a98ea75dcb7c56b7643a03f971/image8-6.png" />
            
            </figure><p>Lastly, managing different Waiting Rooms is incredibly easy. With our Manage Waiting Room table, at a glance you are able to get a full snapshot of which rooms are actively queueing, not queueing, and/or disabled.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/59ZVBRBMdPw3S1ZNxCy8N/b60b0daa36e701ea50a2f3246e00270b/image5-6.png" />
            
            </figure><p>We are very excited to put the power of our <a href="https://www.cloudflare.com/waiting-room/">Waiting Room</a> into the hands of our customers to ensure they continue to focus on their businesses and customers. Keep an eye out for another blog post coming soon with major updates to our Waiting Room product for Enterprise!</p> ]]></content:encoded>
            <category><![CDATA[Project Fair Shot]]></category>
            <category><![CDATA[Load Balancing]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Better Internet]]></category>
            <category><![CDATA[COVID-19]]></category>
            <category><![CDATA[Waiting Room]]></category>
            <guid isPermaLink="false">12yEIFZBDJjbYa9zqvEhbl</guid>
            <dc:creator>Brian Batraski</dc:creator>
        </item>
    </channel>
</rss>