Take a Closer Look at Pickup in Store

The Elbrus release of SuiteCommerce Advanced featured some exciting new functionality. The one I am most excited about is pickup in store.

What this functionality does is enable non-warehouse locations to act like fulfilment centers. More than that, though — it means that a shopper who is keen to get their items as soon as possible, can head down to your one of your fine retail locations and pick it up (quite possibly within minutes or hours).

The user journey goes something like this:

  1. As a shopper, I really want this thing but, like, right now
  2. I go online to this amazing store and see that they sell it
  3. While they offer to send it to me, they also offer a list of stores near my location, from which I can pick it up the same day
  4. I select a location and add the item to my cart
  5. I check out and pay like I would a normal order
  6. I receive a confirmation telling me when and where to pick it up from
  7. I go and do it — I get my item the same day

The attractiveness from a shopper point of view is certainly quite strong. If you read my article on micro-moments then you can see how this impulsivity can factor into a part of this. Sometimes you're happy to wait a few days for your thing to show up; sometimes you want it straight away. It means that shoppers can have certainty: they pay and order online and then know the item is going to be waiting for them when they turn up. It's guaranteed, so they don't have to wander around different stores hoping to find it.

There are two sides to implementing this functionality. The first relates to readying your organization to handle this significant change to fulfilment, and the second is the technical side. As someone who is technical, I'm really only qualified to talk about the NetSuite side of things. However, I can talk about some aspects in general which can help you with it.

Organizational Changes

The first area is stock management. NetSuite, in ERP terms, offers a lot of tools to aid you in this aspect. After all, it's part of our core business. What this functionality effectively does is make your stores behave like warehouses and, if you want, make your warehouses like stores. This convergence blurs, or even removes, the distinction and can open new opportunities for you and your customers.

When a BOPIS (buy online, pickup in store) order is placed, a fulfilment request is sent to the store and your staff at that location need have a process in place to deal with these orders. In other words, if your stores typically deal with customers in an ad hoc manner (ie they bring inventory from the shop floor to your staff to buy) then you will need to add in a way to make your staff aware of online orders as they come in.

You also need to be aware of your inventory. As BOPIS uses your stores inventory for fulfilment, you should consider and monitor the most popular items that shoppers want to use BOPIS for. Overstocking popular items at popular locations could be a necessity. Likewise, you can keep certain items 'online only' — there could be a couple of a reasons for doing this:

  1. Exclusivity — why not add a little banner or icon indicating that they can only get it from your online store? Alternatively, you can leave your stock for in store visitors anyway adopting a kind of 'no reservations' policy meaning that, if someone wants it, they have to come down and be the first to get it.
  2. Infeasibility — you may sell items that just aren't practical for people to pick up. Perhaps they're heavy or large, perhaps they have a lead time, perhaps they require customization: there's always some items that simply aren't wrapped and ready to go the same day.

The good news is that every item has a flag that marks its availability for pickup in store: you can use this to mark your intentions about a particular item. Also, as your stores are now fulfilment centers, you can choose not to stock a particular item at a location. In this vein, you can add 'buffer stock' to items, which in many ways is advisable.

Buffer stock is useful for preventing over-selling items: imagine you have an item and there's only one left at the store and someone buy it online. Before your staff can get to the shop floor to pull it off, an in-store shoppers goes to your POS and buys it. This creates an awful situation where your online shopper thinks they've secured the item (and are possibly on their way to pick it up) and you have to disappoint them. As an organization, you'll need to think about this carefully and ensure that you only delight your customers — and not disappoint.

Technical Implementation Advice

We cover both the ERP and SCA-specific aspects of implementing this functionality in our documentation; as such, only a subset of documentation is available on the DevSC site: you can grab it all in the help center.

However, you can start with DevSC. Our docs summarize the steps as follows:

  1. Enable features, including those provided by the Advanced Order Management module
  2. Set up automation
  3. Set up store locator
  4. Enable the store locator feature to show the nearest location to the customer
  5. Configure your retail locations to allow pickup in store
  6. Specify hours for pickup and give customers a cutoff time for pickup on the same day
  7. Optionally, add location specific information in a memo field to be displayed on the product details page
  8. Create or modify a customized sales order form to fit pickup in store
  9. Add the customized sales order form ID to your SuiteCommerce Advanced website
  10. Set up inventory items to indicate whether they are eligible for pickup at retail locations
  11. Set a stock buffer so that an item only appears as available for pickup if you have a specific amount of items in stock at the given location
  12. Update field sets

With each of these steps, you need to follow the documentation and assess (if required) how it will impact your business. However, I can offer some additional advice for each of these steps.

Advanced Order Management Module

This module is not a JavaScript module included with SuiteCommerce Advanced; nor is it a bundle you can pick up from SuiteBundler. You will need to get in contact with your NetSuite representative about getting this provisioned to your account.

The module adds in a lot of extra functionality that is necessary for store pickup to work, not least because we include the core NetSuite functionality in this bundle. But it also includes a lot of extra work on package routing. It's necessary, so make sure you get it first.

Store Locator and Location Configuration

So you head over to Setup > Company > Locations and take a look at your stores. You should already have a strong list as this functionality is a logical extension of the store locator functionality. If you don't, then you'll have a lot of work ahead of you.

Store locator is something I've written about before, in particular how effective it can be at engaging with your customers. Even without pickup in store, having a locator can be very effective but offering BOPIS is the next step. So make sure you list all your stores.

Keep in mind that when you set this up, you can specify a number of restrictions or configurations that can aid you in managing what happens to those stores. Firstly, you can opt a store out from being a pickup location at all. This could be useful if one of your stores has a particularly small inventory and don't want to diminish their walk-in presence. When implementing this functionality you can also use this functionality to 'whitelist' a small number of stores, so that you can trial this functionality. Launching BOPIS is a big deal, so when doing it for the first time, you could decide to run this at a limited number of stores. This'll give you space and time to work out the kinks and test its effectiveness.

Secondly, keep in mind that a location's type does not need to be set to 'store' to be used as a pickup location. The functionality is flexible and any type of location (even a warehouse) can be used as a pickup location. Some warehouses offer 'trade counters' where members of the public (or, more usually, tradespeople) can purchase supplies they need for their work. You too could offer such a service.

Next, you can think about buffer stock. This is also configurable on an item-by-item basis, but you can set on a storewide level. As I mentioned earlier, setting buffer stock can be useful for preventing overselling as well as incentivising shoppers taking the leap and visiting you instore on a whim. There could be an opportunity in delighting an impulsive customer by telling them that they "made it just in time and got the last one!". Keep in mind that you can set buffer stock on an each item: but, if you do, it will override the value you set on the store (ie, item-level takes precedence and is not additive).

Fourthly, think about you opening hours and your cut-off time. If you already have store locator, then you'll already have your opening times available but the cut-off time is very important. If you don't set one, you're saying that a customer can place an order a minute before closing and expect to pick it up the same day. How you set this limit is up to you: obviously once the order is in NetSuite, you can start the process of fulfilling it. Perhaps you're happy setting no value; perhaps you only need five minutes; perhaps the guarantee you want to make to your customers is "order online and pick it up within an hour".

As pictured above, this information is surfaced to the frontend by default. Keep in mind that the hours you set are specific to the store's timezone, and not the shopper's. In other words, if you operate stores across multiple timezones then you may want to indicate this to shoppers.

Finally, note that when a shopper searches for a store that offers BOPIS for an item, they'll only be returned stores that actually have it. In other words, while there might be closer stores based on their location, if it doesn't have the item they want, it won't be returned as a negative. Only positive results are shown.

Create or Modify a Custom Sales Order Form

As mentioned in the docs there is a help center topic that talks about how to set this up.

This step is required so that shoppers can place an order and then see the fulfilment location in their order history. If you don't set up a custom transaction field, the form will still load but the fulfilment information will be left blank, which is obviously bad.

When setting up the form, I have two points of advice. The first is something easily forgotten if you don't do this regularly: custom forms' IDs are always prepended with "custform". If you choose to specify your own ID, make sure you set it as something like "_pickup" or "_bopis" so you can identify and remember it easily.

The second was something that actually caught me out when I was setting it up on my site. In short: when setting up the form, make sure you set it as the preferred form for the Customer Center role or whatever role your customers use on the frontend of your site to place orders. In fact, you may even want to set this for every role throughout your organization.

I discovered this problem after I had created the form, entered the form ID into the configuration and then placed an order on my site. When I went to my order history to look at the order, the page displayed an internal error message. When I took a look at the execution look for the SSP application, I saw this:

{"userEvent":null,"internalId":null,"code":"UNEXPECTED_ERROR","details":null,"stackTrace":{"[Ljava.lang.String;":["nlapiLoadRecord(OrderHistory.Service.ss$54716:351)","<anonymous>(ssp_libraries.js:9223)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","<anonymous>(ssp_libraries.js:5965)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","<anonymous>(ssp_libraries.js:9265)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","<anonymous>(ssp_libraries.js:3054)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","<anonymous>(ssp_libraries.js:2943)","<anonymous>(ssp_libraries.js:973)","service(OrderHistory.Service.ss$54716:13)","<anonymous>(OrderHistory.Service.ss$54716:24)"]},"type":"nlobjError","suppressNotification":false}

Admittedly this error is not very helpful. However, following the trail to OrderHistory.Model.js, it made me realize there is code that checks to see if the form ID configuration field (pickupInStoreSalesOrderCustomFormId) is set and, if it is, loads the record using that form; if it's not set, load the record not using the custom form.

I started troubleshooting this by removing the form ID from the configuration, refreshed the page, and then noted the page no longer errors. It loads most of the details, but omits fulfilment data. This got me thinking: a common troubleshooting method for records in NetSuite is permissions. Now I know that this user has permission to view their own orders so the next place to look is the form itself. This is what led me to the roles tab and ultimately realizing that some boxes needed checking.

Configure Items

You have complete control over what items you make available for store pickup. By default, after enabling the BOPIS functionality, all items are made available. You can opt items out from being available online if you wish.

Items can also have stock buffers. While we covered setting this on a location-wide level, you can take the opportunity to determine this on each item.

Both settings require you think carefully about your entire inventory.

Are there any items you don't want to let customers buy online and pick up in store? Obviously, an item needs to be in stock for a customer to pick it up from a store, but disabling this option on an item could have some benefits. I mentioned at the top that two good reasons are exclusivity and feasibility. Another is stock levels: if you don't expect to be able to keep a constant stock of certain items, consider disabling pickup in store. Consider the following image:

How many of these items do you think are actually available for pickup in store? The answer is one. Why?

They all look like they are available but only one is — that is because while they are all flagged as being available for pickup, only one of them is actually in stock in at least one location. You can’t tell this from the information displayed in the product list because the check performed looks for the flag and not stock levels.

This is, perhaps, a limitation, but deliberately so: this is a simple and clean way of working out and displaying this information to shoppers.

As for buffer stuck, keep in mind that setting item-level buffer stock overrides the value you set on the store. In general, I'd recommend having at least a minimum amount of buffer stock set on the store level, but additional consideration is required when it comes to certain items. Consider how much of a particular item you put on the shop floor, whether it sells quickly (ie needs frequent replenishment) and how difficult it might be to retrieve an item from the shop floor when an order comes in for it. Although I'm not an experience shop floor manager, my gut suggests that you should — at a minimum — set an item's buffer stock to the amount that's on the shop floor.

Update Field Sets

Again, this step is well documented.

There isn't much advice to give here: it's something that you've probably done quite a few times before. One troubleshooting tip: if after doing this step and re-indexing your site, they still don't show, double check that you did actually add them to the field sets. The first time I set store pickup up on my site, I made this mistake.

Final Thoughts

Before finishing, I just want to give a little insight into how this all came to be. This functionality is something we've been planning and working on for a while. The distinct areas went roughly in this timeline:

  1. Experience mapping: planning all the different ways a shopper might use this functionality
  2. 'Competitor' analysis or, perhaps more accurately, marketplace analysis — looking at what major brands do when offering this functionality
  3. Customer research with you guys at NetSuite 2016, where we ran a UX lab to gather information on the features we need to offer
  4. Product development and testing
  5. Usability testing with real people

This isn't a linear process — it's a feedback loop — but it shows how we approached this. We wanted to ensure it was a success.

I spoke to Nair Ahmed who lead the UX lab at SuiteWorld 2016 on pickup in store. She said that while NetSuite had prepared a list of the types of things we thought BOPIS needed, she wanted to find out (organically) what our customers expected and what their businesses needed.

She and her team presented customers with a prototype and a scenario. Working through this with them gave us numerous priorities for features, which we implemented, such as:

  • Availability on a store-by-store basis
  • High level of detail when it comes specifying a store's pickup times
  • ETA for pickup
  • Streamlined and combined process for orders that contain both items for pickup and shipping
  • Ensuring shoppers remain informed about the status of their order (ie email when the order is ready for pickup)

In sum, we got a lot of good feedback from our customers and it really helped us shape the product we developed.

Using another prototype, Nair again performed a user feedback session — but this time with end-users (shoppers). The goal of this exercise was to get real people to see if our solution was easy to use, helpful and clear, as well as to see if there were any additional requirements we might need to include.

And, like the other study, we found the results useful and interesting. On average, the end-users ranked the solution quite highly in ease of use, usefulness, and efficiency. One idea we got was that changing stores on the cart should change the pickup location for all items in the cart. Indeed, where a user has picked a store (eg on a PDP) that choice should be persistent throughout the entire session as to make this option easier; as one user put it, "I prefer all my items to change store together, because unless an item is out of stock, I don't wanna make two trips if I don't have to”. Quite.

In all, this is what led us to the product we have now and I'm quite pleased with it — it's been a long tiem coming. We recognize that while there are lot of features included with it, there are some which are not. I can't say for sure when/if we'll include them in future releases but, to be clear, some things not in the Elbrus release include:

  • Combined pickup and shipping to multiple addresses
  • Have a friend pick up the order on the shopper's behalf
  • Order online, pay instore

I certainly hope we can get these in later releases, but it's kind of a 'wait and see'. In the meantime, I hope you'll agree that our BOPIS is featureful and happily comparable to whats available in the industry. Time to get out and delight your customers!