Skip to content

Sending rules

Every rule that decides what a campaign will and will not send — opt-outs, channel opt-outs, frequency caps, quiet hours, templates, plan and credit limits — the workspace settings you can tighten, and every refusal with its fix.

This page is the whole list. Everything here is enforced on the server, applies to campaigns started from the console, from the API and from apps such as Duesly, and none of it can be turned off by a setting or a request field. You can make some rules stricter for your workspace; you can never make them looser.

Workspace sending rules #

Admins set the workspace's own rules under Campaigns → Sending rules.

Workspace rules: every campaign and app follows them.
Field Range What it does
Earliest send 09:00 to 20:00 No campaign message goes out before this hour.
Latest send 10:00 to 21:00 No campaign message goes out after this hour. Must be later than Earliest send.
Messages per minute 1 to 600, default 60 The default pace for messages.
Most messages one person gets a week 1 to 4 Across every campaign. 4 is the ceiling.
Time zone Use the workspace time zone is on by default, so changing the zone under Settings moves campaigns with it. Turn it off to pick a different zone. Sending hours are read in this zone, not the recipient's.

Save rules applies them to every campaign from then on. The locked note at the bottom lists what isn't adjustable: opt-outs, approved templates, calling hours of 10:00 to 19:00, and the payment reminder's limit of two follow-ups.

What you can send #

Channel Message
WhatsApp An approved template. Free-form text only reaches someone whose 24-hour window is open, which is almost never true of a broadcast recipient.
Voice An agent conversation, with a stated reason for the call.

Opt-outs and suppression #

Always on. No toggle, no override, no exception.

Anyone on a channel's opt-out list is removed from the audience before launch and checked again immediately before each send. A template is refused just as firmly as free-form text, and an uploaded list gets the same check as your contacts.

This check sits inside the channel's own send path, below every entry point: the API, an agent, an app, the console. No caller can route around it.

Consent is recorded per channel on each contact: allowed, opted out, or not recorded.

Only an explicit opt-out excludes someone. A contact who opted out of WhatsApp is removed from a WhatsApp broadcast, with the reason channel_consent_missing, and can still be called in a call batch. A contact with nothing recorded is included.

No consent statement, lawful basis or attestation is needed to launch a campaign, and the console doesn't ask for one. The rules on this page, above all opt-outs, are what protect the people you message.

Over the API you may record a basis anyway. If a campaign is created with a consent object, it is pinned at launch with who launched it, when, how many people it covered and a checksum of the exact list, and the campaign page shows it. It isn't copied when you duplicate the campaign. See Campaigns API.

Frequency caps #

Cap Value
From one campaign, to one person, in one day 1 message
From all campaigns, to one person, in one week 4 messages, or fewer if you lower it in Sending rules

The week runs Monday to Sunday, not a rolling seven days.

People over a cap are marked Not sent with Already messaged today or Over the weekly limit. They aren't queued for later: the campaign made its attempt, and quietly holding a message for days is worse than not sending it.

Quiet hours #

Messages go out between 09:00 and 21:00 in your campaign time zone; calls between 10:00 and 19:00. Your workspace rules and each campaign can narrow that window, never widen it, and anything queued outside it waits for the next open hour. See Scheduling.

Approved templates only #

Outside WhatsApp's 24-hour window, an approved template is the only message Meta will deliver. A broadcast without one is refused at launch, once, with a fix, rather than producing thousands of identical failures.

A template that is submitted but not yet approved is refused with template_not_approved. A template with an image or video header also needs that file attached in Amomic-AI, or the launch is refused with template_media_missing. Meta approves the layout, not the file. See Image headers.

Your WhatsApp number's health #

If your WhatsApp number is connected but Meta is refusing to deliver from it, for example because of a payment problem on the WhatsApp Business Account, a new broadcast is refused with sender_blocked and the explanation. Fix the cause in Meta Business Manager or under Channels; once messages are delivering again, launches are allowed.

Calls #

  • Calling hours 10:00 to 19:00, narrower than messaging.
  • A daily limit on outbound calls per workspace. If none are left today, the final check blocks the batch with voice_daily_cap. If only some fit, it warns Only N of these M calls will be placed today. Don't count on the rest carrying over: calls refused by the daily limit can be marked failed instead of waiting. Keep a batch within what's left today, or use Retry N failed the next day.
  • Lines are shared. A gradual call batch leaves some of the workspace's call lines free for your team. When every line it may use is busy, it waits rather than failing. See When a campaign is waiting.

Your plan and credits #

  • Plan. Campaigns need Growth or Enterprise. Growth allows 5,000 recipients per campaign; every plan is capped at 50,000. See Limits & plans.
  • Plan allowance first, then credits. A broadcast uses your plan's included conversations first. If a campaign will run past what's left this month, the rest is paid from prepaid credits, and the launch still goes ahead. The final check doesn't warn you about this; once launched, the campaign page notes it under Worth knowing about this send (allowance_spill). A call batch works the same way with voice minutes.
  • Nothing left. If the allowance is used up and the wallet is empty, the launch is refused with allowance_exhausted before anything is staged. Nobody is contacted, and the campaign stays a draft. Top up, then launch again. See Credits.
  • A channel your plan no longer includes. After a plan change removes a channel, a campaign on it is refused with channel_dormant.

Payments #

Amomic-AI never sees a card number. Payment collection through Duesly sends a hosted payment link: the payment page belongs to the gateway, and no card details reach Amomic-AI.

Every refusal, and what it means #

Shown in the final check, on a campaign's page, or over the API as details.reason with details.docs pointing at the explanation.

Before launch: these stop the campaign

Reason What happened What to do
email_not_available Email campaigns aren't available Use WhatsApp or a call batch
unsupported_channel That channel isn't available on this workspace Pick a live channel
channel_not_connected No sender is connected for this channel Connect one under Channels; the draft is saved
sender_blocked The WhatsApp number is connected but not delivering Fix the cause shown, then launch again
channel_dormant A plan change took this channel away. Checked when you press Send it, not in the final check Change plan, or use another channel
allowance_exhausted Plan allowance used up and no prepaid credits. Checked when you press Send it, not in the final check Top up under Billing, then launch again
workspace_suspended The workspace is suspended for an unpaid plan invoice. Also refuses Resume, and holds a campaign that is already sending An owner pays the invoice under Billing; a held campaign carries on by itself
audience_empty Nobody is left after the exclusions Check the exclusions
audience_too_large Over 50,000 recipients Split the campaign
plan_limit Over your plan's recipients per campaign Narrow the audience or upgrade
template_not_found No template chosen, or it no longer exists Pick or create one
template_not_approved Meta hasn't approved it yet Wait, or pick another
template_media_missing The template's header image or video isn't attached Upload it under Channels → WhatsApp → Templates
voice_daily_cap No outbound calls left today (a warning when only some fit) Schedule the batch for tomorrow
version_conflict The audience or campaign changed since you looked Check again and launch
campaign_frozen The action doesn't fit the campaign's state, such as editing after launch Duplicate it instead
campaign_active Archiving a campaign that is still sending, scheduled or paused Cancel it first

Informational: these don't stop anything

Reason Meaning
quiet_hours Your requested hours were narrowed to the allowed window
suppressed N people opted out and were removed
channel_consent_missing N contacts opted out of this channel and were removed
duplicate_recipient N duplicate rows were collapsed
invalid_destination N rows had a number that couldn't be used (a warning)
allowance_spill Part of the send will be paid from prepaid credits. Recorded at launch and shown on the campaign page, not in the final check.

Per recipient: recorded as Not sent

Reason Shown as Meaning
suppressed Opted out On the channel's opt-out list. Permanent.
channel_consent_missing No consent on this channel The contact opted out of this channel.
daily_contact_cap Already messaged today This campaign already reached them today.
weekly_contact_cap Over the weekly limit Your weekly cap is reached.
missing_variable Missing a personalised value Their row has no value for a placeholder.
invalid_destination Unusable phone number The number couldn't be used.
campaign_cancelled Campaign cancelled Cancelled before they were reached.

Failures from WhatsApp and from calls have their own labels; they're all in Why someone wasn't reached.

The audit trail #

Creating, launching, pausing, resuming, retrying, cancelling, archiving and exporting outcomes each write a record with the person and the time; the platform's own actions, such as stopping or completing, are recorded as automatically. Admins see it under History on the campaign page. Payments recorded in Duesly keep who recorded them and the reference they gave.