No queue reachable without consent
Consent capture with basis-derived expiry, permanent opt-out, a suppression list and the blocked-dial log all work locally. The National DND feed needs a telecom access-provider credential.
Needs a credentialAvailable now
In build
The whole team
Nineteen specialists, each with a defined job and an honest status label.
See all nineteenA queued call, an attempt and a placed call each carry a required foreign key back to the consent that permitted them — there is no column path to a dialled number any other way. The calling window is enforced as a database constraint, narrowed by a workspace and never widened, and every blocked dial is kept as a row naming why, because that log is the evidence a business would need to produce, not an error list to hide.
How it works
Three steps, and the disclosure at the end cannot be edited out of existence, only reworded.
Capture consent on one of three bases — explicit opt-in, an existing customer relationship, or an inbound enquiry — each with its own expiry rather than one shared toggle. Opt-out is one-way: nothing in this product clears it, and nothing grants consent back to a number that opted out.
Every dial passes through one function that can authorise it, and nothing else in the codebase can. Wani only dials between 9am and 9pm, computed in the recipient's own local time zone rather than the caller's. That floor and ceiling are CHECK constraints on the database itself — a workspace can narrow its own calling hours; nothing, not the API, not a migration, not direct SQL, can widen them past 9 to 21. This specific window has not been confirmed against a primary regulatory source, so it is described here as what the product enforces — a deliberately conservative choice — rather than as a citation of a rule nobody here has verified.
The call opens by saying it is an AI and names the business, and a caller who asks for a person is transferred without a branch that can refuse. Both nodes are rewritten back into a flow on every save — wording is editable, existence is not.
The boundary
A campaign imported on Monday with a valid basis can reach its last row on Thursday, by which point that particular contact may have opted out on a different call entirely. Queueing and dispatch both run the same gate, but only the dispatch answer authorises anything — validating at import produces a decision that was true once, and validating at dispatch produces one that is true now.
In the recipient's clock
Wani only dials between 9am and 9pm, computed in the recipient's own local time zone rather than the caller's. That floor and ceiling are CHECK constraints on the database itself — a workspace can narrow its own calling hours; nothing, not the API, not a migration, not direct SQL, can widen them past 9 to 21. This specific window has not been confirmed against a primary regulatory source, so it is described here as what the product enforces — a deliberately conservative choice — rather than as a citation of a rule nobody here has verified. The same machinery that resolves a recipient's time zone already exists elsewhere in the product, reused here rather than rewritten, because this codebase has already paid once for getting local time wrong.
What cannot be configured away
Two things stay true no matter what a workspace configures: every call opens with a disclosure that it is an automated assistant, and every blocked dial leaves a row. Neither is a nice-to-have — the disclosure is what a caller needs to know before the call continues, and the block log is the record a business would have to produce if it ever needed to show what it did not do.
What it does
Each card carries its own limit, and the label is derived from the backend's capability module rather than written here. Most end at awaiting-provider — the gate is real; the telephony credential is the operator's to add.
Consent capture with basis-derived expiry, permanent opt-out, a suppression list and the blocked-dial log all work locally. The National DND feed needs a telecom access-provider credential.
Needs a credentialThe permitted window is evaluated in the recipient's own local zone, and calls outside it are deferred with a visible next-attempt time. The floor and ceiling are CHECK constraints — a workspace can narrow them, nothing can widen them.
Works todayQueue, compliance gate, deferral, per-contact frequency cap, retry backoff, dispositions and callbacks are all real. Dispatch ends at awaiting-provider: placing the call needs a telephony credential.
Needs a credentialReminders are queued from a Wavy appointment as service-category calls, each gated independently through the same authorisation function. Placing them needs a telephony credential.
Needs a credentialQueues a qualifying call against a Jeet lead through the same gate as every other entry point, so a lead with no recorded consent basis is refused before it reaches a queue.
Needs a credentialDisclosure logging, the consent gate and a mandatory retention clock are enforced: the recording's consent reference is NOT NULL, so a recording naming no disclosure cannot be written.
Needs a credentialAn explicit request for a person is classified before scope or confidence, the route has no branch that refuses one, and a staff roster with round-robin routing now decides who the call goes to. The warm-transfer telephony leg and paging the receiving agent's device both still need providers this deployment doesn't have — the response names which, rather than claiming a device was paged.
Needs a credentialTemplates, a hand-built configuration, or a sentence describing what the agent should do — all three write through the same normaliser, so the AI-disclosure and human-handoff nodes are re-inserted on every write.
Works todayWrites the disposition and summary onto the contact's Wavy conversation as a summary and a tag, never as a message in the customer's own thread. A failed sync surfaces rather than retrying quietly.
Works todayDaily volume, outcome breakdown and blocked-dial counts from this workspace's own rows only. Connect rate and average talk time are null rather than zero when nothing has an outcome yet.
Works todayPacing is recomputed per read from the minutes left in the recipient's window and clamped to the carrier's documented ceiling. A paused campaign is refused at the gate, not filtered from the queue, and launching one now queues every contact on a list straight through the same gate a single call uses — reporting queued, deferred and blocked per contact rather than aborting the batch on one bad row. Dialling at the paced rate still needs a telephony credential.
Needs a credentialVoice selection over a real provider catalogue; listing returns the real list or an empty one naming the missing credential, never a plausible voice id nobody has checked. Holding a conversation needs speech-to-text, not built yet.
Needs a credentialA register of the numbers a business calls from with its own capability, and a record of which published agent answers on which number. Nothing is provisioned and no call is answered — there is deliberately no inbound webhook with no provider behind it to sign one.
Needs a credentialSummary generation runs end to end off the call's captured fields, notes and disposition through the shared LLM layer, tagging every point as a confirmed field or the model's own inference rather than inventing what was said. This deployment records no call audio and has no speech-to-text credential, so the transcript itself always reports why rather than fabricating one — a summary can never be saved without an explicit language, to guard a Hindi or code-mixed call against being silently mangled by an English default.
Needs a credentialThe voicemail drop message is real: sender identification and an opt-out instruction cannot be saved blank, enforced by the same kind of constraint that keeps the AI-disclosure node from being deleted. Actually detecting a machine needs the telephony provider's answering-machine-detection feature, and speaking the message needs text-to-speech plus that same provider — neither is configured, so nothing but this API writes a row here yet.
Needs a credentialQuality flags are classified in the same pass that builds a call's summary; a flag naming a type outside the closed set is dropped rather than stored under a guess. Listing, review — which always requires a human's own note — and a summary that groups repeated flags into a suggested script fix all run locally. The only blocker is an LLM credential.
Needs a credentialEvery claim above traces to a route, a CHECK constraint or a status entry in the code, and a test fails the build the moment the two disagree — including a test that this page never cites a regulation number for the 9am-to-9pm calling window, because that specific figure has not been confirmed against a primary regulatory source. That is honest labelling, not compliance sign-off. Before this page goes live, a qualified telecom-compliance reviewer familiar with TRAI's current rules should confirm the calling window, the consent-expiry figures and the DND-scrub description are accurate as stated, and correct anything that is not. Saying that here is a trust signal, not an admission.
Before you switch
Tell us what your calling programme looks like today, and we will tell you exactly what Wani can run now — and where it insists on a telephony credential before a single call is placed.

The one sequence Wani does end to end today: somebody rings and cannot get through, Wani rings back, and an appointment is booked only after the date is said out loud and agreed to.
Scripted demo. These are written lines, not a recording of a real call — no call has been placed to a handset from this deployment yet.
Turn 1 of 9
Hello, this is an AI assistant calling on behalf of Sharma Dental. You rang us a few minutes ago and we could not pick up — sorry about that.
The AI disclosure opens the call. It is re-inserted into every flow by normalise_flow_nodes, so no agent can be configured without it.
Oh, yes. I wanted to move my check-up.
The missed call was recorded as an inbound_request consent, valid for 30 days, with the caller's number and the hangup cause as its evidence.
Of course. Which day would suit you better?
Tuesday, if you have anything in the afternoon.
I can do Tuesday the first of September, at four o'clock in the afternoon. Shall I put that down?
The read-back. No appointment exists at this point — a CHECK constraint means a hold cannot carry an appointment until it is confirmed, and cannot be confirmed without these words stored.
Yes, that works.
Booked. You will get it in writing from Sharma Dental. Anything else I can help with?
Only now is the appointment written, and its notes carry both what was read back and what the caller said in reply.
No, that is all. Thank you.
Thank you for your time. Goodbye.
The call is billed from the carrier's own duration, rounded up to the minute, when the CDR arrives — never from our clock.
Scripted demo. These are written lines, not a recording of a real call — no call has been placed to a handset from this deployment yet.
One credit is ₹1. You are charged per connected minute, rounded up, using the carrier’s own duration rather than ours — so ringing time is not billed and a call nobody answered costs nothing.
| Plan | Credits per connected minute | What it includes |
|---|---|---|
| Free | 10 | English only, on free voice models. The signup bonus is 100 credits, so the free tier is ten minutes of talking — enough to hear it work. |
| Standard | 5 | Hindi and the other Indian languages, on Sarvam. |
| Professional | 4.5 | Adds ElevenLabs. Fractions of a credit are carried between calls rather than rounded up on each one, so ten minutes costs 45 credits and not 50. |
| Advanced | 3.5 | Adds Grok and the self-hosted Hindi voice. |
| Enterprise | 3 | Adds the seam for a voice model trained on your own calls. Not on sale yet: the carrier's per-minute cost is still unknown here, so this rate is flagged as unverified in the database and Wani will not sell it until it is. |
GST at 18% is charged once, when you buy credits — 100 credits costs ₹118. Calls then draw down the credits you already own, with no tax applied again.
A phone number is separate. The carrier charges a one-off setup fee and a monthly rental, and both pass through at cost — outside credits, with nothing added on top.
No language has been verified end to end. A voice product that says “supports 12 Indian languages” without saying which of them anyone has actually listened to is making a claim it cannot back, so this table separates what is written from what has been heard.
The spoken date read-back is checked by tests: no digits in the date, the weekday always said, twelve-hour time with the part of day. What has not happened is a real call — the words are right, nobody has heard them down a phone line.
The read-back is implemented from written grammar and has never been checked by a native speaker or heard aloud. Every appointment booked in Hindi is stored with read_back_verified set to false, so the gap is visible in the data rather than only in this paragraph.
Selectable on the paid tiers for speech, but there is no spoken date read-back for them yet, and Wani refuses to book an appointment it cannot read back rather than falling back to English.
Questions
No — not as a policy, as a database shape. There is exactly one function that can authorise a dial, every entry point that queues or dispatches a call goes through it, and a queued call, an attempt and an outbound call each carry a NOT NULL foreign key back to the consent that permitted them. A blocked dial produces a compliance-block row instead of an attempt row — there is no column sequence that reaches a dialled number by another path.
Explicit consent to receive a promotional call expires in seven days, checked against the 2025 TRAI amendment that shortened it, and read the conservative way: consent gone stale is treated as no consent at all, not as slightly old. A customer relationship licenses a service call for longer, and someone who reached out first is expected to hear back, but not indefinitely — three bases, three different clocks, none of them permanent, and the gate re-checks the clock at the moment of the dial, not just when the number was queued.
Wani only dials between 9am and 9pm, computed in the recipient's own local time zone rather than the caller's. That floor and ceiling are CHECK constraints on the database itself — a workspace can narrow its own calling hours; nothing, not the API, not a migration, not direct SQL, can widen them past 9 to 21. This specific window has not been confirmed against a primary regulatory source, so it is described here as what the product enforces — a deliberately conservative choice — rather than as a citation of a rule nobody here has verified.
No. start_hour_local and end_hour_local are bounded by CHECK constraints that cap the floor at 9 and the ceiling at 21 — not through the API, not through a workspace's own migration, not through direct SQL. A workspace may narrow its own hours; nothing in this product can widen them past that bound.
Yes, at the start of every call, and that opening cannot be removed. Deleting the disclosure node from a flow does not take effect — the same normaliser that writes any flow re-inserts it on every save. The wording can be customised; the node's existence cannot.
The request is classified before anything else about the call — before scope, before confidence — and the handoff route has no branch that refuses it. The warm transfer itself is a telephony-provider capability this deployment does not have configured yet, but the request to be handed off is never declined.
It is the evidence a business would need to produce if it ever had to show what it did not do, not a hidden error list. Every refusal — no consent, an expired one, an opted-out number, a suppressed one, an unresolved DND answer — writes a row naming the reason, so 'we never reached this contact' and 'we were not allowed to reach this contact' stay two different, checkable facts.