Where steps live#
Click a placeholder chip — a feed column in a rule or mapping, a product field in a template or channel — to open its value editor. The editor shows the value's steps, with "+ Add step" underneath, grouped as Text, Numbers and Lists. Each step shows its settings when you expand it, and the editor shows what each step produced for a real product, so you can see the value change step by step. Drag a step to reorder it; the bin icon removes it.
The same editor appears on every surface, and the same steps are available everywhere, with one exception: QR code is offered on Studio templates, channels and prompts, not on a catalog's mapping and rules.
A step runs for every product, every time the value is used. A step on a catalog mapping or rule runs on every import; a step on a template or channel placeholder runs every time the template renders or the channel runs.
Text steps#
| Step | What it does | Example |
|---|
| Replace | Replaces every occurrence of one piece of text with another. Search for is matched exactly as written. Replace with nothing to remove the text. | SALE! Blue jacket → Replace SALE! with nothing → Blue jacket |
| RegEx replace | Like Replace, but Search for is a regular expression, so one step can match a whole family of text — any word in a list, any number, anything in brackets. A pattern that isn't a valid regular expression, or a replacement that refers to a group the search doesn't have (for example $2 when the search has one group), is refused when you save or publish, with the step named in the message. In a replacement, $1 or ${name} inserts what a group matched, \$ writes a dollar sign and \\ a backslash. | Jacket (2024) → RegEx replace \s*\(.*\) with nothing → Jacket |
| Uppercase | Makes the whole value capital letters. | blue jacket → BLUE JACKET |
| Lowercase | Makes the whole value lowercase. | BLUE JACKET → blue jacket |
| Titlecase (first letter) | Capitalizes the first letter. A value written entirely in capitals is lowercased first, so a shouting feed calms down. | BLUE JACKET → Blue jacket |
| Capitalize words | Capitalizes the first letter of every word and lowercases the rest. | blue JACKET → Blue Jacket |
| Strip HTML | Removes HTML tags and turns HTML entities back into plain characters — for a description that arrives as web markup. Paragraphs and line breaks become plain line breaks. | <p>Warm & light</p> → Warm & light |
| Trim whitespace | Removes spaces, tabs and line breaks from the start and end of the value. Spaces inside the value stay. | Blue jacket → Blue jacket |
| Map values | Translates values through a table you fill in: one row per From → To. Matching ignores capitalization unless you switch on Case sensitive, and it's exact — no trimming, so add a Trim whitespace step first if your values carry spaces. A value with no row passes through unchanged, or becomes what you put in Default for unmatched values. | in_stock → Map values in_stock → in stock, out_of_stock → out of stock → in stock |
| Build text | Writes new text around the value. Its Text field is an expression like any other: type text and insert placeholders, including Value, which stands for the value as it is at this step. A new Build text step starts as just Value, so it changes nothing until you edit it. | 4490 → Build text with Value followed by kr → 4490 kr |
| QR code | Turns the value — usually a link — into a QR code image, in the color you pick. Studio templates, channels and prompts only. | A product link → a QR code of that link |
For translating many values at once — your own category names onto an ad network's, say — a Map values step with a handful of rows works, and a mapping table scales better. See Mapping tables.
Number steps#
| Step | What it does | Example |
|---|
| Format number | Writes a number the way you want it read: Round to decimals (empty means As is, the number's own decimals), and a Decimal separator and Thousands separator that each start on the separators of the catalog's language — the menu says which, for example Catalog language (sv-SE: 4 490,50), or reads Catalog default where the page doesn't know which catalog the value is for. It turns the number into text, so a Math step goes before it; a text step such as Replace or Build text can follow it. | 4490.5 → Format number, 2 decimals → 4 490,50 on a Swedish catalog |
| Format date | Reads the value as a date and writes it in the Output pattern you give, such as yyyy-MM-dd or dd/MM/yyyy; a pattern with a month name (d MMMM yyyy) writes it in the catalog's language, and Time zone picks the clock it is written in. On a catalog it reads the forms your feed writes dates in, and a column's own date pattern; in a template or channel the text has to be an ISO date like 2026-10-06, with or without a time. It turns the date into text, so a Date difference or Shift date step goes before it. | 2026-10-06 → Format date dd/MM/yyyy → 06/10/2026 |
| Date difference | Counts from the value's date to the Other date — Today's date, or another field such as a sale start date — in the Unit you pick: minutes, hours, days, weeks, months or years. The result is a whole number, negative when the other date is earlier. It is a number, not a date, so a Math or Format number step can follow it. | 2026-09-26 → Date difference in days to Today's date, on 6 October → 10 |
| Shift date | Moves the date by an Amount of the Unit you pick — a whole number you type, negative to move back, or a field from your feed. The result is still a date, so a Format date step can follow it to write it out. | 2026-10-06 → Shift date +7 days → 2026-10-13 |
| Math | Does one calculation with the value: Add, Subtract, Multiply or Divide by the number you give, or by another field you pick. The result is a plain number — 4939, never 4939.0. | 4490 → Math Multiply by 1.1 → 4939 |
A number is written exactly as it is unless a Format number step says otherwise; the rule, and how the catalog's language decides the separators a Format number step leaves on their first option, is in Languages and localization. How the three date steps count, what they can read, time zones and what Today's date costs are in Working with dates. Three things to keep in mind:
- Put Math before Format number. Format number turns the number into text; a Math step after it has to read that text back as a number and can get it wrong. Text steps are fine after it — a Build text step that adds the currency, say.
- Put Date difference and Shift date before Format date. Format date turns the date into text, so a date step after it has nothing to work with, and Publish refuses that order. A Math or Format number step directly after Shift date is refused too — Shift date gives a date, and both need a number. See When Renable won't publish.
- A value that can't be read as a number or a date counts as missing, so whatever fallback you've set for the placeholder takes over — the same as a product with no value at all.
Lists: when a value holds several values#
Some values hold several values at once. In a catalog that's a feed column your feed repeats for a product — additional_image_link with four images, a product_highlight for every highlight — and anywhere else it's what a Split step makes. In a CSV or TSV feed, or a Google Sheet, several values usually share one cell separated by commas; a Split step turns that cell into a list, and for the image columns the automatic mapping adds one for you (see Mapping your feed fields). A column that holds several values for some rows shows a list icon beside its type in the Feed columns rail on the Mapping tab, so you can see which columns this section applies to.
One thing to know if your catalog was set up before October 2026: a column still set up with the old List type shows List (legacy) in the rail. It is split before your rules and mapping read it, so don't add a Split step to it as well — a Split on it would keep only its first value. Renable will move such columns to a Split step for you; choosing another type for the column stops the split.
Two rules decide what happens next.
A step that works on text works on every value of a list. Every text, number and date step above — Replace, Trim whitespace, Uppercase, Format number, Format date, Date difference, Shift date, Math, Build text, all of them — runs on each value in turn and keeps the list a list. Four image links with a Replace step on them come out as four image links, each replaced. Extra values never change the result of such a step, so you don't need anything special to clean up a list; add the steps as if it were one value. (A number or date step drops the values it can't read and keeps the rest; the value counts as missing only when none of them could be read, and the step's row in the value editor says how many values were left out.)
Where one value is needed, the first one is used. Some places can only take one value: a field that holds one value (Title, Price, Main image), text built from several pieces (the brand column, a dash, then a list), a Split step, a group key or a lookup key, the value a Sum, Average, Smallest, Largest, Any or All computed field reads (Values, Distinct values, Distinct count, Sorted first and Sorted last look at every value), and the value a condition compares against. A list arriving there is read as its first value, exactly as it is — if the first value is blank, the result is blank — and the rest are left unused. To choose another value, or to keep them all, add a step from the Lists group before that point: First, Last or Nth to pick one, Join to write them all into one text.
A condition on the column itself is different: it looks at every value. "Contains x" matches when any value contains it, and a "does not" condition only when none of them does. Is blank and is not blank each match when any one value does. On a column declared Number or Date, every value is read as one, and a single value that can't be read fails the whole condition for that product.
A list that comes out empty — a Filter that kept nothing, say — stays empty: the steps after it have nothing to work on, the field ends up blank, and a fallback doesn't take over, because the Filter was your choice.
List steps#
| Step | What it does | Example |
|---|
| Split | Turns one text into a list, cutting it at the Delimiter (a comma if you leave it empty). Max parts keeps at most that many pieces — the last piece keeps everything after it, so a,b,c with Max parts 2 gives a and b,c. Three options: Trim whitespace cleans the spaces around each piece and Remove empty items drops the empty ones — both on for a new step — and Regular expression reads the delimiter as a pattern rather than as plain text. A pattern that isn't a valid regular expression is refused when you save or publish, with the step named in the message. If the value is already a list, only its first value is split. | red, blue, green → Split on , → red · blue · green |
| Join | Writes a list as one text, with the Separator between the values (a comma if you leave it empty). | red · blue · green → Join with , → red, blue, green |
| Map each | Runs its own list of steps on each value — a step editor inside the step. Since text and number steps already work on every value, you need it only when the inner steps include a list step, above all Split: see the recipe below. | A list of color/size codes → Map each with Split on / then First → the colors |
| Filter | Keeps the values that pass a condition — the same conditions a rule uses, judged on each value — and drops the rest. After a Split the values are text, so a number comparison such as is greater than matches none of them until a Math step inside a Map each has turned them into numbers. | Four image links → Filter doesn't contain placeholder → the real ones |
| First | Keeps the first value. On an empty list the result is blank. | red · blue · green → red |
| Last | Keeps the last value. The way to the end of a list — Nth counts from the start only. | red · blue · green → green |
| Nth | Keeps the value at an Index, counted from 0: index 0 is the first value, 1 the second. An index past the end gives a blank. | red · blue · green → Nth index 1 → blue |
| Dedupe | Drops repeated values, keeping the first of each. Exact repeats only — Red and red are different values. | red · blue · red → red · blue |
| Flatten | Turns a list of lists into one list, one level deep — what you need after Map each with a Split inside it. A value that isn't a list passes through unchanged. | (S · M) · (L) → S · M · L |
On a value that holds one value, the list steps treat it as a list of one: First, Last and Join give it back as it is, Dedupe and Flatten leave it alone, and Filter keeps it or drops it.
Recipe: split every value, not just the first#
A Split step on a list splits only its first value. To split each value — a feed that repeats sizes per product, each holding S/M/L — use three steps:
- Map each, with a single Split step inside it on
/ — each value becomes its own list.
- Flatten — the lists become one list.
- Whatever you want next: Dedupe, Join, or nothing, if the field takes several values.
Recipe: keep every image after cleaning the links#
A repeated additional_image_link column mapped to Additional image keeps all its images, and a Replace step on the mapping — rewriting w_200 to w_1200 in every link, say — runs on every link, so all of them stay. Nothing else is needed. The same column mapped to Main image gives the first link only, since Main image holds one; add a Last or Nth step to pick a different one, or a Filter first if the first link can be a blank or a placeholder.
Where Renable tells you only the first value was used#
When a mapping or a rule reads a column that holds several values for some rows of your feed at a place that only takes one, Renable says so, rather than leaving it to the trace: the catalog carries a warning on its Activity tab, among the other warnings, worded like "The Main image mapping: “additional_image_link” holds several values in 1,234 rows of your feed and only the first will be used. Add First, Last, Nth or Join to choose." — or, for a Split step, "The rule 'Colors': “colors” holds several values in 1,234 rows of your feed and only the first will be split. Add First to confirm, or Map each + Split + Flatten to split every value." The publish dialog lists the same warnings before you publish, so you see them with your draft rather than after the import.
The sentence starts with where to look, before the colon: "The {field} mapping" is that field's row on the catalog's Mapping tab, and "The rule '{name}'" is a rule on its Rules tab. Then a few things about these warnings:
- They describe your configuration, not a failed import. Renable works them out by reading your rules and mapping against what it knows of your feed's columns, and recomputes them on every import and every publish. The moment the rule carries a First, Last, Nth or Join step — or you've decided the first value is the one you want and added First to say so — the warning goes away on its own.
- A field that takes several values is warned about only for a list of lists. Additional image, Reason to buy and the attributes keep every value of a plain list, so they get no warning for one. What they do lose is the inner lists of a list of lists — a Map each with a Split inside it and no Flatten after it — and the warning says so: "The Additional image mapping: “sizes” is a list of lists in 1,234 rows of your feed and only the first of each inner list will be used. Add Flatten to keep every value." A Flatten step clears it.
- The number says where it was counted. "In 1,234 rows of your feed" is how many rows of the feed file hold more than one value in that column, counted over the whole feed as it arrives — before rules, splits and exclusions turn rows into products. While Renable has read only part of the feed, it says "in at least 1,234 rows of your feed"; when it has only the 50-row sample to go on, it says "in 3 of the 50 sampled rows". Rows with one value are unaffected either way. After a partial read (the analysis stopped short at its row or column limit, or the stream broke), a column it never reached carries no count at all: it is warned about as a "may" — in the Activity tab, the publish dialog, the editor and Aimée alike — and the sentence carries no number.
- "May hold several values" means Renable can't tell for sure: something before that point may have changed how many values there are — a Filter or a Split, a condition or an Otherwise branch, text whose other parts can be empty, a mapping that an earlier rule overrides for some products, or a column Renable hasn't counted. The sentence doesn't say which; "may" is the whole of it, and the trace shows what happens to a real product.
- Certain warnings need attention; "may" warnings are minor issues. A warning Renable is certain of counts as a Warning and appears in the dashboard's Needs attention queue, however few rows it affects; a "may" warning is a minor issue, shown on the catalog's Activity tab and the project's Overview but not in that queue. If you've looked at a warning and don't want to act on it, archive it: it stays archived through every later import and publish, and comes back only if it gets worse — a "may" that becomes certain.
- They name no products. Because the warning comes from your configuration rather than from an import, it carries no list of affected products to drill down to. To see what happens to a real product, open the Mapping tab, find the column in the rail and use "Trace a product that has a value in this column" (see Feed runs and warnings).
- Catalogs only. Templates, channels and prompts take the first value of a list in the same places, silently — the warnings are a catalog check.
What the editor shows while you edit#
The same check runs in the catalog workspace as you edit, against the columns the latest look at your feed saw holding several values, so you meet a warning where you can fix it rather than in the publish dialog:
- On the Rules tab, an expanded rule carries one line per place — the place in bold, then the sentence: "Then, action 1, the Title mapping, step 2: “additional_image_link” can hold several values and only the first will be used for the Title field. Add First, Last, Nth or Join to choose." The place reads Condition 2, Then, action 1 or Otherwise, action 2, naming the mapping and the step when the place is inside one, or In the ruleset “Nordics base”, rule “Sizes” for a place in a ruleset the rule applies (those steps are edited in the ruleset). A Split's line ends "…only the first will be split here. Add First to confirm, or Map each + Split + Flatten to split every value.", and a list of lists landing in a field that takes several values reads "“sizes” is a list of lists and only the first of each inner list will be used for the Additional image field. Add Flatten to keep every value." A sentence shown where the value is read says "here" instead of naming the place again. A warning Renable is certain of is in warning colour; a "may" one — "“colors” may hold several values and only the first will be used here…" — in plain grey. Under the lines, a note says what they rest on: once Renable has read your whole feed, "Based on the columns that hold several values in rows of your feed. After each import, the catalog's Activity tab rechecks against the whole feed."; before that, the columns that hold several values in the sampled rows; and when Renable could read only part of your feed, "Based on the part of your feed that could be read, so a column it didn't reach may hold several values." — a column it didn't reach is then said as a "may" wherever only its first value is used. A collapsed rule card shows one line in their place — "Uses only the first of several values in 2 places." or "May use only the first of several values in 1 place." — so you can find the rule without opening every card.
- On a Split step itself, in the value editor, the same sentence sits on the step.
- On the Mapping tab, a field's row carries the sentence under its value — "“additional_image_link” can hold several values and only the first will be used here. Add First, Last, Nth or Join to choose." — and the Attribute pairs row its own. A place in the mapping's conditions, which no field's row can show, is said once above the table after "The mapping's conditions:".
- When the check can't see everything, it says so. A rule applying a ruleset the editor couldn't load reads "Warnings may be incomplete: the ruleset “Nordics base” couldn't be loaded, so its rules weren't checked for columns that hold several values." (a ruleset that applies itself "applies itself or nests too deeply"), and its collapsed card adds "the check may be incomplete". If the check can't run on a rule at all, the rule says "The check for columns that hold several values couldn't run on these rules in the editor. Publishing still checks them."
What the trace shows for one product#
The warnings above describe your configuration; the trace describes one product. When you trace a product, a value that holds several values shows them all — a · b · c, then +N more past the first three — and the step's type badge reads List · N, counting every element, a blank one (shown as (blank)) and a structured one ((structured)) included. Two places say when only the first of them was used: a Split step given several values says under the step "Only the first of 3 values was split. Add First to confirm, or Map each + Split + Flatten to split every value."; and on the Mapping tab, a field that takes one value — or text built from several pieces — is marked on its sample when this product's column holds several values, with the sentence in the sample's tooltip: "This field holds one value, so only the first of 3 is used. Add First, Last, Nth or Join to choose." The row-by-row trace on the Rules tab shows the values themselves but carries no such note.
Two things only the trace can tell you, because they depend on this product's actual values rather than on your configuration:
- A blank first value lands nothing. A field that holds one value, and a Split step, read the first value exactly as it is — so when the first of several values is blank, the field gets nothing and the Split splits nothing. The Split step's note and the Mapping-tab sample both say so: "The first of 2 values is blank, so nothing lands. Add a Filter step (is not blank) before it." The configuration warnings can't see this, since whether the first value is blank is a fact about each product.
- A list of lists loses values even in a field that takes several. A Map each with a Split inside it and no Flatten after it lands only the first piece of each value in a field like Additional image. The Mapping-tab sample says so for this product: "This value holds a list of lists; only the first of each is used. Add Flatten to keep every value."
Or ask Aimée#
You don't have to build the steps by hand: describe what you want in plain language — "strip the price's decimals", "take the last image link instead of the first" — and ask Aimée to add the step for you. She publishes once you approve.