Actions
Actions change data, send content, or connect the flow to another system. They are available in the palette’s Actions tab.
| Group | Action | What it does |
|---|---|---|
| Artificial intelligence | Analyze with AI | classifies text or a conversation and extracts data |
| Messaging | Send message | sends text through the conversation’s channel |
| Messaging | Send email | sends a campaign to a contact list |
| Contacts | Apply tag | adds or removes contact tags |
| Contacts | Pick contact | puts a fixed contact or an identity match into the flow context |
| Contacts | Save to contact | writes a value to a custom field |
| Conversations | Apply conversation tag | adds or removes conversation tags |
| Conversations | Get contact conversation | finds or creates a conversation in an inbox |
| Support | Assign | sends the conversation to a person or the queue |
| Support | Hand off to agent | changes the conversation’s AI agent |
| Support | Resolve | closes the support conversation and chooses who takes over next |
| External systems | Call webhook | makes an HTTP request to another system |
Understand context before an action
Section titled “Understand context before an action”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.
Send message
Section titled “Send message”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.
Template outside the 24-hour window
Section titled “Template outside the 24-hour window”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.
Send email
Section titled “Send email”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 tags
Section titled “Apply tags”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.
Pick contact
Section titled “Pick contact”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.
Get contact conversation
Section titled “Get contact conversation”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.
Save to contact
Section titled “Save to contact”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, Hand off to agent, and Resolve
Section titled “Assign, Hand off to agent, and Resolve”- 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.
Call webhook
Section titled “Call webhook”Makes a request to an external system. Configure:
- URL, using
httporhttpsand 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.
What testing proves
Section titled “What testing proves”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 not an action
Section titled “End is not an action”End is in the Rules tab. It only ends that branch of the flow. See Rules: condition, wait, and end.
Checklist before publishing
Section titled “Checklist before publishing”- 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?