{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/136","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"It’s never too soon to plan for the future. Taking proactive steps to secure your client’s digital privacy could pay off big in 202…","fields":{"slug":"/identity/digital-privacy-best-practices/"},"html":"<p><em>It’s never too soon to plan for the future. Taking proactive steps to secure your client’s digital privacy could pay off big in 2020.</em></p>\n<p>Concerns over protecting digital data have always been at the forefront of a CIO’s mind. But when the 2017 Equifax breach struck, it brewed fresh reservations. Executives across business verticals began working even harder to secure the digital privacy of their consumers’ data. </p>\n<h2 id=\"what-is-digital-privacy\" style=\"position:relative;\"><a href=\"#what-is-digital-privacy\" aria-label=\"what is digital privacy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Is Digital Privacy</h2>\n<p>Digital privacy is keeping consumers’ personal data private. It is the act of using a safer internet and securing other connected devices based on their perceived importance. </p>\n<p>For example, a person may not be comfortable sharing names, contact numbers or profile pictures on the internet, while another may be okay with it. Hence, digital privacy is about <a href=\"https://www.loginradius.com/blog/2020/05/cyber-threats-business-risk-covid-19/\">protecting consumers' data</a> within the scope of their comfort zone.</p>\n<h2 id=\"what-do-the-experts-think-about-digital-privacy\" style=\"position:relative;\"><a href=\"#what-do-the-experts-think-about-digital-privacy\" aria-label=\"what do the experts think about digital privacy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Do the Experts Think About Digital Privacy</h2>\n<p>As we move towards a more data-centric economy, C-suite execs have a lot on their plates in terms of external collaboration, information sharing, and above all, protecting consumers' sensitive data. </p>\n<p>Three security experts provide advice on the best privacy practices in 2020.</p>\n<p><strong>1. David Kemp, Business Strategist with Micro Focus</strong></p>\n<p>\"Looking at the year ahead, we will see a major drive from organizations to achieve data privacy compliance,\" Kemp says, \"individuals will increasingly recognize their right to data privacy, and ability to hold businesses to account for negligence.\"</p>\n<p><strong>2. Kelvin Coleman, Executive Director at NCSA</strong></p>\n<p>“With new privacy legislation going to affect this year, digital privacy couldn’t be a more timely opportunity for helping businesses and consumers understand the importance of respecting and protecting personal information,” said <a href=\"https://twitter.com/kcolemanncsa?lang=en\">Coleman</a>.</p>\n<h2 id=\"how-important-is-online-privacy\" style=\"position:relative;\"><a href=\"#how-important-is-online-privacy\" aria-label=\"how important is online privacy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Important Is Online Privacy </h2>\n<p>Data is an incredibly valuable commodity today. Marketing is just one of the many ways of businesses exploiting consumer data—mostly to boost revenue and improve their market position.</p>\n<p>Simply put, data or digital privacy is a basic human right. The concept in business reflects the personally identifiable information of its employees and consumers, at large. It also includes the data (financial or research) required to operate a business. These are sensitive information and should remain confidential at all times. </p>\n<p>After the European Union enacted the <a href=\"https://www.loginradius.com/gdpr-and-privacy/\">General Data Protection Regulation (GDPR)</a>, many companies have begun exploring the role of privacy as a human right. It’s been giving a new direction to companies to develop the necessary tools and processes to collect consumer data and not exploit it. </p>\n<p><a href=\"https://www.loginradius.com/resource/the-ccpa-and-customer-identity\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYklEQVQY00WQO0vDUBiGC2KbpLWlrdJKtZrer4qmMSSmF9ILRTTgooKrg3URHDrURUS0izj4B3RysItQBAdxc9HFwd/z+p00weE5J+Sc87zf97n4jA6GQHhzNfgIb7ZqIdhnDlxKg1A0EJRNhMoG+IIBLlcHn96cnNPuYh/s8WypgUBGgzepwJ9WES7UEF3rwF+oWxcnQhVCuY148xDF1j44eRfuUtv6z9mhLiddVLYgdfaQr5oIkNATlyyxP1+zhIzwagvL6g5ilS7miQW5C1EzEZW6/xWyRcjqiK23kdG2kdNNREpU1ZKEmZRiCyeh0wkVoZUmIiSI2sxRFx4ahdOFJWRzC+Z1+BIb8BI+apvtjlCgkbgWKzi9uMXXzy+eXt7w8DzG42iMj89vjF7frSB3UrWF9CiQoypEGQKJGDzhtMySp0QFxkEP/et7nJwP0RsMcTy4wdnlHY76VzTrhlXpH141wNZ7fgpKAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance-whitepaper\"\n        title=\"CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance-whitepaper\"\n        src=\"/static/f33233280c3b9df57a5a3b7ae3a84b9e/e5715/CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance.png\"\n        srcset=\"/static/f33233280c3b9df57a5a3b7ae3a84b9e/a6d36/CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance.png 650w,\n/static/f33233280c3b9df57a5a3b7ae3a84b9e/e5715/CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance.png 768w,\n/static/f33233280c3b9df57a5a3b7ae3a84b9e/2bef9/CCPA-and-Customer-Identity-Reaping-the-Benefits-of-Compliance.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<h2 id=\"5-major-threats-to-data-privacy-in-the-digital-age\" style=\"position:relative;\"><a href=\"#5-major-threats-to-data-privacy-in-the-digital-age\" aria-label=\"5 major threats to data privacy in the digital age permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5 Major Threats to Data Privacy in the Digital Age</h2>\n<h3 id=\"1-extremely-poor-password-hygiene\" style=\"position:relative;\"><a href=\"#1-extremely-poor-password-hygiene\" aria-label=\"1 extremely poor password hygiene permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Extremely Poor Password Hygiene</h3>\n<p>The importance of using strong passwords is never irrelevant. Inadequate <a href=\"https://www.loginradius.com/blog/2018/12/infographic-the-death-of-passwords/\">password hygiene</a> has always been the primary source of attacks like credential stuffing and account takeovers. </p>\n<p>One of the easiest ways to mitigate the uncertainty of cyber attack is by making passwords hard-to-steal and never re-using them across multiple accounts. </p>\n<p>Businesses are also going passwordless, which means consumers do not need to memorize any credentials whatsoever and use social media sign-in, PIN authentication or email verification instead to authenticate.</p>\n<h3 id=\"2-phishing-attacks\" style=\"position:relative;\"><a href=\"#2-phishing-attacks\" aria-label=\"2 phishing attacks permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Phishing Attacks</h3>\n<p><a href=\"https://www.loginradius.com/blog/phishing-for-identity/\">Phishing attacks</a> happen when cybercriminals scam consumers with fraudulent email messages and trick them into giving away sensitive data. Most of these messages seem like they are from authentic sources and no one usually questions their legitimacy.</p>\n<p>Do not click on links from suspicious email addresses, always type the target website address yourself, and never give away your personal information to anyone. Safeguarding against phishing is possible. All you need is to do is pay attention to detail. </p>\n<h3 id=\"3-inadequate-data-security-training\" style=\"position:relative;\"><a href=\"#3-inadequate-data-security-training\" aria-label=\"3 inadequate data security training permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Inadequate Data Security Training</h3>\n<p>Simple cybersecurity drills for employees within organizations can go a long way in achieving digital privacy. Train them on the various data security protocols so they know how to protect consumers' sensitive data.</p>\n<p>At the end of it, they should know how to spot phishing scams, the importance of changing passwords frequently, always use encrypted emails while sending sensitive information, whom to report if their <a href=\"https://www.loginradius.com/blog/2019/09/prevent-credential-stuffing-attacks/\">credentials are stolen</a>, how to conduct security updates on their home and office devices, and the likes. </p>\n<h3 id=\"4-shoulder-surfing\" style=\"position:relative;\"><a href=\"#4-shoulder-surfing\" aria-label=\"4 shoulder surfing permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Shoulder Surfing</h3>\n<p>Shoulder surfing dates back to even before when the internet was invented. In those days, thieves used to spy on user's phones as they punched numbers or fed information.</p>\n<p>Shoulder surfing, in the age of the internet, refers to the attacker peering over the user's shoulder to get information from the screen or keyboard movements. Credit card numbers, bank accounts, and credentials like user name, passwords are most susceptible to such attacks. </p>\n<h3 id=\"5-lack-of-faster-breach-response\" style=\"position:relative;\"><a href=\"#5-lack-of-faster-breach-response\" aria-label=\"5 lack of faster breach response permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Lack of faster breach response</h3>\n<p>Even if you have the best security protocols in place, a data breach can still happen. Maintaining digital privacy does not only mean that you need to protect your organization from every cyberattack, it also means preparing for the prompt response, if a breach has to happen. Many lack a faster incident response plan. </p>\n<h2 id=\"how-organisations-can-protect-their-digital-privacy\" style=\"position:relative;\"><a href=\"#how-organisations-can-protect-their-digital-privacy\" aria-label=\"how organisations can protect their digital privacy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How Organisations Can Protect Their Digital Privacy</h2>\n<h3 id=\"1-support-leadership-buy-in\" style=\"position:relative;\"><a href=\"#1-support-leadership-buy-in\" aria-label=\"1 support leadership buy in permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Support leadership buy-in.</h3>\n<p>Protecting customer data can make or break a company, so it should be a top priority. If security isn’t considered vital when issuing departmental finances, you might not get the resources you need to protect your company.</p>\n<p>Luckily, most organizations support privacy-focused leadership buy-ins. If your company does not, remind them of the high costs of poor data management if they <a href=\"https://www.loginradius.com/blog/2019/10/cybersecurity-best-practices-for-enterprises/\">fail to protect their customer identities</a>.</p>\n<h3 id=\"2-designate-one-dedicated-security-personnel\" style=\"position:relative;\"><a href=\"#2-designate-one-dedicated-security-personnel\" aria-label=\"2 designate one dedicated security personnel permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Designate one dedicated security personnel. </h3>\n<p>With security at the leadership level, companies can plan more robust organizational initiatives.</p>\n<p>Appointing one individual to manage an enterprise’s digital privacy is a sound practice. This means a C-level professional should screen for legal and <a href=\"https://www.loginradius.com/blog/2019/09/ccpa-vs-gdpr-the-compliance-war/\">compliance risks</a> that impact customer security and privacy. </p>\n<h3 id=\"3-develop-a-culture-of-security-and-privacy\" style=\"position:relative;\"><a href=\"#3-develop-a-culture-of-security-and-privacy\" aria-label=\"3 develop a culture of security and privacy permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Develop a culture of security and privacy.</h3>\n<p>Let’s face it—many security-related incidents occur due to human negligence. With packed schedules and tight deadlines, crucial processes may sometimes go unattended. When that happens, an enterprise may suffer irreparable damage.  </p>\n<p>It’s no surprise that employees are the gatekeepers of a company’s digital privacy. One wrong move can result in severe repercussions. Hence, companies must teach employees how to adhere to security and privacy policies. It also helps to explain why certain security controls are in place. </p>\n<p>To achieve this, companies should invest in employee security training and educate different departments about the <a href=\"https://www.loginradius.com/blog/2020/04/marriott-data-breach-2020/\">impact of a data breach</a>. Let them know that one careless action can ruin the reputation of a company. In short, when people understand why certain rules are important, they’ll respect these more. </p>\n<h3 id=\"4-establish-transparent-processes-and-policies\" style=\"position:relative;\"><a href=\"#4-establish-transparent-processes-and-policies\" aria-label=\"4 establish transparent processes and policies permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Establish transparent processes and policies. </h3>\n<p>No matter how perfect your framework is, it’s useless if your customers aren’t aware of your processes and policies. Make dedicated policy pages and place links to these on your site’s home page and menu bar.</p>\n<h3 id=\"5-strategize-an-incident-response-plan\" style=\"position:relative;\"><a href=\"#5-strategize-an-incident-response-plan\" aria-label=\"5 strategize an incident response plan permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Strategize an incident response plan. </h3>\n<p>Data breaches are a nightmare that companies dread. That’s why gatekeepers must prepare for it in advance. </p>\n<p>Don’t wait to draft incident policies for your customers after a data breach. With a digital privacy response plan, you can tell your customers what to do, discuss their roles, and show them how to communicate internally and externally in the event of a data breach. </p>\n<p>The ability to demonstrate Return on Mitigation (ROM) is also a critical metric to CEOs. To do this, calculate <a href=\"https://www.loginradius.com/loginradius-business-continuity-covid-19-outbreak/\">potential risks and assess</a> how much can be saved through on-time mitigation.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.61538461538461%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAd1RKZf/xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAEFAl//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAZEAACAwEAAAAAAAAAAAAAAAAAARARITH/2gAIAQEAAT8hbovBQux//9oADAMBAAIAAwAAABB/z//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABoQAAIDAQEAAAAAAAAAAAAAAAABESExEHH/2gAIAQEAAT8Qe2eMtKVZKNGk9Nef/9k='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"digital privacy best practices\"\n        title=\"digital privacy best practices\"\n        src=\"/static/6f02bebfef780ad4c47123c5c9d98bab/212bf/image2-3.jpg\"\n        srcset=\"/static/6f02bebfef780ad4c47123c5c9d98bab/6aca1/image2-3.jpg 650w,\n/static/6f02bebfef780ad4c47123c5c9d98bab/212bf/image2-3.jpg 768w,\n/static/6f02bebfef780ad4c47123c5c9d98bab/64175/image2-3.jpg 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"how-loginradius-helps-businesses-protect-consumer-data\" style=\"position:relative;\"><a href=\"#how-loginradius-helps-businesses-protect-consumer-data\" aria-label=\"how loginradius helps businesses protect consumer data permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How LoginRadius Helps Businesses Protect Consumer Data</h2>\n<p><a href=\"https://www.loginradius.com/blog/2019/06/customer-identity-and-access-management/\">Consumer identity and access management (CIAM)</a> platform LoginRadius offers a comprehensive methodology that helps businesses to collect, store, and process consumers’ data by ensuring the highest level of protection. </p>\n<p>LoginRadius complies with major regulatory laws and privacy requirements. It helps global digital companies to conduct business by keeping consumer digital privacy and security sentiments at the forefront. </p>\n<h3 id=\"loginradius-fulfills-the-following-rights-of-the-consumers\" style=\"position:relative;\"><a href=\"#loginradius-fulfills-the-following-rights-of-the-consumers\" aria-label=\"loginradius fulfills the following rights of the consumers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>LoginRadius fulfills the following rights of the consumers.</h3>\n<ul>\n<li>The right to be informed.</li>\n<li>The right of access.</li>\n<li>The right to withdraw consent.</li>\n<li>The right to rectification.</li>\n<li>The right to be forgotten.</li>\n<li>The right to restriction of processing data.</li>\n<li>The right to deletion of inactive data. </li>\n<li>The right to protection of children's personal data.</li>\n</ul>\n<h3 id=\"overview-of-global-regulations-that-loginradius-is-compiled-with\" style=\"position:relative;\"><a href=\"#overview-of-global-regulations-that-loginradius-is-compiled-with\" aria-label=\"overview of global regulations that loginradius is compiled with permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Overview of global regulations that LoginRadius is compiled with.</h3>\n<ul>\n<li><strong>General Data Protection Regulation</strong> (GDPR): Offers data protection and privacy for all individual citizens of the European Union and the European Economic Area.</li>\n<li><strong>California Consumer Privacy Act</strong> (CCPA): focuses on the privacy <a href=\"https://www.loginradius.com/blog/identity/how-loginradius-helps-enterprises-stay-ccpa-compliant-in-2020/\">rights of California consumers</a>.</li>\n<li><strong>US Privacy Shield</strong>: Enables US-based organizations to benefit from the adequacy determinations.</li>\n<li><strong>ISO/IEC 27018:2019</strong>:  Protects Personally Identifiable Information (PII) in the public cloud computing environment.</li>\n</ul>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion </h2>\n<p>Getting your enterprise onboard with these best practices is the first step to attaining better digital privacy for your consumers. Start by setting up a data maintenance process—operational efficiencies will follow through. </p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbElEQVQY0zVQO0/CUBQmaihthUbRhPhCAlhKEXlE3s+CCEaBwQF10riQODkwaFyMMcTFwR9gjBvRSeKko4NxcfD/fJ57C8PJbc53+r0soj8Lm5qHbS0HW6AIwZ+DXSvAESxBpJ3MMLph3+xWDlUwm2jCGa5A0isQtRIkhrH/CbdwwkDBHAJlGodexsy6wUkduknMBCfdmxCCBhZKHailfUxGm5jQKphaTUDwmaIWdigyF1oZsm7AFavBRspKuMpdTJMQO5yLbCHVPkG0cYRY4xAR9tbp3T5AsnUMT7YFqzdtOuQOSFmiyMupXUihKuzk0hWvc0xgUYlYod18tAZPrg13eg8rNIuJHSihMtVUHEUe51cLPJ5zo8oJJRJQRnHlQB6WpTjOru7w/fuH59d3PL0M8Th4w+fXDwbDD16R1ZsxCcelsyUbidQEEuC9ECap1J8nCaPTRe/2Ad3LvjkXfZxf3+O0d8P7FnwZ/AMzEsMp2f6LdQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-free-demo-loginradius\"\n        title=\"book-a-free-demo-loginradius\"\n        src=\"/static/779ad148d33fb1ecfd80cc41f1a94ef3/e5715/Book-a-free-demo-request-1024x310.png\"\n        srcset=\"/static/779ad148d33fb1ecfd80cc41f1a94ef3/a6d36/Book-a-free-demo-request-1024x310.png 650w,\n/static/779ad148d33fb1ecfd80cc41f1a94ef3/e5715/Book-a-free-demo-request-1024x310.png 768w,\n/static/779ad148d33fb1ecfd80cc41f1a94ef3/2bef9/Book-a-free-demo-request-1024x310.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"December 12, 2019","updated_date":null,"description":"Concerns over digital data security have always been at the forefront of a CIO 's mind. But it generated fresh concern when the 2017 Equifax hack struck. Here's how executives work to protect the digital privacy of consumer data across business verticals.","title":"Digital Privacy: Securing Consumer Privacy with LoginRadius","tags":["data privacy","compliance","ciam solution"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.8181818181818181,"src":"/static/11f90766893a41d021b9003aa5e8b06d/33aa5/digital-privacy.jpg","srcSet":"/static/11f90766893a41d021b9003aa5e8b06d/f836f/digital-privacy.jpg 200w,\n/static/11f90766893a41d021b9003aa5e8b06d/2244e/digital-privacy.jpg 400w,\n/static/11f90766893a41d021b9003aa5e8b06d/33aa5/digital-privacy.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"The official supported drivers for Mongo for Go have been officially released for several months now and is slowly seeing more usage…","fields":{"slug":"/engineering/custom-encoders-in-the-mongo-go-driver/"},"html":"<p>The official supported drivers for Mongo for Go have been officially released for several months now and is slowly seeing more usage. Although many of the features of standard Mongo drivers have been implemented within the supported driver, the documentation for a majority of the features are still in the process of being created. This post will provide some information on how to set up custom JSON encoders so you can change how BSON operators are processed whenever Mongo documents are marshalled into JSON. For this blog, a custom date and object id encoder will be created to handle the BSON operators and transform them into more easily processed JSON.</p>\n<p>This blog assumes that you have a basic understanding of Go and how to write some code in the language. If you want to follow along with the guide, you will also require a working Mongo instance, as well as your environment set up for Go.</p>\n<p>Before interacting with the database, we can set up a quick Go application that finds data from a Mongo database and outputs it. For this example, the Mongo database is set up with a collection containing documents with a name, a date and the object id. For our blog, the Mongo document that is being worked with is quite simple:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&quot;_id&quot;</span><span class=\"mtk1\"> : </span><span class=\"mtk11\">ObjectId</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;5de6b0850f3c7b5cce642529&quot;</span><span class=\"mtk1\">),</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&quot;Name&quot;</span><span class=\"mtk1\"> : </span><span class=\"mtk8\">&quot;dateOne&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk8\">&quot;Date&quot;</span><span class=\"mtk1\"> : </span><span class=\"mtk11\">ISODate</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;2019-04-08T11:55:02.658Z&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>A simple main function that retrieves data from Mongo and outputs the JSON string is as follows:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">func</span><span class=\"mtk1\"> </span><span class=\"mtk11\">main</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">result</span><span class=\"mtk1\"> </span><span class=\"mtk4\">struct</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tID   primitive.ObjectID </span><span class=\"mtk8\">`bson:&quot;_id&quot;`</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tName </span><span class=\"mtk10\">string</span><span class=\"mtk1\">             </span><span class=\"mtk8\">`bson:&quot;Name&quot;`</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tDate primitive.DateTime </span><span class=\"mtk8\">`bson:&quot;Date&quot;`</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">ctx</span><span class=\"mtk1\">, </span><span class=\"mtk12\">cancel</span><span class=\"mtk1\"> := context.</span><span class=\"mtk11\">WithTimeout</span><span class=\"mtk1\">(context.</span><span class=\"mtk11\">Background</span><span class=\"mtk1\">(), </span><span class=\"mtk7\">10</span><span class=\"mtk1\">*time.Second)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">client</span><span class=\"mtk1\">, </span><span class=\"mtk12\">connErr</span><span class=\"mtk1\"> := mongo.</span><span class=\"mtk11\">Connect</span><span class=\"mtk1\">(ctx, options.</span><span class=\"mtk11\">Client</span><span class=\"mtk1\">().</span><span class=\"mtk11\">ApplyURI</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;&quot;</span><span class=\"mtk1\">))</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">if</span><span class=\"mtk1\"> connErr != </span><span class=\"mtk4\">nil</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tlog.</span><span class=\"mtk11\">Fatal</span><span class=\"mtk1\">(connErr)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">collection</span><span class=\"mtk1\"> := client.</span><span class=\"mtk11\">Database</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;test&quot;</span><span class=\"mtk1\">).</span><span class=\"mtk11\">Collection</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&quot;dates&quot;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">filter</span><span class=\"mtk1\"> := bson.M{</span><span class=\"mtk8\">&quot;Name&quot;</span><span class=\"mtk1\">: </span><span class=\"mtk8\">&quot;dateOne&quot;</span><span class=\"mtk1\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">findErr</span><span class=\"mtk1\"> := collection.</span><span class=\"mtk11\">FindOne</span><span class=\"mtk1\">(ctx, filter).</span><span class=\"mtk11\">Decode</span><span class=\"mtk1\">(&result)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">if</span><span class=\"mtk1\"> findErr != </span><span class=\"mtk4\">nil</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tlog.</span><span class=\"mtk11\">Fatal</span><span class=\"mtk1\">(findErr)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\tfmt.</span><span class=\"mtk11\">Print</span><span class=\"mtk1\">(result.Date)</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">data</span><span class=\"mtk1\">, </span><span class=\"mtk12\">writeErr</span><span class=\"mtk1\"> := bson.</span><span class=\"mtk11\">MarshalExtJSON</span><span class=\"mtk1\">(result, </span><span class=\"mtk4\">false</span><span class=\"mtk1\">, </span><span class=\"mtk4\">false</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">if</span><span class=\"mtk1\"> writeErr != </span><span class=\"mtk4\">nil</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\tlog.</span><span class=\"mtk11\">Fatal</span><span class=\"mtk1\">(writeErr)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\tfmt.</span><span class=\"mtk11\">Print</span><span class=\"mtk1\">(</span><span class=\"mtk11\">string</span><span class=\"mtk1\">(data))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk11\">cancel</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>The function MarshalExtJSON is a part of the bson package that is a part of the driver. It uses a default registry to define the rules when converting Mongo primitive types into JSON. The arguments it takes are the Go struct being passed in, whether the result should be returned in canonical form (For more details, check this <a href=\"https://docs.mongodb.com/manual/reference/mongodb-extended-json/%5D(https://docs.mongodb.com/manual/reference/mongodb-extended-json/)\">link</a>, and whether HTML strings are escaped.</p>\n<p>The output of this function when reading our document produces a JSON string with all the BSON operators included.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk8\">&quot;_id&quot;</span><span class=\"mtk1\">: {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk8\">&quot;$oid&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;5de6b0850f3c7b5cce642529&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t},</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk8\">&quot;Name&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;dateOne&quot;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk8\">&quot;Date&quot;</span><span class=\"mtk1\">:{</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk8\">&quot;$date&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;2019-04-08T11:55:02.658Z&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>Using custom encoders, we can change how the bson package marshals the JSON and remove all the BSON operators. The first thing to do is to define package level variables that will hold the types of the Mongo primitives that need to be changed in the JSON response. Outside the main function, include these two lines:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">tOID</span><span class=\"mtk1\"> = reflect.</span><span class=\"mtk11\">TypeOf</span><span class=\"mtk1\">(primitive.ObjectID{})</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">tDateTime</span><span class=\"mtk1\"> = reflect.</span><span class=\"mtk11\">TypeOf</span><span class=\"mtk1\">(primitive.</span><span class=\"mtk11\">DateTime</span><span class=\"mtk1\">(</span><span class=\"mtk7\">0</span><span class=\"mtk1\">))</span></span></code></pre>\n<p>Next, we can make new functions to customize how these types are handled. For the date encoding, we want to have the Date key matched with the returned date string.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">func</span><span class=\"mtk1\"> </span><span class=\"mtk11\">dateTimeEncodeValue</span><span class=\"mtk1\">(ec bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) </span><span class=\"mtk10\">error</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">jDateFormat</span><span class=\"mtk1\"> = </span><span class=\"mtk8\">&quot;2006-01-02T15:04:05.999Z&quot;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">if</span><span class=\"mtk1\"> !val.</span><span class=\"mtk11\">IsValid</span><span class=\"mtk1\">() || val.</span><span class=\"mtk11\">Type</span><span class=\"mtk1\">() != tDateTime {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> bsoncodec.ValueEncoderError{Name: </span><span class=\"mtk8\">&quot;DateTimeEncodeValue&quot;</span><span class=\"mtk1\">, Types: []reflect.Type{tDateTime}, Received: val}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">ints</span><span class=\"mtk1\"> := val.</span><span class=\"mtk11\">Int</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">t</span><span class=\"mtk1\"> := time.</span><span class=\"mtk11\">Unix</span><span class=\"mtk1\">(</span><span class=\"mtk7\">0</span><span class=\"mtk1\">, ints*</span><span class=\"mtk7\">1000000</span><span class=\"mtk1\">).</span><span class=\"mtk11\">UTC</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> vw.</span><span class=\"mtk11\">WriteString</span><span class=\"mtk1\">(t.</span><span class=\"mtk11\">Format</span><span class=\"mtk1\">(jdateFormat))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>The parameters in this function are pre-defined within the driver package of the driver. This involves passing in the BSON encoding context, the value writer and the value that is being processed. The value writer and the value are the parameters that we use within our function.</p>\n<p>First, we check if the value passed in is the correct type. If there is an issue with the value, then an error is thrown during the encoding. Next, we can set the format we want our date string to appear in, and process our value into a Go Time object. After that, we can use the value writer to write the formatted date into our JSON string.</p>\n<p>Similar to the custom date encoding, the object id encoding function has the same structure.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">func</span><span class=\"mtk1\"> </span><span class=\"mtk11\">objectIDEncodeValue</span><span class=\"mtk1\">(ec bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) </span><span class=\"mtk10\">error</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">if</span><span class=\"mtk1\"> !val.</span><span class=\"mtk11\">IsValid</span><span class=\"mtk1\">() || val.</span><span class=\"mtk11\">Type</span><span class=\"mtk1\">() != tOID {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> bsoncodec.ValueEncoderError{Name: </span><span class=\"mtk8\">&quot;ObjectIDEncodeValue&quot;</span><span class=\"mtk1\">, Types: []reflect.Type{tOID}, Received: val}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">s</span><span class=\"mtk1\"> := val.</span><span class=\"mtk11\">Interface</span><span class=\"mtk1\">().(primitive.ObjectID).</span><span class=\"mtk11\">Hex</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> vw.</span><span class=\"mtk11\">WriteString</span><span class=\"mtk1\">(s)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>First, we check if the type is valid, and if it is, we simply write out the object id as a hex string. To create the hex string, we first convert the value into an interface, then cast it as an object id to allow the Hex function to be called.</p>\n<p>Now that our two functions are created to handle the BSON types, we can create our custom registry.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">func</span><span class=\"mtk1\"> </span><span class=\"mtk11\">createCustomRegistry</span><span class=\"mtk1\">() *bsoncodec.RegistryBuilder {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">primitiveCodecs</span><span class=\"mtk1\"> bson.PrimitiveCodecs</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk12\">rb</span><span class=\"mtk1\"> := bsoncodec.</span><span class=\"mtk11\">NewRegistryBuilder</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        bsoncodec.DefaultValueEncoders{}.</span><span class=\"mtk11\">RegisterDefaultEncoders</span><span class=\"mtk1\">(rb)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        bsoncodec.DefaultValueDecoders{}.</span><span class=\"mtk11\">RegisterDefaultDecoders</span><span class=\"mtk1\">(rb)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\trb.</span><span class=\"mtk11\">RegisterEncoder</span><span class=\"mtk1\">(tDateTime, bsoncodec.</span><span class=\"mtk11\">ValueEncoderFunc</span><span class=\"mtk1\">(dateTimeEncodeValue))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\trb.</span><span class=\"mtk11\">RegisterEncoder</span><span class=\"mtk1\">(tOID, bsoncodec.</span><span class=\"mtk11\">ValueEncoderFunc</span><span class=\"mtk1\">(objectIDEncodeValue))</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\tprimitiveCodecs.</span><span class=\"mtk11\">RegisterPrimitiveCodecs</span><span class=\"mtk1\">(rb)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">\t</span><span class=\"mtk15\">return</span><span class=\"mtk1\"> rb</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span></code></pre>\n<p>In this function, we are setting up our registry to use our custom encoders, while also setting up default encoders for all other types that are being marshalled. Using the bsoncodec package, the NewRegistryBuilder function is called to initialize a new registry. Next, we set up this registry with the default encoders and decoders that are pre-programmed in the driver using RegisterDefaultEncoders. During this step, we can also register encoders and decoders for raw types by calling RegisterPrimitiveCodecs. Finally, we can include our custom encoders by calling RegisterEncoder on the custom registry struct. Our encoder will be called whenever the type defined in the first argument in RegisterEncoder is found in the struct being marshalled.</p>\n<p>To ensure our new custom registry is being used, we have to do two things. The first is to build the custom registry. This should be done before the marshalling of the struct.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">var</span><span class=\"mtk1\"> </span><span class=\"mtk12\">customRegistry</span><span class=\"mtk1\"> = </span><span class=\"mtk11\">createCustomRegistry</span><span class=\"mtk1\">().</span><span class=\"mtk11\">Build</span><span class=\"mtk1\">()</span></span></code></pre>\n<p>Next, we need to change the marshalling method to use the new custom registry instead of the default one. We can do this by changing the method being used to marshal the struct.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">customData</span><span class=\"mtk1\">, </span><span class=\"mtk12\">writeErr</span><span class=\"mtk1\"> := bson.</span><span class=\"mtk11\">MarshalExtJSONWithRegistry</span><span class=\"mtk1\">(customRegistry, result, </span><span class=\"mtk4\">false</span><span class=\"mtk1\">, </span><span class=\"mtk4\">false</span><span class=\"mtk1\">)</span></span></code></pre>\n<p>The function MarshalExtJSONWithRegistry takes the same parameters as MarshalExtJSON, but also requires a custom registry to be passed in as the first parameter. We pass in the custom registry we created into the method to allow the marshalling to use our custom encoders. As a result, when printing our new JSON string output, we get this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"go\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">{</span><span class=\"mtk8\">&quot;_id&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;5de6b0850f3c7b5cce642529&quot;</span><span class=\"mtk1\">,</span><span class=\"mtk8\">&quot;Name&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;dateOne&quot;</span><span class=\"mtk1\">,</span><span class=\"mtk8\">&quot;Date&quot;</span><span class=\"mtk1\">:</span><span class=\"mtk8\">&quot;2019-04-08T11:55:02.658Z&quot;</span><span class=\"mtk1\">}</span></span></code></pre>\n<p>The Mongo driver for Go is still in active development and new versions continue to be released. Hopefully this blog provides some useful information on how the driver works while new documentation is being created.</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk7 { color: #B5CEA8; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n</style>","frontmatter":{"date":"December 03, 2019","updated_date":null,"description":null,"title":"Custom Encoders in the Mongo Go Driver","tags":["Go","Golang","MongoDriver"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.25,"src":"/static/0bf88d6b53aaaf119a2556b41f4c8383/ee604/mongo-drivers.png","srcSet":"/static/0bf88d6b53aaaf119a2556b41f4c8383/69585/mongo-drivers.png 200w,\n/static/0bf88d6b53aaaf119a2556b41f4c8383/497c6/mongo-drivers.png 400w,\n/static/0bf88d6b53aaaf119a2556b41f4c8383/ee604/mongo-drivers.png 800w,\n/static/0bf88d6b53aaaf119a2556b41f4c8383/30c15/mongo-drivers.png 936w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Chris Yee","github":null,"avatar":null}}}},{"node":{"excerpt":"Overview   The “reconciliation” algorithm in React is how the decision to re-render the component is made. In the browser, DOM manipulation…","fields":{"slug":"/engineering/reacts-reconciliation-algorithm/"},"html":"<p><strong>Overview</strong>  </p>\n<p>The “reconciliation” algorithm in React is how the decision to re-render the component is made. In the browser, DOM manipulation is expensive and time consuming, both in mounting and unmounting. Part of what makes React very performant is its reconciliation algorithm.  </p>\n<p>In short, it watches closely for differences, and only updates the DOM when necessary and tries to update only the parts which need to be changed.  </p>\n<p><strong>The “Virtual DOM”</strong>  </p>\n<p>The Virtual DOM is a theoretical DOM tree generated by React when a change is made to a component’s state. This is modeled after the state of your application upon modification of the state, for example, after calling this.setState(). React uses what is called a “snapshot” to make this comparison and analysis between the DOM before the update, and the DOM after. This is the point in time when React utilizes its reconciliation algorithm.  </p>\n<p>Updating the Virtual DOM is much faster than the real DOM, since the browser doesn’t need to show a visualization of it.  </p>\n<p><strong>How updates are determined</strong>  </p>\n<p>The reconciliation algorithm is run whenever the component level state is updated. It analyzes the current DOM with the Virtual DOM, in order to determine which changes need to be made to the real DOM. After this step, it has determined which DOM nodes on your application require updates, and it calls the render method.  </p>\n<p><strong>Effect on DOM elements and their attributes</strong>  </p>\n<p>The reconciliation algorithm does not only look at whole DOM elements, it also looks at individual attributes. You can think of the difference as a PUT request vs. a PATCH request, where it only updates the parts which have changed, rather than updating the entire object if there was a change.  </p>\n<p>While it doesn’t unmount and remount the entire element if it doesn’t have to, sometimes it <em>does</em> have to. An example of this would be if you render an element of a different type.  </p>\n<p>Suppose you wanted to switch between two components or elements, perhaps for conditional rendering. This would result in a full unmounting of the component, regardless of whether or not they contain the same child nodes.  </p>\n<p>This differs from switching attributes on the same type of elements, an example of which might be dynamic class names, based on component state. In this scenario, the DOM element is <em>not</em> destroyed, and only the modified attributes are changed. This is useful because it performs minimal operations on the DOM, which as we know, is more resource-intensive than standard object operations.  </p>\n<p><strong>Keys and rerenders</strong>  </p>\n<p>The \"key\" attribute in React can be used to mark whether or not a DOM node is stable. You may have seen a message in the console if you’ve ever attempted to map over a collection and return a JSX element each iteration. This is because the reconciliation algorithm uses the keys to determine if the content has changed, and not including a key may cause unexpected behaviour. For this reason, the keys should be unique so that reconciliation can recognize and identify which elements are stable, and which elements are not.  </p>\n<p>Suppose that you have a list of items, which is derived from an array. If you were to splice an item into the middle of it, that will change all of the indices of the subsequent items. In this scenario, since the keys will not be a stable, unique representation of each item, React can end up mutating the unintended item, which can cause major bugs.  </p>\n<p>A detailed explanation of keys can be found on the official React docs:</p>\n<p><a href=\"https://reactjs.org/docs/lists-and-keys.html\">Lists and Keys</a></p>\n<p><a href=\"https://reactjs.org/docs/reconciliation.html#keys\">Reconciliation-Keys</a></p>\n<p>For an in-depth exploration of how and why reconciliation was implemented, please visit the official React docs:</p>\n<p><a href=\"https://reactjs.org/docs/reconciliation.html\">Reconciliation</a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"December 03, 2019","updated_date":null,"description":null,"title":"React's Reconciliation Algorithm","tags":["React"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":2.2988505747126435,"src":"/static/b0ebc3d46b4cf70980708fadb30e73ea/ee604/react-fiber.png","srcSet":"/static/b0ebc3d46b4cf70980708fadb30e73ea/69585/react-fiber.png 200w,\n/static/b0ebc3d46b4cf70980708fadb30e73ea/497c6/react-fiber.png 400w,\n/static/b0ebc3d46b4cf70980708fadb30e73ea/ee604/react-fiber.png 800w,\n/static/b0ebc3d46b4cf70980708fadb30e73ea/31987/react-fiber.png 1000w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Team LoginRadius","github":"LoginRadius","avatar":null}}}},{"node":{"excerpt":"LoginRadius is one of 415 identity companies selected from a pool of over 2,000 to be featured in the report. VANCOUVER, BC – December…","fields":{"slug":"/identity/loginradius-named-ciam-leader-owi/"},"html":"<p>LoginRadius is one of 415 identity companies selected from a pool of over 2,000 to be featured in the report.</p>\n<p>VANCOUVER, BC – December 2, 2019 – <a href=\"https://www.loginradius.com/\">LoginRadius</a>, a leader in cloud-based customer identity and access management (CIAM) solutions, is pleased to announce that </p>\n<p><a href=\"https://oneworldidentity.com/\">One World Identity</a> (OWI) has named LoginRadius as a leader in customer identity and access management (CIAM) in its <a href=\"https://www.prnewswire.com/news-releases/one-world-identity-releases-2019-identity-industry-landscape-300963181.html\">2019 Identity Industry Landscape</a>.</p>\n<p>OWI is a leading market intelligence and strategy firm focused on identity, trust, and the data economy. Its annual Identity Landscape provides a comprehensive and holistic view of leading companies in the identity space. This includes an unparalleled overview of how digital identity applications are evolving, as well as how companies and markets are shaping the next generation of digital identity. </p>\n<p>“Since 2017, the number of identity companies has more than quadrupled, from 500 companies to over 2,000,” said Travis Jarae, CEO and Founder of OWI. “With the wave of data breaches and privacy scandals, there is a rapid expansion of identity products and solutions.</p>\n<p>The OWI team interacts with identity companies every day, from startups to enterprise. We’re proud to share the Identity Landscape each year to distill how new companies, products, and solutions are shaping the future of identity.”</p>\n<p>“LoginRadius is honoured to be one of the 415 identity companies selected from a pool of over 2,000 companies in the industry,”. “We are committed to empowering businesses to safely secure their customers’ identities while complying with existing and future regulations and delivering a unified digital experience</p>\n<p><a href=\"https://www.loginradius.com/resource/guide-to-modern-customer-identity/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABc0lEQVQY002RO08CQRSFiYXArmEhgAIioAgsLBheLq9dVmRFBFGjhVHBmNhpgjY2Bmys/CVamWhjpDDRShs7Gwv/ynFmCAnFzZ2Ze+a798wYzGEFNLiIAl5UMSWWWeZJ5iIqRnUapsUiOKkKR34H9qUqzHEdJlGDKVQiMdQYhjAVzrgGh1iCsJiDJShjJlGBJ12DVVphFxiUZJ5AfKsHiOn74ORdGBM1cOFhneoY0EgWoUIT2lYHaqsNSWmB96chELBV0lid6tzZDXjlBjyZdbgydXizdbaflZsQSGOqM7Bxidib0iEWGogRWCCtQ1hYhoWEjU44ZtuZXIM318RcfhO+Qos1oc8zcsGA9MAWIe/jS7HJ7MS6NVqGZT4La6zM6gZ3Eue9O/z8/uHx5Q33T694eB7g/esbg49PCPEKJoPFMSCB8AToiCpwJXVMl4/h37tmlmnniYCM3PYJzgi0fdHHYbeHo24fp1e36FzesM+klv8BIh7Cv8YBwbcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"modern-ciam\"\n        title=\"modern-ciam\"\n        src=\"/static/04bf5e11f74fd31f8819d64573a1e02c/e5715/modern-ciam.png\"\n        srcset=\"/static/04bf5e11f74fd31f8819d64573a1e02c/a6d36/modern-ciam.png 650w,\n/static/04bf5e11f74fd31f8819d64573a1e02c/e5715/modern-ciam.png 768w,\n/static/04bf5e11f74fd31f8819d64573a1e02c/63ff0/modern-ciam.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<p>The OWI Identity Landscape is a tool to help companies keep track of market growth and trends and understand the strategic importance of digital identity moving into 2020 and beyond. OWI will be releasing a more detailed research report delving into the details of each market segment and how companies within the industry overlap and intersect in upcoming months. </p>\n<p>Download a complimentary copy of OWI’s 2019 Industry Landscape at <a href=\"https://oneworldidentity.com/2019-identity-landscape/\">www.oneworldidentity.com/landscape</a>. </p>\n<p><strong>About OWI</strong></p>\n<p>OWI is a market intelligence and strategy firm focused on identity, trust, and the data economy. Through advisory services, events and research, OWI helps a wide range of public and privately held companies, investors and governments stay ahead of market trends, so they can build sustainable, forward-looking products and strategies. OWI was founded in 2015 and is the host of the <a href=\"https://www.knowidentity.com/\">KNOW Identity</a> Conference that takes place in Vegas April 5-8, 2020.</p>\n<p><strong>About LoginRadius</strong></p>\n<p>LoginRadius is a leading cloud-based <a href=\"https://www.loginradius.com/blog/identity/customer-identity-and-access-management/\">customer identity and access management</a> (CIAM) solution securing more than one billion user identities worldwide.</p>\n<p>The LoginRadius Identity Platform empowers business and government organizations to manage customer identities securely, deliver a unified digital experience, and comply with all major privacy regulations such as the EU’s General Data Protection Regulation (GDPR).</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVQY0z2RO08CURCFN0hcWRZQHhYUKBHFBR+sUQQWefoAE4HCArXSWGhiZUGhsTHGEBsLf4AxdkQriZWWNtrY+HuOMwNaTO69k3PPfOdeZWS2BO9cGS4jD//8Ktyxgpx575kpQp20oE/nMGquQ4+uwBkvw5uswUcajfYOowBtKgsH1RBplQAJ+SI3fH2TwYkMeJBu5OCJF6XHYtvYEtRYCcF8E9HCNgbMGmxGGfbxJNSIJR4Kk+lU7niPjI3EjKiYkofYwykEEmtINQ5gVvewUN1FokJrhdaNHSzX9xG26gSShsKT1UhGCISQjJmKDbk33Kd3Ulwm5UThbAOh9JZUMLkpfQaTyCKmy0yl8Rv1yTiuFs1KnwcpoUWcXNzg8/sHj8+veHjq4r7zgvePL3S6b6Ljp1KYwE9x2Jjfgen+4rti+f8P4jjF5hFa13c4Pm/36qyN08tbHLau5DM56S/3nMSX+4NvoQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"book-a-demo-loginradius\"\n        title=\"book-a-demo-loginradius\"\n        src=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/BD-Plexicon1-1024x310-1.png\"\n        srcset=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/a6d36/BD-Plexicon1-1024x310-1.png 650w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/BD-Plexicon1-1024x310-1.png 768w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/2bef9/BD-Plexicon1-1024x310-1.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"December 02, 2019","updated_date":null,"description":"LoginRadius is one of 415 identity companies chosen to be included in the study from a pool of over 2,000.","title":"One World Identity Report Names LoginRadius a Customer Identity and Access Management (CIAM) Industry Leader","tags":["media-and-publication","LoginRadius"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.408450704225352,"src":"/static/b141270ff2dd9d0cb3ac4f94f7878626/0756a/blog-graphic-one-world-identity.png","srcSet":"/static/b141270ff2dd9d0cb3ac4f94f7878626/69585/blog-graphic-one-world-identity.png 200w,\n/static/b141270ff2dd9d0cb3ac4f94f7878626/497c6/blog-graphic-one-world-identity.png 400w,\n/static/b141270ff2dd9d0cb3ac4f94f7878626/0756a/blog-graphic-one-world-identity.png 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"If you own or manage an e-commerce business, then you’re aware that a solid customer experience (CX) strategy is vital to success. But…","fields":{"slug":"/growth/improve-customer-experience-ecommerce/"},"html":"<p>If you own or manage an e-commerce business, then you’re aware that a solid customer experience (CX) strategy is vital to success. But before you consider tackling CX, it’s important to understand what it is and what it can do for your business.</p>\n<h2 id=\"what-does-customer-experience-mean-in-ecommerce\" style=\"position:relative;\"><a href=\"#what-does-customer-experience-mean-in-ecommerce\" aria-label=\"what does customer experience mean in ecommerce permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What does customer experience mean in ecommerce?</h2>\n<p>In the context of e-commerce business and online retail stores, customer experience refers to how a brand manages to engage its customers across the web. </p>\n<p><a href=\"https://www.loginradius.com/blog/2020/04/omnichannel-customer-experience/\">Customer experience describes</a> a customer’s perception of how a company interacts with them, and vice versa. Whether it’s in-store, through mobile, or web, this perception is the driving factor that affects customer behavior. It builds brand memories and encourages brand loyalty. </p>\n<p>Think of CX as the \"fingerprints\" you leave on your customers. Every step of the journey— from the first impression to repeat purchases—is essential. Hence, businesses should evaluate every touchpoint of consumers who shop with you. </p>\n<p><a href=\"https://www.loginradius.com/customer-experience-solutions/\">Pleasant experiences encourage</a> better revenue, positive reviews, and lifelong customers. By contrast, a poor customer experience leads to the opposite. </p>\n<p>Basically, if customers love interacting with you, they’ll recommend you to others and stay with you longer. In many cases, customer loyalty can actually last generations, or for the life of the brand, itself.</p>\n<h2 id=\"why-is-the-customer-experience-a-buzzword-in-e-commerce\" style=\"position:relative;\"><a href=\"#why-is-the-customer-experience-a-buzzword-in-e-commerce\" aria-label=\"why is the customer experience a buzzword in e commerce permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why is the customer experience a buzzword in e-commerce?</h2>\n<p>These recent stats and predictions shed some light on the question.</p>\n<ul>\n<li>86% of consumers are <a href=\"https://www.walkerinfo.com/Portals/0/Documents/Knowledge%20Center/Featured%20Reports/WALKER-Customers2020.pdf\">willing to pay more</a> for improved customer experience.</li>\n<li>49% of shoppers made impulse buys after <a href=\"https://www.globenewswire.com/news-release/2017/10/25/1300518/0/en/Segment-Survey-Finds-Consumers-Will-Spend-More-When-Their-Shopping-Experience-is-Personalized-but-Most-Retailers-are-Missing-the-Mark.html\">personalized experiences</a>.</li>\n<li>40% of data analytics projects will relate to the customer experience <a href=\"https://www.gartner.com/en/newsroom/press-releases/2018-02-19-gartner-says-25-percent-of-customer-service-operations-will-use-virtual-customer-assistants-by-2020\">by 2020</a>. </li>\n</ul>\n<p>When it comes to providing a superior customer experience, \"people\" and \"product\" are the main drivers. Obviously, your visitors should be impressed by how your product performs. But customers should also be delighted by your customer support agents, should they seek their help. </p>\n<h2 id=\"what-are-some-ways-to-improve-customer-experience\" style=\"position:relative;\"><a href=\"#what-are-some-ways-to-improve-customer-experience\" aria-label=\"what are some ways to improve customer experience permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What are some ways to improve customer experience?</h2>\n<p><a href=\"https://www.loginradius.com/blog/2019/12/identity-as-a-service-for-business/\">Managing user identity</a> can ensure a smooth and scalable response to the growing demands in customer expectations. To prepare your enterprise business for success during the holiday season, here are five opportunities to consider without breaking the bank. </p>\n<h3 id=\"1-deliver-enhanced-mobile-experiences-to-exceed-rising-consumer-expectations\" style=\"position:relative;\"><a href=\"#1-deliver-enhanced-mobile-experiences-to-exceed-rising-consumer-expectations\" aria-label=\"1 deliver enhanced mobile experiences to exceed rising consumer expectations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>1. Deliver enhanced mobile experiences to exceed rising consumer expectations.</strong></h3>\n<p>Providing excellent mobile e-commerce (m-commerce) shopping <a href=\"https://www.loginradius.com/blog/2020/05/customer-experience-retail-industry/\">experience can benefit retailers</a> significantly. By 2021, m-commerce sales are expected to be responsible for 54% of overall e-commerce revenue, <a href=\"https://www.bigcommerce.com/blog/mobile-commerce/#why-does-mobile-commerce-matter\">predicts</a> Big Commerce. </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 60.61538461538461%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHfmkgMP//EABYQAAMAAAAAAAAAAAAAAAAAAAABIP/aAAgBAQABBQIc/wD/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAUEAEAAAAAAAAAAAAAAAAAAAAg/9oACAEBAAY/Al//xAAYEAADAQEAAAAAAAAAAAAAAAAAAREhEP/aAAgBAQABPyEoTzSIfP/aAAwDAQACAAMAAAAQHD//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxBn/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAQEBAAMAAAAAAAAAAAAAAREAITFhcf/aAAgBAQABPxC3wyOfCWeswcCVDrvi4Cb/2Q=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"image 2\"\n        title=\"image 2\"\n        src=\"/static/cc5606ef32dd60d5445d851c89838435/212bf/image-2.jpg\"\n        srcset=\"/static/cc5606ef32dd60d5445d851c89838435/6aca1/image-2.jpg 650w,\n/static/cc5606ef32dd60d5445d851c89838435/212bf/image-2.jpg 768w,\n/static/cc5606ef32dd60d5445d851c89838435/64175/image-2.jpg 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>This is one of the reasons why your online retail store should be easily accessible on mobile devices, not just desktops and laptops. </p>\n<p>Keep in mind that your mobile sites should be optimized. In fact, Think With Google <a href=\"https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/\">reports</a> that 53% of customers will abandon your site if it takes over three seconds to load. When they do bounce, chances are they’ll go straight to your competitors. One way to optimize your site is to reduce the file size on your website’s images. </p>\n<p>“<strong>If a (Google) bot finds that your site is hostile to mobile users or loads very slowly, you're going to lose rank.</strong></p>\n<p><strong>–</strong> <a href=\"https://twitter.com/johnelincoln\"><strong>John Lincoln</strong></a><strong>, CEO of Ignite Visibility</strong> </p>\n<p>If more than 30% of your site visitors arrive via their smartphones, create a dedicated mobile app. These are far more efficient than responsive designs and offer a better customer experience. </p>\n<p>Once your mobile app is in place, you’ll need a digital transformation strategy to enhance and update processes and technical capabilities that will meet your customers' demands. </p>\n<p>A solution to this is using a <a href=\"https://www.loginradius.com/blog/2019/10/digital-identity-management/\">digital identity platform</a>. This is a reliable way to engage customers during the holiday season and beyond while enriching their digital experience.</p>\n<h3 id=\"2-your-mobile-strategy-should-satisfy-customers-at-all-touchpoints\" style=\"position:relative;\"><a href=\"#2-your-mobile-strategy-should-satisfy-customers-at-all-touchpoints\" aria-label=\"2 your mobile strategy should satisfy customers at all touchpoints permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>2. Your mobile strategy should satisfy customers at ALL touchpoints.</strong></h3>\n<p>Brick-and-mortar retail isn’t dying. It only dies if you let it by not applying a digital strategy with identity management that personalizes the journey for your customers.</p>\n<p>In fact, Dollar General says that “digitally engaged customers” spend twice as much as the average checkout receipt. To address this, Dollar General launched a convenient “Order online and pick up at store” feature that analysts say could help attract a younger demographic.</p>\n<p>In short, shoppers like to combine digital and mobile shopping with in-person buying experiences. That’s why retailers should include mobile-friendly touchpoints in their marketing strategies. </p>\n<p><strong>Here are strategies for improving customer experience in-store, and out:</strong></p>\n<ul>\n<li>Trigger relevant chat, email, or SMS workflows when users engage with mobile devices.</li>\n<li>Include on-the-spot buyer guides, product fact sheets, and upselling suggestions on your sites and apps.</li>\n<li>Use aggregate e-commerce data from customer identities to build marketing schemes.</li>\n<li>Install in-store kiosks with complementary products, allowing users to compare items.</li>\n<li>Synchronize profile and buying information between devices and physical locations by using <a href=\"https://www.loginradius.com/blog/2019/06/customer-identity-and-access-management/\">customer identity and access management</a> (CIAM) software</li>\n</ul>\n<p>In short, integrating digital and traditional touchpoints using CIAM tools will help you build customer satisfaction and loyalty that lasts.</p>\n<p><strong>“Expect to see more shoppers using mobile, especially as brands begin to encourage more in-store mobile engagement through push notifications and SMS messaging.”</strong> </p>\n<p><strong>–</strong> <a href=\"https://twitter.com/rickkenney\"><strong>Rick Kenney</strong></a><strong>, Head of Consumer Insights, Salesforce</strong> </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.769230769230774%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAD/9oADAMBAAIQAxAAAAHk5spMD//EABYQAQEBAAAAAAAAAAAAAAAAABABEf/aAAgBAQABBQLWP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABcQAAMBAAAAAAAAAAAAAAAAAAAQMQH/2gAIAQEAAT8hiLSn/9oADAMBAAIAAwAAABDjD//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/EIf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPxCn/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERMRAhYbH/2gAIAQEAAT8QhrbglLEU2eA7x//Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"image 3\"\n        title=\"image 3\"\n        src=\"/static/b84e1d802631b0420d44de3f9cd7de20/212bf/image-3.jpg\"\n        srcset=\"/static/b84e1d802631b0420d44de3f9cd7de20/6aca1/image-3.jpg 650w,\n/static/b84e1d802631b0420d44de3f9cd7de20/212bf/image-3.jpg 768w,\n/static/b84e1d802631b0420d44de3f9cd7de20/64175/image-3.jpg 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h3 id=\"3-emphasize-the-employee-experience-to-boost-customer-retention\" style=\"position:relative;\"><a href=\"#3-emphasize-the-employee-experience-to-boost-customer-retention\" aria-label=\"3 emphasize the employee experience to boost customer retention permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>3. Emphasize the employee experience to boost customer retention.</strong></h3>\n<p>The best way to leverage the correlation between employee and customer experience is to create an employee experience portal. This portal can be an intranet system that will send customized messages to your employees and further boost their engagement with your customers. </p>\n<p>Kick this strategy off by deploying surveys to employees. This way, you can gain insights into consumer expectations, plus introduce engagement programs and other incentives.</p>\n<h3 id=\"4-use-personalization-techniques-and-loyalty-programs-to-get-ahead-in-e-commerce\" style=\"position:relative;\"><a href=\"#4-use-personalization-techniques-and-loyalty-programs-to-get-ahead-in-e-commerce\" aria-label=\"4 use personalization techniques and loyalty programs to get ahead in e commerce permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>4. Use personalization techniques and loyalty programs to get ahead in e-commerce.</strong></h3>\n<p>One good example of the new generation sales opportunities is the changing face of loyalty programs. About <a href=\"https://www.retailtouchpoints.com/topics/crm-loyalty/loyalty-program-study-70-of-shoppers-prefer-gift-card-rewards-from-online-retailers\">70% of shoppers</a> prefer loyalty programs and gift cards during their holiday shopping, and half of those customers will spend more on purchases than they otherwise would have. </p>\n<p>One right way to achieve an optimized customer experience is by creating an experiential approach. Here are some tips on that.</p>\n<p>Do not simply target customers with product suggestions in their loyalty program based on browsing history. Over one-third of users find this approach invasive. Instead, create a more experiential approach that incorporates predictive selling from user data; this encourages loyalty redemptions and upsells. </p>\n<p>You can also add-in a unique, branded currency to appeal to your shoppers, further augmenting user-targets based on shopping activities.</p>\n<h3 id=\"5-promote-transparency-often-to-foster-good-customer-relationships\" style=\"position:relative;\"><a href=\"#5-promote-transparency-often-to-foster-good-customer-relationships\" aria-label=\"5 promote transparency often to foster good customer relationships permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><strong>5. Promote transparency often to foster good customer relationships.</strong></h3>\n<p>With legislation like <a href=\"https://www.loginradius.com/blog/2019/09/ccpa-vs-gdpr-the-compliance-war/\">GDPR and CCPA</a>, there will be few allowances for mistakes in 2020. E-commerce brands that accidentally make mistakes will have to own up to it and take immediate actions to avoid the backlash. </p>\n<p>With large scale data breaches happening around the world, safety and transparency are being valued more than ever. </p>\n<p>The best e-commerce <a href=\"https://www.loginradius.com/blog/2020/04/loginradius-ciam-retail-ecommerce-business/\">digital experience platform</a> should be GDPR compliant or at least provide the tools to make your brand GDPR-ready. </p>\n<p>Southwest Airlines prides itself on being <a href=\"https://simpleflying.com/southwest-lcc-model/\">the largest low-cost carrier in the world</a>, and it lists transparency as an important driver for its popularity. Their marketing campaign, \"Transfarency\" garnered over 5 million likes on Facebook and earned customer trust for promoting \"no hidden fees or extra charges\" as their value proposition.</p>\n<p><strong>But what about the privacy aspect of it?</strong></p>\n<p>No matter what e-commerce shopping experience you offer your customers, data security should be one of your biggest concerns. Cybercriminals are always on the lookout for loopholes to steal your customer's private data. </p>\n<p>What's worse is that most customers often don’t take the necessary steps to protect themselves. <a href=\"https://www.creditdonkey.com/identity-theft-survey.html\">CreditDonkey</a> reports that 68% of customers use the same password for multiple websites. That’s a good reason for you to be extra vigilant when building a secure e-commerce customer experience. Here’s how you can get started.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 300px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABboSZKhcUf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAwASIjFD/9oACAEBAAEFAscobhoKnWN5esd//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BZ//EABcRAAMBAAAAAAAAAAAAAAAAAAEQETH/2gAIAQIBAT8BGxf/xAAcEAACAgIDAAAAAAAAAAAAAAAAAQJBEnEhMTL/2gAIAQEABj8C59OzCxqMl3ZMeiWz/8QAHBABAAMBAAMBAAAAAAAAAAAAAQARITFBYbHw/9oACAEBAAE/IfEZbTty4HO6ZG86r9ojYrQfCGSa/PhP/9oADAMBAAIAAwAAABCrz//EABYRAQEBAAAAAAAAAAAAAAAAAAEAMf/aAAgBAwEBPxBOs3//xAAYEQACAwAAAAAAAAAAAAAAAAAAARFhcf/aAAgBAgEBPxB5wErP/8QAGhABAQADAQEAAAAAAAAAAAAAAREAIUExcf/aAAgBAQABPxCsuCnQRvTWJRmw1juRQqNV6fPmNjkStmSY2UWd25sHa7Lh/9k='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Woman with shopping bags\"\n        title=\"Woman with shopping bags\"\n        src=\"/static/3259d99066b082ac9fbbfbaf1f6690d7/f93b5/shopping-bags-XMAS_blog-300x150.jpg\"\n        srcset=\"/static/3259d99066b082ac9fbbfbaf1f6690d7/f93b5/shopping-bags-XMAS_blog-300x150.jpg 300w\"\n        sizes=\"(max-width: 300px) 100vw, 300px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"tips-to-protect-e-commerce-customer-data\" style=\"position:relative;\"><a href=\"#tips-to-protect-e-commerce-customer-data\" aria-label=\"tips to protect e commerce customer data permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tips to protect e-commerce customer data</h2>\n<ul>\n<li>Collect and store only important customer data that you need. </li>\n<li>Do not store credit card numbers and customer names for a quicker checkout process. </li>\n<li>Demand strong, complex passwords that cannot be hacked or broken easily. </li>\n<li>Optimize your organizational control to prevent leaks and insider attacks.</li>\n<li>Set up website security with <a href=\"https://www.loginradius.com/blog/2019/06/what-is-multi-factor-authentication/\">two-factor authentication</a> and SSL certificates. </li>\n<li>Educate customers and encourage them to identify suspicious behavior. </li>\n<li>Introduce a web application firewall with built-in DDoS protection.</li>\n<li>Keep a backup solution in place to automatically back up files in the event of a breach.</li>\n<li>Conduct security awareness training for your employees, so they know how to spot suspicious activities.</li>\n<li><a href=\"https://www.loginradius.com/resource/infographic/cybersecurity-best-practices-for-enterprise/\">Develop a cybersecurity plan</a> that clearly outlines what to do right after an attack. </li>\n<li>Stay up-to-date with security patches to prevent hackers from exploiting your data. </li>\n<li>Encrypt all passwords and sensitive customer data, so they are never compromised. </li>\n</ul>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>When it comes to growing your business, a smart e-commerce customer experience strategy is as important as a marketing strategy. With a customer identity and access management solution, you can get 360-degree customer profiling, with 100% customer consent, across all touchpoints. This allows you to personalize marketing and loyalty programs that engage your audience. And that’s a win-win for you and your customers.</p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeElEQVQY001RuU4CURSdODrMACJgKFQiEGXfXUBg2AZnQKKIiQVqpbGhsLGg0MTCGENiYeEHGC2JVi6NsbQwNhb+z/G+GUwsTt5y3zvLvZwpIMORqsOdXYcYUcDOYqAIyV+AFDAg6ntZv7PEanBmWphM1GCO1iCFKzCzGvtHdU5/HKlCiiqQ4irsSRXWhAoxWNLJx/xF4zGB9yzDRKLTlQ6C1W3w6RZGwjXw3gxM84Yo96dsCpXJqQZbpAx7rApzbBW2pIaplRZG/TJcKRW59gHSa3tYaOwi1Riu9R1kN/fhLbQgzOXI4ZCQOXKQO2dcgZPiSHENjnQDPnkLQrAMa6iICRJypTW6a8OT28AsYSbT1A2Mh8v/IhMp+yTGWGTNiMxikohAzi2hEjj3Io7OrvD5/YP7x1fcPbzgdvCE948vDJ7fiFQhh3mKPIzrWmpigoYjEInumg3Eb4A1nfdloXS66F3eoHvaN3DSx/H5NQ57F9SqCvUxj1/TksOl/PGdLwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Book-a-demo-loginradius\"\n        title=\"Book-a-demo-loginradius\"\n        src=\"/static/a854d948ee1cb58ffca614fbff39f749/e5715/BD-Developers2-1024x310.png\"\n        srcset=\"/static/a854d948ee1cb58ffca614fbff39f749/a6d36/BD-Developers2-1024x310.png 650w,\n/static/a854d948ee1cb58ffca614fbff39f749/e5715/BD-Developers2-1024x310.png 768w,\n/static/a854d948ee1cb58ffca614fbff39f749/2bef9/BD-Developers2-1024x310.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"November 28, 2019","updated_date":null,"description":"A smart e-commerce customer service strategy is as critical as a marketing strategy when it comes to growing your business. You will get 360-degree customer profiling, with 100% customer consent, at all touchpoints, with a customer identity and access management solution.","title":"5 Ways to Enhance Customer Experience in E-commerce","tags":["cx","ecommerce","digital identity"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.492537313432836,"src":"/static/2509e52e66db4bb1c81d25734eca5520/33aa5/customer-experience.jpg","srcSet":"/static/2509e52e66db4bb1c81d25734eca5520/f836f/customer-experience.jpg 200w,\n/static/2509e52e66db4bb1c81d25734eca5520/2244e/customer-experience.jpg 400w,\n/static/2509e52e66db4bb1c81d25734eca5520/33aa5/customer-experience.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"You'll learn about JavasScript NaN in this tutorial, how to check whether a value is NaN, and how to effectively handle NaN. What is NaN in…","fields":{"slug":"/engineering/checking-for-nan-in-javascript/"},"html":"<p>You'll learn about JavasScript NaN in this tutorial, how to check whether a value is NaN, and how to effectively handle NaN.</p>\n<h2 id=\"what-is-nan-in-javascript\" style=\"position:relative;\"><a href=\"#what-is-nan-in-javascript\" aria-label=\"what is nan in javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is NaN in Javascript?</h2>\n<p>NaN, in JavaScript, can be many things. In fact, it can be almost anything, so long as it is <em>Not a Number</em>. Its type is technically “number” (when evaluated with “typeof”), although it stands for <strong>Not a Number</strong>.  </p>\n<h2 id=\"values-in-nan-javascript\" style=\"position:relative;\"><a href=\"#values-in-nan-javascript\" aria-label=\"values in nan javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Values in NaN Javascript</h2>\n<p>Values can become NaN through a variety of means, which usually involve erroneous math calculations (such as 0/0), or as a result of type coercion, either implicit or explicit.</p>\n<p>A common example is when you run parseInt on a string that starts with an alphabetical character. This isn’t exclusive to parseInt, as it also applies when using explicit coercion with Number(), or with the unary “+” operator.  </p>\n<h2 id=\"how-to-check-nan-in-javascript\" style=\"position:relative;\"><a href=\"#how-to-check-nan-in-javascript\" aria-label=\"how to check nan in javascript permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How to check NaN in Javascript?</h2>\n<p>Before selecting a method for checking for NaN, <em>how should you</em> <strong><em>not</em></strong> <em>check for NaN?</em></p>\n<p>NaN is a bizarre value in JavaScript, as it does not equal itself when compared, either with the loose equality (==) or strict equality (===) operator. NaN is the only value in the entire language which behaves in this manner with regards to comparisons.  </p>\n<p>For example, if parseInt(“a”) returns NaN, then parseInt(“a”) === NaN will return false. This may seem strange, but it makes perfect sense after thinking about what NaN really is.  </p>\n<p>NaN doesn’t tell you what something is, it tells you what it <strong>isn’t</strong>.  </p>\n<p>These two different strings being passed to parseInt() will both return NaN.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk11\">parseInt</span><span class=\"mtk1\">(“</span><span class=\"mtk12\">abc</span><span class=\"mtk1\">”) </span><span class=\"mtk3\">// NaN</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk11\">parseInt</span><span class=\"mtk1\">(“</span><span class=\"mtk12\">def</span><span class=\"mtk1\">”) </span><span class=\"mtk3\">// NaN</span></span></code></pre>\n<p>Both statements return NaN, but are they <em>really</em> the same? Maybe, but it certainly makes sense why JavaScript would disagree, given that they are derived from different string arguments.  </p>\n<p>Here are a few examples of strict inequality comparisons, which demonstrate the inconsistency of NaN.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk7\">2</span><span class=\"mtk1\"> !== </span><span class=\"mtk7\">2</span><span class=\"mtk1\"> </span><span class=\"mtk3\">// false</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">true</span><span class=\"mtk1\"> !== </span><span class=\"mtk4\">true</span><span class=\"mtk1\"> </span><span class=\"mtk3\">// false</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">“</span><span class=\"mtk12\">abc</span><span class=\"mtk1\">” !== “</span><span class=\"mtk12\">abc</span><span class=\"mtk1\">” </span><span class=\"mtk3\">// false</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">...</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">NaN</span><span class=\"mtk1\"> !== </span><span class=\"mtk4\">NaN</span><span class=\"mtk1\"> </span><span class=\"mtk3\">// true</span></span></code></pre>\n<h3 id=\"method-1-isnan-or-numberisnan\" style=\"position:relative;\"><a href=\"#method-1-isnan-or-numberisnan\" aria-label=\"method 1 isnan or numberisnan permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Method 1: isNaN or Number.isNaN</h3>\n<p>JavaScript has a built-in method, appropriately named “isNaN,” which checks for NaN. There is a newer function called Number.isNaN, which is included in the ES2015 spec.  </p>\n<p>The difference between isNaN and Number.isNaN is that isNaN coerces the argument into a number type. To avoid complicated and unexpected outcomes, it is often advised to use the newer, more robust Number.isNaN to avoid these side effects.</p>\n<p>Number.isNaN does not perform any forcible type conversion, so it simply returns the boolean based on the parameter.  </p>\n<p>Here is an example of the difference between the two methods:  </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk11\">isNaN</span><span class=\"mtk1\">(</span><span class=\"mtk4\">undefined</span><span class=\"mtk1\">) </span><span class=\"mtk3\">// true</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">Number</span><span class=\"mtk1\">.</span><span class=\"mtk11\">isNaN</span><span class=\"mtk1\">(</span><span class=\"mtk4\">undefined</span><span class=\"mtk1\">) </span><span class=\"mtk3\">// false</span></span></code></pre>\n<p>isNaN, when passed undefined, returns true because undefined becomes NaN after number coercion. You can test this yourself by running Number(undefined). You will find that it returns NaN.  </p>\n<p>Number.isNaN, on the other hand, returns false. This is because no coercion takes place, and undefined is <em>not</em> NaN, it is simply undefined.  </p>\n<p>It is also important to note that Number.isNaN is a newer (ES2015) <a href=\"https://www.loginradius.com/blog/engineering/16-javascript-hacks-for-optimization/\">method in JavaScript</a>, so browser support for Number.isNaN is not as stable as isNaN, which has been around since ES1 (1997).  </p>\n<h3 id=\"method-2-objectis\" style=\"position:relative;\"><a href=\"#method-2-objectis\" aria-label=\"method 2 objectis permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Method 2: Object.is</h3>\n<p><code>Object.is</code> is a JavaScript method which checks for sameness. It generally performs the same evaluations as a strict equality operator (===), although it treats NaN differently from strict equality.  </p>\n<p><code>Object.is(0, -0)</code> will return false, while 0 === -0 will return true. Comparisons of 0 and -0 differ, as do comparisons of NaN. This concept is called “Same-value-zero equality.”  </p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"javascript\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">NaN</span><span class=\"mtk1\"> === </span><span class=\"mtk4\">NaN</span><span class=\"mtk1\"> </span><span class=\"mtk3\">// false</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk10\">Object</span><span class=\"mtk1\">.</span><span class=\"mtk11\">is</span><span class=\"mtk1\">(</span><span class=\"mtk4\">NaN</span><span class=\"mtk1\">, </span><span class=\"mtk4\">NaN</span><span class=\"mtk1\">) </span><span class=\"mtk3\">// true</span></span></code></pre>\n<p><code>Object.is(NaN, NaN)</code> will in fact return true, while we already know that NaN === NaN returns false. That makes this yet another valid way to check if something is not a number.</p>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>Between the given methods of checking for NaN, the most common is to use the global isNaN function, or the ES2015 Number.isNaN method. While method #2 is valid, most people will typically use isNaN or Number.isNaN, which were created specifically for checking for NaN.</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk3 { color: #6A9955; }\n  .dark-default-dark .mtk7 { color: #B5CEA8; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n</style>","frontmatter":{"date":"November 22, 2019","updated_date":null,"description":"In this guide you'll learn about JavasScript NaN, how to verify whether a value is NaN, and how to manage NaN effectively.","title":"NaN in JavaScript: An Essential Guide","tags":["JavaScript"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"src":"/static/55c8ddd31fa08f811d159c331bf44d5e/2244e/numbers-1.jpg","srcSet":"/static/55c8ddd31fa08f811d159c331bf44d5e/f836f/numbers-1.jpg 200w,\n/static/55c8ddd31fa08f811d159c331bf44d5e/2244e/numbers-1.jpg 400w","sizes":"(max-width: 400px) 100vw, 400px"}}},"author":{"id":"Greg Sakai","github":null,"avatar":null}}}}]},"markdownRemark":{"excerpt":"Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards…","fields":{"slug":"/identity/developer-first-identity-provider-loginradius/"},"html":"<p>Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards and refining approaches to building secure, seamless experiences.</p>\n<p>We’re here to support developers on that journey. We know how important simplicity, efficiency, and well-structured documentation are when working with identity and access management solutions. That’s why we’ve redesigned the <a href=\"https://www.loginradius.com/\">LoginRadius website</a>—to be faster, more intuitive, and developer-first in every way.</p>\n<p>The goal? Having them spend less time searching and more time building.</p>\n<h2 id=\"whats-new-and-improved-on-the-loginradius-website\" style=\"position:relative;\"><a href=\"#whats-new-and-improved-on-the-loginradius-website\" aria-label=\"whats new and improved on the loginradius website permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What’s New and Improved on the LoginRadius Website?</h2>\n<p>LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve spent the last few months redesigning our interface— making navigation more intuitive and reassuring that essential resources are easily accessible.</p>\n<p>Here’s a closer look at what’s new and why it’s important:</p>\n<h3 id=\"a-developer-friendly-dark-theme\" style=\"position:relative;\"><a href=\"#a-developer-friendly-dark-theme\" aria-label=\"a developer friendly dark theme permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Developer-Friendly Dark Theme</h3>\n<p><img src=\"/f46881583c7518a93bb24e94c32320de/a-developer-friendly-dark-theme.webp\" alt=\"This image shows how LoginRadius offers several authentication methods like traditional login, social login, passwordless login, passkeys and more in a dark mode.\">    </p>\n<p>Developers spend long hours working in dark-themed IDEs and terminals, so we’ve designed the LoginRadius experience to be developer-friendly and align with that preference.</p>\n<p>The new dark mode reduces eye strain, enhances readability, and provides a seamless transition between a coding environment and our platform. Our new design features a clean, modern aesthetic with a consistent color scheme and Barlow typography, ensuring better readability. High-quality graphics and icons are thoughtfully placed to enhance the content without adding visual clutter.</p>\n<p>So, whether you’re navigating our API docs or configuring authentication into your system, our improved interface will make those extended development hours more comfortable and efficient.</p>\n<h3 id=\"clear-categorization-for-loginradius-capabilities\" style=\"position:relative;\"><a href=\"#clear-categorization-for-loginradius-capabilities\" aria-label=\"clear categorization for loginradius capabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clear Categorization for LoginRadius Capabilities</h3>\n<p><img src=\"/e5358b82be414940f3fb146013845933/capabilities.webp\" alt=\"This image shows a breakdown of all the LoginRadius CIAM capabilities, including authentication, security, UX, scalability and multi-brand management.\"></p>\n<p>We’ve restructured our website to provide a straightforward breakdown of our customer identity and access management platform capabilities, helping you quickly find what you need:</p>\n<ul>\n<li>Authentication: Easily understand <a href=\"https://www.loginradius.com/blog/identity/authentication-option-for-your-product/\">how to choose the right login method</a>, from traditional passwords and OTPs to social login, federated SSO, and passkeys with few lines of code.</li>\n<li>Security: Implement no-code security features like bot detection, IP throttling, breached password alerts, DDoS protection, and adaptive MFA to safeguard user accounts.</li>\n<li>User Experience: Leverage AI builder, hosted pages, and drag-and-drop workflows to create smooth, branded sign-up and login experiences.</li>\n<li>High Performance &#x26; Scalability: Confidently scale with sub-100ms API response times, 100% uptime, 240K+ RPS, and 28+ global data center regions.</li>\n<li>Multi-Brand Management: Efficiently manage multiple identity apps, choosing isolated or shared data stores based on your brand’s unique needs.</li>\n</ul>\n<p>This structured layout ensures you can quickly understand each capability and how it integrates into your identity ecosystem.</p>\n<h3 id=\"developer-first-navigation\" style=\"position:relative;\"><a href=\"#developer-first-navigation\" aria-label=\"developer first navigation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developer-First Navigation</h3>\n<p><img src=\"/a8c155c2b6faf3d5f4b4de4e2b14d763/developers-menu.webp\" alt=\"This image shows the LoginRadius menu bar, highlighting the developer dropdown.\">   </p>\n<p>We’ve been analyzing developer workflows to identify how you access key resources. That’s why we redesigned our navigation with one goal in mind: to reduce clicks and make essential resources readily available.</p>\n<p>The new LoginRadius structure puts APIs, SDKs, and integration guides right at the menu bar under the Developers dropdown so you can get started faster. Our Products, Solutions, and Customer Services are also clearly categorized, helping development teams quickly find the right tools and make informed decisions.</p>\n<h3 id=\"quick-understanding-of-integration-benefits\" style=\"position:relative;\"><a href=\"#quick-understanding-of-integration-benefits\" aria-label=\"quick understanding of integration benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Understanding of Integration Benefits</h3>\n<p><img src=\"/b2f9a964a2da0ea83e2f8596b833bba7/we-support-your-tech-stack.webp\" alt=\"This image shows a list of popular programming languages and frameworks offered by LoginRadius.\"></p>\n<p>Developers now have a clear view of the tech stack available with LoginRadius, designed to support diverse business needs.</p>\n<p>Our platform offers pre-built SDKs for Node.js, Python, Java, and more, making CIAM integration seamless across popular programming languages and frameworks.</p>\n<h2 id=\"over-to-you-now\" style=\"position:relative;\"><a href=\"#over-to-you-now\" aria-label=\"over to you now permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Over to You Now!</h2>\n<p>Check out our <a href=\"https://www.loginradius.com/\">revamped LoginRadius website</a> and see how the improved experience makes it easier to build, scale, and secure your applications.</p>\n<p>Do not forget to explore the improved navigation and API documentation, and get started with our free trial today. We’re excited to see what you’ll build with LoginRadius!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"February 21, 2025","updated_date":null,"description":"LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve redesigned our website interface, making navigation more intuitive and reassuring that essential resources are easily accessible.","title":"Revamped & Ready: Introducing the New Developer-First LoginRadius Website","tags":["Developer tools","API","Identity Management","User Authentication"],"pinned":true,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7857142857142858,"src":"/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp","srcSet":"/static/80b4e4fbe176a10a327d273504607f32/61e93/hero-section.webp 200w,\n/static/80b4e4fbe176a10a327d273504607f32/1f5c5/hero-section.webp 400w,\n/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp 800w,\n/static/80b4e4fbe176a10a327d273504607f32/99238/hero-section.webp 1200w,\n/static/80b4e4fbe176a10a327d273504607f32/7c22d/hero-section.webp 1600w,\n/static/80b4e4fbe176a10a327d273504607f32/1258b/hero-section.webp 2732w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},"pageContext":{"limit":6,"skip":810,"currentPage":136,"type":"///","numPages":161,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}