{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/posts/better-data-better-products-building-confidence-into-the-data-behind-every-sonos-experience/",
    "result": {"data":{"sanityPost":{"id":"-b563eca1-33f5-5613-ab9b-edcb04190456","slug":{"current":"better-data-better-products-building-confidence-into-the-data-behind-every-sonos-experience"},"title":"Better Data, Better Products: Building Confidence into the Data Behind Every Sonos Experience","mainImage":{"altText":"Better Data, Better Products: Building Confidence into the Data Behind Every Sonos Experience","asset":{"path":"images/znqtjj88/production/e6c38316865378f860bfc383ee38b5db521da18b-5433x3318.jpg","metadata":{"dimensions":{"width":5433,"height":3318,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFBAf/xAAgEAACAQQBBQAAAAAAAAAAAAAAAQIDBBESMRMhUVKR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQIDBf/EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAwDAQACEQMRAD8A7btH2X0YnkiVLaDq1HtPu88lCx26LzJyx5NqXVbGsBcJNrkBgf/Z","palette":{"dominant":{"background":"#d4ccfc"}}}}},"categories":[{"_id":"baa46497-c2bf-4eeb-bf51-bd08238af629","title":"Data Engineering"}],"publishedAt":"2026-03-28T02:50:00.000Z","noHeaderImage":null,"authors":[{"name":"Maguire Marion","_rawBio":[{"_key":"1da8011ebe74","_type":"block","children":[{"_key":"a7be7ea3d853","_type":"span","marks":[],"text":"Data Engineer"}],"markDefs":[],"style":"normal"}]}],"_rawBodyCopy":[{"_key":"637948841fc8","_type":"block","children":[{"_key":"073f84085717","_type":"span","marks":[],"text":"At Sonos, everything we build is centered around the experience in the home. Our understanding of how that experience unfolds is shaped by the data our products generate, which is used to inform decisions such as how we create new products, design new app features, and improve system performance. Because this data supports nearly every part of the company, much of Sonos’ day-to-day operations depend on it behaving predictably behind the scenes. Yet the Sonos ecosystem is a highly complex and vast software product. It spans the apps users rely on to control their systems, the firmware running on speakers, and the fleet of cloud services that enable features like voice control and streaming music from your favorite providers. For more details on our data usage and privacy, you can visit "},{"_key":"effb8ec966be","_type":"span","marks":["db8a42399968"],"text":"sonos.com/legal/privacy"},{"_key":"dd022456b929","_type":"span","marks":[],"text":"."}],"markDefs":[{"_key":"db8a42399968","_type":"link","href":"https://www.sonos.com/en-us/legal/privacy"}],"style":"normal"},{"_key":"28e5c2025f37","_type":"block","children":[{"_key":"08b0a882a35d","_type":"span","marks":[],"text":"But for data to truly power all of these operations, it has to be consistent, coherent, and trustworthy; it’s impossible to use information at scale if data from different parts of our ecosystem don’t align, can’t be validated, or mean something different depending on its origin. Expecting dozens of software teams to manually align on thousands of record types, and implement them in exactly the same way across mobile, web, and speaker software proved unrealistic, as our early systems suffered from mismatched, unprocessable, and missing data. In an infrastructure of this scale, data inconsistencies were not only difficult to trace, but often required weeks of coordination across software teams to resolve, and would render affected data unusable. This made it difficult to trust the insights shaping our products and listening experiences, even when data appeared complete. We needed a way to guarantee that every Sonos product spoke the exact same data language, always."}],"markDefs":[],"style":"normal"},{"_key":"fe4ad4961546","_type":"block","children":[{"_key":"ad3cabc90335","_type":"span","marks":[],"text":"A Fragmented Data Story"}],"markDefs":[],"style":"h2"},{"_key":"c15695d04c2c","_type":"block","children":[{"_key":"65e856c0d0dc","_type":"span","marks":["em"],"text":"Why Confidence in Data Matters"}],"markDefs":[],"style":"h3"},{"_key":"d5da7bd5b360","_type":"block","children":[{"_key":"eeb4b9877ac7","_type":"span","marks":[],"text":"Before diving into how we addressed these problems, it’s worth understanding what unreliable data actually costs in practice. Every team relies on the data produced by our products in many ways, but a few representative questions help illustrate how it directly impacts our product development, quality, and support: Are customers actually using a new feature after we enable it, and should we continue enhancing it? Are products performing reliably across different home and network environments, and what’s common in households that are or are not stable? Which parts of product setup are taking the longest, and how can we make those processes smoother? Are new acoustic tuning changes making a real difference in sound quality?"}],"markDefs":[],"style":"normal"},{"_key":"eeb1c87385b6","_type":"block","children":[{"_key":"3d04e577bd20","_type":"span","marks":[],"text":"High-quality data is what allows us to ask and answer questions like these with confidence. When data is trustworthy, we can identify patterns that inspire new features, detect issues earlier, and confirm that changes we make are truly improving the Sonos experience for our users. Poor-quality data has the opposite effect. When records are inconsistent, missing values, or interpreted differently across platforms, it becomes difficult to understand what is actually happening. Insights slow down or point us in the wrong direction, and we may not be able to answer the critical questions teams rely on to guide development."}],"markDefs":[],"style":"normal"},{"_key":"2446a05ad2c6","_type":"block","children":[{"_key":"456f99ed7bce","_type":"span","marks":["em"],"text":"Outgrowing Our First Approach"}],"markDefs":[],"style":"h3"},{"_key":"4e6e28efcd8c","_type":"block","children":[{"_key":"5314b7dac2fd","_type":"span","marks":[],"text":"Before we could design a system that guaranteed reliable data, we had to understand why our earlier data collection approaches (referred to as "},{"_key":"f926391a365a","_type":"span","marks":["em"],"text":"telemetry"},{"_key":"cb398bbc49c1","_type":"span","marks":[],"text":") were falling short."}],"markDefs":[],"style":"normal"},{"_key":"134fb7fd6d52","_type":"block","children":[{"_key":"8ec1b88fdd0f","_type":"span","marks":[],"text":"Historically, each data-producing team assembled records by choosing their own field names, values, and types before simply sending them to our data-processing pipeline. While this initially helped teams develop quickly, inconsistencies compounded as our ecosystem grew. A speaker’s equalizer value might be sent as "},{"_key":"5cd5283898a8","_type":"span","marks":["code"],"text":"bass_level"},{"_key":"863baea0bef4","_type":"span","marks":[],"text":" on iOS but "},{"_key":"5196fbde6ad3","_type":"span","marks":["code"],"text":"bass"},{"_key":"b743ffec430c","_type":"span","marks":[],"text":" on Android, or as a string on one platform and an integer on another. Trueplay data may appear as "},{"_key":"bc1e589801b1","_type":"span","marks":["code"],"text":"trueplay_tuning"},{"_key":"43e3790f4ca2","_type":"span","marks":[],"text":" or "},{"_key":"51e5a71c96ff","_type":"span","marks":["code"],"text":"trueplay_calibration"},{"_key":"f8210df442f8","_type":"span","marks":[],"text":" depending on the codebase. An ambiguous field like "},{"_key":"ef567fdf9bb0","_type":"span","marks":["code"],"text":"time"},{"_key":"64da2445f785","_type":"span","marks":[],"text":" gave no indication whether it represented a timestamp, a duration, or an end moment, nor what unit it was in. Because of this, backend pipelines and data users were left to infer the meaning of records and consolidate them after the fact, an approach that was costly, error-prone, and impossible to scale. This also meant records had no reliable way to be validated, and that a field could be accidentally renamed, changed, or dropped entirely and shipped to production unnoticed."}],"markDefs":[],"style":"normal"},{"_key":"b6b42e48ad18","_type":"block","children":[{"_key":"ca0930a8db74","_type":"span","marks":[],"text":"In the absence of shared guidelines, data producers had little choice but to rely on their own context and intuition when deciding what records should contain. But with developers lacking visibility into data’s downstream use cases, and analysts having limited input into how it was generated, this disconnect led to discrepancies between the data produced and how it was intended to be used. This meant that even when records appeared well-formed from the producer’s perspective, they may have not contained the nuanced details or values that analysts needed to answer their questions."}],"markDefs":[],"style":"normal"},{"_key":"39a31cd138d1","_type":"block","children":[{"_key":"272ff860494b","_type":"span","marks":[],"text":"The hardest data problems weren’t outright failures, but systemic shortfalls that made misalignments inevitable, both between platforms, and what teams felt data was meant to represent:"}],"markDefs":[],"style":"normal"},{"_key":"2acb0b02a185","_type":"sonosImage","asset":{"_id":"image-2d2539c9c5548856540433db9faea07f0bc5c5bf-2880x2580-jpg","_type":"sanity.imageAsset","_rev":"xpofs4m1bpUfUj0unSiQJ1","_createdAt":"2026-04-03T15:26:09Z","_updatedAt":"2026-04-03T15:26:09Z","assetId":"2d2539c9c5548856540433db9faea07f0bc5c5bf","extension":"jpg","metadata":{"_type":"sanity.imageMetadata","blurHash":"e3Ps#C?b_3?b-p-;fkRjj[t6?bj?M{juoz~qoexuWWM|_3azM{j@IU","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.1162790697674418,"height":2580,"width":2880},"hasAlpha":false,"isOpaque":true,"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAASABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAECAwQH/8QAHhAAAgICAgMAAAAAAAAAAAAAAAECEQMSMVEhIkH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A99nkazLnXoqsktZq3fx9GmRqM4+lt+L6MMdwjPaLlcuKA6ccm4K+QWikkqVACSEABIAA/9k=","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#4e4446","foreground":"#fff","population":0.01,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#632027","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#cb616b","foreground":"#fff","population":0.03,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#a2b4ce","foreground":"#000","population":0.01,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#e4b0ac","foreground":"#000","population":0,"title":"#fff"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#8c7c7c","foreground":"#fff","population":0,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#cb616b","foreground":"#fff","population":0.03,"title":"#fff"}}},"mimeType":"image/jpeg","originalFilename":"betterdata-01-adjusted.jpg","path":"images/znqtjj88/production/2d2539c9c5548856540433db9faea07f0bc5c5bf-2880x2580.jpg","sha1hash":"2d2539c9c5548856540433db9faea07f0bc5c5bf","size":618962,"uploadId":"JsRMpbBMbL7TG5Jja1f3ERTQJlZseH71","url":"https://cdn.sanity.io/images/znqtjj88/production/2d2539c9c5548856540433db9faea07f0bc5c5bf-2880x2580.jpg","filename":"betterdata-01-adjusted.jpg","width":2880,"height":2580,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/2d2539c9c5548856540433db9faea07f0bc5c5bf-2880x2580.jpg?rect=580,0,1720,2580&w=%width%&h=%height%&q=80","id":"image-2d2539c9c5548856540433db9faea07f0bc5c5bf-2880x2580-jpg","children":[],"parent":null},"caption":"Without shared guidelines, each platform produces the same record differently, resulting in confusion and ambiguity for teams relying on data","mediaOpacity":1},{"_key":"05310a36e2b3","_type":"block","children":[{"_key":"7e85232f5673","_type":"span","marks":[],"text":"We tried addressing these issues incrementally, but each fix exposed new edge cases elsewhere in the system, making it clear our problem was structural. We needed an entirely new approach to telemetry that eliminated guesswork, pre-defined record structures, and guaranteed consistency across every Sonos product and platform."}],"markDefs":[],"style":"normal"},{"_key":"0a74bff5e8d8","_type":"block","children":[{"_key":"099392ae3679","_type":"span","marks":["em"],"text":"Rethinking Data as a System"}],"markDefs":[],"style":"h3"},{"_key":"0940a02656d2","_type":"block","children":[{"_key":"088b178676a9","_type":"span","marks":[],"text":"Once we understood why early telemetry systems were failing, the next step was defining what a replacement needed to do."}],"markDefs":[],"style":"normal"},{"_key":"f7fa4c104904","_type":"block","children":[{"_key":"30643f34590a","_type":"span","marks":[],"text":"The first requirement was a single source of truth: one place where every record type is defined "},{"_key":"9dc38fbd09a0","_type":"span","marks":["em"],"text":"once"},{"_key":"3d37afe9e939","_type":"span","marks":[],"text":" with clear field names, data types, constraints, and documentation. This space would also be where data producers, consumers, and experts can review and approve changes to records together. But good definitions would only be a start, as that would still rely on every team implementing them correctly by hand. To ensure true consistency in records produced across iOS, Android, web, and firmware, record definitions would need to translate directly into code and integrate seamlessly. Along with this, we recognized that knowing record expectations in advance made validation feasible for the first time. Our initial instinct was to validate telemetry in the backend to keep validation centralized and operationally simple, but we quickly realized this would still allow malformed data to travel too far before failing, leaving little opportunity to correct it. Instead, we decided that another requirement was to shift reliability ‘left’, validating records on producing devices at the time records were created to prevent incorrect data from ever entering the system. In practice, this would mean issues are caught closer to where they originate, reducing the chance that flawed data leads to flawed decisions that affect customers at scale."}],"markDefs":[],"style":"normal"},{"_key":"d08324d72f98","_type":"block","children":[{"_key":"a5e06def8ec9","_type":"span","marks":[],"text":"Together, these requirements shaped the foundation of a new telemetry architecture that defines records once, ensures consistent code everywhere, and validates data as it’s created. These became the basis for the "},{"_key":"3fb2f154f050","_type":"span","marks":["strong"],"text":"Sonos Telemetry Interface Definition Language"},{"_key":"134e9ef8149d","_type":"span","marks":[],"text":"."}],"markDefs":[],"style":"normal"},{"_key":"e3f1ac525e32","_type":"block","children":[{"_key":"d68090d8342b","_type":"span","marks":["strong"],"text":"One Data Language for All"}],"markDefs":[],"style":"h2"},{"_key":"4caab50b96ab","_type":"block","children":[{"_key":"def16defcf6a","_type":"span","marks":[],"text":"The Sonos Telemetry Interface Definition Language (IDL) is the system we engineered to address these challenges. At a high level, the IDL acts as a shared contract between every Sonos product and platform, defining how data should be produced and enforcing those rules everywhere. Instead of relying on shared conventions and manual alignment, the IDL integrates directly into Sonos software, and is responsible for keeping records and their definitions aligned at scale, removing the ambiguity that previously made data difficult to trust."}],"markDefs":[],"style":"normal"},{"_key":"4b71069c2e4c","_type":"block","children":[{"_key":"be477b43a32c","_type":"span","marks":["em"],"text":"Shared Definitions, Shared Understanding"}],"markDefs":[],"style":"h3"},{"_key":"a84211bbb3d2","_type":"block","children":[{"_key":"30dc6cc69028","_type":"span","marks":[],"text":"A reliable data system starts with clear definitions shared across the company, so our first requirement was creating a single source of truth where every type of record could be defined, discussed, and approved before implementation. To make definitions accessible to both engineers and non-engineers, we needed a format that was both human-readable while machine-enforceable. "},{"_key":"1db6b67da27c","_type":"span","marks":["7de150923919","em"],"text":"JSON Schema"},{"_key":"8b11b555c591","_type":"span","marks":[],"text":" provided that balance, allowing us to describe fields, constraints, and documentation in a structured way. Moreover, it stood out compared to other options with its support for shared schemas, where common fields could be defined once in a base schema and referenced across many record types."}],"markDefs":[{"_key":"7de150923919","_type":"link","href":"https://json-schema.org/learn"}],"style":"normal"},{"_key":"484f445d3cc2","_type":"block","children":[{"_key":"229a6602b8a2","_type":"span","marks":[],"text":"In the IDL, each record type is defined in its own individual "},{"_key":"6f623936f340","_type":"span","marks":["em"],"text":"schema file"},{"_key":"6a328ac38ac1","_type":"span","marks":[],"text":", which describes that record’s structure and meaning so any team can understand its purpose and rely on it having that shape. For example, both technical and non-technical readers can review the following schema and immediately understand what the record represents, contains, and how it’s structured:"}],"markDefs":[],"style":"normal"},{"_key":"8a4f7a5a241b","_type":"sonosImage","asset":{"_id":"image-8b51499790b71b2d3942f0f75d2aa615f7dfc4a4-1758x1158-png","_type":"sanity.imageAsset","_rev":"W43qn6OGoMosWP8ZBbGR39","_createdAt":"2026-04-01T23:33:42Z","_updatedAt":"2026-04-01T23:33:42Z","assetId":"8b51499790b71b2d3942f0f75d2aa615f7dfc4a4","extension":"png","metadata":{"_type":"sanity.imageMetadata","blurHash":"V4PjMs5Zr$^-=}%gIpR.oOsrt1W+WUn-V|?uocj?s:of","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.5181347150259068,"height":1158,"width":1758},"exif":{"ColorSpace":1,"PixelXDimension":1758,"PixelYDimension":1158,"_type":"sanity.imageExifMetadata"},"hasAlpha":true,"isOpaque":true,"lqip":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoElEQVR4nGWT6XKDMAyE8/7P1ibhiG/5kOlzbEcyUJr8EDIz8M2uVr6VyvCJYWLCkhyWZLAmA0MONnv4HEElo7WGxozWpe9nZrBWA3NH7x03KhtWt+FpCh7O4O4nPPyEKawKdhQQcwLVrJUqgbTkvSBLtYzaqsIVOL1+8DV13F8BT7fiGRZMYcEaDTwFBZRWUbiO3qoCKv91Ua0KS+14OQH+4HupWF1UVT4HhBwRS0KuefysVtvZubOWgI66iXfKHbPZ8D13zDbDUUQqSe3FQkh1nIfdfNZhs1+B8qitw/gNj4UxW4JNQYHHzOIFeEDF9lDZPxWWwljthvtV4QEoonIAaX+XIA7bTdMeXUNRhTrHYXkyGTaN2cnP/5V92s6tnL229mfZhg2zYaw+jVXRMOSjPckj1T3ZM21ul6R3hbLc1ncslmFj1mUOqvC6ezK3stvbUxabHzPcgS4M4MtnWAqw5LXkxkg58qr6sC3qj9X5B6yNkTMjEiNQhSdSdarwvBVDoczputjvsH2xGYk6ErFalGsmYQjg2P73erd5Bf4CYCioUk+9bJgAAAAASUVORK5CYII=","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#043494","foreground":"#fff","population":0,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#032d80","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#a5a3d0","foreground":"#000","population":0.12,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#a5a3d0","foreground":"#000","population":0.12,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#9cbcfc","foreground":"#000","population":0,"title":"#fff"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#7ca694","foreground":"#000","population":0.03,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#0757f7","foreground":"#fff","population":0,"title":"#fff"}}},"mimeType":"image/png","originalFilename":"betterdata-03.png","path":"images/znqtjj88/production/8b51499790b71b2d3942f0f75d2aa615f7dfc4a4-1758x1158.png","sha1hash":"8b51499790b71b2d3942f0f75d2aa615f7dfc4a4","size":253484,"uploadId":"0VRoTwW3pm3NqoAeOJpP22PePSphLaFb","url":"https://cdn.sanity.io/images/znqtjj88/production/8b51499790b71b2d3942f0f75d2aa615f7dfc4a4-1758x1158.png","filename":"betterdata-03.png","width":1758,"height":1158,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/8b51499790b71b2d3942f0f75d2aa615f7dfc4a4-1758x1158.png?rect=493,0,772,1158&w=%width%&h=%height%&q=80","id":"image-8b51499790b71b2d3942f0f75d2aa615f7dfc4a4-1758x1158-png","children":[],"parent":null},"mediaOpacity":1},{"_key":"17f49ff84b4d","_type":"block","children":[{"_key":"5ef84acf9ef7","_type":"span","marks":[],"text":"With the format decided, GitHub became the natural home for these schema files. Its pull-request workflow provides a shared place for developers, analysts, and product partners to review and shape data together. This ensures that new records, or changes to existing ones, are always reviewed for alignment between producing and consuming teams before becoming part of the source of truth. Each schema file is versioned and tracked in this repository like any other source code, creating a transparent history of record shapes that all teams can depend on."}],"markDefs":[],"style":"normal"},{"_key":"d6af1fe8704f","_type":"block","children":[{"_key":"de28c8b538d6","_type":"span","marks":["em"],"text":"From Contracts to Code"}],"markDefs":[],"style":"h3"},{"_key":"78aa1835e456","_type":"block","children":[{"_key":"6e3d3589aec6","_type":"span","marks":[],"text":"Once we established a standard location for record definitions, it became clear that they alone still could not guarantee correct usage. Our next challenge was then ensuring these definitions were implemented consistently across each platform."}],"markDefs":[],"style":"normal"},{"_key":"071dd7965d2c","_type":"block","children":[{"_key":"dec5728f3002","_type":"span","marks":[],"text":"When telemetry code was hand-written, even small mistakes such as misspelled fields, missing required values, or subtle structural differences led to downstream issues. To eliminate this entire class of errors, the IDL generates telemetry code that producers can import directly into software to ensure their records are created correctly. While we initially considered generating only record validation code, we realized that approach would still require teams to manually implement record construction logic, which at Sonos’ scale is one of the most time-consuming pain points for developers. Instead, the IDL generates complete, production-ready libraries, known as "},{"_key":"eee3e1050a6b","_type":"span","marks":["em"],"text":"serializers"},{"_key":"4a7197b735b1","_type":"span","marks":[],"text":", that provide everything necessary for our apps, firmware, and services to construct and validate records together. This system, aptly monikered “codegen”, leverages the predictable structure JSON Schema provides to transform record definitions into consistent telemetry code for each platform, whether it’s Swift for iOS, Kotlin for Android, JavaScript for web, or C++ for speakers. By generating all code ahead of time from one source, we remove the possibility for platforms to implement telemetry differently, enforcing correctness automatically at integration while eliminating tedious development work for producers."}],"markDefs":[],"style":"normal"},{"_key":"aea1cfccd89b","_type":"block","children":[{"_key":"5f89c5a65b4d","_type":"span","marks":[],"text":"The IDL’s codegen process functions by parsing each schema file into a normalized, language-aware representation, where a rules engine maps JSON Schema types and attributes into their appropriate counterparts for each language, applying necessary naming conventions and rules along the way. For example, the JSON Schema type "},{"_key":"0bb13b5a09a8","_type":"span","marks":["code"],"text":"number"},{"_key":"93a81c67e81e","_type":"span","marks":[],"text":" becomes "},{"_key":"1f652c5a626e","_type":"span","marks":["code"],"text":"Double"},{"_key":"49fad2ecfbb9","_type":"span","marks":[],"text":" in Swift and Kotlin, "},{"_key":"04a43559df5d","_type":"span","marks":["code"],"text":"string"},{"_key":"05217d16b384","_type":"span","marks":[],"text":" becomes "},{"_key":"ed9d583a70bf","_type":"span","marks":["code"],"text":"std::string"},{"_key":"dbdab552629d","_type":"span","marks":[],"text":" in C++, and "},{"_key":"80275d68c026","_type":"span","marks":["code"],"text":"step_name"},{"_key":"190fee83774d","_type":"span","marks":[],"text":" is renamed "},{"_key":"37340bf6805b","_type":"span","marks":["code"],"text":"stepName"},{"_key":"17e5102bc979","_type":"span","marks":[],"text":" in languages where camelCase is standard. The result is a uniform data structure, known as a "},{"_key":"16e5cd87d470","_type":"span","marks":["em"],"text":"context"},{"_key":"249175135320","_type":"span","marks":[],"text":", that describes a record in terms native to each platform, with a unique context generated for each target language. From there, the IDL contains a set of templates in the form of "},{"_key":"458841c49346","_type":"span","marks":["97df01e602a3","em"],"text":"Mustache"},{"_key":"756b23a744df","_type":"span","marks":[],"text":" files that act as the blueprints for how telemetry code should be generated for each language. These describe how to iterate over a record’s context and output the code necessary to construct, fill, and validate that specific record. By encoding rules in templates, we guarantee the same conventions are applied to every record across all languages."}],"markDefs":[{"_key":"97df01e602a3","_type":"link","href":"https://mustache.github.io/mustache.5.html"}],"style":"normal"},{"_key":"64c4560a5cf3","_type":"block","children":[{"_key":"934a463e08b8","_type":"span","marks":[],"text":"When the IDL renders a context with its corresponding template, the result is complete serializer code that can be imported directly into Sonos software, giving developers everything they need to create the record to the exact spec of its schema. Using the SetupStep schema shown earlier, the codegen process would automatically generate the following Swift code:"}],"markDefs":[],"style":"normal"},{"_key":"15d6ffb9fc5f","_type":"sonosImage","asset":{"_id":"image-bbd116e7311d872f27484ed1f027255b61f57b59-1695x1679-png","_type":"sanity.imageAsset","_rev":"W43qn6OGoMosWP8ZBbGSbW","_createdAt":"2026-04-01T23:33:43Z","_updatedAt":"2026-04-01T23:33:43Z","assetId":"bbd116e7311d872f27484ed1f027255b61f57b59","extension":"png","metadata":{"_type":"sanity.imageMetadata","blurHash":"e4PjJk02e]~q?b-=M}Iobbt7IqNKozofRj-=RlS2kCWVs;s;bFWUWB","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.0095294818344251,"height":1679,"width":1695},"exif":{"ColorSpace":1,"PixelXDimension":1695,"PixelYDimension":1679,"_type":"sanity.imageExifMetadata"},"hasAlpha":true,"isOpaque":true,"lqip":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACQ0lEQVR4nI2UZ67cMBCD9/5Hyxbb6r35IF8ge18K8NbJD2IsAyLIGY5uPg6kaywmsiiJ0BrnIyEWUqmUA4VaK7139n2/xC2mnVUP7iJzXwTP14ZcPEYUvMvEGA/knP+PMJc34Vb4sUju94XlYZFLwpqTbCrsrTHG+DdhqQNhGw+ZeGyS+7LwWjVCR3zM5JJpvdFHf2Mw9s/Et9oGOpw9fEnJKgXSOEyMpFrI7Q/0iUob/SPprfUdnzqb8jxeL17LgtIWP622ebmd6I36/u5XCsfYmba1cTyfzwNCzkkHSq2HklPNWa/s7pNw9qTUhgsBqSRSKbTz+JjI9bR3qux/Yd77YHngUkPYwKYVm5Ioa3EhEctX387elV6POlH791O/9bETckeayCoE67YilcY6T8r5uHgq+o1Lhf3oYTu2Q2qFkAqlNcZaQgzUWv4i/Pq+mHLHp4ry4bBqbMC6iIuBWBK55V+WT5TD+km6f46N0AEhDcZ4gp+BLtQZm7fl3zjPHxWOsVPrwFjPtonDsrWelNJhd+7vn0q+U7V/io0yGmUM1gdCiqSSj3DPwZzDOVfwkrC2GZuKdInNaFYtkcagncMEh0sel/1RQ0lH/64eidskNO9dfkrJXbx4SsGi1EEunEJ5g/YGmxyx5X8Euw1s7AfhQwoeYuWpNC9tWLRkNQLp36TR4nIgtXIR7D6IZaBdQWiL1BppPcZHbAjY4A646PEpnH19T/67Sd9amy/JHMz49dzPOv+PPs5A9xPzPFVdvYc/AaFenVAk+xLFAAAAAElFTkSuQmCC","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#656463","foreground":"#fff","population":0.03,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#262b5d","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#adcebb","foreground":"#000","population":0.59,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#adcebb","foreground":"#000","population":0.59,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#acb1e6","foreground":"#000","population":0.36,"title":"#fff"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#a891c2","foreground":"#000","population":0.13,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#8e94d0","foreground":"#000","population":0.06,"title":"#fff"}}},"mimeType":"image/png","originalFilename":"betterdata-04.png","path":"images/znqtjj88/production/bbd116e7311d872f27484ed1f027255b61f57b59-1695x1679.png","sha1hash":"bbd116e7311d872f27484ed1f027255b61f57b59","size":381730,"uploadId":"3VfXR584TgcxZfuzEMI42jMZNaOz1EjN","url":"https://cdn.sanity.io/images/znqtjj88/production/bbd116e7311d872f27484ed1f027255b61f57b59-1695x1679.png","filename":"betterdata-04.png","width":1695,"height":1679,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/bbd116e7311d872f27484ed1f027255b61f57b59-1695x1679.png?rect=288,0,1119,1679&w=%width%&h=%height%&q=80","id":"image-bbd116e7311d872f27484ed1f027255b61f57b59-1695x1679-png","children":[],"parent":null},"mediaOpacity":1},{"_key":"ede2185bef79","_type":"block","children":[{"_key":"32cd83cbc39f","_type":"span","marks":["em"],"text":"Products That Evolve Together"}],"markDefs":[],"style":"h3"},{"_key":"e8a767067831","_type":"block","children":[{"_key":"70e455545599","_type":"span","marks":[],"text":"Once the telemetry code files are generated, the final step is ensuring every Sonos product receives them, and any future updates to them, at the same time. To keep every device leveraging these files aligned, the IDL includes an automated distribution system that synchronizes schemas and serializers across our ecosystem."}],"markDefs":[],"style":"normal"},{"_key":"9dd7e54d1d1e","_type":"block","children":[{"_key":"684502f260d2","_type":"span","marks":[],"text":"When a schema file is added or changed, an automated workflow runs the codegen process, publishes the resulting serializers to a cloud registry, and sends a notification to a shared endpoint that every dependent software team listens to. Upon receiving the notification, each team pulls the latest telemetry code from the registry into their software builds, and because all teams are notified simultaneously, updates propagate uniformly across every platform. This ensures record definitions apply and update systematically, without teams needing to coordinate releases, track versions by hand, or worry about drifting out of sync. By coupling codegen with deployment automation, the IDL keeps telemetry continuously aligned across the millions of devices running Sonos without any manual coordination."}],"markDefs":[],"style":"normal"},{"_key":"cf6a8a61f55b","_type":"block","children":[{"_key":"2ad74795f703","_type":"span","marks":["em"],"text":"Record Lifecycle: Definition to Creation"}],"markDefs":[],"style":"h3"},{"_key":"fb958d849ef3","_type":"block","children":[{"_key":"b418c7a06aef","_type":"span","marks":[],"text":"With definitions centralized, code generated automatically, and updates distributed uniformly, the final step is seeing how everything works together end to end:"}],"markDefs":[],"style":"normal"},{"_key":"dd6b07315a73","_type":"sonosImage","asset":{"_id":"image-dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82-2880x2580-jpg","_type":"sanity.imageAsset","_rev":"W43qn6OGoMosWP8ZBbGSn5","_createdAt":"2026-04-01T23:33:43Z","_updatedAt":"2026-04-01T23:33:43Z","assetId":"dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82","extension":"jpg","metadata":{"_type":"sanity.imageMetadata","blurHash":"e4PQ88?H?H?b.7ROIVIUofx]?aafRjIUIo?cxuoeRjRj~pRjM{ayRj","dimensions":{"_type":"sanity.imageDimensions","aspectRatio":1.1162790697674418,"height":2580,"width":2880},"hasAlpha":false,"isOpaque":true,"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAASABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMCAQf/xAAfEAACAwACAgMAAAAAAAAAAAABAgADERIhBFEiMUH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A9zsstqc4yjmf3uUsa8n42KolfIr7DKoLe8kuTGwpusBuQLUmxk1mBO51E7UHCd/cQLTIA5bg33EQNREQP//Z","palette":{"_type":"sanity.imagePalette","darkMuted":{"_type":"sanity.imagePaletteSwatch","background":"#3c3c3c","foreground":"#fff","population":0.06,"title":"#fff"},"darkVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#182b6b","foreground":"#fff","population":0,"title":"#fff"},"dominant":{"_type":"sanity.imagePaletteSwatch","background":"#98a1d8","foreground":"#000","population":0.08,"title":"#fff"},"lightMuted":{"_type":"sanity.imagePaletteSwatch","background":"#a4c4ac","foreground":"#000","population":0,"title":"#fff"},"lightVibrant":{"_type":"sanity.imagePaletteSwatch","background":"#98a1d8","foreground":"#000","population":0.08,"title":"#fff"},"muted":{"_type":"sanity.imagePaletteSwatch","background":"#60669a","foreground":"#fff","population":0.01,"title":"#fff"},"vibrant":{"_type":"sanity.imagePaletteSwatch","background":"#5f7ada","foreground":"#fff","population":0.01,"title":"#fff"}}},"mimeType":"image/jpeg","originalFilename":"betterdata-02.jpg","path":"images/znqtjj88/production/dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82-2880x2580.jpg","sha1hash":"dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82","size":963228,"uploadId":"bk6voQVu1KGXBA1sQim9KcYhu4Zg53n8","url":"https://cdn.sanity.io/images/znqtjj88/production/dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82-2880x2580.jpg","filename":"betterdata-02.jpg","width":2880,"height":2580,"placeholderUrl":"https://cdn.sanity.io/images/znqtjj88/production/dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82-2880x2580.jpg?rect=580,0,1720,2580&w=%width%&h=%height%&q=80","id":"image-dfcb1a647f29ea2f02984dc5aea1cc27c24d4a82-2880x2580-jpg","children":[],"parent":null},"caption":"The IDL takes approved schemas and automatically produces and distributes serializers to ensure the records are created consistently across iOS, Android, and web","mediaOpacity":1},{"_key":"bcff2673b566","_type":"block","children":[{"_key":"989a8a5dfca9","_type":"span","marks":["strong"],"text":"Data That Just Works"}],"markDefs":[],"style":"h2"},{"_key":"2510f7b507da","_type":"block","children":[{"_key":"7a4221530831","_type":"span","marks":[],"text":"The introduction of the Telemetry IDL has fundamentally changed how teams across Sonos produce and use product data."}],"markDefs":[],"style":"normal"},{"_key":"0463663ebb64","_type":"block","children":[{"_key":"299082c2305d","_type":"span","marks":[],"text":"From a data engineering perspective, strongly-defined definitions have largely eliminated processing and schema mismatch errors, and our IDL-backed pipelines now process billions of records with nearly nine nines (99.9999997%) of reliability. This has significantly reduced the operational cost of consolidating and recovering data, and data engineers now spend far less time fixing telemetry-related issues or compensating for malformed records. This allows them to focus on building and improving core data systems that drive new impact instead."}],"markDefs":[],"style":"normal"},{"_key":"183c8abe5f55","_type":"block","children":[{"_key":"39f69bb6dddc","_type":"span","marks":[],"text":"Product development teams saw a similar shift. With developers able to rely on the automatically generated code from the IDL and trust that it evolves autonomously alongside product code, the effort required to create new telemetry has been greatly reduced. This allows product engineers to focus on building new products and features our data can support rather than debugging subtle data discrepancies. With entire classes of cross-platform dependencies and misalignments handled, software releases are more predictable and provide teams clearer visibility into the direct impact of their changes and updates."}],"markDefs":[],"style":"normal"},{"_key":"193633e2de2c","_type":"block","children":[{"_key":"97477f5eba99","_type":"span","marks":[],"text":"Analytics teams benefited most from the IDL’s emphasis on shared definitions and built-in documentation. With analysts able to participate in the shaping of records, data now captures the information needed to actually answer the questions it was created for. With well-written schemas describing an event’s purpose and intended use by design, data users no longer need to interpret meaning after the fact, allowing analyses to move faster and provide previously unattainable insights with more certainty. Questions shifted from “can we trust this data?” to “what does this data tell us?”"}],"markDefs":[],"style":"normal"},{"_key":"7a12efb5275c","_type":"block","children":[{"_key":"db7eba83a814","_type":"span","marks":[],"text":"Together, the Sonos Telemetry IDL has made product data dependable across the ecosystem, giving teams a clear and unified view of how products and experiences perform at scale. With reliability built into our data by design, every product now evolves from the same shared foundation. That consistency allows teams to confidently improve the Sonos experience across devices and updates in a way that’s cohesive and seamless, resulting in elevated experiences that our listeners feel, hear, and enjoy in their homes around the world."}],"markDefs":[],"style":"normal"}]},"allCategoryMatchedPost":{"nodes":[{"id":"-eeea6166-14a4-53cb-9403-2a9176d634ea","slug":{"current":"reproducing-on-device-data-accurately-for-private-by-design-voice-control"},"title":"Reproducing On-Device Data Accurately for Private-by-Design Voice Control","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/87105e334cbb0c83b019c207e1c4d5481f6c8a40-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwf/xAAfEAADAQACAQUAAAAAAAAAAAABAgMAETEFBBNBUWH/xAAVAQEBAAAAAAAAAAAAAAAAAAABBf/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMhfx9lgtQA6t8L3l6RpMA0RlB+xnU8l6hI+2pULxx1k6WpQAUdmH6dcSleNNgOesZD/2Q==","palette":{"dominant":{"background":"#14345c"}}}}},"categories":[{"_id":"2a760cee-ab0b-432c-866e-eae71039e09d","title":"Machine Learning"},{"_id":"baa46497-c2bf-4eeb-bf51-bd08238af629","title":"Data Engineering"}],"publishedAt":"2023-04-26T13:40:20.236Z"},{"id":"-c884edc1-7150-5759-b861-66f02c77f631","slug":{"current":"feature-generating-framework"},"title":"Feature Generating Framework","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/e73a4aebf336efa83f9c8b09a17ffae5a1583e7b-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAUEBgf/xAAeEAACAgIDAQEAAAAAAAAAAAABAgARAwQFEiExYf/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwX/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAMAwEAAhEDEQA/ANbAtbBFGLeT5NNNetHuflyIm9mCAWPPyLeRytsZgctGZsxBYOO2GbUxtme3b2ETjKyqAPBUIsB//9k=","palette":{"dominant":{"background":"#bccca4"}}}}},"categories":[{"_id":"20b9cbd8-4962-471c-8b5f-6b396cf95c26","title":"Analytics"},{"_id":"baa46497-c2bf-4eeb-bf51-bd08238af629","title":"Data Engineering"}],"publishedAt":"2022-06-02T17:28:00.000Z"},{"id":"-2d5a4a71-3f16-5bfa-82ba-f920a95180be","slug":{"current":"automating-data-engineering-and-data-discovery"},"title":"Automating Data Engineering and Data Discovery at Sonos","mainImage":{"altText":null,"asset":{"path":"images/znqtjj88/production/532a11b7c8d43f9da74045a11e738af2d7f15860-3622x2212.jpg","metadata":{"dimensions":{"width":3622,"height":2212,"aspectRatio":1.6374321880650995},"lqip":"data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFBAb/xAAjEAABBAIBAwUAAAAAAAAAAAABAgMEEQASBQYTISIxMkFR/8QAFwEAAwEAAAAAAAAAAAAAAAAAAQMEBv/EABkRAAMBAQEAAAAAAAAAAAAAAAECEQADof/aAAwDAQACEQMRAD8A6OIhUnWK01s6tQpQ9xlbqHhUcLGZGwdddHqN/A/lZIgTX4DxdjK1XVXWLcfdff7jy1LUVWSTebZk6HoIYo91MNyz4+jhmzkXC7I2KUg6geBWGOVqAcRv/9k=","palette":{"dominant":{"background":"#9c7cf4"}}}}},"categories":[{"_id":"baa46497-c2bf-4eeb-bf51-bd08238af629","title":"Data Engineering"}],"publishedAt":"2021-06-29T15:36:00.000Z"}]}},"pageContext":{"id":"-b563eca1-33f5-5613-ab9b-edcb04190456","categories":["Data Engineering"]}},
    "staticQueryHashes": ["4145174575"],
    "manifestId": "e580476f-f89d-43c6-9037-36c79dab131d-2026-04-03T15:30:24.000Z"}