Rob Scott

Case study

Click & Collect across a 50+ store retail chain

Apr 2026Retail operationsBuild vs buy5 min

A retail chain's Click & Collect ran through its POS and kept losing orders. We moved it onto Shopify's in-store pickup, and I built one app that runs each order from shelf to handover and keeps Shopify and the ERP in step. It went live in 51 stores.

Client
Retail chain, 50+ stores across several states
Role
Architecture and build, at Comet CX
Stack
Next.js on Vercel, Auth0, Shopify, Business Central, Salesforce, MongoDB

The business problem

Click & Collect sounds simple. A customer orders online, picks a store and comes in to collect. Behind the counter there's more to it.

Someone in that store has to notice the order arrive. They have to find the stock, which might not be there yet, and set the order aside. They have to tell the customer it's ready and hand it to the right person when they turn up. Then head office needs the sale recorded properly in the ERP.

The chain already offered it, through a Click & Collect system built into its point-of-sale software. That system was the problem. It was constantly losing orders and it was extremely slow, so a large share of orders ended in refunds and unhappy customers.

The retailer ran its online stores on Shopify, its back office on Microsoft Dynamics 365 Business Central and its customer data in Salesforce. Rather than patch the POS system or build order handling from scratch, we moved Click & Collect onto Shopify's in-store pickup. Shopify already handled the order side well. What none of these systems gave a store employee was what they actually needed:

One screen that shows a store its orders and what to do next with each of them, and that keeps every other system up to date.

Every step crossed systems that didn't talk to each other, and it had to work the same way in more than 50 stores run by staff who aren't technical.

The solution I built

A workflow built around the counter

I built a single web app for store staff. Before building anything, I interviewed store and head-office staff and visited stores to see how they ran Click & Collect day to day. From there we prototyped rapidly and kept iterating until the screens were easy and intuitive for store staff to navigate.

Each store gets its own queue. Staff see only their own store's orders, sorted into four tabs with counts: all open, incoming, ready for pickup and on hold.

Store Hub Click & Collect Items Customers Store: Northgate ▾ Click & Collect All open (12) Incoming (5) Ready for pickup (4) On hold (3) ORDER CUSTOMER ITEMS PLACED STATUS #10482 A. Nguyen 2 Today 09:14 Incoming #10477 M. Patel 1 Yesterday Ready #10471 S. Brown 3 Mon 14:02 Awaiting stock #10466 L. Chen 2 Mon 10:40 Part ready 1 2 3 ›
The order queue. Each store sees only its own orders, read live from Shopify each time. The highlight marks orders waiting on stock. Wireframe with example data.

When stock hasn't arrived, one button puts the order on hold with an optional note, so nobody goes looking for it. If two of three items are in, staff can split the order: the ready items go to pickup and the rest stay on hold. Staff can tick off single items, and an order can only be collected once everything in it is ready.

Comments typed in the app are merged with Shopify's own order history into one timeline, so the next person on shift sees the whole story in one place.

Store Hub Click & Collect Items Customers ← Click & Collect Order #10471 Awaiting stock Items READY Qty 1 Qty 1 Awaiting stock Print pick slip Add comment Mark 2 of 3 ready Splits the order: 2 items go to pickup, 1 stays on hold. Customer S. Brown Timeline Order placed Mon 14:02 · Shopify Put on hold "Waiting on transfer" Customer called Tue 10:15 · staff note 2 items ready Tue 11:30
Order detail. Staff tick off what's on the shelf. Two of three items ready means the order is split, with one part going to pickup and the other staying on hold. Staff notes and Shopify events share one timeline. Wireframe with example data.

A printable pick slip lists only the items in that part of the order. "Customer collected" completes the fulfilment in Shopify and records which staff member handed it over.

PICK SLIP Order #10471 Northgate Click & Collect S. Brown SKU ITEM QTY RG-20411 NK-11871 Part 1 of 2 · 1 item on hold Handed over by Customer signature ID checked ← only this part's items
Pick slip, generated as a PDF from live order data. When an order is split, each part gets its own slip. Wireframe with example data.

Shopify owns the order

The app doesn't keep its own copy of orders. The queue asks Shopify directly each time, and every button maps to a Shopify action: put on hold, release hold, split, mark ready for pickup, complete. A store can never be looking at a stale or out-of-sync version of an order, because there's only one version.

The app's own database holds only what Shopify doesn't track: users and their store access, staff comments, who did the handover and a log of ERP syncs. Access is checked on every request, so staff can only ever act on their own store's orders.

Store staff own store only Auth0 staff sign-in Next.js on Vercel Pages order queue order detail + pick slip item + customer lookup store + location in headers API routes hold · split · ready collect · cancel Shopify webhook scheduled syncs (2025) checks store access on every request Shopify owns order state webhooks + GraphQL Business Central sales orders items · stock Salesforce customer records from Shopify + ERP MongoDB users · store access timeline · sync log browser sign-in
The whole system. One Next.js app sits between store staff and four back-office systems. The highlight marks the one system that owns order state. Everything else either reads from Shopify or records what Shopify doesn't track.

Sales posted to the ERP automatically

When a Click & Collect order comes in, the app creates a sales order at the right store's location in Business Central, then posts it when the customer collects. Nobody re-keys anything. Matching each order to a real customer record was added later, behind a feature flag.

Around it the app grew the pieces head office needed to run it: email alerts to stores when a new order arrives, voucher lookup, customer sync from the ERP to the CRM, and an admin console for users and store access.

Results

51 stores live. We started with a pilot in a single store to shake out the problems a demo never shows: location codes that didn't match between systems, and timezones, because the chain spans several states. Once that store was solid, the rollout went from five stores to 51 in 24 days, mostly in batches of four to six. A second brand's stores followed a week later.

0 10 20 30 40 50 STORES LIVE Day 0 Day 7 Day 14 Day 21 Day 24 5 stores 51 stores +46 stores in 24 days
Stores live during the rollout, counted from the go-live flag in the app's history. 46 stores in 24 days, mostly in batches of four to six on a working day.

One screen per store. Staff work every Click & Collect order, including holds and part-ready orders, from one place, with a full history of who did what.

No double entry. Sales post to Business Central on collection, so head office's records match what happened at the counter.

A platform to build on. The same app has since grown into inventory sync across several storefronts and tens of thousands of products.

Wireframes are simplified drawings of the real screens. Store names, customers, order numbers and figures in them are examples, not client data. The rollout chart uses real dates and counts.

All writing