Skip to main content

▸ Developer API · WhatsApp SaaS

Run WhatsApp like a business.

I built the platform that turns the raw WhatsApp gateway into a product: one API call out, a message delivered, a signed webhook back — for any number of tenants, safely.

  • Full-stack engineering
  • Product & architecture
  • Payments & billing

Relay's core loop: an API request sends a WhatsApp template message, then a cryptographically signed webhook reports delivery back to the caller's server.

The brief

Plenty of businesses want to use WhatsApp at scale — onboarding flows, order updates, marketing blasts — but the raw WhatsApp gateway (Evolution API) is infrastructure, not a product: bare HTTP, per-server API keys, no billing, no team management, no guardrails. Relay wraps that power in a SaaS anyone can sign up for and use safely.

Tenants connect their own WhatsApp numbers, send templated messages and bulk campaigns, manage contacts and webhooks, and pay per active number — while the underlying gateway keys, servers, and instance names never leave the backend. I built the platform end to end, led the product, and owned the billing.

// the scroll closes the loop

One call. One message. One signed callback.

The product's core, end to end — the API, the send pipeline, and the signed webhook are all mine. // illustrative payload · not a live endpoint

  • API requestPOST /v1/messages
  • WhatsApp messagedelivered to the contact
  • signed webhookmessage.delivered → your server

▸ One boundary

Every tenant, walled off from the gateway.

Relay is the multi-tenant SaaS layer on top of the open-source Evolution API gateway. Tenants never touch it directly — every WhatsApp call funnels through one place.

  • One client, one boundary

    A single EvolutionClient is the only class that holds a decrypted gateway key or makes a gateway call — keys and instance names are never serialised into a response, prop, or log.

  • Org-scoped by default

    An OrgScope global scope (spatie permission in teams mode, org = team) means one tenant can never reach another's numbers — covered by cross-tenant regression tests.

  • Privacy by design

    Message bodies are not persisted in the gateway's database, and per-instance keys are encrypted at rest. The product holds the least it can.

Relay dashboard command center with usage, connection health, a 14-day send-volume chart, and an activity feed
// dashboard — usage, connection health, 14-day send volume
Relay instances list showing connected WhatsApp numbers with status and phone numbers
// instances — connected numbers, status, per-instance settings

Numbers, under control

Instances are the heart of the product. Each one is a WhatsApp number a tenant connects and manages — with live connection health, per-instance settings, and webhooks — while Relay holds the gateway credentials behind a strict tenant boundary.

That boundary is non-negotiable: a tenant never receives a gateway API key, server URL, or internal instance name. Every WhatsApp call is proxied through the Laravel API, so one customer can never reach another's numbers.

▸ What Relay does

Everything to operate WhatsApp as a channel.

Without ever touching the raw gateway.

  • Connect numbers

    Spin up WhatsApp instances, scan a QR to connect, and watch live status — connected, awaiting QR, or offline — stream in over WebSockets in real time.

  • Campaigns & templates

    Build reusable message templates with variables, then send them as bulk campaigns to a segment of contacts at a controlled rate, tracked per recipient.

  • Contacts & consent

    A contact book with tags, attributes, CSV import, and consent status, so audiences stay clean and campaigns reach the right people.

  • Webhooks & API

    A public REST API and signed outbound webhooks let customers wire Relay into their own systems — order confirmations, OTPs, support flows.

  • Teams & roles

    Each organisation has members and roles, with 2FA enforcement for owners and a full audit trail of every sensitive action.

  • Usage-based billing

    Stripe subscriptions bill per active number per month, with plan limits, trial credits, and quantity that syncs automatically as instances change.

Relay campaigns list with names, statuses, templates, and send progress
// campaigns — names, statuses, templates, send progress
Relay API reference with authentication, error envelope, and endpoint documentation
// developers — auth, error envelope, endpoint reference

▸ Built to be programmed against

An API-first platform

The Loop is more than the dashboard — every action in it is an API call. A versioned public REST API lets customers create org-scoped tokens, send messages, and manage instances and templates from their own code, with a consistent error envelope and rate-limiting baked in.

The in-app developer reference documents every endpoint with copy-ready examples — so a developer can go from sign-up to first message without leaving the dashboard.

Relay billing page with Free, Starter, Growth, and Scale plans and per-plan limits
// billing — per-number plans and per-plan limits

▸ Pricing

Four plans, billed per active number.

  • FreeFree1 number · unlimited msgs/day · 1 user
  • Starter$19/mo1 number · 1,000 msgs/day · 1 user
  • Growth$49/mo3 numbers · 5,000 msgs/day · 5 users
  • Scale$149/mo10 numbers · unlimited msgs/day · unlimited users

Plan limits are real configuration; this is pre-launch, so there are no usage numbers to show yet.

▸ Under the hood

The architecture

A modern Laravel monolith with a typed SPA front end, designed around a hard multi-tenant boundary and self-hosted realtime.

  • Laravel 13.7
  • PHP 8.4
  • Inertia 3
  • React 19
  • Tailwind 4
  • Vite 8
  • shadcn/ui
  • // multi-tenancy

    Org-scoped multi-tenancy

    A single Postgres database with row-level scoping via an org_id global scope and team-scoped roles, covered by cross-tenant regression tests so data can never leak between orgs.

  • // gateway-boundary

    Gateway proxy boundary

    Every WhatsApp call funnels through a single EvolutionClient service; gateway keys and instance names are encrypted and hidden — never serialised into a response, prop, or log. Multi-region Evolution nodes are provisioned through an admin node fleet built in collaboration with a teammate.

  • // realtime

    Realtime & queues

    Laravel Reverb pushes QR codes and connection status over WebSockets; Horizon-managed queues process inbound gateway events and outbound webhooks with retries.

  • // billing

    Stripe billing

    Cashier subscriptions bill the organisation (not the user) per active number, with plan limits, trial credits, and automatic quantity sync via Stripe webhooks.

  • // auth

    Auth & audit

    Fortify-powered auth with two-factor enforcement for owners, signed internal webhooks, and an activity log scoped per organisation for a complete audit trail.

Outcomes

Relay is built end to end: a product that turns raw WhatsApp infrastructure into something a business will be able to sign up for and use safely — connect a number, import contacts, send a campaign, and wire the API into their stack — while the platform handles tenancy, realtime status, and per-number billing behind the scenes.

On one Laravel codebase with a typed React front end, a hard tenant boundary, self-hosted realtime, and Stripe billing, it's structured to scale to many organisations, numbers, and messages as it heads toward launch. It is pre-launch — the architecture and plan tiers are real; the customer numbers are still ahead.