How-to guide · Messages

Spintax and command tags

Write [[Hi|Hello|Hey]] and InfiniReach picks one option each time it sends. Double square brackets keep it safe next to GoHighLevel fields like {{contact.first_name}}.
3 minutes Anyone writing messages Last updated October 12, 2026

Syntax

TypeYou writeResult
Spintax[[Hi|Hello|Hey]]Hi, Hello, or Hey (random per message)
Explicit spin[[spin:Hi|Hello]]Same as above: Hi or Hello
Nesting[[Hi [[there|friend]]|Hello]]Hi there, Hi friend, or Hello
Plain text (no |)[[plain text]]Left unchanged
With GHL fields[[Hi|Hello]] {{contact.first_name}}GHL fills the name first, then InfiniReach picks the greeting
1

Use it in GoHighLevel

  1. Open a GHL conversation, or a workflow SMS / WhatsApp action that sends through InfiniReach.
  2. Type your message with spintax, for example:
[[Hi|Hello|Hey]] {{contact.first_name}}, thanks for reaching out.

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

Typing spintax in a GHL workflow message and the varied text arriving on the phone
Typing spintax in a GHL workflow message and the varied text arriving on the phone
2

Use it in InfiniReach and the API

Spintax works everywhere InfiniReach sends: Campaigns, Automations, Conversations replies, and POST /api/v1/messages.

In campaigns, tags are expanded on the template before merge fields like {{firstName}}, so contact data is never treated as a tag.

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

Message Logs stores both the sent text and the original template.

Reserved tags (not live yet)

These are removed from the sent text and saved on the message, but 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 as is.
  • If a message is empty after tags are removed (for example only [[tts]]) and has no media, it is rejected or marked failed instead of sent blank.
  • An unclosed [[ stays as text. Later closed tags in the same message still work.
  • There’s no way to escape a literal [[a|b]] yet. Avoid that pattern in normal text.

FAQ

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

No. They’re reserved. Today they’re removed from the sent text and stored, not executed.

Will the message log show the template?

Yes. Message Logs keeps both the final text and the original template.

Related guides