Skip to content

Working with prompts

“Prompt” in Voxa means the message a Question or Message node sends to a contact. This guide is about writing them well — it is not about LLM prompt engineering. Voxa does not ship a built-in LLM; if you connect one (see LLM providers) the same principles apply inside the model’s system prompt.

Any stored variable can be dropped into a prompt body with double curly braces:

Thanks {{full_name}}! We'll send the voucher to the number you messaged us from.

Variables that don’t exist render as empty strings — they do not throw and they do not block the flow. That’s deliberate: an empty greeting is better than a crash. It also means you must defensively name variables — a typo fails silently.

WhatsApp is a texting surface. Walls of text get ignored; multi-part questions get half-answered. One prompt, one question, one variable:

✅ What's your full name?
✅ What city do you live in?
❌ What's your full name, city, and contact number?

Break compound questions into several Question nodes. Voxa’s flow builder makes this cheap.

Free-text input is the biggest source of data-quality problems. Where the universe of valid answers is small, say so:

Which size?
1. Small
2. Medium
3. Large

Then use a Validation node (or condition) to check the answer is one of 1, 2, 3, small, medium, large. Trim whitespace, lowercase, and normalise before storing.

If your flow says “We’ll send your voucher in 5 minutes” — make sure the downstream system actually can. WhatsApp reads feel intimate; a broken promise lands harder than it would in email.

When a validation fails, reply with something short and specific:

Hmm, that doesn't look like a South African ID. Please try again.

Don’t say “Invalid input”. Don’t dump the regex. And give the contact a way out — either a retry limit (so they don’t loop forever) or an explicit exit keyword.

WhatsApp supports a small subset of markdown-ish formatting:

  • *bold* renders bold.
  • _italic_ renders italic.
  • ~strikethrough~ renders strikethrough.
  • Triple backticks render monospace.

Everything else is literal. No headings, no links with labels, no tables. Paste a raw URL and WhatsApp will auto-link and sometimes auto-preview it.

For any campaign that collects personal information, the first prompt should make consent explicit:

Hi! This is the 2026 Voxa launch competition. By replying, you agree
to our terms and privacy policy:
- https://voxa.software/terms
- https://voxa.software/privacy
Reply STOP at any time to exit.

Decide once, per tenant, whether you write like a friendly person or a brand. Mixing breaks the illusion and surfaces the automation. Example pair:

✅ Welcome! Drop your name below and we'll get you sorted.
✅ Welcome to the ACME Corp 2026 promotional campaign. Please provide your full name.
❌ Welcome to the ACME Corp 2026 promotional campaign. Drop your name below and we'll get you sorted.

Don’t create question_name_v2, question_name_v3 nodes inside the same flow. Voxa already gives you flow-level versioning — cut a new flow version when the copy changes materially.

  • Greeting + ask in the same message (“Hi Sarah, what’s your email?”). Split them. Or don’t greet at all — the Message node before the first Question does that job.
  • Over-personalising with uninferred variables. Don’t write "Welcome back, {{last_campaign_name}}!" unless you’re certain the variable is set.
  • Asking confirmation after every step. One confirmation at the end of the flow is enough.