Shared team inbox
Assignment, claiming, internal notes and saved replies, with an SLA clock that counts business time rather than wall time.
Works todayAvailable now
In build
The whole team
Nineteen specialists, each with a defined job and an honest status label.
See all nineteenMeta's API will accept a free-form reply sent after the 24-hour service window closes, and then quietly drop it — the business believes it answered, the customer never sees it. Wavy computes the same window from real timestamps and refuses the send before a provider is ever called, naming the approved template you can use instead. That one refusal is the shape of the whole product: a shared inbox, campaigns, and an automation builder, all built around not telling you something happened when it did not.
Why this exists
Ask a WhatsApp Business Platform vendor what happens after the 24-hour service window closes, and most will tell you about the countdown they show you. Ask what happens if you send anyway, and the honest ones will admit Meta's API still returns success — the message was accepted, then dropped, because a free-form reply outside the window is not deliverable and Meta's own rules say so. The tool reports “sent.” The owner believes the conversation is handled. The customer, who asked a question three days ago and never heard back, believes they were ignored. Nobody finds out until the customer says so somewhere the business can see it — a review, a second message from a different number, a complaint to someone else on the team.
Wavy exists because that gap is closeable with arithmetic a server can run before the message leaves it, not after. Every conversation carries a real last-inbound timestamp; every free-form send checks it against the window before a provider is touched. When the window is open, the send goes through exactly as you would expect. When it is not, the request is refused with a 409 and the approved template you can send instead — not a warning label, a hard stop with a next step attached. The rest of the product follows the same instinct: a campaign will not launch around a contact with no consent record, a template will not submit if it breaks a rule Meta enforces, and an automation will not invent a connector that does not exist. None of these are features in the usual sense. They are the specific ways this product has decided not to lie to you, chosen because the alternative — a plausible- looking success that is actually silence — is the single most expensive failure mode in a channel where the customer cannot tell the difference between “we're on it” and “nobody is coming.”
What it refuses to do
Every competitor's landing page reads the same. These are the specific refusals, and the code that enforces each one.
Meta's own rule is that a free-form message sent more than 24 hours after a customer's last message is accepted by the API and then silently dropped — the business believes it answered, the customer never sees it. Wavy checks the window before the provider is ever touched and refuses the send with the approved-template alternative named in the same response, rather than reporting a delivery that did not happen. The check only runs on a connected cloud number: a QR-paired handset has no Meta window, because it is a phone, and a phone can message anyone at any hour.
Every recipient queued for a marketing send is checked against a category-matched consent record before launch, and a contact with no record is treated as not consented — never assumed yes. Recipients that fail are marked suppressed, not silently dropped, so a launch reports '900 contacts, 400 reachable' instead of a shorter send nobody can explain. Resuming a paused campaign re-runs the same sweep, because consent withdrawn while paused has to be caught before anything requeues.
A staff note is stored as a different kind of row entirely — no direction, no provider id, no delivery status — so there is no code path from a note to a customer and no flag that could be flipped to create one. The safety here is structural: the two tables simply have no shape in common for a note to travel through.
Category limits, button caps, the restrictions authentication templates carry on links and media, and header-type mismatches are all checked before a submission leaves this server — because a rejected or miscategorised template can cost the account a utility restriction that lasts a week or more and is not something an owner can appeal quickly.
Describe an automation and name a step that does not exist, and it is dropped from the plan and reported with the reason — never approximated with something close. The same honesty covers numbers: a WhatsApp number's quality rating and messaging tier are only ever Meta's own figures, echoed back with from_provider stated, never computed locally and passed off as live.
How it works
Three steps. The second one is what makes the SLA clock tell the truth about an 11pm message.
Add the display name and the phone number. Set it as the workspace default and every other number's default flag clears automatically, so a send is never ambiguous about which number it goes out from — a workspace running two numbers cannot have both claiming to be the one that answers by default.
This is what the SLA clock actually reads, not a display setting. An unassigned conversation that arrives at 11pm does not sit reported as breaching by the time a manager checks the queue at 9am — the unassigned list reports a business-time wait alongside the wall-clock one, and the two tell different stories on purpose.
Any role can claim a conversation nobody holds yet. Claiming one somebody else already holds is refused unless you are an owner or admin — the rule that keeps a shared queue from turning into two people answering the same customer at once.
The billing guard
Every WhatsApp Business Platform tool can show you a countdown to the 24-hour service window. Almost none of them stop you from sending after it closes — the send still returns success, because Meta accepted the API call before dropping the message. Wavy computes the same arithmetic from real message timestamps and then does the part that matters: it checks before the provider is ever called, and a free-form reply outside the window is refused with a 409 naming the approved template you can send instead.
Describe it, or pick a template
Type what should happen in English, Hindi or Hinglish, and the builder returns steps compiled against a fixed vocabulary of two connectors and ten actions. A step naming a connector or action that does not exist is not guessed at with something close — it is dropped from the plan and named in the response, along with any required argument the description left out, returned as a question rather than a silent default. Every new automation, built this way or picked from the eleven-item gallery, installs switched off. You preview it, then turn it on yourself.
The shared inbox
Assignment, claiming, internal notes and saved replies sit on top of an SLA clock that counts business time rather than wall time. A note stays a note: it is a different row type with no direction, no provider id and no status, so there is no shape it could take on the way to becoming a message a customer reads. Role-based access control runs on one permission catalogue, every entry of which governs at least one route — so a workspace can revoke a permission and the route notices immediately.
Numbers and campaigns
A number registry with an exclusive default flag, campaign audience building, and analytics that separate what Wavy actually knows from what only Meta knows work locally with no credential. Sent, delivered, failed and pending counts are always real, drawn from Wavy's own recipient rows. Read and clicked figures stay null without a connected account — never zero, because a zero would assert nobody opened the message, and that is not something Wavy can see.
What it does
Every capability specified for Wavy has real code behind it today. The label on each card comes from the backend's own status module, not from this page.
Assignment, claiming, internal notes and saved replies, with an SLA clock that counts business time rather than wall time.
Works todayOwner, admin, agent and viewer, seeded per workspace, with a sixteen-entry permission catalogue — every entry of which governs at least one route, so revoking one on the Roles screen changes what the product does. Campaign, template, assignment and integration changes are written to a queryable audit log.
Works todayA session cannot be created without a disclosure the customer sees. Handing off to a person is instant and idempotent, and it stops the bot from replying by marking the conversation operator-handled.
Works todayA live consent record per contact and category, plus an append-only event log, so a send-time check always reads current state and a regulator's question about how consent was obtained still has an answer.
Works todayWindow arithmetic computed from real message timestamps, reported per conversation and as an at-risk list, and enforced on the send path — not just a countdown nobody checks before sending.
Works todayA short link with a tracking code embedded in the message text itself, since WhatsApp passes no referrer. Attributing a click to a conversation twice is a no-op, never an overwrite.
Works todayForm definition, server-side validation of submitted payloads, and routing of results, all against Wavy's own data.
Works todayA flat step-list engine with an eleven-item template gallery and a dry-run evaluator, all free of any credential. A published flow now drives real inbound traffic too: it matches each customer message to the flow's next node, persists where the contact is so a restart can't lose it, records answers, and hands off to a person on reaching a handoff node — an idle session times out and reverts to the human queue on its own. Describing an automation in English, Hindi or Hinglish instead of picking from the gallery is one added convenience that needs an LLM key; without it, that one route returns 503 naming what's missing rather than guessing.
Works todaysent / delivered / failed / pending are always real, counted from our own records — and a live cost summary of accepted sends is too. An hourly worker is built and tested to additionally pull Meta's own read/click and pricing figures before its retention window closes, but it needs a connected channel's access token and a Meta-granted permission scope this deployment's Embedded Signup flow doesn't request yet — without both, it records why it skipped a workspace rather than writing a zero.
Needs a keyAudience building, scheduling, launch approval and full pause, resume and cancel work locally. Resume re-runs every launch guard — permission, template gate, consent sweep — and rolls back entirely if nobody left still consents.
Needs a keyLocal template CRUD plus pre-submission validation of the rules Meta enforces, so a rejection risk is caught before it costs the account a utility restriction.
Needs a keyBooking, rescheduling — which shifts unsent reminders by the same delta — and cancellation all work locally. This route computes what is due; sending it needs a connected number.
Needs a keyCatalogue and product records work locally. A manual catalogue is refused sync outright — there is nothing to pull from; a Shopify or WooCommerce catalogue with no credential returns products_pulled: null, never a fabricated zero.
Needs a keyCart capture and a three-step recovery schedule work locally and idempotently. Each recovery step needs a connected number to actually send.
Needs a keyA number registry with an exclusive default flag works locally. Quality rating and messaging tier come from Meta and are never invented — an unconfigured workspace gets an honest note, not a plausible-looking figure.
Needs a keyPresentational fields apply immediately. Identity fields stage into a pending set and need a second person to approve. The verified badge itself is Meta's to grant and is never asserted locally.
Needs a keyA connection registry and field mappings, validated against a known-field allowlist. A config value that looks like a secret is refused outright — only a named credential reference is stored, never the credential.
Needs a keyA guided checklist per provider — paste the App ID, secret and any other required field, and it is encrypted at rest and never returned by any response. whatsapp/messenger/instagram/meta_ads, which share one Meta app, are verified against a live Graph API call before being marked verified.
Needs a keyA WhatsApp Calls channel reads the same inbox shell as chats: every call's direction, status and duration is logged and a Call Recordings page tracks a monthly minutes allowance — all local, no third-party credential. What it needs from you is Meta enabling Business Calling on the connected number, which Meta grants per number on request.
Needs a keyThe honest remainder
Nothing below is unbuilt. Each one is real, working code waiting on a WhatsApp number, an LLM key, or a commerce credential only you can supply.
Audience, scheduling and the consent sweep all run without a connected number. Delivery — the send itself — needs a Meta WhatsApp Business Account connected to this workspace.
Wavy validates a template against Meta's own rules before submission. Whether Meta approves it, and syncing that state back, needs the connected account — the decision is Meta's, not ours to assert.
The number registry and the last recorded rating work with nothing connected. A current figure — not the last one stored — needs Meta credentials on the number.
Sent, delivered, failed and pending are always real. Whether a message was read or a link was clicked is Meta's data: an hourly worker is built to pull it in before Meta's own retention window closes, but needs a connected channel's access token plus a Meta-granted permission scope this deployment doesn't request yet — without both, figures stay null, never a fabricated zero.
Catalogue and product records exist and are editable with nothing connected. Syncing from an actual storefront needs a Shopify or WooCommerce credential — there is nothing to sync from a manual catalogue, and the route refuses to try.
The call log, recording storage and Call Recordings usage meter all work with nothing connected beyond the number itself. Actually taking a call needs Meta to enable Business Calling on that connected number, which Meta grants per number on request, not automatically.
Against WATI and Interakt
Their features are read off their own pages. Ours are checked against the code, and the row says which module to open. Anything we lack is in this table, not omitted from it.
| Capability | Wavy | WATI | Interakt |
|---|---|---|---|
| Shared team inbox One number, many agents, with assignment, internal notes and saved replies. | Yes | Yes | Yes |
| Automatic assignment Round-robin or fewest-open, skipping agents who are away or outside working hours, and recording why it chose whom. | Yes | Yes | Yes |
| Teams Route a conversation to Billing rather than to a person, then pick inside it. | Yes | Yes | Yes |
| Working hours and away messages A weekly schedule and holidays that the SLA clock and assignment both consult. | Yes | Yes | Yes |
| Agent and inbox analytics First-response and resolution time per agent and per day, on both the wall clock and business hours. | Yes | Yes | No |
| Broadcast campaigns Segment an audience, pick an approved template, schedule, pause, resume, cancel. | Yes | Yes | Yes |
| Opt-in enforced before a send Category-matched consent checked at launch and again mid-sequence; no record means blocked, never assumed yes. | Yes | Yes | Yes |
| 24-hour window refused on the send path A free-form reply after the window closes is refused with the template alternative named, instead of accepted by Meta and silently dropped. | Yes | Yes | Yes |
| Cost shown before launch Projected spend from a dated rate card, per country and template category, with a refusal when the card does not cover the send date. | Yes | Yes | No |
| Template pre-submission validation Refuses what Meta refuses — URLs or emoji in an authentication template, a media header declared as text, too many buttons — before spending a submission. | Yes | Yes | Yes |
| Template rejection reason and quality score Why Meta refused it, its quality rating, and whether Meta re-categorised it. | Yes | No | No |
| Carousel and typed template components Cards with media headers and typed buttons, so a catalogue is not a paragraph. | Yes | Yes | Yes |
| Drip sequences A delayed ladder that re-checks consent at every step and stops the moment the customer replies, buys or books. | Yes | Yes | Yes |
| Orders with cash on delivery An order linking the cart, the payment and fulfilment, where a COD confirmation is a button reply and no payment link at all. | Yes | No | Yes |
| Order-status notifications Shipped, out for delivery, delivered and RTO arriving from the shop and going out as utility templates, once each. | Yes | Yes | Yes |
| Click-to-chat links with QR codes A trackable wa.me link and a printable QR whose scan attributes like a click. | Yes | Yes | Yes |
| Native in-chat forms (WhatsApp Flows) Meta's own overlay form, rendered inside WhatsApp, with a data-exchange callback per screen. Partial: We have server-validated forms (form_flows) that are a different thing: they do not render inside WhatsApp. Meta Flows needs a connected WABA and a publicly reachable data-exchange endpoint, so it is not built rather than half-shipped. | Partly | Yes | Yes |
| Chatbot with buttons, typed answers and API steps Flow nodes that send tappable buttons, validate what they capture, and call an API mid-conversation to read stock or a slot. Gap: Our flow builder publishes and drives real traffic, but its nodes are message, question and handoff, matched on keywords, and what a question captures is not validated. Interakt gates branching and API-call nodes to its Advanced tier. | No | Yes | Yes |
| WhatsApp voice calling and a voice AI agent Calls placed and answered on WhatsApp, with an AI voice agent. Gap: WATI shipped WhatsApp Calling and its Astra voice agent. Voice at Automix is Wani's product and bills per minute, not Wavy's per-message meter — a different agent, not a hidden feature of this one. | No | Yes | No |
| RCS and SMS fallback Retrying an undelivered WhatsApp message over another channel. Gap: Not built and not currently planned. WATI ships it. | No | Yes | No |
| Native Shopify and WooCommerce apps An installable storefront app that syncs products and orders with no glue code. Partial: We accept cart and order webhooks from any platform, which works but is not an app you install from a marketplace. WATI sells a Shopify add-on; Interakt is Shopify-native. | Partly | Yes | Yes |
| Built-in Meta Ads manager Creating and managing click-to-WhatsApp ad campaigns without leaving the tool. Gap: Neither of these two ships it either — AiSensy does, which is why it is in the research file. We attribute ad-sourced conversations; we do not buy the ads. | No | No | No |
| Self-service checkout Signing up and paying for a plan on the website, with no conversation. Gap: There is no checkout on this site. You can create a workspace and connect your own number; a plan is arranged with us. | No | Yes | Yes |
WATI
Interakt
Figures read from vendor-owned pricing pages on 16 August 2026. Where a vendor's page states no number we say so rather than estimating one.
Pricing
1 credit = ₹1.00. You are charged for the messages you actually send, at the rate for that message's category — so a quiet month costs less than a busy one.
New workspaces start with 100 credits free. That is 1,000 in-window replies, or 285 utility or OTP messages, or 80 marketing template sends — whichever mix you use.
| Message | Credits | What it is |
|---|---|---|
| Reply inside the 24-hour window | 0.10 | What an agent or the AI sends while the customer's own message is still recent. Meta charges nothing for these today, so this is our margin alone — and it changes on 1 October 2026, when Meta begins charging for them. |
| Utility template | 0.35 | Order confirmations, shipping updates, appointment reminders. Transactional, and priced as such. |
| Authentication / OTP | 0.35 | One-time passcodes. Same rate as utility. |
| Marketing template | 1.25 | Promotions and broadcasts, and the only category Meta charges us a rupee for. Every send is checked against a category-matched opt-in before it goes. |
Every AI call — a drafted reply, a summary, a translation, a knowledge answer — is 1 credit.
₹999 /month
The platform, the shared inbox, and the Starter credit rate. GST additional.
₹2,799 /month
For a team running campaigns and automations daily. GST additional.
₹3,799 /month
For multiple numbers and higher volume. GST additional.
A subscription buys the platform and your tier's credit rate. Messages are consumption on top, charged per message at the rates above — so a quiet month costs less than a busy one, and nothing is billed for messages you did not send.
There is no checkout on this website yet. You can create a workspace and connect your own WhatsApp number today; talk to us to be set up on a plan.
Before you switch
A free trial connects your own WhatsApp number during onboarding — the same guardrails run from the first message.
Questions
No. A free-form send outside the service window is refused with a 409 naming the approved-template alternative, before anything reaches a provider. This only applies to a connected cloud number — a QR-paired handset has no Meta window to enforce.
Not for a marketing-category template. Every queued recipient is checked against a category-matched consent record at launch and again at resume, and a contact with no record is treated as blocked, never assumed to have agreed.
It is dropped from the plan and named in the response, with the reason — for example, naming a connector that does not exist. Nothing in the description is silently substituted with something close, and a missing required value comes back as a question instead of a default.
No. A note is stored in a different table entirely, with no direction, provider id or status column — there is no code path that could send it, not a setting that has to be kept off.
Only when Meta credentials are configured on the number. Without them, refreshing a number's health returns the last locally recorded rating with from_provider: false and a note saying so — never a plausible-looking number standing in for a real one.
The inbox, role permissions, consent records, the window guard and click-to-chat attribution all work against Wavy's own data with nothing connected. A WhatsApp number is what turns replying, campaigns and reminders into messages that actually leave the workspace.