Relaay

WhatsApp-first CRM

The CRM that lives in your WhatsApp.

Your agents already run their day in chat. Relaay turns those messages into real CRM records. Mia creates the client, books the visit, updates the deal, and answers in the same thread.

Answers onWhatsAppTelegramYour channel

No new app for your team to learn.

M

Mia

online

New lead: Camille Dupont, +32 475 12 34 56. Looking for a 3-bed near Ixelles, budget 450k.
Mia is typing…

Workspace

Updated live

  • Nothing to install
  • Answers in the thread
  • Every write is reversible

How it works

From a message to a record, in one hop

No forms, no double entry, no “I'll update the CRM tonight.” The thread is the interface.

  1. 1

    Your agent messages Mia

    Mia is a number in their contacts. They text her the way they'd text a colleague, from the car, between two viewings, at 8pm.

  2. 2

    Mia resolves the intent

    The message is mapped to a typed action (clients.create, visits.schedule) and its arguments are validated against a schema before anything runs. If something is missing, she asks instead of guessing.

  3. 3

    Sensitive writes go to approval

    Price changes, deletions, anything you flag: they don't just happen. They become a request (REQ-1042) that a broker approves with one reply. APPROVE, EDIT or REJECT.

  4. 4

    The CRM updates, the thread answers

    The action runs in a transaction, the record lands in the workspace, and the confirmation comes back where the conversation already is. Changed your mind? Undo is one message away.

Features

A real CRM underneath the chat

Messaging is the interface, not the storage. Underneath is a proper CRM your team can open, filter and trust.

Contacts, companies, opportunities

Structured records with custom attributes, saved views and filters, not a searchable pile of chat logs.

Approvals in one reply

Route risky writes through a human without anyone leaving the conversation. APPROVE, EDIT or REJECT REQ-1042.

Every action is reversible

Each write records how to undo itself. “Cancel that last change” actually cancels it, with no manual clean-up.

WhatsApp and Telegram

The same brain on both channels. Each team member pairs their number once and is recognised from then on.

Roles and permissions

Every action declares the permission it needs. Juniors propose, brokers approve, and the log says who did what.

The web workspace

When you want a table, a pipeline and a filter, open the app. Same data, same second: the chat is just another client.

Extensible by design

Every capability is a declared action

Relaay isn't a chatbot with a database bolted on. Everything Mia can do is an action: a namespaced id, a JSON schema for its input, the permission it requires, whether it needs a human sign-off, and how to undo it. Declare one and Mia can do it, in the words your team actually uses.

  • Typed input, validated before a single row is written
  • One transaction: records, events and the undo entry commit together or not at all
  • Example utterances teach the mapper your team's vocabulary
clients.create, an action definition
export const createClient: ActionDefinition = {
  id: "clients.create",
  description: "Create a client from an agent's message",

  // Teaches the mapper how your team actually talks.
  examples: [
    "New lead: Camille Dupont, budget 450k",
    "Ajoute Camille au CRM, elle cherche vers Ixelles",
  ],

  // Validated before a single row is written.
  inputSchema: {
    type: "object",
    required: ["fullName"],
    properties: {
      fullName: { type: "string" },
      phone: { type: "string" },
      budget: { type: "number" },
    },
  },

  requiredPermission: "clients:write",
  requiresApproval: false,

  async execute(input, ctx) {
    // ctx.manager: the action's own transaction.
    const client = await ctx.manager
      .getRepository(Client)
      .save({ ...input, tenantId: ctx.tenantId })

    ctx.emit("clients.created", { id: client.id })

    return {
      reply: `Added ${client.fullName}.`,
      // How to undo it, recorded with the write itself.
      revert: { action: "clients.delete", input: { id: client.id } },
    }
  },
}

Modules

Core CRM is always on. Verticals plug in.

The CRM every team needs ships in the core. Everything specific to your trade is a module that registers its own actions, and never forks the product.

Core CRM

Live

Contacts, companies, opportunities, tasks, custom attributes, views, team and permissions.

Approvals

Live

The human-in-the-loop layer: request, notify, approve, edit or reject, in chat or in the app.

ImmoToolBox

Live

The real-estate vertical: listings, viewings, and the actions an agent asks for by name.

Calendar sync

Soon

Two-way sync so a visit booked in chat lands in the calendar your team already lives in.

Documents

Soon

Mandates and compromis captured from the thread, filed against the right record.

Your own module

Soon

Declare your actions against the same contract and Mia picks them up. Core never depends on you.

Trust

Client data, handled properly

You're putting your clients' phone numbers and budgets into this. Here is what that means in practice.

Encrypted at rest

Message bodies are encrypted with AES-256-GCM before they touch the database. Not a checkbox: a column transformer nothing writes around.

Bodies stay out of the pipeline

Internal events carry an id, never the text of your client's message. Whatever needs the content loads it deliberately.

Signed inbound traffic

Every webhook is signature-verified. In production, an unsigned message is rejected, not processed.

Multi-tenant by construction

The tenant is derived from the paired sender on every single message. There is no default, no constant, no fallback to guess wrong with.

Nothing gets dropped

Messages and the records they produce commit together, and delivery is retried until it lands. A message never half-happens.

Auditable by default

Every action is logged with who triggered it, what it changed, and how to reverse it.

FAQ

The questions we always get

Do my agents have to install anything?

No. Mia is a number they save in their contacts. They message her from the WhatsApp already on their phone, which is the whole point. The web workspace is there when someone wants a table and a filter, but no agent is forced into it.

What if Mia gets it wrong?

Three safety nets. She asks instead of guessing when the message is ambiguous; anything you mark sensitive needs a human approval before it runs; and every write records its own inverse, so undoing a mistake is one message.

Is this just ChatGPT with our data in it?

No. The model only decides which declared action a message means and fills in its arguments. The action itself is code you control, with a schema, a permission and a transaction. If the model has a bad day, the worst case is a clarifying question, not a corrupted CRM.

Which channels do you support?

WhatsApp and Telegram today, through the same pipeline. Channels are adapters, so adding one doesn't touch your CRM logic.

Can we adapt it to how we work?

That's the design. Custom attributes and views cover the data; new actions cover the verbs, including the phrasing your team actually uses. Talk to us about your vertical.

Stop typing into a CRM. Just message Mia.

Relaay is in early access with a handful of real-estate teams. If your agents live in WhatsApp and your CRM is always a week behind, we'd like to talk.