Use Facebook Messenger's Checkbox Plugin to Message Website Visitors

Facebook Messenger’s new Checkbox Plugin enables you to authenticate Facebook users with a discrete checkbox that fits naturally into any form. It could be used for just about any form-based use case, but it’s value for TextIt users is collecting opt-ins and contacting website visitors. Once a visitor completes the form, TextIt will message them via Facebook Messenger and add them to your contact list. 

To set it up, navigate to the Triggers page, create a trigger and select the ‘Start a flow when Facebook refers a Contact’ option. In addition to FB Messenger channel and flow, you’ll need to enter a referral id unique to this plugin, e.g. 'textit'. 

Finally, add the plugin to a form on your site. You’ll need to include the optional ref parameter and make sure its value matches the referral id you gave TextIt.

You’re good to go! Any time a visitor clicks your plugin, they’ll receive a message via Facebook Messenger.

Questions? Comments? Let us know. Your feedback is important to us. 

Introducing Nexmo Voice Support

When Nexmo released their new voice API, we jumped at the chance to support it. Nexmo, like Twilio, is a great tool for organizations and developers who want to provide SMS & IVR (voice) communication channels. 

Why Voice?

TextIt’s voice flows allow you to build structured voice interactions that utilize phones' keypads and voice recording functionality. In particular, voice workflows are handy for three reasons:

  • They allow you to send and receive voice messages with improved tone, character and length when compared with text messages.
  • They're synchronous: contacts are actively engaged with your flow for the duration of the call.
  • They enable you to communicate at scale with those who can’t read or write, expanding your organization’s reach.

Use Cases

TextIt’s voice flows can be used to create automated call centers capable of triaging calls and directing clients to the appropriate team member. Alternatively, they're great for outbound communication campaigns: In June of last year, we brought attention to the polio-eradication efforts of UNICEF, the WHO, and the Federal and Provincial Emergency Operation Centers on Polio in Pakistan. In this context, UNICEF's Pakistan Innovations team built voice workflows to disseminate polio knowledge-check surveys designed to equip community leaders with the information they need to affect harmful anti-vaccination discourse and raise awareness within illiterate communities.

Which Service Should I Use?

That’s entirely up to you, as number pricing and availability vary between the two services. First, visit Twilio and Nexmo’s pricing pages to determine whether or not voice-enabled numbers are provided in your country. Learn how to add a voice-enabled Twilio number here

Using Nexmo Voice

The process is simple and painless. First, signup for a Nexmo account and add a voice-enabled number.

Next, login to your TextIt account, navigate to the channels page and select Nexmo. 

If this is the first time you’re connecting a Nexmo account to your TextIt account, you’ll be prompted to enter the API key and secret listed on your Nexmo account’s settings page. Once you’ve connected your accounts, all you need to do is select your number, create a voice flow and start sending.

Questions? Comments? Let us know! We value your feedback. 

Use TextIt to send Emails from your own Address

Sending Email from TextIt

TextIt’s Send Email action is vital to self-service chatbots and standalone messaging workflows alike, as it allows you to notify yourself, your team, or even the active user when a certain condition is met, e.g. a support request is submitted. A chatbot can’t handle every situation, and we don’t believe it should. While they’re great for tedious tasks like registering a user, processing a purchase, checking the weather or booking a flight, a human touch is essential to providing a flexible, reliable and amicable service. After all, more than 8 out of 10 (85%) consumers not only want to be able to receive information but also reply to businesses or engage in a conversation

Using your own Address

By default, TextIt sends emails from no-reply@textit.in. If you’d like to add your own address, simply navigate to your account’s settings page and click the email icon.

Here we’re using a Gmail-hosted email address. You’ll want to plugin your email address, host URL, credentials, port and encryption preference. In the example above, encryption needs to be set to TLS because that’s the protocol Gmail’s SMTP port 587 uses.

Gmail-Specific Considerations

If you want to link a Gmail address to TextIt, you’ll need to switch the ‘Allow less secure apps’ setting in your Gmail account’s ‘Connected apps & sites’ page to ‘ON’:

https://myaccount.google.com/security#connectedapps

Note that a standard Gmail account is limited to 500 emails per day. Learn more about Gmail’s limits here:

https://support.google.com/mail/answer/22839?hl=en

Questions? Comments? Let us know! ⌨  Your feedback is important to us. 

Customer Spotlight: Learn why BANGS Shoes adopted TextIt

BANGS Shoes is a fashion brand with a unique mission: help people help themselves. Their model is simple, but powerful: sell sleek, classic shoes to fund entrepreneurs around the globe. To date, they’ve invested in 480 entrepreneurs in 58 countries including the USA. We spoke with Hannah Davis, BANGS Shoes’ founder, to learn more about TextIt’s role in their business.

BANGS Shoes

BANGS invests 20% of net profits to help hand-selected entrepreneurs around the world start businesses. Kiva, a nonprofit organization that allows people to lend money via the Internet to low-income entrepreneurs and students in over 80 countries, vets entrepreneurs and handles both loan dissemination and repayment. When a loan is repaid, BANGS re-invests the money in a new entrepreneur. This process increases financial independence, boosts local economies and promotes personal development.

Why TextIt?

Proudly based in Asheville, North Carolina, BANGS Shoes sells exclusively through their website. They use social media and a brand ambassador community to build their brand, which targets adventure-loving, socially-conscious men and women between the ages of 18 and 24.

They initially visited college campuses to build and support their brand ambassador community, but switched to TextIt when it became apparent to Hannah that, in her words, "we needed a way to communicate with our Ambassadors that didn't require a change of behavior." TextIt enables Hannah to send out notifications to her ambassadors, then personally handle each of their responses. It has enabled her to build a personal relationship with each one–something that's very import to her.

Between social media and TextIt, Hannah's approach has paid dividends. BANGS Shoes' ambassador program has grown by 2,000% since 2012.

Interested in learning more about BANGS Shoes? Visit their website or follow bangsshoes on Instagram. Check out their newly-released homage to North Carolina's Blue Ridge Parkway, the Blue Ridge Parkway high top.

Have a question for us? Please, get in touch

Key Mobile Messaging Insights for a Successful 2017

(image source: Dimoco

2016 was a great year for mobile messaging: messaging app usership skyrocketed, smartphone ownership continued to increase around the world thanks to low-cost Android, and chatbots burst onto the scene when Facebook announced Messenger’s bot platform.

In the spirit of reflection, we’d like to share Twilio’s 2016 global mobile messaging consumer report. It's full of great insights even if you don't use Twilio. For those who aren’t familiar, Twilio is by far our most popular integration. It enables organizations around the world to create and deploy SMS or IVR bots in minutes. 

Some key takeaways: 

  • 89% of global consumers want to use messaging to communicate with businesses.
  • The average consumer has 3 messaging apps on their phone’s home screen, uses 3 different messaging apps per week, and sends 3 messages per hour. 
  • 47% of consumers prefer to communicate with businesses via SMS vs. FB Messenger, Whatsapp, Line, Snapchat and others. 
  • More than 8 out of 10 (85%) of consumers not only want to be able to receive information but also reply to businesses or engage in a conversation.
  • Most customers enable notifications for messaging apps (86% in US, 82% in Europe and 77% in Asia, respectively). 

Here’s a link to the full report: 

https://goo.gl/nopogB 

Questions? Comments? Let us know! ⌨  Your feedback is important to us. 

Introducing the New Flow Results Dashboard

We recently updated the flow results page to display both high and low level information about a particular flow’s performance. 

High-level information is displayed in the top half of the page, as illustrated by the image above. The first graph displays message frequency by day, while the second displays frequency by time. You can use these graphs to evaluate your flow’s performance or plan future broadcasts. 

Beautiful Data

The pie chart on the right of the page displays both the number and percentage of participants who’ve entered and either completed the flow or exited from it, as well as those who exited before completing it. 

Finally, we included a histogram which displays the total number of messages sent and received by date and time throughout your flow's lifespan. 

Getting Granular

The bottom half of the page lists each run. Here, you can view either the value collected by each RuleSet or the full text of the contact’s response at that particular step. Just click the flow icon to toggle between the two values. Additionally, you can add as many columns as you’d like from the 'Add Column' dropdown. 

Exporting Results

Click the ‘Download’ button in the top right corner of the page to export these results to a spreadsheet. You can include up to 10 contact fields, and choose to limit results to only those who responded or each contact’s most recent run. 

Considerations

Charts will only display for flows with 200 or more responses. The histogram pops up after 1,000.

Questions? Comments? Let us know

Lessons on SMS Survey Design: A Factorial Experiment on SMS Survey Participation using TextIt

Laterite, a Rwanda and Ethiopia-based research and advisory firm, recently used TextIt to implement an SMS survey with agricultural cooperatives in Rwanda. This survey was unique in that it was also used to measure the impact of survey delivery on participation rates. We spoke with Josep Casas and Mallory Baxter of Laterite's research team to learn more about their findings.

Laterite

Laterite provides data collection and econometric analysis services to government agencies and ministries, international NGOs, think thanks, academic institutions, and development organizations. They conduct the vast majority of their work in countries in which they have an established presence in order to build a strong understanding of the local context.

conTEXT

Using TextIt, Laterite has developed an SMS-surveying solution called conTEXT that is operational on all of Rwanda’s telco networks. It allows the company to send reverse-billed SMS surveys (i.e. at no cost to respondents) as well as airtime incentives on completion of those surveys.

The Experiment

Using conTEXT, Laterite recently conducted an SMS-based survey with members of agricultural cooperatives in Rwanda. They were hired by SPARK International to assess its Cooperative Support Programme (CSP), which targets agricultural cooperatives and SMEs operating in bean, Irish potato, maize and horticulture value chains with an aim to increase food security and stability by accelerating agri-business development, promoting rural economic growth and generating jobs in Rwanda's agricultural sector. The project's budget for interviews was limited, so Laterite and Spark decided to use conTEXT to collect complementary data from cooperative members.

This was the first SMS survey Laterite had carried out in Rwanda, so they wanted to use it to determine the best way to deliver future surveys. The key question was: can small tweaks to SMS survey delivery increase participation, and if so, which? Laterite's research team designed a factorial experiment to explore this question. They tested five factors they thought might impact cooperative members' willingness to participate:

  • Introduction Type: The majority of cooperative members (85%) were introduced to the survey via a phone call while others were introduced to the survey directly via SMS (15%). The call was scripted and focused on potential questions participants might have regarding the content and purpose of the survey.
  • Time of DayHalf of the cooperative members received their surveys in the morning (10 AM) while others received them in the afternoon (4 PM).
  • Personalization: Half of the cooperative members received messages that were personalized (addressed them by name in the introduction using TextIt’s substitution variables) while others received generic messages.

  • Financial Incentive: Half of the cooperative members were informed before the survey that they would receive an incentive of RWF 100 in airtime for completing the survey and received this incentive on survey completion. The other group did not receive any reward.
  • Survey Expiration: Half of the cooperative members were made aware of the fact that the survey would expire after 1 week (as flows can be configured to expire after a period of inactivity) while others were not.

Laterite tested the impact of the phone introduction by randomly allocating 15% of the sample to the SMS Intro group and the rest to the Phone Intro group. Individuals in the phone intro group were called by the enumerator team before the TextIt flow was initiated. Once consent had been obtained following the initial introduction, Laterite implemented a factorial experiment with the remaining factors.

In a factorial experiment, an intervention is broken down into factors and levels, e.g. the factor representing time of day has two levels: morning and afternoon.  In this experiment, Laterite was testing 4 strategies–each with 2 levels–resulting in 16 (2^4) possible experimental conditions. This means that they had to deliver the survey in 16 unique ways. Using a series of “Split by Contact Field” RuleSets, Laterite could create different routes inside the TextIt flow so that each candidate received the messages corresponding with their own combination of factors.

While analysis is on-going, preliminary results suggest that pre-survey phone calls and message personalization had the largest impact on increasing participation rates. Interestingly, financial incentives appear to have had no effect.

Preliminary Results

Introducing the survey via phone call instead of SMS increased the participation rate by 18% while message personalization led to an increase of 8%. Other factors weren't statistically significant. 

Figure 1. The effect of each of the factor on participation rates.

DesktopTextIt20BlogPicture2png

*Green factors were statistically significant while red factors were not

Laterite also tracked the number of errors that occurred for each type of question, allowing them to identify which questions work best. In this case, 'error' is defined as an invalid response as determined by the response rules present in each RuleSet. For example, Laterite included a question that asked participants to reply with their gender and age separated by a plus sign delimiter (e.g. "female+30"). They found that 37% of respondents could not answer the question correctly on the first try while 10% raised an error at least 3 times. Message form questions–as these are called–are unique in that they enable you to collect multiple values in a single message, reducing the number of questions required. To ensure message form error rates are low, you'll want solicit feedback from your contacts and test other value combinations and delimiters (spaces and periods) to determine what works best in your project's context. 

Moving Forward

Laterite’s research team is currently working to understand the links between these factors, survey completion, and attrition between survey rounds. Among their questions is whether a single phone introduction has a lasting effect on participation rates. Laterite is also looking to replicate this experimental design in other contexts to build a body of evidence around the optimal delivery of SMS surveys. 

Questions? Comments? Let us know! Questions for Laterite can be directed to Josep or Mallory, linked above, or its website

v2: Introducing TextIt's new API

API v1 is now deprecated and will be removed on March 1st 2017

A new version of the TextIt API is now available. The purpose of this release is to ensure our operations are performant at scale. TextIt needs an API that is always fast.

We also cleaned it up, providing an interface that's now more consistent across different endpoints. We even put some thought into ensuring this version will be future-proof. 

Changes to look out for...

If you're migrating code that uses our API, be sure to reference the API v2 documentation. Below are the general changes to look out for:

  • All operations which list objects use cursor pagination rather than the typical Django page=1,... etc pagination. This means we do not return a total count value for result sets. Count values tend to be expensive to calculate on very large datasets so this was not sustainable as databases grow.
  • Filtering options are limited to single values. For example, in v1 you could fetch runs like runs.json?id=1131241,436364,464363... but now the 'id' parameter can only contain a single value. If you find yourself needing to fetching lots of objects repeatedly, then it may be better to restructure your code so that you fetch all objects of that type as they are created or modified.
  • When updating objects, the identifier is sent as a query string parameter rather than a field in the JSON body. This is more RESTful and makes POSTs more consistent with GETs and DELETEs, e.g. changing a contact's name:

    POST contacts.json
    {
      "uuid": "1c904f04-af6f-4f2b-89e1-9ebf0c5aef73",
      "name": "Bob"
    }


    Becomes...

    POST contacts.json?uuid=1c904f04-af6f-4f2b-89e1-9ebf0c5aef73
    {
      "name": "Bob"
    }
  • Status code usage is more consistent. In v1, the status code 201 was used for both successful create operations and update operations. Trying to update a non-existent object returned 400 but trying to delete the same object returned 404. In v2, the rules for status codes are more explicit:
    • 200: A list or update request was successful.
    • 201: A resource was successfully created (only returned for POST requests).
    • 204: An empty response - used for both successful DELETE requests and POST requests that update multiple resources.
    • 400: The request failed due to invalid parameters. Do not retry with the same values, and the body of the response will contain details.
    • 403: You do not have permission to access this resource.
    • 404: The resource was not found (returned by POST and DELETE methods).
  • Objects are referenced in more consistent ways:
    • messages, runs and broadcasts are always referenced by their id value.
    • contact fields by their key.
    • groups and labels by name or UUID.
    • everything else is referenced by its UUID.
  • Datetime values are always returned with microsecond accuracy (v1 used only millisecond accuracy).
  • Phone numbers must now always include country codes, i.e. we won't accept a URN like "tel:0964153001" but we will accept "tel:+260964153001". 
  • The message bulk action endpoint is limited to 100 messages, so if you need to update more messages than that, make sure you batch your requests.
  • Some vocabulary has been removed. In v1 messages could sometimes be sms and channels could be relayers. In v2 it's always messages and channels.
  • All endpoints are rate-limited. If you're making lots of requests then expect to get some 429 responses. These will include a Retry-After header which provides a number of seconds to wait before retrying.

API Explorer

You can use the API Explorer to test these new operations against your account's data. 



If you have any questions about migrating to v2, don't hesitate to ping us here.

Automatically Add Flow Responses to Google Sheets with Google Apps Script

If you're using TextIt, you're likely interested in analyzing the results of each interaction your contacts have with your messaging bot. You probably also want to streamline the process of viewing and analyzing them. You can do so by sending the results of each flow run to a Google Sheet as your contacts finish them. There, you can visualize your data as it's being updated and even build a custom dashboard.

It's possible to set this up with a service called Zapier, but you can also use Google's powerful, built-in, JavaScript-based scripting language Apps Script. In this tutorial, you'll learn how to use Apps Script to add the results of a run down the 'Satisfaction Survey' sample flow to a Google Sheet. Feel free to follow along with the copy in your account, 'Sample Flow - Satisfaction Survey'.

Prerequisites 

  • TextIt account
  • Google account 

Let's Begin

Our goal: To send flow responses to a Google Sheet.

This messages in this flow run will be sent to a Google Sheet. A new row will be created for each run. 

Create your Spreadsheet

First, we’ll create a new spreadsheet and set up the rows that will hold our data. To make these columns easier to interact with, we’re going to make use of Named Ranges. This allows us to give each column a name that we can reference in our script. To name a range, double-click the column, then select 'Define named range...'. Give it a one-word name. It's vital that all rows are selected, e.g. 'Sheet1!B:B'. 

Go ahead and name all 7 of your new columns.

Create a Script

Now we'll start scripting. From the Tools menu, select Script Editor. Give your script a name. 

Erase the existing code in the editor and add the following code: 

Let’s look at the first 3 lines of code:

  • Line 1: we create a doPost() function so that our script can receive flow results via POST requests. These POST requests will be made when the active contact reaches a Call Webhook RuleSet. This function, unique to Apps Script web apps, will process any new POST request from our flow once we’ve deployed our script as a web app.
  • Line 2: we're gaining access to our spreadsheet file. Google Apps Script differentiates between a spreadsheet and a sheet (a spreadsheet is a file that may have one or more sheets–or worksheets or tabs). We can gain access to the entire sheet by referencing its ID (the long string of characters in the spreadsheet’s URL after '/d/'). Replace the placeholder in the code with your spreadsheet ID.
  • Line 3: the request object will contain the entire payload of the incoming POST request. We're assigning it to a variable in order to conveniently access its parameters.

Publish your Script

Select Deploy as Web App from the Publish menu in the script editor, then choose the following options:

  • Execute the app as: Me
  • Who has access to the app: Anyone, even anonymous

Click Deploy, then copy the address of the Current web app URL to your clipboard. You’ll need that for your webhook. Congradulations, you've just published a web app!

Add a Webhook to your Flow

Add a 'Call Webhook' RuleSet to the end of your 'Satisfaction Survey' flow. Select POST and paste the URL provided in the previous step: 

Before you click Ok, make sure to add a query string to the end of the URL to include the flow variables that represent the responses your flow has collected. Not familiar with flow variables? Learn about them here.

Here's mine: 

https://script.google.com/macros/s/AKfycby-lk-z7dOqUHBdBJx5ciJxanpiqcQeLBB-vNTbZOzTTVDd9OM/exec?date=@date.now&number=@contact.tel_e164&returning=@flow.shop_again&recommend=@flow.recommend&suggestion=@flow.suggestion&gender=@flow.gender&age=@flow.age

The query string represents everything from the '?' to the end of the URL. It allows you to create parameters to be sent to your web app. We're simply adding flow fields to the URL so that TextIt knows to send them to our web app and the Google Sheet knows to add them to its columns. The names you give these values should be one word and describe them accurately as you'll be referencing them in your script. 

Finish your Script

First, we'll need to add a function that crawls the rows in each column. The nextRow() function will do just that. Copy this code, replacing the parameter in SpreadsheetApp.openById() with the ID after the /d/ in your Google Sheet's URL. I've highlighted its location below:

https://docs.google.com/spreadsheets/d/<sheet_id>/edit#gid=0

The final step is to map the incoming data–represented by TextIt variables–to the columns in the your Google Sheet. Copy the code below (starting from the comment '// Isolate flow field values...') and replace the parameter and column names in the code above. For example, consider these two separate but related lines:

var date = request.parameters.date;

sheets.getRangeByName('date').getCell(nextRow, 1).setValue(date);

In this case, date in request.parameters.date and .getCell(nextRow, 1).setValue(date) should be changed to the name you gave your date flow field (if other than @flow.date), and 'date' in  sheets.getRangeByName('date') should be changed to the name you gave your date column in your Google Sheet (if other than 'date').

Test your Service

Nice job, you're ready to test your web app with the simulator. Complete your flow and watch your responses appear in your Google Sheet

Questions? Comments? Let us know. We love hearing from you.

Add Features to your Chatbot with Webhooks

webhook is a handy tool that you can use to transfer information into and out of a web app through simple HTTP requests containing data in a structured format (JSON, in TextIt's case). Better yet, you don't need to have extensive coding experience to make use of them. 

In TextIt, we make webhooks available to you through the Call Webhook RuleSet, which sends the phone number of the active contact, their state in the flow, and the flow's name to the URL you specify. See the Flow Event webhook documentation for a full list of the values included in that request. This RuleSet can be used to send information to other service's APIs, like Zapier (see this guide to get started with the TextIt Zapier app), Google Maps, Google Sheets, and really any other service that provides a JSON API. Use this guide to learn how to add functionality to your bot by making use of other services' APIs. It only takes a few clicks. 

Whereas TextIt's 'Wait for Response' RuleSet allows you to evaluate incoming responses according to various response rules, the 'Call Webhook' RuleSet allows you to send responses to an external service and either evaluate or reply with that service's response. For example, you can use a 'Call Webhook' RuleSet to POST a message to the Google Translate API, then reply with the translated message using a 'Send Message' action that contains a variable–starting with the '@extra' prefix*–that matches the translated message's key in the returned JSON object. 

*As the image above demonstrates, you can access keys stashed in arrays (between '{[' and ']}') by placing '.0.' in front of the key. 

See for Yourself

Search the following bots on Telegram to interact with flows that make use of other services' APIs: 

Oxford Wordsly, a bot that tests your English and Spanish vocabulary using a collection of APIs. 

Purrington, a bot that provides cat facts. 

Bandito, a bot that provides Spanish translations.

Using Webhooks

To get started, you'll need an API, a key to access it, and a sample request from that API's documentation. In the example below, we'll be using Google's geocoding API to verify addresses submitted by our contacts. Instructions for acquiring a key are usually front and center in the API's documentation:  

The documentation states that we'll need to structure the request like so: 

https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY

The request above dictates that, aside from our key, we'll just need to provide an address. To do so, we'll need to create a flow that asks the active contact for their address. We'll be using an open-ended 'Wait for Response' RuleSet labeled 'Address' to handle that response. 

Next, we'll connect the 'Address' RuleSet to a 'Call Webhook' RuleSet. We can place the variable created by the 'Address' RuleSet in our request to ensure that it represents the address each contact submits. 

Now we can use the simulator to inspect Google's response. 

Google responded with a 200, meaning that our request was successful. Now we'll need to parse it's response for the fully formatted address. We can do so by clicking the highlighted 'webhook event' link in the simulator. The key we're looking for is 'formatted_address'. 

Since this key is actually housed in an array under a key called 'results' (the 'results' array isn't visible in the image above), we'll need to place '.0.' in front of it to access it: 

@extra.results.0.formatted_address

Finally, we'll need to account for failures. We can do so by connecting the 'Failure' category that the 'Call Webhook' RuleSet automatically creates to a message that prompts the active contact to try again. 

Voilà, we've created a flow that collects and verifies our contacts' addresses using Google's Geocoding API. What will you build? 

Tips

  • If an API responds with minified JSON, you can expand it using this tool
  • This page is a great resource for publicly-available JSON APIs

Questions? Comments? Let us know! We love hearing from you.