SMS

Text messages for the three things that cannot wait for an inbox — and the log that says which were sent, refused, or never attempted.

Admin → Settings → SMS · SMS log

SMS is optional, and narrow on purpose

Texting costs money per message, so the platform sends only what genuinely needs to arrive within seconds. Everything else is email. Three purposes:

PurposeSent to
Verification codeSomebody confirming a phone number.
Table readyA waiting guest whose table has come free.
Payment linkA customer being asked to pay for an order by link.

Leave SMS switched off and all three fall back to what they did before. Nothing breaks.

Setting it up

FieldNotes
Enable SMSThe master switch. Off, nothing is attempted and nothing is billed.
ProviderTwilio. Its credentials appear when you select it.
SenderThe number or name a customer sees the text from. It stays yours when you change provider, because it answers a question about your business rather than about the provider.
Test recipientA number to send a test to. Use it before you rely on any of this.

One more switch here: Require a code to change a phone number. On, changing a number sends a verification code to the new one first — worth it if your customers can be texted a payment link.

The log

Every attempt, with counts across the top: delivered, rejected, never sent, delivery rate and billed segments. Segments are what you actually pay for — a long message is split into several — so a rising bill with flat message counts means your wording grew.

Three states, and the difference matters

StatusMeaningFixed
DeliveredThe provider accepted it.—
RejectedThe provider was called and said no.At the provider — credentials, sender, account balance.
Never sentThe provider was never called.Here, in Settings.

Never sent is the useful one, because the platform explains itself: SMS switched off, no credentials saved, no sender set, the number missing its country code, the number containing something that is not a digit, the message empty or too long, or the PHP cURL extension not installed. Each is stated in those words on the row.

Verification codes are masked in the log. A code stored as readable text would defeat the point of hashing it. The entry still proves what was sent — "Your code is ••••" — without keeping the code.

Filter by status or purpose, search by number, message or the provider's own reference, and Prune old entries. Each message carries the provider reference, so a dispute can be taken to the provider with a number they recognise.

When it doesn't work

Everything says "Never sent"

Read the reason on the row — it names the missing piece. Usually SMS is off or no credentials are saved.

Everything says "Rejected"

The provider refused. Check the credentials, the sender number is one your account may send from, and the account has credit.

One message says the credentials were already rejected

After the provider refuses your credentials once, later messages are skipped rather than retried — there is no point paying for repeated rejections. Fix the credentials and the next message goes.

A number is refused for its country code

Numbers need their country code, starting + or 00. A local-format number is ambiguous and is refused rather than guessed at.

The bill is higher than the message count suggests

Check billed segments. Long messages cost several each.