# Airtable recipes

> Text people as records change in a base, and write their replies back to it.

Three recipes for Airtable. Each names its trigger and the BlueBot step, lists the fields to map and says how to test it with your own number before anyone else gets a text.

## How Airtable connects

- **[Zapier](https://usebluebot.com/docs/zapier)**: BlueBot’s Zapier app has a Send Text action and instant triggers for incoming texts and every change of state.
- **[Make](https://usebluebot.com/docs/make)**: BlueBot’s Make app sends texts and starts scenarios when a text comes in or changes state.
- **[API](https://usebluebot.com/docs/api)**: Your own code calls BlueBot’s REST API and listens to its signed webhooks.

## Text people when their order is ready

| Part             | What it is                              |
| ---------------- | --------------------------------------- |
| Trigger          | When a record enters a view in Airtable |
| Action           | BlueBot’s **Send Text** action          |
| Connects through | [Zapier](https://usebluebot.com/docs/zapier)                  |

### Steps

1. Make a view in your base that shows only records whose Status is Ready for pickup.
2. Start a Zap with Airtable’s trigger for a new record in that view.
3. Add BlueBot’s Send Text action and map the phone field to To.

### Map the fields

| BlueBot field                | Map it to                                                                                                                                     |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| To                           | The person’s mobile number from Airtable. US numbers can leave off the +1.                                                                    |
| Text                         | Hi {{first_name}}, your order is ready for pickup. We’re open until 6 today.                                                                |
| `{{first_name}}` in the text | Airtable’s first name field.                                                                                                                  |
| Metadata                     | `source` set to `airtable`, and `record_id` set to the record’s id, so the status and reply webhooks for this text can find the record again. |
| Service                      | Auto, the default: iMessage when the person uses it, otherwise SMS through your iPhone.                                                       |

### Test it

Put your own number in **To** and press **Test step**. A text arrives on your phone from your own number, and Zapier shows the message BlueBot returned with `state: "queued"`. Then map Airtable’s field back into **To** and turn the Zap on.

## Save replies on the record

| Part             | What it is                                                                       |
| ---------------- | -------------------------------------------------------------------------------- |
| Trigger          | A text comes in (BlueBot’s message.received webhook)                             |
| Action           | BlueBot’s **Watch Incoming Texts** module starts it, and Airtable takes the text |
| Connects through | [Make](https://usebluebot.com/docs/make)                                                               |

### Steps

1. Start a scenario from BlueBot’s webhook for incoming texts.
2. Search Airtable for the record whose phone matches the sender’s number.
3. Update that record’s Last reply field with the words of the text.

### Map the fields

| From BlueBot    | Into Airtable                                                                                                                                            |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **From**        | The phone number to find the person by in Airtable. It’s in E.164 (`+15555550123`); search by the last 10 digits if Airtable stores numbers another way. |
| **Text**        | The words, for a note, a row or a message. Null when the person sent only a picture.                                                                     |
| **Received At** | When it came in, in UTC.                                                                                                                                 |
| **Files**       | Pictures and voice memos. Each `url` works for an hour, so copy a file you want to keep.                                                                 |
| **Chat ID**     | Set when the text came in a group chat; null for a one-to-one text.                                                                                      |

### Test it

Press **Run once** in Make, then text your BlueBot number from another phone you’ve texted through BlueBot before. The scenario runs with that text. BlueBot copies texts from people you’ve texted through it, unless you set **Which chats to copy** to **Everything**.

## Keep the delivery state on the record

| Part             | What it is                                                                             |
| ---------------- | -------------------------------------------------------------------------------------- |
| Trigger          | A text is delivered or fails (BlueBot’s message.delivered and message.failed webhooks) |
| Action           | Airtable acts on what BlueBot reports                                                  |
| Connects through | [API](https://usebluebot.com/docs/api)                                                                       |

### Steps

1. Send from your script with POST /v1/messages and put the Airtable record ID in metadata.
2. Listen for message.delivered and message.failed, which carry the same metadata.
3. Update the record’s Text status field through Airtable’s API.

### Map the fields

| From BlueBot          | Into Airtable                                                                             |
| --------------------- | ----------------------------------------------------------------------------------------- |
| `data.state`          | `sent`, `delivered`, `read`, `failed` or `expired`, for a field or a filter.              |
| `data.metadata`       | The `record_id` you sent with the text, to find the record it was for.                    |
| `data.failure.reason` | Why a failed text didn’t go: `not_on_imessage`, `messages_refused` or `file_unavailable`. |
| `data.to`             | Who the text was for.                                                                     |

### Test it

Send one text to your own number, then look for the event. To try the step without sending anything, `POST /v1/webhooks/{id}/test` sends an example of any event type to your webhook.

## Before you turn it on

- Text only people who asked to hear from you. Anyone who replies STOP goes on your stop list, and BlueBot cancels texts to them. [Stop words](https://usebluebot.com/docs/concepts/stop-words)
- A text that can’t go yet waits with a hold rather than failing: quiet hours, your Mac away, a daily limit. [Holds](https://usebluebot.com/docs/concepts/holds)
- [Airtable with BlueBot](https://usebluebot.com/integrations/airtable) on the integrations page says what else the two do together.
