Skip to main content
Use Data Transform when you need to reshape existing workflow output before another step reads it. Data Transform does not call an external service. It is useful after Extract from File, before Google Sheets, Airtable, Custom API, and follow-up Iteration steps.

Configuration

Add this step from the Utilities group in Search steps….

Modes

Build Rows

Use Build Rows to zip arrays by index into an array of objects. Each field has a Key and a Source Value. The key becomes an object property. The source can be a whole variable reference such as {{tool_names}} or {{step_3.output}}, or a static value. The step fails if you run it with no fields or with a blank field key. Array source values are read by index. Static scalar values repeat for every row. Example:
Build Rows fields:
Output:
Use Mismatch Policy when array lengths differ:

Concat Arrays

Use Concat Arrays to append multiple arrays into one longer array. Each source must resolve to an array. If a source resolves to a string, object, number, or boolean, the step fails. Example sources:
If those values are ["a", "b"] and ["c"], the output is:

Flatten Array

Use Flatten Array to flatten one array by one level. Nested array elements expand. Non-array elements stay in place. Example source:
Output:

Objects to Grid

Use Objects to Grid when a previous step returns an array of objects and you want to write that dataset into Google Sheets. Set Source Value to the records array, such as {{step_2.output}}. If the previous step wraps rows in a field (for example AI Keyword Data Search), use that field instead, such as {{step_2.output.items}}. Leave Headers blank to use every object key in first-seen order. You can also pass a placeholder that resolves to an array of column names, or a comma-separated list such as keyword, volume, difficulty. Example source:
Output:
Pass those values into a Google Sheets Upsert Rows step:
Missing keys become empty cells. Nested objects or arrays inside a record are passed through as-is; Google Sheets cells work best with simple values such as text and numbers.

Classify Date

Use Classify Date when you need to know whether a date has passed, such as a tender deadline or an offer expiry. A model is unreliable at comparing dates, so this mode does it in code after an AI step has extracted the raw date text. Set Source Value to the records array, Date Field to the field holding the date (for example deadline), and leave Today as {{_current_date}}. Each record comes back with a status field (default date_status): To rank or filter by age, set Age Field: each record also gets the number of days since the date under that name (a date still ahead gives a negative number, and an unclear date gives null). A time or timezone after the date is ignored. A numeric date whose day and month are both 12 or less, with no month name, such as 10/12/2026, is ambiguous and comes back unclear instead of being guessed. 25/12/2026, 2026-12-25 and 25 December 2026 are all read normally.

Summarize

Use Summarize to count a list, optionally total a numeric field and group by another field, so a later step reports numbers that match the list. The output is { "count": 5, "total": 17.5, "groups": [{ "value": "open", "count": 2, "total": 12 }] }; total appears only when you set Total Field, and groups only when you set Group By. Non-numeric values are skipped when adding up. Use Count items where when a later step needs a count of the items that meet a condition, or a percentage, such as how many checklist items are found out of all of them. Set a field, an operator and a value (for example status is one of structured, buried). The output then also has matched (how many items meet the condition) and matched_percent (matched as a percentage of count, rounded to a whole number, or 0 for an empty list). Reference them like any other output, for example {{step_6.output.matched_percent}}, so the numbers come from the step instead of an AI step counting for itself.

Date Window

Use Date Window when a scheduled workflow reads a period such as last week or today. Typing the dates as inputs goes stale after one run, and a model is unreliable at working out “last Monday to Sunday”, so this mode does it in code from the run date. It needs no source value. Set Period to the window you report on and leave Today as {{_current_date}}. Weeks start on Monday, so Last week on a Monday run is the previous Monday to Sunday. Last 7 days and Last 30 days end today; Last N days takes its length from Days. The output is one object:
Pass {{STEP_IDENTIFIER.output.start}} and {{STEP_IDENTIFIER.output.end}} to an integration step’s date arguments, or start_at and end_at where it wants a full timestamp, and {{STEP_IDENTIFIER.output.label}} to the step that writes the report.

Output

Data Transform stores its result at:
For Build Rows, the output is an array of objects. This shape works well with integration steps that expect records or rows. For Concat Arrays and Flatten Array, the output is an array that later steps can iterate over. For Objects to Grid, the output is an object with headers and rows. Use it with Google Sheets Upsert Rows. For Classify Date, the output is the input array with the status field added to each record. For Summarize, the output is an object with count and, when configured, total, groups, matched and matched_percent. For Date Window, the output is an object with start, end, start_at, end_at, days and label.

Notes

  • Source values should be whole placeholders such as {{step_2.output}}, or static scalar values.
  • Mixed template strings such as Research for {{tool_names}} are not supported in Data Transform V1.
  • Data Transform preserves arrays and objects as structured JSON for downstream steps.
  • Data Transform is a free utility step.
See also: Google Sheets, Airtable, Custom API, and Testing and Iteration