AltScore
Campaigns

Campaigns

Campaigns are bulk sends: you pick a channel connector, choose the message (an approved WhatsApp template, a custom email or an SMS text), load a list of recipients with their variable values, and send to everyone at once. Each recipient's reply is routed into a conversational flow you choose, so the campaign is not just a blast — it is the entry point of a conversation.

The list view shows every campaign with its delivery metrics; the detail view shows the configuration, the recipient table with per-recipient status and error, and the send actions.

Creating a Campaign

Configuration Fields

FieldDescription
NameDisplay name of the campaign
ChannelWhatsApp, Email or SMS — locked after creation
ConnectorThe channel connector that sends the messages (a WhatsApp number, an email inbox or an SMS number) — locked after creation
Template (WhatsApp)An approved template pulled from the connector; its variables and examples load automatically
Subject and Body (Email)Free-text subject and HTML body; {{placeholder}} tokens become variables
SMS message (SMS)Free-text body; {{placeholder}} tokens become variables
Target FlowThe conversational flow that handles recipient replies. For SMS it is only offered when the connector can receive replies (two-way)

Variables

You do not map variables manually. For WhatsApp, they come from the template definition; for email and SMS, they are parsed from {{placeholder}} tokens in the message. The extracted variable names become the column headers your recipient file must provide.

Adding Recipients

File Upload

Upload an .xlsx, .xls, or .csv file. The required columns are:

  • phone (WhatsApp) or email (Email) — the destination
  • One column per template variable, matching the variable name exactly
  • metadata (optional) — a JSON object attached to the recipient

You can download a pre-built CSV template from the campaign with the correct headers and an example row. After upload, the file is validated in real time; validation errors are reported per row (up to 40 shown).

Manual Entry

Add recipients row by row in the UI: destination, one field per variable, and an optional metadata JSON field. Invalid JSON in the metadata field blocks the row from being added.

Recipient Metadata

The metadata object travels with the recipient: when the message goes out, it is attached to the recipient's conversation as campaign metadata. The AI collector node reads it as context for the agent, so you can hand it the amount due, the product or the branch without asking the customer again.

Flow variables are a different thing: nothing inside the flow writes a value that comes from the campaign, so when you publish the target flow the gate may warn about a variable that a node reads and no node assigns:

Reads variable 'name' but no node in this flow assigns it a value. If another flow fills it before jumping here, or it arrives in a campaign's metadata, you can ignore this warning; otherwise the node will run without that data.

That warning never blocks publishing. Read it as a question — who fills this variable? — and ignore it only when you know the answer; otherwise the node runs with the variable unset.

Sending

The Send action delivers the message to every recipient still in pending status. Sending is immediate — there is no scheduler and no separate test send. The Send button is disabled when there are no pending recipients, and while a send is in progress.

From the recipient table you can also:

  • Send to selected — tick one or more recipients and send only to them, whatever their status (except discarded).
  • Resend failed — one button above the table resends to every recipient in failed. Copy phone numbers next to it copies the failed destinations to the clipboard.
  • Discard — per-row action that takes a recipient out of the campaign without deleting the row. Discarded recipients are excluded from sends and from the campaign counters.

When Meta Limits the Sending Number

Meta limits a WhatsApp business number in three ways that matter to a campaign: how many conversations it can start per day, whether it is restricted for spam, and how fast it can send. The campaign reacts to each one differently.

Daily Conversation Limit

Every WhatsApp number has a tier that caps how many conversations it can start per day. A new number from a business that is not verified with Meta starts at 250. Before a WhatsApp send, the confirmation adds a line when the pending recipients exceed that limit, for example: Heads up: this number can start up to 250 conversations per day and you are sending to 688. Meta will hold back the rest, and a large send from a new number can get it restricted.

The warning only informs; you can still send. If the number's tier cannot be read at that moment, the confirmation shows no warning and the send goes ahead as usual. To stay under the limit, split the list into several days, or ask for a higher tier in 360dialog.

Automatic Stop When the Number Is Restricted for Spam

When Meta answers 131048 (Spam rate limit hit), it is restricting the number, not refusing one recipient: too many earlier messages were blocked or reported. That answer arrives in the delivery report after the send, so the campaign used to keep sending, and every further send lowers the number's quality and can get a new number blocked.

Now the first 131048 stops the campaign on its own:

  • The send in progress stops within seconds. Recipients that had not been sent yet stay pending, not failed, so they are still there for a later send once the number recovers.
  • The campaign detail shows a banner, Campaign stopped on {date}, with the reason. Without a reason it reads Meta restricted the number that sends this campaign. The recipients it had not reached yet are still pending.
  • Sending again asks for confirmation. Any send from a stopped campaign, to all pending recipients or to the selected ones, first shows: This campaign stopped because Meta restricted the number for spam (131048): many earlier messages were blocked or reported. Sending more can lower the number quality or get it blocked. Send anyway? Only if you accept does the send go out, and the stop is cleared.

Other codes do not stop the campaign. 131049 (Meta's marketing cap per user) is a normal per-recipient answer and the campaign keeps going.

What to do: check the number's quality in the WhatsApp Manager, wait for it to recover, and resume with a smaller list. Sending right away to the rest of the list is exactly what Meta restricted.

Sending Too Fast

Meta also caps how many messages per second a number or an account can send (130429 and 80007, the number reached its sending limit). This limit is temporary, so the campaign handles it on its own:

  • Each message is retried for a short while before it counts as failed.
  • The whole campaign slows down. A rate-limit refusal makes every remaining recipient wait, longer after each refusal, and the pace recovers little by little as messages go out again.
  • A recipient whose message still could not go out ends in failed with that reason in its error column, for example [130429] WhatsApp no entregó el mensaje: el número alcanzó su límite de envíos.
  • If the refusals keep coming with no message going out, the campaign gives up instead of pushing the rest of the list against the limit. The recipients it did not try are marked failed with the reason Campaña detenida: Meta rechazó por límite de tasa N envíos seguidos sin que ninguno saliera..., which also tells you to send them later.

Meta lifts this limit with time, not with retries. Wait a while and use Resend failed; to avoid it, send smaller or staggered batches, or ask 360dialog to raise the number's tier.

Failed Recipients

A recipient ends up in failed in two moments: when the provider rejects the send, or later, when WhatsApp reports that the message never reached the phone.

Rejected at Send Time

When the connector refuses a message, the recipient's row keeps the reason in its error column: the provider code in brackets followed by a readable title, for example [131047] WhatsApp no entregó el mensaje: la ventana de 24 horas está cerrada. The table shortens the most common ones to a one-line hint (24-hour window, marketing frequency limit, number not on WhatsApp, spam restriction, invalid connector credential). One failed recipient never aborts the batch; the rest of the list is still sent and the campaign ends in partial.

If the recipient was already linked to a conversation by an earlier send, that conversation gets a warning notice reading La campaña '{name}' no pudo enviar el mensaje a este destinatario ("Campaign '{name}' could not send the message to this recipient"), whose reason is the rejection's code and title. The full explanation and the action to take arrive through the delivery-failed notice when Meta reports the message status.

Failed After Sending

WhatsApp accepts a message first and can report hours later that it was not delivered. When that happens the recipient moves from sent, delivered or read to failed, its error column keeps Meta's code and title, and the campaign counters are recalculated. The recipient's conversation gets two notices:

  • A delivery_failed notice with the rejection explained: what happened, what to do, and Meta's original line. Its level comes from the cause — a known, expected rejection is a warning; a broken token or an unregistered number is an error.
  • A warning reading El mensaje de la campaña {id} no llegó a este destinatario; el destinatario quedó como fallido ("The campaign message did not reach this recipient; the recipient was marked as failed").

The rejections you will see most often in a campaign:

CodeWhat it meansWhat to do
131047A free-form message was sent outside the 24-hour window after the customer's last messageOnly an approved template reaches the customer outside the window; check that the follow-up your flow sends is a template
131049Meta capped marketing messages to this user for the periodDo not resend; it will not go through until Meta frees the quota. Use a utility template if the content is transactional
131050The customer opted out of marketing from this businessMark the contact as not reachable for marketing; only utility or authentication templates can reach them
131048The sending number is restricted for spamThe campaign stops on its own (see Automatic Stop When the Number Is Restricted for Spam). Check the number's quality in the WhatsApp Manager before sending again
130429 / 80007The number or the account hit its sending limitThe campaign slows down on its own (see Sending Too Fast). Send smaller or staggered batches; if it recurs, ask 360dialog to raise the tier
131026The number is not on WhatsApp or cannot receive messagesClean the contact from the list

Every code, its level and its action are listed in the notice codes catalog. Read one recipient's notices in the Chat notices panel; to see how many conversations of a flow hit the same rejection, open Conversational > Flow Notices — the Flow Notices screen groups them by flow and node.

Paused or Disabled Templates

Meta pauses a template (132015) when too many customers block or report it, and disables it permanently (132016) after repeated pauses. Both states, together with rejected and flagged, reach the hub through the template webhook and through the template sync of the connector, so the template's status in WhatsApp Templates reflects what Meta decided.

A campaign that still uses that template fails on every recipient with the explanation and the action, for example: WhatsApp no envió la plantilla: Meta la pausó por baja calidad — "Wait for Meta to reactivate it or create a new version with different text. Pause the campaigns that use it." A disabled template will never work again: create and approve a new one and update the nodes and campaigns that used it.

When the template status changes, the system also records which campaigns in draft, sending or partial still use it. That record is an operational log for support, not a notice in the hub: what you see in the hub is the failed recipients and their reason.

To recover a campaign whose template was paused or disabled, the Resend failed block shows a template selector with the approved templates of the same connector. Pick one and resend; the campaign keeps the new template for later sends. The new template must declare the same variables in the same order, since the recipient values are filled by position.

Replies and the Target Flow

Every reply from a recipient enters the campaign's Target Flow from its first node, on the same conversation the message went out on. The campaign remembers its flow on the conversation, so a reply still reaches it even after the conversation timed out for inactivity.

If the target flow was deleted or set inactive between the send and the reply, the conversation does not break:

  • The connector has a default bot. The conversation restarts in that bot and gets a warning notice: El flujo {id} ya no existe o está inactivo; la conversación se redirigió al bot por defecto {default} ("Flow {id} no longer exists or is inactive; the conversation was redirected to the default bot {default}").
  • The connector has no default bot. Nothing is sent back and the conversation gets an error notice saying the customer wrote, the flow no longer exists and the connector has no default bot, so the message was ignored — configure a default bot or reassign the conversation.

Both notices name the flow, so Flow Notices shows at a glance how many recipients replied to a campaign whose flow is gone.

Lifecycle and Statuses

Campaign Statuses

StatusMeaning
draftConfigured but not sent; still editable
sendingSend in progress
sentAll messages were sent
partialSome messages sent, some failed
failedThe send operation failed

The final status is recomputed after every send and after every delivery report: a campaign in sent moves to partial when a delivery failure arrives later.

Recipient Statuses

StatusMeaning
pendingWaiting to be sent
sentHanded off to the provider
deliveredDelivered to the recipient
readRead by the recipient (WhatsApp only)
failedSend or delivery failed, with the error message
respondedThe recipient replied
discardedTaken out of the campaign by hand; excluded from sends and counters

Actions

ActionAvailability
EditDraft campaigns only
SendWhen there are pending recipients
Send to selectedWhen at least one recipient is ticked
Resend failedWhen there are failed recipients
DiscardAny recipient that is not already discarded
Add RecipientsAny time before/between sends
ReuseDuplicates the campaign as a new draft with the same channel, connector, message and target flow, without recipients
DeleteRemoves the campaign

Metrics

The campaign list shows aggregate counters per campaign: total recipients, sent, delivered, read, and responded. The detail view breaks this down per recipient, including the first response text when the recipient replied.

Gotchas

  • Channel and connector are locked after creation, and Reuse keeps them. To send through a different number or inbox, create a new campaign.
  • Variable columns must match by name. The file's headers must match the template's variable names exactly — download the CSV template to get them right.
  • Read receipts are WhatsApp-only. Email campaigns will not show read status.
  • All replies land in one flow. Every recipient response is routed to the campaign's target flow; there is no per-recipient routing.
  • WhatsApp templates must be approved. The template picker only offers templates already approved on the connector's WhatsApp account, and a template Meta pauses or disables afterwards fails the send with that reason.
  • A spam restriction stops the campaign; a speed limit only slows it. After 131048 the unsent recipients stay pending and sending again asks for confirmation. After repeated 130429 refusals the campaign gives up and the untried recipients end in failed, ready for Resend failed later.
  • Marketing limits are not retryable. A recipient rejected with 131049 or 131050 will fail again if you resend; take it out of the list instead.
  • A campaign's failures are also notices. If a flow's numbers look wrong in Flow Notices, check whether a campaign pointing at it is the source.