A dead ringer for the real thing.
A desktop app that is a local stand-in for the APIs your app sends through: the WhatsApp Cloud API, Postmark or SMTP for mail, and SMSPortal for SMS. Point your app at it instead of the live endpoints, play the customer yourself, and get webhooks back in the same shape. Nothing leaves your machine except a media link your app sends, which it downloads as Meta does.
14 days, full features, no card. Mac today; a Windows build is in development.
Three problems with the free test number
Meta gives you one. In order of how much it costs you.
It doesn't shard
One test number, one callback URL, one developer at a time. Parallel workspaces, git worktrees and multiple agents all collide. Working around it means building a fan-out router.
Setup costs hours
Business verification, a WABA, tokens, webhook config, template review queues. Repeated for every client.
It is networked and non-deterministic
Async webhooks with real latency, rate limits, shared state. Unusable in CI. Unusable offline.
Thirty seconds from new project to sending messages
Your app talks to it exactly as it would talk to the live API.
One project per client integration. Each gets its own phone number, tokens and history, isolated from the others.
curl -X POST http://127.0.0.1:3010/_api/projects \
-H 'Content-Type: application/json' \
-d '{"name":"Acme Corp"}'
Swap the base URL and credentials in your config. Every version prefix is accepted. Docker works through host.docker.internal.
META_GRAPH_URL=http://127.0.0.1:3010 META_WHATSAPP_PHONE_NUMBER_ID=100000000000002 META_WHATSAPP_ACCESS_TOKEN=EAA… META_APP_SECRET=f409…
Reply from the chat UI, from curl, or let an agent do it over the built-in MCP server. Delivery statuses and read receipts come back as webhooks, signed the way Meta signs them.
POST /_api/projects/acme-corp/inbound
{"from":"12025550142","text":"thanks, what time?"}
What it looks like
Screenshots of the Mac app, cut down to the part you work in. They follow the page's theme.
Your app sends a template. You tap one of its buttons in the window, and the reply lands on your webhook with its payload.
Pick a status or an error code for any message and your webhook gets exactly that. Every failure path is one click away.
Mail your app sends over SMTP or the Postmark API is caught and rendered. Deliver it, open it, bounce it, or reply as the customer.
Sent messages with their parts, credits and opt-outs, and a button for each delivery receipt your app should handle.
An MCP server on the same port. Add it to your coding agent once and it can set up projects, play the customer and read back what your app sent.
What it speaks
Four surfaces working today, one project behind all of them. A message, the SMS that chases it and the mail it triggers land in the same history.
An MCP server ships alongside them, so a coding agent can drive the customer side. SendGrid, Mailgun and Resend are a day of work each and get built in the order people ask. See the full list, or ask for the one you need.
Laravel's own Postmark mailer hard-codes https, so a Laravel app sends over SMTP: five env lines, no code. SDKs that let you move the base URL, like postmark-php and postmark.js, can use the API path instead.
What it does
What it does not do
One licence. One price. Yours to keep.
An annual licence per developer, two activations each. It renews through Paddle until you cancel; if it lapses, the version you have keeps working and only updates stop. It works offline; the only call after activation is a once-a-day check for updates.
Full pricing and team licences