A rule watches every SMS you receive. When the message matches its trigger (a keyword, a pattern, a first contact, a message outside opening hours...), the rule runs its actions: reply by SMS, label the conversation, add the sender to a group, call one of your tools. Together, your rules form the auto-responder.
Rules live in Rules, in the Automation section of the menu. The global switch that turns all automatic replies off or on lives in Settings > Auto-responder.
What rules are for
- Answering
PRICES,HOURSorADDRESSwith the right information, day and night. - Telling people who write in the evening or on weekends when you will answer.
- Welcoming a new number with a message and filing it into a "Leads" group.
- Labelling every message that contains "invoice" so the accounting team finds it.
- Notifying your CRM or n8n when a customer writes a given keyword.
How the rules are evaluated
When an SMS arrives, the gateway walks through your active rules from top to bottom:
- A rule whose trigger does not match is skipped.
- The first rule that matches runs its actions, in their order.
- Then the chain stops, unless that rule has Let the chain continue checked: in that case the next matching rules run too.
- An action Stop the chain ends everything at once, including the remaining actions of that rule.
The order is therefore part of the behaviour. Reorder the list by dragging a rule by its handle, or with the Move up and Move down buttons; the order is saved immediately. Each rule shows a badge that sums up its effect on the chain (Stops the chain when it matches, Lets the chain continue, Stops everything), and a rule that can never be reached because an earlier rule catches every message is flagged Never reached, with a warning naming the culprit.
Rules only look at received SMS. They never react to what you send.
Create a rule
Click New rule. The form has the following options.
General options
| Option | Default | Allowed values | Effect |
|---|---|---|---|
| Rule name | None | 1 to 80 characters, unique | For you and for the Activity log |
| Trigger | None | See the table below | What makes the rule fire |
| Rule active | On | On or off | An inactive rule is kept but never evaluated |
| Let the chain continue | Off | On or off | Off: when this rule matches, the rules below are skipped. On: evaluation goes on |
| Anti-loop window (minutes) | 60 minutes (empty field) | 1 minute to 7 days | At most one automatic reply per contact over this period, all rules together |
| Delay before replying (seconds) | 0 (empty field) | 0 to 120 | Waits before the reply leaves, for a more natural feel |
Triggers
| Trigger | Fires when | What to fill in |
|---|---|---|
| Exact keyword | The whole message is one of the keywords | Keywords, separated by commas: 50 at most, 120 characters each |
| Keyword contained | The message contains one of the keywords | Keywords |
| Regular expression | The message matches the pattern | Regular expression, without slashes, 500 characters at most |
| Any incoming message | Every message. Put it last: it catches everything | Nothing |
| First contact | The first message from a number never seen before | Nothing |
| Outside hours | A message received outside the opening hours of the rule | Opening hours, below |
Keywords and regular expressions ignore case and accents, and spaces around keywords: Tarif,
TARIF and tarif all match the keyword tarif.
Opening hours (trigger Outside hours)
| Option | Default | Effect |
|---|---|---|
| Working days | Monday to Friday | Days on which you are open. At least one |
| Opens at | 09:00 | Start of the opening hours |
| Closes at | 18:00 | End of the opening hours. Must be after the opening time |
| Time zone | The platform time zone | The zone in which these hours are read |
These hours belong to the rule. They have nothing to do with the night and Sunday pauses of the settings, which only hold campaigns and never an automatic reply.
Actions
A rule has 1 to 10 actions, run in the order shown; Add an action, reorder or remove them in the form.
| Action | Options | Effect |
|---|---|---|
| Reply by SMS | Reply content: Free text (up to 4000 characters) or Saved template | Sends an SMS to the sender. Template placeholders are filled from the sender's contact record; see Templates |
| Call a webhook | Webhook URL (http or https), Signing secret | Sends a signed HTTP call to your tool. The secret is write only: it is never shown again |
| Add to a group | Group | The sender's contact joins the group |
| Remove from a group | Group | The contact leaves the group |
| Label the conversation | Label (40 characters at most), Thread state: Open, Pending (default) or Resolved | Tags the conversation and sets its triage state in Conversations |
| Stop the chain | None | Ends evaluation here: remaining actions of this rule and all later rules are skipped |
The call made by Call a webhook carries the rule identifier and name, the conversation
identifier, the sender's number masked (+261******89) and the time. It never carries the text
of the SMS. It is signed and retried like any webhook: see Webhooks.
The guards that protect you
An auto-responder that answers another auto-responder can send thousands of SMS in minutes, all billed to you. Three guards stand in the way of every automatic reply:
| Guard | What it does |
|---|---|
| Anti-loop window | One automatic reply per contact per window, whichever rule answers. If three rules match the same message, only one SMS leaves |
| Opt-out | A number that sent STOP never gets an automatic reply. This is a legal obligation, no rule can bypass it |
| Global switch | Send automatic replies in Settings > Auto-responder. Off, no rule replies any more |
When a guard holds a reply back, the Activity log says so with the reason ("anti-loop guard", "opted out", "switched off"). The window is used up as soon as a reply is queued, even if the phone then fails to send it: at worst a contact misses one automatic reply.
Test before you publish: the rule tester
Under the list, Rule tester lets you type a Fictitious sender number (international format,
for example +33612345678) and a Fictitious incoming message, then Simulate. Two extra
options help with the special triggers:
- Simulate an unknown number, to exercise First contact;
- Simulated reception time, to exercise Outside hours without waiting for the evening.
The result lists the rules that would fire, the exact text that would be sent, the actions that would run, and any reply a guard would hold back. It is a simulation only: no SMS leaves, no contact is filed, no webhook is called, the anti-loop window is not consumed and the trigger counters do not move. You can run it as often as you like, even with a Read only account.
The global switch: Settings > Auto-responder
| Option | Default | Who can change it | Effect |
|---|---|---|---|
| Send automatic replies | On | Superadmin | Off: every Reply by SMS action is held back. Applies from the next message received, no restart |
Turning it off stops the replies only. Everything else keeps working:
- Label the conversation, Add to a group, Remove from a group, Call a webhook and Stop the chain still run;
- the trigger counters still move;
- the anti-loop window is not consumed: a contact who wrote while the switch was off gets an answer to their next message once you turn it back on.
This is the switch for a holiday, an incident or a moment when you want to answer by hand, without touching your rules. The same tab shows a summary: number of rules, active ones, active ones that reply, rules per trigger, and the active rules in the order they are evaluated, with a Manage rules link to the Rules screen.
On the Rules screen
Each rule shows whether it is Active or Inactive (with an Enable / Disable button), its trigger count and Last triggered date. Deleting a rule removes it and its counter; messages already sent are not affected.
Who can do what
| Role | Rules | Global switch |
|---|---|---|
| Read only | See the rules, use the tester | See it |
| Operator | Create, edit, reorder, enable, delete | See it |
| Superadmin | Everything | Turn it on or off |
With the API
| Method | Path | What it does |
|---|---|---|
GET |
/api/v1/rules |
Every rule, in evaluation order |
POST |
/api/v1/rules |
Creates a rule: name, trigger, actions, optional enabled, keywords, pattern, schedule, cooldownSeconds, replyDelaySeconds, continueProcessing |
GET |
/api/v1/rules/{ruleId} |
One rule |
PATCH |
/api/v1/rules/{ruleId} |
Changes a rule |
DELETE |
/api/v1/rules/{ruleId} |
Deletes a rule |
PUT |
/api/v1/rules/order |
New evaluation order: send the complete list of rule identifiers |
POST |
/api/v1/rules/test |
The rule tester |
PATCH |
/api/v1/settings |
{"autoresponder": {"enabled": false}} turns the global switch off |
With an API key, reading needs the read scope and every change needs the admin scope. See
API keys.
Trigger values: keyword_exact, keyword_contains, regex, any_message, first_contact,
outside_hours. Action types: reply, webhook, group_add, group_remove, label,
stop_processing. The events rule.triggered and rule.suppressed can notify your tools; see
Webhooks.
Troubleshooting
| What you see | Why, and what to do |
|---|---|
| A rule never fires | It is inactive, or a rule above it catches the message and stops the chain (look for Never reached). Try the message in the Rule tester |
| The contact got no reply the second time | The anti-loop window: one automatic reply per contact per window. Shorten it on the rule if needed |
| No rule replies at all, but labels still appear | Send automatic replies is off in Settings > Auto-responder |
| A number never gets a reply | It opted out (STOP). See Contacts and groups |
The reply contains {firstname} |
The sender is not in your contacts or has no first name. Add a fallback: {firstname|there} |
| "Outside hours" replies during the day | Check the Working days, the hours and the Time zone of the rule |