In-store pickup helps merchants differentiate from their competition or remain competitive. Their customers might want to receive an item right away, and not wait for shipment. For example, a customer might need an outfit to wear to an unexpected event, but doesn't have the time to shop around or wait for shipment. Shopping online and then picking up the item is the fastest and most efficient way for them to meet their obligations. Another customer doesn't want to pay shipping costs for a bulky item, such as a piece of furniture or an appliance, because the customer has a ready means of transportation. Providing in-store pickup as a shipment option gives customers a a great deal of flexibility.
Salesforce B2C Commerce provides in-store pickup functionality via a combination of Business Manager and API capability, as demonstrated in the SiteGenesis application. See Implementing in-Store Pickup for complete instructions.
The following SiteGenesis in-store pickup functionality is described in more detail in the SiteGenesis Wireframes: In-Store Pickup and the Functional Specifications.
Product Details and Quickview Pages
On the product details and Quickview pages, the customer can identify where a particular product is located by clicking the Check store availability link.
Cart Page
When the customer adds an item to the basket, the default inventory list is assigned to the line item on the cart page. The customer can specify for each item if the item is to be designated for home delivery or in-store pickup on the Delivery Options column.
Checkout Pages
When multi-shipping is enabled, if at least one item is set to the in-store pickup delivery option, the multi-shipping checkout process is used.
In Store Pickup
delivery option
show the address of the store selected for pickup. Any items that do
not have this option selected must have a shipping address assigned to
them.In Store Pickup
delivery
option selected, there is no need to select a shipping method. The
(zero cost) shipping method for store pickup is automatically assigned
and shown for those shipments.Home Delivery
shipments, the customer
must select a shipping method.When multi-shipping isn't enabled, the customer can have multiple in store shipments, but all the other physical shipments are designated for one delivery. The shipments are grouped on the single shipping page, where the customer can enter a message for each shipment.
The following system object attributes (in Business Manager) are used to implement the in-store pickup feature:
System Object | Attribute ID | Type | Description |
---|---|---|---|
Product | availableForInStorePickup | boolean | Inventory lists for stores (brick and mortar) are associated with this product. |
ProductLineItem | fromStoreId | string | Links the store to the productlineitem
for grouping shipments in the checkout process. |
Shipment | fromStoreId | string | Maps the shipment to a brick and mortar store. |
Shipment | shipmentType | string | When this equals instore , the checkout
flow assigns the shipping method (005), which has a no shipping
charge. |
Shipment | storePickupMessage | string | Text used by the customer to send a message to the brick and mortar store about the shipment. This is reflected in the order export. |
SitePreferences | countryCode | enum-of-string | Default country code. |
SitePreferences | enableStorePickUp | Boolean | Toggles the availability of the in-store pickup feature in the store front. |
SitePreferences | storeLookupUnit | enum-of-string | Kilometer or Miles (default) - used to find the store near the zip code specified by the customer. |
SitePreferences | storeLookupMaxDistance | enum-of-string | Selected distance used to find the store near the zip code specified by the customer. |
Store | countryCodeValue | string | Used to create the shipment address in the basket from
the Store object. The value is based on the
values found in the form files (in the cartridge). |
Store | inventoryListID | string | Links the inventory list to the store object that represents the brick and mortar store. |
You can configure the above Site Preference attributes in the Business Manager Site Preferences module. See Configuring Storefront Preferences.
The following SiteGenesis cartridge files are used to implement the in-store pickup user interface, including templates, resource files, JavaScript files, stylesheets and images:
File type | File | Description |
---|---|---|
template |
cart.isml
|
Based on the value of the site preference for in-store pickup, this template shows a fourth column containing a radio button for in-store line items. |
productcontent.isml
|
Based on the value of the site preference for in-store pickup, this template shows a block on the product details page for showing the Check Availability link, the stores near the customer, and the availability of that product based on the entered zip code. | |
appresources.isml
|
Contains pipeline calls needed within app.js, and the js
object userSettings , which is used to hold the
zip code and preferred store that were stored in the session
object. |
|
coreresetstore.isml
|
Used if the correct resource can't be found. It renders a full page that enables the customer to select the preferred store that is to be stored in the session object. | |
coreshowselectedstore.isml
|
It renders a full page that shows the stores that can be selected based on the zip code entered by the customer. | |
corezipcode.isml
|
It renders a full page that enables the customer to select a zip code that will be used to determine which stores can be used as locations for in-store pickup | |
deliveryoptions.isml
|
Included on the cart page. It renders the radio buttons for assigning the line item as part of an in-store pickup or home delivery. | |
getprefferedstore.isml
|
Renders the response from the request for getting/setting the preferred store using Ajax. | |
getzipcode.isml
|
Renders the response from the request for getting/setting the zip code to the session objects using Ajax. | |
instoremessage
|
Renders the text boxes for in-store pickup when in the middle of the single shipping checkout using Ajax. | |
minishipments.isml
|
Contains a label for in-store pickup that is part of the order. | |
orderdetails.isml
|
Contains a label for in-store pickup, and shows the shipping cost. | |
orderdetailsemail.isml
|
Contains a label for in-store pickup. | |
multishippingshipments.isml
|
Contains code that shows a store message text box for in-store pickup orders and appropriate labels. | |
multishippingaddresses.isml
|
Shows in-store pickup orders with the address assigned when the customer is in the multi shipping checkout flow. | |
shippingmethods.isml
|
Contains logic to skip any shipping method with the ID of 005 to prevent the customer from selecting another shipping method for in-store pickup items. | |
singleshipping.isml
|
Conditionally shows the address form field when there is at least one physical shipment meant for home delivery. Shows the store messages text boxes for each shipment meant for in-store pickup. |
|
storeinventory.isml
|
Renders the response from the request for which stores have available inventory for the given SKU. | |
properties |
checkout.properties
|
Contains text related to in-store pickup. |
forms.properties
|
Contains text related to in-store pickup. | |
storepickup.properties
|
Contains text related to in-store pickup. | |
JavaScript |
app.js
|
Contains functionality related to in-store pickup. The
functionality is also controlled by the site preference for the
app.storeinventory object. |
css |
style.css
|
Contains in-store pickup related styles |
The following SiteGenesis cartridge files are used to implement the in-store pickup business logic, including pipelines, form definitions, and B2C Commerce script files:
File type | File | Description |
---|---|---|
xml (meta) |
catalog.xml
|
Contains the availableForInStorePickup
attribute for certain products (men’s pants). |
inventory_store_german_store.xml
|
Store inventory list for demo purposes | |
inventory_store_store[1 ...
11].xml
|
Store inventory lists for demo purposes | |
system-objecttype-extensions.xml
|
Contains attributes for the product, Store, SitePreferences, Shipment, and ProductLineItem objects. | |
shipping.xml
|
Includes the shipping method Store Pickup (id=’005’), which has a shipping cost of $0. | |
stores.xml
|
Contains values for the following custom attributes:
|
|
forms |
multishipping.xml
|
Contains rules for bind the in-store message to the multi-shipping form. |
singleshipping.xml
|
Contains logic to bind the in-store message to the single shipping form. | |
pipelines |
COshipping.xml
|
Contains logic to handle the store message form, and to configure the shipments that are intended for in-store pickup, via the following subpipelines:
|
StoreInventory.xml
|
Handles the requests for setting the preferred store, determines the stores available based on the entered zip code and the selected product, and handles setting the line item back to regular home delivery. | |
script |
CheckStoreInLineItems.ds
|
When the cart is being update with a new quantity, checks the item quantity against the inventory record of a particular store (using the storeID). |
checkout/Utils.ds
|
Copies a store address into a shipping address.
(this.storeAddressTo ) |
|
GetPhysicalShipments.ds
|
Contains logic to not count in-store pickups as physical shipments when determining if the checkout should be using multi-shipping or not. | |
InitSessionAddressBook.ds
|
Contains logic to prevent the store addresses from being added to the multi-shipping session addresses. | |
InStoreShipments.ds
|
Scans the basket and consolidates items that are going to the same store. It also creates shipments with the appropriate shipment type and method for the rest of checkout. | |
InventoryLookup.ds
|
Looks up the store inventory of the product. | |
MergeQuantities.ds
|
Contains logic to preserve the in-store pickups when the basket is being recreated from within the multi-shipping checkout process. | |
SeperateQuantities.ds
|
Contains logic to prevent the splitting of in-store pickups from within the multi-shipping checkout process. | |
SetStoreInLineItem.ds
|
Binds the line item with a store for an in-store pickup. | |
Utils.ds
|
Provides utility functions for the in-store pickup feature. |