Flow nodes: how each block works

A reference for every trigger, condition and action you can use in your flows.

Trigger

Live chat trigger

Starts the flow when a Live Chat message arrives.

How it works

  • Fires when a visitor sends a message in the widget.
  • Optional: scope it to a single Live Chat channel.
  • Entry point: one output.

💡 Great for an automatic welcome reply.

Listens for inbound chat-widget messages. Pair it with a 'Send message' node to reply instantly, or with Melia AI for a knowledge-base-grounded auto-reply.

Chat icon click

Starts when the visitor clicks the chat icon.

How it works

  • Fires when the visitor opens the widget.
  • Great for a welcome menu or FAQ.
  • Channel: Live Chat.

💡 Show quick replies to guide them right away.

Fires when the visitor clicks the widget launcher. The ideal moment to present a choice menu (quick replies / buttons) and route the conversation.

First visit

Starts on the visitor's very first visit.

How it works

  • Emitted by the widget for a new visitor.
  • Great for a proactive welcome message.
  • Channel: Live Chat.

💡 Keep the message short and welcoming. It's the first touch.

Fires when the widget detects a first visit. Useful to proactively engage a new visitor. Requires an active widget session to deliver the message (anonymous pre-session delivery is an upcoming complement).

Returning visitor

Starts when a returning visitor comes back.

How it works

  • Emitted by the widget for a known visitor.
  • Enables a personalized 'welcome back' message.
  • Channel: Live Chat.

💡 Offer to resume the conversation or a loyalty perk.

Fires for a returning visitor (already visited / had a conversation). Great to personalize the welcome or recover a cart.

Page visit

Starts when the visitor opens a given page.

How it works

  • Fires based on the visited page URL.
  • Enter a URL substring (e.g. /pricing); empty = any page.
  • Channel: Live Chat.

💡 Target /pricing to offer help at purchase time.

Matches the current URL against the pattern you enter (substring, case-insensitive). Leave empty to react on any page. Perfect for per-page contextual messages.

Scroll depth

Starts when the visitor scrolls past a threshold.

How it works

  • Fires at a reached scroll percentage.
  • Set the threshold (e.g. 50%).
  • Channel: Live Chat.

💡 A 50-75% threshold targets engaged visitors.

The widget reports scroll depth in steps; the flow starts when the visitor passes the configured percentage. A good interest signal to engage at the right moment.

Exit intent

Starts when the visitor is about to leave the page.

How it works

  • Fires when the mouse exits through the top of the window.
  • Great for a last-minute retention offer.
  • Channel: Live Chat.

💡 Offer a discount or help right before they leave.

Detects exit intent (the mouse leaves the viewport through the top). Lets you show a retention message at the last moment, before the visitor closes the tab.

WhatsApp Business trigger

Starts the flow when a WhatsApp Business message arrives.

How it works

  • Fires when a WhatsApp Business message is received.
  • Optional: scope it to a single WhatsApp channel.
  • Respects Meta's 24h window for free-form replies.

💡 Beyond 24h, use an approved template via 'Send notification'.

Listens for inbound WhatsApp Business messages (Meta Cloud API). Free-form replies are only allowed within the 24h window after the contact's last message; outside it, only approved templates go through.

Facebook Messenger trigger

Starts the flow when a Messenger message arrives.

How it works

  • Fires when a Facebook Messenger message is received.
  • Optional: scope it to a specific page/channel.
  • Respects Meta's messaging windows.

💡 Pair with a condition to route by message content.

Listens for inbound Facebook Messenger messages. Like WhatsApp, Messenger enforces messaging windows: out-of-window replies are restricted by Meta.

Email trigger

Starts the flow when an inbound email arrives.

How it works

  • Fires when an email is received on a reception address.
  • Optional filters: reception address, sender, subject.
  • Entry point: one output.

💡 Filter by subject to route 'invoice' emails differently from 'support'.

Email has no channel: it scopes by reception address (the channel analog) plus optional sender (domain / exact / contains) and subject filters. All filters empty = reacts to every inbound email.

SMS trigger

Starts the flow when an inbound SMS arrives.

How it works

  • Fires when an SMS is received on one of your SMS channels.
  • Optional: scope it to a single SMS channel.
  • Entry point: no input, one output.

💡 Leave the channel empty to react to all your SMS numbers.

This trigger listens for inbound SMS on the SMS channel. For each SMS received, the runtime looks for a flow whose entry is an SMS trigger and starts an execution. If you set a channel, only SMS received on that channel start the flow.

From another flow

Continues here when another flow hands off.

How it works

  • Entry point of a sub-flow.
  • Activated by a 'Go to another flow' node in a source flow.
  • Inherits the ticket and parameters from the calling flow.

💡 Split large flows into reusable sub-flows.

This trigger never fires on its own: another flow must target it via its 'Go to another flow' node. Parameters collected upstream are passed in, and on return the sub-flow's parameters are merged into the parent.

Conversation resolved

Starts when a conversation is marked resolved, on any channel.

How it works

  • Fires the moment an agent or a flow closes the conversation as resolved.
  • Works on every channel: Live Chat, SMS, Email, WhatsApp, Messenger.
  • Runs once per conversation, so a reopened-then-resolved chat won't loop.

💡 Use it to send a satisfaction survey or a thank-you follow-up.

Starts a flow the moment a conversation is marked resolved, whatever the channel. This is the server-side counterpart to the agent clicking Resolve: you don't need the visitor to send anything.

Typical uses: send a CSAT / satisfaction survey, a thank-you message, a follow-up offer, or notify another system that the ticket is closed.

It runs once per conversation. If a conversation is reopened and resolved again, the flow does not fire a second time, so you never spam the same contact.

Left unassigned

Starts when a conversation sits unassigned longer than a delay.

How it works

  • A background sweep checks open conversations with no agent assigned.
  • Fires when one has waited past the threshold (default 10 minutes).
  • Runs once per conversation so it won't re-fire every few minutes.

💡 Use it to auto-route to a department or ping a manager when nobody picks up.

Starts a flow when a conversation has been left unassigned (no agent has taken it) for longer than a set delay (10 minutes by default, adjustable by an administrator).

This is a server-side, time-based trigger: a background sweep runs every couple of minutes and starts the flow for any open, unassigned conversation that has waited too long. It is not tied to the visitor sending a new message.

Typical uses: auto-route to a department or team, escalate to a manager, send an "we're on it" holding message, or raise an internal alert. It runs once per conversation, so a long wait won't trigger the flow repeatedly.

Condition

Parameter branch

Branches on the value of a saved parameter.

How it works

  • Reads a parameter captured earlier (e.g. via 'Ask a question').
  • Compares with 'contains' or 'equals'.
  • One branch per value + an 'else' branch.

💡 Capture the value first with 'Ask a question' or 'Form'.

Compares a flow parameter to each of your branches. The first match wins; otherwise the 'else' branch is taken. Parameters come from nodes that capture an answer.

Melia AI router

Melia classifies the message into an intent and routes.

How it works

  • Classifies the visitor's message among your intents.
  • Sends no message, routing only.
  • Configurable confidence threshold (default 0.6).

💡 Describe each intent well to guide classification. The ✨ button drafts the description from the title (billed as one AI response).

Melia (AI) analyzes the inbound message and classifies it into one of your intents, then takes the matching branch. Below the threshold, the 'else' branch is taken. No knowledge base is needed: classification uses the AI model configured by the platform.

Business hours

Branches on the day and time.

How it works

  • Set the active days + a time window.
  • Evaluated in the chosen timezone.
  • Two outputs: in / out of window.

💡 Route to an agent during opening hours, to a message otherwise.

Checks whether 'now' falls on a selected day and inside the time window, in the given timezone (IANA, e.g. Europe/Paris; empty = UTC). Use it for business hours.

Agent availability

Branches on whether an agent is online.

How it works

  • Checks the organization's agent presence.
  • Two outputs: online / offline.
  • Based on real-time presence.

💡 Offline: offer a message form instead of an agent.

Looks at whether at least one agent is online for the organization. Lets you adapt the path: connect to an agent if someone is available, otherwise collect a message for follow-up.

Has tag

Branches on whether the contact is in a group.

How it works

  • Checks if the contact is in a group (tag).
  • Two outputs: yes / no.
  • Pick the group to test.

💡 Pair with 'Add tag' to segment your paths.

Tests whether the current contact belongs to the selected group (groups act as tags). Great to treat VIP contacts, newsletter subscribers, etc. differently.

Language

Branches on the visitor's language.

How it works

  • Compares the contact language to your codes (e.g. fr, en).
  • Prefix match (fr ≈ fr-FR).
  • Two outputs: match / else.

💡 Serve a per-language path from a single flow.

Compares the contact's language (from profile / browser) to the comma-separated codes you list. Matching is by prefix, so 'fr' covers 'fr-FR' and 'fr-CA'.

Country

Branches on the visitor's country.

How it works

  • Compares the contact country to your ISO-2 codes (e.g. FR, CM).
  • Two outputs: match / else.
  • Comma-separated list.

💡 Adapt currency, language or offer by country.

Tests the contact's country code (ISO-2) against the provided list. Useful to offer region-specific content, currencies or delivery times.

New vs returning

Branches on new vs returning visitor.

How it works

  • Determines whether the contact has visited before.
  • 'Yes' output = returning, 'no' = new.
  • Based on conversation history.

💡 Welcome a newcomer differently from a regular.

Treats a visitor as returning if they already had a conversation (more than one ticket). Lets you adapt the welcome: an intro for a newcomer, a resume for a regular.

Device

Branches on the visitor's device.

How it works

  • Detects mobile / tablet / desktop.
  • Pick the type to test.
  • Two outputs: match / else. Channel: Live Chat.

💡 Simplify the path on mobile (shorter messages).

Infers the device type from the visitor's latest connection User-Agent. Lets you tailor the experience (e.g. fewer steps, adapted formats) for mobile/tablet/desktop.

Current page

Branches on the last page viewed.

How it works

  • Tests whether the last URL contains a substring.
  • Enter the substring (e.g. /pricing).
  • Two outputs: match / else. Channel: Live Chat.

💡 Detect visitors coming from a specific product page.

Looks at the visitor's last page and checks it contains the entered substring. Great to contextualize based on the browsing journey.

Action

Send message

Sends a sequence of messages to the contact.

How it works

  • Ordered list of messages (text, image, video, file).
  • Configurable delay between each send.
  • Sent on the conversation's channel.

💡 Space messages with a short delay for a natural pace.

Walks your messages and sends them one after another, honoring the delay between sends. {{...}} variables (contact name, etc.) are substituted at send time.

Get user input

Asks a question and stores the answer.

How it works

  • Sends a question then waits for the contact's reply.
  • Validates by type (text, email, phone, etc.).
  • Stores the answer in a parameter + retry count.

💡 Reuse the parameter later via `{{parameter_name}}`.

Pauses the flow until the contact replies, validates against the chosen type (retries if invalid up to the retry count), then saves the value into a parameter reusable downstream.

Form

Collects several fields in one form.

How it works

  • Define the fields (label, key, type, required).
  • The visitor fills and submits the form.
  • Each answer is stored as a parameter.

💡 More efficient than chaining several 'Ask a question'.

Shows a form in the Live Chat widget; on submit, each answer is saved as a parameter (the field key) then the flow continues. Great to collect name + email + need at once.

Decision

Offers choices and routes by the reply.

How it works

  • Sends a choice menu (buttons, quick replies or cards).
  • One branch per choice + an 'else' branch.
  • The contact's choice takes the matching branch.

💡 In Live Chat, cards (image+title) are highly engaging.

Presents your options to the contact. In Live Chat, pick the rendering: buttons, quick replies (chips) or cards (image + subtitle). On SMS/Email, a numbered menu is sent. The reply takes the chosen branch.

Random split

Randomly splits across weighted branches.

How it works

  • Several branches each with a weight.
  • Random draw proportional to the weights.
  • Great for A/B testing.

💡 Compare two messages 50/50 to see which performs best.

On each pass, a branch is drawn at random, proportional to its weight. Lets you test several path variants and measure which converts best.

Delay

Pauses the flow for a duration.

How it works

  • Pick a duration (seconds, minutes, hours, days).
  • The flow resumes automatically after the delay.
  • One output.

💡 Wait a few minutes before a follow-up to avoid being intrusive.

Suspends execution and resumes automatically once the duration elapses, even for long delays (hours/days). Useful for spaced follow-ups or timed sequences.

Add / remove tag

Adds or removes the contact from a group (tag).

How it works

  • Choose add or remove.
  • Select the target group.
  • One output.

💡 Tag 'hot lead' to follow up on those contacts later.

Changes the contact's membership in the chosen group (groups act as tags for segmentation). Pair with the 'Has tag' condition for targeted paths.

Update contact

Updates a contact field.

How it works

  • Choose the field (name, email, phone, town…).
  • Enter the value (supports `{{variables}}`).
  • One output.

💡 Save a collected answer into the contact record.

Writes a value into a contact field. Email/phone fields append to the existing list; others replace the value. Useful to enrich the record as the conversation goes.

Close conversation

Marks the conversation resolved or blocked.

How it works

  • Choose the closing status (resolved / blocked).
  • Notifies the Live Chat widget of the closure.
  • One output.

💡 Place it at the end after a closing message.

Changes the ticket status and, in Live Chat, tells the widget the conversation is closed. Use it at the end of the flow, usually after a final message.

Subscribe to newsletter

Subscribes the contact to the org newsletter.

How it works

  • Adds the contact to the newsletter group.
  • No configuration needed.
  • One output.

💡 Place it after an explicit contact consent.

Adds the contact to the organization's default newsletter group (created automatically if needed). Remember to collect consent before subscribing.

Assign to agent

Assigns the conversation to an agent.

How it works

  • Pick an agent, or leave on 'unassigned queue'.
  • The chosen agent is notified.
  • One output.

💡 Leave 'unassigned queue' so any agent can pick it up.

Assigns the ticket to the selected agent (and notifies them), or sends it to the shared unassigned queue every agent sees. For team routing, use 'Route to department' instead.

Route to department

Routes the conversation to a department/team.

How it works

  • Pick a department (and optional team).
  • Automatic assignment to an agent (round-robin).
  • One output.

💡 Create your departments in Settings → Departments & teams.

Assigns the ticket to the chosen department (and optionally team). Per the group's method, an agent is picked automatically (round-robin, preferring online agents) and notified; in manual mode, the ticket waits in the department queue.

Jump to another flow

Hands off to another flow.

How it works

  • Starts the target flow (which must have 'From another flow').
  • Passes ticket + parameters to the sub-flow.
  • Optional failure branch.

💡 Reuse common sequences (e.g. contact capture).

Launches the target flow and waits for it to finish. On return, the sub-flow's parameters are merged into the current flow. If the sub-flow fails, the failure branch (if set) is taken.

HTTP request

Calls an external API and routes on the response.

How it works

  • GET or POST request to a URL (headers, body, query).
  • Extracts a response value into a parameter.
  • Two outputs: success / failure.

💡 Fetch an order status then personalize the reply.

Performs an HTTP call (with retries) to the service of your choice. The response can be stored into a parameter via a path (JSONPath). 2xx → success, otherwise → failure.

Send notification

Notifies an agent or internal channel.

How it works

  • Sends via SMS / Email / WhatsApp / WhatsApp Business.
  • Templates for Email and WhatsApp Business.
  • Several notifications in sequence.

💡 Alert the team when an urgent case arrives.

Fires one or more outbound notifications to the chosen channels, with a delay between each. Email / WhatsApp Business sends use templates with parameter mapping.

Melia AI reply

Melia answers from a knowledge base.

How it works

  • Replies to the visitor grounded in a base (RAG).
  • Conversational mode (loop) until an outcome.
  • Outputs: answered / no answer / handoff / error.

💡 Wire 'handoff' to an agent for uncovered cases.

Melia generates a reply grounded in your knowledge base and posts it as the AI agent. Depending on the outcome (answer found, abstained, turn cap reached, error), the flow takes the matching branch.