How opt-outs, consent, and cost reports work in WACRM
WACRM records opt-outs per channel: STOP on WhatsApp blocks later WhatsApp template and broadcast sends, STOP on SMS blocks SMS sends, and on Messenger and Instagram it blocks automated sends. A recorded WhatsApp opt-in gates every broadcast, and you can pull a cost report and 30-day forecast through WACRM's API.
By Huy Nguyen (David), Founder & CEO of Netbase JSC Updated
WACRM gives you three independent ways to stay safe and in control of cost on WhatsApp: an automatic opt-out that blocks future template and broadcast sends to a contact with no setup needed, a consent record that gates every broadcast, and a cost report you can pull through the API. This walks through all three as they work today — including the one piece, a Workspace report screen for cost, that doesn’t exist yet.
What you need before you start
- A WACRM Workspace account with at least one project and at least one contact conversation, for the opt-out and consent sections.
- Owner access to the workspace and a way to call an HTTP API (
curlor similar), for the cost report section — the screen that mints the API key is owner-only.
Stop sending to a contact — opt-out keywords
WACRM watches every inbound text message — on WhatsApp, SMS, Messenger, and Instagram — for an exact opt-out keyword,
case-insensitive, after stripping punctuation and collapsing extra whitespace — a sentence that merely contains the
word doesn’t count. The moment a contact sends one, WACRM records their opt-out for the channel it arrived on. On
WhatsApp, every later attempt to send them a template or broadcast message is then blocked with a consent_required
error, automatically, with nothing for you to configure — a free-text reply to that contact inside an open 24-hour
window still goes through:
| Language | Opt-out keywords |
|---|---|
| English | STOP, UNSUBSCRIBE |
| Spanish | BAJA, ALTO |
| Portuguese (Brazil) | PARAR, SAIR |
| Vietnamese | HUY, DUNG, HỦY, DỪNG |
WACRM sends nothing back when this happens — no automatic confirmation reply — and the same message is also excluded from WACRM’s own AI auto-reply. Opt-outs are recorded per channel, so STOP on one channel doesn’t opt the contact out of another:
| Channel | After STOP on that channel, WACRM refuses… | Still goes through |
|---|---|---|
Template and broadcast sends (409 consent_required) | Free-text replies inside an open 24-hour window | |
| SMS | Every SMS send to that contact, including a reply from the Inbox — refused before any wallet charge. A booking reminder that falls back to SMS is recorded as skipped, reason sms_opted_out | WhatsApp, Messenger, and Instagram messages |
| Messenger / Instagram | Automated sends: AI auto-reply and automations | A reply a person types in the Inbox |
SMS, Messenger, and Instagram never require an opt-in first — only an explicit opt-out blocks a send. WhatsApp template and broadcast sends are the opposite: they need a recorded opt-in (next section). Re-subscribing isn’t automatic either (see the FAQ) — treat an opt-out as something you have to deliberately reverse, the same way you recorded it.
Require consent before a broadcast — the Inbox consent card
A contact’s recorded WhatsApp marketing opt-in is the only signal WACRM’s broadcast system checks before it sends them a template. To record one:
- Open Conversations → Inbox and select the contact’s conversation.
- Find the WhatsApp marketing consent card in the side panel. It shows the contact’s current status and, if set, when it was last recorded.
- Click Record opt-in (or Record opt-out), optionally adding a short note in Source / proof on where the consent came from.
This card makes no legal certification — recording opt-in only tells WACRM the merchant says this customer agreed to receive WhatsApp marketing messages. But it’s the record Broadcasts actually acts on: start a campaign under Messaging → Broadcasts and each recipient without a recorded opt-in is skipped — nothing is sent to them, and the campaign’s Skipped count goes up, captioned No opt-in consent — while the campaign still runs for everyone else. See the first-template guide for the full broadcast walkthrough.
Pull a message cost report and forecast via the API
There’s no cost report screen in Workspace yet — this works through the API only, and only the workspace owner can reach the screen that mints the key.
-
As the owner, open Developer / API & MCP in Workspace’s sidebar (
/settings). -
Create a new key — a Secret key (
sk_live_…) for a server or script — and check Restrict what this key can do (advanced). -
Under WhatsApp CRM scopes, check
cost_reports:read, then create the key. It’s shown exactly once — copy it immediately.Creating keys and restricting scopes depends on your plan — Workspace shows an upgrade notice if yours doesn’t include it.
-
Call the cost report endpoint with that key:
Codecurl -s "https://api.wacrm.ai/v1/crm-projects/{project}/cost-report?date_from=2026-10-01&date_to=2026-10-31" \ -H "Authorization: Bearer sk_live_your_scoped_key"
{project} is your project’s UUID; it must be the same project your key belongs to — a different project, even one
you also own, returns 404. Dates use YYYY-MM-DD, the range can’t exceed 366 days, and an invalid or reversed range
returns a 400 error instead of a guessed answer.
The response breaks spend down by message category — marketing, utility, authentication, and service — and
includes a forecast: for each category, WACRM adds up the estimated spend over the 30 days before today, divides by
30 (days with no data count as zero), and multiplies by 30 for a next-30-days estimate, marked estimate: true; a
category with no data in that window returns null, not 0. The report covers WhatsApp messages only: SMS, Messenger,
and Instagram sends and failed messages aren’t counted, and messages sent before cost tracking began aren’t
included. Every figure here is built from WACRM’s own placeholder estimate rates, which can differ significantly
from what Meta actually bills — never read them as a confirmed Meta invoice or a price. For Meta’s actual
published per-message, per-country rates, see the message pricing guide.
What works today / what needs WACRM
| You want to… | Where | Works today? |
|---|---|---|
| Stop future WhatsApp template and broadcast sends to a contact | Contact sends an opt-out keyword (STOP, BAJA, PARAR, HUY…) on WhatsApp | Yes — automatic, nothing to set up |
| Stop SMS sends to a contact | Contact sends an opt-out keyword to your SMS number | Yes — automatic; replies from the Inbox are refused too |
| Stop automated Messenger or Instagram sends to a contact | Contact sends an opt-out keyword on that channel | Yes — AI auto-reply and automations are refused; replies you type in the Inbox still go through |
| Record or check a contact’s WhatsApp marketing opt-in | Conversations → Inbox → WhatsApp marketing consent card | Yes |
| Block a broadcast send to a contact with no opt-in on file | Messaging → Broadcasts (automatic) | Yes |
| Let a contact restart marketing messages by texting START | — | Not yet — re-collect consent yourself; WACRM doesn’t read START automatically |
| Pull a message cost report and 30-day forecast | Developer / API & MCP → mint a key with cost_reports:read, then call the API | Yes — via the API; owner access needed, no Workspace report screen yet |
| Get an in-app alert when monthly spend crosses a cap | — | Needs WACRM — there’s no cap you can set; WACRM’s single service-wide cap is off today. When it’s on, the first time the month’s estimated spend reaches it posts one notification in Workspace for that month. |
Ready to put this in place for your own number? Request early access to get a Workspace, or have WACRM’s team configure consent capture and cost monitoring for you with Quick Setup.
Talk to an expert
Huy Nguyen (David), Founder & CEO
Ask David a question about opt-outs, consent, and cost reports in wacrm.
Frequently asked questions
Does WACRM send an automatic reply when a contact texts STOP?
No. The opt-out hook only records the opt-out — it sends nothing back — and WACRM's AI auto-reply skips the opt-out message itself. On WhatsApp the opt-out then blocks later template and broadcast sends with a 409 consent_required response, but not free-text replies inside an open 24-hour window, so an AI or human free-text reply can still go out later. SMS, Messenger, and Instagram work differently — see the next question.
Does STOP on one channel opt a contact out of every channel?
No. WACRM records the opt-out for the channel the message arrived on: STOP on WhatsApp opts the contact out of WhatsApp only, and STOP on SMS opts them out of SMS only. On SMS, every send to an opted-out contact is refused, including a reply typed in the Inbox, before anything is charged to your wallet; a booking reminder that would fall back to SMS is recorded as skipped with reason sms_opted_out. On Messenger and Instagram, automated sends (AI auto-reply, automations) to an opted-out contact are refused, but a reply a person types in the Inbox still goes through. A contact with no recorded opt-out on a channel is unaffected.
Can a contact start receiving broadcasts again by texting START?
Not automatically. WACRM recognizes START, ALTA, and VOLTAR as configured keywords, but nothing reads an inbound message for them yet — texting START does not restore a contact's consent on its own. You have to re-collect their WhatsApp marketing opt-in yourself, either on the Inbox consent card or through the API.
What happens if I run a broadcast to a contact with no recorded opt-in?
The campaign still runs, but nothing is sent to that recipient and the campaign's Skipped count goes up, captioned No opt-in consent — the Campaigns list, which only shows campaigns created in this browser session, tracks that as a per-campaign count, not a per-recipient row. Record their opt-in on the Inbox consent card first if you want them included.
Are the numbers in the cost report what Meta actually billed me?
No. Every amount in the cost report response is a cost_estimate field, and forecast entries carry estimate: true — all built from WACRM's own placeholder estimate rates, which can differ significantly from what Meta actually bills, not Meta's official invoice. For Meta's own published per-message, per-country rates, see the message pricing guide.
Want this set up for you?
Quick Setup connects your number with coexistence in 48 hours, done by a person.