Case study · Service businesses
Cherry Pickers
Rescuing a Stalled Customer Review App for Service Businesses
Cherry Pickers came to us with an app another developer had stopped working on months earlier. We got the inherited code running, replaced the end-of-life Django backend with Express.js and PostgreSQL, and took the app through App Store and Google Play review.
Overview
Cherry Pickers is a map-based app for iPhone and Android that lets service businesses rate the customers they work for. A contractor or technician finds a home on the map, reads what other service pros experienced at that address, and adds their own review of the customer with a star rating, comments and photos.
The team behind it came to us in late 2024 with an app another developer had started and then stopped working on months earlier. We got the inherited code running, moved the backend to a simpler stack, and took the app through App Store and Google Play review to public listings on both stores.
The Challenge
The handover was a code snapshot: a React Native app, a shared SDK and a Django API. It had sat untouched for months. The API ran on Django 2.2, which is end of life, the mobile app was on React Native 0.68, and the Apple developer membership had expired. There was no database dump, so there was no data to test with.
We budgeted the first phase to get all three pieces running, upgrade them far enough to ship to the stores, and start user testing. Getting there meant upgrading Django and its packages, fixing the Docker setup and moving the app onto a current Expo build for iOS 18 and Android 15.
The first TestFlight build in April 2025 surfaced a bigger problem. The client found screens and fields they remembered were missing, and suspected the snapshot was two or three versions behind. The repository it came from was no longer accessible, so a newer copy was not an option.
What We Built
A backend sized to the app
Most of the app's logic lives on the phone: mapping, location and search happen on the device. The Django API was heavier than that work needed, and even small changes meant restarting its Docker containers. In May 2025 we proposed replacing it with Express.js and PostgreSQL, with no change to scope or budget for the phase, and the client agreed. The new API runs on Railway, photos go to S3 and are served through CloudFront, and we built a Next.js admin in place of the outdated Django admin for managing users, homes and reviews.
A map that stays where you are
We rebuilt the map so it holds your place rather than snapping back to your GPS location, and loads new homes once you move more than 10 miles. Pins are colored by average rating (green at four stars or more, yellow from three, red below three), and there is a satellite toggle. New homes start from a Google Places address search instead of typed-in address fields.
Reviews with rules
A home is created in the same database transaction as its first review, and deleted when its last review is removed, so the map never shows an empty pin. Each user can review an address once. Reviews carry photos and likes, and users earn points for reviewing, adding photos, and giving and receiving likes. The score shows next to their username. In-app notifications tell users when their reviews are liked or shared.
Sharing and guest access
Shared links open the map centered on the home. Anyone can browse the map without an account, and signing in returns you to the home you were trying to open.
Getting through app review
Apple rejected early submissions under its user-generated content guideline. We added a terms acceptance step at sign-up, a profanity filter on reviews, and a report button that hides the review from the reporter and emails a moderator. We also fixed an iPad account-deletion bug. We built the public site with the support, privacy, terms and account deletion pages both stores require, and ran a friends and family beta through TestFlight and Google Play testing before release.
Results
- A stalled codebase became an app listed on both the App Store and Google Play.
- The end-of-life Django backend was replaced with Express.js and PostgreSQL without changing the phase's scope or budget.
- Moderation tools that answered Apple's user-generated content review.
- 123 tracked tickets from first setup in March 2025 through public release builds in June 2026.