Skip to content

Glossary

Terms alphabetised. Where a term has a deeper treatment elsewhere, the definition links to it.

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.

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.

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.

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.

A connected messaging surface. WhatsApp is the only channel supported today.

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.

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.

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.

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.

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.

Passing an in-progress conversation from Voxa to a human operator or external system. Not shipped today; on the roadmap.

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.

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.

A signed Cloudflare R2 URL with a 15-minute TTL, stored alongside an entry or message that involved an upload. See Integrations → Cloudflare R2.

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).

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.)

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.

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.

The text sent by a message or question node. Supports variable interpolation via {{variable_name}}. See Working with prompts.

The party that determines why and how personal information is processed. For a Voxa campaign, this is the tenant running the campaign — not Voxa.

Voxa’s five permission tiers, numeric:

RoleLevel
super_admin200
admin100
owner80
editor50
viewer10

Permission checks compare user.role_level >= required_level.

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.

The active period of a conversation — spans one or more turns inside the WhatsApp 24-hour window.

The submission node type — writes the accumulated flow variables to the entries table, increments campaign_stats.completed_count, and (usually) ends the flow.

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).

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.

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.

A flow node that runs a validator (regex, numeric range, SA ID checksum, custom) against a stored variable. Produces valid and invalid edges.

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.

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.

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.