Flow steps reference
Every one of the 41 step types a Flow can use, what it does and what each of its settings means.
On this page
The palette in the Flow editor holds 41 step types in five groups. This page lists all of them with their settings and default values. Click a step to open it.
Part of Pro, Team and Custom.
Two things apply almost everywhere:
${variables}can go in any text field, and in number fields too. See Variables.- The element field (on Click, Hover, Human type, Wait for element, Read text, Read attribute, Select option and Upload file) is either By features — visible Text, Id, Tag, Aria label, Name, Placeholder, Href path, Role, Type, CSS path — or a CSS selector. Features are tried first, and the run log says which route found the element.
🔀 Flow — order, timing, branching and variables#
Start · flow.start
Where every run begins. A Flow has exactly one, it cannot be deleted, and nothing can be wired into it.
The Flow's Asked for at Run inputs are edited here as well as in the Flow's own settings.
End · flow.end
Stops the run and closes the browser, unless keep open is ticked in the toolbar. It has no outgoing wire.
A Flow that simply runs out of wires also finishes, but with a warning — add an End to be explicit.
Wait · flow.wait
A pause. A random range beats a fixed one: a fixed cadence is periodic, and periodic is machine.
| Setting | Default |
|---|---|
| How long — Fixed or Random range | Fixed |
| Milliseconds (fixed) | 1000 |
| At least (ms) / At most (ms) (random) | 800 / 3000 |
A random wait is skewed towards the shorter end of the range.
Loop N · loop.start
Opens a loop. Pair it with a Loop end step carrying the same name — the pair is the loop.
| Setting | Default |
|---|---|
| Loop name | loop1 |
| Repeat — A number of times or Once per item in a list | A number of times |
| Times | 3 (a number, or ${var}) |
| List variable | rows |
| Put each item in | item |
| Put the index in | i |
A name with no matching Loop end fails the run: loop "{id}" has no matching Loop end node.
Loop end · loop.end
Closes the loop of the same name. Its next wire is where the run goes once the loop is finished.
| Setting | Default |
|---|---|
| Loop name | loop1 |
Run flow · flow.call
Runs another Flow from your library here, on this same browser, then carries on. That Flow's End returns to this one. Edit the shared Flow once and every Flow that runs it gets the change.
| Setting | Notes |
|---|---|
| Flow | Picked from your library. A Flow cannot run itself, or a Flow that runs it. |
| Variables | Share this run's variables (it reads and writes them) — the default — or Its own variables (nothing comes back). |
| Its inputs | One per line, name = value. What that Flow asks for at Run. ${variables} work here. |
Flows can be nested eight deep. Deeper than that is a Flow to flatten, not to run.
If / Else · flow.if
A JavaScript condition, evaluated in the page. Flow variables are available as vars.name, and so is the DOM. Two wires: then and else (the else wire is drawn in a different colour).
| Setting | Default |
|---|---|
| Condition | vars.title.includes('Example') |
For example vars.count < 5 or document.querySelector(".cart") !== null.
Chance · flow.chance
Rolls the dice: the yes wire that often, the no wire the rest of the time — so a Flow likes some posts and not others, the way a person does. The templates use it for "randomly like".
| Setting | Default |
|---|---|
| Chance of "yes" (%) | 30 (0 never, 100 always; ${variables} work here) |
Set variable · flow.setvar
Writes a run variable.
| Setting | Notes |
|---|---|
| Variable | The name, without the ${}. |
| Value is | Text (interpolates other ${variables}) or An expression (runs in the page). |
| Value / Expression | Whichever the mode above needs. |
Code · flow.code
JavaScript, run in the page — the same context devtools gives you. It cannot reach Node, the filesystem or your profiles, on purpose: Flows are shareable.
| Setting | Default |
|---|---|
| Code (page context) | return document.title; |
| Store the result in | optional |
Async is fine. Flow variables are in vars. return a value to store it.
Log · flow.log
Writes a line into the run log. ${variables} are interpolated.
| Setting |
|---|
| Message |
Comment · flow.comment
A note for whoever opens this Flow next. Does nothing at run time.
| Setting |
|---|
| Note |
🌍 Browser — pages, tabs, navigation and waiting#
Open URL · browser.open
Navigates the current tab and waits for the page to become readable.
| Setting | Default |
|---|---|
| URL | https://example.com |
Only http:, https:, about: and file: addresses are accepted; anything else fails with "{url}" is not a URL this can open.
New tab · browser.newtab
Opens another tab and makes it the one the Flow is driving.
| Setting | Default |
|---|---|
| URL | about:blank |
Switch tab · browser.switchtab
Points the Flow at a different open tab.
| Setting | Default |
|---|---|
| Find it by — Position, URL contains or Title contains | Position |
| Position (0 = first) | 0 |
| Contains | — |
Close tab · browser.closetab
Closes the tab the Flow is on and falls back to whichever is left. No settings.
On the last tab it refuses: this is the last tab — closing it would end the session, use End instead.
Back · browser.back
One step back in this tab's history. No settings.
Forward · browser.forward
One step forward in this tab's history. No settings.
Reload · browser.reload
Reloads the current page. No settings.
Wait for load · browser.waitload
Polls the page's readyState rather than waiting on the load event — a page with one hung third-party beacon never fires load, and a Flow must not hang on it.
| Setting | Default |
|---|---|
| Wait until — Interactive (DOM ready) or Complete (everything) | Complete |
| Give up after (ms) | 25000 |
Wait for element · browser.waitelement
Polls until the element resolves. Because it resolves by features, it waits out a layout change rather than timing out on one.
| Setting | Default |
|---|---|
| Element | — |
| Give up after (ms) | 15000 |
| Carry on if it never appears | off |
This is the right way to handle a slow page — better than a longer Wait.
Screenshot · browser.screenshot
Captures the viewport into this run's folder.
| Setting | Default |
|---|---|
| File name | shot |
| Whole page, not just the viewport | off |
| Store the file path in | optional |
Browse like a person · browser.warmup
The cookie warm-up robot, as a step: wanders real sites for a while — read, scroll, click deeper, move on — so the profile's jar and history look lived-in before the Flow does anything that matters.
| Setting | Default |
|---|---|
| For about (minutes) | 5 (up to 240) |
| Sites to wander | empty = the warm-up robot's own list of ordinary, cookie-heavy sites |
| Pages per site, at most | 4 (1–20) |
It stops early after two bot checks. See Warm up new profiles.
🖱️ Interaction — real trusted input#
Click · act.click
A real trusted click: the pointer travels there first, settles, then presses. Not element.click().
| Setting | Default |
|---|---|
| Element | — |
| Click count | 1 |
| Carry on if it is not there | off |
If the click opens a popup window — "Continue with Google", for instance — the Flow follows it automatically and logs a new window opened — following it.
Hover · act.hover
Moves the pointer onto the element and leaves it there, for menus that open on hover.
| Setting | Default |
|---|---|
| Element | — |
| Stay for (ms) | 600 |
Human type · act.type
Types at this profile's own persistent cadence, with its own typo rate. Pasting is scored on signup and checkout forms; this is not a paste.
| Setting | Default |
|---|---|
| Field | — |
| Text | ${variables} are interpolated |
| Clear the field first | on |
| Enter is safe here (textarea) | off — leave it off in a single-line input, where Enter would submit the form early |
This is the only step that will type a saved password or a 2FA code, and only on that account's own site. See Saved logins and 2FA codes.
Press key · act.key
One trusted key press at whatever has focus.
| Setting | Options |
|---|---|
| Key | Enter (default), Tab, Escape, Backspace, Delete, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, PageDown, PageUp, Home, End |
Human scroll · act.scroll
Real wheel events with reading pauses and the occasional look back up — the warm-up robot's scroll, not scrollTo().
| Setting | Default |
|---|---|
| Scroll and read for (ms) | 4000 |
Select option · act.select
Chooses an option in a <select>, then fires the change event the page is listening for.
| Setting | Default |
|---|---|
| The select | — |
| Match on — Value, Visible label or Position | Value |
| Option | — |
Upload file · act.upload
Hands a file to a file input without opening the operating system's picker.
| Setting | Default |
|---|---|
| File input | — |
| File on this computer | a path |
📊 Data — read from the page, the network, the clock#
HTTP request · data.http
A request made by the app, not the page — so no CORS, and none of the profile's cookies. The reply is stored, never executed.
| Setting | Default |
|---|---|
| Method — GET / POST / PUT / PATCH / DELETE | GET |
| URL | — |
| Headers | One per line, Name: value |
| Body | — |
| Store { status, ok, body, json } in | optional |
| Give up after (ms) | 20000 |
This request does not go through the profile's proxy
It is sent by LoginDeck itself, from your own connection. Use it for your own API, not for anything that should look like it came from that identity.
Read text · data.readtext
The element's visible text, resolved by features so it survives the page being rebuilt around it.
| Setting | Default |
|---|---|
| Element | — |
| Store it in | — |
| Empty rather than fail if it is missing | off |
Read attribute · data.readattr
One attribute — href, value, data-id — off the resolved element.
| Setting | Default |
|---|---|
| Element | — |
| Attribute | href |
| Store it in | — |
| Empty rather than fail if it is missing | off |
Clipboard · data.clipboard
The page's clipboard, not the app's. Permission is granted to the current site for the length of the call.
| Setting | Default |
|---|---|
| Do — Put text on the clipboard or Read the clipboard | Put text on the clipboard |
| Text | — |
| Store it in | reading only |
Get time · data.time
Now, in the shape you want to use it in.
| Setting | Options |
|---|---|
| As | ISO 8601 (default), Unix seconds, YYYY-MM-DD, HH:MM:SS |
| Store it in | — |
Random · data.random
A number in a range, or one of a list of choices.
| Setting | Default |
|---|---|
| Pick — A number or One of these | A number |
| From / To | 1 / 10 |
| Choices | one per line |
| Store it in | — |
List source · data.list
Turns lines or a CSV into a list variable, which a Loop N step can then drive.
| Setting | Default |
|---|---|
| From — Typed here or A file on this computer | Typed here |
| Lines | — |
| File | — |
| Split each line on | empty = one value per line; , for CSV columns |
| First row is a header | off |
| Store the list in | — |
Save to file · data.savefile
Appends what a run found to a file on this computer — a list as CSV rows, an object as a JSON line, text as lines. The path is a plain visible setting, so a Flow somebody sent you cannot hide where it writes.
| Setting | Default |
|---|---|
| Save — A variable or Text | A variable |
| Variable | a list becomes rows; an object one row |
| Text | ${variables} are interpolated, one line per row |
| As — CSV / JSON lines / Plain lines | CSV |
| File | empty = this run's folder; ${variables} work here |
| Add to the file if it exists | on |
| Store the file path in | optional |
AI text · data.aitext
Asks your AI model for a short piece of text — a comment, a reply, a caption — from a prompt. On LoginDeck AI it costs one AI action per call; your own key or CLI is not metered.
| Setting | Default |
|---|---|
| Ask for | A short, friendly comment on this post. Plain text, no hashtags, no quotes. |
| At most (characters) | 200 (10–4000) |
| Without a model, pick one of these | one per line; leave empty to fail the step instead when no model is set up |
| Store it in | — |
See LoginDeck AI actions.
🪪 Profile — what this identity is and where it exits#
Get profile info · profile.info
The name, OS, tags, folder, timezone, engine and proxy (without its password) of the identity this run is driving.
| Setting |
|---|
| Store it in |
The stored object holds id, name, os, tags, folder, timezone, proxy, engine, patched and headless.
Get exit IP + geo · profile.exitip
Where this session actually comes out. It uses the answer the launch already resolved, and asks again only if there is none.
| Setting | Default |
|---|---|
| Store it in | — |
| Ask again rather than reuse the launch answer | off |
The stored object holds ip, country, countryCode, region, city, isp and timezone. This is what the Proxy check: exit IP & location template is built from — see Start from a template.