Referring to data: {item.field}, {previous.text}, {step.X.text}
Three placeholders let one instruction do two hundred different jobs — each item's own values, the step before, or any earlier step by name.
In this article (4)
This is what makes a flow bulk work instead of a template you copy: you write the instruction once with placeholders, and every item fills them with its own values. The same grammar works in AI instructions, in Prompt cards, and in a tool call's inputs.
The three forms
| Placeholder | Fills with |
|---|---|
{item.product_name} | That item's value for the column product_name |
{product_name} | The same thing — the short form, when it is unambiguous |
{item} | The item's first column, for quick one-column flows |
{previous.text} | The text output of the step directly before this one |
{step.QA.text} | The text output of any earlier step, by its label |
So an instruction like:
Write a product title and three bullet points for {product_name}.
Keep to the house style: {step.Brand guide.text}becomes a different, complete instruction for every row in your sheet.
Chaining steps
{previous.text} and {step.<label>.text} are how a multi-step flow passes work along — write ad copy in step one, then generate an image that uses that copy in step two. The Ad creative factory template is exactly this, and it is worth opening to see the shape.
Two things to know:
- Reference a step by its label, so rename a step and update the placeholders that point at it. A label with spaces is fine:
{step.Write copy.text}. - Chains resolve per item. Item 7's second step sees item 7's first-step output, never item 6's.
Images travel on their own
Images do not need a placeholder. An item's image columns flow to every step that can accept them, which is why a vision model can score an image the previous step generated, and why the Catalog enricher template can read a product photo without you wiring anything up. Whether a step uses the item's original images or the previous step's output is a per-card option.
When a placeholder does not match
An unknown placeholder is left exactly as written rather than guessed at or blanked. That is the right behaviour, but it means a typo shows up as literal braces in the model's input — which is precisely what the Data tab is for. This has bitten real flows: a trigger mapped to greeting on a flow whose column is topic produced empty fields with no error at all.
Case and spelling must match the column name as written on the batch card.