The challenge
Legal cannabis delivery is heavily regulated: customers must be 21, every order is tied to a licensed dispensary, and our own design checked the customer's ID three times, at sign-up, at the store and at the door.
TokeRunner's idea was a marketplace where independent drivers pick up sealed orders from local dispensaries and deliver them in 15 to 30 minutes. Before any of that could work, we needed a page that collected a waitlist and an app that people could actually order from.
The approach
I started with a technical spec: the order lifecycle from ID check to doorstep, the payment and verification vendors, and the driver flow. One rule stands out. The driver's pickup button stays hidden until their location and time match the dispensary, so an order can only be released inside the store.
The ordering app is a React single-page app on a small Express and MongoDB API. Firebase handles sign-up, Google sign-in and password resets, Stripe takes payment, and a finalized order sends a Twilio text to the team with the items and delivery address. The cart only accepts items from one dispensary at a time, because each order has to be filled by a single licensed shop.
- Age gate firstA 21+ check opens before anything else and is remembered on the device.
- Shops and productsBrowse dispensaries or every product, filter by Flower, Vaporizers, Concentrates and Edibles, and search both.
- One-shop cartAdding an item from a second dispensary is blocked, so every order maps to one licensed retailer.
- Checkout to text alertStripe payment, saved address and phone, then an SMS order summary to the team.
How an order was designed to move
- 01Verify21+ gate, account, delivery address
- 02OrderOne dispensary's menu, Stripe checkout
- 03Pick upRunner's button unlocks only in the store
- 04DeliverID checked again at the door



