Replenishment flow
As your stores sell goods, these need to be replenished to avoid empty shelves. Replenishment is EVA's way of handling this necessity.
This document will go into the general concept of replenishment and covers all the options available to you, but if you are:
- looking for the how-to on configuring the replenishment levels for your products in EVA, please see our Product replenishment docs;
- looking for the initial replenishment of new stores, please see our Initial replenishment docs.
In EVA there are fundamentally 2 ways to achieve this:
- You create replenishment orders outside of EVA and push these towards us.
- You allow EVA to create automated replenishment proposals, which are converted into orders for your warehouse.
Pushing external replenishment orders
You can create your orders with a 3rd party tool and push these towards EVA by means of the following service:
SupplierCreatePurchaseOrder
You can read more about using this service in our Development docs.
Automated replenishment orders
EVA comes with functionality to create (automated) replenishment proposals out-of-the-box. These proposals are based on warehouse stock, store stock and pre-defined ‘min-max’ levels for each store.
EVA takes all this data into account and comes up with a proposal which can then either be edited, or automatically converted into an order for your warehouse to fulfill.
You can find a complete guide on all necessary steps for creating automated replenishment proposals below.
1. Set-up product min-maxes
When we talk about "min-maxes", we mean the minimum and maximum quantity of stock you want your stores to have in a regular situation.
Before proceeding, be sure to set the the setting Replenishment:UseReplenishmentProducts
to true.
EVA front end
EVA has a chapter dedicated to configuring your min-maxes for each product, you can read more about this in our Product replenishment docs.
EVA API
Alternatively, you can push the replenishment data via the ImportReplenishmentProducts
API.
2. Create a Replenishment supplier relationship
To determine which warehouse(s) supply which store(s) you need to create a so-called Supplier Relationship.
You can read more about this functionality in our Allocation docs.
3. Share warehouse stock levels with EVA
To make it possible for EVA to propose supplying a certain amount of stock from your warehouse(s), it of course first needs insight into warehouse stock levels.
This requires you to update the stock in EVA with data from your warehouse system t. For more information on stock updates, please see Updating stock in EVA.
4. Schedule a task for proposals
Admin Suite allows you to easily create and schedule tasks. Head over to the Control room module and open the Scheduled tasks chapter and create a new task. By searching for Replenishment, you'll get an overview of all replenishment related tasks.
For now we'll focus on Type CreateReplenishmentProposalTask.
- Name: Add a name that suits this task.
- Schedule: The schedule for the replenishment proposal is decided based on a cronjob (see also the related documentation). This timing determines when EVA starts calculating to create a proposal. This can take a few minutes.
Afterwards you can start adding the details for this task which consist of the following:
- SourceOrganizationUnitIDs: This EVA ID of the supplier of the replenishment (for example: your Warehouse, in case you have 1).
- SourceOrganizationUnitSetID: Alternatively you can have EVA create proposals based on multiple suppliers at once. To do so, create an Organisation Unit Set - and enter the EVA ID here.
- TargetOrganizationUnitIDs: This is the target of the replenishment, usually a store as defined by its EVA ID.
- TargetOrganizationUnitSetID: Alternatively you can have EVA create proposals for multiple stores at once. To do so, create an Organisation Unit Set - and enter the EVA ID here.
- StockLabels: This is the stock label you want to replenish. In 99% of cases it is Sellable stock, for which you enter a 1.
- OverrideOutputType: You can leave this blank.
- OutputTypes: You can leave this blank.
- EmailAddress: This email address is contacted in case of failures of the task.
Once you have filled out all required fields and clicked Save, you have successfully added an automatic replenishment. In the next section we explain how you can manually create a replenishment proposal.
There are a few other tasks you may want to set up, but which are ultimately optional (and you might have already done so while configuring your EVA environment):
StockReplenishmentAutoGenerateTask
- this will generate a Runner task to replenish stock on shelves from inside your store's storage room.StockReplenishmentExpireTask
- this determines how long the above runner task should be available before expiring.ExportReplenishmentProducts
- this task is responsible for the export of your Replenishment products (their min-max values) to your Data lake, allowing for validation in any 3rd party tools.
5. Order orchestration
Because EVA needs to know your preferences for which warehouse(s) to route your order to, you need to have Order orchestration in place.
Basically, all you need is an orchestration sheet like the following example.
fulfillment WarehousePurchaseOrders
action 'EXPORT_ORDER'
option OrderIntents as 'Purchase'
scope Supplier
#require Supplier.Type = 'Supplier' and Supplier.ID = Order.SoldFromOrganizationUnit.ID
require [Supplier.Type] = 'Warehouse' and [Supplier.ID] = [Order.SoldFromOrganizationUnit.ID]
data ExporterName as 'WAREHOUSE'
6. Configure the outputs
Based on the proposal EVA can perform various actions, which you can configure by specifying their corresponding values in the Replenishment:Outputs
setting.
Possible options are:
- Debug: Informative Excel file, all lines are logged
- Info: Informative Excel file, only replenished lines are logged
- PurchaseOrder: Purchase Order Excel file, can be manually edited, see next section
- PurchaseAutoOrder: Auto-generate the purchase order (this replaces steps 7, 8 and 9 below)
- If you're using Unified orders, then this output will auto-generate the order and place it. This means you will not be able to edit the order anymore.
- If you want to remain able to edit the order, please set
Replenishment:PlaceGeneratedPurchaseOrder
to false additionally. This output will then cause the order to be created but requires you to place (and export (see step 9)) it yourself.
- PurchaseAutoOrderAutoConfirm: Auto-confirm the generated purchase order (replacing step 10), requires PurchaseAutoOrder
These outcomes can be combined by simply adding all of the required OutputTypes as values.
For example:
Debug, Info, PurchaseOrder, PurchaseAutoOrder
7. Review your proposal and edit an order (optional)
To see the outcome of your proposal (after the task has ran) go to the Stock module's Proposal chapter. It will lead you to a list of all current proposals.
By entering an individual proposal, you can check its details which include the following:
On the top you can see 2 files:
- The Debug file opens an Excel with all paramaters on which the proposal was based.
- Note that editing this file has 0 impact. Its only purpose is to be informative.
- Note that editing this file has 0 impact. Its only purpose is to be informative.
- The Purchase Order file is the actual purchase order you can upload for your warehouse.
- This file can still be edited.
The AutoShip/AutoReceive options are likely not needed; you'd likely want your warehouse to signal the shipment of the order, and the store to confirm received.
8. Uploading the order (optional)
In case you want to manually upload the Orders created through the proposals, go to the Stock module, Purchase Orders and click the 'upload' icon in the top right.
Upon placing the order, a signal is sent to the warehouse to start exporting.
After placement, any changes to the order won't reach the warehouse unless forcefully exporting it again.
Inform your users to not edit orders after placement. Some level of modification is possible via services, as explained in the following section.
9. Exporting the order and later edits
Once exported, EVA sends a signal to an endpoint defined by you. This message should contain most, if not all, information to create the pickticket.
You can read more about exporting to external warehouses in the Warehouse order exporter docs.
You can touch order lines (e.g. ModifyQuantityOrdered
) and add new items via API (AddPurchaseOrderLines
), but only before the order is confirmed (see next step).
There are a few settings that let you set limits to modifications of the orders after exporting. You can read more about those in detail here.
10. Confirming the order
Either a manual step or a ConfirmPurchaseOrder
service call by the warehouse lets you Confirm the final order, after which it cannot be edited anymore.
11. Shipment of the order
Shipment of the order from the warehouse system is to be confirmed via the ShipExternalOrder
API, which you can read about in detail in ShipExternalOrder docs.
This step (and matching docs page) also offers some options for cancellation of lines, due to a mispick for example.
Orders based on a Replenishment Proposal created in EVA already have a BackendID filled. If you still want to make a connection to an order/shipment number from your warehouse system, you can for example store it on a CustomField on the Shipment.
This way you can still connect outgoing shipments (and their financial value) to their receipt in the store via EVA Cookbook.
12. Receival of goods in store
The receipt of goods is done via EVA’s Companion or Tasks App.
Automated cancellation and recreation of proposals
By setting Replenishment:CancelPreviousUnplacedPurchaseOrders
to true, you allow EVA to automatically cancel old (unplaced) replenishment proposals and create new ones better suited to the current situation.
Specifically: when set to true, previous unplaced replenishment orders (last 14 days) will be cancelled before the new orders are created for a new replenishment proposal. This is because replenishment takes incoming orders into account - so old replenishment orders influence your new replenishment.
The flow when set to false:
- Replenishment creates order to order 6 products
- 1 product gets sold
- Next day: replenishment creates order to order 1 product
When set to true:
- Replenishment creates order to order 6 products
- 1 product gets sold
- Next day: previous order gets cancelled (if not placed) and replenishment creates order to order 7 products