-
Notifications
You must be signed in to change notification settings - Fork 248
Support of Store Pickup for Multi Source Inventory
- How does Store Pickup work from a Customer point of view
- How does Store Pickup work from a Merchant point of view
- Grooming meeting notes
- Race condition between orders
- Video of Store Pickup Grooming
- UI mockups
- GitHub tickets
Customer places an order and waits to receive a "Ready for pickup" e-mail. (This is a separate e-mail from the order confirmation.) Bring his ID, credit card, and order number to the store and pick up the ordered items.
At the time when the order is being placed on the "Shipping" step, we introduce an ability to choose "Store Pickup" out of allowed shipping methods.
We apply an assumption that each order should be fulfilled just from the only pickup location (which is considered as shipping address).
**Note: if some need to specify different pickup locations per cart item(-s), internally that could lead to functionality similar to Multi-Shipping (or integration with Multi-Shipping) when several orders created, for each corresponding pickup location.
In MVP functionality it's proposed to avoid integration with Multi-Shipping and provide an ability to choose a single Store Pickup location from Drop-Down box:
When Customer chooses pickup location Magento as before creates reservations for global stock (not to specific Source).
**Note: Maybe makes sense to add extension attribute to Order object and specify Source which should be used to fulfill the order OR we can detect the Source checking whether Shipping address matches the addresses of our Sources.
**Note: If there are not enough Qty on specified Source to fulfill the Order, an internal transportation from other sources should be made to the selected one. Say, our "Salable Quantity" on "Custom Stock" is 10 for SKU-1. "Custom Stock" consists of three sources:
- Source A, which contains 5 items of SKU-1
- Source B, which contains 4 items of SKU-1
- Source C, which contains 1 item of SKU-1
Altogether it gives us 5 + 4 + 1 = 10 If Customer has ordered 8 items of SKU-1 and chosen "Source A" for Store Pickup:
- the system will create Reservation for -8 for SKU-1 on "Custom Stock" (not Source A)
- merchant has to move 3 items of SKU-1 from Source B -> Source A to fulfill the order
- when required 3 items are moved to Source A (so, the order is fulfillable) merchant initiate delivery of "Ready for pickup" e-mail, which notifies Customer that he can come to the store to grab all ordered items.
A merchant should have the ability to specify which Sources support Store Pickup. To do so we have to introduce corresponding Extension Attribute for Source entity and provide an ability to specify one via both Admin UI on the Source editing page and Web APIs. Based on the attribute value (whether it set) we will add the corresponding Source to the Store Pickup Drop-Down list.
For orders placed with Store Pickup shipping method, we have to skip the Source Selection Algorithm step, as this information known in advance. But merchant has to be informed that there is not enough Qty to fulfill the order and internal shipping should be done to fulfill one, in the case when the selected source does not allocate all requested product Qty.
- It was decided that the described mechanism is good enough for Store Pickup MVP implementation
- Also we will add "Ready for Pickup" button to Order Admin page for orders created with Store Pickup method, click on this button will initiate email notification to customer if there are enough Qty on selected source to fulfill the order, if not merchant would be provided to use Source Selection algorithm to make Internal Transition (from Source B -> Source A in example above). Shipping address in this case is Selected Source (Source A).
- This internal shipment should NOT lead to compensational reservations to be created.
- Thinking in UX, it would be nice to customer choose if he will pickup product before fill the shipping address otherwise the customer will fill all shipping information that will be hide and replaced by store address.
- If the customer chooses store pickup, the billing address should be always different from the shipping address.
- It would be more accurate with Store Pickup support to call the step "Delivery Method" instead of "Shipping". Also would be a more applicable name for digital assets as well.
- About the dropdown to choose the store, the suggestion is to be like: search field and each option should display the store address with pickup time window so the customer can search by store address or name for example
To prevent a race condition between orders. Which could happen in a next case:
The "Salable Quantity" on "Custom Stock" is 10 for SKU-1. "Custom Stock" consists of three sources:
- Source A, which contains 5 items of SKU-1
- Source B, which contains 4 items of SKU-1
- Source C, which contains 1 item of SKU-1
Altogether it gives us 5 + 4 + 1 = 10 Now there are 2 Customers coming to the site to place orders:
- Customer 1 orders 2 items of SKU-1 and choose a general delivery method (NOT Store Pickup)
- Customer 2 orders 4 items of SKU-1 and choose as a delivery method Store Pickup
With current behaviour of Source Selection Algorithm it could happen that if Customer's 1 order would be processed first, the SSA may suggest to make Source deduction from "Source A" which will lead to insufficient Quantity of SKU-1 (5 - 2 < 4
) to fulfill the order placed by Customer 2.
To prevent this situation it's proposed to apply a rule that Store Pickup orders have higher priority than others, and SSA should work not with Source Availability Quantity, but with Source Availability Quantity minus all store pickup ordered quantities
. In the case above it means that SSA for Customer 1 order should take Order placed by Customer 2 into account even so Order 2 was placed later, and the inbound data for SSA would be:
-
Source A: 5 - 4 = 1
(subtract all store pickup items for this Source) - Source B: 4
- Source C: 1
- Magento MSI Open Grooming. December 12, 2018 Store Pickup support for MSI
- Magento MSI Open Grooming. March 21, 2019 Store Pickup support for MSI
Mockups - https://magento.invisionapp.com/share/MGPPI7MRJYN#/screens/337877902
Shipping page:
Label to find all In-Store Pickup related tickets - Store Pickup
Multi-Source Inventory developed by Magento 2 Community
- Technical Vision. Catalog Inventory
- Installation Guide
- List of Inventory APIs and their legacy analogs
- MSI Roadmap
- Known Issues in Order Lifecycle
- MSI User Guide
- 2.3 LIVE User Guide
- MSI Release Notes and Installation
- Overview
- Get Started with MSI
- MSI features and processes
- Global and Product Settings
- Configure Source Selection Algorithm
- Create Sources
- Create Stock
- Assign Inventory and Product Notifications
- Configure MSI backorders
- MSI Import and Export Product Data
- Mass Action Tool
- Shipment and Order Management
- CLI reference
- Reports and MSI
- MSI FAQs
- DevDocs Documentation
- Manage Inventory Management Modules (install/upgrade info)
- Inventory Management
- Reservations
- Inventory CLI reference
- Inventory API reference
- Inventory In-Store Pickup API reference
- Order Processing with Inventory Management
- Managing sources
- Managing stocks
- Link and unlink stocks and sources
- Manage source items
- Perform bulk actions
- Manage Low-Quantity Notifications
- Check salable quantities
- Manage source selection algorithms
- User Stories
- Support of Store Pickup for MSI
- Product list assignment per Source
- Source assignment per Product
- Stocks to Sales Channel Mapping
- Adapt Product Import/Export to support multi Sourcing
- Introduce SourceCode attribute for Source and SourceItem entities
- Assign Source Selector for Processing of Returns Credit Memo
- User Scenarios:
- Technical Designs:
- Module Structure in MSI
- When should an interface go into the Model directory and when should it go in the Api directory?
- Source and Stock Item configuration Design and DB structure
- Stock and Source Configuration design
- Open Technical Questions
- Inconsistent saving of Stock Data
- Source API
- Source WebAPI
- Sources to Sales Channels mapping
- Service Contracts MSI
- Salable Quantity Calculation and Mechanism of Reservations
- StockItem indexation
- Web API and How To cover them with Functional Testing
- Source Selection Algorithms
- Validation of Domain Entities
- PHP 7 Syntax usage for Magento contribution
- The first step towards pre generated IDs. And how this will improve your Integration tests
- The Concept of Default Source and Domain Driven Design
- Extension Point of Product Import/Export
- Source Selection Algorithm
- SourceItem Entity Extension
- Design Document for changing SerializerInterface
- Stock Management for Order Cancelation
- Admin UI
- MFTF Extension Tests
- Weekly MSI Demos
- Tutorials