Back to App

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:

  1. Fresh context createdCurrentText = "" and Vars = {} (empty). Each row starts clean — no data carries over from the previous row.
  2. 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.
  3. Command executes — The command operates on CurrentText. For example, REMOVE SPECIAL CHARACTERS strips non-alphanumeric characters from it.
  4. Result becomes CurrentText — The output replaces CurrentText, ready for the next command to use.
  5. 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:

ModeHow It WorksWhen 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)
Next: See the full Command Reference for details on every command, or learn about Variables & Conditions for dynamic flows.