— Self-hosted

Answer your clients when they ask where their data lives.

Velo runs on infrastructure you control: the application, the database, the embeddings, the queue. This page is the map — what lives where, what is isolated per organization, and the one hop that is outside anyone's infrastructure.

The whole stack, layer by layer.

Every layer below the transport boundary runs where you decide. Above it sits the one piece nobody self-hosts: the WhatsApp network itself.

Read top to bottom: a message enters through the provider adapter, the agent runtime processes it against that organization's data, and the queue keeps delivery ordered when volume spikes.

WhatsApp network

outside your infrastructure

Meta Cloud API or a BSP (360dialog, Twilio) carries the message.

Your infrastructure

Provider adapter

Normalizes each provider into one message shape.

Application · agent runtime

Resolves messages against the organization's own data.

Queue

Keeps processing and delivery ordered under load.

Database · row-level isolation

Organizations, tenants, catalogs, conversations, numbers — separated at the database layer.

Embeddings · vector store

The knowledge base's index lives beside the database, per organization.

The one hop you don't control.

Messages reach WhatsApp through Meta's Cloud API or a BSP — 360dialog, Twilio. That hop rides Meta's network no matter where Velo runs, and no architecture changes it.

What it implies: message transport metadata exists on the provider's side. What it does not imply: your catalogs, price lists, documents, embeddings and conversation records never leave your database — the provider sees messages, not your business data.

One client's data is unreachable from another's.

Catalogs, documents, conversations and WhatsApp numbers are scoped per organization — and the separation is enforced at the database layer, in row-level policies, not in application code that a bug could bypass.

Database · one cluster, enforced rows

Organization A — Distribuidora Norte

  • catalog · 214 SKUs
  • knowledge base · 17 documents
  • conversations · this tenant's only
  • WhatsApp number · +54 9 11 •••• 0014

Organization B — Farmacia Belgrano

  • catalog · 98 SKUs
  • knowledge base · 9 documents
  • conversations · this tenant's only
  • WhatsApp number · +54 9 11 •••• 3390

A query scoped to A cannot return a row from B — the database refuses it, not the app.

Credentials are held per organization.

Each tenant's WhatsApp credentials and model keys are stored per organization, encrypted — not in one shared environment file where one leak exposes every client you run.

When you run agents for businesses that are not you, this is the answer to the question their IT person will ask: revoking or rotating one client's credentials touches no one else's.

You choose where the database lives.

Because the stack runs on your infrastructure, the region is your decision — the database and the vector store land where you deploy them.

Practically, that is what makes LGPD- or GDPR-style obligations answerable: when a client asks which jurisdiction their records sit in, you have a concrete reply instead of a vendor's promise. This is an operational property, not legal advice — your obligations are still yours to assess.

The install docs cover every layer on this page.