Case studies/A WhatsApp inbox, flow builder and commerce platform, built as a multi-tenant product
WhatsApp BusinessConversational commerceMicroservicesMulti-tenant SaaS

A WhatsApp inbox, flow builder and commerce platform, built as a multi-tenant product

whatatalk

whatatalk turns Meta’s raw WhatsApp Business Cloud API into a product: a unified inbox, a no-code flow builder, catalog and order handling, template and campaign management, and the multi-tenant packaging needed to run it as SaaS.

15 flow node types

Explore the architecture
Channel
WhatsApp Cloud API
Services
Independent microservices
Events
Kafka, RabbitMQ
Identity
Keycloak, multi-tenant
THE WORKSPACE

Every conversation, customer and automation in one place.

Unified inbox

A conversation, its context and its next step.

Messages, translation, quick replies and an AI summary sit beside the contact’s tags, assigned agents and attributes.

whatatalk inbox with a conversation, AI summary, assigned agents and contact attributes
01 / THE CHALLENGE

A messaging API is not a product.

Turning the Cloud API into something a team can use meant building everything around it.

01

No working surface

No inbox, contact management or campaign tooling comes with the API.

02

Logic needs code

Every business rule would otherwise need an engineer.

03

Concurrent messages

Near-simultaneous messages from one customer must not corrupt state.

04

Many businesses

Separate data, plans and permissions per client on one platform.

02 / EXECUTION

Automate, sell and broadcast from one workspace.

The agent workspace brings the flow builder, catalog, templates and campaigns together with the live inbox.

AUTOMATION

Visual flow builder

Design conversation flows by connecting nodes, from keyword triggers to API calls and human hand-off.

whatatalk flow builder with a list of saved flows and a canvas of connected message nodes
  • Triggerskeyword, first message, button
  • Logicconditions + API calls
  • Reusenested sub-flows
COMMERCE

Catalog and inventory

Manage products, collections and stock, then sync them with Meta’s commerce graph.

whatatalk catalog screen listing products with stock and price beside a product detail panel
  • Synclocal-first with Meta
  • Bulkimport jobs with row errors
  • Orderscatalog, order, payment link
TEMPLATES

Dynamic interactive templates

Create personalised template messages with product carousels and call-to-action buttons, tracked through Meta approval.

whatatalk template preview with a personalised greeting and a carousel of product cards
  • Typesmedia, carousel, coupon, offer
  • Approvalstatus synced automatically
  • Personalisecontact variables
CAMPAIGNS

Broadcast groups

Send to segmented audiences now or on a schedule, with delivery reporting after the send.

whatatalk broadcast groups list beside a campaign message preview
  • Audiencessegmented groups
  • Timingscheduled sends
  • Reportingdelivery level
03 / ARCHITECTURE

Architecture

Database-per-service microservices, event-driven where it should be and synchronous where it must be, with each decision answering one specific risk.

Decision 01

A slow flow must never block WhatsApp’s webhook delivery.

Verify the webhook signature, publish a normalised event and return immediately. The messaging service persists the message and emits a flow-trigger event; the flow engine consumes it on virtual threads and takes a per-contact Redis lock so two near-simultaneous messages cannot corrupt session state.

A slow flow must never block WhatsApp’s webhook delivery. Meta delivers an event to the webhook server, which publishes it to a Kafka queue. The messaging service consumes it and passes it to the flow engine, which takes a Redis lock for the contact before running. Meta Cloud API Webhook server Kafka queue Messaging service Flow engine Redis contact lock

Architecture Narrative

Meta delivers an event to the webhook server, which publishes it to a Kafka queue. The messaging service consumes it and passes it to the flow engine, which takes a Redis lock for the contact before running.

Decision 02

One platform had to serve many businesses with different plans.

One platform had to serve many businesses with different plans. Requests enter through the API gateway and Keycloak tenant-aware authentication, then reach services whose queries are scoped by business id. Feature and quota checks go to a central entitlement service holding plans, overrides and quota counters. API gateway Keycloak tenant auth Service scoped by business id Entitlement service Plans and overrides Quota counters
One platform had to serve many businesses with different plans. Requests enter through the API gateway and Keycloak tenant-aware authentication, then reach services whose queries are scoped by business id. Feature and quota checks go to a central entitlement service holding plans, overrides and quota counters. API gateway Keycloak tenant auth Service scoped by business id Entitlement service Plans and overrides Quota counters

Architecture Narrative

Requests enter through the API gateway and Keycloak tenant-aware authentication, then reach services whose queries are scoped by business id. Feature and quota checks go to a central entitlement service holding plans, overrides and quota counters.

Scope every entity and every query by a tenant key, authenticate through a tenant-aware identity layer, and centralise feature gating and quota enforcement in one entitlement service so a plan change takes effect everywhere at once.

Decision 03

Catalog reads should not depend on Meta’s availability or rate limits.

Build the catalog service local-first: writes land in its own store, then sync to Meta as tracked import jobs with per-row status and errors, so a large update neither fails silently nor as one all-or-nothing transaction.

Catalog reads should not depend on Meta’s availability or rate limits. A catalog edit is written to a local MySQL store first. An import job with per-row status then syncs it to the Meta Graph API, and the catalog is assigned to one or more WhatsApp Business Accounts. Catalog edit Local MySQL store Import job with row status Meta Graph API Assigned WABAs

Architecture Narrative

A catalog edit is written to a local MySQL store first. An import job with per-row status then syncs it to the Meta Graph API, and the catalog is assigned to one or more WhatsApp Business Accounts.

04 / OUTCOMES

What the platform makes possible.

15 nodes

Flow building blocks

Messaging, logic, support and commerce nodes cover common conversations.

7 triggers

Flows start in seven ways

Keyword, first message, button reply, API, sub-flow, catalog order and catch-all.

Storefront

Browse, order and pay in one chat

Catalog, order and payment-link nodes remove the need for a separate checkout.

Tiered

Plans, quotas and overrides per business

Different clients can have different capabilities turned on.

Isolated

Every tenant’s data stays separate

All queries are scoped by business id.

Traceable

One conversation, end to end

Distributed tracing follows a message from webhook to outbound send.

05 / STACK

The right language for each service.

Typed Java for business-heavy services, Node.js for I/O-bound messaging work.

Core services

Flow engine, catalog, entitlement and application core.

  • Java 21
  • Spring Boot 3
  • Liquibase

Messaging and onboarding

I/O-bound services close to Meta’s API.

  • Node.js
  • Express
  • Prisma
  • TypeScript

Data and events

Per-service storage, queues and locking.

  • MySQL
  • Kafka
  • RabbitMQ
  • Redis

Experience and operations

Agent workspace, identity and observability.

  • React 18
  • Keycloak
  • OpenTelemetry
  • Zipkin
  • Docker
Next

Building a WhatsApp channel into your own product?

An inbox, flow automation, commerce and tenant packaging can be built around your systems, with your own node types and entitlement model.