6 back-end techniques that support rapid innovation

6 back-end techniques that support rapid innovation

At Poshmark, we have built a massive end-to-end mobile commerce platform powered by social engagement where our average user is spending 25 minutes in the app daily, opening it seven to eight times.

Our engineering and product teams are constantly pushing the envelope as to what is possible to ensure a captivating and addictive shopping experience that delights our millions of users every time they open the app. To ensure that we are in a constant state of innovation and product development, this means introducing a slew of new features across multiple platforms (iOs, Android, web), sometimes as many as five to 10 in a week.

While most people understand the role of A/B testing in front-end development, many people, especially those without a technical background, fail to understand the role of the back-end infrastructure in supporting these efforts. For example, to improve buyer conversion we constantly run experiments with payment methods and checkout flows. These are often based on characteristics of the user that we can infer because we invested in the end-to-end infrastructure.

Without a carefully-considered approach to building the back-end systems and processes, rapid feature development results in out-of-control technical debt, a confusing user experience, and major problems down the road. To keep a steady stream of features buzzing along at Poshmark, we prioritize key back-end techniques – our approach to data and managing to keep our infrastructure flexible.

Data first, always

  • Leverage both implicit and explicit signals

If you want to get the most out of your data, you need to take into account both implicit and explicit signals. Explicit signals are requested from and provided by the user, while implicit signals emerge from the user’s behavior patterns.

Analyzing both types of signals is a key part of how we are able to create multiple types of relationships, such as linking people to people as well as people to brands and products. For example, our users give us explicit signals by doing things like specifying their dress size or following specific brands or users.  While these signals allow us to draw certain connections, we also interpret implicit signals like user engagement with certain categories and brands to define an even greater number of relationships.

  • Focus on role-based, rather than user-based data

One of the important characteristics of a marketplace is that the same user can be both a buyer and seller. In fact, this is one of the key factors that helps marketplaces demonstrate such strong network effects, since such dual-role users contribute far more to the liquidity of the marketplace. However, if you were to slice your data by user, rather than including the additional granularity of the role the user was playing when the data was recorded, you would draw the wrong conclusions.

For example, at Poshmark, we treat the seller and buyer data separately when we conduct our network analysis, even if the seller and buyer are the same person. Just because Jane focuses on selling Marc Jacobs products in her shop doesn’t mean that she’s going to be loyal to Marc Jacobs as a buyer. Rather, her buyer data reveals that she’s actually prefers shopping Free People. Without this granularity, we wouldn’t be able to optimize her experience as a buyer or a seller.

  • Use real-time data to stay up to date

You can’t treat user preference profiles as static, especially in a fashion-driven business. We know that our users’ preferences (as both buyers and sellers) are constantly evolving. We’ve invested effort and resources into being able to collect and interpret massive amounts of data in real-time so that the user experience reflects their changing desires.

To support these techniques, we’ve implemented a full suite of technologies including big data to manage the vast volume of over 100 million user signals daily, as well as performance techniques such as caching, NoSQL databases, and search indexing to keep up with real-time data. There is no one technology that can manage to serve all the necessary connections. The goal is to balance the need for sophisticated analysis with staying performant. Each use case may require a different mix of technologies to achieve optimal performance.

Create a flexible infrastructure

  • Extend A/B testing to native apps and back-end services

At Poshmark, we obsess over keeping the app experience seamless for the user. When we roll out an update or change, we try and preserve the core user experience and interactions. This is an ongoing challenge as we rollout major updates like supporting our shift into retail, or create a new way for our users to discover and follow other people. Naturally, we A/B test all these new user interactions before rolling them out more broadly. However, you have to extend A/B testing beyond the web application; if you don’t A/B test your native apps, you won’t be able to deliver a seamless user experience. Furthermore, you might need to drive the back-end services in sync with the A/B test to deliver consistent experiences across test segments.

We developed and operate our own custom A/B testing framework for our native apps and back-end services. This requires an investment of resources, but it delivers a great ROI by allowing our product managers to experiment with new ideas and use real world data to make decisions on new features.

  • Try to keep your APIs general purpose

At this point, any company that wants to serve a mass audience has to develop for a multi-platform world.  At the very least, you need a web application, iPhone app, iPad app, and Android phone app. Yet few companies have the resources to develop all of these apps simultaneously which means that you have to start with one platform, and expand from there. Given the amount of work involved, it’s critical that you keep your APIs general purpose so that you can launch additional front-end platforms without major changes to the back-end.

When we developed our first platform (iOS), we designed the APIs to be general purpose so that we can add other platforms and expose them to developers in the future. This allowed us to launch our Android app without any major change to the back-end services.

  • Combine native and web for performance and iteration

One mistake some companies make is to focus too much on creating a “pure” native app.  We find that it’s far more effective to build our apps using a hybrid approach that combines native and web functionality in a single interface.

We use the native platform for core interactions. Taking advantage of native code allows our UI to be more responsive and performant. For example, we try to take full advantage of the processing speeds, storage capacity, and capabilities of the camera to deliver a smooth and rich experience. The native OS capabilities also allow us to gracefully degrade the user experience when the mobile connectivity is choppy, rather than throwing up broken screens and errors.

On the other hand, we’ve also embedded web views in our native apps. These web views allow us to quickly iterate on features that are changing rapidly, without the overhead of testing and releasing new versions of the native code. To make this work, we have built a rich set of features to bridge our web and native components so that the user experience remains seamless.

Combining all six of these techniques has allowed us to dramatically expand Poshmark into new platforms and areas of functionality (e.g. supporting brands and retailers as well as resellers in the marketplace). Of course, none of this works without the people – design, product, and engineering have to work together, using the flexible infrastructure to experiment with new ideas and use real-world data to make decisions on features.

When all of these components work together in concert, the result is the rapid feature development your company needs to innovate and succeed in a rapidly-changing mobile world.

Read next: Why you need to integrate social media into your business