Skip to content

Instantly share code, notes, and snippets.

@druv5319
Last active June 21, 2022 15:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save druv5319/c653a7f2d41516142317525899ec18d3 to your computer and use it in GitHub Desktop.
Save druv5319/c653a7f2d41516142317525899ec18d3 to your computer and use it in GitHub Desktop.
Twilio Studio SMS flow to find and contact your local representatives with a given address.
{
"description": "SMS flow to find and contact your local representatives with a given address.",
"states": [
{
"name": "Trigger",
"type": "trigger",
"transitions": [
{
"next": "main_menu",
"event": "incomingMessage"
},
{
"event": "incomingCall"
},
{
"event": "incomingConversationMessage"
},
{
"event": "incomingRequest"
},
{
"event": "incomingParent"
}
],
"properties": {
"offset": {
"x": 0,
"y": 0
}
}
},
{
"name": "main_menu",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "find_representative",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": -690,
"y": 210
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "Hello! Looking to find and contact your local representatives? Enter your address.",
"timeout": "3600"
}
},
{
"name": "find_representative",
"type": "run-function",
"transitions": [
{
"next": "reply_with_representatives",
"event": "success"
},
{
"next": "invalid_address",
"event": "fail"
}
],
"properties": {
"service_sid": "default",
"environment_sid": "",
"offset": {
"x": -300,
"y": 190
},
"function_sid": "",
"parameters": [
{
"value": "{{widgets.main_menu.inbound.Body}}",
"key": "address"
}
],
"url": ""
}
},
{
"name": "reply_with_representatives",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "main_menu_or_view_contact",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": 100,
"y": 200
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "{{widgets.find_representative.parsed.smsResponse}}",
"timeout": "3600"
}
},
{
"name": "main_menu_or_view_contact",
"type": "split-based-on",
"transitions": [
{
"next": "invalid_input_1",
"event": "noMatch"
},
{
"next": "check_and_set_input",
"event": "match",
"conditions": [
{
"friendly_name": "If value is a number",
"arguments": [
"{{widgets.reply_with_representatives.inbound.Body | downcase}}"
],
"type": "regex",
"value": "^\\d+$"
}
]
},
{
"next": "main_menu",
"event": "match",
"conditions": [
{
"friendly_name": "If value is 'menu'",
"arguments": [
"{{widgets.reply_with_representatives.inbound.Body | downcase}}"
],
"type": "equal_to",
"value": "menu"
}
]
}
],
"properties": {
"input": "{{widgets.reply_with_representatives.inbound.Body | downcase}}",
"offset": {
"x": 110,
"y": 390
}
}
},
{
"name": "invalid_input_1",
"type": "send-message",
"transitions": [
{
"next": "reply_with_representatives",
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": -90,
"y": 650
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Invalid input."
}
},
{
"name": "invalid_address",
"type": "send-message",
"transitions": [
{
"next": "main_menu",
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": -510,
"y": 470
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Invalid address. Try again."
}
},
{
"name": "check_and_set_input",
"type": "set-variables",
"transitions": [
{
"next": "validate_number_range",
"event": "next"
}
],
"properties": {
"variables": [
{
"value": "{% assign input = widgets.reply_with_representatives.inbound.Body | plus:0 %}\n{% if input > 0 and input <= widgets.find_representative.parsed.contactInfos.size %}\n{{input}}\n{% else %}\n{{null}}\n{% endif %}",
"key": "selection"
}
],
"offset": {
"x": 590,
"y": 220
}
}
},
{
"name": "validate_number_range",
"type": "split-based-on",
"transitions": [
{
"next": "show_contact_info",
"event": "noMatch"
},
{
"next": "invalid_input_1",
"event": "match",
"conditions": [
{
"friendly_name": "If number is not in range",
"arguments": [
"{{flow.variables.selection}}"
],
"type": "is_blank",
"value": "Is Blank"
}
]
}
],
"properties": {
"input": "{{flow.variables.selection}}",
"offset": {
"x": 600,
"y": 430
}
}
},
{
"name": "show_contact_info",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "show_contact_info_flow",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": 640,
"y": 690
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "{% assign index = flow.variables.selection | minus:1 %}{{widgets.find_representative.parsed.contactInfos[index].contactInfoString}}\nEnter 'back' to view your other local officals. {% if widgets.find_representative.parsed.contactInfos[index].email != null %}To send a message to {{widgets.find_representative.parsed.contactInfos[index].officialName}}, enter your email to proceed.{% endif %}",
"timeout": "3600"
}
},
{
"name": "show_contact_info_flow",
"type": "split-based-on",
"transitions": [
{
"next": "invalid_input_2",
"event": "noMatch"
},
{
"next": "reply_with_representatives",
"event": "match",
"conditions": [
{
"friendly_name": "If value equal_to back",
"arguments": [
"{{widgets.show_contact_info.inbound.Body | downcase}}"
],
"type": "equal_to",
"value": "back"
}
]
},
{
"next": "get_subject",
"event": "match",
"conditions": [
{
"friendly_name": "If value is an email",
"arguments": [
"{{widgets.show_contact_info.inbound.Body | downcase}}"
],
"type": "regex",
"value": "(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
}
]
}
],
"properties": {
"input": "{{widgets.show_contact_info.inbound.Body | downcase}}",
"offset": {
"x": 660,
"y": 930
}
}
},
{
"name": "get_subject",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "get_message",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": -200,
"y": 1290
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "Enter your subject line for the email",
"timeout": "3600"
}
},
{
"name": "invalid_input_2",
"type": "send-message",
"transitions": [
{
"next": "show_contact_info",
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": -120,
"y": 940
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Invalid input"
}
},
{
"name": "get_message",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "send_email_confirmation",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": 130,
"y": 1290
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "Enter your message",
"timeout": "3600"
}
},
{
"name": "send_email_confirmation",
"type": "send-and-wait-for-reply",
"transitions": [
{
"next": "send_email_split",
"event": "incomingMessage"
},
{
"event": "timeout"
},
{
"event": "deliveryFailure"
}
],
"properties": {
"offset": {
"x": 450,
"y": 1310
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"body": "{% assign index = flow.variables.selection | minus:1 %}\nHere is the email that will be sent to {{widgets.find_representative.parsed.contactInfos[index].officialName}}:\n\nReply to Email: {{widgets.show_contact_info.inbound.Body}}\nSubject: {{widgets.get_subject.inbound.Body}}\n\nMessage: {{widgets.get_message.inbound.Body}}\n\nTo send the email, enter 'send'. To go back, enter 'back'",
"timeout": "3600"
}
},
{
"name": "send_email_split",
"type": "split-based-on",
"transitions": [
{
"next": "invalid_input_3",
"event": "noMatch"
},
{
"next": "show_contact_info",
"event": "match",
"conditions": [
{
"friendly_name": "If value equal_to back",
"arguments": [
"{{widgets.send_email_confirmation.inbound.Body | downcase}}"
],
"type": "equal_to",
"value": "back"
}
]
},
{
"next": "send_email_function",
"event": "match",
"conditions": [
{
"friendly_name": "If value equal_to send",
"arguments": [
"{{widgets.send_email_confirmation.inbound.Body | downcase}}"
],
"type": "equal_to",
"value": "send"
}
]
}
],
"properties": {
"input": "{{widgets.send_email_confirmation.inbound.Body | downcase}}",
"offset": {
"x": 770,
"y": 1300
}
}
},
{
"name": "send_email_function",
"type": "run-function",
"transitions": [
{
"next": "email_sent",
"event": "success"
},
{
"next": "email_not_sent",
"event": "fail"
}
],
"properties": {
"service_sid": "default",
"environment_sid": "",
"offset": {
"x": 1250,
"y": 1300
},
"function_sid": "",
"parameters": [
{
"value": "{% assign index = flow.variables.selection | minus:1 %}{{widgets.find_representative.parsed.contactInfos[index].email}}",
"key": "officialEmail"
},
{
"value": "{{widgets.get_subject.inbound.Body}}",
"key": "subject"
},
{
"value": "{{widgets.show_contact_info.inbound.Body}}",
"key": "replyToEmail"
},
{
"value": "{{widgets.get_message.inbound.Body}}",
"key": "message"
}
],
"url": ""
}
},
{
"name": "invalid_input_3",
"type": "send-message",
"transitions": [
{
"next": "send_email_confirmation",
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": 360,
"y": 1650
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Invalid input"
}
},
{
"name": "email_sent",
"type": "send-message",
"transitions": [
{
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": 1260,
"y": 1560
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Email has been sent!"
}
},
{
"name": "email_not_sent",
"type": "send-message",
"transitions": [
{
"next": "show_contact_info",
"event": "sent"
},
{
"event": "failed"
}
],
"properties": {
"offset": {
"x": 1260,
"y": 1040
},
"service": "{{trigger.message.InstanceSid}}",
"channel": "{{trigger.message.ChannelSid}}",
"from": "{{flow.channel.address}}",
"to": "{{contact.channel.address}}",
"body": "Email was not sent, please try again."
}
}
],
"initial_state": "Trigger",
"flags": {
"allow_concurrent_calls": true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment