How might we create a unified permission request system that prevents prompt fatigue?
🗺️ Allofresh map picker and how it can hurts business
Reduced API costs by millions annually
Improved SLA by 14% by preventing user error
Enhanced the design system by creating more scalable components
Role
Lead Designer
Project scope
Feature Enhancement
At Allofresh, our delivery service relies heavily on accurate location data to ensure customers receive their orders promptly. Recently, our product and engineering teams identified two critical issues with our map picker functionality that were significantly impacting both our bottom line and customer experience.
Also alarming was our product team's finding that 8%
of our transacting users had mismatches between their full address and actual map pin location. This directly impacted our SLAs, forcing our team to manually resolve issues or risk failed deliveries.
Our engineering team discovered we were hemorrhaging money through our map picker interaction. The culprit? Our implementation of Google Maps' Place Details API. Every time a user dragged the location pin, we were calling the API to fetch place or landmark names – a costly interaction for a naturally high-interactivity feature.
Further investigation revealed that users with address-pin mismatches were predominantly those who had refused location permission access
. This led me to audit
our current user journey for those who deny location permissions, revealing three critical issues:
We were repeatedly prompting users to activate location permissions throughout their journey, hoping they will enable the permission.
During registration, location defaulted to "Spectra Training" without requiring user interaction, making it highly probable that users overlooked this critical setting.
High probability that users didn't recognize the Edit Pin Location component due to its design.
💡How might we create a unified permission request system that prevents prompt fatigue?
💡How might we make location setting during registration more intentional and noticeable for users?
Initially, these seemed like separate issues, but after revisiting the journey multiple times, I realized they stemmed from the same root cause:
📌Inefficient handling of location permission refusals.
My solution implemented a separation of concerns with a dedicated "Location Off/Fail Mode." Instead of bombarding users with multiple prompts, we focused on properly handling the "location off" state.
UI components would adapt based on location permission status, including scenarios where location is enabled but fetching fails based on API response.
This "Location Off/Fail Mode" was designed with intentionality
rather than defaulting to a random location that users might overlook.
💡How might we design a more intuitive PIN location editing experience that users can easily recognize and interact with?
This solution was straightforward after competitor research revealed key takeaways:
🧐Most competitors use red-colored pin icons for location components
Boxed layouts were standard and vastly different from our current design
By adopting these familiar patterns, we could significantly improve component recognition while reducing development complexity.
Our map picker design was secretly becoming a money pit. Each pin movement triggered a Place Details API call
, and with users naturally adjusting their pins multiple times to find the perfect location, costs quickly accumulated. As our user base grew, this design flaw became financially unsustainable.
Kudos to our engineering manager and team for presenting these problems clearly to the product team along with several technical alternatives. After thorough discussions, we made the bold decision to completely eliminate the use of Place Details API
, as other solutions either created a janky user experience or introduced new complications.
Removing Place Details API meant we could only display address components without any landmark names. This created our first design challenge:
💡How might we display location information in a way that minimizes user confusion despite the lack of familiar place/landmark names?
Being unfamiliar with Google Maps API, I dove straight into the documentation. I then consulted my understanding to our engineering manager with specific questions like:
🤔"Can this particular API response be useful?"
"Does this quick mockup still align with our goals?"
"Are there any gaps in my understanding?"
“…”
These consultations built my confidence to begin crafting a solution.
For Location services disabled
users, we removed the default location selection capability. Instead, we provide a clear call-to-action prompting them to manually search for their current location. This approach prevents users from proceeding
with submissions without actively choosing their location, eliminating the risk of default addresses being incorrectly set as their primary address.
For location services enabled
users, a confirmation dialog will appear if they haven't interacted with the address card component. This ensures users are fully aware
of their selected location before proceeding.
Redesigned the component to better align with user expectations based on our competitor analysis findings. The new design is both familiar to our users and scalable, functioning effectively across various screens as either an interactive element or an informational display.
To preserve a positive user experience, we found it necessary to completely redefine our Address Flow
principles.
To establish their location, users first conduct a keyword search or utilize their current GPS position (when available) to confirm their intent to use
a specific address. Following this, the map picker functions as a refinement stage for pinpointing a more precise location.
Finally, users complete the address form to finalize all necessary address details
.
Results:
Although the previous design offered superior UX with its single-step approach, it proved too costly to maintain. We made the strategic decision to divide the location selection process into multiple steps.
📌Sometimes the best solutions come from recognizing that separate problems share a common root cause.
📌Even seemingly minor UX decisions (like API calls on map interactions) can have significant business impacts
📌Default settings require special attention as they often go unnoticed by users
You've reached the end.