Skip to content

Actions

Actions change data, send content, or connect the flow to another system. They are available in the palette’s Actions tab.

GroupActionWhat it does
Artificial intelligenceAnalyze with AIclassifies text or a conversation and extracts data
MessagingSend messagesends text through the conversation’s channel
MessagingSend emailsends a campaign to a contact list
ContactsApply tagadds or removes contact tags
ContactsPick contactputs a fixed contact or an identity match into the flow context
ContactsSave to contactwrites a value to a custom field
ConversationsApply conversation tagadds or removes conversation tags
ConversationsGet contact conversationfinds or creates a conversation in an inbox
SupportAssignsends the conversation to a person or the queue
SupportHand off to agentchanges the conversation’s AI agent
SupportResolvecloses the support conversation and chooses who takes over next
External systemsCall webhookmakes an HTTP request to another system

Each run carries a context. Depending on the trigger and previous steps, it may contain a contact, a conversation, or both.

  • Send message, Apply conversation tag, Assign, Hand off to agent, and Resolve require a conversation.
  • Apply tag, Save to contact, and Get contact conversation require a contact.
  • Pick contact adds or replaces the contact in context. When the contact changes, it removes the old conversation from context.
  • Get contact conversation adds a conversation to context.

If an action does not receive its required context, the run fails at that step. Place Pick contact or Get contact conversation before it when the trigger does not supply the necessary data.

Sends text through the current conversation’s channel. There is no channel selector. The content supports variables.

Before sending, SquadOS checks:

  • the contact’s opt-out status;
  • whether the conversation is snoozed;
  • whether the customer is waiting for a human reply;
  • the 24-hour automated-message limit per contact — three by default;
  • the Meta channel’s 24-hour window.

An immediately preceding Wait step may allow the send when the customer spoke last. If a safeguard blocks the message, the step is skipped rather than failed.

For WhatsApp Official, select an approved template as the fallback when the window is closed. Without a valid fallback, the message is not sent. Instagram Direct does not use this fallback template.

Sending is at-most-once: the action does not automatically retry a request that may already have been delivered.

Sends to every eligible recipient in the configured list every time the step runs. It does not send only to the current contact in the flow.

Configure:

  • List;
  • Tags to filter the list, if needed — a contact must have at least one selected tag;
  • Subject, with or without variables;
  • Format: plain text or HTML;
  • Body, written in the step or taken from previously prepared content.

Sending also requires the email module, a default sender, credits, and at least one subscribed recipient with an email identity and no email suppression.

For one campaign, use Schedule → Send email. Do not connect Audience → Send email: Audience starts one child run per contact, while Send email traverses the entire list in each run.

Automation message opt-out and per-contact limits do not replace the email suppression list. Keep email suppressions accurate before sending.

Apply tag changes the contact’s tags. Apply conversation tag changes only the current support conversation’s tags. In either step, select tags to add and tags to remove.

Adding or removing a contact tag can also fire another automation’s Contact tag trigger. Plan an exit condition so the flows do not form a loop.

Use this action when the trigger does not identify a person or when the flow must continue with another contact. You can:

  • select a fixed contact;
  • search for an exact WhatsApp, Telegram, Instagram, API, web, or email identity.

The action does not create contacts. It fails if no exact match is found. When it selects a different contact, the previous conversation leaves context; add Get contact conversation next if later actions require a conversation.

For Instagram, the technical identity value may be the Meta-provided sender ID rather than the visible username. Confirm the value in the contact record.

Select an inbox. The step finds the contact’s latest conversation in that inbox. If the latest conversation is archived, or none exists, it creates a new one.

You may provide a title. Without one, the system uses a default value. A new conversation starts with the inbox’s active agent; if no agent is available, it starts in human support.

After this step, later actions receive the conversation and its variables in context.

Writes text to a custom field in the contact’s metadata. For example: field city, value {{analysis.city}}.

It does not change native fields such as name, email, or channel identity. The field name is fixed; the value supports variables. This action commonly follows Analyze with AI.

  • Assign selects a responsible team member. Selecting Nobody returns the conversation to the queue.
  • Hand off to agent activates AI, changes the associated agent, removes the human assignment, and reopens a resolved conversation. The action does not generate an immediate reply. The Instruction for the agent field is not shown to the customer.
  • Resolve resolves the conversation. In Return to AI, the system keeps that mode only when an eligible agent exists; otherwise, it preserves human support. See Conversation states.

Makes a request to an external system. Configure:

  • URL, using http or https and supporting variables;
  • Method: GET, POST, PUT, PATCH, or DELETE — POST is the default;
  • Headers as key/value pairs;
  • Request body, with variable support.

For safety, SquadOS resolves the address before calling it and blocks local, private, reserved, and own-project destinations. Redirects are not followed. The call times out after 15 seconds, treats only 2xx responses as successful, and records at most 4,000 response characters. There is no automatic retry.

Never put secrets directly in documentation text or shared examples. Prefer a narrowly scoped credential that can be revoked.

In test mode, most write or delivery actions are simulated so they do not change data or contact customers. The result describes what would happen, but it does not prove external delivery.

Important limits:

  • Send message does not send and does not traverse every production safeguard.
  • Send email does not materialize recipients or validate body, sender, credits, or suppressions.
  • Pick contact performs the lookup, but the matched contact does not continue to later test steps.
  • Get contact conversation propagates an existing conversation; a conversation that would be created does not continue to the next test step.
  • Call webhook does not perform DNS destination validation or make the request.

After validating the logic, monitor a controlled real run in Runs and tests.

End is in the Rules tab. It only ends that branch of the flow. See Rules: condition, wait, and end.

  • Does the trigger provide the contact and conversation required by the actions?
  • Does an action replace the contact and invalidate the previous conversation?
  • Are the email list, sender, and suppressions correct?
  • Does the WhatsApp template cover sends outside the 24-hour window?
  • Could contact tags start another flow and form a loop?
  • Does the webhook target an allowed public destination and handle duplicate calls outside SquadOS?
  • Did you validate a controlled real run in addition to the simulation?