Loading

ARK47 CRM
How it worksIsolation
Your workspacesSign in
WhatsApp-first CRM

One number your whole team answers. Walled off at the database.

ARK47 CRM is a shared team inbox for the WhatsApp Business API. Hand a conversation to a colleague, answer with a template Meta already approved, and watch the contact record write itself — while every workspace stays separated inside Postgres rather than by a WHERE clause somebody remembered to add.

Create your workspaceYour workspaces

whatsapp business api·approved templates·rls: forced

Shared inboxnorthwind
Layla Hassan10:24

Hi — has my order shipped yet? 4471

contact.upsert+351 91 ••• •• 47 → Layla Hassan
conversation.assignomar.a → nadia.k
Nadia K.
order_shipped
10:26

Hi Layla, your order 4471 left our warehouse this morning. Track it any time with PT449102.

Layla Hassan10:27

Perfect — thank you!

whatsapp api: connectedrls: forced

links 0·refused 0 this frame

The field behind this page is three workspaces — yours in teal, two others in off-white. A link only forms between two nodes in the same one, so when the clouds drift through each other nothing joins them; every crossing pair in range is refused and counted. It is a drawing of the rule your data actually runs under.

The order things happen

One message, end to end.

Nothing here is a module you switch on later. This is what happens to a single inbound WhatsApp message, in the order it happens.

01 / Connect

Point Meta at your number

Connect a WhatsApp Business number through Meta in a single pass. There is no second dashboard to go and configure afterwards.

02 / Arrive

It lands where the team is

Every message on that number arrives in one inbox your whole team can open. Not forwarded, not a copy — the thread itself, with an owner anyone can hand on.

03 / Resolve

The contact writes itself

The record is built out of the conversation. Names, numbers and history stay current because talking to someone is what updates them.

04 / Reply

Answer, or send a template

Reply in the thread, or send a message template you have already cleared with Meta — the only way to open a conversation outside the 24-hour window.

The part that isn't a setting

Your workspace is a wall, not a filter.

Most multi-tenant products keep customers apart with a condition bolted onto every query, and stay correct only as long as every query remembers. Here the separation lives in Postgres: a policy on the table decides what a connection may see, and the table enforces it.

rls.sqlFORCED
-- apps/backend/prisma/rls.sql · all 66 tenant tablesALTER TABLE "public"."conversation" ENABLE ROW LEVEL SECURITY;ALTER TABLE "public"."conversation" FORCE ROW LEVEL SECURITY;CREATE POLICY tenant_isolation ON "public"."conversation"  USING      ("_ark_workspace_id"              = current_setting('app.workspace_id', true))  WITH CHECK ("_ark_workspace_id"              = current_setting('app.workspace_id', true));

66 / 66 tenant tables

MechanismPostgres row-level security
ModeFORCE ROW LEVEL SECURITY
Policytenant_isolation · 66 / 66
Scope keyapp.workspace_id
BypassNone — the policy binds the table owner too.

Every connection is opened with your workspace stamped on it, and the database refuses to return — or accept — a row belonging to anyone else. A query that forgets to filter by workspace returns nothing, rather than somebody else's messages.

Start here

Give your team one number they can all answer.

Create a workspace, connect a number through Meta, and your first shared thread is open. Everything above is what you get on the first day.

Create your workspaceSign in
ARK47 CRM

One product on the ARK47 platform: a WhatsApp-first CRM whose tenant isolation is enforced by Postgres rather than promised in a documentation page.

Product

How it worksIsolation

Access

Create your workspaceSign inYour workspaces

© 2026 ARK47

66 tenant tables · force row level security