Shopify · 2024

Pickup in Store

Letting stores move stock between locations, so one missing item stops blocking an order

Role
Sole designer
Timeline
2024
Team
Product, Engineering
Surfaces
Admin, POS, Checkout, Functions
Status
Shipped — Summer '24 Edition

One out-of-stock item blocked the entire order

If a single item in a customer’s order wasn’t in stock at a pickup location, the whole order couldn’t be collected there. Customers had no way of knowing why, and merchants had no way of telling them.

Two phone checkouts side by side. On the left, labelled In stock, twelve pickup locations are available with Sausalito selected. On the right, labelled 1+ item out of stock, a second item is highlighted in the order summary and the pickup locations panel reads There are no pickup locations available.
A location would only be available if it had every item in the cart in stock.

Before designing anything I spent time with merchants at both ends of the range — large, high-GMV stores already running their own custom solutions, and two-location merchants who had resorted to faking their inventory in Shopify to allow the pickup to go through.

The solution they were all using was some version of a store transfer. If a location was missing an item, they would transfer the inventory from one that had it in stock.

A buyer in London saw pickup locations in New York

While investigating and researching this further, we learned about other issues. A major one was that pickup locations were shown worldwide, with no regard to countries or distance.

A customer in the United Kingdom would see pickup locations in New York, with the checkout presenting this as if it was a normal option. While larger merchants would solve this (and other issues) by creating different stores for each region, Shopify was building out Markets – a feature that let stores setup selling regions all under a single store.

A stylized world map with the buyer's pin in western Europe and store pins scattered across the eastern United States. A phone in front shows the old checkout pickup list offering New York 5,570 km away, Boston 5,290 km, Philadelphia 5,660 km and Washington 5,900 km — each marked Free and usually ready in 2 days.
Every one of these was offered as a pickup option, priced free and ready in two days, to a buyer on another continent.

To address this, we would expand our scope to include this use case, working closely with the Markets and Checkout team on an approach that addressed this issue.

Pickup locations can now pull inventory from anywhere

The flagship of the rebuild was Store Transfers. A pickup location can now pull inventory from another location — a warehouse, another store — to fulfill an order it couldn’t have completed on its own.

The rebuilt in-store pickup settings page for the Manhattan location, showing location status, expected pickup date, a Store transfers card listing Bronx, Brooklyn, New Jersey and Queens as possible source locations, and a ready-for-pickup notification.
The rebuilt pickup settings page, with Store transfers as its own card.

On the settings side, a merchant can now:

  • Designate source locations a pickup location can transfer from
  • Exclude specific products from ever being considered for transfer
  • Adjust processing time to account for the transfer itself
The Store transfers card with Queens ticked as a source location, connected by lines to a phone checkout where the out-of-stock item is highlighted and the Manhattan location now appears as available for pickup.
By selecting Queens as a transfer location, checkout will now show Manhattan as available, pulling inventory from Queens if it needs to.

An order now says what it’s waiting on

A transfer is a physical act — someone has to move stock between two buildings — so the order carries that state honestly rather than pretending it’s fulfilled.

We introduced a new sub-status for Transfer required (and other in-between states) to track the order during this process.

Merchants would need to mark an item as Transferred before the Point of Sale device would present the order to associates.

Two surfaces labelled Admin and Shopify POS. On the left, an order in the admin showing a Transfer required badge and a Transfer to pickup location button. On the right, the Pickup in store screen on a POS device listing the same unfulfilled order under Prepare for pickup.
Point of Sale can only see orders at its own location, and requires the transfer to be initiated.

We deliberately limited the amount of interim states (Transfer Received, Transfer Processed, etc), as we lacked sufficient evidence that merchants would actually need them. Getting this wrong would mean merchants having to click through several unneeded steps, to solve a hypothetical use-case we couldn’t prove.

Checkout learned where the buyer actually is

To improve the issue with distant/inaccessible locations at checkout, we were limited by the reliability of knowing the customer’s actual location. Despite this, we shipped two changes, based on our level of confidence.

Two phone checkouts. On the left, labelled Locations too far away, a note reads the closest location with your item is more than 200km away from 94105, above a Los Angeles location 610km out. On the right, labelled No locations in country, the pickup panel reads there are no pickup locations available in the United Kingdom, with a change location link.
The two states the old list couldn’t express: the closest option is real but impractical, and there is nothing in this country at all.
  • Distant locations in the customer’s country would continue to show in the list, however a banner would call out the high distance, and display the approximate customer location (determined by GeoIP). Previously, the estimated location was hidden under a menu.

  • Hide locations entirely if the customer’s country had no pickup locations at all – we would hide them, but show what their country was, in case GeoIP guessed incorrectly (VPN, cellular network, etc).

In an ideal world, we would hide the Pick up option entirely if it wasn’t available, however the current configuration of Checkout made this impossible as the country/region is not asked for prior to this step. Checkout is one of Shopify’s most critical features, so it was not something we could risk to get wrong within our project timeline. We instead worked with their team to ship these fixes, while highlighting this issue for the future.

We used the same door we asked partners to use

The store transfers feature was built on a new extensibility framework available to 3rd party partners, allowing for custom pickup logic and interface to show alongside the core pickup settings.

The pickup settings page with a dashed App Block slot marked in its layout, connected to a diagram: a Function provider — either Shopify or a third-party app — feeds Admin UI Extensions, which render into that block. The Store transfers card is shown as the thing occupying it.
Store Transfers is an app block fed by a function provider. Ours happens to be Shopify’s — a partner’s app plugs into the identical slot.

This meant we were building using the same limitations that were available to 3rd parties – including only using UI components from the Admin UI Extensions API.

This had many consequences.

Since this way of building features was still new, the UI library lacked many design components we take for granted (collapsability and modals for example at that time). Because of this, we worked closely with this team to expedite key components that were dealbreakers, while also designing an upgrade plan to update the component as new components became available.

While it was a challenge, the benefit was that this helped the team identify missing components from the UI kit, and adding these meant they also became available to 3rd party partners building their own functions with app blocks throughout the admin.

It shipped as Store Transfers

Store Transfers went out end-to-end and was announced in Shopify’s Summer ‘24 Edition.

Shopify Editions announcement excerpt for Store Transfers
Announced in Shopify’s Summer ‘24 Edition.

It was an interesting project that let me work across multiple surfaces – Checkout, Functions, and Retail (Point of Sale). Balancing changing limitations and requirements from external teams was a challenge, but let me work with many people, letting us ship a crafted experience for merchants.

More case studies

Rebuilding how stores price shipping, to match how merchants actually think about it

Making it clear how each store location is set up online