Execution Flow
How DashX actually runs your flow — the pipeline model, per-row processing, and the data context that connects commands.
The Pipeline Model
DashX executes flows as a pipeline. Each command takes input, processes it, and produces output.
The output of one command becomes the input of the next command. This input is called CurrentText.
Command 1 Command 2 Command 3
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ TYPE COLUMN DATA │───►│ REMOVE SPECIAL │───►│ TYPE TEXT WITH │
│ (reads: "A-123") │ │ CHARACTERS │ │ PARAMETER │
│ │ │ (output: "A123") │ │ (types: "A123") │
└──────────────────┘ └──────────────────┘ └──────────────────┘
Input: "" Input: "A-123" Input: "A123"
Output: "A-123" Output: "A123" Output: "A123"
Every time a command reads a column's data (TYPE COLUMN DATA), it sets CurrentText
to that column's value. Every subsequent command operates on this CurrentText until the next
column read replaces it.
Complete Execution Order
┌─────────────────────────────────────────────────────────────┐
│ FOR EACH TABLE SET (i) │
│ (if you have multiple tables from extraction) │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ FOR EACH ROW in Pre Table[i]: │ │
│ │ 1. Create fresh context (CurrentText = "", Vars = {})│ │
│ │ 2. For each Pre command (in order): │ │
│ │ → Read column data if referenced │ │
│ │ → Execute command action │ │
│ │ → Result becomes new CurrentText │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ FOR EACH ROW in Middle Table[i]: │ │
│ │ 1. Create fresh context (CurrentText = "", Vars = {})│ │
│ │ 2. For each Middle command (in order): │ │
│ │ → Read column data if referenced │ │
│ │ → Execute command action │ │
│ │ → Result becomes new CurrentText │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ FOR EACH ROW in Post Table[i]: │ │
│ │ 1. Create fresh context (CurrentText = "", Vars = {})│ │
│ │ 2. For each Post command (in order): │ │
│ │ → Read column data if referenced │ │
│ │ → Execute command action │ │
│ │ → Result becomes new CurrentText │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Per-Row Lifecycle
For each row in a section, here's what happens in detail:
-
Fresh context created —
CurrentText = "" and Vars = {} (empty).
Each row starts clean — no data carries over from the previous row.
-
Column data loaded — When a command references a column (e.g.,
TYPE COLUMN DATA),
the system finds that column's value for the current row and loads it into CurrentText.
-
Command executes — The command operates on
CurrentText.
For example, REMOVE SPECIAL CHARACTERS strips non-alphanumeric characters from it.
-
Result becomes CurrentText — The output replaces
CurrentText,
ready for the next command to use.
-
Repeat for next command — Steps 2-4 repeat for each command in the section.
Column Matching
When a command references a column, the system needs to find which DataTable column to read from.
There are two matching modes:
| Mode | How It Works | When to Use |
| Column Name (default) |
Matches the flow column name to the DataTable column header (case-insensitive) |
Most cases — when column names are consistent |
| Column Sequence |
Matches by position — the Nth command with a column reads from the Nth DataTable column |
When column names differ between extraction and flow |
Full Execution Walkthrough
Let's trace through a complete execution with sample data:
Flow Definition
Pre Commands:
1. LEFT CLICK AT {"X":100,"Y":200}
2. DELAY WITH PARAMETER: 1000
3. TYPE TEXT WITH PARAMETER: "admin"
Middle Commands:
1. TYPE COLUMN DATA (Invoice No)
2. TAB
3. TYPE COLUMN DATA (Amount)
4. ENTER
Post Commands:
1. CUSTOM KEYS: ^{w}
Extracted Data
Middle Table:
┌──────────────┬─────────┐
│ Invoice No │ Amount │
├──────────────┼─────────┤
│ INV-001 │ 12,500 │
│ INV-002 │ 8,750 │
└──────────────┴─────────┘
Execution Trace
═══ PRE (runs once) ════════════════════════════════════════════
Context: CurrentText = ""
Command 1: LEFT CLICK AT {"X":100,"Y":200}
→ Mouse moves to (100,200) and clicks
→ CurrentText = "" (unchanged — click doesn't modify text)
Command 2: DELAY WITH PARAMETER: 1000
→ Pauses 1000ms
→ CurrentText = "" (unchanged)
Command 3: TYPE TEXT WITH PARAMETER: "admin"
→ Types "admin" into the focused input
→ CurrentText = "admin"
═══ MIDDLE — Row 1 (INV-001, 12,500) ══════════════════════════
Context: CurrentText = "", Vars = {}
Command 1: TYPE COLUMN DATA (Invoice No)
→ Reads "INV-001" from row 1
→ Types "INV-001" into focused input
→ CurrentText = "INV-001"
Command 2: TAB
→ Presses Tab key
→ CurrentText = "INV-001" (unchanged)
Command 3: TYPE COLUMN DATA (Amount)
→ Reads "12,500" from row 1
→ Types "12,500" into focused input
→ CurrentText = "12,500"
Command 4: ENTER
→ Presses Enter key
→ CurrentText = "12,500" (unchanged)
═══ MIDDLE — Row 2 (INV-002, 8,750) ═══════════════════════════
Context: CurrentText = "", Vars = {} ← FRESH context!
Command 1: TYPE COLUMN DATA (Invoice No)
→ Reads "INV-002" from row 2
→ Types "INV-002"
→ CurrentText = "INV-002"
Command 2: TAB → Tab pressed
Command 3: TYPE COLUMN DATA (Amount)
→ Reads "8,750" from row 2
→ Types "8,750"
→ CurrentText = "8,750"
Command 4: ENTER → Enter pressed
═══ POST (runs once) ═══════════════════════════════════════════
Context: CurrentText = "", Vars = {}
Command 1: CUSTOM KEYS: ^{w}
→ Presses Ctrl+W
→ CurrentText = "" (unchanged)