Fluent Commerce Logo
Docs
Sign In

Location Workflow Templates

Workflow

Changed on:

13 Dec 2023

Overview

This article explains the logic that triggers the creation of a wave. Commonly, waves are created based on the fulfillment expiry time. Alternatively, the logic can be based on specific attributes of identified items (e.g. bulk items). Making this change can help facilitate a more efficient picking process according to the store layout.

User actions can be created throughout the wave process to reinforce specific business procedures. For example, we can ensure that in-store staff confirms the completion of the picking phase by using a confirmation dialogue box.

Domain Area:The Location workflow provides the capability to alter the pick and pack process to best suit business needs.

Package

Diagram

No alt text provided

Detailed Technical Description

Features

The base location workflow provides the following features:

Create a Wave

Create Wave based on the expiry time of the fulfilments. Add fulfilments to a wave, which will expire the soonest so that orders can be fulfilled in ascending order of their expiry time, and serve the online customers on a first in best-dressed principle.

  • it is possible to specify the expiry time frame in the workflow to create a wave. Example: Add fulfilments to wave that expire in 1 day. To add fulfilments to wave that will expire the soonest, you will need to specify the time as 0(Zero) in the workflow.
  • This feature helps you sort the fulfilments, on the storefront, in Fluent's servicepoint application, based on the criterion you want to use to fulfill your online orders - Example: you may choose to fulfill the fulfilments based on a delivery option, say Express Delivery/ or sales value.
  • Based on the criterion set in the location workflow, for adding fulfilments to a wave, the fulfilments meeting the criterion will be prioritized over other fulfilments waiting to be fulfilled.
Confirm Picks

Allocate picked items to fulfilments based on the expiry time of fulfilments. Allocate items to those fulfilments in a wave, which will expire the soonest so that orders can be fulfilled in ascending order of their expiry time, and serve the online customers on a first in best-dressed principle.

  • The criterion set above, for creating wave should match with the one set for allocating picked items to the fulfillment in the wave.
  • At this stage, when the picked items are confirmed and allocated amongst the fulfilments in the wave, the status of wave changes to PACK.
  • An event WavePack is sent to ALL Fulfilments of the wave - to commit the items confirmed for each fulfillment and change status of the fulfillment according to the number of items confirmed.
  • Example: If all items confirmed, then fulfillment status changes to FULFILLED.
Dispatch Waves

Pack stage is complete - Create Articles, consignment and book Couriers.

Create articles and consignment in the Fluent System for Home Delivery Orders and Click and Collect orders, that need to be transferred to a Collection Point from another fulfilling store, so that couriers can be booked and orders can be shipped to customers and collection points.

  • For clients booking couriers outside the scope of the fluent system, this will be an integration point and an event, same as internal event WaveDispatch will be required with Article and consignment information, for the workflow to create Article and Consignment within Fluent System and end the pick pack dispatch process.
  • The WaveDispatch event is initiated by the user action: Download Labels (for a wave containing HD orders only ) and user action: Confirm Orders (for a wave containing CC orders only ).
  • For a wave that has a mix of CC and HD orders - the user action will be Download Labels.
Complete Waves

Couriers are Booked, wave process is Complete.

Complete each wave after it has been processed successfully so that the completed waves and their corresponding fulfilments can be updated.

Interface Details

Create

Given a location has been created and is in the status ACTIVE

Source Entity 

Source/Source EventName 

To EventName

To Entity

Type

LOCATION

Location Workflow/ CREATE

EventAPI/ CREATE

LOCATION

Event API

1{
2    "name": "CREATE",
3    "description": "A location has been created. Activate the location.",
4    "type": "LOCATION",
5    "eventType": "NORMAL",
6    "rules": [
7        {
8            "name": "FLUENTRETAIL.base.ChangeState",
9            "props": {
10                "status": "ACTIVE"
11            }
12        }
13    ],
14    "triggers": [
15        {
16            "status": "CREATED"
17        }
18    ],
19    "userActions": []
20}

Language: json

Name: Location Sample

Description:

Create Location and Set status=ACTIVE


WaveCreate

Create a wave for the Active location.

Source Entity

Source/Source EventName 

To EventName

To Entity

Type

LOCATION

Servicepoint User Action/Location Workflow/ WaveCreate

Fluent Order Workflow

FULFILLMENT

User Action/Event API/WaveCreate

1{
2    "id": "1",
3    "name": "WaveCreate",
4    "accountId": "ACME",
5    "retailerId": "1",
6    "entityId": "123",
7    "entityRef": "F_123",
8    "entityType": "FULFILMENT",
9    "entitySubtype": "CC_PFS",
10    "entityStatus": "AWAITING_WAVE",
11    "type": "NORMAL",
12    "attributes": {
13        "rootEntityRef": "O_123",
14        "rootEntityType": "ORDER",
15        "rootEntityId": "123"
16    }
17}

Language: json

Name: WaveCreate Sample

Description:

CreateWave sample with status="AWAITING_WAVE"

PickConfirm / WavePack

items Confirmed in a wave/ Wave is in pack status in ServicePoint

Source Entity

Source/Source EventName

To EventName

To Entity

Type

WAVE

Location Workflow/ServicePoint/ PickConfirm

OrderApp / CC Workflow/ WavePack

FULFILLMENT

User Action Event / EventAPI

1{
2"name": "WavePack",
3"accountId": "ACME",
4"retailerId": "1",
5"entityId": "123",
6"entityRef": "F_123",
7"entityType": "FULFILMENT",
8"entitySubtype": "CC_PFS",
9"entityStatus": "ASSIGNED",
10"type": "NORMAL",
11"attributes": {
12    "rootEntityRef": "O_123",
13    "fulfilmentItems": [
14        {
15            "fulfilmentItemRef": "FI_1",
16            "orderItemId": "1",
17            "orderItemRef": "OI_1",
18            "skuRef": "PRD_1",
19            "requestedQty": 1,
20            "rejectedQty": 0,
21            "availableQty": 1
22        }
23    ],
24    "pickedItems": [
25        {
26            "skuRef": "PRD_1",//skuRef
27            "barcode": 123456,
28            "availableQty": 1
29        }
30    ],
31    "rootEntityType": "ORDER",
32    "rootEntityId": "123",
33    "barCodes": {}
34}

Language: json

Name: PickConfirm/ WavePack Sample

Description:

PickConfirm/ WavePack sample with status=ASSIGNED

WaveDispatch

Wave Dispatch started after the wave is picked and packed.

Source Entity

Source/Source EventName 

To EventName

To Entity

Type

WAVE

Location Workflow / WaveDispatch

OrderApp / WaveDispatchInitiated


User Action Event / EventAPI

1{
2    "name": "WaveDispatchInitiated",
3    "accountId": "ACME",
4    "retailerId": "1",
5    "entityId": "123",
6    "entityRef": "F_123",
7    "entityType": "FULFILMENT",
8    "entitySubtype": "CC_PFS",
9    "entityStatus": "FULFILLED",
10    "type": "NORMAL",
11    "attributes": {
12        "rootEntityRef": "O_123",
13        "rootEntityType": "ORDER",
14        "rootEntityId": "123"
15    }
16}

Language: json

Name: WaveDispatch

Description:

WaveDispatch sample with status=FULFILLED

WaveComplete / DownloadLabels

Complete the wave.

Source Entity

Source/Source EventName

To EventName

To Entity

Type

WAVE

Location Workflow / Servicepoint/WaveComplete

Location Workflow / WaveComplete

WAVE

User Action Event / EventAPI

1{
2    "name": "WaveComplete",
3    "accountId":"ACME",
4    "retailerId": "1",
5    "context": {
6        "entityType": "WAVE",
7        "entityId": "1",
8        "entityRef": "1",
9        "rootEntityType": "LOCATION",
10        "rootEntityId": "4",
11        "rootEntityRef": "LOC_4"
12    },
13    "attributes": []
14}

Language: json

Name: WaveComplete/ DownloadLabels

Description:

WaveComplete and Download Labels sample

MarkAsArrived / ArticleArrived

The article arrives in store and is awaiting Collection by Customer

Source Entity

Source/Source EventName

To EventName

To Entity

Type

ARTICLE

Servicepoint/ UserAction MarkAsArrived

Order Workflow/ArticleArrived

ARTICLE

EventAPI/ User action

1"userActions": [
2    {
3        "eventName": "ARTICLE_ARRIVED",
4        "context": [
5            {
6                "label": "MARK AS ARRIVED",
7                "type": "PRIMARY",
8                "modules": [
9                    "servicepoint"
10                ],
11                "confirm": false
12            }
13        ],
14        "attributes": []
15    }
16]

Language: json

Name: MarkAsArrived/ ArticleArrived

Description:

MarkAsArrived/ ArticleArrived sample with Article status

Cancel/ CancelUncollectedArticle

The article is canceled due to non-collection at the collection point, after a time frame set by the retailer.

Source Entity

Source/Source EventName

To EventName

To Entity

Type

ARTICLE

Servicepoint/ UserAction Cancel

Order Workflow/CancelUncollectedArticle

ARTICLE

EventAPI


1{
2    "retailerId": "<RETAILER_ID>",
3    "version": "1.0",
4    "entityType": "LOCATION",
5    "entitySubtype": "STORE",
6    "description": "Default Wave Workflow",
7    "versionComment": "Initial version",
8    "name": "LOCATION::STORE",
9    "rulesets": [
10        {
11            "name": "CREATE",
12            "description": "A location has been created. Activate the location.",
13            "type": "LOCATION",
14            "eventType": "NORMAL",
15            "rules": [
16                {
17                    "name": "FLUENTRETAIL.base.ChangeState",
18                    "props": {
19                        "status": "ACTIVE"
20                    }
21                }
22            ],
23            "triggers": [
24                {
25                    "status": "CREATED"
26                }
27            ],
28            "userActions": []
29        },
30        {
31            "name": "WaveCreate",
32            "description": "Create a wave for the location",
33            "type": "LOCATION",
34            "eventType": "NORMAL",
35            "rules": [
36                {
37                    "name": "<ACCOUNT_ID>.v2.CreateWaveByFulfilmentExpiry",
38                    "props": {
39                        "expireIn": 0,
40                        "statuses": [
41                            "AWAITING_WAVE"
42                        ]
43                    }
44                }
45            ],
46            "triggers": [
47                {
48                    "status": "ACTIVE"
49                }
50            ],
51            "userActions": [
52                {
53                    "context": [
54                        {
55                            "label": "Create Wave",
56                            "type": "PRIMARY",
57                            "modules": [
58                                "servicepoint"
59                            ],
60                            "confirm": false
61                        }
62                    ],
63                    "attributes": [
64                        {
65                            "name": "userName",
66                            "label": "Username",
67                            "type": "STRING",
68                            "source": "loggedInUsername",
69                            "mandatory": true
70                        },
71                        {
72                            "name": "maxCount",
73                            "label": "Order count",
74                            "type": "INTEGER",
75                            "source": "Settings.maxFulfillmentCountsForWave",
76                            "mandatory": true
77                        }
78                    ]
79                }
80            ]
81        },
82        {
83            "name": "PickConfirm",
84            "description": "Wave has been created.",
85            "type": "WAVE",
86            "eventType": "NORMAL",
87            "rules": [
88                {
89                    "name": "<ACCOUNT_ID>.gi.AllocatePickedItemsByFulfilmentExpiry",
90                    "props": {
91                        "eventName": "WavePack",
92                        "excludedStatuses": [
93                            "EXPIRED"
94                        ]
95                    }
96                },
97                {
98                    "name": "FLUENTRETAIL.base.ChangeState",
99                    "props": {
100                        "status": "PACK"
101                    }
102                }
103            ],
104            "triggers": [
105                {
106                    "status": "PICK"
107                }
108            ],
109            "userActions": [
110                {
111                    "context": [
112                        {
113                            "label": "Confirm pick",
114                            "type": "PRIMARY",
115                            "modules": [
116                                "servicepoint"
117                            ],
118                            "confirm": true
119                        }
120                    ],
121                    "attributes": [
122                        {
123                            "name": "pickedItems",
124                            "label": "Picked Items",
125                            "type": "STRING",
126                            "source": "",
127                            "defaultValue": "",
128                            "mandatory": false
129                        }
130                    ]
131                }
132            ]
133        },
134        {
135            "name": "WaveDispatch",
136            "description": "Pack stage is complete. Now booking couriers.",
137            "type": "WAVE",
138            "eventType": "NORMAL",
139            "rules": [
140                {
141                    "name": "FLUENTRETAIL.base.ChangeState",
142                    "props": {
143                        "status": "DISPATCH"
144                    }
145                },
146                {
147                    "name": "<ACCOUNT_ID>.v2.SendEventWithAttributesForAllFulfilments",
148                    "props": {
149                        "eventName": "WaveDispatchInitiated"
150                    }
151                }
152            ],
153            "triggers": [
154                {
155                    "status": "PACK"
156                }
157            ],
158            "userActions": []
159        },
160        {
161            "name": "CREATE",
162            "type": "WAVE",
163            "eventType": "NORMAL",
164            "rules": [
165                {
166                    "name": "FLUENTRETAIL.base.ChangeState",
167                    "props": {
168                        "status": "PICK"
169                    }
170                },
171                {
172                    "name": "FLUENTRETAIL.base.SendEventForAllFulfilments",
173                    "props": {
174                        "eventName": "WaveCreate"
175                    }
176                }
177            ],
178            "triggers": [
179                {
180                    "status": "CREATED"
181                }
182            ],
183            "userActions": []
184        },
185        {
186            "name": "WaveComplete",
187            "description": "Completes the wave",
188            "type": "WAVE",
189            "eventType": "NORMAL",
190            "rules": [
191                {
192                    "name": "FLUENTRETAIL.base.ChangeState",
193                    "props": {
194                        "status": "COMPLETE"
195                    }
196                }
197            ],
198            "triggers": [
199                {
200                    "status": "DISPATCH"
201                }
202            ],
203            "userActions": []
204        }
205    ],
206    "statuses": [
207        {
208            "name": "CREATED",
209            "entityType": "WAVE",
210            "category": "FULFILMENT"
211        },
212        {
213      "name": "ACTIVE",
214      "entityType": "CARRIER",
215      "category": "CARRIER"
216    },
217    {
218            "name": "",
219            "entityType": "FULFILMENT",
220            "category": "FULFILMENT"
221        },
222        {
223            "name": "PACK",
224            "entityType": "WAVE",
225            "category": "FULFILMENT"
226        },
227        {
228            "name": "ACTIVE",
229            "entityType": "LOCATION",
230            "category": "BOOKING"
231        },
232        {
233            "name": "PICK",
234            "entityType": "WAVE",
235            "category": "BOOKING"
236        },
237        {
238            "name": "DISPATCH",
239            "entityType": "WAVE",
240            "category": "DELIVERY"
241        },
242        {
243            "name": "CREATED",
244            "entityType": "LOCATION",
245            "category": "BOOKING"
246        },
247        {
248            "name": "COMPLETE",
249            "entityType": "WAVE",
250            "category": "DONE"
251        }
252    ]
253}

Language: json

Name: Location Store Workflow

Description:

Location Store workflow:

 Set of rulesets, triggers and actions in the Location workflow.

Version History

2023-08-01

This workflow is part of an alpha release and is not yet covered under the platform SLAs.

Copyright © 2024 Fluent Retail Pty Ltd (trading as Fluent Commerce). All rights reserved. No materials on this docs.fluentcommerce.com site may be used in any way and/or for any purpose without prior written authorisation from Fluent Commerce. Current customers and partners shall use these materials strictly in accordance with the terms and conditions of their written agreements with Fluent Commerce or its affiliates.

Fluent Logo