{"id":22125,"date":"2019-11-05T12:13:18","date_gmt":"2019-11-05T12:13:18","guid":{"rendered":"https:\/\/www.intercom.com\/blog\/?p=22125"},"modified":"2020-07-30T12:54:17","modified_gmt":"2020-07-30T11:54:17","slug":"updating-our-user-storage","status":"publish","type":"post","link":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/","title":{"rendered":"Making our user storage more scalable and secure"},"content":{"rendered":"<p>Our mission is to make web business personal. We want our customers to be able to have the same delightful, personal experiences talking to their customers as they do talking to their friends.<\/p>\n<p>Enabling all these conversations and interactions between businesses and their customers requires an extremely robust storage system that can scale as the data set expands \u2013 our storage needs, after all, have to keep pace not just with our own growth, but with the combined growth of all our customers.<\/p>\n<p>In our system, we use the term \u201cusers\u201d to describe the people who interact with our customers via Intercom, and needless to say, that means storing a very extensive live list of users.<\/p>\n<blockquote class=\"pullquote-style-two\"><p>&#8220;Managing user storage is the very foundation of the Intercom platform, and has required constant and rapid evolution since we started the company&#8221;<\/p><\/blockquote>\n<p>Managing this user storage is the very foundation of the <a href=\"https:\/\/www.intercom.com\/blog\/customer-intelligence\" target=\"_blank\" rel=\"noopener noreferrer\">Intercom platform<\/a>, and has required constant and rapid evolution since we started the company. Recently, we completed an ambitious transition to an entirely new user storage system \u2013 the story of how our user storage has evolved from our earliest days to now shines a light on how Intercom itself has evolved and scaled as a platform and as a company over the past eight years.<\/p>\n<h2 id=\"a-brief-history-of-user-storage\">A brief history of user storage<\/h2>\n<h3>2011 &#8211; MySQL<\/h3>\n<p>In the beginning we used a single Amazon RDS (relational database) instance for everything \u2013 including user data.<\/p>\n<p>When we launched custom data for users, we opted to serialize it in a MySQL TEXT field.<\/p>\n<p>This solution worked until we wanted to improve the user list by allowing customers to sort and filter on custom data, at which point we needed a more flexible solution.<\/p>\n<h3>2011-2014 &#8211; MongoDB<\/h3>\n<p>The solution we turned to was <a href=\"https:\/\/www.intercom.com\/blog\/podcasts\/mongodbs-meagen-eisenberg-on-the-must-have-marketing-tech-stack\/\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB<\/a>, which was amazingly flexible for our purposes. It allowed us to easily store custom data and other complex data structures. We implemented a very flexible query pattern to power the user list. For our early years, this was more than adequate.<\/p>\n<p>However, things that worked at low scale started to creak as we grew \u2013 we encountered problems powering the user list with MongoDB, and began to experience timeouts for some customers. It became a challenge for the database to serve a high volume of &#8220;single user reads\/writes&#8221; as well as the search workload, and it became clear that we urgently needed to upgrade.<\/p>\n<h3>2014-2017 &#8211; MongoDB and Elasticsearch<\/h3>\n<p>In response, we started streaming user data out in to <a href=\"https:\/\/www.intercom.com\/blog\/upgrading-elasticsearch\/\" target=\"_blank\" rel=\"noopener noreferrer\">Elasticsearch<\/a> and used it to power the user list. Around the same time, MongoDB itself got a lot more stable.<\/p>\n<p>That period of stability was not to last \u2013 in late 2016 MongoDB really started creaking for our purposes. We experienced regular outages (sometimes daily) and the constraints on large customers became untenable.<\/p>\n<p>Internally, too, we were suffering \u2013 our infrastructure team spent nearly all their time keeping user storage alive, and it was not the sort of problem that we could solve by spending more with AWS.<\/p>\n<h2 id=\"time-to-make-a-change\">Time to make a change<\/h2>\n<p>The situation was unsustainable and extremely stressful for the team \u2013 folks who were on call had to take their laptop with them everywhere, even to parties. That constant state of anxiety that something might break at any moment takes a serious toll, and it was clear something needed to change.<\/p>\n<blockquote class=\"pullquote-style-one\"><p>&#8220;To support our new scale, we needed to fundamentally change our user storage layer&#8221;<\/p><\/blockquote>\n<p>To support our new scale, we needed to fundamentally change our user storage layer.<\/p>\n<p>The options appeared to be either:<\/p>\n<ul>\n<li>Re-architecting with MongoDB to be actually horizontally scalable (which was made difficult by the initial setup that also accommodated search).<\/li>\n<li>Achieving the same impact with another database.<\/li>\n<\/ul>\n<h2 id=\"evaluating-aws-databases\">Evaluating AWS Databases<\/h2>\n<p>Our philosophy of \u201c<a href=\"https:\/\/www.intercom.com\/blog\/run-less-software\/\" target=\"_blank\" rel=\"noopener noreferrer\">Run Less Software<\/a>\u201d manifests in many ways, but one of the most far-reaching is that we don\u2019t like running databases if we can help it. In order to see if there was an opportunity to shed that responsibility, we prototyped user storage on a couple of Amazon\u2019s databases.<\/p>\n<p>We looked at both Aurora and <a href=\"https:\/\/www.intercom.com\/blog\/how-we-used-dynamodb-streams\/\" target=\"_blank\" rel=\"noopener noreferrer\">DynamoDB<\/a> as possible candidates. Unfortunately, neither proved optimal:<\/p>\n<ul>\n<li>Aurora could easily handle the uniqueness constraints that we needed to enforce on users, but it was clear that we would need to do a bunch of work to get it to support the level of reads and writes we needed.<\/li>\n<li>DynamoDB could handle the R\/W volume very easily (and affordably), but as a relatively simple key-value store, it couldn\u2019t easily handle our uniqueness constraints.<\/li>\n<\/ul>\n<h2 id=\"the-idea-behind-user-storage-v2\">The idea behind User Storage V2<\/h2>\n<p>We realized, however, that it was possible to break this hard problem up in to two smaller problems, each of which could be solved by Aurora or DynamoDB.<\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">We could use Aurora for \u201cidentity\u201d \u2013 just the subset of data that needs a uniqueness constraint on it. This data changes rarely and is relatively small in terms of total size.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">We could then use DynamoDB for key\/value \u201cblob\u201d storage. This data changes a lot, and there is a lot of it \u2013 somewhere over 6TB, with about 5k writes a second and more than 10k reads a second. This volume is easy for DynamoDB.<\/span><\/li>\n<\/ul>\n<h2 id=\"building-in-small-steps\">Building in small steps<\/h2>\n<p>Another internal philosophy is that we like to ship big changes as a series of small safe steps. It was of paramount importance that were particularly deliberate and controlled when making large changes to such a core part of Intercom, which is a far from trivial task. This is how we approached it:<\/p>\n<ul>\n<li>First we introduced a user service layer, and ensured that all access to user data went through this layer. This gave us a clear understanding of all of our access patterns, as well as the ability to make changes behind the service layer without other teams having to know about it.<\/li>\n<li>Then we introduced the identity layer in Aurora, while still using MongoDB. This allowed us to simplify our access patterns on MongoDB to key\/value \u2013 just like they would need to be on DynamoDB after migration.<\/li>\n<li>We then migrated visitor data out of Mongo and in to DynamoDB, and finally moved user data in to DynamoDB.<\/li>\n<\/ul>\n<p>At every step along the way, we had periods where we were dual writing to both data stores. This meant that when things went wrong (as they inevitably did), we could seamlessly change back to the previous version, fix the issue and roll forward again.<\/p>\n<p>Eventually, we were able to stop dual writing user data in to MongoDB, and officially moved to DynamoDB only, the culmination of many years worth of careful work maintaining and iterating on our user storage.<\/p>\n<h2 id=\"counting-the-benefits\">Counting the benefits<\/h2>\n<p>The impact made by our infrastructure team with this transition has been immense \u2013 our user storage is in a better place than it has ever been.<\/p>\n<ul>\n<li><strong>More scalable:<\/strong> We could 10x our customer count, and the number of users our customers have, and the rate at which each user is read or written, and DynamoDB would swallow that up. It autoscales, so assuming these changes happened gradually we wouldn\u2019t have to do anything.<\/li>\n<li><strong>More secure:<\/strong> Our customers\u2019 customer data is among the most precious data we have, and this change has made that critical data more secure than ever before.<\/li>\n<li><strong>Lower cost:<\/strong> The savings from this innovative solution are in the region of $500k a year.<\/li>\n<li><strong>Less maintenance:<\/strong> Not having to manually manage databases is huge, as this set-up is considerably less labor-intensive than the distributed databases we were previously managing. Significantly, we haven\u2019t experienced outages at the level we had in the past since we made the move.<\/li>\n<li><strong>Less stress:<\/strong> The team can now go to parties without worrying they might need to battle to keep our user storage up and running. The time we save is significant, and allows us to spend much more energy and attention iterating on and evolving the user storage model, and more importantly, building new products and features for our customers.<\/li>\n<\/ul>\n<blockquote class=\"pullquote-style-two\"><p>&#8220;We managed this migration of 3 billion users and 4.5 billion visitors with no downtime whatsoever&#8221;<\/p><\/blockquote>\n<p>Most impressively, we managed this migration of 3 billion users and 4.5 billion visitors with no downtime whatsoever. It\u2019s the engineering equivalent of the proverbial \u201cchanging the car engine while still driving\u201d. We\u2019re extremely excited to see where this new engine takes us.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.<\/p>\n","protected":false},"author":6,"featured_media":22128,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"category":[12898],"tags":[19707],"coauthors":[397],"class_list":["post-22125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","tag-user-storage"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Updating Our User Storage - The Intercom Blog<\/title>\n<meta name=\"description\" content=\"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Making our user storage more scalable and secure\" \/>\n<meta property=\"og:description\" content=\"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/\" \/>\n<meta property=\"og:site_name\" content=\"The Intercom Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/intercominc\" \/>\n<meta property=\"article:published_time\" content=\"2019-11-05T12:13:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-07-30T11:54:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1986\" \/>\n\t<meta property=\"og:image:height\" content=\"940\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ciaran Lee\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ciaran_lee\" \/>\n<meta name=\"twitter:site\" content=\"@intercom\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ciaran Lee\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/\"},\"author\":{\"name\":\"Ciaran Lee\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/person\\\/04dd788205aadde601f08484224ace12\"},\"headline\":\"Making our user storage more scalable and secure\",\"datePublished\":\"2019-11-05T12:13:18+00:00\",\"dateModified\":\"2020-07-30T11:54:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/\"},\"wordCount\":1395,\"publisher\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/intercom_Launching-USv2_compressed-1.jpg\",\"keywords\":[\"user storage\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/\",\"name\":\"Updating Our User Storage - The Intercom Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/intercom_Launching-USv2_compressed-1.jpg\",\"datePublished\":\"2019-11-05T12:13:18+00:00\",\"dateModified\":\"2020-07-30T11:54:17+00:00\",\"description\":\"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/updating-our-user-storage\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/intercom_Launching-USv2_compressed-1.jpg\",\"contentUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/intercom_Launching-USv2_compressed-1.jpg\",\"width\":1986,\"height\":940,\"caption\":\"Updating user storage\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/\",\"name\":\"The Intercom Blog\",\"description\":\"Articles and Podcasts on Customer Service, AI and Automation, Product, and more\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\",\"name\":\"The Intercom Blog\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Intercom-logo-sq-black-trans.png\",\"contentUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Intercom-logo-sq-black-trans.png\",\"width\":1000,\"height\":1000,\"caption\":\"The Intercom Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/intercominc\",\"https:\\\/\\\/x.com\\\/intercom\",\"https:\\\/\\\/www.instagram.com\\\/intercom\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/2491343\",\"https:\\\/\\\/www.pinterest.ie\\\/intercom\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCJG0MvLP03kyzzAkD-w98aQ\",\"https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/Intercom_(company)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/person\\\/04dd788205aadde601f08484224ace12\",\"name\":\"Ciaran Lee\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg33d269e8ad4152014d7124806b2012e6\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg\",\"caption\":\"Ciaran Lee\"},\"description\":\"Ciaran is one of Intercom's four co-founders, and ran Intercom\u2019s engineering infrastructure. Previously, he was CTO of Exceptional.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/ciaran-lee-51bb402\\\/\",\"https:\\\/\\\/x.com\\\/ciaran_lee\"],\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/author\\\/ciaran\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Updating Our User Storage - The Intercom Blog","description":"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/","og_locale":"en_US","og_type":"article","og_title":"Making our user storage more scalable and secure","og_description":"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.","og_url":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/","og_site_name":"The Intercom Blog","article_publisher":"https:\/\/www.facebook.com\/intercominc","article_published_time":"2019-11-05T12:13:18+00:00","article_modified_time":"2020-07-30T11:54:17+00:00","og_image":[{"width":1986,"height":940,"url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","type":"image\/jpeg"}],"author":"Ciaran Lee","twitter_card":"summary_large_image","twitter_creator":"@ciaran_lee","twitter_site":"@intercom","twitter_misc":{"Written by":"Ciaran Lee","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/#article","isPartOf":{"@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/"},"author":{"name":"Ciaran Lee","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/person\/04dd788205aadde601f08484224ace12"},"headline":"Making our user storage more scalable and secure","datePublished":"2019-11-05T12:13:18+00:00","dateModified":"2020-07-30T11:54:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/"},"wordCount":1395,"publisher":{"@id":"https:\/\/www.intercom.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","keywords":["user storage"],"articleSection":["Engineering"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/","url":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/","name":"Updating Our User Storage - The Intercom Blog","isPartOf":{"@id":"https:\/\/www.intercom.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/#primaryimage"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/#primaryimage"},"thumbnailUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","datePublished":"2019-11-05T12:13:18+00:00","dateModified":"2020-07-30T11:54:17+00:00","description":"Managing user storage is the foundation of the Intercom platform and requires constant evolution. Learn how we scaled our user base and made it more secure.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intercom.com\/blog\/updating-our-user-storage\/#primaryimage","url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","contentUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","width":1986,"height":940,"caption":"Updating user storage"},{"@type":"WebSite","@id":"https:\/\/www.intercom.com\/blog\/#website","url":"https:\/\/www.intercom.com\/blog\/","name":"The Intercom Blog","description":"Articles and Podcasts on Customer Service, AI and Automation, Product, and more","publisher":{"@id":"https:\/\/www.intercom.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.intercom.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.intercom.com\/blog\/#organization","name":"The Intercom Blog","url":"https:\/\/www.intercom.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/08\/Intercom-logo-sq-black-trans.png","contentUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/08\/Intercom-logo-sq-black-trans.png","width":1000,"height":1000,"caption":"The Intercom Blog"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/intercominc","https:\/\/x.com\/intercom","https:\/\/www.instagram.com\/intercom\/","https:\/\/www.linkedin.com\/company\/2491343","https:\/\/www.pinterest.ie\/intercom\/","https:\/\/www.youtube.com\/channel\/UCJG0MvLP03kyzzAkD-w98aQ","https:\/\/en.wikipedia.org\/wiki\/Intercom_(company)"]},{"@type":"Person","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/person\/04dd788205aadde601f08484224ace12","name":"Ciaran Lee","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg33d269e8ad4152014d7124806b2012e6","url":"https:\/\/secure.gravatar.com\/avatar\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e4a03861459c3c1f1ef127224e3f25cbd0df4de8cade95e884494f14f79a9569?s=96&d=mm&r=pg","caption":"Ciaran Lee"},"description":"Ciaran is one of Intercom's four co-founders, and ran Intercom\u2019s engineering infrastructure. Previously, he was CTO of Exceptional.","sameAs":["https:\/\/www.linkedin.com\/in\/ciaran-lee-51bb402\/","https:\/\/x.com\/ciaran_lee"],"url":"https:\/\/www.intercom.com\/blog\/author\/ciaran\/"}]}},"jetpack_featured_media_url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/11\/intercom_Launching-USv2_compressed-1.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts\/22125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/comments?post=22125"}],"version-history":[{"count":0,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts\/22125\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/media\/22128"}],"wp:attachment":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/media?parent=22125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/category?post=22125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/tags?post=22125"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/coauthors?post=22125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}