▸ 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
EvolutionClientis 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
OrgScopeglobal 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.
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.
▸ 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.
▸ 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_idglobal 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
EvolutionClientservice; 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.




