Deck Help Center

Flow steps reference

Every one of the 41 step types a Flow can use, what it does and what each of its settings means.

Updated · 11 min read

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.

SettingDefault
How long — Fixed or Random rangeFixed
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.

SettingDefault
Loop nameloop1
Repeat — A number of times or Once per item in a listA number of times
Times3 (a number, or ${var})
List variablerows
Put each item initem
Put the index ini

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.

SettingDefault
Loop nameloop1
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.

SettingNotes
FlowPicked from your library. A Flow cannot run itself, or a Flow that runs it.
VariablesShare this run's variables (it reads and writes them) — the default — or Its own variables (nothing comes back).
Its inputsOne 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).

SettingDefault
Conditionvars.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".

SettingDefault
Chance of "yes" (%)30 (0 never, 100 always; ${variables} work here)
Set variable · flow.setvar

Writes a run variable.

SettingNotes
VariableThe name, without the ${}.
Value isText (interpolates other ${variables}) or An expression (runs in the page).
Value / ExpressionWhichever 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.

SettingDefault
Code (page context)return document.title;
Store the result inoptional

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.

SettingDefault
URLhttps://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.

SettingDefault
URLabout:blank
Switch tab · browser.switchtab

Points the Flow at a different open tab.

SettingDefault
Find it by — Position, URL contains or Title containsPosition
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.

SettingDefault
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.

SettingDefault
Element—
Give up after (ms)15000
Carry on if it never appearsoff

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.

SettingDefault
File nameshot
Whole page, not just the viewportoff
Store the file path inoptional
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.

SettingDefault
For about (minutes)5 (up to 240)
Sites to wanderempty = the warm-up robot's own list of ordinary, cookie-heavy sites
Pages per site, at most4 (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().

SettingDefault
Element—
Click count1
Carry on if it is not thereoff

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.

SettingDefault
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.

SettingDefault
Field—
Text${variables} are interpolated
Clear the field firston
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.

SettingOptions
KeyEnter (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().

SettingDefault
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.

SettingDefault
The select—
Match on — Value, Visible label or PositionValue
Option—
Upload file · act.upload

Hands a file to a file input without opening the operating system's picker.

SettingDefault
File input—
File on this computera 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.

SettingDefault
Method — GET / POST / PUT / PATCH / DELETEGET
URL—
HeadersOne per line, Name: value
Body—
Store { status, ok, body, json } inoptional
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.

SettingDefault
Element—
Store it in—
Empty rather than fail if it is missingoff
Read attribute · data.readattr

One attribute — href, value, data-id — off the resolved element.

SettingDefault
Element—
Attributehref
Store it in—
Empty rather than fail if it is missingoff
Clipboard · data.clipboard

The page's clipboard, not the app's. Permission is granted to the current site for the length of the call.

SettingDefault
Do — Put text on the clipboard or Read the clipboardPut text on the clipboard
Text—
Store it inreading only
Get time · data.time

Now, in the shape you want to use it in.

SettingOptions
AsISO 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.

SettingDefault
Pick — A number or One of theseA number
From / To1 / 10
Choicesone 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.

SettingDefault
From — Typed here or A file on this computerTyped here
Lines—
File—
Split each line onempty = one value per line; , for CSV columns
First row is a headeroff
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.

SettingDefault
Save — A variable or TextA variable
Variablea list becomes rows; an object one row
Text${variables} are interpolated, one line per row
As — CSV / JSON lines / Plain linesCSV
Fileempty = this run's folder; ${variables} work here
Add to the file if it existson
Store the file path inoptional
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.

SettingDefault
Ask forA short, friendly comment on this post. Plain text, no hashtags, no quotes.
At most (characters)200 (10–4000)
Without a model, pick one of theseone 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.

SettingDefault
Store it in—
Ask again rather than reuse the launch answeroff

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.