October 4, 2021 | 03 min read
Share:
Appreciating problems.
One of the true qualities of a Product Manager is appreciating the beauty and challenge of a problem. Now and then, a product manager comes across a unique problem that invokes admiration, I dare say.
Smart basket happens to be one of these for our company Bizom. Let me first quickly introduce the Bizom Smart Basket to you. It is a self-learning algorithm that, at the backend, predicts what the retailer is going to order next, and then already adds it to his cart to shorten the cycle of conversion. For every visit your salesman makes to a retailer, the most likely-to-sell SKUs are already added to the cart in the right quantity.
Now, this truly is an appreciable problem. And at the surface, it seemed simple. How do we predict what a retailer is going to order next? Just look at what he ordered last and you know what the demand is.
In theory, this sounds lovely but then the conclusion follows: does this mean that the retailer will keep ordering the same stuff till perpetuity? Will the value of his order ever increase? How will new products and SKUs ever win over comfortable shelf space in the outlet and how will consumers discover new products?
Does this also guarantee that orders will never decrease or stop? Because without growth there’s no point. In real life, the salesman does the humongous task of growing a business in an outlet; they introduce new SKU lines, create awareness about new schemes and discounts and, through the art of sales nurture every business. That means our machines and algorithms need to replicate all of this. Randomly prediction should throw up new SKUs for testing, old SKUs that were once ordered, and SKUs that due to heavy discounts would have a high chance of being bought.
Imagine getting an algorithm to predict ALL of this at the right time for every outlet in the right quantity. And this is just the surface of the problem.
Eventually, brands would want to grow business from each store, so just like salesmen push themselves and stores to order more, the algorithm should always try to push just a little more and increase the average order value. But how much of a push is okay? There is a thin line between stocked well and overstocked. Overstocking results in a false impression of the business, expired products, sales returns and most importantly, corrodes your brand’s importance at the outlet.
Halfway through our journey with Smart Basket, we came across a different problem. Not all brands are focused on growing sales at an outlet. Wait what?! That’s not universally true business sense? And then our customers humbled us with a different nuance of business. “We don’t want to keep pushing stores to buy more unless there is a true demand. Otherwise, eventually, it hurts our business in the long run. Our game is all about the product shelf life, and identifying the right quantity for an outlet instead of what more can be pushed.”, enters the perishable category in the game. This got us thinking of the problem again. That means industries and categories will have different priorities in order to really have visibility of the business on the ground and predict.
With this knowledge, we were starting to take one step forward when the looming question had to be addressed. If the underlying principle is growing business and a clear way to do it is to experiment with new SKUs, gently push for more and keep experimenting at every outlet till you see clearly what’s worked. How do we measure if our product is successful? There will always be variance. At first, all the brands including us seemed to think variance in order is the only way to estimate if Smart Basket is working. Recommended vs Actuals. But soon, we started seeing gaping holes in this rose-tinted logic.
The algorithm is literally designed to increase the ordering capacity of an outlet. It is going to step on toes, push more and then self-learn its boundaries. Of course, there will be variance. Time matters here. We’re looking at sustainably changing ordering patterns and human behaviour, not short-term gains after all. Hence variance didn’t seem to be a good metric on its own. The trend in variance can definitely help us evaluate the algorithms internally, but it still doesn’t work for understanding their value for a customer. Having only 30% variance or 80% variance doesn’t mean anything to a brand. Oh, You have a 10% variance? Great. But so what? How does that help me? This metric just becomes a number or statistic unless it is in service of something.
And that’s when it hit us. Accuracy and variance are internal symptoms but we need to track if we’re curing a business problem. Eventually, over the period of time, some shift should happen that’s desired by the brand. We roughly recognised these in three main buckets:
When these real metrics move a business outcome, that’s a pretty good way to measure, right?
But a core algorithm cannot impact all three outcomes. They need to work differently. So once again, we go back to the drawing board.
Overtime questions such as seasonality effects, current stock at outlets, the area demand and even the mere question of if we should give brands a say on what products they want to “push” or let the system decide it based on data. One thing was clear if we were relying solely on data, YoY patterns needed to be analysed to truly understand an outlet’s consumption behaviour at any given point in time.
Building a product is an iterative process. The problem statement is huge and exciting, but while we can think at scale, one always builds one step at a time. We need to establish proof of concept and always reassess if we’re building in the right direction, and how much time and effort do we want to invest.
And with this, Smart Basket has evolved. I’m not delving into solutions or doing a sales pitch here. Today is just about admiring and appreciating the problem space of Smart Basket. It has all my appreciation.
Cookie | Duration | Description |
---|---|---|
cookielawinfo-checkbox-advertisement | 1 year | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Advertisement". |
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
cookielawinfo-checkbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
elementor | never | This cookie is used by the website's WordPress theme. It allows the website owner to implement or change the website's content in real-time. |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |
Cookie | Duration | Description |
---|---|---|
collect_chat_launcher_load | 1 month | This cookie is set by the provider Collect.chat. This cookie is used for enabling the chat function on the website. |
collect_chat_page_load | 1 month | This cookie is set by the provider Collect.chat. This cookie is used for optimizing the chat-box functionality by recognising the user. |
Cookie | Duration | Description |
---|---|---|
_gat | 1 minute | This cookies is installed by Google Universal Analytics to throttle the request rate to limit the colllection of data on high traffic sites. |
Cookie | Duration | Description |
---|---|---|
CONSENT | 16 years 4 months 14 hours 16 minutes | These cookies are set via embedded youtube-videos. They register anonymous statistical data on for example how many times the video is displayed and what settings are used for playback.No sensitive data is collected unless you log in to your google account, in that case your choices are linked with your account, for example if you click “like” on a video. |
_ga | 2 years | This cookie is installed by Google Analytics. The cookie is used to calculate visitor, session, campaign data and keep track of site usage for the site's analytics report. The cookies store information anonymously and assign a randomly generated number to identify unique visitors. |
_gat_gtag_UA_34263932_3 | 1 minute | This cookie is set by Google and is used to distinguish users. |
_gid | 1 day | This cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the website is doing. The data collected including the number visitors, the source where they have come from, and the pages visted in an anonymous form. |
Cookie | Duration | Description |
---|---|---|
fr | 3 months | The cookie is set by Facebook to show relevant advertisments to the users and measure and improve the advertisements. The cookie also tracks the behavior of the user across the web on sites that have Facebook pixel or Facebook social plugin. |
IDE | 1 year 24 days | Used by Google DoubleClick and stores information about how the user uses the website and any other advertisement before visiting the website. This is used to present users with ads that are relevant to them according to the user profile. |
test_cookie | 15 minutes | This cookie is set by doubleclick.net. The purpose of the cookie is to determine if the user's browser supports cookies. |
VISITOR_INFO1_LIVE | 5 months 27 days | This cookie is set by Youtube. Used to track the information of the embedded YouTube videos on a website. |
YSC | session | This cookies is set by Youtube and is used to track the views of embedded videos. |
yt-remote-connected-devices | never | These cookies are set via embedded youtube-videos. |
yt-remote-device-id | never | These cookies are set via embedded youtube-videos. |
yt.innertube::nextId | never | These cookies are set via embedded youtube-videos. |
yt.innertube::requests | never | These cookies are set via embedded youtube-videos. |
_fbp | 3 months | This cookie is set by Facebook to deliver advertisement when they are on Facebook or a digital platform powered by Facebook advertising after visiting this website. |