> ## Documentation Index
> Fetch the complete documentation index at: https://docs.elasticfunnels.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Send SMS Step

> Text a customer from an automation. Every text goes through the checks in Settings -> SMS and out from your brand's own Twilio sender.

**Send SMS** texts a customer from an automation. Find it in the step list under **Twilio**.

The step does not talk to Twilio by itself. It hands the text to your brand's SMS settings, which run the
compliance checks (STOP list, quiet hours, consent, state rules) and then send it from one of your
senders in **Settings** -> **SMS**. Set those up first: see [SMS compliance](/settings/sms).

## The fields

| Field | What it does |
| - | - |
| **Phone number** | Required. A variable such as `{trigger.customer_phone}`, or a number with its country code. |
| **Sender** | Optional. One of the senders in Settings -> SMS. Empty uses the brand's default sender. |
| **Type** | **Marketing** (the default) or **Transactional** for order and account updates. |
| **Message** | Required, up to 1,600 characters. Variables work here. |
| **Image URL** | Optional. A public image link to send with the text. |

## Marketing or transactional

Pick **Marketing** for anything promotional: offers, cart reminders, win-backs. Pick **Transactional**
only for texts the person needs, like a shipping update.

| | Marketing | Transactional |
| - | - | - |
| Needs the consent statement accepted | Yes, skipped until it is | No |
| Quiet hours, frequency caps, excluded states | Apply | Do not apply |
| Suppression list, STOP | Applies | Applies |
| Consent check | SMS marketing consent, for example a ticked checkout box | A purchase records it |

A transactional text with promotional words in it gets a content warning.

## What the step returns

The step finishes with the result of the checks, and the run goes on to the next step in every case:

| Output | Meaning |
| - | - |
| `status` | `queued` or `sent` when it went out, `deferred` when quiet hours hold it, `skipped` when a check stopped it |
| `skipped` | `true` when the text was not sent |
| `skip_reason` | Why, for example `suppressed`, `no_attestation` or `quiet_hours_expired` |
| `warnings` | Problems logged in warn mode while the text still went out, for example `content_shortener` |
| `defer_until` | When a held text will go out |
| `message_id` | The text's row in Settings -> Logs -> SMS |

A skipped text is not a failure. See [Why a text was skipped](/settings/sms#why-a-text-was-skipped).

A retried run never texts the same person twice for the same step and event. A test run in the builder
asks the checks for their answer and sends nothing.

## Example: cart reminder

Trigger: a cart abandon. Step: **Send SMS** with **Phone number** `{trigger.customer_phone}`, **Type**
Marketing and a message such as:

```text theme={null}
Northwind: You left something in your cart. Finish your order here: https://shop.example.com/cart Reply STOP to opt out
```

Start the text with your brand name and end it with how to opt out. Use your own domain for the link:
public shorteners like bit.ly get a content warning, and carriers often filter them.

## Related docs

* [SMS compliance](/settings/sms): the checks, senders, suppression list and SMS log
* [Twilio](/integrations/twilio): connect the account your texts go out from
* [Variables](/automations/variables): insert values from the trigger and earlier steps
* [Run history](/automations/run-history): see what each run did


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.