Flow builder
The visual canvas end to end: every node and block type, connecting, validating, publishing, templates, sharing and the keyboard shortcuts.
Sidebar: Automate → Flow builder. The visual canvas. Use it when a conversation needs branches, waits, conditions, media or an AI hand-off — anything the simple automation builder form can't express.
Needs the manage_automations capability — owner, admin and agent.
The flow builder opens outside the app shell. No sidebar, no header, no feedback chip — the canvas takes the whole window. Use your browser's back button, or the builder's own exit, to return.
Start a flow
Opening /flow with nothing loaded offers three ways in:
- Start from a template — pick a recipe, or import a flow file. You review it before saving.
- Create with AI — describe what you want and have the graph drafted.
- Start from scratch (badged Advanced) — a blank canvas with just a trigger, for when you want full control.
Templates can be searched, filtered By trigger, or browsed by category.

The canvas
- Scroll to pan. Ctrl/⌘ + scroll to zoom. Drag empty canvas to pan.
- Double-click empty canvas to add a step right there.
- Drag a port onto another step to connect them — or click the port, then the step. Click empty space to cancel.
- Alt + drag a step to duplicate it (or the whole selection).
- Auto-arrange and Reset zoom & position buttons tidy the layout.
- Download the whole flow as a PNG for sharing a screenshot.
Node types
Added from the Add step panel on the left.
| Node | Does |
|---|---|
| Trigger | Starts the flow (implicit — every flow has exactly one) |
| Message | Text, media, buttons |
| Follow gate | Only continue if they follow you |
| Action | Tags, fields, requests |
| Condition | Send people different ways |
| Randomizer | Randomly split your audience (A/B) |
| Smart delay | Wait, then continue |
| AI Step | Hand this turn to the agent |
| Start flow | Jump to another flow |
AI Step and Randomizer are the two advanced nodes — they need Growth or above.
Message blocks
A Message node holds one or more blocks:
Text, Image, Voice message, Video, Document (PDF), Card, Gallery, List, Dynamic, Data collection.
Voice, video and PDF blocks pick from your Media library — paid plans only. Image blocks take a pasted URL.
Instagram accepts PDF and nothing else as a document attachment, which is why there is a "Document (PDF)" option and no generic "File".
TikTok DMs can't carry voice messages, video or documents — only text, images and link cards. A flow set to TikTok containing a media block is flagged as a problem while you edit, not after a failed send.
Buttons
Each button has a type:
| Type | Config | Status |
|---|---|---|
| Open URL | https://… | Live — note a URL tap leaves the DM, so it ends that path of the conversation |
| Go to step | pick a step | Live |
| Copy code | CODE | Live — tapping it makes the bot send the code as a message to copy |
| Call number | +1… | Coming soon — a tap just advances the flow; can't be newly picked |
| Buy product | a product id | Coming soon — a tap just advances the flow; use the Send product action instead |
Constraints the builder enforces: don't mix buttons and quick replies in one message; labels are capped at 20 characters; Instagram allows up to 3 buttons or 11 quick replies per message; and an image plus buttons in one step sends only the buttons — put the image in its own step above.
A step that waits on a tap can carry a no-response timeout (in hours): a Follow gate starts with 24h (set 0 to disable), a Message step's is opt-in. When it expires the flow follows the Timeout branch if you wired one, otherwise it simply ends there.
Data collection reply types
text, email, phone, number, multiple_choice, first_name, last_name, url, file, image, location, date, datetime.
Once a flow contains a Data collection block, a ⤓ Responses button appears in the header: it lists every collected answer for the saved flow and exports them as CSV. Answers also save onto the contact field the block names.
Action types
| Action | Config |
|---|---|
| Add tag / Remove tag | tag |
| Set field | field = value |
| Increment field (+/-) | lead_score = 10 |
| Clear field | field |
| Set opt-in / Set opt-out | — |
| Send product | product id |
| Subscribe / Unsubscribe from sequence | sequence |
| Assign conversation | teammate |
| Pause automations | 30m / 1h / 3h / 6h / 12h / 1d / forever |
Six more action types show in the picker marked coming soon — External request, Log conversion, Mark conversation open / closed, Notify assignees, and Send Meta CAPI event. They can't be newly configured, and at runtime they are skipped with a note while the rest of the flow runs.
Pause automations is terminal. The conversation is being handed to a human or put to sleep, so nothing runs after it. The builder warns you if you try to attach a step below one, and the button that adds it says so on hover.
Condition operators
equals, not equals, contains, greater than, less than, is set, is empty, before, after.
Channels and triggers
Instagram is the live channel. WhatsApp joins once it's enabled for your workspace; Messenger, TikTok and SMS show in the channel picker but are disabled "coming soon", and a flow can't be saved onto a coming-soon channel.
| Channel | Triggers in the picker |
|---|---|
| Comment-to-DM, DM keyword, Story reply, Story mention, Live comment, New follower†, Ref link / QR, Shopify checkout not completed*, Manual | |
| DM keyword, Opt-in widget, Manual | |
| Messenger | Comment-to-DM, DM keyword, Manual |
| TikTok | DM keyword, Manual |
| SMS | Keyword, Manual |
\* Flag-gated — Ref link / QR, Live comment and Shopify checkout not completed appear only where the deployment can actually route them (all three Instagram-only). A trigger you could pick but the webhook would never deliver is a flow that sits "live" and permanently silent, so these are hidden until armed.
† Coming soon, pickable: New follower (waiting on Instagram follow access) can be selected and pre-built — the builder shows an amber ⏳ notice, and the flow saves and can go live but will not start until access lands.
Shopify checkout not completed
Runs once when someone opens Shopify checkout from a HyperDM product link and stops making progress. It only works for people already talking to you on Instagram, while Instagram's reply window is still open.
What you set
- Wait after checkout activity — 5 to 180 minutes, 30 by default. The timer restarts if Shopify reports more checkout activity. If the reply window will close before your wait is up, HyperDM does not send: we never shorten your wait to squeeze a message in.
- Products — all eligible Shopify products, or a list you choose. A product is eligible when it's synced from your connected store, active, and has a direct checkout link. Products with size or colour choices open their product page instead, so they can't carry the checkout reference through and aren't offered yet.
Readiness shows four rows: Instagram connected, Shopify app connected, checkout webhooks active, at least one eligible product. "Waiting for Shopify" on the third row means Shopify hasn't approved checkout access for the app yet — there's nothing for you to fix.
What it will never do
- Message anyone who already ordered. An order — even a pending or manual-payment one — stops the follow-up.
- Message anyone twice. One per checkout, and at most one checkout nudge per person per 24 hours across all your products and flows.
- Message anyone after the reply window closes. There's no way to send a promotional reminder on Instagram outside that window, so the follow-up is dropped rather than saved for later.
- Message someone who replied in the meantime, opted out, or whose conversation you took over.
- Reach anyone who never messaged you. This isn't a way to contact store visitors.
⚠️ Links can be forwarded. If someone shares your product link, the checkout is matched to the link you sent, not to a verified buyer — so the follow-up may reach the person who received it rather than whoever opened checkout. Your funnel numbers say link/session attribution for the same reason.
Suggested message. Lead with help, not a discount: sizing, stock and shipping are what actually stop a checkout, and opening with money reads as pressure. {{checkout_product_name}} names what they were looking at and {{checkout_url}} takes them back to their own checkout. The Checkout nudge recipe in the Vault is set up this way.
TikTok has no comment trigger and never will. No TikTok API at any access tier turns a comment into a DM, so listing it as "coming soon" would be a promise that can't be kept.
Check it before you publish
Design checks
A panel lists problems with the flow as you build, in two tiers. Red issues disable Set live: an unwired trigger, an unwired button/quick-reply or Follow-gate branch, a randomizer branch going nowhere, missing or still-processing media, an unswapped template placeholder, or a step wired after a Pause automations. Grey notes advise without blocking. Most carry a Fix it → link to the offending step, and a dangling branch offers a one-click "End the flow here" remedy.
On a comment trigger, the first private reply may hold one text or one image block only — buttons and quick replies are fine (the tap opens the 24-hour window), but a second block, an attachment, or a data-collection ask in that first step is a go-live blocker. Put the richer content in the step after the tap.
Simulator
Click the preview toggle to open a phone preview beside the canvas. It plays your flow — nothing is sent. It walks the graph, shows each message as the customer would see it, and lets you tap buttons to follow a branch.
Drop-offs
Toggle Drop-offs to shade steps by how many people are lost there. Each step also shows its own entered / completed counters once the flow has real traffic.
Finish setup
When a flow arrives from a template or the community gallery it comes with placeholders. Finish setup collects every one of them into a checklist — "pick or record a voice message", "choose a product", "choose the flow to jump to" — so you can swap the template's placeholders for your own before going live.
Save and publish
- Save — writes the flow. The header says You have unsaved changes or All changes saved.
- Set live — saves and publishes.
- Set draft — returns a live flow to draft.
Free is capped at 5 flows. Every paid plan is unlimited. The canvas itself is free — the cap is on how many flows you keep.
Share a flow
- Save the flow first — Share works on the saved version.
- Click the share button in the header.
- Fill in Title, Description, and Shared by.
- Optionally tick Also submit to the community gallery and pick a Category. It goes live there once automatic checks pass.
- Click Create link.
A share is a frozen snapshot: later edits don't change what installers get. Voice notes, videos, documents, products and jump-to-flow targets don't travel — the dialog counts what won't come along, and installers see placeholders to fill via Finish setup.
You get a link anyone can install the flow from. It installs on their canvas as a draft — they review it, swap in their own links, and decide whether it ever goes live.
Manage what you've shared at Settings → Shared flows.
Keyboard shortcuts
Press ? on the canvas for the cheat-sheet.
Editing
| Keys | Does |
|---|---|
| Ctrl/⌘ + Z | Undo |
| Ctrl/⌘ + Shift + Z, or Ctrl/⌘ + Y | Redo |
| Ctrl/⌘ + C | Copy the selected steps |
| Ctrl/⌘ + V | Paste them back, wiring and all |
| Delete / Backspace | Delete the selected steps |
Selecting
| Keys | Does |
|---|---|
| Ctrl/⌘ + A | Select every step (the trigger stays put) |
| Shift + click | Add or remove one step from the selection |
| Shift + drag | Rubber-band a rectangle of steps |
| Esc | Clear the selection, or cancel connecting |
Canvas
| Input | Does |
|---|---|
| scroll | Pan around |
| Ctrl/⌘ + scroll | Zoom |
| drag empty canvas | Pan |
| double-click | Add a step there |
| Alt + drag | Duplicate a step or selection |
| drag a port | Connect it to a step |
The Fields tab
Beside Add step there is a Fields tab listing System fields, Custom user fields and Bot fields — the merge tags you can drop into any message. You can create a custom field here without leaving the canvas.
Flows vs automations
Every automation can be converted: use Open as flow on its row in Automations. Your automation keeps running and you get an editable visual copy — but automations win keyword conflicts, so once your converted flow is live, pause the original automation or it will keep answering that keyword and the flow never runs.
Go the other way — from canvas to form — with the Switch to the simple, form-based builder button in the header.
Common questions
Why can't I add an AI Step or a Randomizer? Both are advanced nodes and need Growth or above. See plans-and-billing.md.
Why is a media block flagged? Either your plan doesn't include media (paid plans only), the asset isn't finished processing, or the flow's channel can't carry it (TikTok).
Nothing runs after my Pause automations step. Correct, and deliberate — the step is terminal. Put anything that must happen before it.
Where did my sidebar go? The flow builder lives outside the app shell. Use the back button.
Can I get my flow back after deleting it? Yes — Recently deleted at the bottom of the Automations page, for 30 days.
More in Flows
- Build your first flowOpen the canvas, start from a template or a description, add and connect steps, run the design checks and the simulator, and set the flow live.Read
- Community flowsThe shared-flow gallery: browse what other merchants have published, install a flow into your workspace, and share one of your own.Read
- Media libraryVoice, video and documents for your flows: record, upload, transcripts, renaming, storage limits and how to attach media to a message.Read
Try HyperDM for free
50 free conversations a month, no card. Connect Instagram and follow the guide you just read.