Guide for unified commerce

In this guide you will learn how to integrate your Omnichannel flows.

ENDLESS AISLE

If you have completed the above integration points (master data, price, deliveries and stock levels) you should be well of to start using Front Systems POS with the most common retail functionalities.

In case you are sold out in store of of an item your customer want, you can still sell from other stores or the online store.
Using endless aisle feature in Front Systems is easy for the store associate, and it depends on some basic integration points which is covered in this section to get it up and running in your POS.

The only thing actually happening in the pos is the placing of the online order and taking payment from the customer. The rest is completed in your eCom OMS (Order management system) where you send out order confirmation and eventually a shipment confirmation. Just like a normal online order.

Heres a summery of what you need to integrate

  1. Enriched master data (images and descriptions of products) REQUIRED

  2. Stock availability in online store and other stores REQUIRED

  3. Create Online order in your eCOM / OMS REQUIRED

  4. Search for customers in your CRM OPTIONAL

Step 1. Enriched master data

To enable your store associates to use front systems as a sales tool, they need to able to see the same images and product descriptions you already have available on your web shop.. Out of the box, Front Systems support the  PIM , InRiver. If that’s your PIM, jackpot! Just send the Api-token to your Front Systems contact person and we will have the integration up and running in no time. In case you have another PIM or you would like to control the integration your self, then go ahead and read.

Loop through your products and update them using
PUT /api/Products

Include only images and description in the body if you only are updating those.
In case you dont have the Front Systems ProductId, then look it up by using the GetProductByGTIN endpoint.

Example update payload

{
"description":" "Our model is 186cm long and is wearing a Medium",
"images":" [
"https://yourpimsourceurlexample/1",
"https://yourpimsourceurlexample/2",
"https://yourpimsourceurlexample/3"
]
}

TIP: The first url in the images array will be set as the main image in Front Systems.

Step 2. Stock levels from eCom

You need to show your store associates what's available online of course.
You do this by mirroring your online store stock levels in a separate stock in Front Systems which is used for Endless aisle sales.
Reach out to your Front Systems contact to get the virtual eCom stock setup and the pos configured toward this stock. Get hold of the Front Systems stockId which you will update as often as you want using the following endpoint.

Update stock level
POST /api/Stock/adjust
NOTE: When doing updating, you must keep items at max 1000 per request.
{
"description": "Stock adjust from online store",
"stockId": 123,
"items": [
{
"gtin": "7020580008718",
"quantity": 5
}
]
}
When doing partial updates, please just include the items which had stock movements since last request.
This way you limit the amount of items included.

 Once per night you can run a  “isCompleteStockCount": true and bring all items in the count and leave all with qty 0.
This will reconcile any issues during the incremental updates which must run quite often. (eg. once per minute)


Step 3. Create Online order in your eCOM / OMS

REQUIRED

When an order is placed from the Front Systems POS, a new order is created in the eCom with already payment and customer info attached.

This is completed by you subscribing to the endless aisle web hook. As soon as a sale is completed in a pos, a web hook with all sales details are sent to your subscribing endpoint. When you receive the data, you can simply create the online order in your eCom/OMS platform including the payment.
Make sure to include the transaction id (txtRef) so you bring the payment transaction reference into the order that you create.

Subscribe to endless aisle sales in pos using webhook
POST /api/Webhooks

Heres an example how to subscribe to an endless aisle webhook

{
"event": "OmniChannelEndlessAisleOrderCreated",
"url": "https://yourcallback.com/url"
}

{
"order": {
"billingAddress": {
"address1": "Konvallveien 27",
"city": "Oslo",
"country": "Norway",
"countryCode": "NO",
"first_name": "Haakon",
"last_name": "Skavhaug-Flender",
"province": "",
"zip": "1234"
},
"customer": {
"email": "haakon@flender.no",
"first_name": "Haakon",
"last_name": "Skavhaug-Flender",
"phone": "90194364",
"phoneCountryCode": "47"
},
"paymentLines": [
{
"amount": 1500,
"currency": "DKK",
"currencyTendered": 1500,
"subType": "mc",
"txRef": "UPD7001620741609002", <---- This is the transaction id. Eg Adyen
"type": "Card"
}
],
"receiptNo": 700000004,
"saleDateTime": "2021-05-11T15:59:48.308471+02:00",
"salesLines": [
{
"fullprice": 800,
"gtin": "5711452361117",
"price": 800,
"quantity": 1,
"shipFromOnlineStore": false, <---- Exclude all salesLines with false
"vat": 160
},{
"fullprice": 800,
"gtin": "5711452361118",
"price": 800,
"quantity": 1,
"shipFromOnlineStore": true, <---- True here means its an endless aisle sales line
"vat": 160
},
],
"shippingAddress": {
"address1": "Konvallveien 27",
"city": "Oslo",
"country": "Norway",
"countryCode": "NO",
"first_name": "Haakon",
"last_name": "Skavhaug-Flender",
"province": "",
"zip": "1234"
},
"storeInfo": {
"country": "Denmark",
"countryCode": "DK",
"currency": "DKK",
"posId": 4700,
"posName": "",
"salesPerson": "",
"storeInfo": "092001",
"storeName": "SS DK Studiestræde TEST",
"storeNo": "SSDK01"
}
}
}

Step 4 Search for customer in CRM

OPTIONAL

Allowing store associates to quickly lookup existing online customers is very convenient when it comes to placing endless aisle orders, because they dont need to ask for a lengthy address description when placing the order. They can simply search for the customer by phone number or email, and then the POS will return all customer data in a split second from your existing CRM/Loyalty solution.

This integration is setup by Front Systems , so please contact your Front systems contact person, to set it up.

Currently we support SalesForce, Voyado and Placewise out of the box.

Digital receipts

Offering your customers a digital receipt is quite cool and you should offer your customer that. The most important thing to acknowledge is that you need to have a 3rd party email service (eg. CRM) for your own domain which will be doing the email sending. This way, you can mange your email look and feel all on your own.

What you need to do is to subscribe to the receipt web hook. As soon as a sale is completed in a pos and the store associate selects email receipt, a web hook with all sales details are sent to your subscribing endpoint.

Subscribe to digital receipt webhook
POST /api/Webhooks

Heres an example of payload to subscribe to digital receipts.

{
"event": "OmniChannelSendReceiptCreated",
"url": "https://yourcallback.com/url"
}

In case you want to send digital receipts on SMS, thats also possible. Either you can use Front Systems built-in SMS-functionality or in case you have your own SMS-service, you can use that. Let us know what you prefer, and we will configure your preferred setup.

This is how the payload looks like which will be sent to your subscribing endpoint when email/sms receipt is selected in the POS.

{
"sendReceipt": {
"receiptNo": "434000004",
"receiptFormatted": "<ArrayOfPrintLine xmlns=\"http://schemas.datacontract.org/2004/07/KTKservice\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><PrintLine><PType>Bitmap</PType><Value/></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine><PrintLine><PType>SmallCenter</PType><Value>Showroom AS</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>Bogstadveien 12</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>0205 Oslo</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>Tlf.: 22556444</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>showroom@frontsystems.no</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>showroom.frontsystems.no</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>Org.no.: 123456789</Value></PrintLine><PrintLine><PType>SmallCenter</PType><Value>Foretaksregisteret</Value></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine><PrintLine><PType>BigCenterBold</PType><Value>SALGSKVITTERING</Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value> </Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value>Tid: 2021.09.27 15:08 Kvittnr.: 0434000004</Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value>Ant. Vare Rab. Pris</Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value> 1 M Jean Paul Jacket Etienne Kåpe 001 2,999.00</Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value> </Value></PrintLine><PrintLine><PType>SmallLeftBold</PType><Value>Total: 2,999.00</Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value>Her av MVA 599.80</Value></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine><PrintLine><PType>SmallLeft</PType><Value>MVA sammendrag:</Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value> 25.0% 599.80</Value></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine><PrintLine><PType>SmallLeft</PType><Value>Oppgjør:</Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value> Kontant 2,999.00</Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value> </Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value>POSID: 5434 </Value></PrintLine><PrintLine><PType>SmallLeft</PType><Value>Du ble hjulpet av: Mari </Value></PrintLine><PrintLine><PType>SmallLeftUnderline</PType><Value> </Value></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine><PrintLine><PType>BigCenter</PType><Value>Takk for handelen og velkommen tilbake!</Value></PrintLine><PrintLine><PType>Barcode</PType><Value>SC434000004</Value></PrintLine><PrintLine><PType>Feed</PType><Value/></PrintLine></ArrayOfPrintLine>",
"receiptUrl": "https://r.frontsystems.com?id=df57b301-8162-4687-9216-70be78ffb38e",
"orderNo": null,
"createdDateTime": "2021-09-27T15:08:20.947328",
"updatedDateTime": null,
"paymentLines": [
{
"type": "Cash",
"subType": null,
"text": "",
"amount": 2999.0
}
],
"orderLines": [{
"rowId": "75590552",
"gtin": null,
"brand": "Jean Paul",
"name": "Etienne Kåpe",
"variant": "001",
"number": "jp_123",
"colour": "Svart: Meteorite Grey",
"size": "9",
"sizeText": "M",
"group": "Jacket",
"season": "S2021",
"imageUrl": "https://image.frontsystems.no/05f687c7-5666-48ce-a760-59dce59b9fca/08bae3d7-f8f9-4388-9c21-a68796f38224.jpg",
"quantity": 1.0,
"price": 2999.0,
"vat": 599.8,
"vatPercent": 0.25,
"fullPrice": 2999.0,
"discount": 0.0,
"discountPercent": 0.0,
"receiptLabel": "M Jean Paul Jacket Etienne Kåpe 001",
"shipFromOnlineStore": false
}
],
"store": {
"storeExtId": "2066",
"storeName": "Showroom AS",
"organizationNumber": "123456789",
"posId": 5434,
"posName": "Fixed Pos 01",
"salesPerson": "Mari",
"currency": "NOK",
"address": {
"address1": "Bogstadveien 12",
"city": "Oslo",
"postalCode": "0205",
"country": "Norge",
"countryCode": "NO"
}
},
"customer": {
"email": "",
"firstName": "",
"lastName": "",
"companyName": "",
"phoneCountryPrefix": "",
"phone": "",
"address": {
"firstName": "",
"lastName": "",
"address1": "",
"city": "",
"postalCode": ""
}
},
"shippingAddress": {
"firstName": "",
"lastName": "",
"address1": "",
"city": "",
"postalCode": "",
"country": "Norge",
"countryCode": "NO"
},
"vatTotal": 599.8,
"total": 2999.0
},
"channel": "Email, <===== Can be either Email or SMS based on what the store associate selects for the sales transaction.
"recipient": "haakon@frontsystems.com", <=== if channel is Email, then its an email here. If its sms then its a phone number in the format like <CountryCodePrefix Phonenumber> eg. "47 12345678"
"recipientName": "haakon@frontsystems.com",
"signatureInfo": {
"signature": "ULwIVhYcpDB7W8idr/4nnRxyCO/tCOeIlfXpVi1qmW5Wjb+WZAFLXu5S5IAI+LSfgKn5dhvZGVLuHrWTKII9WkRQsgi5D2KHA7NHyqZ2KnDRr4lPA5anToBdnhME8M/S2BAFcKsmh3767iMrtyZryACmREHbJ80WRjMAHVhK7DI=",
"keyVersion": "2"
}
}


Buy online return in store (BORIS)

Description coming. Please contact for instructions

Buy online pickup in store (BOPIS)

Offering consumers a way to pickup their online orders instore increases customer flexibility and also drives more footfall to your store.
Todays shoppers demands rapid deliveries and for you to accomodate for that, you need to make it super easy for all associates to process such orders quickly.

To enable this in your Front Systems, you need to complete these integration steps:

  1. Expose in-store stock levels to eCom.

  2. Send new online orders to Front Systems

  3. Adjust in-store stock level

  4. Subscribe to order fulfillment updates

Step 1. Expose in-store stock levels to eCom

When you are allowing consumers to place "pickup in store"-orders, its super important that the stock levels are correct.
To do so, you need to setup an integration so your eCom keeps stock levels up to date in real time.
The best approach to reach real time stock levels is by subscribing to web hooks and periodically (eg. every 24hour) pull all stock levels.

To learn how to pull stock levels and subscribe to stock level changes from all stores, please read the section Stock levels and stock movements

Step 2. Send new online order to Front Systems

When the online order is placed in the eCom, you need to make sure that the relevant store receives the order so the store associates are notified and eventually can process it.
To be able to send the order to the relevant store, you need to have the Front Systems StoreId.
You need to setup a new "Integration User" in the Front Systems Portal. This is how:

  1. Login to the Portal (http://portal.frontsystems.no)

  2. Go to Admin > Integration users and click New Integration User

  3. Give it a descriptive name like "Pickup in Store-order"

  4. Select type company and then save and generate the token.

Use this token together with the header X-StoreId:<StoreId> for the request to the endpoint listed below

Create new Order
POST /api/Omnichannel
HEADER
x-api-key: ***
Ocp-Apim-Subscription-Key: ***
X-StoreId: <Get this from GetStores endpoint for relevant store>

with a payload like this

{
"orderNo": "1411",
"billingAddress": {
"address1": "Lysaker Torg 123",
"address2": null,
"city": "Lysaker",
"comment": null,
"companyName": null,
"country": "Norway",
"countryCode": "NO",
"firstName": "Marius",
"lastName": "Lindholt",
"postalCode": "1366",
"province": ""
},
"comment": null,
"customer": {
"companyName": null,
"email": "show@frontsystems.com",
"firstName": "Marius",
"lastName": "Lindholt",
"phone": "459 75 268",
"phoneCountryCode": "47"
},
"orderLines": [
{
"fullPrice": "1799.00",
"gtin": "7050250949362",
"price": "1799.00",
"quantity": "1",
"status": "0", <==== 0 means its unfulfilled
"vat": "0"
}
],
"paymentLines": [. <==== The sum of paymentLines must exactly match the sum of OrderLines.
{
"amount": "1799.00",
"currency": "NOK",
"currencyTendered": "1799.00",
"subType": "Visa",
"txRef": "",
"type": "Card"
}
],
"receiptUrl": "",
"saleDateTime": "2021-09-08T11:57:16+02:00",
"updatedDateTime": "2021-09-08T11:57:16+02:00"
"status": 0,
"store": {
"address": "",
"currency": "",
"organizationNumber": "",
"posId": 0,
"posName": "",
"salesPerson": "",
"storeName": "",
"storeExtId": ""
}
}

Step 3. Subscribe to order fulfillment updates

When the Store associate either updates the order status with "Ready for pickup", "Mark as picked up" or "Declined", your eCom/OMS must reflect that.

With any of those statuses received from Front Systems webhooks, your eCom/OMS can treat them respectively.
Eg.
"Case Ready for Pickup" then notify customer of ready for pickup with pickup instructions.
"Case Mark as picked up", then notify customer that its picked up and capture payment. (TIP: You might want to do the payment capturing at the time when store associcate clicks Ready for pickup in case they forget "mark as picked up". Else you can end up loosing some money
"Case declined", then notify customer and refund the reservation.

Its super easy to subscribe to these events. Just complete these easy steps

Subscribe to Order updates webhook
POST /api/Webhooks

Heres an example of payload to subscribe to order updates

{
"event": "OmniChannelOrderUpdated",
"url": "https://yourcallback.com/url"
}

The payload you receive will be like this

{
"order": {
"OrderId": "1412",
"Id": "cbbff93d-9875-4e20-9990-7ba99b078c6c",
"Status": 2, <== 1:"Picked Up", 2:"Ready for pickup", 3:"Declined"
"OrderLines": [
{
"Quantity": 1,
"GTIN": "7050250949362",
"Id": null,
"Status": 2 <== 1:"Picked", 2:"Declined"
}
]
}
}

Watch Video of BOPIS

Buy online ship from store (BOSS)

Description coming. Please contact for instructions