Transform Catalog

Full reference for every Transform type in TogoFlow — fields, behavior, and when to use each one.

Open a Transform node and click Select Transform to browse the catalog. Each type has its own configuration fields. This page documents every transform and what you configure.

See also: Transform Node for overview and chaining patterns · Function Node when you need custom JavaScript or Python instead of a catalog step.

How transform configuration works

ConceptDescription
InputData from the previous connected node (lastOutput)
OutputWhatever the transform produces — becomes lastOutput for the next node
FieldsType-specific settings shown in the node panel after you pick a transform
VariablesClick Variables on any field to insert {{lastOutput}}, {{context.nodeId.output}}, or {{variables.key}}

Most transforms run on the output of the node directly upstream. Filters and list transforms expect an array; field editors expect an object or array of objects.


AI Transform

Describe changes in plain English. The AI rewrites or restructures the incoming data according to your instructions.

FieldDescription
InstructionsWhat to do with the data (required)

Example instructions: “Extract email, name, and company from each item and return a JSON array.”


Code

Run a short JavaScript expression on the input. Lighter than a Function node — best for one-off reshaping.

FieldDescription
LanguageJavaScript (Python is not supported yet)
CodeMust return a value. Scope: lastOutput, inputs, variables, context
return (lastOutput?.records || []).filter((row) => row.status === 'active');

Date & Time

Format, add, subtract, or extract parts from a date field on each item.

FieldDescription
Date fieldProperty name containing the date
OperationFormat, add, subtract, or extract
Output formatISO, YYYY-MM-DD, custom, etc.
Amount / unitFor add/subtract operations

Edit Fields (Set)

Rename, add, or remove fields using a key-value list. Leave a value empty to remove a field.

FieldDescription
FieldsRows of field name → value (supports {{templates}})

Sheet to Rows

Converts Google Sheets read output into one object per row, using row 1 as column names.

FieldDescription
Header rowWhich row has column names (usually 1)
Include row numberAdds rowNumber for Update Row steps

Place after Google Sheets → Read or any step that returns a values grid.


Sheet & email sequences

Built-in transforms for the Gmail Sheet Outreach pattern and similar multi-step campaigns. These use workflow variables like emailSequence, contactList, scanIndex, and sentEmails.

Filter Sequence Due

Keeps only contacts due today for their current step in variables.emailSequence (day 0 intro, day 3 follow-up, day 7 last try, etc.). Skips contacts who already received the intro or are marked active at step 0.

FieldDefaultDescription
Status fieldstatusColumn/property for contact status
Step fieldstepCurrent sequence step (0 = intro, 1 = first follow-up, …)
First emailed fieldfirst_emailedDate intro was sent; used for follow-up timing
Exclude statusesreplied,unsubscribed,bouncedNever send to these statuses
Skip intro if already emailedonStep 0 requires empty first-emailed date
Skip intro if status is activeonStep 0 skips rows already marked active

Also requires variables.emailSequence on the workflow.

Expects an array of row objects from Sheet to Rows or similar upstream step.


Apply Sequence Copy

Applies subject and body from variables.emailSequence for the row’s current step, with {{name}}, {{company}}, etc. placeholders filled from the row.

FieldConfiguration
(none)Requires variables.emailSequence

Output includes subject, body, nextStep, needReplyCheck, and related fields.


Check Thread Reply

Detects whether a Gmail thread already has a reply from the contact’s email. Use before sending follow-ups.

FieldDescription
Contact emailEmail to look for in thread From headers
Row numberOptional sheet row for downstream updates

Input is usually the output of Gmail → Get Thread.


Scan Sequence Contact

Loop body for sheet-based email sequences. Walks a contact list by index and picks the next row due for its sequence step.

FieldDescription
Contact list fromDropdown — upstream filter (e.g. Due for Sequence)

These are set automatically (you do not configure them manually):

  • contactList, scanIndex, sentEmails workflow variables
  • Scan state tied to this node

Connect as the first output of a Loop node (loop body). The loop re-invokes this node until someone is ready to send or every row is checked.


Patch Sequence Scan

Runs after each send (and optional reply mark). Updates the in-memory contact list and advances the scan cursor, then loops back.

FieldDescription
Contact list fromSame source as Scan Sequence Contact

Auto-wired from the canvas when possible:

  • Pick contact node (Scan Sequence Contact)
  • Send email node (Gmail → Send Email)
  • Reply check node (Check Thread Reply)
  • Restart from node → scan loop

Enable Restart from node on this transform (auto-enabled when the loop is detected). See Execution → Restart from a node.


Add or remove items

TransformWhat it doesKey fields
First ItemPass only the first list item
FilterKeep rows matching a conditionProperty, operator, value
Filter Exclude From VariableRemove rows whose property appears in a workflow variable listProperty, list variable (e.g. sentEmails)
LimitTake first N itemsMax items
Remove DuplicatesDeduplicate by fieldsCompare fields, keep first/last
Split OutExplode a nested array field into separate itemsField name

Combine items

TransformWhat it doesKey fields
Aggregate ListSum, average, count, min, max over a numeric fieldField, operation
MergeCombine multiple inputsMode: append, merge by key, multiplex
SummarizeGroup and aggregate (like pivot)Group by, operations

Convert data

TransformWhat it doesKey fields
CompressionCompress or decompressOperation, format
Convert to FileBuild file content from dataFormat, filename
CryptoHash, HMAC, encrypt/decryptAlgorithm, secret
Edit ImageResize, crop, format conversionDimensions, format
Extract from FileParse binary/file inputFormat
HTMLHTML ↔ text conversionsOperation
MarkdownMarkdown ↔ HTMLOperation
XMLParse or build XMLOperation, paths
Rename KeysBulk-rename object keysKey mappings
SortSort array by fieldField, direction, type
ValidateSchema validationSchema type, required fields
SanitizeTrim strings, remove nulls/emptiesOptions toggles

Choosing a transform

I need to…Use
Rename JSON fieldsEdit Fields (Set)
Filter an arrayFilter
Parse sheet rowsSheet to Rows
Run custom JS on inputCode (simple) or Function (complex)
Email sequence from a sheetFilter Sequence Due → Loop → Scan Sequence Contact → send → Patch Sequence Scan
AI-driven reshapeAI Transform
Validate API payloadValidate

Sheet outreach pattern (no code)

The Gmail Sheet Outreach (No Code) template uses these transforms in order:

Read Sheet → Sheet to Rows → filters → Filter Sequence Due
  → Loop (Scan Contacts)
      → Scan Sequence Contact (loop body)
  → Contact Found? → Send Email → Update Row → Patch Sequence Scan (restart → loop)

Workflow variables to define in Settings → Variables:

{
  "contactList": [],
  "scanIndex": 0,
  "sentEmails": [],
  "emailSequence": [
    { "day": 0, "subject": "...", "body": "..." },
    { "day": 3, "subject": "...", "body": "..." },
    { "day": 7, "subject": "...", "body": "..." }
  ]
}

See the Cookbook for more end-to-end recipes.