The platform is split into two distinct tiers: a frontend for the dashboard (and server-side landing pages when available), and a backend that owns all business logic, the Developer REST API, background workers, and inbound provider webhooks.

Layers

LayerRole
Developer APIREST /v1/...; API key → workspace context
DashboardSession authentication → workspace, user, and role scope
WorkersBackground tasks: message dispatch, campaign execution, reservation resolution, billing reconciliation

Two authentication modes

  • Developer API: Authorization: Bearer <api_key> — programmatic, workspace-scoped.
  • Dashboard: interactive user sessions — not interchangeable with API keys.
A workspace is the primary isolation boundary: all channels, contacts, messages, campaigns, balance, and API keys belong to one workspace. Users can be members of multiple workspaces and switch between them in the dashboard. Keeping them separate means your automation credentials never have UI session scope, and vice versa.

Message pipeline

Every send — from a direct POST /v1/messages call or from a campaign flow node — goes through the same steps regardless of channel:
1

Authenticate

The API key is resolved to a workspace, rate limit bucket, and access scope.
2

Channel pre-send checks

Requirements vary by channel:
  • Email — the sending domain and sender identity must be verified.
  • RCS — the agent must be approved and the destination phone number is checked for RCS capability; results are cached to reduce duplicate lookups.
  • SMS (coming soon) — no pre-send checks; delivered immediately once the channel launches.
3

Classify and check session

The message is classified into a billing unit — Basic, Single, Conversation, or MAU — based on channel, content shape, and length. For RCS, an active 24-hour conversation session means no additional balance hold is needed for that send.
4

Hold balance

A balance reservation is placed against the workspace. If the free balance would go negative, the API returns 402 immediately.
5

Enqueue and respond

The dispatch task is queued for background processing. The API responds immediately with message_id, status: queued, and a billing snapshot — no waiting for the provider.
6

Dispatch (worker)

A background worker calls the channel provider, records a usage event, and fires your developer webhooks.
7

Resolve reservation

A periodic reconciliation task finalises billing: for conversation-type sends the session outcome determines the final price; for all other channels the hold is settled on delivery confirmation.
If a provider delivery webhook marks the send as failed, the hold is released immediately — you are not charged for undelivered messages.

Storage layers

LayerPurpose
DatabaseSource of truth — accounts, reservations, messages, campaigns, contacts
CacheBalance state, session tracking, rate limiting, task queue
AnalyticsUsage events, aggregations, dashboard queries
Object storageTemplate images, assets, invoice PDFs