Skip to content
WaveSenda
Start free
Docs / Flows

Follow-ups that read the reply

A flow follows one contact over time and decides what to send next from what came back. It is stored as a list of nodes, edited on a canvas in the console, and driven by the same API you use for everything else.

Flow or campaign?

They are different shapes and the distinction decides which one you want. A campaign is one message to many contacts, once — you supply an audience and it works through it. A flow is many messages to one contact, over time — contacts enter one at a time as a trigger fires, and each has their own position in it.

CampaignFlow
StartsYou send it, or a scheduled time arrivesAn event fires for one contact
AudienceResolved once, from a filter or a listNever a list — people arrive individually
ShapeOne message, with wording variantsA graph of nodes that branches
EndsWhen the audience is exhaustedOn a reply, or at a stop node

Endpoints

GET
/v1/campaigns/sequences/
List flows
POST
/v1/campaigns/sequences/
Create one
POST
/v1/campaigns/sequences/validate/
Check a draft before saving it
POST
/v1/campaigns/sequences/{id}/enrol/
Put a contact into it
GET
/v1/campaigns/enrolments/
Who is in a flow, and where
Two names, one object
The API calls them sequences and the console calls them Flows. Same object — the endpoint path is the older name and stays stable.

Triggers

What puts somebody into a flow. Only one per flow, because a contact arriving by two routes at once is an ambiguity nobody wants to debug.

TriggerFires when
keywordAn inbound message matches one of your keywords.
new_contactSomebody messages this number for the first time.
tag_addedA tag is put on a contact, by you or by another flow.
manualYou call the enrol endpoint yourself.

Nodes

Steps are a JSON list. Each entry may carry an id, a type and a next; anything without them is read as a message that falls through to the entry after it — which is exactly what a flat drip already meant, so old sequences keep working untouched.

TypeDoesKey fields
messageSends a message.body
waitPauses before the next node.delay_hours
conditionBranches on a reply, a tag, or what the reply contained.condition
tagAdds a tag to the contact.tag
stopEnds the flow for this contact.—
classifyAsks a model which category the reply falls into, then branches.categories
agentLets an agent write the next message itself, to a goal you set.goal
a flow that branches on intent
{
  "name": "Abandoned enquiry",
  "session": "support",
  "trigger": "keyword",
  "trigger_keywords": ["price", "how much"],
  "steps": [
    { "id": "ask", "type": "message",
      "body": "Hi {{name}} — happy to help. What are you looking at?",
      "next": "think" },

    { "id": "think", "type": "wait", "delay_hours": 4, "next": "sort" },

    { "id": "sort", "type": "classify",
      "categories": {
        "ready":    "They want to buy now or are asking how to pay",
        "browsing": "They are comparing options or asking about features",
        "problem":  "They are unhappy, confused, or reporting a fault"
      },
      "branches": { "ready": "close", "browsing": "nudge" },
      "fallback": "human" },

    { "id": "close", "type": "agent",
      "goal": "Give them the payment link and answer any question about it.",
      "next": "done" },

    { "id": "nudge", "type": "message",
      "body": "No rush — here is the comparison sheet.", "next": "done" },

    { "id": "human", "type": "tag", "tag": "needs-a-person", "next": "done" },

    { "id": "done", "type": "stop" }
  ]
}

What the runner guarantees

Three behaviours are not configurable, because getting any of them wrong is worse than the feature not existing.

RuleWhy
A reply stops the flowOn by default via stop_on_reply. A drip talking over a live conversation is worse than no drip.
AI failure routes, never strandsA model that is down, over budget, refusing, or answering with something unrecognised sends the contact to the fallback branch. No enrolment is ever left stuck.
Cycles are refused at save timeValidation walks the graph, so a loop is an error you see while editing rather than a contact receiving the same message forever.
AI in a flow costs money per contact
A classify or agent node costs a model call per contact. A flow with a thousand people in it makes a thousand calls, and they draw on the same monthly AI budget as your inbound replies.
Flows · WaveSenda Docs