Set up the application locally

1. Clone sms-reminder

  1. Open a command shell session.
  2. Change the current working directory to the location where you want the cloned directory to be made.
  3. Copy and run the following:
  4. git clone

2. Update environment variables to work with the Flowroute Messaging API

  1. Change the current working directory to sms-reminder.
    cd sms-reminder
  2. Note: This quick start is a work in progress. To work with the Docker app, switch to develop branch.
    git checkout develop
  3. By default Docker Compose will look for an .env file in the same directory as your docker-compose.yml file. Open the .env file in the sms-reminder directory and update the variables with your Flowroute details:

Run Appointment Reminder via Docker Compose

  1. Start Docker if you haven't done so.
  2. Run the following to build the appointment_reminder service.
    docker-compose build
  4. Run the following to start the components of our application: Redis, Celery, and the Flowroute Messaging API.
  5. docker-compose up

Work with the reminder API endpoint

Create, retrieve, and delete appointment reminders

This tutorial doesn't cover how to set up your webserver with a public IP address.* See Additional Resources for more on that topic. We will have our appointment_reminder application listening at in our example requests.

Create an appointment reminder

Parameter Required Type Description
contact_number True string The recipient phone number in E.164 format. e.g., 1XXXXXXXXXX
appointment_time True string The scheduled appointment time in ISO 8601 "YYYY-MM-DDTHH:mmZ" format.
notify_window True integer The length of time, in hours, before the scheduled appointment to send a reminder. For example, 1indicates that a reminder is sent one hour before the appointment_time.
location False string The appointment location. Limited to 128 characters. The following SQL characters are disallowed:|,-,*,/,<>,<, >, ,,(comma),=,<=,>=,~=,!=, ^=,(,)
participant False string Provides more information about the appointment. For example, this might be a particular person or department at the location. Limited to 256 characters.

Example Request

curl -X POST -d '{"contact_number":"12067392634", "appointment_time": "2017-07-06T13:00-0800",  "notify_window":"1", "location":"Seattle Vision Clinic", "participant": "Thomas Smith at front desk"}'


The POST method accepts the following body parameters:

Example Response

A successful POST returns a reminder_id and a confirmation message as shown below:

  "reminder_id": "a74d3512583a48a194c2e2a600cc1903",
  "message": "Successfully created a reminder with id a74d3512583a48a194c2e2a600cc1903."


Response Field Descriptions

See Response field descriptions for details about the information returned in the response and Error response for error codes.

Retrieve a reminder list

Use the GET method to retrieve a list of reminders.

Example Request

curl -X GET

Example Usage

curl -X GET
Example response

A successful GET returns the following:

 {"confirm_sent": true, "contact_number": "12069928996", "participant": "Joe", "location": "West Side Mechanics", "reminder_id": "2a00aadba83b40aa8a3a6e99a1bd88b9", "appt_user_dt": "2016-07-15 11:40:00", "will_attend": true, "notify_sys_dt": "2016-07-15 17:40:00", "reminder_sent": true, "appt_sys_dt": "2016-07-15 18:40:00"}

Response Field Descriptions

See Response field descriptions for details about the information returned in the response and Error response for error codes.

Response field descriptions

The following information is returned in the response for both a single reminder and for a list of reminders:

Parameter Nullable Description
confirm_sent False Confirmation that the reminder was received. This will be true for received or false that the confirmation was not received.
contact_number False The recipient number for the appointment reminder.
participant False Any additional context for the appointment - this might be the name of a particular person or department at the location.
location True The location for the appointment. This might be the name of a business.
reminder_id False The appointment's original reminder_id.
appt_user_dt False The user's appointment time, based on the time zone passed in the original reminder.
notify_sys_dt False The user's appointment time, in UTC, minus the time set for notify_window.
appt_sys_dt False The user's appointment time, in UTC, based on the time zone passed in the original reminder.
reminder_sent False A 200 response was received from the Flowroute Messsaging API. This field will be either true or false.
will_attend True Displays null if the user hasn't responded; otherwise, this will display a yes or no boolean if the user has responded.

Delete a reminder

Use the DELETE method and pass an existing reminder_id to delete an appointment reminder.

curl -v -X DELETE http://:reminder/reminder_id
Example Usage
curl -v -X DELETE
Example Response

A successful DELETE returns the appointment reminder_id and message:

  "reminder_id": "fce20ff252d7490eb44311c7f18ed6be",
  "message": "Successfully deleted reminder with id fce20ff252d7490eb44311c7f18ed6be."

Error response

The reminder endpoint will return a 500HTTP status code if there is any internal error.

Change app settings (Optional)

Change messages and DateTime language

appointment_reminder/ contains default templates for appointment reminders, confirmation, cancellation, and unparsable responses. You can accept these default messages or optionally change any or all of the messages.

Within appointment_reminder/, you can customize the appointment reminder messages as well as change the LANGUAGE_DEFAULT value used for the DateTime in reminder messages.


Change the appointment reminder message sent to recipients.

MSG_TEMPLATE = ("[{}] You have an appointment on {}{}. "  # company, datetime, additional details            "Please reply 'Yes' to confirm, or 'No'to cancel.")



Do not remove or change the brackets (`{}`)within the message template.


Change the response message sent to the recipient upon a successful appointment confirmation received from the recipient.

CONFIRMATION_RESPONSE = (u"[{}]\nThank you! Your appointment has been marked confirmed.").format(ORG_NAME)


Change the cancellation response message sent to the recipient upon a successful appointment cancellation response received from the recipient.

CANCEL_RESPONSE = (u"[{}]\nThank you! Your appointment has been\"                   
                  u" marked canceled.").format(ORG_NAME)",


An unparsable response is a response received from a recipient that cannot be understood. For example, if the MSG_TEMPLATE asks the recipient to reply witheither Yes or No, but the recipient sends something other than either of those two options, the Appointment Reminder service will be unable to determine the response. The unparsable response message is a return message to the recipient prompting them again to respond witheither Yes or No.

UNPARSABLE_RESPONSE = (u\"[{}]\nSorry, we did not understand your response. "\n                                               u"Please reply 'Yes' to confirm, or 'No' "                       
                        u"to cancel.").format(ORG_NAME)"

Change the default DateTime language

In, you can set the DateTime of the reminder message to use any language supported by arrow.locales. Changing the default language translates only the DateTime values sent in the message to use those languages, not the content of the message itself.

To change the default language use the names identifying the language in arrow.locales. For example, to change the default language to French, edit LANGUAGE_DEFAULT as follows:


Some languages in arrow.locales also include abbreviated forms for months and days. If the language has abbreviated forms, that abbreviated form will be used in the message. For example, in French, the abbreviated form of mercredi (Wednesday) is mer, and juillet (July) is juil. An appointment reminder using a French DateTime will send the abbreviated forms.

For example, if your language is English your reminder message might be: "You have an appointment on Wednesday, July 21 at 2:00 PM. Please reply Yes to confirm, or No to cancel." If French is set as the default language, the same message appears as follows: "You have an appointment on mer 21 juil à 14:00. Please reply Yes to confirm, or No to cancel."

Additional Resources

To learn more about setting up a UNIX-based web server and running Python on it, read this blog series. The following articles are available for other environments: