LockerDrop
A Shopify app that turns a bank of smart lockers into a 24/7 pickup option at checkout.
Role: Sole designer and developer
Built with: Node.js, PostgreSQL, React, Shopify OAuth, checkout UI extensions, Harbor Lockers API
Date: December 2025
The problem
Local pickup is a good idea that usually fails on staffing. A store offers it, then discovers someone has to be present to hand over the bag, which means pickup only works during business hours, which is exactly when the customer is at work. The option quietly stops getting used.
Smart lockers solve the staffing problem. They just are not connected to anything a merchant already runs.
What I built
LockerDrop sits between a Shopify store and Harbor Lockers. A shopper picks a locker location at checkout, pays, and gets a code. They collect the order whenever they want. Nobody has to be there.
The merchant side is a small dashboard: connect a store, choose which locker banks to offer, watch what is reserved and what has been collected.
The hard part
Locker availability is a live number that changes without warning. Someone else's order gets picked up, a unit goes offline for service, a bank fills up during a lunch rush.
Checkout, meanwhile, wants a fast, stable answer. If you query the locker API on every page view you are slow and rate-limited. If you cache availability you eventually sell someone a locker that no longer exists, and they drive across town to find out.
I stopped treating these as two problems. Availability is read optimistically for display, then reserved atomically at the moment of purchase, with the reservation held in Postgres rather than assumed from the locker system. If the atomic reservation fails, the shopper is told before payment completes, not after. The cache can be wrong; the reservation cannot.
What I would do next
Overflow handling. Right now a full bank simply stops offering pickup. It should offer the next nearest bank and say how far away it is.