Tech IndustryNov 24, 2023
SubmittablepJLw71

Clipboard Health Product Case Study Rejection

Below is the answer I submitted and was rejected for. I thought I would set a stake in the ground for future applicants to pivot around. Here is a Link to their case study: https://creatingvalue.substack.com/p/real-problems-we-tackle-pricing-level. If you don't want to click on the link the task is to pretend, you're a ride share company... The core question is: how much more or less do you pay drivers per trip (by changing Lyft’s take)? Your goal is to maximize net revenue for the next 12 months on this route. Summary The detailed analysis of my model for Lyft's operation in Toledo, Ohio, revealed that an optimal take rate of approximately $11 per ride maximizes Lyft's net income under the specified constraints. At $11 net income is $10,593.47. Key metrics underpinning this outcome include driver earnings set at $14 per ride and a match rate of 44.21%, translating to 473.7 rides per month and 5,684.4 rides annually. However, this take rate also correlates with a driver churn rate of 10%, which is relatively high and could indicate potential challenges in maintaining a stable driver workforce. This churn rate leads to monthly and annual driver churns of 10,000 and 120,000, respectively. These figures are critical considerations for the business as they directly impact on the cost of driver recruitment and retention. On the rider side, the model projects a monthly rider churn of 44.21 and an annual rider churn of 530.52, reflecting the percentage of riders not successfully matched. Model Assumptions & Limitations: In analyzing Lyft's ride-sharing scenario in Toledo, Ohio, the model employed several simplifications to manage the complexities of this business. Firstly, the rider price was set at a fixed rate of $25, which, while simplifying revenue calculations, does not consider the potential for dynamic pricing in response to factors like demand fluctuations and competitive dynamics. This constant rider price omits the possibility of implementing flexible pricing strategies to optimize revenue under different conditions. The model also assumes a consistent flow of 1,000 ride requests per month. This simplification does not account for possible variations in demand due to seasonal changes, marketing efforts, or shifts in consumer behavior. This assumption of constant demand helps isolate the effects of variables like Lyft's take and churn rates. Still, it may need to accurately reflect the actual market scenario, where demand is often fluid and influenced by various external factors. The model averages driver (1000/2) and customer (30/2) acquisition costs to streamline calculations. However, this approach doesn’t capture the actual variability in these costs, which marketing efficiencies, changes in market conditions, or competitive pressures can influence. The baseline driver churn rate is set at 5%, with Lyft's take at $6, alongside a churn rate sensitivity factor of .01 (1% increase in churn for every $1 increase in Lyft's take over the baseline), to gauge the impact of Lyft's take on driver retention. This linear approach to churn rate sensitivity may only partially encompass the multifaceted reasons behind driver and rider churn, including factors like service quality, driver satisfaction, and the availability of competitive alternatives. Rider churn rates in the model are differentiated based on whether riders successfully find a driver or experience a failed match, aiming to capture the impact of service quality on retention. While this adds depth to the analysis, it might need to be more balanced with the range of factors influencing rider retention. I used linear interpolation to estimate match rates between known data points, offering a basic understanding of trends. However, this method presumes a linear relationship between Lyft's take and match rates, potentially overlooking more complex, real-world interactions. The model's focus on revenue and net income calculations is central to evaluating the financial health of different scenarios. However, these calculations might only partially encompass all the factors influencing Lyft's financial performance, such as operational efficiencies, unexpected costs, regulatory changes, and shifts in market demand. A nuanced approach that blends both first-party and third-party data is vital to making more intelligent assumptions in such a scenario. This includes delving into Lyft's historical data for insights into rider and driver behavior, operational metrics, and churn patterns. Analyzing trends in ride requests, pricing, match rates, and user satisfaction can reveal underlying patterns and preferences. Operational data, such as ride completion rates, peak demand periods, and service areas, sheds light on the operation's costs and the factors influencing demand and supply dynamics. Simultaneously, leveraging third-party data, such as market research and competitive analysis from sources like Nielsen or IBISWorld, provides a broader market perspective, informing about competitor strategies and market share. Economic and regulatory data from governmental sources or databases offer insights into general economic trends, consumer spending habits, and regulatory changes. Demographic and geographic insights can be obtained from the U.S. Census Bureau or GIS platforms. These insights can help us understand potential drivers' and riders' distribution and preferences, which can help us tailor strategies to specific markets. Integrating these data sets enables the development of data-driven pricing models, refined churn predictions, and accurate demand forecasting. Continuous monitoring and updating of this data are critical, with systems for real-time data analysis and feedback mechanisms from drivers and riders further refining assumptions and service quality. Combining Lyft's operational data with market research and external factors, this data-driven approach facilitates a responsive and adaptable business strategy crucial in the dynamic ride-sharing industry. Recommendations: Lyft could enhance driver revenue by implementing strategies other than adjusting take rate. Enhancing driver incentives is another critical area. Implementing incentive programs like bonuses for a certain number of rides or recognition programs for top performers could increase driver earnings and reduce churn, thereby improving driver satisfaction and loyalty. Concurrently, improving the rider’s experience is equally important. Ensuring high availability of drivers, particularly during peak times, and enhancing the rider app experience with features like ride tracking and seamless payment options would help reduce rider churn, particularly among those who have previously experienced failed matches. Although constrained by the $25 cap, dynamic pricing strategies can be leveraged within these limits to optimize revenue, particularly during peak demand. Alongside this, local marketing campaigns and community engagement initiatives can attract more riders and drivers. Collaborating with local businesses and events can enhance brand visibility and expand the rider base. Operational efficiency is a cornerstone of this approach. Reducing operating costs without altering the pricing structure can aid in maintaining or even increasing profitability. Addressing the high churn rate, especially among riders who face failed matches, is crucial. Implementing measures to ensure higher match success rates and considering customer service initiatives like discounts or credits for riders who experienced a failed match can enhance overall satisfaction. A data-driven decision-making approach, underpinned by continuous monitoring and analyzing ride requests, completion rates, and user feedback, can inform strategic adjustments. Diversifying revenue streams by exploring additional services or revenue streams that complement the ride-sharing business can contribute to overall profitability. Reviewing and optimizing the cost structure, particularly in customer acquisition and churn areas, is recommended. Improving service quality, conducting detailed market research to understand demand and supply elasticity, and optimizing the pricing structure within the prevailing rate limit can provide further insights into more effective pricing strategies. In summary, by balancing these strategic elements, Lyft can maximize its net revenue while ensuring satisfactory earnings for drivers and maintaining high rider satisfaction, all within the constraints of the prevailing market rates and cost structures in Toledo. I have a CS degree so I coded in Python. It has been a decade since I used the coding language regularly, and that was during college classes. Assumptions: • Fixed Rider Price: The code assumes that the rider price is fixed at $25. o rider_price = 25 # Assuming rider price is fixed at $25 • Total Ride Requests per Month: The code assumes a specific number of total ride requests per month, set at 1000. o total_ride_requests_per_month = 1000 # Assuming total ride requests per month • Average Driver CAC and Rider CAC: The code uses an average value for both driver and rider Customer Acquisition Cost (CAC). These values are assumed to be $500 and $15, respectively. o avg_driver_cac = (400 + 600) / 2 # Average driver CAC value o avg_rider_cac = (10 + 20) / 2 # Average rider CAC value • Baseline Churn Rate and Lyft Take at Baseline: The code assumes a baseline churn rate of 5% and a baseline Lyft take of $6. o baseline_churn_rate = 0.05 # 5% o baseline_lyft_take = 6 # $6 take at the baseline • Churn Rate Sensitivity: The churn rate is assumed to be sensitive to changes in Lyft's take, with a sensitivity factor of 0.01. o churn_rate_sensitivity = 0.01 # Sensitivity of churn rate to Lyft's take changes • Churn Rates for Failed Events: Monthly churn rates are specified for riders who do not experience a "failed to find driver" event (10%) and those who experience one or more such events (33%). o churn_no_failed_event = 0.10 # 10% monthly churn for riders who don’t experience a “failed to find driver” event o churn_failed_event = 0.33 # 33% monthly churn for riders who experience one or more “failed to find driver” events • Known Data Points for Interpolation: The code assumes known data points for Lyft's take and corresponding match rates to create an interpolation function. o known_lyft_takes = [3, 6, 25] # Including $25 as an extreme case o known_match_rates = [93, 60, 0] # Assuming no matches at $0 driver earnings To incorporate the driver churn rate into my code, which is sensitive to changes in Lyft's take, I first needed to define a formula for the churn rate based on Lyft's take. C =min(max(C_b + k * (T - T_b), 0), 1) where (C) is the current churn rate,(C_b) is the baseline churn rate,(T) is the current Lyft's take, (T_b) is the baseline Lyft's take, and (k) is a constant that defines the sensitivity of the churn rate to changes in Lyft's take. In the scenario, (C_b) is 5%, and (T_b) is $6 (when driver earnings are $19). I needed to decide on a value for (k), which will determine how sensitive the churn rate is to changes in Lyft's take. For the sake of this example, I assumed (k) is 0.01 (1% increase in churn for every $1 increase in Lyft's take over the baseline). Code: import numpy as np import pandas as pd from scipy.interpolate import interp1d # Constants and Assumptions rider_price = 25 # Assuming rider price is fixed at $25 total_ride_requests_per_month = 1000 # Assuming total ride requests per month avg_driver_cac = (400 + 600) / 2 # Average driver CAC value avg_rider_cac = (10 + 20) / 2 # Average rider CAC value baseline_churn_rate = 0.05 # 5% baseline_lyft_take = 6 # $6 take at the baseline churn_rate_sensitivity = 0.01 # Sensitivity of churn rate to Lyft's take changes churn_no_failed_event = 0.10 # 10% monthly churn for riders who don’t experience a “failed to find driver” event churn_failed_event = 0.33 # 33% monthly churn for riders who experience one or more “failed to find driver” events # Define known data points for interpolation known_lyft_takes = [3, 6, 25] # Including $25 as an extreme case known_match_rates = [93, 60, 0] # Assuming no matches at $0 driver earnings # Create the interpolation function extended_linear_interp = interp1d(known_lyft_takes, known_match_rates, kind='linear', fill_value="extrapolate") # Define the full range of Lyft's takes lyft_take_range_full = np.arange(0, 26) # Lyft's take from $0 to $25 # Use the interpolation function for the full range of Lyft's takes interpolated_match_rates_full = extended_linear_interp(lyft_take_range_full) # Rounding match rates to 2 decimal places rounded_match_rates = [round(rate, 2) for rate in interpolated_match_rates_full] # Function to calculate churn rate based on Lyft's take def calculate_churn_rate(lyft_take): churn_rate = baseline_churn_rate + churn_rate_sensitivity * (lyft_take - baseline_lyft_take) return min(max(churn_rate, 0), 1) # Ensure churn rate is between 0 and 1 # Rounding match rates to 2 decimal places after ensuring they are at least 0 rounded_match_rates = [max(round(rate, 2), 0) for rate in interpolated_match_rates_full] # Initialize lists to store additional metrics total_monthly_rides_list = [] # New list to store monthly rides total_annual_rides_list = [] # New list to store annual rides monthly_driver_churn_list = [] # New list to store monthly driver churn annual_driver_churn_list = [] # New list to store annual driver churn monthly_rider_churn_10_list = [] # New list to store monthly rider churn at 10% annual_rider_churn_10_list = [] # New list to store annual rider churn at 10% monthly_rider_churn_33_list = [] # New list to store monthly rider churn at 33% annual_rider_churn_33_list = [] # New list to store annual rider churn at 33% # Adjusted loop to incorporate the new churn rate calculation and modified rider churn-related expenses adjusted_revenue_scenarios = [] for lyft_take, match_rate in zip(lyft_take_range_full, rounded_match_rates): driver_earnings = rider_price - lyft_take total_rides = match_rate / 100 * total_ride_requests_per_month total_monthly_rides_list.append(total_rides) # Store total monthly rides total_monthly_revenue = lyft_take * total_rides # Calculate driver churn rate based on Lyft's take driver_churn_rate = calculate_churn_rate(lyft_take) # Adjust driver expenses calculation based on the churn rate driver_expenses = avg_driver_cac / (1 - driver_churn_rate) # Considering dynamic monthly churn for drivers # Calculate the number of successful and failed matches successful_matches = (match_rate / 100) * total_ride_requests_per_month failed_matches = total_ride_requests_per_month - successful_matches # Calculate rider churn-related expenses for each category rider_churn_expenses = (successful_matches * churn_no_failed_event * avg_rider_cac) + \ (failed_matches * churn_failed_event * avg_rider_cac) # Calculate net income net_income = total_monthly_revenue - driver_expenses - rider_churn_expenses # Calculate monthly and annual driver churn monthly_driver_churn = driver_churn_rate * 100 * total_ride_requests_per_month annual_driver_churn = monthly_driver_churn * 12 # Calculate monthly and annual rider churn at 10% monthly_rider_churn_10 = churn_no_failed_event * successful_matches annual_rider_churn_10 = monthly_rider_churn_10 * 12 # Calculate monthly and annual rider churn at 33% monthly_rider_churn_33 = churn_failed_event * failed_matches annual_rider_churn_33 = monthly_rider_churn_33 * 12 # Append the scenario including net income to the list adjusted_revenue_scenarios.append({ "Lyft's Take": lyft_take, "Driver Earnings ($)": driver_earnings, "Match Rate (%)": match_rate, "Total Rides": total_rides, "Monthly Revenue ($)": total_monthly_revenue, "Driver Churn Rate (%)": driver_churn_rate * 100, "Net Income ($)": net_income, "Monthly Driver Churn": monthly_driver_churn, "Annual Driver Churn": annual_driver_churn, "Monthly Rider Churn (10%)": monthly_rider_churn_10, "Annual Rider Churn (10%)": annual_rider_churn_10, "Monthly Rider Churn (33%)": monthly_rider_churn_33, "Annual Rider Churn (33%)": annual_rider_churn_33 }) # Store monthly and annual metrics in lists monthly_driver_churn_list.append(monthly_driver_churn) annual_driver_churn_list.append(annual_driver_churn) monthly_rider_churn_10_list.append(monthly_rider_churn_10) annual_rider_churn_10_list.append(annual_rider_churn_10) monthly_rider_churn_33_list.append(monthly_rider_churn_33) annual_rider_churn_33_list.append(annual_rider_churn_33) # Creating a DataFrame for the adjusted net income scenarios adjusted_net_income_df = pd.DataFrame(adjusted_revenue_scenarios) # Add new columns for total monthly rides, total annual rides, annual net revenue, # monthly and annual driver churn, monthly and annual rider churn at 10%, and 33% adjusted_net_income_df["Total Monthly Rides"] = total_monthly_rides_list adjusted_net_income_df["Total Annual Rides"] = adjusted_net_income_df["Total Monthly Rides"] * 12 adjusted_net_income_df["Annual Net Revenue ($)"] = adjusted_net_income_df["Net Income ($)"] * 12 adjusted_net_income_df["Monthly Driver Churn"] = monthly_driver_churn_list adjusted_net_income_df["Annual Driver Churn"] = annual_driver_churn_list adjusted_net_income_df["Monthly Rider Churn (10%)"] = monthly_rider_churn_10_list adjusted_net_income_df["Annual Rider Churn (10%)"] = annual_rider_churn_10_list adjusted_net_income_df["Monthly Rider Churn (33%)"] = monthly_rider_churn_33_list adjusted_net_income_df["Annual Rider Churn (33%)"] = annual_rider_churn_33_list # Print the DataFrame with the specified column order print(adjusted_net_income_df[["Lyft's Take", "Driver Earnings ($)", "Match Rate (%)"]]) print(adjusted_net_income_df[["Total Rides", "Monthly Revenue ($)", "Driver Churn Rate (%)"]]) print(adjusted_net_income_df[["Net Income ($)", "Total Monthly Rides", "Total Annual Rides"]]) print(adjusted_net_income_df[["Annual Net Revenue ($)", "Monthly Driver Churn", "Annual Driver Churn"]]) print(adjusted_net_income_df[["Monthly Rider Churn (10%)", "Annual Rider Churn (10%)"]]) print(adjusted_net_income_df[["Monthly Rider Churn (33%)", "Annual Rider Churn (33%)"]]) #clipboardHealth #productmanagement

Apple peanuts& Nov 24, 2023

This company’s position is fake.

Clipboard Health kjads671b Nov 28, 2023

I work there, and no, it's not fake. This case study is hard to pass, but a small number of folks do succeed. You just don't see them here on Blind, which has a negativity bias (like Glassdoor).

Submittable pJLw71 OP Nov 28, 2023

@kjads671b Maybe you could post your case study here for the next person coming along. What did you do differently in your case study that I didn't?