Developer platform

Building your Bot on iAdvize

Let your bot interact with online visitors directly within iAdvize’s chatbox. The Bot plugin enables iAdvize's Admins and Managers to create users with the role “bot” from iAdvize’s administration. The scenario and availability of the bot are managed by your app.

In a nutshell, the Bot plugin:

  • Allows bots providers to create their connector thanks to the Developer Platform
  • Allows customers to connect their iAdvize account to a bot provider and connect bots seamlessly. These bots interact with iAdvize like a human agent

Bot plugin

What is a bot at iAdvize ?

A bot is a regular agent. It has all the properties of an agent and can interact with visitors.

Bots can

Among other things, bot are able to:

  • Be available to chat.
  • Handle a conversation in one language.
  • Reply to a user:
    • ask questions and act on replies;
    • send rich content such as links, carousels, and much more;
    • schedule messages to be sent later on;
  • Escalate a conversation to another operator.
  • Prequalify some visitor data (identification number, email address…).
  • And much more !

Bots cannot

This is what bots are not able to do:

  • Send a message directly to the user (reply only mode)
  • Be part of a conversation at the same time than another agent

Create and configure a bot in iAdvize

To be able to create a bot on the iAdvize platform, you will need to:

  • 1 - Create a bot application, in the dev platform
  • 2 - Browse, find and install this newly created bot application, in the marketplace tab of your iAdvize administration
  • 3 - Create a bot agent selecting the freshly installed bot application
  • 4 - Configure some rules to route incoming conversations to your bot

⚠️ In order to be be able to complete this process you will have to implement the Bot creation flow first (or you will be stuck at the “Create bot agent” step) ⚠️

In the dev platform

Creating a bot application in the developer platform is quite straightforward.

Create a bot connector

First, you hav to be logged in. Then go to “My apps” section, and click on “Build”. In our case we will call it “My bot”. To build a bot, you need to go to “Plugins” then select “Bot”. You have just one URL to set: the base URL of your connector. All the requests will go to this URL. Note that it has to be secured with HTTPS.

Click on save and… congratulations! You created your bot application. Of course this is just a stub. If you want this to be fully functional you have to implement the flows listed in the “Implement a bot” section (link). Create bot connector

In the admin

Install the bot connector

​​In the admin, go to “Apps” and mind to select the project you want to install your connector on. In the list, find your connector, in our case the “My bot” section. Click on the card. You should land on an installation page such as:

Install a bot connector

You just have to click on “Install” and go through the installation process. Finalise the installation by clicking on “Install” and you are done. You just enabled some bot capabilities on the project you selected. It means that from now on, you can create an operator of type Bot 🎉.

Create a bot agent

Now, create a new routing group (a group of agents). Go to “Routing” then select “Routing groups” in the upper left corner. Click on the “➕” and create a group “All bots”, including all the agents of type “Bot” such as:

Create a bot agent

Note: a bot operator is associated to ONE and only ONE language. So if you want your bot to answer several languages, you have to create multiple bot operators.

Chat with your bot

To be able to chat on iAdvize you need to take several steps:

    1. Install the iAdvize tag on your website
    1. Create a campaign
    1. Create a targeting rule (when to show the chat notification to the visitor)
    1. Create a distribution group (to distribute conversations to your bots)
    1. Define a distribution rule (to route the conversations to your bots)

Set up the iAdvize tag

In the admin, go to “Engagement”. Create a new campaign such as: Create a bot campaign

Create a targeting rule

Now we need to define “engagement rules” i.e. how to target the visitor. Click on the “➕” and create a rule “Bot”. In our case, we will define that the button is being displayed when the current url contains the name “bot”. Which means you can add ?bot to any url and it will display the notification. Create a targeting rule Add the rule, and publish your campaign.

Create a routing group

Now, create a new routing group (a group of agents). Go to “Routing” then select “Routing groups” in the upper left corner. Click on the “➕” and create a group “All bots”, including all the agents of type “Bot” such as: Create a routing group Note: if it is setup correctly, you should see “1 agent match in your segment”. If not, make sure that your bot is associated with the skill “Bot” we created during the bot creation process.

Create a distribution rule

To finish, we need to create a targeting rule. Go to “Routing”, in the upper left select picker, select “Routing rules” and create a rule “Bot targeting”, for the “Bot” notification, that will handover the conversations to the agents of group “All bots”. Such as: Create a bot distribution rule

Check that everything is correctly setup

​​Go to “Campaigns” and click on the “edit” button. If you did everything correctly you should see that your campaign is routed this way:

Check targeting rule

Last but not least, make sure that your bot is available. Go to “People”, look for “Botty” in the list and check the status: Check bot availability

To sum up, you created a campaign that you associated some engagement rules (when the visitor will see the notification) with, some targeting rules (to which agents the conversations should be handed to).

Last but not least let's trigger the chat. Go to the website you installed the iAdvize tag on. Just append ?bot to the current url and reload the page. You should see the chat. You are ready to chat ! 🎉

Implement a bot

To have a fully functional bot, you will be required to implement two distinct sets of endpoints:

  • several endpoints to create and configure your bot from iAdvize UI
    • GET /external-bots to list available scenarios
    • PUT /bots/operatorId to create a bot
    • GET /bots/operatorId to retrieve a bot details
    • GET /availability-strategies to define when the bot is available
  • two endpoints to handle a conversation flow
    • POST /conversations/ to create a new conversation
    • POST /conversations/conversationId/messageId to reply to a user

Implement the bot creation flow

A bot gets created when an admin creates a new agent of type “Bot” under the “People” section. Several information are required to be able to create a bot:

  • which scenario it can be associated to
  • what is the availability strategy associated to the bot

Bot creation flow

List available scenarios

First, you need to implement the GET /external-bots endpoint to list all the scenarios a new bot can be associated to. This route is called by iAdvize during the bot creation process and the result will appear directly in the scenario select picker.

⚠️ A scenario can only be associated to only one bot agent, which means if you have two bot operators, you need to provide at least two scenarios. ⚠️

Request - GET /external-bots

Query parameterInDescriptionTypeExample
idConnectorVersionQueryConnector version identifierUuidc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryProject identifier on which your connector is installed onStringha-123

Expected Response format

FieldInDescriptionTypeRequiredExample
idBotBodyScenario identifier in integrator environment.Stringmy_scenario_id_1
nameBodyName of the scenarioStringScenario 1
descriptionBodyShort description of the scenarioStringThis scenario will ask your customers to provide some data about their orders
editorUrlBodyUrl of integrator bot editor interface, useful if you have a UI for editing scenariosStringhttp://your-saas/editor/my_scenario_id_1

Expected response example

[
    {
        "idBot": "my_scenario_id_1", 
        "name": "Scenario 1",
        "description": "In this scenario, the bot will ask your customers to provide some data about their orders",
        "editorUrl": "http://your-saas/editor/my_scenario_id_1"
    },
    {
        "idBot": "my_scenario_id_2",
        "name": "In this scenario, the bot will ask your customers to provide some data about their orders",
        "editorUrl": "http://your-saas/editor/my_scenario_id_2"
    }
]

Note: you can validate your response data format with the associated json schema.

It will look like this in the UI.

Scenario select picker

Create and modify a bot

This endpoint is being called when a user finalises the bot creation or when bot information are being updated (such as name, scenario association…).

Request - PUT /bots/:idOperator:

ParametersInDescriptionTypeExample
idOperatorPathiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
idConnectorVersionQueryConnector version identifierUuidc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryProject identifier on which your connector is installed onStringha-123
FieldInDescriptionTypeExample
nameBodyBot name on your platformStringMy bot
pseudoBodyBot pseudo used during the conversationStringBotty
languageBodyLanguage spoken by the botString - ISO 3166-1 alpha-2fr
external.idBotBodyExisting bot unique identifier for this connectorStringha-456678

Request example

{
    "name": "My first bot !",
    "pseudo": "Botty",
    "language": "fr",
    "external": {
        "idBot": "ha-456678"
    }
}

Response format

FieldInDescriptionTypeRequiredExample
idOperatorBodyiAdvize bot operator identifierStringha-456678
externalBodyAssociated scenarioExternal
external.idBotBodyBot identifier on your platformStringmy_scenario_id_1
external.nameBodyBot name on your platformStringScenario 1
external.descriptionBodyBot description on your platformStringIn this scenario, the bot will ask your customers to provide some data about their orders
external.editorUrlBodyBot edition url on your platformString - URLhttp://your-saas/editor/my_scenario_id_1
createdAtBodyCreation date of you botString - ISO 86012017-11-22T12:04:00Z
updatedAtBodyLast modification date of your botString - ISO 86012017-11-22T12:04:00Z

Response example

{
    "idOperator": "ha-456678",
    "external": {
        "idBot": "my_scenario_id_1", 
        "name": "Scenario 1",
        "description": "In this scenario, the bot will ask your customers to provide some data about their orders",
        "editorUrl": "http://your-saas/editor/my_scenario_id_1"
    },
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:04:00Z"
}

Note: You can validate your response data format with the associated json schema.

Get bot

When an admin wants to edit a bot user, we have to first load the existing information related to this bot. The GET endpoints allow you do give back those information.

Request - GET /bots/:idOperator:

ParametersInDescriptionTypeExample
idOperatorPathiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
idConnectorVersionQueryConnector version identifierUuidc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryProject identifier on which your connector is installed onStringha-123

Response format

FieldInDescriptionTypeRequiredExample
idOperatorBodyiAdvize bot operator identifierStringha-456678
externalBodyAssociated scenarioExternal
external.idBotBodyBot identifier on your platformStringmy_scenario_id_1
external.nameBodyBot name on your platformStringScenario 1
external.descriptionBodyBot description on your platformStringIn this scenario, the bot will ask your customers to provide some data about their orders
external.editorUrlBodyBot edition url on your platformString - URLhttp://your-saas/editor/my_scenario_id_1
createdAtBodyCreation date of you botString - ISO 86012017-11-22T12:04:00Z
updatedAtBodyLast modification date of your botString - ISO 86012017-11-22T12:04:00Z

Response example

{
    "idOperator": "ha-456678",
    "external": {
        "idBot": "my_scenario_id_1", 
        "name": "Scenario 1",
        "description": "In this scenario, the bot will ask your customers to provide some data about their orders",
        "editorUrl": "http://your-saas/editor/my_scenario_id_1"
    },
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:04:00Z"
}

Get availability

This endpoint will be called on a frequent basis (as of now, every second) and will indicate whether a bot agent is online or not, hence being its availability.

Request - GET /availability-strategies

ParametersInDescriptionTypeExample
idOperatorQueryiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
idConnectorVersionQueryConnector version identifierUuidc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryProject identifier on which your connector is installed onStringha-123

Response format

FieldInDescriptionTypeRequiredExample 1Example 2
strategyBodyHow we should aggregate the availability if several distribution rules are providedOne of: atLeastOne, all, notAvailable, customAvailabilityatLeastOnecustomAvailability
distributionRulesToCheckBodyAll distribution rules we should check for availability. This is subset of DistributionRules returned by the Get bot endpoint.Array of UuidRequired if strategy is equal to atLeastOneor allef4670c3-d715-4a21-8226-ed17f354fc44, fab46f63-a61b-4aec-930b-21a438863a6c
availabilityBodyAllow the connector to handle the availability of the botBooleanRequired if strategy is equal to customAvailabilitytrue

Response example 1: bot is available only if the distribution rule to check returns true

[
    {
        "strategy": "atLeastOne",
        "distributionRulesToCheck": [
            "ef4670c3-d715-4a21-8226-ed17f354fc44",
            "fab46f63-a61b-4aec-930b-21a438863a6c"
        ]
    }
]

Response example 2: bot is always available

[
    {
        "strategy": "customAvailability",
        "availability": true
    }
]

Note: You can validate your response data format with the associated json schema.

Implement the conversation flow

A conversation is typically initiated by a user. The bot can only reply to user’s message which means that iAdvize will call your endpoints when a message is received in the conversation.

To fully handle a conversation you only need to implement 2 endpoints:

  • POST /conversations to handle a new conversation creation
  • POST /conversations/:conversationId:/messages to receive messages from the visitor and reply to the visitor. Mind that all the messages posted in a conversation will result into this API call (which means you will also receive your own replies).

Conversation flow diagram

Here is a full conversation example:

TimeBot AgentVisitorBot responseCalls to bot connectorExplanation
00:00“Hi, are you there ? Shall we begin ?”POST /conversationsCreate a conversation in the bot connector
(empty replies)Response
00:00POST /conversations/idConversation/messages
“Hi, are you there ? Shall we begin ?”
Reply to the first user’s message


Await 5s
“How are you ?”
“Fine” or “Bad”
Await 3 minutes
“Are you there ?”
Response
00:05“How are you ? ”POST /conversations/idConversation/messages
“How are you ?”
Do not reply to your own scheduled message (filter on author operator)

(empty replies)Response
🕐
03:05“Are you there ?”POST /conversations/idConversation/messages
“Are you there ?”
Do not reply to your own scheduled message
(empty replies)Response
03:12“Yes I'm here, sorry"POST /conversations/idConversation/messages
“Yes I’m here, sorry ?”
Reply to the user’s message by repeating the question
Await 1s
“How are you ?”
“Fine” or “Bad”
Response
03:13“How are you ?”POST /conversations/idConversation/messages
“How are you ?”
Do not reply to your own message
(empty replies)Response
03:42“Good”POST /conversations/idConversation/messages
“Good”
User received quick-reply clicked on good, take action action accordingly

Await 1s
Ok, i'm transferring you to a human"
transfer
Await 20s
“Transfer failed, please try again later”
close
ResponseTransfer the user, and notify the user about it.


Schedule a message in case the transfer fail. The message is not going to be sent if the transfer is successful
03:43“Ok, i'm transferring you to a human”POST /conversations/idConversation/messages
“Ok, i'm transferring you to a human"
Do not reply to your own message
(empty replies)Response

Create a conversation

Everytime a conversation starts, this endpoint is called. It allows iAdvize to notify your bot a conversation starts.

⚠️Do not include any replies (leave the array empty) as another call to POST /conversations/conversationId/messages is triggered right after POST /conversations. It will be the right time to answer the visitor. ⚠️

Request - POST /conversations

ParametersInDescriptionTypeExample
idConnectorVersionQueryConnector version identifierStringc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryUnique identifier of the website on which your connector is installedStringha-123
FieldInDescriptionTypeExample
idOperatorBodyiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
idConversationBodyConversation unique identifier, you can use it or return your own internal id in the response body. We will make the join for you.UUIDce41ba2c-c25a-4351-b946-09527d8b940b
historyBodyFirst messages of the conversationsArray of History
history.idMessageBodyUnique identifier of this messageUUIDba4e1f71-7012-4b1a-86c3-d2fce8883dc7
history.author.roleBodyauthor of the messageOne of: operator or visitoroperator
history.payloadBodyTyped payload of the messageOne of Payload object

see Payload objects for more details
history.createdAtBodyDate the message was sentString - ISO 86012018-07-16T13:53:57.961Z

Response format

FieldInDescriptionTypeRequiredExample
idConversationBodyConversation unique identifierUUIDce41ba2c-c25a-4351-b946-09527d8b940b
idOperatorBodyiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
repliesBodyArray of repliesArray of Reply[]
variablesBodyCollected variablesArray
variables.keyBodyKey of the variable collectedStringvisitor_state_of_mind
variables.valueBodyValue of the variable collectedStringOk
createdAtBodyCreation date of the conversationString - ISO 8601
updatedAtBodyDate of the last message receivedString - ISO 8601

Response example

{
    "idConversation": "ce41ba2c-c25a-4351-b946-09527d8b940b",
    "idOperator": "ha-456678",
    "replies": [],
    "variables": [],
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:23:00Z"
}

Receive a message and reply to it

This endpoint is called when a new message is received in the conversation, whether the bot or the user sent it.

Request - POST /conversations/:idConversation:/messages

ParametersInDescriptionTypeExample
idConnectorVersionQueryConnector version identifierStringc008849d-7cb1-40ca-9503-d6df2c5cddd8
idWebsiteQueryUnique identifier of the website on which your connector is installedStringha-123
idConversationPathConversation unique identifierUUIDa0c65ae0-4e04-4909-a5cc-80dd0f05de96
FieldInDescriptionTypeExample
idOperatorBodyiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
messageBodyMessage
message.idMessageBodyUnique identifier of this messageUUIDba4e1f71-7012-4b1a-86c3-d2fce8883dc7
message.author.roleBodyauthor of the messageOne of: operator or visitoroperator
message.payloadBodyTyped payload of the messageOne of Payload object

see Payload objects for more details
message.createdAtBodyDate the message was sentString2017-11-22T12:04:00.762Z[Etc/UTC]

Response format

FieldInDescriptionTypeRequiredExample
idConversationBodyConversation unique identifierUUIDa0c65ae0-4e04-4909-a5cc-80dd0f05de96
idOperatorBodyiAdvize bot operator identifier that we associate to your bot scenarioStringha-456678
repliesBodyArray of repliesArray or Reply
reply.typeBodyReply/action typeOne of: await or message or transfer or close
reply.duration.unitBodyAwaiting unit of timeOne of: millis or seconds or minutesRequired if replies.type is equal to await
reply.duration.valueBodyAwaiting value of timeLongRequired if replies.type is equal to await
reply.payloadBodyTyped payload of the messageOne of Payload object

see Payload objects for more details
Only available and required if reply.type is equal to message
reply.quickRepliesBodyQuick replies proposed to the visitorArray of Quick Reply object

see Quick reply object for more details
reply.distributionRuleBodyDistribution rules to transfer toUUIDRequired if reply.type is equal to transfer
variablesBodyCollected variablesArray
variables.keyBodyKey of the variable collectedStringvisitor_state_of_mind
variables.valueBodyValue of the variable collectedStringOk
createdAtBodyCreation date of the conversationString - ISO 8601
updateAtBodyDate of the last message receivedString - ISO 8601

Response example

{
    "idConversation": "ce41ba2c-c25a-4351-b946-09527d8b940b",
    "idOperator": "ha-456678",
    "replies": [
        {
            "type": "await",
            "duration": {
                "unit": "millis",
                "value": 10
            }
        },
        {
            "type": "message",
            "payload": {
                "contentType": "text",
                "value": "All Right, my job is done here."
             },
            "quickReplies": []
        },
        {
            "type": "transfer",
            "distributionRule": "ef4670c3-d715-4a21-8226-ed17f354fc44"
        },
        {
            "type": "close"
        }
    ],
    "variables": [
        {
            "key": "visitor_state_of_mind",
            "value": "Ok"
        }
    ],
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:23:00Z"
}

Conversation objects

Payload objects

Several kinds of payloads can be used within your bot replies in order to enrich your responses. You will find in this section information about every type of content you can send with your iAdvize bot.

Disclaimer: The following features Carousel, Product offer and Action are only working with our new chatbox. Get in touch with us if you need such objects in your conversation flow.

Text payload

Sending a simple message

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contentString texttext
valueTextual content of the messageStringHi, i am a simple message.
{
    "contentType": "text",
    "value": "Hi, i am a simple message."
}
Generic card payload

A generic card is a payload you can use to send a more structured message. It always contains at least one link and can be used to help a visitor to navigate on a website by redirecting him to specific pages. You can specify multiple links on a single generic card. Generic card can also include a title, a description and an image. This help give context to the visitor about the links you are sending

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contentStringcard/content
imageJson describing attached pictureImage object

see Generic JSON object section for more details
titleTitle of the cardStringDelivery & Pickup
textTextual content of the messageStringLearn more about dispatch and delivery times, methods and costs.
actionsList of actions to be sent with the cardArray of Action object

see Generic JSON object section for more details
Action must contains at least on link

Example of a generic card with title, text and picture set

{
  "contentType": "card/content",
  "image": {
    "url": "http://image.net/delivery.jpg",
    "description": "delivery picture"
  },
  "title": "Delivery & Pickup",
  "text": "Learn more about dispatch and delivery times, methods and costs.",
  "actions": [
    {
      "type": "LINK",
      "name": "See more",
      "url": "http://mylink.com/delivery"
    }
  ]
}

Example of a generic card with several links

{
  "contentType": "card/content",
  "actions": [
    {
      "type": "LINK",
      "name": "How to print on an A4 page",
      "url": "http://mylink/a4page"
    },
    {
      "type": "LINK",
      "name": "I could not print my stamps",
      "url": "http://mylink/stamps"
    },
    {
      "type": "LINK",
      "name": "What are the different support and formats for etiquette?",
      "url": "http://mylink.com/etiquette"
    }
  ]
}
Product Offer payload

A product offer payload lets you send a product offer to your visitor. Using the product offer you can showcase various attributes of your product such as the price, the photography of your product, the availability or a special offer. To show your visitors a carousel of product offers please see Product offer bundle

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contentString: product-offerproduct-offer
imageJson describing attached pictureImage object

see Generic JSON object section for more details
nameName of the productStringSamsung Frame 4K UHD TV
pricePrice of the product without offerString1,499,99 €
offerPricePrice of the product with offerString1,299,99 €
descriptionDescription of the productString
availability.statusStatus of availabilityOne of: AVAILABLE or UNAVAILABLEAVAILABLE
actionList of actions to be sent with the cardArray of Action object

see Generic JSON object section for more details
{
  "contentType": "product-offer",
  "image": {
    "url": "http://image.net/tvsamsumg.jpg",
    "description": "picture of a TV"
  },
  "name": "Samsung Frame 4K UHD TV",
  "price": "€1,499.99",
  "offerPrice": "€1,299.99",
  "availability": {
    "status": "AVAILABLE"
  },
  "actions": [
    {
      "type": "LINK",
      "name": "See more",
      "url": "http://mylink/TvSamsung"
    }
  ]
}

Example of a product offer with offer

File payload

An attachment lets you send files directly in the chatbox. If you send an image it will be directly shown to the visitors if it is in a supported format by the visitor's browser. For a non-picture file it will offer the possibility to download it.

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contentString filefile
fileNameName of the file to be displayedStringCan I add more information about my order?
mimeTypeMime type of the fileOne of: image/gif, application/pdf, image/png or image/jpegimage/gif
urlTextual content of the messageStringhttp://my-website/order.pdf

Example of a document payload

{
    "contentType": "file",
    "fileName": "Can I add more information about my order?",
    "mimeType": "application/pdf",
    "url": "http://my-website.com/order.pdf"
}

Example of a picture payload

{
    "contentType": "file",
    "fileName": "My picture name",
    "mimeType": "image/png",
    "url": "http://my-website.com/image.png"
}
Card bundle payload

With the generic card bundle you can create a carousel for the visitor. Sliders are an efficient tool to present multiple services, offers or products to your visitors.

FieldDescriptionTypesRequiredExample
contentTypeType of the message’s contentString bundle/cardbundle/card
cardsList of cards to sendArray of Generic Card

See Generic Card payload for more details

Example of a generic card with title, text and picture set

{
    "contentType": "bundle/card",
    "cards": [
        { ... },
        {
            "contentType": "card/content",
            "image": {
                "url": "http://image.net/delivery.jpg",
                "description": "delivery picture"
            },
            "title": "Delivery & Pickup",
            "text": "Learn more about our policies",
            "actions": [{
                "type": "LINK",
                "name": "See more",
                "url": "http://mylink/delivery"
            }]
        },
        { ... }
    ]
}
Product Offer bundle payload

A product offer bundle is an efficient tool to showcase multiple products at one to your visitor. The visitor can navigate among the offers you sent using a slider.

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contentString bundle/product-offerbundle/product-offer
offersList of product offers to displayArray of Product Offer payload

See Product offer payload for more details

Example of a generic card with title, text and picture set

{
    "contentType": "bundle/product-offer",
    "offers": [
        { ... },
        {
            "contentType": "product-offer",
            "image": {
                "url": "http://image.net/tvpanasonic.jpg",
                "description": "picture of a TV"
            },
            "name": "Panasonic Smart TV 4K",
            "price": "€1,499.99",
            "offerPrice": "€1,299.99",
            "description": "Enhance your everyday space with The Frame TV that reflects your style and fits your space",
            "availability": {
                "status": "AVAILABLE"
            },
            "actions": [{
                "type": "LINK",
                "name": "See more",
                "url": "http://mylink/TvPanasonic"
            }]
        },
        { ... }
    ]
}

Generic JSON object

Image

An Image object can be used to display one image. The picture linked need to be of dimension 240x120(px) and should be displayable on browsers.

FieldDescriptionTypeRequiredExample
urlUrl pointing at a pictureStringhttp://image.net/image.jpg
descriptionTextual description of the picture (alt field)Stringpicture of an image
{
    "url": "http://image.net/image.jpg",
    "description": "picture of an image"
}
Actions

Actions can be used to offers options to one visitor. Today, only link actions can be used. A link action is one action that can redirect one user to a given url link.

FieldDescriptionTypeRequiredExample
typeType of the actionString LINKLINK
namename to display linkStringMy link
urlLink to be used in actionStringhttp://mylink
{
    "type": "LINK",
    "name": "My link",
    "url": "http://mylink"
}

Quick reply object

A quick reply is used for offering several choices to a visitor. Each choice needs to be specified in the "quickReplies" field of a reply. The answer sent by the visitor to the multiple choice question can only contain text. There is no maximum number of quick replies you can display. However we recommend not to use more than 3 quick replies for a single question.

FieldDescriptionTypeRequiredExample
contentTypeType of the message’s contenttext/quick-replytext/quick-reply
valueTextual content of the quick-replyStringYes
idQuickReplyQuick reply identifierUUID1ef5145b-a9b6-4e86-8743-b6e3b4026b2c

Example of a text payload reply with two quick replies

{
    "contentType": "text/quick-reply",
    "value": "Yes",
    "idQuickReply": "1ef5145b-a9b6-4e86-8743-b6e3b4026b2c"
}

Bots and conversational experience

In order to provide a great conversational experience here are some of the best practices we advise every integrator to follow.

⚠️ Please note that these guidelines are important for your app to pass the iAdvize review process. ⚠️

Awaits on Bot Transfers

As of now our bot transfer process allows you to set any awaits time you might like. Please be advised that you should not set an await time inferior to 15 seconds. Under that delay our system will not have a sufficient amount of time to verify availability. This delay if perfectly acceptable in term of conversational experience and is required for the transfer to operate correctly.

Delay your answers

We strongly advise to put an await between each answer your bot is going to send to the visitor to enhance the conversational experience with your bot. You can use an await of a few seconds for each message you send to the visitor. Answering directly would be too unnatural otherwise.

Do not disguise your bot as a human

We will refuse any integration that masks the fact that a bot isn't a human. According to our experience, we know that it results in important satisfaction drop. You should state at the beginning of the conversation that the operator is not human. Also provide a specific avatar that makes it clear that the agent is a bot.

Be careful about the length of your messages

You should never send a message over 450 characters long (technical limitation). We even advise not to send more than 250 characters per message (optimal Ux). To offer a great conversational experience try to write short and concise answers. If you really need to send a long answer we recommend splitting your entire message in smaller ones of max. 250 characters that are semantically coherent.

Do not say hello twice

A preconfigured welcome message is available for all of our clients. If your bot says hello at the start of every new conversation it will results in the visitor receiving a similar message two times in a few seconds.

To deliver a better conversational experience, your bot can skip any notion of welcoming message and just present itself as a bot.

Diversify your answers

Try and offer multiple versions of your common answers. It will help you deliver a better experience instead of a repetitive robotic one.

FAQ

How to Transfer a conversation

Transferring a conversation is quite straightforward. You can send the following messages:

{
    "idConversation": "ce41ba2c-c25a-4351-b946-09527d8b940b",
    "idOperator": "ha-456678",
    "replies": [
        {
            "type": "transfer",
            "distributionRule": "ef4670c3-d715-4a21-8226-ed17f354fc44"
        },
        {
            "type": "await",
            "duration": {
                "unit": "seconds",
                "value": 20
            }
        },
        {
            "type": "message",
            "payload": {
                "contentType": "text",
                "value": "Transfer failed, please try again later"
             },
            "quickReplies": []
        },
        {
            "type": "close"
        }
    ],
    "variables": [],
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:23:00Z"
}

Explanation: we send a transfer message and schedule a failed transfer message afterward. If the transfer is successful, the message for failed transfer is not published in the conversation. If the transfer happens to fail, the message is sent to the conversation. This way you can notify your user about it and continue the conversation.

How to end a conversation

A conversations is automatically closed after 5 minutes if nothing happens in the conversation. You can send a close conversation message such as:

{
    "idConversation": "ce41ba2c-c25a-4351-b946-09527d8b940b",
    "idOperator": "ha-456678",
    "replies": [
        {
            "type": "message",
            "payload": {
                "contentType": "text",
                "value": "Have a nice day ! Bye !"
             },
            "quickReplies": []
        },
        {
            "type": "close"
        }
    ],
    "variables": [],
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:23:00Z"
}

My visitor is being inactive in the conversation, how can I send him/her a message ?

You can schedule a message to be sent after a while such as:

{
    "idConversation": "ce41ba2c-c25a-4351-b946-09527d8b940b",
    "idOperator": "ha-456678",
    "replies": [
        {
            "type": "await",
            "duration": {
                "unit": "seconds",
                "value": 120
            }
        },
        {
            "type": "message",
            "payload": {
                "contentType": "text",
                "value": "Can I still help you ?"
             },
            "quickReplies": []
        }
    ],
    "variables": [],
    "createdAt": "2017-11-22T12:04:00Z",
    "updatedAt": "2017-11-22T12:23:00Z"
}

Explanation: After 2 minutes, the message Can I still help you ? will be sent to the visitor. If the visitor sends a message before the 2 minutes timer, this message is not sent to the conversation.

How can I check availability of a rule before a transfer

Currently it is not possible to do this.

Bot troubleshooting

Q: My chat does not display, even if I went through all the bot creation process and campaign creation process

A1: Is your browser main language is the language the bot is configured to chat in ? If not, make sure they match

A2: Is your bot available to chat ? Make sure that your bot is available to chat i.e. the availability endpoint is reachable and returns true. See the availability-strategy endpoint here (link).


Q: My bot is stuck in an infinite loop, it keeps replying to itself.

A: Mind that all the messages sent in the conversation (whether your bot is the author or not) trigger a call to the POST /conversations/conversationId/messages. To avoid to reply to yourself, you have to filter on the author. If the author equals visitor then you can reply otherwise, just ignore the message.


Q: My bot always appears to be offline, how can I change that ?

A: Did you implement the GET /availability-strategies correctly ?