Spintax and command tags

InfiniReach expands [[...]] tags in outbound message text so you can vary wording without conflicting with GoHighLevel merge fields.

What it is (and why [[ ]], not { })

Spintax picks one wording variant at random each time a message is sent. That helps bulk sends look less templated. InfiniReach does not make deliverability guarantees and does not claim this bypasses carrier filtering or A2P rules.

GoHighLevel uses {{contact.first_name}} and {...} for custom values. Classic spintax like {Hi|Hello} can break inside GHL, so InfiniReach uses double square brackets instead: [[Hi|Hello]].

Don't use {Hi|Hello} in GHL message bodies meant for InfiniReach. Use [[Hi|Hello]].

Syntax

SyntaxExampleResult
Spintax[[Hi|Hello|Hey]]One of Hi, Hello, or Hey (picked at random per message)
Explicit spin[[spin:Hi|Hello]]Same as above — Hi or Hello
Nesting[[Hi [[there|friend]]|Hello]]e.g. Hi there, Hi friend, or Hello
Plain text (no pipe)[[plain text]]Left unchanged (not a known command)
With GHL merge fields[[Hi|Hello|Hey]] {{contact.first_name}}, thanks for reaching out.GHL fills the name first; InfiniReach then picks the greeting

Using it in GoHighLevel

Put [[...]] spintax in outbound text sent through the InfiniReach Conversation Provider (SMS, WhatsApp, iMessage) or through GHL workflow actions that deliver via InfiniReach.

Order of expansion: GoHighLevel resolves {{contact.first_name}} (and other GHL values) first. InfiniReach then expands spintax on the resulting text.

[[Hi|Hello|Hey]] {{contact.first_name}}, thanks for reaching out.

Example sent text (name already filled by GHL): Hello Jordan, thanks for reaching out.

Campaigns, automations, dashboard, and API

Spintax works on every outbound path: InfiniReach campaigns, automations, the dashboard Send page, conversation replies, and POST /api/v1/messages.

In InfiniReach campaigns, tags are expanded on the template before merge fields such as {{firstName}}, so contact data is never treated as a tag. The message log stores both the sent text and the original template.

API example

{
  "to": "+1234567890",
  "message": "[[Hi|Hello|Hey]] — just checking in.",
  "from": "+15559876543",
  "channel": "sms"
}

Same request shape as the API send message docs. Include X-API-Key as usual.

Reserved tags (coming soon)

These tags are not live yet. InfiniReach currently removes them from the sent text and stores them on the message record. They are not executed.

  • [[tts]] / [[voice]] — reserved for text-to-voice
  • [[route:sales]] — reserved for routing
  • [[cmd:name args]] — general command form

Rules and edge cases

  • [[plain text]] with no | and no known command is left unchanged.
  • If a message becomes empty after tags are removed (for example only [[tts]]) and has no media, it is rejected or marked failed rather than sent blank.
  • An unclosed [[ is left as literal text; later closed tags in the same message still expand.
  • There is no escape for a literal [[a|b]] yet — avoid that pattern in normal text.

FAQ

Why can't I use {Hi|Hello} in GHL?

GHL already uses curly braces for custom values and merge-style fields. Classic single-brace spintax can be misread or mangled. Use [[Hi|Hello]] instead.

Where does spintax work?

Everywhere InfiniReach sends outbound text: GHL Conversation Provider and workflow actions, campaigns, automations, dashboard Send, conversation replies, and the REST API.

Are [[tts]] and [[route:...]] available now?

No. They are reserved for upcoming features. Today they are stripped from the sent body and stored on the message, not executed.

Will the message log show the template?

Yes. InfiniReach stores both the final sent text and the original template so you can see which variants were used.

Does spintax improve deliverability?

It only varies wording so bulk messages look less identical. It is not a guarantee of inbox placement and does not bypass carrier or A2P filtering.

Related