TL;DR: Coinbase has developed a new architectural platform for developing products called Dynamic Presentation. This platform enables us to ingest, modify, publish, position, and control components presented to our users in real time without any engineering effort or app release, enhancing accuracy of appropriate content, improving speed of development, and accelerating responsiveness to market conditions.
If crypto has taught us one thing, it’s that change is inevitable — and Coinbase has lived through many cycles throughout crypto’s evolution. Our goal is to help users navigate these changes by creating tools that are adaptable, relevant, and easy to use.
Coinbase introduced Dynamic Presentation, a new development platform, in May of 2023 to meet these goals.
By early 2022, Coinbase had replaced the previous “Home” experience for our users across web and mobile with a new design. This new “Home” tab was initially intended to be a quick look at the most relevant actions for our customers — including their balance, relevant announcements, and a news feed of educational topics they could scroll through to learn about the latest in crypto.
We quickly learned that, since crypto moves fast, we needed a technical solution that can move equally as fast in order to preserve a superior user experience. Product releases take some time (approximately a week and a half) from code freeze to full launch in the App Store for regression testing and incremental launch. This makes planning development work such as launching new features, expanding to new countries, and maintaining a high quality bar challenging. We created Dynamic Presentation as a result of the increased need for frequent adaptations, international expansion, and changes to the application.
Our goal within the Coinbase app is primarily to promote financial literacy and awareness and to provide users with the guidance and information they need to make better informed decisions about their crypto activity. In order to achieve that goal, we needed to architect a solution that enabled any Coinbase product to provide users with the right experience at the right time in their user journey. This solution, named Dynamic Presentation, allowed Coinbase teams to rapidly experiment while quickly adapting to the present state of the market with minimal engineering involvement and no client changes required.
Additionally, we also saw this as an opportunity to make the experience more uniform across all products for consistency and clarity to our users. By unifying a presentation configuration layer in the backend, we standardized common front end components on the app so they are consistently invoked at any time.
The solution involved repurposing our original solution, Feed Service, to become a more generic and content agnostic tool. This would be started by two core services and done in three main parts.
First, we organized a Content Service ingestion layer. This was designed to be our one-stop-shop for any type of content that can be pushed or pulled from internal and external sources. In the current state, ingesting new sources required a code change every time, and without a centralized content pool, it made it difficult to surface content to multiple different features. By building this with generic types in mind, it allowed for simple expansion to additional content types as we onboarded various products. Content Service provides the ability to ingest, process, and transmit content to other Coinbase services and can be used for dynamically or statically defined content.
As content is ingested, we provide permission sets for any product owner to publish, manage, and modify content in real time — allowing app changes to happen in minutes, rather than weeks, all without the need for engineering support. This can all be viewed and managed through a centralized web UI.
Next, we built Presentation Service, our curation, targeting, and translation layer. This service is at the heart of our platform and understands how to take any variety of content inputs and translate it into contractual JSON which the Coinbase app knows how to interpret. The app then can receive, parse, and find the right UI element. The client is given everything it needs to understand exactly where to place and how to render components. Since this service is directly called by the client and is the orchestrator of content presentation, it has the responsibility of being highly scalable, performant, and reliable. It utilizes an array of caching and storage strategies to mitigate unnecessary round-trip server traffic and keep data fresh within the service for the client.
When examining options for this service, we considered possible solutions such as runtime type safety, server-side rendering, and existing backend-driven libraries. However, none of these solutions met our user and developer needs. We required the combination of flexibility so we can adapt the product platform to other features, performance when rendering dynamically changing data in mixed networks scenarios, and type-safety to ensure our system remains highly reliable when hosting content that can be modified by a variety of tech and non-tech roles.
The Coinbase app organizes content within 3 major structures: Surfaces, Components, and Elements. A Surface has one or more Component Containers within it. Each Component Container can hold one or more Elements. Elements are defined by types such that the app knows what frontend component and contract to reference, and each Element within a single Container can be ordered in any way necessary. Similarly, each Container can be positioned anywhere within a Surface.
This is the basic starting structure for how Dynamic Presentation processes, transforms, and parses information in a consistent and scalable manner. At this stage, any feature or team can adapt one or more of their own Surfaces, define their content, and lay out information and interaction layers in an easily modifiable way.
With changes flying in from anywhere at any time and sometimes with competing product incentives, we needed a way to ensure the end user sees only what they should based upon consumer eligibility, country regulations, experiment rollout status, etc. This brings us to our third major part of Dynamic Presentation, Product Eligibility Service.
The current state of the client was still making multiple parallel calls to the backend to check for user eligibility for one or more products. Distributing calls across numerous backend services occasionally resulted in poor latency performance. Additionally, determining eligibility using the current pattern required all of the check logic to be hardcoded into the client. Depending on the complexity of the product, sometimes it required 10+ unique network calls to different services, increasing compute load and business logic on the client.
In order to create a centralized source of truth, we created a Product Eligibility Service which takes inputs from many different backend data sources, consolidates it, and provides an interface to call it from the backend or client. As requirements change, product owners can modify the eligibility criteria through a centralized web UI, updating the display of particular products in minutes on the application. This final, but major step in Dynamic Presentation ensures we can respond quickly to changing requirements and expand rapidly into new countries and markets with unique requirements for our users with minimal engineering effort.
The right content, at the right place, at the right time.
With Content Service, Presentation Service, and Product Eligibility Service combined with their surrounding integrations, Coinbase developers have the ability to consolidate all necessary logic and processing in the backend before determining what content to display to the user. The app now has a simplified responsibility to care only about receiving and displaying Surface definitions, reducing data utilization, CPU, and latency for our users.
To date, Dynamic Presentation has been adopted in some capacity into many Coinbase products and core pillars. During this expansion, we have been able to create a standardized set of Components via a Coinbase client library. This enables new or existing products to change their interface immediately by reusing anything that’s already been built on this architecture, without requiring unique frontend development. We’ll continue to expand this platform and partnership and will provide more updates along the way.
If you’re a backend or frontend developer and are excited by the prospect of working across highly scalable technologies with the reliability of the most trusted company in crypto, consider applying to one of our open roles.
About Cole Edwards
Engineering Manager
Product,
Dec 4, 2024