Skip to content

Instantly share code, notes, and snippets.

@chase2981
Last active February 9, 2021 23:16
Show Gist options
  • Save chase2981/d92bd1ef758b393dd0ac808ebfbc0baf to your computer and use it in GitHub Desktop.
Save chase2981/d92bd1ef758b393dd0ac808ebfbc0baf to your computer and use it in GitHub Desktop.
Omnichannel Task Router Base Attributes
// task
// snake case
var taskJson = {
// this shows up in flex on the task as the primary text
"name": "chase@rentdynamics.com",
// differentiates between different task queues based on acceptable response times
"type": "short-lived",
"rd": {
// contactCenter -- we might not need this tbh -- especially if we do different flex projects or even different workspaces or workflows per contact center
"contact_center_id":1,
// spoken language
"spoken_language_required": "spanish",
// startDate
"start_date": "2021-02-04T02:35:14.466Z",
// clientId
"client_id": 1,
// communityGroupId if we have it
"community_group_id": 2,
// adSourceId here, then we'll put the adSourceName in the "conversations" sub-object
"ad_source_id": 124,
// could do this same thing using
"community_group_priority": 10,
// the following could handle all the training requirements
"worker_experience_required": 7,
// parent task when transferred to
"parent_task_sid": "XXSF...",
// this lets us know to show the follow up component on the frontend on the child task
"parent_task_channel_unique_name": "follow-up",
// this will be used to trigger search on the frontend if email
"email_message_id": 2132424,
// this will be used to trigger search on the frontend if call
"call_detail_id": 2132424,
// timing - what about holidays?
"acceptable_contact_time_min_utc": "0800",
"acceptable_contact_time_max_utc": "1630",
"acceptable_contact_time_utc": -7,
// the following will be used on the frontend to automatically go straight to a lead or resident, also it will be used when transferring a task to a supervisor
"lead_id": 3245621,
"resident_id": 435563,
// used in transfers
"transferred_from_user_id": 291,
// completion
"completed_by_user_id": 291,
"call_route_step?": 0,
...{ /* ... any other use-case specific attributes can be added here */ }
},
"targetWorker":"client:chasewgibbons", // outbpund call direct assignment added automatically by flex
"flexOutboundDialerTargetWorker": "client:chasewgibbons", // outbpund call direct assignment added automatically by flex
// direction
"direction": "inbound",
// todo: make this more robust
"conversations" : {
// s3 call recording link
"segment_link" : "https://api.twilio.com/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Recordings/REXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
// parent taskSid to link followUps together in flex insights
"conversation_id" : "WTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
// whether or not conversation was productive
"productive": "true",
// example custom metric which doesn't count towards 2 billion unique values limit
"conversation_attribute_1" : "Google",
// links to above conversation_attribute_1
"conversation_label_1" : "AdSourceName",
// integer of some measure, it might link to the conversation_attribute_1 and conversation_label_1 above, idk, need to look this one up..
"conversation_measure_1" : 101,
// language used by participants in the conversation
"language": "spanish",
// outcome of conversation
"outcome": "no appointment set"
},
// todo: make this more robust
"customers":{
"phone":"3059867013",
"market_segment":"4th Street Commons",
"organization":"Asset Campus Housing",
"name":"JESSICA AUJLA",
"custom_attr_1":true,
"category":"4th Street Commons",
"customer_manager":"Asset Campus Housing",
// example custom metric which doesn't count towards 2 billion unique values limit
"customer_attribute_1" : "544532",
// links to above customer_attribute_1
"customer_label_1" : "LeadId",
// value of this customer to the business, greater equals more valuable
"business_value" : 7500
},
// dictates how flex behaves on frontend, this is added automatically on frontend direct assignments in certain instances as camelcase
"autoAnswer":"false",
// i'm not sure what this does tbh, but it is added on frontend automatically in certain instances
"internal":"false"
}
// worker
var workerJson = {
"public_identity":"Chase",
"contact_uri":"client:cgibbons",
"roles":["admin","wfo.full_access"],
"team_leader_sid": "",
"spoken_languages": ["english", "spanish"],
"overflow_status": 9,
// could do this same thing via
"experience_level": 9,
"first_name":"Chase",
"last_name":"Gibbons",
"full_name":"Chase Gibbons",
"rd_username":"cgibbons",
"user_id":"291",
"phone":"+14359994722",
"email":"chase@rentdynamics.com",
"rd_auth_token":"7975c687ab46687f9800ce8b38d55bac295d720ce2c3",
"manager":"Zach Passey",
"team_id":"1",
"team_name":"Hello",
"team_name_in_hierarchy":"Hello,Logan,UT",
"department":"Contact Center",
"department_id": "2",
// we might change this up a bit to allow arrays
"routing":{
"skills": ["spanish_speaking","overflow_status"],
"levels":{"overflow_status":10}
},
"disabled_skills":{"skills":[],"levels":{}}
}
@chase2981
Copy link
Author

chase2981 commented Feb 2, 2021

There is tons of valuable info if you read and click through all the links here: https://www.twilio.com/docs/flex/developer/insights/enhance-integration
For instance,
Analytics data model:
https://www.twilio.com/docs/flex/end-user-guide/insights/data-model
Useful conversation attributes:
https://www.twilio.com/docs/flex/end-user-guide/insights/data-model#useful-attributes
Custom labels:
https://www.twilio.com/docs/flex/developer/insights/labels
Conversation structure:
https://www.twilio.com/docs/flex/end-user-guide/insights/conversation-structure


	// todo: ytica what's possible
	 "conversations" : {
	    "segment_link" : "https://api.twilio.com/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Recordings/REXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
	    "abandoned" : "No",
	    "abandoned_phase" : null,
	    "activity" : "On a Break",
	    "campaign" : "Pension Insurance 2", // adsouce name
	    "case" : "Retention #24567", // contactId
	    "communication_channel" : "Call",
	    "content" : "bonus retention",
	    "conversation_id" : "WTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
	    "conversation_attribute_1" : "Attribute Value 1",
	    "conversation_attribute_2" : "Attribute Value 2",
	    "conversation_attribute_3" : "Attribute Value 3",
	    "conversation_attribute_4" : "Attribute Value 4",
	    "conversation_attribute_5" : "Attribute Value 5",
	    "conversation_attribute_6" : "Attribute Value 6",
	    "conversation_attribute_7" : "Attribute Value 7",
	    "conversation_attribute_8" : "Attribute Value 8",
	    "conversation_attribute_9" : "Attribute Value 9",
	    "conversation_attribute_10" : "Attribute Value 10",
	    "conversation_label_1" : "Label 1",
	    "conversation_label_2" : "Label 2",
	    "conversation_label_3" : "Label 3",
	    "conversation_label_4" : "Label 4",
	    "conversation_label_5" : "Label 5",
	    "conversation_label_6" : "Label 6",
	    "conversation_label_7" : "Label 7",
	    "conversation_label_8" : "Label 8",
	    "conversation_label_9" : "Label 9",
	    "conversation_label_10" : "Label 10",
	    "destination": "External Queue",
	    "direction" : "Outbound",
	    "external_contact" : "+18001234567",
	    "followed_by" : "External Transfer",
	    "handling_department_id" : "1",
	    "handling_department_name" : "Department 1",
	    "handling_department_name_in_hierarchy" : "Company ▸ Department 1",
	    "handling_team_id" : "2",
	    "handling_team_name" : "Sales 2",
	    "handling_team_name_in_hierarchy" : "London ▸ Sales ▸ Sales 2",
	    "hang_up_by" : "Customer",
	    "in_business_hours" : "Yes",
	    "initiated_by" : "Customer",
	    "initiative" : "Leader in Insurance",
	    "ivr_path" : "1 ▸ 2",
	    "language" : "English",
	    "outcome" : "Retention - Success",
	    "preceded_by" : "Warm Transfer",
	    "productive" : null,
	    "queue" : "Outbound Dialer - England",
	    "service_level" : "OK",
	    "source": "Waiting Room",
	    "virtual" : "No",
	    "workflow" : "Outbound UK",
	    "activity_time" : null,
	    "average_response_time": 13,
	    "conversation_measure_1" : 101,
	    "conversation_measure_2" : 102,
	    "conversation_measure_3" : 103,
	    "conversation_measure_4" : 104,
	    "conversation_measure_5" : 105,
	    "conversation_measure_6" : 106,
	    "conversation_measure_7" : 107,
	    "conversation_measure_8" : 108,
	    "conversation_measure_9" : 109,
	    "conversation_measure_10" : 110,
	    "first_response_time": 30,
	    "focus_time": 20,
	    "hold_time" : 0,
	    "ivr_time" : 0
	  }

	  // todo: ytica what's possible cont.
	  "customers" : {
	    "name" : "John Doe",
	    "customer_link" : null,
	    "customer_attribute_1" : "Attribute Value 1",
	    "customer_attribute_2" : "Attribute Value 2",
	    "customer_attribute_3" : "Attribute Value 3",
	    "customer_label_1" : "Label 1",
	    "customer_label_2" : "Label 2",
	    "customer_label_3" : "Label 3",
	    "acquisition_date" : null,
	    "category" : "VIP",
	    "customer_manager" : "Financial Partners Corp.",
	    "email" : "john.doe@gmail.com",
	    "gender" : "Male",
	    "geo_location":"-22.5743922;17.0790688",
	    "market_segment" : "Pensioners",
	    "organization" : "Prosperity Inc.",
	    "phone" : "+44xxxxxxxxx",
	    "year_of_birth" : "1947",
	    "zip" : "ZC000000",
	    "acquisition_cost" : 150,
	    "business_value" : 7500
	  }

@chase2981
Copy link
Author

Community call -> Processed by community
Community call -> Not processed by community -> Assigned to be processed by community
Community call -> Not processed by community -> Assigned to be processed by contact-center -> Needs listened to and processed by an agent
Community email -> Processed by community
Community email -> Not processed by community -> Assigned to be processed by community
Community email -> Not processed by community -> Assigned to be processed by contact-center -> Needs read and processed by an agent
Contact-center call -> Processed by contact-center
...

@chase2981
Copy link
Author

Call types:

Past -> Inbound -> Process based on recording
Present -> Inbound -> Process based on live call
Present -> Outbound -> Process follow up result

@chase2981
Copy link
Author

chase2981 commented Feb 2, 2021

Chat Studio Flow "SendToAgent" Task Router Definition

{
"name": "{{trigger.message.ChannelAttributes.from}}", 
"type": "short-lived", 
"channelType": "{{trigger.message.ChannelAttributes.channel_type}}", 
"channelSid": "{{trigger.message.ChannelSid}}", 
"rdClientId": 
"{{trigger.message.ChannelAttributes.pre_engagement_data.rdClientId}}", 
"location": "{{trigger.message.ChannelAttributes.pre_engagement_data.location}}", 
"rdChatWidgetId": "{{trigger.message.ChannelAttributes.pre_engagement_data.rdChatWidgetId}}",
 "rdAdSourceId": "{{trigger.message.ChannelAttributes.pre_engagement_data.rdAdSourceId}}", 
"rdUnitId": "{{trigger.message.ChannelAttributes.pre_engagement_data.unitId}}", 
"rdForm": "{{trigger.message.ChannelAttributes.pre_engagement_data}}", 
"rdJson": {{trigger.message.ChannelAttributes.pre_engagement_data.json | to_json}} 
}

@chase2981
Copy link
Author

chase2981 commented Feb 2, 2021

Inbound email in flex currently

{
    "timeout": null,
    "taskChannel": "email",
    "attributes": {
	"name": "chase@rentdynamics.com",
	"type": "long-lived",
	"startDate": "",
    "communityGroupPriority": 10,
	"isNewClient": true,
	"clientId": 1,
    "expertiseRequired": 7,
	"overCallCapBy": 320,
	"parentTaskSid": "",
	"childTaskSid": "",
	"direction": "inbound",
	"contactCenterId":1,
	"acceptable_contact_time": {
			"sort": "GMT-5", 
			"min_utc": "0800",
			"max_utc": "1630"
	},
	"customers":{
            "phone":"3059867013",
            "market_segment":"4th Street Commons",
            "organization":"Asset Campus Housing",
            "name":"JESSICA AUJLA","
            custom_attr_1":true,
            "category":"4th Street Commons",
            "customer_manager":"Asset Campus Housing"
            },
	"transfer_context": {
		"leadId": 3245621,
		"transferredFromUserId": 291
	},
	"outcome": {
		"completed_by_user_id": 291,
		"users_engaged": [112, 291]
	},
	"search_result": {
		"clientId": 195,
		"resident": true
	},
	"search_context": {
		"emailMessageId": 2132424
	},
	"autoAnswer":"false",
	"referrer": "http://chat-demo.rentdynamics.com/",
	"order": 0,
	"rdStep": 0,
    "rdClientId": 1,
    "rdJson": {

    }
}
}

@chase2981
Copy link
Author

Rent Dynamics Primary

task

{
  "task_channel_sid":null,
  "clientId":"4",
  "customers":{
  "phone":"4805593664",
  "market_segment":"Circa and Ecco",
  "organization":"Bridge Property Management",
  "name":"UNKNOWN",
  "custom_attr_1":false,
  "category":"Circa and Ecco",
  "customer_manager":"Bridge Property Management"
  },
  "task_channel_unique_name":null,
  "contactCenterId":1,
  "conferenceSid":"CA42caf1e391470e85f9317e42134dcebe",
  "communityGroupId":"1515",
  "rdStep":2
}

worker

{"overflow_status":1,"contact_center_id":1,"next_activity_sid":null}

@chase2981
Copy link
Author

chase2981 commented Feb 2, 2021

Incoming call in flex currently

{
  "from_country": "US","
  called":"+12569063929",
  "to_country": "US",
  "to_city": "RANBURNE",
  "type": "short-lived",
  "to_state": "AL",
  "caller_country": "US",
  "call_sid": "CA94a15b35f506a28bbc66f036287bb1ee",
  "rdJson": {
    "rdClientId": 1
  },
  "account_sid": "AC2ff1caf629adc5fcb3e9b346104d54d9",
  "from_zip": "84341",
  "from": "+14358813912",
  "direction": "inbound",
  "called_zip": "36273",
  "caller_state": "UT",
  "to_zip": "36273",
  "called_country": "US",
  "from_city": "LOGAN",
  "called_city": "RANBURNE",
  "caller_zip": "84341",
  "api_version": "2010-04-01",
  "called_state": "AL",
  "from_state": "UT",
  "caller": "+14358813912",
  "caller_city": "LOGAN",
  "rdClientId": 1,
  "name": " +14358813912",
  "to": "+12569063929",
  "conference": {
    "sid": "CF71e1632ae4221519b36a7a5c3f6ca059",
    "participants": {
      "worker": "CAd2bf11a9e449d54b42c93bef3aa45ba2",
      "customer": "CA94a15b35f506a28bbc66f036287bb1ee"
    }
  },
  "conversations": {
    "segment_link": "https://api.twilio.com/2010-04-01/Accounts/AC2ff1caf629adc5fcb3e9b346104d54d9/Recordings/RE820aaef4c90070d2e47ad842d319ea38"
  }
}

@chase2981
Copy link
Author

chase2981 commented Feb 3, 2021

Incoming chat in flex currently (Uses Studio flow noted above as a template)

{
  "channelSid": "CH838b13d5604a4d3fbde5b1e874f62268",
  "rdUnitId": "",
  "rdClientId": "1",
  "rdJson": {
    "moveDate": "2021-02-11",
    "phaseGroupId": 45,
    "lastName": "Guy",
    "note": "",
    "preferredCommunicationTypeId": 1,
    "isLead": true,
    "clientId": 1,
    "communityGroupId": 80,
    "bedrooms": 3,
    "firstName": "Demo",
    "phoneNumber": "3234242424",
    "communicationTypeId": 3,
    "adSourceId": 2252,
    "personId": 9041320,
    "communityId": 45,
    "email": "chase@gfic.io",
    "friendlyName": "Demo Guy",
    "leadId": 9217834
  },
  "name": "Demo Guy",
  "rdAdSourceId": "2252",
  "channelType": "web",
  "location": "http://chat-demo.rentdynamics.com/",
  "rdChatWidgetId": "3",
  "type": "short-lived",
  "rdForm": "{communicationTypeId=3, bedrooms=3, communityGroupId=80, communityId=45, firstName=Demo, lastName=Guy, moveDate=2021-02-11, phoneNumber=3234242424, email=chase@gfic.io, isLead=true, adSourceId=2252, note=, preferredCommunicationTypeId=1, leadId=9217834, personId=9041320, phaseGroupId=45, friendlyName=Anonymous, clientId=1, json={communicationTypeId=3, bedrooms=3, communityGroupId=80, communityId=45, firstName=Demo, lastName=Guy, moveDate=2021-02-11, phoneNumber=3234242424, email=chase@gfic.io, isLead=true, adSourceId=2252, note=, preferredCommunicationTypeId=1, leadId=9217834, personId=9041320, phaseGroupId=45, friendlyName=Demo Guy, clientId=1}, rdChatWidgetKey=eab86709188c231559103444, rdChatWidgetId=3, rdAdSourceId=2252, rdClientId=1, rdCustomPreEngagement=true, location=http://chat-demo.rentdynamics.com/}"
}

@chase2981
Copy link
Author

Outbound call in flex currently

{
  "to": "+14358813912",
  "worker_call_sid": "CA919856b707de026c79f833b4a7f32585",
  "name": "outgoing",
  "internal": "false",
  "conference": {
    "sid": "CFb84e9a4ed264c8682e454c857294c521",
    "participants": {
      "customer": "CA893b939ac15554cec883d0bb2e06ec44",
      "CA893b939ac15554cec883d0bb2e06ec44": "+14358813912",
      "worker": "CA919856b707de026c79f833b4a7f32585"
    }
  },
  "flexOutboundDialerTargetWorker": "client:chasewgibbons",
  "direction": "outbound",
  "autoAnswer": "true",
  "from": "+14358813912",
  "targetWorker": "client:chasewgibbons"
}

Another example

{
  "to": "4359994722",
  "worker_call_sid": "CAf1cec8e0151000967955143fd88b5ed5",
  "name": "outgoing",
  "internal": "false",
  "conference": {
    "sid": "CFb715b2e8b89abb79edbdc8ab670d7a54",
    "participants": {
      "customer": "CA1b93996d5dae7b84519fe649ba19a7ab",
      "CA1b93996d5dae7b84519fe649ba19a7ab": "4359994722",
      "worker": "CAf1cec8e0151000967955143fd88b5ed5"
    }
  },
  "flexOutboundDialerTargetWorker": "client:chasewgibbons",
  "direction": "outbound",
  "autoAnswer": "true",
  "from": "+14358813912",
  "targetWorker":"client:chasewgibbons”
}

@chase2981
Copy link
Author

chase2981 commented Feb 3, 2021

Worker attributes in flex currently

{
  "public_identity": "Chase",
  "manager": "Zach Passey",
  "roles": [
    "admin",
    "wfo.full_access"
  ],
  "last_name": "Gibbons",
  "team_id": "1",
  "team_name": "Hello",
  "routing": {
    "skills": [
      "spanish_speaking",
      "overflow_status"
    ],
    "levels": {
      "overflow_status": 10
    }
  },
  "full_name": "Chase Gibbons",
  "rd_username": "cgibbons",
  "user_id": "291",
  "phone": "+14359994722",
  "rd_auth_token": "7975c687ab46687f9800ce8b38d55bac295d720ce2c3",
  "contact_uri": "client:cgibbons",
  "rd_user_id": "291",
  "location": "Logan, UT",
  "id": "6fc32e46-e6e2-43ac-bf95-4a79a1eefcdf",
  "team_name_in_hierarchy": "Hello,Logan,UT",
  "department": "Contact Center",
  "first_name": "Chase",
  "disabled_skills": {
    "skills": [],
    "levels": {}
  },
  "email": "chase@rentdynamics.com"
}

Another example with skills disabled

{
    "public_identity": "Chase",
    "manager": "Zach Passey",
    "roles": [
        "admin",
        "wfo.full_access"
    ],
    "last_name": "Gibbons",
    "team_id": "1",
    "team_name": "Hello",
    "routing": {
        "skills": [
            "overflow_status"
        ],
        "levels": {
            "overflow_status": 10
        }
    },
    "full_name": "Chase Gibbons",
    "rd_username": "cgibbons",
    "user_id": "291",
    "phone": "+14359994722",
    "rd_auth_token": "7975c687ab46687f9800ce8b38d55bac295d720ce2c3",
    "contact_uri": "client:cgibbons",
    "rd_user_id": "291",
    "location": "Logan, UT",
    "id": "398df5e2-df31-41a4-b120-14596510f49d",
    "team_name_in_hierarchy": "Hello,Logan,UT",
    "department": "Contact Center",
    "first_name": "Chase",
    "disabled_skills": {
        "skills": [
            "spanish_speaking"
        ],
        "levels": {}
    },
    "email": "chase@rentdynamics.com"
}

@chase2981
Copy link
Author

Incoming sms attributes in flex currently

{
  "channelSid": "CH8faa554d6b804f1eac73d675b53c6da1",
  "name": "+14352612308",
  "channelType": "sms"
}

@chase2981
Copy link
Author

Incoming follow up task attributes in flex currently

{
  "clientId": 1,
  "parentTaskSid": "",
  "autoAnswer": "false",
  "search_result": {
    "clientId": 195,
    "resident": true
  },
  "childTaskSid": "",
  "type": "short-lived",
  "search_context": {
    "emailMessageId": 2132424
  },
  "rdStep": 0,
  "overCallCapBy": 320,
  "acceptable_contact_time": {
    "min_utc": 1500,
    "sort": "GMT-5",
    "max_utc": 300
  },
  "transfer_context": {
    "transferredFromUserId": 291,
    "leadId": 3245621
  },
  "referrer": "http://chat-demo.rentdynamics.com/",
  "rdClientId": 1,
  "rdJson": {},
  "name": "Jon Doe",
  "isNewClient": true,
  "customers": {
    "phone": "3059867013",
    "market_segment": "4th Street Commons",
    "organization": "Asset Campus Housing",
    "name": "JESSICA AUJLA",
    "custom_attr_1": true,
    "category": "4th Street Commons",
    "customer_manager": "Asset Campus Housing"
  },
  "contactCenterId": 1,
  "startDate": "",
  "outcome": {
    "users_engaged": [
      112,
      291
    ],
    "completed_by_user_id": 291
  },
  "direction": "inbound",
  "order": 0
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment