Docs/SMS Messaging

SMS Messaging

Reach your audience by text. Modality can send SMS campaigns and event blasts either through its own platform sending (metered against your plan) or through your own Twilio account. This guide covers the two sending modes, how credits are metered, the compliance guardrails baked into every send, the automatic STOP footer, quiet hours, and per-contact frequency caps, how message length turns into billable segments, and how opt-in consent is captured and honored.

The campaign composer with SMS selected as a channel, showing the message body, the live character/segment counter, and the recipient audience.
The campaign composer with SMS selected as a channel, showing the message body, the live character/segment counter, and the recipient audience.

Two Ways to Send: Platform vs Your Own Twilio

Every SMS send resolves to one of two Twilio accounts. Modality picks automatically: if your workspace has a connected, active Twilio integration, that bring-your-own (BYO) account is used; otherwise the message goes out through Modality's platform Twilio. This mirrors how email defaults to Modality's own sender until you connect your own.

  • SMS via Modality (platform), the default. Messages send from Modality's branded Twilio number/messaging service. These sends are metered against your plan's included SMS allowance plus any prepaid packs (see Credits & Metering). No Twilio account required.
  • Bring your own Twilio (BYO), connect your own Twilio in Integrations with an Account SID, Auth Token (or API Key SID + secret), and either a From number or a Messaging Service SID. When present and active, it takes priority and messages bill directly to your Twilio account. BYO sends are not metered by Modality.
If neither a connected Twilio nor the platform sender is configured, SMS sending is unavailable and the composer shows a clear message to connect Twilio in Integrations or contact support.
The Integrations page Twilio connector card with fields for Account SID, Auth Token / API Key, and From number or Messaging Service SID.
The Integrations page Twilio connector card with fields for Account SID, Auth Token / API Key, and From number or Messaging Service SID.

Sending an SMS Campaign or Blast

SMS is one of Modality's campaign channels alongside email. You can send a standalone SMS campaign to a list or segment, or fire an SMS blast to the guests of a specific event.

  1. 1

    Choose your audience

    Pick a list or a saved segment. Only contacts that have both a phone number and SMS consent are eligible, everyone else is filtered out automatically before the send (see Opt-In & Consent).

  2. 2

    Write the message

    Compose the body (up to 1,600 characters). Insert merge tags like {{first_name}}, {{full_name}}, or any {{custom_key}} bound to a contact field, the same resolver used for email personalizes each recipient's text.

  3. 3

    Review length & segments

    The composer shows how many segments each message will cost. Longer messages and emoji increase segment count (see Segments & Encoding). For platform sends this is also your credit cost.

  4. 4

    Send or schedule

    On send, Modality checks quiet hours, resolves the sender, runs a pre-flight credit check for platform sends, then delivers one message per second (long-code rate limit). The automatic STOP footer is appended to every message.

As messages go out, each one is written to the message log with a status of queued sent, then updated to delivered or failed via Twilio's status callback. The campaign records totals for sent, failed, and skipped recipients.

GIF: composing an SMS campaign, watching the segment counter update as text is typed, then sending and seeing the per-recipient statuses move from queued to sent/delivered.

Demo GIF / screenshot to be added

Credits & Metering (Platform Sends)

SMS costs roughly 25× an email to send, so platform SMS is metered per segment as genuine cost-recovery. Each plan includes a monthly SMS allowance; sends draw from that allowance first, then from any prepaid SMS packs.

  • Free, 0 included SMS segments per cycle.
  • Pro, 100 included SMS segments per cycle.
  • Business, 500 included SMS segments per cycle.

The plan allowance resets each billing cycle. Prepaid SMS packs are a separate, persistent balance: they're drawn only after the cycle allowance is used up and carry over across cycles until spent. Buy packs in Settings → Billing.

What Happens When Credits Run Out

  • Card on file + billable plan, sends beyond the allowance and packs are auto-charged as metered overage, so the send is never pre-blocked.
  • Free / card-less / lapsed, a pre-flight check estimates the segments needed; if that exceeds what's left, the send is blocked before it starts with a prompt to buy an SMS pack or connect your own Twilio. If credits run out mid-send, the send stops cleanly rather than silently dropping messages.
Free-plan sellers earn a small amount of free platform SMS on paid ticket sales, 5 segments per paid ticket, capped so the grant never costs more than a portion of the platform fee collected on that order. Those earned segments land in the same persistent balance as prepaid packs.

Metering applies only to platform sends. Segments credited to a message that then fails at Twilio are automatically refunded to your balance. BYO Twilio sends are billed by Twilio directly and don't touch your Modality credits at all.

The Settings → Billing SMS usage panel showing included segments used vs. remaining, prepaid pack balance, and the buy-a-pack action.
The Settings → Billing SMS usage panel showing included segments used vs. remaining, prepaid pack balance, and the buy-a-pack action.

Segments & Encoding (GSM-7 vs UCS-2)

Carriers bill SMS per segment, not per message. How many characters fit in a segment depends on the encoding, which is chosen automatically from the characters in your message:

  • GSM-7, used when every character is in the standard GSM alphabet (basic Latin letters, digits, common punctuation). 160 characters per single segment; 153 per segment once a message spans multiple segments (the extra bytes carry the multi-part header).
  • UCS-2, used the moment the message contains any non-GSM character, such as an emoji or an accented letter outside the GSM set. This drops capacity to 70 characters per single segment, or 67 per segment in a multi-part message.

In short: a single emoji can more than double the cost of a message by switching it from GSM-7 to UCS-2. The composer's live counter reflects the encoding and segment count so there are no surprises. Metering rounds up conservatively, a message always costs at least one segment.

Remember that the automatic "Reply STOP to unsubscribe" footer is part of the message body and counts toward its length and segment total. A message sitting just under a segment boundary may tip into a second segment once the footer is appended.

Screenshot: the composer character counter showing a GSM-7 message at 160 chars / 1 segment, then a version with an emoji flipping to UCS-2 at 70 chars / segment.

Demo GIF / screenshot to be added

Compliance Guardrails

Modality enforces SMS best practices automatically on every send so you stay compliant without extra work.

Automatic STOP Footer

Every campaign SMS has "Reply STOP to unsubscribe" appended to the body, you don't write it and can't forget it. When a recipient replies with an opt-out keyword, they're unsubscribed immediately and never texted again unless they opt back in.

Quiet Hours

Following TCPA best practice, Modality will not send SMS during quiet hours, before 8:00 AM or after 9:00 PM. If you trigger a send inside that window, it's refused with a prompt to schedule it for later. Quiet-hours evaluation defaults to America/New_York when a recipient has no timezone on file.

Per-Contact Frequency Cap

To avoid fatiguing recipients and triggering spam complaints, each contact can receive at most 6 SMS per calendar month. During a send, any contact who has already hit that cap this month is skipped (and counted in the campaign's skipped total), the rest of the audience still goes through. The count includes outbound messages marked sent or delivered since the 1st of the month.

Rate Limiting

Messages are sent one per second to respect Twilio long-code throughput. Large audiences send over time rather than all at once; this is transparent to you and to recipients.

Screenshot: the quiet-hours block message shown when attempting a send after 9pm, and a campaign summary listing skipped recipients due to the monthly frequency cap.

Demo GIF / screenshot to be added

A contact is only eligible for SMS when they have a phone number and SMS consent on record. Consent is captured explicitly, for example, an attendee who checks the SMS-updates box on an event RSVP is opted in, and the moment is written to a consent log with a timestamp for your records.

Opt-out and opt-in are also driven by the recipient's own replies, handled through Twilio's inbound webhook:

  • Opt-out keywords: STOP, UNSUBSCRIBE, CANCEL, QUIT, END. The contact's consent is revoked, the opt-out is timestamped and logged, and they receive a confirmation reply.
  • Opt-in keywords: START, YES, SUBSCRIBE, UNSTOP. Consent is restored (any prior opt-out cleared) and confirmed back to them.

Consent state stays in sync between a contact and its unified People record, so an opt-out anywhere removes that person from every future SMS audience.

Phone Numbers & E.164

Twilio requires phone numbers in E.164 format (e.g. +19185551234), and that's how Modality stores them canonically. You don't have to type them that way, capture forms format numbers for humans as you type, and the server normalizes to E.164 on save.

  • A bare 10-digit US number becomes +1XXXXXXXXXX.
  • A number already carrying a 1 country code is normalized to +1….
  • International numbers must arrive with a leading +, they're kept as-is and never coerced to a US number.
  • A number that can't be resolved confidently is treated as "no sendable phone," so that contact is simply skipped rather than sent a malformed message.

The sender normalizes once more defensively at send time, so legacy contacts stored in mixed formats, dashed, parenthesized, or bare digits, still deliver correctly.