Last active
February 12, 2021 23:38
-
-
Save Eclairemoy/75983296ae71be1bbb93d24d32138608 to your computer and use it in GitHub Desktop.
sms_appointment_reminder.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"description": "sms_appointment_reminder", | |
"states": [ | |
{ | |
"name": "Trigger", | |
"type": "trigger", | |
"transitions": [ | |
{ | |
"event": "incomingMessage" | |
}, | |
{ | |
"next": "gather_greeting", | |
"event": "incomingCall" | |
}, | |
{ | |
"next": "send_initial_confirmation", | |
"event": "incomingRequest" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -180, | |
"y": -320 | |
} | |
} | |
}, | |
{ | |
"name": "send_initial_confirmation", | |
"type": "send-and-wait-for-reply", | |
"transitions": [ | |
{ | |
"next": "split_confirmation", | |
"event": "incomingMessage" | |
}, | |
{ | |
"event": "timeout" | |
}, | |
{ | |
"event": "deliveryFailure" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 90, | |
"y": -100 | |
}, | |
"from": "{{flow.channel.address}}", | |
"body": "{{flow.data.patient_name}} has an appt on {{flow.data.appointment_date}} @ {{flow.data.appointment_time}}. Confirm w/YES. Cancel w/NO. Reschedule w/RSCH. Call the office w/ CALL. Stop w/ STOP.", | |
"timeout": "3600" | |
} | |
}, | |
{ | |
"name": "split_confirmation", | |
"type": "split-based-on", | |
"transitions": [ | |
{ | |
"event": "noMatch" | |
}, | |
{ | |
"next": "confirm_appointment", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "1", | |
"arguments": [ | |
"{{widgets.send_initial_confirmation.inbound.Body}}" | |
], | |
"type": "matches_any_of", | |
"value": "YES, yes, y" | |
} | |
] | |
}, | |
{ | |
"next": "cancel_appointment", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "2", | |
"arguments": [ | |
"{{widgets.send_initial_confirmation.inbound.Body}}" | |
], | |
"type": "matches_any_of", | |
"value": "No, NO, n" | |
} | |
] | |
}, | |
{ | |
"next": "reschedule_appt", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value matches RSCH", | |
"arguments": [ | |
"{{widgets.send_initial_confirmation.inbound.Body}}" | |
], | |
"type": "matches_any_of", | |
"value": "RSCH, r, Reschedule, reschedule, R" | |
} | |
] | |
}, | |
{ | |
"next": "connect_to_office", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value matches call", | |
"arguments": [ | |
"{{widgets.send_initial_confirmation.inbound.Body}}" | |
], | |
"type": "matches_any_of", | |
"value": "Call, call, c" | |
} | |
] | |
} | |
], | |
"properties": { | |
"input": "{{widgets.send_initial_confirmation.inbound.Body}}", | |
"offset": { | |
"x": 100, | |
"y": 120 | |
} | |
} | |
}, | |
{ | |
"name": "send_confirmation_sms", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -560, | |
"y": 710 | |
}, | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "Confirmed. Arrive or join if televisit by My Health Online. For questions regarding this appt call {{flow.channel.address}}" | |
} | |
}, | |
{ | |
"name": "send_cancellation_sms", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"next": "check_waitlist", | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -200, | |
"y": 700 | |
}, | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "Your appt has been cancelled. Please text back RSCH to reschedule or give us a call at {{flow.channel.address}}" | |
} | |
}, | |
{ | |
"name": "reschedule_appt", | |
"type": "send-and-wait-for-reply", | |
"transitions": [ | |
{ | |
"next": "split_reschedule", | |
"event": "incomingMessage" | |
}, | |
{ | |
"event": "timeout" | |
}, | |
{ | |
"event": "deliveryFailure" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 360, | |
"y": 410 | |
}, | |
"from": "{{flow.channel.address}}", | |
"body": "Sure, we can help you with re-scheduling your appointment. Here are the next 3 available slots:\n1. Feb 25 @ 1pm\n2. Feb 26 @ 2:30pm\n3. Feb 27 @ 4pm\n\nConfirm w/ appointment # or speak with the doctor's office w/CALL", | |
"timeout": "3600" | |
} | |
}, | |
{ | |
"name": "reschedule_confirmation", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 250, | |
"y": 1410 | |
}, | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "Your appointment has been rescheduled." | |
} | |
}, | |
{ | |
"name": "split_reschedule", | |
"type": "split-based-on", | |
"transitions": [ | |
{ | |
"event": "noMatch" | |
}, | |
{ | |
"next": "option_1", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "Value is 1", | |
"arguments": [ | |
"{{widgets.reschedule_appt.inbound.Body}}" | |
], | |
"type": "equal_to", | |
"value": "1" | |
} | |
] | |
}, | |
{ | |
"next": "connect_to_office", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "Value is Call", | |
"arguments": [ | |
"{{widgets.reschedule_appt.inbound.Body}}" | |
], | |
"type": "equal_to", | |
"value": "CALL" | |
} | |
] | |
}, | |
{ | |
"next": "option_2", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "Value is 2", | |
"arguments": [ | |
"{{widgets.reschedule_appt.inbound.Body}}" | |
], | |
"type": "equal_to", | |
"value": "2" | |
} | |
] | |
}, | |
{ | |
"next": "option_3", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "Value is 3", | |
"arguments": [ | |
"{{widgets.reschedule_appt.inbound.Body}}" | |
], | |
"type": "equal_to", | |
"value": "3" | |
} | |
] | |
} | |
], | |
"properties": { | |
"input": "{{widgets.reschedule_appt.inbound.Body}}", | |
"offset": { | |
"x": 190, | |
"y": 660 | |
} | |
} | |
}, | |
{ | |
"name": "connect_to_office", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"next": "make_call_to_patient", | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 970, | |
"y": 420 | |
}, | |
"service": "{{trigger.message.InstanceSid}}", | |
"channel": "{{trigger.message.ChannelSid}}", | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "You will now receive a call that will connect you with your doctor's office." | |
} | |
}, | |
{ | |
"name": "confirm_appointment", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "send_confirmation_sms", | |
"event": "success" | |
}, | |
{ | |
"next": "send_confirmation_sms", | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": -440, | |
"y": 380 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{flow.data.airtable_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Confirmed", | |
"key": "appt_status" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "cancel_appointment", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "send_cancellation_sms", | |
"event": "success" | |
}, | |
{ | |
"next": "send_cancellation_sms", | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": -60, | |
"y": 420 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{flow.data.airtable_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Cancelled", | |
"key": "appt_status" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "option_1", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "reschedule_confirmation", | |
"event": "success" | |
}, | |
{ | |
"next": "reschedule_error", | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": -20, | |
"y": 980 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{flow.data.airtable_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Confirmed", | |
"key": "appt_status" | |
}, | |
{ | |
"value": "02/25/2021", | |
"key": "date" | |
}, | |
{ | |
"value": "1:00PM", | |
"key": "time" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "split_key_press", | |
"type": "split-based-on", | |
"transitions": [ | |
{ | |
"event": "noMatch" | |
}, | |
{ | |
"next": "make_appointment", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value equal_to 1", | |
"arguments": [ | |
"{{widgets.gather_greeting.Digits}}" | |
], | |
"type": "equal_to", | |
"value": "1" | |
} | |
] | |
}, | |
{ | |
"next": "reschedule_appointment", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value equal_to 2", | |
"arguments": [ | |
"{{widgets.gather_greeting.Digits}}" | |
], | |
"type": "equal_to", | |
"value": "2" | |
} | |
] | |
}, | |
{ | |
"next": "other_inquiry", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value equal_to 3", | |
"arguments": [ | |
"{{widgets.gather_greeting.Digits}}" | |
], | |
"type": "equal_to", | |
"value": "3" | |
} | |
] | |
} | |
], | |
"properties": { | |
"input": "{{widgets.gather_greeting.Digits}}", | |
"offset": { | |
"x": -840, | |
"y": 100 | |
} | |
} | |
}, | |
{ | |
"name": "gather_greeting", | |
"type": "gather-input-on-call", | |
"transitions": [ | |
{ | |
"next": "split_key_press", | |
"event": "keypress" | |
}, | |
{ | |
"event": "speech" | |
}, | |
{ | |
"event": "timeout" | |
} | |
], | |
"properties": { | |
"speech_timeout": "auto", | |
"offset": { | |
"x": -300, | |
"y": -100 | |
}, | |
"loop": 1, | |
"finish_on_key": "#", | |
"say": "Thank you for calling Owl Health. If you would like to make an appointment for a vaccine please press 1. If you would like to reschedule an appointment for a vaccine, please press 2. For all other inquiries, please press 3.", | |
"stop_gather": true, | |
"gather_language": "en", | |
"profanity_filter": "true", | |
"timeout": 5 | |
} | |
}, | |
{ | |
"name": "owl_health_voicemail", | |
"type": "record-voicemail", | |
"transitions": [ | |
{ | |
"event": "recordingComplete" | |
}, | |
{ | |
"event": "noAudio" | |
}, | |
{ | |
"event": "hangup" | |
} | |
], | |
"properties": { | |
"transcribe": false, | |
"offset": { | |
"x": -1170, | |
"y": 780 | |
}, | |
"trim": "trim-silence", | |
"play_beep": "true", | |
"timeout": 5, | |
"max_length": 3600 | |
} | |
}, | |
{ | |
"name": "make_appointment", | |
"type": "say-play", | |
"transitions": [ | |
{ | |
"next": "owl_health_voicemail", | |
"event": "audioComplete" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -1570, | |
"y": 450 | |
}, | |
"loop": 1, | |
"say": "Thank you for calling to make a vaccine appointment. Please leave your name and number and we will call you back to schedule." | |
} | |
}, | |
{ | |
"name": "reschedule_appointment", | |
"type": "say-play", | |
"transitions": [ | |
{ | |
"next": "owl_health_voicemail", | |
"event": "audioComplete" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -1200, | |
"y": 450 | |
}, | |
"loop": 1, | |
"say": "We're happy to help you reschedule an appointment. Please leave your name and phone number and we'll return your call to reschedule your appointment." | |
} | |
}, | |
{ | |
"name": "other_inquiry", | |
"type": "say-play", | |
"transitions": [ | |
{ | |
"next": "owl_health_voicemail", | |
"event": "audioComplete" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -840, | |
"y": 450 | |
}, | |
"loop": 1, | |
"say": "We are currently experiencing a high volume of calls. Please leave your name, phone number, and a brief description of what you are calling about. We will return your call as soon as possible. Thank you for your patience." | |
} | |
}, | |
{ | |
"name": "make_call_to_patient", | |
"type": "make-outgoing-call-v2", | |
"transitions": [ | |
{ | |
"next": "owl_health_greeting", | |
"event": "answered" | |
}, | |
{ | |
"event": "busy" | |
}, | |
{ | |
"event": "noAnswer" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"machine_detection_speech_threshold": "2400", | |
"detect_answering_machine": false, | |
"offset": { | |
"x": 980, | |
"y": 650 | |
}, | |
"recording_channels": "mono", | |
"timeout": 60, | |
"machine_detection": "Enable", | |
"trim": "do-not-trim", | |
"record": false, | |
"machine_detection_speech_end_threshold": "1200", | |
"machine_detection_timeout": "30", | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"machine_detection_silence_timeout": "5000" | |
} | |
}, | |
{ | |
"name": "owl_health_greeting", | |
"type": "say-play", | |
"transitions": [ | |
{ | |
"next": "connect_to_provider", | |
"event": "audioComplete" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 990, | |
"y": 890 | |
}, | |
"loop": 1, | |
"say": "Thanks for choosing Owl Health. Please wait one moment while we connect you to the scheduler." | |
} | |
}, | |
{ | |
"name": "connect_to_provider", | |
"type": "connect-call-to", | |
"transitions": [ | |
{ | |
"event": "callCompleted" | |
}, | |
{ | |
"event": "hangup" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 1010, | |
"y": 1130 | |
}, | |
"caller_id": "{{contact.channel.address}}", | |
"noun": "conference", | |
"to": "Owl Health Conference Line", | |
"timeout": 30 | |
} | |
}, | |
{ | |
"name": "option_2", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "reschedule_confirmation", | |
"event": "success" | |
}, | |
{ | |
"next": "reschedule_error", | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": 310, | |
"y": 980 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{flow.data.airtable_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Confirmed", | |
"key": "appt_status" | |
}, | |
{ | |
"value": "02/26/2021", | |
"key": "date" | |
}, | |
{ | |
"value": "2:30PM", | |
"key": "time" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "reschedule_error", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": 600, | |
"y": 1330 | |
}, | |
"service": "{{trigger.message.InstanceSid}}", | |
"channel": "{{trigger.message.ChannelSid}}", | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "Sorry! Something went wrong. Please give us a call at {{flow.channel.address}}" | |
} | |
}, | |
{ | |
"name": "option_3", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "reschedule_confirmation", | |
"event": "success" | |
}, | |
{ | |
"next": "reschedule_error", | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": 650, | |
"y": 980 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{flow.data.airtable_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Confirmed", | |
"key": "appt_status" | |
}, | |
{ | |
"value": "02/27/2021", | |
"key": "date" | |
}, | |
{ | |
"value": "4:00PM", | |
"key": "time" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "check_waitlist", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "send_new_option", | |
"event": "success" | |
}, | |
{ | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": -420, | |
"y": 980 | |
}, | |
"function_sid": "ZHac6a232f8f2f1686c5480554cd9825be", | |
"url": "https://appt-5108.twil.io/check-waitlist" | |
} | |
}, | |
{ | |
"name": "send_new_option", | |
"type": "send-and-wait-for-reply", | |
"transitions": [ | |
{ | |
"next": "split_2", | |
"event": "incomingMessage" | |
}, | |
{ | |
"event": "timeout" | |
}, | |
{ | |
"event": "deliveryFailure" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -410, | |
"y": 1250 | |
}, | |
"service": "{{trigger.message.InstanceSid}}", | |
"channel": "{{trigger.message.ChannelSid}}", | |
"from": "{{flow.channel.address}}", | |
"body": "Hi {{widgets.check_waitlist.parsed.new_name}}, an earlier vaccine appointment opened up. Right now your appointment is {{widgets.check_waitlist.parsed.new_date}} @ {{widgets.check_waitlist.parsed.new_time}} . \nWould you like to change it to {{flow.data.appointment_date}} @ {{flow.data.appointment_time}}? Please confirm w/Yes if you would like to accept this spot instead.", | |
"timeout": "3600" | |
} | |
}, | |
{ | |
"name": "split_2", | |
"type": "split-based-on", | |
"transitions": [ | |
{ | |
"next": "do_not_update", | |
"event": "noMatch" | |
}, | |
{ | |
"next": "confirm_waitlist_reschedule", | |
"event": "match", | |
"conditions": [ | |
{ | |
"friendly_name": "If value matches_any_of Yes, yes, Y", | |
"arguments": [ | |
"{{widgets.send_new_option.inbound.Body}}" | |
], | |
"type": "matches_any_of", | |
"value": "Yes, yes, Y" | |
} | |
] | |
} | |
], | |
"properties": { | |
"input": "{{widgets.send_new_option.inbound.Body}}", | |
"offset": { | |
"x": -450, | |
"y": 1510 | |
} | |
} | |
}, | |
{ | |
"name": "confirm_waitlist_reschedule", | |
"type": "run-function", | |
"transitions": [ | |
{ | |
"next": "reschedule_confirmation", | |
"event": "success" | |
}, | |
{ | |
"event": "fail" | |
} | |
], | |
"properties": { | |
"service_sid": "ZScf0200d9d882eaa565a23d1b89076d9f", | |
"environment_sid": "ZEd8e3956cfcc1e828f2b63cec3916d83f", | |
"offset": { | |
"x": -180, | |
"y": 1770 | |
}, | |
"function_sid": "ZH1f69ce174fb17f5201b133a307a1f6bc", | |
"parameters": [ | |
{ | |
"value": "{{widgets.check_waitlist.parsed.new_record_id}}", | |
"key": "record_id" | |
}, | |
{ | |
"value": "Confirmed", | |
"key": "appt_status" | |
}, | |
{ | |
"value": "{{flow.data.appointment_date}}", | |
"key": "date" | |
}, | |
{ | |
"value": "{{flow.data.appointment_time}}", | |
"key": "time" | |
}, | |
{ | |
"value": "null", | |
"key": "waitlist" | |
} | |
], | |
"url": "https://appt-5108.twil.io/update-airtable" | |
} | |
}, | |
{ | |
"name": "do_not_update", | |
"type": "send-message", | |
"transitions": [ | |
{ | |
"event": "sent" | |
}, | |
{ | |
"event": "failed" | |
} | |
], | |
"properties": { | |
"offset": { | |
"x": -550, | |
"y": 1770 | |
}, | |
"service": "{{trigger.message.InstanceSid}}", | |
"channel": "{{trigger.message.ChannelSid}}", | |
"from": "{{flow.channel.address}}", | |
"to": "{{contact.channel.address}}", | |
"body": "Okay, we kept your same appointment time. See you then." | |
} | |
} | |
], | |
"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