<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: anthonynsimon</title>
    <description>The latest articles on DEV Community by anthonynsimon (@anthonynsimon).</description>
    <link>https://dev.to/anthonynsimon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F597467%2F0d4dd9f1-ee70-408e-9b34-ec00873d1c55.jpg</url>
      <title>DEV Community: anthonynsimon</title>
      <link>https://dev.to/anthonynsimon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anthonynsimon"/>
    <language>en</language>
    <item>
      <title>5 Incident Communication Templates</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Fri, 09 Dec 2022 15:00:00 +0000</pubDate>
      <link>https://dev.to/cronitorio/5-incident-communication-templates-lif</link>
      <guid>https://dev.to/cronitorio/5-incident-communication-templates-lif</guid>
      <description>&lt;p&gt;There’s no such thing as 100% reliability. Downtime happens so it’s important you’re ready for it.&lt;/p&gt;

&lt;p&gt;On one hand you have the pressure to fix the issue during the heat of an outage, and on the other hand you should keep customers and internal teams in the loop so they understand how they’re impacted and prevent confusion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7z2r58ozvsu4r3j6ymzn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7z2r58ozvsu4r3j6ymzn.png" alt="Example incident timeline" width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;An example incident using Cronitor Status Pages.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this blog post, you’ll find five incident communication templates that you can use in a variety of situations. They’re meant to provide some structure when writing an incident update, so feel free to edit them according to your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices when writing outage notifications
&lt;/h2&gt;

&lt;p&gt;An outage notification is an important way to keep your customers informed about any disruptions to your services. We'll go over some key points to include when communicating a service disruption:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Affected services:&lt;/strong&gt; Be sure to include details such as which services are affected, and to what extent. For example, if your website is down, you might want to specify whether only some pages are unavailable, or if the entire site is offline. Particularly, if the outage is affecting a critical business function it's important to let your customers know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected duration:&lt;/strong&gt; How long you expect the outage to last will help your customers plan around the disruption. If you don't have an exact timeline, it's okay to provide a best guess or a range of time. Just be sure to update your customers if the situation changes and the outage ends up lasting longer than expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current status:&lt;/strong&gt; As your team works on resolving the incident, it’s helpful to provide updates about the current status of the outage. That way customers won’t need to go through your support team just to ask what’s the latest update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ways to get help:&lt;/strong&gt; Finally, make sure you provide a way for your customers to get in touch with someone who can provide more information about the outage or to get notified when there’s an update. It's important to have someone available to answer questions and provide updates, as this will help to keep your customers informed and reduce frustration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to be transparent with customers and all stakeholders when communicating a major service disruption. That way, you can turn every outage into an opportunity to build trust in your service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template #1 - Investigating an incident
&lt;/h2&gt;

&lt;p&gt;Here’s a template for communicating a newly discovered incident:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We are currently investigating an incident that is impacting &lt;strong&gt;[Impacted Service]&lt;/strong&gt;. We apologize for any inconvenience this may cause and are working to resolve the issue as quickly as possible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;At this time, we do not have any further details on the cause of the incident or an estimated time for resolution. We will provide updates as we have them, and appreciate your patience while we work to resolve the issue.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Template #2 - Monitoring an ongoing incident
&lt;/h2&gt;

&lt;p&gt;Below is a template for communicating an incident update. This assumes a fix has already been implemented but it’s not confirmed whether the incident has been resolved yet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We have identified the cause of the incident on &lt;strong&gt;[Impacted Service]&lt;/strong&gt; and are implementing a solution. We are closely monitoring the situation to ensure the issue is fully resolved.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We apologize for any inconvenience and will keep you informed as we have more information. Thank you for your understanding as we work to fix the problem.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Template #3 - The issue has been resolved
&lt;/h2&gt;

&lt;p&gt;Here’s a template for communicating that an incident has been resolved and no further updates will be provided:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We are pleased to inform you that the issue has been resolved. &lt;strong&gt;[Brief description of what happened]&lt;/strong&gt;. The issue mainly impacted our &lt;strong&gt;[Impacted Service]&lt;/strong&gt; service.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for your patience during this time. Please do not hesitate to contact us if you have any concerns or questions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Template #4 - Scheduled maintenance
&lt;/h2&gt;

&lt;p&gt;The template below communicates a scheduled maintenance period. For example, when you need to upgrade a database or to temporarily take down a section of your website or API:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We wanted to let you know that we will be performing scheduled maintenance on &lt;strong&gt;[date and relevant times]&lt;/strong&gt;. During this time, &lt;strong&gt;[affected services]&lt;/strong&gt; may be unavailable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We apologize for any inconvenience this may cause, and we will do our best to minimize any disruption to your service.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have any further questions or concerns, please do not hesitate to contact us.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Template #5 - Potential security breach
&lt;/h2&gt;

&lt;p&gt;The template below communicates a potential security breach which may have exposed personal data:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We wanted to make you aware of a potential security breach that may have occurred on &lt;strong&gt;[date and time]&lt;/strong&gt; and possibly exposed the following personal data: &lt;strong&gt;[Brief description of personal data involved]&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While we are still investigating the issue, we want to inform you as soon as possible so that you can take steps to protect your information. We recommend that you change your password for any accounts that may have been affected and monitor your accounts for any unusual activity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We apologize for any inconvenience this may cause, and we are working quickly to investigate and resolve the issue.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have any questions or concerns, please do not hesitate to contact us.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Use a status page for simpler communication
&lt;/h2&gt;

&lt;p&gt;Customers and internal stakeholders expect timely updates whenever there’s a service disruption. Cronitor offers beautiful &lt;a href="https://cronitor.io/status-pages" rel="noopener noreferrer"&gt;Status Pages&lt;/a&gt; so you can easily provide real-time updates and information about the status of your services, helping to reduce confusion and frustration for your customers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq65txmfrryhfdh67g2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq65txmfrryhfdh67g2f.png" alt="Example status page" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://cronitor.io/sign-up" rel="noopener noreferrer"&gt;create a status page for free&lt;/a&gt; or upgrade to a paid plan when you need more advanced features such as private pages for your internal teams or your company branding.&lt;/p&gt;

&lt;p&gt;We hope this guide has been helpful to you, let us know if there’s any other templates you find useful!&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>5 Best Status Page Tools - Free &amp; Open Source</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Wed, 28 Sep 2022 13:47:59 +0000</pubDate>
      <link>https://dev.to/cronitorio/5-best-status-page-tools-free-open-source-42gp</link>
      <guid>https://dev.to/cronitorio/5-best-status-page-tools-free-open-source-42gp</guid>
      <description>&lt;p&gt;Having a status page is essential for any online business. It enables you to communicate with your users when you need it most: during the heat of an incident.&lt;/p&gt;

&lt;p&gt;You can publish updates on any ongoing incidents, showcase historical uptime and performance, and notify about maintenance windows all from a single page.&lt;/p&gt;

&lt;p&gt;Here’s a list of free &amp;amp; open source status page tools you can use for your next project:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Cronitor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HFZw7P7h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0w7j1gu3drin692m94f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HFZw7P7h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0w7j1gu3drin692m94f2.png" alt="Cronitor Status Pages" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cronitor.io/status-pages"&gt;Cronitor Status Page&lt;/a&gt; is simple, fast and comes with active monitoring built-in. That means you can set up uptime monitoring for your websites and APIs, and also create your status page using a single service.&lt;/p&gt;

&lt;p&gt;Cronitor has a free tier which includes 5 monitors, 1 user and free basic status pages. Once you need more you can upgrade to the business plan in which you only pay for what you use (eg. $25/mo for branded status pages).&lt;/p&gt;

&lt;p&gt;Why pick Cronitor Status Pages?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generous free tier includes status pages and uptime monitoring.&lt;/li&gt;
&lt;li&gt;You can easily add a custom domain, your company logo and support links.&lt;/li&gt;
&lt;li&gt;Private pages for your internal teams (IP and password protection).&lt;/li&gt;
&lt;li&gt;Real-time uptime and performance graphs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the &lt;a href="https://statuspage-demo.cronitor.io/?ref=blog-free-status-page-tools"&gt;live demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Atlassian Statuspage
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6veEw7Zi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lq4qxmdbuhbd5k4i4td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6veEw7Zi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lq4qxmdbuhbd5k4i4td.png" alt="Atlassian Statuspage" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Atlassian Statuspage is a well-known alternative which has been in the market for many years. It offers a free tier which might be enough for the needs of many businesses, but do consider that as your requirements grow the price tag grows substantially too.&lt;/p&gt;

&lt;p&gt;The free plan gives you 100 subscribers, 2 team members, 2 metrics, and email or Slack notifications.&lt;/p&gt;

&lt;p&gt;Their paid plans start at $29/mo and go all the way up to $1,499 depending on the number of subscribers, team members and customization features needed. For example, for custom CSS/HTML/JS you’d need the $399/mo plan.&lt;/p&gt;

&lt;p&gt;Why pick Atlassian Statuspage?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need specific features such as custom CSS/HTML/JS, and can afford the price tag. &lt;/li&gt;
&lt;li&gt;You're already using Atlassian's products and would like to remain within their platform.&lt;/li&gt;
&lt;li&gt;The free plan is enough for your needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Instatus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OpXZgs3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dldd9tqu3l93ibe4y1br.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OpXZgs3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dldd9tqu3l93ibe4y1br.png" alt="Instatus" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instatus is a hosted status page service that focuses on simple and fast pages. It includes features such as custom CSS and Javascript, multi-language support and status widgets for your website.&lt;/p&gt;

&lt;p&gt;Why pick Instatus?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offers free tier and competitive paid plans.&lt;/li&gt;
&lt;li&gt;Unlimited subscribers and teammates.&lt;/li&gt;
&lt;li&gt;Your project requires localization features.&lt;/li&gt;
&lt;li&gt;You don't need built-in monitoring and want to use external tools for this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Vigil
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vWXRtpRW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/puubkcze7z4psigwcba3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vWXRtpRW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/puubkcze7z4psigwcba3.png" alt="Vigil Status Page" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vigil is an open source alternative that combines status pages with uptime monitoring. It's useful if you want to have even more control over your monitoring infrastructure and feel comfortable managing your own servers.&lt;/p&gt;

&lt;p&gt;As of September 2022 it's still actively maintained. Which is why we've chosen to recommend this project over other popular open source alternatives such as &lt;a href="https://github.com/adamcooke/staytus"&gt;Staytus&lt;/a&gt;, &lt;a href="https://github.com/CachetHQ/Cachet/issues/4326"&gt;Cachet&lt;/a&gt; or &lt;a href="https://github.com/juliomrqz/statusfy/discussions/826"&gt;Statusfy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's important a project is being actively developed, particularly when it comes to security patches and bug fixes. Please do your own research before self-hosting any solution in your own infrastructure.&lt;/p&gt;

&lt;p&gt;Why pick Vigil?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open source and actively maintained.&lt;/li&gt;
&lt;li&gt;Uptime monitoring built-in.&lt;/li&gt;
&lt;li&gt;Clean dashboards.&lt;/li&gt;
&lt;li&gt;Lots of configuration options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Freshstatus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TJqSMXwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/go40trxlxmliel7wjruu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TJqSMXwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/go40trxlxmliel7wjruu.png" alt="Freshstatus" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Freshstatus is a status page service by Freshworks. You can sign up for free and it comes with various integrations such as Twitter, Slack, Webhooks, and even Freshworks own services: Freshping, Freshdesk, Freshservice. If you're already on their platform it's a great way to get a status page.&lt;/p&gt;

&lt;p&gt;Why pick Freshstatus?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're already using other products by Freshworks and want to remain within their platform.&lt;/li&gt;
&lt;li&gt;You'd like to use their Freshping, Freshdesk or Freshservice integrations.&lt;/li&gt;
&lt;li&gt;Supports customizing the alert emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to go from here
&lt;/h2&gt;

&lt;p&gt;In this article we've explored our top picks when it comes to free and open source status page tools. We hope this proves useful in your search for which tool is best for your needs.&lt;/p&gt;

&lt;p&gt;Last but not least, be sure to check out &lt;a href="https://cronitor.io/blog/status-page-examples"&gt;real-world examples of status pages&lt;/a&gt;. It's a great way to understand how various companies make use of their page and how to make the most out of yours.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>9 Real World Examples of Great Status Pages</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Tue, 27 Sep 2022 21:08:11 +0000</pubDate>
      <link>https://dev.to/cronitorio/9-real-world-examples-of-great-status-pages-1hbh</link>
      <guid>https://dev.to/cronitorio/9-real-world-examples-of-great-status-pages-1hbh</guid>
      <description>&lt;p&gt;A &lt;a href="https://cronitor.io/status-pages"&gt;status page&lt;/a&gt; is essential if you have a website, API or any internet-based service. It provides visibility into the current state of your software, and helps you communicate ongoing incidents and maintenance windows with your customers.&lt;/p&gt;

&lt;p&gt;But not every status page is the same. That's why we've hand-picked various examples of what we consider great status pages to learn from.&lt;/p&gt;

&lt;p&gt;Let's take a look at each of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flare
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yey_kGhe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/db37y3kcxbyb2yktem9l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yey_kGhe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/db37y3kcxbyb2yktem9l.jpg" alt="Flare Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://status.flare.systems/"&gt;status.flare.systems&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Flare is a digital footprint monitoring solution. It monitors your systems for security threats, technical leaks, and provides visibility to external attack surfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; Ease of use. Flare's status page is well-structured and is easy to understand. It clearly displays the current health of their services as well as historical uptime and performance, plus any past incidents.&lt;/p&gt;

&lt;p&gt;These features help their customers quickly understand the impact of any ongoing outage, and expected resolution time. Additionally, potential customers are able to quickly assess how they handled past outages and understand the reliability of their services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discord
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nla8w6w0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lue18jorxthktlss6x2h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nla8w6w0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lue18jorxthktlss6x2h.jpg" alt="Discord Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://discordstatus.com/"&gt;discordstatus.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Discord is a hugely popular platform for chat, voice and video calls. They handle millions of concurrent connections for their users - every second of downtime has a big impact on their service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; Branding. The custom domain "discordstatus.com" makes it super easy to find their status page and differentiate it from unofficial websites. Additionally, the in-page logo and brand colors help users know they're looking at the right status page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TO4BbtYG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pe05i65sga1v9v791o2o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TO4BbtYG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pe05i65sga1v9v791o2o.jpg" alt="Cloudflare Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://www.cloudflarestatus.com/"&gt;cloudflarestatus.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Cloudflare is used by millions of websites around the world for its content delivery network and DDoS protection service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; Their status page shows the current status for hundreds of server locations from around the world. As such, it can easily become complex and difficult to navigate. However, they group statuses by region and make it easy to collapse these groups so users can quickly find the relevant services. &lt;/p&gt;

&lt;h2&gt;
  
  
  Postmark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvuRHILf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeyhxvj0qwcpax1su8le.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvuRHILf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeyhxvj0qwcpax1su8le.jpg" alt="Postmark Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://status.postmarkapp.com/"&gt;status.postmarkapp.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Postmark is a transactional and marketing email SaaS. It makes it easy to send and receive emails via their API, and it's well known for its delivery success rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; From custom branding to ease of use, Postmark's status page gets many things right. Something to highlight about this example is that they include links to their FAQs and quick help. This makes it easy for users to find relevant information when they need it most. &lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dNGWHugl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w6jyqdavyrxvh0gc31ug.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dNGWHugl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w6jyqdavyrxvh0gc31ug.jpg" alt="GitHub Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://www.githubstatus.com/"&gt;githubstatus.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; GitHub is a hugely popular version control platform for Git repositories. Millions of developers around the world rely on their service to store, build and deploy their software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; GitHub's status page is quite minimalistic without sacrificing usability. Everything you need to know about their system status is presented in a one-page format. One detail we especially like is that you can hover over the service names to reveal useful contextual information about them. Additionally, their subtle use of branding and easy to find support links make it a great status page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon Web Services
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PAezdN7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4r0mv2yn61vzhh3387mo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PAezdN7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4r0mv2yn61vzhh3387mo.jpg" alt="AWS Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://health.aws.amazon.com/health/status"&gt;health.aws.amazon.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; AWS is a major cloud provider which arguably handles a huge proportion of internet traffic. Their services are mission-critical to thousands of companies around the world, and as such transparency around incidents and SLAs is vital for any business relying on them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; AWS has 27 regions, 87 availability zones and 400+ points of presence around the world. Without even considering the number of services available in each region, it's fair to say their status page contains a lot of information. But that doesn't mean it's difficult to understand. They've organized their services by region and provide search functionality so users can quickly find what they're looking for. &lt;/p&gt;

&lt;h2&gt;
  
  
  Twilio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gdUS6zd8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bzftv2he5ujnrfr1c6en.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gdUS6zd8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bzftv2he5ujnrfr1c6en.jpg" alt="Twilio Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://status.twilio.com/"&gt;status.twilio.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Twilio is an API for sending and receiving calls and text messages. It's very popular among developers for their easy to use API and vast documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; As the bridge between internet-based apps and countless network carriers around the world, there's plenty of moving pieces and ways in which the service performance can be temporarily degraded. Twilio presents their status page with a focus on active incidents by highlighting them at the very top of their page. This is valuable to developers looking to troubleshoot any issues in their integration, as they can quickly gauge if the outage is impacting their own apps and services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shopify
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7gSDtGm9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro92kl03lmlnaykr0nvj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7gSDtGm9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro92kl03lmlnaykr0nvj.jpg" alt="Shopify Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://www.shopifystatus.com/"&gt;shopifystatus.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; Shopify is an e-commerce platform used by millions of businesses around the world. You can create an online shop, upload your product catalog, manage orders and sales from one central place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; As many businesses rely on Shopify as the center-piece for their operations, their uptime and performance is critical to them. Their status page is another great example of keeping it simple while providing all the relevant information in one place. If you're a customer, they also make it easy to subscribe for notifications whenever there's an outage or planned maintenance window.   &lt;/p&gt;

&lt;h2&gt;
  
  
  DigitalOcean
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--71VWJeGH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vk9xzizlucwm6juyylid.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--71VWJeGH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vk9xzizlucwm6juyylid.jpg" alt="DigitalOcean Status Page" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Status page: &lt;a href="https://status.digitalocean.com/"&gt;status.digitalocean.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What they do:&lt;/strong&gt; DigitalOcean is a cloud infrastructure platform, popular for its focus in being easy to use and competitive pricing. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it a great status page:&lt;/strong&gt; As other cloud platforms, the number of services and locations they operate in makes for a lot of information to pack in one page. However, they present a summary of their services in a sidebar format, which makes it really easy to gauge the overall status of their platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final words
&lt;/h2&gt;

&lt;p&gt;In this article we took a look at a selection of real-world status pages and what makes them great examples. We hope the highlights mentioned in this list are useful to you when building your status page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Looking to create your own status page?&lt;/strong&gt; At Cronitor we've put together &lt;a href="https://cronitor.io/docs/status-pages-guide"&gt;The Complete Guide to Status Pages&lt;/a&gt; so you can create a beautiful status page in minutes. Check it out!&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Complete Guide to Status Pages</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Tue, 09 Aug 2022 14:04:00 +0000</pubDate>
      <link>https://dev.to/cronitorio/the-complete-guide-to-status-pages-394f</link>
      <guid>https://dev.to/cronitorio/the-complete-guide-to-status-pages-394f</guid>
      <description>&lt;p&gt;Picture this: Your phone is ringing, you received an on-call alert.&lt;/p&gt;

&lt;p&gt;Turns out, production is down and your customers want to know why they can’t access the site. There’s a flood of support tickets. People would like to get notified as soon as you resolve the incident.&lt;/p&gt;

&lt;p&gt;Your team is focused on fixing the issue. After all, the first rule of incident response is: stop the bleeding.&lt;/p&gt;

&lt;p&gt;But it’s difficult to keep everyone in the loop during the heat of the outage. There’s too many support channels and everyone is confused about the current status.&lt;/p&gt;

&lt;p&gt;Wouldn't it be nice to have a single page where anyone could check what’s the current status and any relevant information?&lt;/p&gt;

&lt;p&gt;Enter status pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QpKdBcXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n739iu21nsf5ofegfehy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QpKdBcXB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n739iu21nsf5ofegfehy.png" alt="Cronitor status page example" width="880" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this guide we'll explore what status pages are and why you should have one. We’ll then create a status page from scratch and explore everything you need to know to make the most out of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a status page
&lt;/h2&gt;

&lt;p&gt;A status page provides visibility into the current health of your software. It's a single page where anyone can view the latest status, any ongoing or past incidents.&lt;/p&gt;

&lt;p&gt;Incidents happen. Whether you’re a startup or a global enterprise what matters the most is how you handle them. Status pages help you &lt;strong&gt;turn every outage into an opportunity to build trust in your service&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With a status page, your customers can answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is your site up and running?&lt;/li&gt;
&lt;li&gt;How reliable is your service?&lt;/li&gt;
&lt;li&gt;What kind of performance can I expect from your API?&lt;/li&gt;
&lt;li&gt;Is there an ongoing outage?&lt;/li&gt;
&lt;li&gt;Where can I contact you in case of an emergency?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out this &lt;a href="https://statuspage-demo.cronitor.io/"&gt;demo status page&lt;/a&gt; for a real-world example of what they look like in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of having a status page
&lt;/h2&gt;

&lt;p&gt;A status page is of great help before and during downtime. Being transparent about how your team has handled incidents in the past is a great way to build trust.&lt;/p&gt;

&lt;p&gt;When your service is up, they help you showcase historical reliability. During downtime, they help your team communicate status updates with all stakeholders.&lt;/p&gt;

&lt;p&gt;Status pages enable your team to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Showcase your reliability.&lt;/strong&gt; Help your users see how reliable and performant your services are. This builds trust and sets the right expectations on what your SLAs are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share incident updates.&lt;/strong&gt; Simplify incident management by publishing updates from one place. Your team doesn't have to use different platforms to communicate incidents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate incident creation and resolution.&lt;/strong&gt; Monitoring platforms - such as Cronitor - create and resolve incidents for you. This frees up time for your team and ensures the status on your page is always accurate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce support tickets.&lt;/strong&gt; Be transparent about past and ongoing outages. Your customers can answer their questions without going through support first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not only tech-savvy customers that find them useful. More than ever our daily interactions happen over the internet and downtime happens. That's why many users now look for a company's status page whenever they think there's an issue.&lt;/p&gt;

&lt;p&gt;Let’s see it in action. Next, we’ll create a status page and cover some of the most common use cases for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create your first status page
&lt;/h2&gt;

&lt;p&gt;We’re using &lt;a href="https://cronitor.io"&gt;Cronitor&lt;/a&gt; to create our example status page. It’s a simple monitoring platform for your websites, APIs or cron jobs. The free tier includes up to 5 monitors and a basic status page, so feel free to follow along.&lt;/p&gt;

&lt;p&gt;To start, open your Cronitor dashboard and on the left-side menu, click on Status Pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--63MXFn1x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e9fphoctx40nsernr4gd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--63MXFn1x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e9fphoctx40nsernr4gd.png" alt="Create status page form" width="880" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can name your status page anything you’d like. You're asked for your website URL so that users can find your official website too.&lt;/p&gt;

&lt;p&gt;You should also pick a hosted subdomain of your choice. This is important as it enables you to view and share the status page right away. Note that the subdomain should be unique across all status pages on Cronitor.&lt;/p&gt;

&lt;p&gt;Click on Create - the status page is live!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8wMhoKrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l43sspj6tfdc6z0oe48c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8wMhoKrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l43sspj6tfdc6z0oe48c.png" alt="Empty status page" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can preview it by clicking on the View Status Page button on the top right side of the screen. You can always access it via the hosted subdomain you picked earlier. For example:&lt;a href="https://panelbear.cronitorstatus.com/"&gt; panelbear.cronitorstatus.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right now our status page is empty. Let's fix that by adding some page components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add page components
&lt;/h2&gt;

&lt;p&gt;Next let’s add some components to our status page. A component could be a check, job, heartbeat or even a group of monitors. You should&lt;a href="https://cronitor.io/docs/website-monitoring"&gt; create a few monitors&lt;/a&gt; if you haven’t already so you can attach them to your page.&lt;/p&gt;

&lt;p&gt;Once you have created some monitors, head back into your status page admin panel. Click on the “Add any monitor or group” search box to open the dropdown.&lt;/p&gt;

&lt;p&gt;This dropdown lets you attach any existing monitor as a component to your status page. Let’s pick a few of our monitors so that our status page is not empty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6LxMsm0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oyed3ay48323z8yl241a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6LxMsm0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oyed3ay48323z8yl241a.png" alt="Status page components form" width="880" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can re-order and rename the components as you’d like. Renaming is useful in case you'd like to have more control over what’s presented to your end users.&lt;/p&gt;

&lt;p&gt;Finally, let’s check out the status page with the components we added.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R-YS553l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbtfjghtvyc9xjjqgyo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R-YS553l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbtfjghtvyc9xjjqgyo4.png" alt="Status page with components added" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publish your first incident
&lt;/h2&gt;

&lt;p&gt;Now that we have created a status page, let's publish an incident to it to see how it all comes together.&lt;/p&gt;

&lt;p&gt;To start, go to your Cronitor dashboard and head into the Incidents page. Click on "Create Incident", you should now see the incident form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LJbPA1mf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5o7o5t6wvdejbrz6x0m9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LJbPA1mf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5o7o5t6wvdejbrz6x0m9.png" alt="Publish a new status page incident" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill in the incident details. Don't forget to select your status page in the Publish to Status Page dropdown. In case you'd like to publish to several status pages too, you can select them here.&lt;/p&gt;

&lt;p&gt;Under Incident Updates you can add any relevant updates. For example, when your team is investigating an incident, they could create update such as:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Investigating: We have detected a server outage, the team is investigating the issue."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once your team finds the issue and deploys a fix, they could publish another update:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Monitoring: We identified the issue and deployed the fix. We're monitoring the servers to ensure the incident has been resolved."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This helps your users understand the current status of an incident as well as the timeline of events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KFmqs-GV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpltncrn18wdv1vfctdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KFmqs-GV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpltncrn18wdv1vfctdr.png" alt="Incident timeline" width="880" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've added any incident updates you deem relevant, hit Save.&lt;/p&gt;

&lt;p&gt;Next, open the status page. You should be able to see the active incident at the top of the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kSffOIr3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6c8o75eftanwk2th1ns7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kSffOIr3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6c8o75eftanwk2th1ns7.png" alt="Status page with active incident" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolve an active incident
&lt;/h2&gt;

&lt;p&gt;Next, let’s resolve the incident so our users know we resolved the issue.&lt;/p&gt;

&lt;p&gt;Click on the one we created earlier, then Edit and add an update with the status “Resolved” to close this incident. You can optionally provide a description of the update.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6sZTmtaD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sr684fnl1ys1q4ju2rbn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6sZTmtaD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sr684fnl1ys1q4ju2rbn.png" alt="Resolve incident" width="880" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The incident will no longer appear at the top of the status page. But we can always find it again in the incident history page.&lt;/p&gt;

&lt;p&gt;Cronitor comes with built-in active monitoring and automated incidents. It can open an incident whenever your site, API or cron job is down. It will also resolve the incident when the monitor becomes healthy once again.&lt;/p&gt;

&lt;p&gt;Automated incidents are not published to status pages by default. This gives you total control over what you communicate to your users. They are only visible to your team in the Cronitor dashboard. In case you’d like them to appear on your page, you should attach them manually.&lt;/p&gt;

&lt;p&gt;Of course, you can publish an incident manually as we did earlier. An incident doesn’t have to have originated from an existing monitor. This is useful when you want to publish a general outage, or maintenance window.&lt;/p&gt;

&lt;h2&gt;
  
  
  View past incidents
&lt;/h2&gt;

&lt;p&gt;Your status page also makes it possible to view past incidents. This is useful to show how your team handled a previous outage and to be able to share incident details.&lt;/p&gt;

&lt;p&gt;To view past incidents, go to your status page and click on Incident History.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mdx_c9vA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa1pjkfk08ltxbcmr7us.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mdx_c9vA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa1pjkfk08ltxbcmr7us.jpeg" alt="Status page incident history" width="880" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can share individual incident URLs as they are permanent links. That means the URL does not change even if you resolve the incident or its details change. This makes it easier to collaborate both during and after the outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  View historical uptime and performance
&lt;/h2&gt;

&lt;p&gt;Every status page showcases your historical reliability with uptime and performance charts. They are automatically computed and kept up-to-date for you.&lt;/p&gt;

&lt;p&gt;Providing historical uptime charts is a great way for your users to understand how reliable your service is. For example, this is what the uptime chart looks like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LmYvpBk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kob1wqgsk7sp8oygptkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LmYvpBk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kob1wqgsk7sp8oygptkz.png" alt="Status page uptime chart" width="880" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Performance charts are great to showcase your team SLAs and the typical performance of your APIs or cron jobs. This helps you set expectations with any users wanting to make use of your APIs. They can better understand what constraints or guarantees they’re working with.&lt;/p&gt;

&lt;p&gt;Here’s an example of what performance charts look like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H6IbioSH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eno55rjpsym38c8natcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H6IbioSH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eno55rjpsym38c8natcr.png" alt="Status page performance chart" width="880" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right now only monitors of type Check and Job support these charts. Group components and heartbeats will display a simpler status without charts instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add your company branding
&lt;/h2&gt;

&lt;p&gt;The status page is fully functional. However, it's lacking some company branding to make it clear to our users that they've found the official page.&lt;/p&gt;

&lt;p&gt;We should add a company logo, some helpful links, and host the page under our own company domain.&lt;/p&gt;

&lt;p&gt;Let’s start by adding a company logo.&lt;/p&gt;

&lt;p&gt;First, in the Cronitor dashboard, go to your status page settings. Then under “Brand logo” you can upload the logo you wish to display on the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LXCIAmNw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs45ppzxkrm5bb11qvkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LXCIAmNw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs45ppzxkrm5bb11qvkm.png" alt="Upload status page logo" width="880" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hit Save and reload your status page. It now showcases our company logo - it looks great!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aNTk_Ui0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrz8uitdffhu587fm80c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aNTk_Ui0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrz8uitdffhu587fm80c.png" alt="Status page with logo" width="880" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Serve from your own domain
&lt;/h2&gt;

&lt;p&gt;Every status page comes with a cronitorstatus.com subdomain of your choice. The free subdomain makes it easy to quickly preview the page.&lt;/p&gt;

&lt;p&gt;However, most companies prefer to serve the status page from their own domain, eg. status.panelbear.com. This makes it easier for your customers to find your status page and know it's the official one.&lt;/p&gt;

&lt;p&gt;Cronitor makes it super easy to use your own domain. It comes down to two steps:&lt;/p&gt;

&lt;p&gt;1) Set your custom domain in the status page settings.&lt;br&gt;
2) Configure your DNS records to point to cname.cronitorstatus.com.&lt;/p&gt;

&lt;p&gt;Let’s add a custom domain for our example page.&lt;/p&gt;

&lt;p&gt;First, in the Cronitor dashboard go to your page settings and input the desired domain. It must be unique across all status pages in Cronitor. We’ll go with status.panelbear.com.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_rU45eC7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/79lnd0o5tfg71efxv3h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_rU45eC7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/79lnd0o5tfg71efxv3h5.png" alt="Status page custom domain form" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hit Save, and now go to your domain DNS records. These instructions depend on which third-party provider you’re using. We’ll use CloudFlare as it’s a popular one.&lt;/p&gt;

&lt;p&gt;Add a CNAME record for status.panelbear.com with a value of cname.cronitorstatus.com. Important note for CloudFlare: be sure to select “DNS-only” mode or the custom domain might not work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BDccheRT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/syihb6adslgfi2s14g9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BDccheRT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/syihb6adslgfi2s14g9k.png" alt="Cloudflare DNS records status page" width="880" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should now be able to view the status page via the custom domain at&lt;a href="https://status.panelbear.com/"&gt; status.panelbear.com.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When configuring DNS records it can take some time for our changes to propagate around the world. If you see any errors such as "DNS_PROBE_FINISHED_NXDOMAIN", it might be that the records haven’t propagated yet. This process can take anywhere from a few minutes to 24 hours.&lt;/p&gt;

&lt;p&gt;In case you’re having persistent issues remember &lt;a href="//mailto:support@cronitor.io"&gt;support is always an email away&lt;/a&gt; - we’re happy to help out! &lt;/p&gt;

&lt;h2&gt;
  
  
  Add customer support links
&lt;/h2&gt;

&lt;p&gt;Next let’s include a link to our customer support page. This way users know how to get in touch or find your docs when they need them the most.&lt;/p&gt;

&lt;p&gt;To do this, in the Cronitor admin panel, open your status page and click on Edit. Next fill-in a support URL and click on Save.&lt;/p&gt;

&lt;p&gt;Open your status page and notice the new “Support” button on the top right corner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Password protect your internal status pages
&lt;/h2&gt;

&lt;p&gt;It’s important to have control over who can access our status page. Most status pages are public, anyone who opens the page can see the components and incidents.&lt;/p&gt;

&lt;p&gt;However, many companies also use status pages for internal teams. These pages are not meant for external users as they can contain sensitive data. That's why Cronitor status pages support password protection and IP/network based protection.&lt;/p&gt;

&lt;p&gt;Let’s enable password protection to see this feature in action.&lt;/p&gt;

&lt;p&gt;First, in your Cronitor dashboard go to Status Pages, find your page and click on Edit. Under Deployment, click on Access, and select Password Protected. A new field should appear where you can input your desired password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4O-KaSYb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ni8wwe3e811lrlkxgxqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4O-KaSYb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ni8wwe3e811lrlkxgxqe.png" alt="Status page password form" width="880" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save your changes. If you open your status page you should see that a password is now required to access the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hsz1YGCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iiwi3kgdfyt4c6cvqn0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hsz1YGCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iiwi3kgdfyt4c6cvqn0v.png" alt="Password protected status page example" width="880" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Control access with IP allowlists
&lt;/h2&gt;

&lt;p&gt;Companies usually prefer to protect access to their status page by only allowing a set of specific IPs or office networks to access it.&lt;/p&gt;

&lt;p&gt;This is convenient for larger teams, as you'd no longer need to share the page password with everyone who needs access to it.&lt;/p&gt;

&lt;p&gt;It also increases security by completely removing the possibility of leaking the password (there is no password!). It also helps you ensure that people who no longer work at the company no longer have access to the page.&lt;/p&gt;

&lt;p&gt;Here’s how to limit who can access your page based on their IP or network:&lt;/p&gt;

&lt;p&gt;First, in your Cronitor dashboard, go to your status page settings and under Deployment you’ll see a field called IP Allowlist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M0je0q1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y8itmwk6nqdrbtiqq7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M0je0q1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y8itmwk6nqdrbtiqq7n.png" alt="Status page IP access control" width="880" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can enter one or more IP addresses or CIDR networks. It supports both IPv4 and IPv6. Let’s add our fictional office network to see it in action.&lt;/p&gt;

&lt;p&gt;Only devices that match an IP or network listed in this allowlist should be able to view the page contents.&lt;/p&gt;

&lt;p&gt;Try it out with your own IP. You should be able to view the status page - except it no longer requires a password!&lt;/p&gt;

&lt;p&gt;However, if the device IP is not granted access by the IP allowlist, the page won't disclose the content. That means components, metrics and incident details are not shown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tadQdpz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0kvdm1c5cz2hejgr4pe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tadQdpz2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0kvdm1c5cz2hejgr4pe.png" alt="IP access denied" width="880" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add contextual info to your components
&lt;/h2&gt;

&lt;p&gt;You can optionally add contextual information to each of your status page components. &lt;/p&gt;

&lt;p&gt;This helps your users understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which URL is being monitored by an uptime check.&lt;/li&gt;
&lt;li&gt;What to do in case of a failing component.&lt;/li&gt;
&lt;li&gt;What SLAs they can expect out of your service.&lt;/li&gt;
&lt;li&gt;Any additional information you consider important.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To add component descriptions, in your Cronitor dashboard go to your status page and click on the edit button next to any component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Um1HRGKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qjl1lnjdssz6p388lnwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Um1HRGKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qjl1lnjdssz6p388lnwt.png" alt="Component description form" width="880" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add a component description and hit Save. For our example, we just want to clarify which endpoint is being monitored by this component. But you could add any other information you deem useful.&lt;/p&gt;

&lt;p&gt;Once you've added a component description, head back to the status page and reload it. You should now be able to see the description by hovering over the info tooltip next to the component name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UGt0P1zY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqhvfzu5gv5lxx3823dk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UGt0P1zY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqhvfzu5gv5lxx3823dk.png" alt="Status page with component descriptions" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to RSS feeds
&lt;/h2&gt;

&lt;p&gt;A really useful feature of status pages is for your customers to be able to subscribe to updates.&lt;/p&gt;

&lt;p&gt;That way, your users can get notified whenever the status changes, instead of having to constantly refresh the page to see if there's any update.&lt;/p&gt;

&lt;p&gt;Every status page comes with its own RSS feed out of the box. To access it, simply click on the RSS Feed button on the top right corner of your status page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4kSAaze3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9cqzwurrwwpzmnceyqxf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4kSAaze3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9cqzwurrwwpzmnceyqxf.png" alt="Status page RSS feed" width="880" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Being able to subscribe to updates is a really powerful feature. This also enables your internal teams to get notified in their platform of choice. For example via email, webhooks or even by subscribing a Slack channel for updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try status pages for free
&lt;/h2&gt;

&lt;p&gt;In this guide we explained what status pages are and how they benefit anyone running mission critical software.&lt;/p&gt;

&lt;p&gt;We also covered how to create a status page using Cronitor. We then explored how to customize the page, publish and resolve incidents, and how to get the most out of it.&lt;/p&gt;

&lt;p&gt;Cronitor is &lt;strong&gt;the simple, yet powerful monitoring platform&lt;/strong&gt;. It’s trusted by thousands of developers from around the world. &lt;a href="https://cronitor.io/sign-up"&gt;Create your free account&lt;/a&gt; and launch a status page in minutes.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>25 Website Performance Metrics to Watch in 2022</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Wed, 08 Dec 2021 12:32:52 +0000</pubDate>
      <link>https://dev.to/cronitorio/25-website-performance-metrics-to-watch-in-2022-4f60</link>
      <guid>https://dev.to/cronitorio/25-website-performance-metrics-to-watch-in-2022-4f60</guid>
      <description>&lt;p&gt;Website performance is not about having high scores in some artificial benchmark. It's about ensuring you delight every visitor with a great experience.&lt;/p&gt;

&lt;p&gt;If you’re building a product or business, it’s crucial to always deliver a great end user experience. Frustrated visitors are more likely to abandon the site, and it has a direct impact on conversions and retention.&lt;/p&gt;

&lt;p&gt;But with hundreds of metrics available, it's often difficult to know where to focus your efforts and avoid wasting time on vanity metrics.&lt;/p&gt;

&lt;p&gt;In this guide I'll cover some of the most important website performance metrics to keep an eye on, and how to make the most out of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why website performance matters
&lt;/h2&gt;

&lt;p&gt;Many companies have found that a fast, responsive website can significantly boost your conversion rate and sales. For example, Amazon &lt;a href="https://www.forbes.com/sites/steveolenski/2016/11/10/why-brands-are-fighting-over-milliseconds/" rel="noopener noreferrer"&gt;found&lt;/a&gt; that for every 100 milliseconds it reduced on page load time, it increased sales by 1%.&lt;/p&gt;

&lt;p&gt;A 1% increase in annual sales for Amazon translates into billions of dollars in additional revenue alone, not to mention that faster websites lead to less frustrating experiences, which may in turn translate into more returning users down the line.&lt;/p&gt;

&lt;p&gt;Also, Google has &lt;a href="https://developers.google.com/search/blog/2020/05/evaluating-page-experience" rel="noopener noreferrer"&gt;incorporated&lt;/a&gt; many of these metrics as part of its ranking algorithm, as they are directly related to how frustrated a visitor might be when sent to your website.&lt;/p&gt;

&lt;p&gt;That's why, I believe that ensuring a great end user experience will be more important than ever in 2022 and beyond.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to interpret website performance metrics
&lt;/h2&gt;

&lt;p&gt;I recommend a top down approach to website performance monitoring. Focus on the metrics most impactful to user experience first, and only dive into page load time optimization once you've done that.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start by measuring your Core Web Vitals&lt;/strong&gt;. This helps you understand your page experience from the perspective of your end users.&lt;/li&gt;
&lt;li&gt;Then &lt;strong&gt;look at your Lighthouse scores and its suggestions&lt;/strong&gt;. They're often very actionable and pragmatic.&lt;/li&gt;
&lt;li&gt;Once you understand which factors impact your page experience the most. Deep dive into technical metrics such as page load time in order to &lt;strong&gt;troubleshoot performance bottlenecks&lt;/strong&gt;, and what might be causing issues on your site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, let's look at the complete list of metrics and what they mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Web Vitals
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals are some of the most important metrics to measure for page experience. They were first proposed by Google as a way to measure how visitors experience a website.&lt;/p&gt;

&lt;p&gt;If you want to have the best chance to rank higher than your competitors on search results, you should ensure that your site's Core Web Vitals fall within the recommended thresholds:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fcore-web-vitals.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fcore-web-vitals.png" alt="core-web-vitals.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Core Web Vitals best practices.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The key insight is that Web Vitals &lt;strong&gt;measure the page experience, as opposed to just load time figures&lt;/strong&gt;. Page load time often measures site speed from a purely technical perspective, and may not be representative of what really happened from the perspective of the user.&lt;/p&gt;

&lt;p&gt;What does that mean?&lt;/p&gt;

&lt;p&gt;For example, if the main content of a page has already loaded (eg. the blog post and images), but some background Javascript resources are still loading, one could argue that the page experience hasn't been significantly impacted by that script which hasn't yet loaded.&lt;/p&gt;

&lt;p&gt;In this example, the page load time would look very high, while in practice the visitor has already started reading the main piece of content, so there's no material impact on the experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Largest Contentful Paint (LCP)
&lt;/h3&gt;

&lt;p&gt;Largest Contentful Paint is a metric that measures how long it takes for the main piece of content to load on the screen.&lt;/p&gt;

&lt;p&gt;A LCP of 2.5 seconds or less is considered good, while a score of 4 seconds or more may lead to a poor experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cumulative Layout Shift (CLS)
&lt;/h3&gt;

&lt;p&gt;Cumulative Layout Shift (CLS) measures the visual stability of a website. In other words, it measures by how much the main elements shift around as the page loads.&lt;/p&gt;

&lt;p&gt;Google recommends a CLS of 0.1 or less. Usually the lower the better. If this score is too high it can lead to frustrated visitors, who may attempt to click on one button only for the element to move around as the rest of the page loads.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. First Input Delay (FID)
&lt;/h3&gt;

&lt;p&gt;First Input Delay measures input delay. In other words, it measures how quickly a user can start interacting with a website, even if it’s still loading.&lt;/p&gt;

&lt;p&gt;To make your site feel snappy, a FID of 100 milliseconds or less is advisable, while an input delay larger than 300 milliseconds may lead to a degraded experience.&lt;/p&gt;

&lt;p&gt;By the way, I also wrote a more detailed post on Core Web Vitals, check it out &lt;a href="https://panelbear.com/blog/core-web-vitals/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lighthouse Scores
&lt;/h2&gt;

&lt;p&gt;Lighthouse is an open source tool often used in Chrome DevTools to create automated reports on the quality of a web page. What makes this tool particularly useful is that it gives you suggestions on how to improve your scores.&lt;/p&gt;

&lt;p&gt;Why is this important? It's generally a good enough indicator of what search engines such as Google might evaluate when ranking your site.&lt;/p&gt;

&lt;p&gt;Even if your performance is great, you want to ensure your site is accessible, follows best practices, and has good SEO scores. This not only helps search engines understand the content on your site better, but directly affects how people interact with your site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Flighthouse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Flighthouse.png" alt="Lighthouse report"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example Lighthouse report.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Performance Score
&lt;/h3&gt;

&lt;p&gt;The Lighthouse Performance score is a weighted average of all performance audits. It's a number between 0 and 100, where higher means a better score.&lt;/p&gt;

&lt;p&gt;This score is determined by aggregating the following audits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First Contentful Paint&lt;/li&gt;
&lt;li&gt;Speed Index&lt;/li&gt;
&lt;li&gt;Largest Contentful Pain&lt;/li&gt;
&lt;li&gt;Time to Interactive&lt;/li&gt;
&lt;li&gt;Total Blocking Time&lt;/li&gt;
&lt;li&gt;Cumulative Layout Shift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read more on how Lighthouse weights these audits &lt;a href="https://web.dev/performance-scoring/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Accessibility Score
&lt;/h3&gt;

&lt;p&gt;The Lighthouse Performance score is a weighted average of all accessibility audits on your site. It's also a number between 0 and 100, where higher means a better score.&lt;/p&gt;

&lt;p&gt;It aggregates a large number of accessibility audits including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;aria&lt;/code&gt; attributes&lt;/li&gt;
&lt;li&gt;Images with &lt;code&gt;alt&lt;/code&gt; text&lt;/li&gt;
&lt;li&gt;Valid values for the &lt;code&gt;lang&lt;/code&gt; attribute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To see the full list of accessibility audits, and how Lighthouse weights these audits, &lt;a href="https://web.dev/accessibility-scoring/" rel="noopener noreferrer"&gt;here&lt;/a&gt; is an article on the topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. SEO Score
&lt;/h3&gt;

&lt;p&gt;The Lighthouse SEO score tells you how well search engines can understand your content. It's a weighted average of all SEO audits on your site.&lt;/p&gt;

&lt;p&gt;Again, it's a number between 0 and 100, where higher means a better score.&lt;/p&gt;

&lt;p&gt;Some audits included in this score are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element&lt;/li&gt;
&lt;li&gt;A valid &lt;code&gt;robots.txt&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;A valid &lt;code&gt;rel=cannonical&lt;/code&gt; attribute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's plenty more audits that fall within the scope of this score. To read the full list, check out &lt;a href="https://web.dev/lighthouse-seo/" rel="noopener noreferrer"&gt;this article&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Best Practices Score
&lt;/h3&gt;

&lt;p&gt;The Lighthouse Best Practices score tells you about the code health of your web page. As with all other scores, it also shows you opportunities to improve the health of your site.&lt;/p&gt;

&lt;p&gt;It's a weighted average, in which 0 is the lowest score and 100 the highest (better), and includes various technical audits such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct aspect ratio for images&lt;/li&gt;
&lt;li&gt;Using HTTP/2 for all resources&lt;/li&gt;
&lt;li&gt;Using HTTPS to serve the site&lt;/li&gt;
&lt;li&gt;Not using deprecated browser APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To read all audits included in this score, read &lt;a href="https://web.dev/lighthouse-best-practices/" rel="noopener noreferrer"&gt;this article&lt;/a&gt; by the Lighthouse team.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. PWA Score
&lt;/h3&gt;

&lt;p&gt;The Lighthouse PWA score tells you if your site is compatible with the requirements for a Progressive Web App. At a high level, that means it should be fast, reliable and installable.&lt;/p&gt;

&lt;p&gt;It's a weighted average, in which 0 is the lowest score and 100 the highest (better), and includes various technical audits such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page load should be fast even on mobile networks&lt;/li&gt;
&lt;li&gt;Use HTTPS to serve the website&lt;/li&gt;
&lt;li&gt;Registers a service worker that controls page and &lt;code&gt;start_url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The web app manifest meets the installability requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find the rest of the audits for this score in &lt;a href="https://web.dev/lighthouse-pwa/" rel="noopener noreferrer"&gt;this article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Page Load Metrics
&lt;/h2&gt;

&lt;p&gt;When you click a link, your web browser starts a multi-step process to load all synchronous resources required for this web page. The longer this process takes, the longer you must wait to interact with a website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fpage-load-timeline.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fpage-load-timeline.png" alt="Page load time process"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A simplified page load time process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How long this process takes is what the Page Load Time measures. It &lt;a href="https://panelbear.com/docs/page-load-time-explained/" rel="noopener noreferrer"&gt;involves multiple steps&lt;/a&gt;, and can be broken into multiple parts such as DNS lookup time, SSL/TLS, download size and many more.&lt;/p&gt;

&lt;p&gt;Let's look into each one individually.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Page Load Time
&lt;/h3&gt;

&lt;p&gt;Page load time measures the amount of time it takes for a complete web page to show up on your screen.&lt;/p&gt;

&lt;p&gt;It's measured from the point a user initiates it - such as clicking on a link or typing the website URL - to when the page has fully loaded in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-page-load.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-page-load.png" alt="Page load time"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Various page load time measurements in Panelbear&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Domain Lookup Time
&lt;/h3&gt;

&lt;p&gt;The Domain Lookup Time is the time spent resolving the server address for a given domain.&lt;/p&gt;

&lt;p&gt;For example, when you type &lt;code&gt;google.com&lt;/code&gt; your browser must first resolve that domain name into an IP address (the server which will serve the page HTML for our request). The duration of this process is what this metric measures.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Server Connection Time
&lt;/h3&gt;

&lt;p&gt;Once the browser has resolved the domain name into an IP address, it now needs to connect to the web server. The Server Connection Time measures how long it took to establish a TCP connection to the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Establish SSL/TLS Time
&lt;/h3&gt;

&lt;p&gt;Transport Layer Security (TLS) is an encryption protocol designed to secure communications over the Internet.&lt;/p&gt;

&lt;p&gt;Establish SSL/TLS Time measures how long it takes to perform a TLS handshake. During a TLS handshake, the two sides exchange messages to acknowledge and verify each other, establish which encryption algorithm will be used, and agree on session keys.&lt;/p&gt;

&lt;p&gt;This process is a foundational part of how HTTPS works, and is vital to ensure privacy and security while you browse the web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-dns-connect-tls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-dns-connect-tls.png" alt="DNS, TCP Connect and TLS network timings"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Various network timings in Panelbear.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Time to First Byte (TTFB)
&lt;/h3&gt;

&lt;p&gt;Time to First Byte (TTFB) is how long it takes from when a browser requests a page to when it receives the first byte of information from the server. This usually includes the time spent on DNS lookup, establishing the TCP connection, and the SSL/TLS handshake if the request was made over HTTPS.&lt;/p&gt;

&lt;p&gt;It's a good metric to approximate the performance of a backend server, from the perspective of the end user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-ttfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpanelbear.com%2Fstatic%2Fimg%2Fblog%2Fwebsite-performance-metrics%2Fmetric-ttfb.png" alt="Time to First Byte"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Inspecting the median TTFB for a website.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why is this metric important?&lt;/p&gt;

&lt;p&gt;If you measure the response time of your server from the server itself, you would only account for the time your server spent processing the request. In other words, the journey from your server to the user's browser would be unaccounted for.&lt;/p&gt;

&lt;p&gt;For example, say you are located in California and your server is located in an AWS data center in North Virginia. You measure your TTFB and you're happy to see a result of 25 ms. However, when a user from the EU or Australia opens your website, the TTFB is now 200-500 ms.&lt;/p&gt;

&lt;p&gt;The conclusion here might be that no matter if you scale your servers vertically or horizontally, the real issue is that the server is too far away from the end users. So you probably want to deploy servers in those regions too - assuming it makes sense for your product or business.&lt;/p&gt;

&lt;h3&gt;
  
  
  14. HTML Download Time
&lt;/h3&gt;

&lt;p&gt;HTML Download Time measures the time it takes to download the initial document for a website. This document normally references various other resources (images, stylesheets, scripts) which are queued for download too.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Render Time
&lt;/h3&gt;

&lt;p&gt;The Render Time measures how long it takes for the browser to paint the HTML document after downloading and parsing. This can vary a lot as it highly depends on the complexity of your site and the performance capabilities of the users device (eg. some mobile devices can take longer to render a complex website vs a powerful development machine).&lt;/p&gt;

&lt;h3&gt;
  
  
  16. Request Count
&lt;/h3&gt;

&lt;p&gt;The Request Count refers to the number of resources required to load a web page. The impact of this metric on end user experience is highly dependent on other factors too.&lt;/p&gt;

&lt;p&gt;For example, if you have a website which requires 50 requests to load but most of them are small resources which do not block rendering, it may not negatively impact how the user interacts with the site.&lt;/p&gt;

&lt;p&gt;On the other hand, if you have a web page which requires a single request to load, but that request takes 10 seconds to complete and loads several megabytes of data, it's likely the user will abandon the site before the request completes.&lt;/p&gt;

&lt;p&gt;As with most other metrics, it's useful to measure request count in relation to the other characteristics of your web page.&lt;/p&gt;

&lt;h3&gt;
  
  
  17. Transfer Size
&lt;/h3&gt;

&lt;p&gt;Transfer Size measures the total size of all assets transferred during page load. This includes every request for HTML, images, stylesheets, scripts, and JSON documents.&lt;/p&gt;

&lt;p&gt;It's a good measurement of how heavy your web page is.&lt;/p&gt;

&lt;h3&gt;
  
  
  18. HTML Transfer Size
&lt;/h3&gt;

&lt;p&gt;The HTML Transfer Size tells you the size of all HTML assets transferred on page load.&lt;/p&gt;

&lt;h3&gt;
  
  
  19. Image Transfer Size
&lt;/h3&gt;

&lt;p&gt;The Image Transfer Size tells you the size of all image assets transferred during page load.&lt;/p&gt;

&lt;p&gt;The following are examples of common image assets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format name&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;MIME type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graphics Interchange Format (GIF)&lt;/td&gt;
&lt;td&gt;.gif&lt;/td&gt;
&lt;td&gt;image/gif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Picture format (WEBP)&lt;/td&gt;
&lt;td&gt;.webp&lt;/td&gt;
&lt;td&gt;image/webp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portable Network Graphics (PNG)&lt;/td&gt;
&lt;td&gt;.png&lt;/td&gt;
&lt;td&gt;image/png&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AV1 Image File Format (AVIF)&lt;/td&gt;
&lt;td&gt;.avif&lt;/td&gt;
&lt;td&gt;image/avif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Joint Photographic Expert Group image (JPEG)&lt;/td&gt;
&lt;td&gt;.jpeg, .jpg&lt;/td&gt;
&lt;td&gt;image/jpeg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalable Vector Graphics (SVG)&lt;/td&gt;
&lt;td&gt;.svg&lt;/td&gt;
&lt;td&gt;image/svg+xml&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  20. CSS Transfer Size
&lt;/h3&gt;

&lt;p&gt;CSS Transfer Size measures the total size of all stylesheet (CSS) assets transferred during page load.&lt;/p&gt;

&lt;h3&gt;
  
  
  21. Font Transfer Size
&lt;/h3&gt;

&lt;p&gt;The Font Transfer Size tells you the size of all font assets transferred during page load.&lt;/p&gt;

&lt;p&gt;The following are examples of font assets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format name&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;MIME type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TrueType&lt;/td&gt;
&lt;td&gt;.ttf&lt;/td&gt;
&lt;td&gt;font/ttf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Open Font Format&lt;/td&gt;
&lt;td&gt;.woff, .woff2&lt;/td&gt;
&lt;td&gt;font/woff, font/woff2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenType&lt;/td&gt;
&lt;td&gt;.otf&lt;/td&gt;
&lt;td&gt;font/otf&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  22. Javascript Transfer Size
&lt;/h3&gt;

&lt;p&gt;The Javascript Transfer Size measures the total size of all Javascript (JS) assets transferred during page load.&lt;/p&gt;

&lt;p&gt;For many modern web apps, this asset type has become a considerable chunk of the page load process. Large Javascript files may not only lead to longer download times, but also increase the time the browser needs to parse and render the site. This can negatively affect how long it takes for the site to become interactive too.&lt;/p&gt;

&lt;p&gt;In order to improve load times, many applications now rely on techniques such as tree shaking (automatically remove unused code), asset bundling (package related assets together) and code splitting (split files and only load as required for specific pages). A popular tool for these purposes is &lt;a href="https://webpack.js.org" rel="noopener noreferrer"&gt;Webpack&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  23. JSON Transfer Size
&lt;/h3&gt;

&lt;p&gt;JSON Transfer Size measures the total size of all JSON assets transferred during page load.&lt;/p&gt;

&lt;h3&gt;
  
  
  24. Video Transfer Size
&lt;/h3&gt;

&lt;p&gt;Video Transfer Size measures the total size of all video assets transferred during page load.&lt;/p&gt;

&lt;p&gt;Here are some examples of common video assets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format name&lt;/th&gt;
&lt;th&gt;Extension&lt;/th&gt;
&lt;th&gt;MIME type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebM&lt;/td&gt;
&lt;td&gt;.webm&lt;/td&gt;
&lt;td&gt;video/webm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ogg&lt;/td&gt;
&lt;td&gt;.ogg&lt;/td&gt;
&lt;td&gt;video/ogg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPEG-4&lt;/td&gt;
&lt;td&gt;.mp4&lt;/td&gt;
&lt;td&gt;video/mp4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone Index&lt;/td&gt;
&lt;td&gt;.m3u8&lt;/td&gt;
&lt;td&gt;application/x-mpegURL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone Segment&lt;/td&gt;
&lt;td&gt;.ts&lt;/td&gt;
&lt;td&gt;video/MP2T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flash&lt;/td&gt;
&lt;td&gt;.flv&lt;/td&gt;
&lt;td&gt;video/x-flv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3GP Mobile&lt;/td&gt;
&lt;td&gt;.3gp&lt;/td&gt;
&lt;td&gt;video/3gpp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QuickTime&lt;/td&gt;
&lt;td&gt;.mov&lt;/td&gt;
&lt;td&gt;video/quicktime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A/V Interleave&lt;/td&gt;
&lt;td&gt;.avi&lt;/td&gt;
&lt;td&gt;video/x-msvideo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Media&lt;/td&gt;
&lt;td&gt;.wmv&lt;/td&gt;
&lt;td&gt;video/x-ms-wmv&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  25. Javascript Error Count
&lt;/h3&gt;

&lt;p&gt;The Javascript Error Count tells you how many runtime errors the browser encountered while loading your web page.&lt;/p&gt;

&lt;p&gt;While on its own it's not enough to troubleshoot and debug errors, it's very helpful to track this metric in aggregate to ensure no deployments or configuration changes cause unintended issues during runtime.&lt;/p&gt;

&lt;p&gt;This metric is most useful when monitored in conjunction with error tracking software. That way, if the total error count goes beyond your tolerance threshold, your team would be able to troubleshoot the issue by inspecting the reported stack traces, and breadcrumbs to understand why the issue happened and fix it early.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;As previously mentioned, a faster website not only helps deliver a &lt;a href="https://panelbear.com/blog/user-experience-monitoring-tools/" rel="noopener noreferrer"&gt;great user experience&lt;/a&gt;, but can also significantly boost your conversion rate and sales.&lt;/p&gt;

&lt;p&gt;Monitoring your website's performance over time is more important than ever in order to prevent unintended consequences when deploying bug fixes, adding third party scripts and making improvements to the site.&lt;/p&gt;

&lt;p&gt;That way you can make changes with confidence that you're not breaking stuff without realizing, and ensuring you always deliver a great experience on your website.&lt;/p&gt;

&lt;p&gt;I hope this guide comes useful to you. Also, be sure to check out my guide on &lt;a href="https://panelbear.com/blog/website-monitoring-tools/" rel="noopener noreferrer"&gt;website monitoring tools&lt;/a&gt; for various alternative tools you can use to monitor your frontend applications.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Monitoring Next.js Apps in Production</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Fri, 17 Sep 2021 10:43:05 +0000</pubDate>
      <link>https://dev.to/cronitorio/monitoring-next-js-apps-in-production-1o7m</link>
      <guid>https://dev.to/cronitorio/monitoring-next-js-apps-in-production-1o7m</guid>
      <description>&lt;p&gt;I've been using Next.js for various new projects over the past year, and immediately fell in love with its development experience. Out of the box, it includes goodies such as client-side routing, fast refresh, code splitting, static generation (SSG) and server-side rendering (SSR).&lt;/p&gt;

&lt;p&gt;However, over time I've learned that building an application and running it in production are wildly different things. When you run a website in production visitors have certain expectations about its uptime, reliability and performance, and each aspect comes with its own set of challenges.&lt;/p&gt;

&lt;p&gt;That's why, whether you're launching a new site or running a mission-critical service, you probably want to have some form of monitoring in place to ensure things are running smoothly. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyas2q7pdskmne6z8hlh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyas2q7pdskmne6z8hlh0.png" alt="Performance analytics for a Next.js app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this guide I'll be showing you how to monitor your Next.js app's live traffic and performance, track custom events, and even set up Slack alerts to get notified when something's up. &lt;/p&gt;

&lt;p&gt;I'll be using Panelbear, which has a free tier so you can follow along. By the way, I'm the founder and also wrote a blog post on &lt;a href="https://anthonynsimon.com/blog/one-man-saas-architecture/" rel="noopener noreferrer"&gt;the tech stack&lt;/a&gt; in case you're interested.&lt;/p&gt;

&lt;p&gt;Let's get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up your Next.js project
&lt;/h2&gt;

&lt;p&gt;First things first, let's create a repo and initialize our Next.js app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="nx"&gt;panelbear&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nextjs&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://github.com/vercel/next-learn-starter/tree/master/learn-starter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next let's &lt;code&gt;cd&lt;/code&gt;  into the directory, and start the development server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;panelbear&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;example&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;nextjs&lt;/span&gt;

&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nx"&gt;dev&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;learn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;starter&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="nx"&gt;dev&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="nx"&gt;dev&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ready&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you now open &lt;code&gt;http://localhost:3000&lt;/code&gt; on your browser, you should see the example Next.js starter app appear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnke7xshxzvbnckg2njsu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnke7xshxzvbnckg2njsu.png" alt="Next.js starter template"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next.js has compiled our app and generated all the assets needed to serve it - pretty standard stuff so far. This is usually where you start building your actual project, but we'll stick to the starter template since we're more interested in the monitoring aspects for this guide.&lt;/p&gt;

&lt;p&gt;Now let's move on to adding the analytics script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the tracking code
&lt;/h2&gt;

&lt;p&gt;Assuming you already created your Panelbear account, let's register a new site. We'll call it "Next.js Example App" so we can easily recognise it later.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can register new sites on the overview page.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuucvfx8d6n403s3wu1t9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuucvfx8d6n403s3wu1t9.png" alt="Site overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let's give our new site a name.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fte37hpdwtg5mr0dy0lmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fte37hpdwtg5mr0dy0lmx.png" alt="Creating a new site"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Panelbear will show you a snippet of code to integrate with any web application framework. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ynqq880u2uvy0hev55n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ynqq880u2uvy0hev55n.png" alt="The standard tracking snippet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Normally you just put this snippet on your HTML head section, but since there's an &lt;a href="https://www.npmjs.com/package/@panelbear/panelbear-nextjs" rel="noopener noreferrer"&gt;official Next.js integration&lt;/a&gt;, we'll use that instead. For now simply take note of your site ID (you can always find it later in your &lt;a href="https://panelbear.com/docs/how-to-find-site-id/" rel="noopener noreferrer"&gt;site settings page&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Simply install the following dependency on your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;panelbear&lt;/span&gt;&lt;span class="sr"&gt;/panelbear-nextj&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This package includes a React hook that can be added to the lifecycle of your Next.js app. To do this, create a file in the &lt;code&gt;pages&lt;/code&gt; directory of your project, and call it &lt;code&gt;_app.js&lt;/code&gt;. The &lt;a href="https://nextjs.org/docs/advanced-features/custom-app" rel="noopener noreferrer"&gt;custom Next.js app&lt;/a&gt; is what controls the initialisation of each page, and it's always located at &lt;code&gt;pages/_app.js&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;For the purposes of this tutorial, it should have the following contents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./pages/_app.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usePanelbear&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@panelbear/panelbear-nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageProps&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// Load Panelbear on app init&lt;/span&gt;
  &lt;span class="nf"&gt;usePanelbear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_SITE_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;pageProps&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now simply replace &lt;code&gt;"YOUR_SITE_ID"&lt;/code&gt; with the site ID that we got from Panelbear earlier.&lt;/p&gt;

&lt;p&gt;That's all that's needed! Next, let's try it locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the analytics locally
&lt;/h2&gt;

&lt;p&gt;By default, Panelbear does not track events in localhost to prevent using up your plan quota. When you &lt;a href="https://panelbear.com/docs/local-development/" rel="noopener noreferrer"&gt;enable debug mode&lt;/a&gt;, it will send the events and also log them to the console. Just don't forget to disable it again when deploying to production.&lt;/p&gt;

&lt;p&gt;Tip: You could also set the debug option based on an environment variable such as &lt;code&gt;NODE_ENV&lt;/code&gt; or load it from a configuration file - it's completely up to you!&lt;/p&gt;

&lt;p&gt;This is what your &lt;code&gt;pages/_app.js&lt;/code&gt; file should look like at this point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./pages/_app.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usePanelbear&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@panelbear/panelbear-nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageProps&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="c1"&gt;// Load Panelbear on app init&lt;/span&gt;
  &lt;span class="nf"&gt;usePanelbear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_SITE_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;pageProps&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we made changes to our Next.js main app, we'll need to restart the development server. Let's do that and refresh the page at &lt;code&gt;http://localhost:3000/&lt;/code&gt;. If you open the console, you should see that an event is being triggered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcowf0nib5c58sigll48x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcowf0nib5c58sigll48x.png" alt="Debug mode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, if you now head to the Panelbear dashboard, you should see the page impression appearing shortly after it happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F320q8bb32xf3t3d8x68u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F320q8bb32xf3t3d8x68u.png" alt="Analytics dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also simply click on anything to filter for it. For example, on a dashboard with a lot of data I can filter for visits coming from the United States who found my site via Google.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp68im4pdzl4ox54pxapf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp68im4pdzl4ox54pxapf.png" alt="Filter analytics example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's great! Next let's review some useful features we could make use of in our application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track custom events
&lt;/h2&gt;

&lt;p&gt;A really useful feature available in Panelbear is being able to &lt;a href="https://panelbear.com/docs/custom-events/" rel="noopener noreferrer"&gt;record custom events&lt;/a&gt;. Events are simply data points collected during a visit. For example, a Pageview is the most common type of event, but you could also track Signup events or ButtonClick events if you wanted.&lt;/p&gt;

&lt;p&gt;To send custom events, all you have to do is to call the &lt;code&gt;Panelbear.track(...)&lt;/code&gt; function anywhere in your client-side code.&lt;/p&gt;

&lt;p&gt;For example, here's how you would record a &lt;code&gt;NewsletterSignup&lt;/code&gt; event as a form submit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Panelbear&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@panelbear/panelbear-js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SignupForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Handle form submit&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Handling newsletter signup: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Record custom event on submit&lt;/span&gt;
    &lt;span class="nx"&gt;Panelbear&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SignupNewsletter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Email:
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice it's simply a matter of calling the function with the desired event name.&lt;/p&gt;

&lt;p&gt;Here's what custom events look like on one of my dashboards:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvwr6zjf4c4fwi72tsum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvwr6zjf4c4fwi72tsum.png" alt="Custom events example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's interesting is that you can filter for one of them - say newsletter sign ups - and plot the conversion rate over time. For example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uuswlgw41eba7kz86lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7uuswlgw41eba7kz86lm.png" alt="Plotting conversion rate for custom events"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use custom events for pretty much anything you can think of, but most applications use it to track product-related metrics (eg. signups, modals, which features are being used the most).&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor your app usage and performance
&lt;/h2&gt;

&lt;p&gt;Out of the box, Panelbear records usage and performance stats on every visit. These stats include things such as the session country, referrers, &lt;a href="https://panelbear.com/docs/page-load-time-explained/" rel="noopener noreferrer"&gt;page load time&lt;/a&gt;, and various timings such as time spent on the frontend, backend and network.&lt;/p&gt;

&lt;p&gt;For example, here's what one of my site's performance dashboard looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjtsnofi4ni0rv4hgelb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjtsnofi4ni0rv4hgelb.png" alt="Website performance dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data collection approach uses no tracking cookies, there's no way to trace the session data back to an individual, and Panelbear is funded by paid subscriptions, not by selling personal data to anyone.&lt;/p&gt;

&lt;p&gt;To achieve this, all interactions made by a visitor are stripped out of personal data and grouped into short lived sessions. These sessions are isolated per site, &lt;a href="https://panelbear.com/docs/what-we-collect/" rel="noopener noreferrer"&gt;only collect what is necessary&lt;/a&gt;, and automatically expire after a short period of inactivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anonymizing specific URLs
&lt;/h2&gt;

&lt;p&gt;Panelbear already strips out the most common places where sensitive data appears. Things like the IP-address, cookies, query parameters, and various other data points are already handled. &lt;/p&gt;

&lt;p&gt;However, sometimes there's sensitive data being reported in the page URL. For example, in user setting pages such as &lt;code&gt;/users/123456789/settings&lt;/code&gt; , the user ID is clearly visible in the page URL which will appear on the analytics dashboards. This could leak information about the session and some of the interactions this visitor performed on our site.&lt;/p&gt;

&lt;p&gt;To modify the event data before it even reaches Panelbear's servers, we can make use of the &lt;code&gt;beforeSend&lt;/code&gt; feature on the tracking snippet. It's a small hook that lets you &lt;a href="https://panelbear.com/docs/filter-transform-events/" rel="noopener noreferrer"&gt;transform or filter out events&lt;/a&gt; right before being sent.&lt;/p&gt;

&lt;p&gt;Let's add this functionality to our Panelbear hook in the &lt;code&gt;pages/_app.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./pages/_app.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usePanelbear&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./../hooks/panelbear&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageProps&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nf"&gt;usePanelbear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_SITE_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Enable debug mode to send events locally&lt;/span&gt;
        &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="c1"&gt;// Transform events before sending&lt;/span&gt;
        &lt;span class="na"&gt;beforeSend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Replace user ID with placeholder&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/.*&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;users&lt;/span&gt;&lt;span class="se"&gt;\/([&lt;/span&gt;&lt;span class="sr"&gt;a-z-A-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)(\/&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/gm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;pageProps&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;CustomApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will check if the event has a URL component, and try to search and replace user IDs into some placeholder value. For example, the &lt;code&gt;/users/123456789/settings&lt;/code&gt;  URL from earlier will be reported as &lt;code&gt;/users/user_id/settings&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receive alerts when something's up
&lt;/h2&gt;

&lt;p&gt;Now that we have set up analytics and performance monitoring on our Next.js app, let's configure some alerts to get notified when our site is getting increased traffic.&lt;/p&gt;

&lt;p&gt;But first, we'll need to configure a couple of notification channels. These are the integrations that should be notified when any alert triggers. It could be anything from the email of the marketing team to a Slack or Discord channel.&lt;/p&gt;

&lt;p&gt;To do so, simply head to your Account Settings and click on Integrations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwtu1z3dimudd8tblcuq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwtu1z3dimudd8tblcuq.png" alt="Available alerting integrations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you can add any integrations you wish. For example you could use the email notification to send alerts to a "developers" or "on-call" team inbox, or you could even add a Slack or Discord  channel dedicated to alerts - it's completely up to you!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqfg2jt9847taq0gbtun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqfg2jt9847taq0gbtun.png" alt="Example Slack integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, now that we configured a couple of integrations let's setup our first alert. Simply go to the Alerts tab on your website's dashboard and click on New Alert.&lt;/p&gt;

&lt;p&gt;You should now configure the alert to trigger when the number of visits in the past hour exceeds a desired threshold. You should also pick one or more integrations that should be notified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58bbmunzrb949g0vg7il.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58bbmunzrb949g0vg7il.png" alt="Creating a new alert"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save it, and we’re done! In order to test the alert, you can click on the "Test" button to send an example alert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvm4qli1oqez69grefck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvm4qli1oqez69grefck.png" alt="Testing alerts via Slack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can of course create more alerts and different notification channels. Optionally you can also create page speed alerts, it's not only limited to traffic spikes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go from here
&lt;/h2&gt;

&lt;p&gt;We've covered how to set up traffic and performance monitoring for our Next.js app. Additionally we saw how to track custom events, and anonymize sensitive pages to protect visitor privacy.&lt;/p&gt;

&lt;p&gt;Of course, there's plenty more we could monitor about our application. For example there's uptime monitoring, runtime errors, and perceived performance with Core Web Vitals.&lt;/p&gt;

&lt;p&gt;You can monitor pretty much every aspect about your application, and there's hundreds of tools available. That's why I also wrote a guide on the various &lt;a href="https://panelbear.com/blog/website-monitoring-tools/" rel="noopener noreferrer"&gt;website monitoring tools&lt;/a&gt; available, feel free to check it out too.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed this post, and it comes useful to you. Have any comments or questions? Feel free to &lt;a href="http://twitter.com/anthonynsimon" rel="noopener noreferrer"&gt;shoot me a message on Twitter&lt;/a&gt; - I'm happy to help.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>monitoring</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Tour of Website Monitoring Tools</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Fri, 06 Aug 2021 16:11:05 +0000</pubDate>
      <link>https://dev.to/cronitorio/a-tour-of-website-monitoring-tools-fnm</link>
      <guid>https://dev.to/cronitorio/a-tour-of-website-monitoring-tools-fnm</guid>
      <description>&lt;p&gt;How would you know your website or app is running smoothly if you're not even looking for problems? Without monitoring software you're essentially flying an aircraft without navigation instruments.&lt;/p&gt;

&lt;p&gt;That's why, whether you're just getting started, or running a mission-critical website, you'll probably want some form of monitoring in place to ensure things are working as expected, and to continuously improve your end-user experience.&lt;/p&gt;

&lt;p&gt;In this article I'll be walking you through the various types of frontend monitoring tools out there, and how they can help you ship better software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error tracking and crash reporting
&lt;/h2&gt;

&lt;p&gt;Error tracking software lets you identify and troubleshoot runtime issues for your application. It works by installing an agent in your application which then listens for errors in the background, and sends them to a backend service for aggregation and alerting you when something's up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9hutb020tprm64hof4tn.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9hutb020tprm64hof4tn.jpeg" alt="Sentry error tracking and crash reporting"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Sentry is a great option for surfacing and troubleshooting errors.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This type of monitoring software has been incredibly useful to me. It has helped me spot countless bugs in the past that would only surface during real world usage and the testing suite completely missed.&lt;/p&gt;

&lt;p&gt;When it comes to privacy, many of them offer anonymization features which can either redact or completely drop information from an error which can potentially identify a user.&lt;/p&gt;

&lt;p&gt;There's many alternatives, some even open source in case you're looking for self hosted software. Here's some of my personal picks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;, well known for its open source offering and my current tool of choice for error tracking. It's more than just error tracking, since it also includes things like performance monitoring and distributed tracing.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.honeybadger.io/" rel="noopener noreferrer"&gt;Honeybadger&lt;/a&gt;, it also bundles additional features such as uptime monitoring which can come quite handy if you're looking for this combo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rollbar.com/" rel="noopener noreferrer"&gt;Rollbar&lt;/a&gt;, another great alternative which is quite popular with enterprise companies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Synthetic monitoring
&lt;/h2&gt;

&lt;p&gt;Synthetic monitoring refers to a set of tools which automatically perform checks on your website or API at regular intervals - say, every minute- and notify you when something might be off.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59saiw2okkb0gr59b5cx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59saiw2okkb0gr59b5cx.jpeg" alt="Checkly synthetic monitoring"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Transaction monitoring on Checkly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These tools include everything from uptime monitoring services to load testing software to transaction monitoring to security scans.&lt;/p&gt;

&lt;p&gt;They're commonly used since it's usually the most straightforward way to know if your website is down, perform benchmarks, measure SLAs and even perform end-to-end tests on user transactions (eg. arrive on the landing page, go to the signup page, submit form).&lt;/p&gt;

&lt;p&gt;The tool you need depends on which checks you're looking to automate, but I'll mention some of the alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodeping.com/" rel="noopener noreferrer"&gt;NodePing&lt;/a&gt;, a less known website monitoring service, but previous teams I've worked at used to monitor some pretty mission-critical sites and it was rock solid throughout the 5 years we depended on it. Not affiliated in any way, just happy with their service.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cronitor.io/uptime-monitoring" rel="noopener noreferrer"&gt;Cronitor&lt;/a&gt;, while focused on cron job monitoring, also includes uptime monitoring for websites, APIs, S3 Buckets and more.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://betteruptime.com/" rel="noopener noreferrer"&gt;Better Uptime&lt;/a&gt;, one of the newer alternatives, combines incident management and monitoring in one tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://uptimerobot.com/" rel="noopener noreferrer"&gt;Uptime Robot&lt;/a&gt;, a very popular uptime monitoring service with a free plan.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.checklyhq.com/" rel="noopener noreferrer"&gt;Checkly&lt;/a&gt;, automated end-to-end testing of website or API transactions. Integrates with CI workflows on GitHub and has a generous free tier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to these there's plenty others, sometimes larger platforms include uptime monitoring too, for example New Relic and Datadog both have some of these features built-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marketing analytics
&lt;/h2&gt;

&lt;p&gt;Marketing analytics software gives you reports and statistics to help you understand where visitors are coming from, which pages they visit, and which marketing efforts convert better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj240flvfljvu4lu9yee.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnj240flvfljvu4lu9yee.jpeg" alt="Google Analytics dashboard"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Google Analytics is a well-known marketing analytics solution.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They're commonly used by marketing professionals, rather than product development teams, but since most website owners want to measure basic metrics such as unique visitors, top pages and referrers, they're used quite extensively across the web.&lt;/p&gt;

&lt;p&gt;There's plenty of tools in this space, which deserve their own blog post, but here's some alternatives to get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketingplatform.google.com/about/analytics/" rel="noopener noreferrer"&gt;Google Analytics&lt;/a&gt;, a well-known analytics product. It offers hundreds of metrics and reports, and while it's free to get started it can get prohibitively expensive once you reach a certain level of traffic.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://matomo.org/" rel="noopener noreferrer"&gt;Matomo&lt;/a&gt;, a popular open source alternative to Google Analytics. You can either self-host or let them manage a cloud instance for you.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://plausible.io/" rel="noopener noreferrer"&gt;Plausible&lt;/a&gt;, another open source alternative, but focused on privacy. Their cloud offering is affordable and based in the EU.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://splitbee.io/" rel="noopener noreferrer"&gt;Splitbee&lt;/a&gt;, focused on simple analytics while offering some distinct automation and conversion optimization features.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://usefathom.com/" rel="noopener noreferrer"&gt;Fathom&lt;/a&gt;, a well-known alternative with a focus on simplicity and privacy.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simpleanalytics.com/" rel="noopener noreferrer"&gt;Simple Analytics&lt;/a&gt;, a popular alternative from the Netherlands with some pretty distinctive features such as a "tweet viewer" and social share banners. Also highly focused on privacy and simplicity.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://panelbear.com/" rel="noopener noreferrer"&gt;Panelbear&lt;/a&gt;, while it's not entirely focused on being a marketing analytics tool, I think it's a great alternative if you're looking for &lt;a href="https://panelbear.com/cookie-free-analytics/" rel="noopener noreferrer"&gt;analytics without cookies&lt;/a&gt;. Full disclosure: I'm currently building this tool. In case you check it out, let me know what you think!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Product analytics
&lt;/h2&gt;

&lt;p&gt;Product analytics is often confused with marketing analytics software. The difference is that product analytics helps you understand how your website or app is being used in terms of its features, while marketing analytics focuses on giving you statistics about how visitors arrive at your website and which content is most engaging.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoc5h2m16prpntec84uy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoc5h2m16prpntec84uy.jpeg" alt="Amplitude product analytics"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Amplitude is a popular product analytics tool.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For example, product analytics would be best if you want to track which product features are being used, identify user experience problems, and which customers are most likely to churn based on their usage.&lt;/p&gt;

&lt;p&gt;This information helps product teams make decisions on how to improve on existing features or what to build next. Without it, it's difficult to understand what's working and what isn't about your product.&lt;/p&gt;

&lt;p&gt;Here's a list of product analytics software that is used quite often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://mixpanel.com/" rel="noopener noreferrer"&gt;Mixpanel&lt;/a&gt;, a very popular tool focused on event and conversion tracking. Something interesting is that they have an EU Data Residency program, which lets you pick whether to store the data in the US or Europe to simplify compliance.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://heap.io/" rel="noopener noreferrer"&gt;Heap&lt;/a&gt;, a cool feature is that integrating it on your website is relatively simple, it just tracks every interaction so you can more easily understand product usage with little effort.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amplitude.com/" rel="noopener noreferrer"&gt;Amplitude&lt;/a&gt;, another popular alternative which focuses on segmentation and user journeys. It groups similar to users so you can analyse usage patterns rather than individual actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Application performance monitoring (APM)
&lt;/h2&gt;

&lt;p&gt;Application performance monitoring tools help you debug issues and identify performance bottlenecks. Many of these tools can trace request timings from the frontend to the backend and all the way to the database requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0sd2tmbyze92c4ox8b5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0sd2tmbyze92c4ox8b5.jpeg" alt="Elastic application performance monitoring"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;If you're using the ELK stack you might want to check out the Elastic APM.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These traces can be valuable if you're trying to understand which requests are slowing down your application, and whether the bottleneck is the frontend, network, backend or the database.&lt;/p&gt;

&lt;p&gt;Which one works best for you depends highly on how detailed you want these metrics to be. There are countless tools, both SaaS and open source which can help you here, with varying levels of complexity and cost.&lt;/p&gt;

&lt;p&gt;Here's some of the commonly used APM software I've encountered with in the wild:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://sentry.io/for/performance/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;, while Sentry is well known for its error tracking product, they recently released performance monitoring features which pair well with the rest of their offering. I've been testing it for a few months now and I like what I see.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.elastic.co/apm/" rel="noopener noreferrer"&gt;Elastic APM&lt;/a&gt;, from the guys behind Elasticsearch and Kibana, it's a popular open source stack for logs and metrics which includes an APM product.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://newrelic.com/products/application-monitoring" rel="noopener noreferrer"&gt;New Relic&lt;/a&gt;, their APM is one of the most popular out there and integrates well with the rest of their stack.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datadoghq.com/product/apm/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;, this one is among my favourites. It's a comprehensive product with lots of integrations, which has served the teams I've worked with well over the years.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real user monitoring (RUM)
&lt;/h2&gt;

&lt;p&gt;Real user monitoring measures your application's usage and performance from the perspective of your end users. It's sometimes also called browser monitoring, since it can detect performance issues, Javascript errors, and other on-device information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1a10r756mlgeft4wj4u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1a10r756mlgeft4wj4u.jpeg" alt="Panelbear real user monitoring"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Panelbear provides traffic and performance insights in a simple dashboard.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why should you care about this? It's tempting to think that access logs or measuring response times on your servers is enough, but that's only half the picture. Your end user's device, connection speed, and geographical location play a vital role in your application's real performance.&lt;/p&gt;

&lt;p&gt;Metrics such as browser timings, the &lt;a href="https://panelbear.com/docs/page-load-time-explained/" rel="noopener noreferrer"&gt;page load time&lt;/a&gt;, and new standards such as &lt;a href="https://panelbear.com/blog/core-web-vitals/" rel="noopener noreferrer"&gt;Core Web Vitals&lt;/a&gt; are best measured from the perspective of the end user under real world conditions. It's about understanding the end-to-end experience, and what your real users perceive as opposed to testing things on a powerful development workstation.&lt;/p&gt;

&lt;p&gt;Here's some great alternatives to consider if you're looking to add real user monitoring to your application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.speedcurve.com/" rel="noopener noreferrer"&gt;SpeedCurve&lt;/a&gt;, while it's mainly focused on performance metrics, it's a solid product with some unique features such as page load filmstrips.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.datadoghq.com/product/real-user-monitoring/" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;, I've used it for several years and it's honestly great. It can get a bit expensive, but they also offer so much more. It's a complete monitoring platform.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://raygun.com/platform/real-user-monitoring" rel="noopener noreferrer"&gt;Raygun&lt;/a&gt;, which also offers others error reporting and an APM product.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.pingdom.com/real-user-monitoring/" rel="noopener noreferrer"&gt;Pingdom&lt;/a&gt;, while it's mainly known for its uptime monitoring service, it also offers a RUM product.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://panelbear.com/" rel="noopener noreferrer"&gt;Panelbear&lt;/a&gt;, it includes real time traffic and performance insights, and it's free to get started. Again, I'm building this tool, and while it's still in the early stages, I'm happy to hear what you think!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;While some teams do just fine using marketing analytics software - such as Google Analytics - it's not enough to get a complete picture over your application's usage, performance, and uptime.&lt;/p&gt;

&lt;p&gt;At some point, most teams rely on some combination of monitoring tools which help them build and improve their software over time.&lt;/p&gt;

&lt;p&gt;I hope this guide helped paint a more complete picture of the frontend monitoring landscape. Did you enjoy it? You can &lt;a href="https://twitter.com/anthonynsimon" rel="noopener noreferrer"&gt;find me on Twitter&lt;/a&gt; in case you have any questions or comments.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tooling</category>
    </item>
    <item>
      <title>An Introduction to Core Web Vitals</title>
      <dc:creator>anthonynsimon</dc:creator>
      <pubDate>Wed, 28 Jul 2021 15:38:23 +0000</pubDate>
      <link>https://dev.to/cronitorio/an-introduction-to-core-web-vitals-4581</link>
      <guid>https://dev.to/cronitorio/an-introduction-to-core-web-vitals-4581</guid>
      <description>&lt;p&gt;Ever noticed that some websites appear to load quickly, but then suddenly become unresponsive when you try to click on a button or image? Turns out, page load time is not the only metric that matters when it comes to delivering a great end-user experience.&lt;/p&gt;

&lt;p&gt;In the past, website owners relied on technical measurements such as the page load time to understand how fast a website loads on a visitor's device. Site speed is a useful metric to track, but does not tell the full story when it comes to user experience.&lt;/p&gt;

&lt;p&gt;For example, even though the page might have loaded quickly, it's likely the visitor would be frustrated when multiple popups suddenly appear and block the view of the main content. A frustrated visitor is more likely to leave, regardless of the quality of the content in the website, as it matters more than ever how pleasant it is to use a website.&lt;/p&gt;

&lt;p&gt;Web Vitals are a set of standardised metrics proposed by Google, that help understand how visitors are really experiencing a website, rather than relying on performance scores and artificial benchmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Web Vitals
&lt;/h2&gt;

&lt;p&gt;While Web Vitals consist of various different metrics, let's explore a subset of them called Core Web Vitals. These are three metrics that tend to have the largest impact on user experience, and the ones which I'll focus on for this purposes of this article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Largest Contentful Paint (LCP), how fast the main content on a website loads.&lt;/li&gt;
&lt;li&gt;First Input Delay (FID), how quickly can a visitor start interacting with a site.&lt;/li&gt;
&lt;li&gt;Cumulative Layout Shift (CLS), how visually stable is the website layout as content loads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftdt9uuudpx5knu9epn0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftdt9uuudpx5knu9epn0h.png" alt="Recommended Core Web Vitals targets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Largest Contentful Paint
&lt;/h2&gt;

&lt;p&gt;Largest Contentful Paint (LCP) is a metric that measures how long it takes for the main piece of content to load on the screen, as opposed to the time it took for the entire page to load.&lt;/p&gt;

&lt;p&gt;It's different from the page load time, as it measures what the visitor perceives instead of the actual number on paper. For example, while a page might load in 5 seconds, the main piece of content, such as a big image, or block of text might have already loaded 2 seconds in. That means that the remaining 3 seconds are just spent on loading secondary content which does not prevent the visitor from already looking at the site.&lt;/p&gt;

&lt;p&gt;What exactly is the main piece of content depends on the page in question. Most tools that measure this metric will automatically identify the largest block of content presented on the website as it loads.&lt;/p&gt;

&lt;p&gt;Things that might affect LCP include large images, video players, website backgrounds, large blocks of text, and other render blocking resources. Essentially, anything that might cover a large portion of the initial viewport.&lt;/p&gt;

&lt;p&gt;It's generally a good idea to keep LCP within 2.5 seconds to ensure your website feels fast, and visitors don't leave while waiting for something to appear on screen. An LCP of 4 seconds or more is considered to lead to a poor experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Input Delay
&lt;/h2&gt;

&lt;p&gt;First Input Delay (FID) measures input delay. In other words, it measures how quickly a user can start interacting with a website, even if it’s still loading.&lt;/p&gt;

&lt;p&gt;For example, maybe a page is still loading, but the visitor wants to click on a button or expand an image that is already visible on screen. There's no need to wait around in order to be able to perform an action. If the site immediately reacts to these interactions, it feels snappy and responsive.&lt;/p&gt;

&lt;p&gt;Unlike the other two Core Web Vitals, FID is difficult to measure using "offline" tools. It's best to measure it using real-user monitoring tools. The reason being that it requires actual user input in order to measure it.&lt;/p&gt;

&lt;p&gt;Field data tools (or real-user monitoring) perform continuous measurements on a website's live traffic, painting a much more accurate picture of a website's performance under real world scenarios.&lt;/p&gt;

&lt;p&gt;That's why FID is best measured using field data tools, as it depends highly on what is being clicked, how much of the website has loaded so far, the internet connection speed, and various different scenarios which are not easy to replicate in artificial tests.&lt;/p&gt;

&lt;p&gt;Google recommends a FID of 100 milliseconds or less, while an input delay larger than 300 milliseconds can lead to a poor user experience.&lt;/p&gt;

&lt;p&gt;It may be tempting to try and reduce input delay to a minimum, but it's important to consider that there's a practical limit on how much better it can be. While most humans can notice the difference between 800 milliseconds and 100 milliseconds, a 10 millisecond difference might be just barely noticeable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cumulative Layout Shift
&lt;/h2&gt;

&lt;p&gt;Cumulative Layout Shift (CLS) measures the visual stability of a website. In other words, it measures by how much the main elements shift around as the page loads.&lt;/p&gt;

&lt;p&gt;To understand it, you have to put yourself in the shoes of the visitor. It can be highly frustrating when a button or image moves around while you're trying to focus on it. Even worse when you end up clicking on something you didn't want because the content moved around as the page continued to load. That's why striving for visual stability as the page loads is important.&lt;/p&gt;

&lt;p&gt;CLS can be affected by lazy loading images, delayed popups, banners, and wrongly-sized placeholder blocks or images. Essentially anything that can cause significant layout changes as a page loads.&lt;/p&gt;

&lt;p&gt;Keeping your CLS score to a minimum can greatly improve your website's usability. Google recommends a CLS of 0.1 or less, which can help reduce frustrated visitors which may just be leaving your site due to having a poor experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do Web Vitals affect search ranking
&lt;/h2&gt;

&lt;p&gt;Having a fast, responsive website is more important than ever. Besides leading to a better experience for your website visitors, search engines such as Google now officially use Web Vitals as a ranking signal.&lt;/p&gt;

&lt;p&gt;This makes sense, search engines generally want to rank websites higher when they offer more relevant, useful content for a given user search. If the content is good, but the website which presents it is unusable or bounces off a lot of visitors, Google may interpret this as a signal that visitors are not satisfied with the proposed search result.&lt;/p&gt;

&lt;p&gt;In other words, delivering a great user experience is just as important as having good, quality content. It's about the entire user experience, and optimising for it may help website owners get more relevant search traffic, and a higher ranking position.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to measure Web Vitals
&lt;/h2&gt;

&lt;p&gt;You can use a variety of tools to measure your Core Web Vitals. While some metrics are easy to measure using lab tools which perform checks in a simulated environment, some of them are best measured using real traffic samples of how visitors interact with each page.&lt;/p&gt;

&lt;p&gt;The distinction between the two types of tools is in how they take the measurements. On one hand there is lab data (or synthetic monitoring), which performs checks in a simulated environment, and on the other hand there's field data (or real-user monitoring), which takes measures from the real visitor traffic on a website.&lt;/p&gt;

&lt;p&gt;No tool will be best suited for every possible scenario, so it's advisable to start with the simplest ones and add more advanced monitoring and reporting as you actually need it.&lt;/p&gt;

&lt;p&gt;To help get started, here's some of my favourite tools to measure Web Vitals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/tools/lighthouse" rel="noopener noreferrer"&gt;Lighthouse (lab data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/speed/pagespeed/insights/" rel="noopener noreferrer"&gt;PageSpeed Insights (lab data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.google.com/webmasters/answer/9205520?hl=en" rel="noopener noreferrer"&gt;Search Console (field data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GoogleChrome/web-vitals" rel="noopener noreferrer"&gt;Web-vitals Javascript library (field data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datadoghq.com/blog/core-web-vitals-monitoring-datadog-rum-synthetics/" rel="noopener noreferrer"&gt;Datadog (field data)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommendations
&lt;/h2&gt;

&lt;p&gt;Peter Drucker is often quoted as saying that "if you can’t measure it, you can’t improve it". The point being that you can't know with certainty whether something worked or not just by guessing. Without data, all we have are opinions, which may differ from the truth.&lt;/p&gt;

&lt;p&gt;On that principle, the first step towards delivering a great experience on your website should be to start measuring the metrics that matter. That way you'll know where you stand, and whether any changes you perform have a positive effect on the end-user experience.&lt;/p&gt;

&lt;p&gt;You can start by performing synthetic checks on your website using lab tools such as &lt;a href="https://developers.google.com/web/tools/lighthouse" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; in order to understand the current state of your website.&lt;/p&gt;

&lt;p&gt;Once you have identified existing issues, and possible improvements. You could add a monitoring solution, either lab-based (offline checks) or field-based (using real traffic), in order to continuously monitor the metrics that matter for you.&lt;/p&gt;

&lt;p&gt;In order to achieve the best results, most websites use a combination of tools as part of their monitoring stack. It's often recommended to measure at least three things: overall visitor traffic, performance, and uptime. After all, you don't want to be the last to know when your website is trending, unresponsive, or even worse, having downtime.&lt;/p&gt;

&lt;p&gt;Did you enjoy this article? Let me know if you have any questions or feedback. I hope it's been a useful introduction to Web Vitals and the different kinds of monitoring tools available for your website.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>beginners</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
