Meta's platform is designed for one company at a time
A multi-tenant, white label platform for running hundreds of WhatsApp Business accounts from one dashboard or through an API. First commit to production in under three months.

- Year
- 2026
- Client
- PuntoGira
PuntoGira is Riccardo Girardi’s agency, specialising in advanced WhatsApp Marketing. It supports businesses, software houses and web agencies with consulting, strategies and tools for communication and automation on WhatsApp.
- Project
- Uniwaba
Anyone reselling WhatsApp to companies runs into the same wall. Meta's platform is designed for one company talking to its own customers, not for somebody managing dozens or hundreds of them. Every end client means a Cloud API app to create, a Meta review to wait for, tokens to look after, a number to register and every single template approved from scratch.
The maths adds up quickly: months to open one client, multiplied by however many clients you want to serve. And there is a constraint that makes it tighter still, because the shop or the practice at the other end has no intention of giving up answering from the phone. The solution cannot ask them to abandon the app they use every day.

A tree, not a list of clients
The platform has four levels, from Global to Partner to Brand down to the individual Account, and each one sees and commands only its own branch. That is not an organisational detail: it is what lets an agency manage its clients without seeing anyone else's, and a chain with twenty shops treat them as twenty real accounts rather than twenty rows in a spreadsheet.
Across that tree run the operations that used to be done by hand, one at a time. A template approved by Meta propagates to every child in a single move, with the status of each and a retry for the ones that failed. An administrator can act as one of their descendants to sort out a problem, with a banner always visible and an audit line for every session. A deleted user goes into quarantine for thirty days along with their whole subtree, instead of disappearing together with the data.
Two audiences, one API
Agencies want a dashboard, software houses want an API to slot into their own product. What holds the two together is that the public API is not an add-on for partners: it is the same one the front end uses. Whatever works in the interface works through the API by definition, and the documentation is generated from the routes instead of being written separately and quietly going stale.
For software houses there is also a path where the end client never sets foot in Uniwaba. The partner creates the account through the API, with no login and no email address, and receives a single-use code; the client enters it on a page carrying the partner's brand and connects their number from there. They see nothing of Uniwaba, and that is not vanity: for a reseller, their product has to stay their product.
A reseller does not want a platform with our name on it. They want theirs, working.
Campaigns, where the limits are Meta's
A bulk send starts from a CSV or straight from a Google Sheet, filtered views included, with parameters mapped by column name. The sender is chosen row by row, and that is what a multi-site chain needs: each recipient hears from their own branch's number, not from a central one they would not recognise. Before anything goes out there is a dry run, row by row.
Then there are Meta's limits, which are not worked around but respected: the campaign is spread over several days with a daily ceiling, skipping weekends and Italian public holidays. When something fails, the log does not show the raw error code but what it means, with filters by status, sender and error type, and a bulk retry for the failures alone.
Three months from first commit to production
The first commit is dated 19 February 2026, production with Coexistence live on 15 May: under three months. The first real messages went out in June, and at the end of August the first campaign above two thousand recipients served as a stress test. What it broke, namely log pagination, bulk retry of failures and unreadable error codes, was released the same afternoon.
That pace has a specific reason: testing was done by two, with the client inside the production flows and with real numbers. On one call it was the client who, reverse engineering Meta's own console, found the call that registers a number. It became a feature of the platform that same afternoon.
Born for a single client, Uniwaba was set up from the start as something resellable: multi-tenant, white label and a public API were all there in the first weeks, when nobody was using them yet. Today there are thirteen active partners and forty-one brands and accounts beneath them, and the serverless infrastructure means the cost of running it follows usage rather than arriving ahead of it.
A React 19 front end with the React Compiler, Vite, TanStack Query and Tailwind 4, an interface in Italian and English, hosted on AWS Amplify with a subdomain per partner. The backend is Node with Hono and Zod OpenAPI, where the routes are literally the specification: the public API documentation is not written, it is generated. Data lives in PostgreSQL on RDS inside a private VPC, with RDS Proxy and fourteen days of point-in-time recovery. The infrastructure is AWS SAM on eu-west-1: API Gateway, eight Lambdas, SQS with a dead-letter queue, EventBridge Scheduler for scheduled messages, S3 and Secrets Manager. Cognito authentication for the dashboard, API keys for partners, HMAC for Meta's webhooks. Quality is held by TypeScript strict and around fourteen hundred tests, seven hundred and fifty of them end-to-end, run against Postgres and MinIO in testcontainers with Meta and Google mocked: you can develop and test without spending a single real message.
Stack: React 19, Vite, TanStack Query, Node.js, Hono, Zod OpenAPI, Drizzle ORM, PostgreSQL, AWS SAM, Lambda, SQS, EventBridge, Cognito, WhatsApp Cloud API
A React 19 front end with the React Compiler, Vite, TanStack Query and Tailwind 4, an interface in Italian and English, hosted on AWS Amplify with a subdomain per partner. The backend is Node with Hono and Zod OpenAPI, where the routes are literally the specification: the public API documentation is not written, it is generated. Data lives in PostgreSQL on RDS inside a private VPC, with RDS Proxy and fourteen days of point-in-time recovery. The infrastructure is AWS SAM on eu-west-1: API Gateway, eight Lambdas, SQS with a dead-letter queue, EventBridge Scheduler for scheduled messages, S3 and Secrets Manager. Cognito authentication for the dashboard, API keys for partners, HMAC for Meta's webhooks. Quality is held by TypeScript strict and around fourteen hundred tests, seven hundred and fifty of them end-to-end, run against Postgres and MinIO in testcontainers with Meta and Google mocked: you can develop and test without spending a single real message.
Stack: React 19, Vite, TanStack Query, Node.js, Hono, Zod OpenAPI, Drizzle ORM, PostgreSQL, AWS SAM, Lambda, SQS, EventBridge, Cognito, WhatsApp Cloud API
Got something similar in mind?
Tell us what you want to build and we will help you find the shortest way there.






