Glossary
Terms alphabetised. Where a term has a deeper treatment elsewhere, the definition links to it.
24-hour window
Section titled “24-hour window”WhatsApp’s customer-care window. When a contact sends you a message,
a 24-hour period opens during which you can reply with free-form text
or media. Once the window closes, Meta requires an approved template
message for the first outbound. Voxa does not track the window as an
explicit countdown yet — attempts to send past the window return a
failed status from Meta. See
Handling conversation state.
Access token
Section titled “Access token”The long-lived Meta System-User access token with
whatsapp_business_messaging and whatsapp_business_management
permissions. Voxa stores it AES-256-GCM-encrypted in
meta_credentials.access_token.
Audit log
Section titled “Audit log”An append-only record of every state-changing operation in Voxa: who did what, to what, when, from where. Each row includes actor, action, entity, IP, user agent, and before/after state. Retained for 12 months. Used for compliance and debugging.
Campaign
Section titled “Campaign”A wrapper around a flow with entry rules, scheduling, and a
customer-facing surface (wa.me link, QR code, keyword). Carries
status (draft → scheduled → live → paused → completed → archived),
entry_mode (link | qr | keyword | broadcast),
entry_limit_per_contact, requires_optin. See
Core concepts.
Channel
Section titled “Channel”A connected messaging surface. WhatsApp is the only channel supported today.
Contact
Section titled “Contact”A person reachable on WhatsApp, identified by a unique wa_id. Carries
tags, custom_fields, opted_in, opted_out_at, last_seen_at.
See Core concepts → Contact.
Conversation
Section titled “Conversation”The live runtime state of a contact inside a flow:
which node they’re on, what variables they’ve collected, what input the
flow is awaiting. Persists in the conversations.state JSON blob.
Custom field
Section titled “Custom field”A tenant-defined key on a contact stored in
contacts.custom_fields (JSON). Use for segmentation attributes that
don’t fit the built-in schema.
Editor
Section titled “Editor”Role level 50. Can create and edit campaigns, flows, contacts, templates.
The result of a completed flow. Written by a submission node.
Carries campaign_id, wa_id, data (JSON of collected variables),
media_refs (signed R2 URLs), submitted_at, is_duplicate. The
primary export artefact. See
Core concepts → Entry.
Entry mode
Section titled “Entry mode”How a contact enters a campaign: link (wa.me deep link), qr (QR
scan), keyword (inbound keyword match), or broadcast (admin-pushed;
worker not yet wired).
A directed acyclic graph of nodes that defines how a
conversation progresses. Versioned with draft / published semantics.
See Core concepts → Flow.
Handoff
Section titled “Handoff”Passing an in-progress conversation from Voxa to a human operator or external system. Not shipped today; on the roadmap.
Information Officer
Section titled “Information Officer”The individual designated under POPIA s.55 to oversee personal-
information processing. For Voxa this is Roelf Burger
(roelf@tenutech.com) at TenuTech (Pty) Ltd.
Intent
Section titled “Intent”The classification of what a contact is asking. Voxa does not do
intent classification today; the closest analogue is a condition node
matching on variable content.
Media reference
Section titled “Media reference”A signed Cloudflare R2 URL with a 15-minute TTL, stored alongside an entry or message that involved an upload. See Integrations → Cloudflare R2.
Message
Section titled “Message”One inbound or outbound unit of communication. Rows land in the
messages table with direction (inbound | outbound), status
(queued | sent | delivered | read | failed), media_id (if any),
and failure_reason (if any).
Meta credentials
Section titled “Meta credentials”The encrypted bundle of app_id, app_secret, phone_number_id,
waba_id, access_token stored per tenant in meta_credentials.
Plus plaintext display_phone_number, business_name, and
webhook_verify_token.
One step in a flow. Types: start, message, question,
media_capture, validation, condition, delay, submission,
end. (api_call and set_variable exist in the enum but are not
wired.)
Operator (POPIA)
Section titled “Operator (POPIA)”In POPIA terminology, the party that processes personal information on behalf of a Responsible Party. Voxa acts as Operator; the tenant running the campaign acts as Responsible Party.
Opt-in / opt-out
Section titled “Opt-in / opt-out”Whether a contact has consented to messages. Stored in
contacts.opted_in and contacts.opted_out_at. Automatic STOP-keyword
handling is on the roadmap — until then, implement it with a condition
node at the top of the flow.
Role level 80. Full tenant access including billing and tenant deletion.
The subscription tier: trial, starter, growth, scale,
enterprise. Carries monthly_message_limit, campaign_limit,
contact_limit, team_limit, and a features JSON blob. Stored in
plans.
Prompt
Section titled “Prompt”The text sent by a message or question node. Supports variable
interpolation via {{variable_name}}. See
Working with prompts.
Responsible Party (POPIA)
Section titled “Responsible Party (POPIA)”The party that determines why and how personal information is processed. For a Voxa campaign, this is the tenant running the campaign — not Voxa.
Role / level
Section titled “Role / level”Voxa’s five permission tiers, numeric:
| Role | Level |
|---|---|
| super_admin | 200 |
| admin | 100 |
| owner | 80 |
| editor | 50 |
| viewer | 10 |
Permission checks compare user.role_level >= required_level.
Session (auth)
Section titled “Session (auth)”A server-side record backing a voxa_session cookie. Standard session
is 24 hours; “Remember me” extends to 7 days. Managed by Lucia 3.2.
Session (conversation)
Section titled “Session (conversation)”The active period of a conversation — spans one or more turns inside the WhatsApp 24-hour window.
Submission
Section titled “Submission”The submission node type — writes the accumulated flow variables to
the entries table, increments campaign_stats.completed_count, and
(usually) ends the flow.
Super admin
Section titled “Super admin”Role level 200. Platform-staff access only; tenants never see this role.
A string on a contact used for segmentation. Stored in
contacts.tags (JSON array).
Template
Section titled “Template”A Meta-approved structured message required for outbound sends outside
the 24-hour window. Voxa stores templates in
whatsapp_templates but does not yet emit them from flow nodes.
Tenant
Section titled “Tenant”An isolated workspace. One tenant has one WhatsApp number, its own contacts, its own campaigns, its own billing, its own audit trail. See Core concepts → Tenant.
The 14-day full-feature evaluation every new workspace starts on.
Stored in subscriptions.trial_ends_at.
One side of a conversation — an inbound message from a contact or an outbound reply.
Validation
Section titled “Validation”A flow node that runs a validator (regex, numeric range, SA ID
checksum, custom) against a stored variable. Produces valid and
invalid edges.
Variable
Section titled “Variable”A key/value pair stored inside a conversation’s state.vars. Assigned
by question and media_capture nodes; read by message, condition,
and validation nodes.
Viewer
Section titled “Viewer”Role level 10. Read-only dashboards and entries.
WhatsApp Business Account. A Meta entity that groups phone numbers
and templates under one business. Stored per tenant as waba_id in
meta_credentials.
A contact’s phone number in Meta’s format (digits only, country code,
no +). Example: 27821234567. Unique per tenant.
Webhook
Section titled “Webhook”The HTTP endpoint Meta calls for inbound messages and status updates.
Voxa exposes POST /webhooks/whatsapp/<token> — HMAC-verified,
queue-backed, returns 200 in ≤50ms.