Pricing
The Prices tab changes many prices at once: choose the products, describe the price change as a recipe, check every new price in a list, then apply it now, schedule it, or send it for approval. Every price job appears in the history and can be reverted like any other job. Single prices are still edited in the sheet.
The tab needs the permission "Change prices" (see Permissions).
The page
The page has three panels and a footer:
| Panel | Contents |
|---|---|
| Products | Which products are changed. |
| Price change | The recipe: steps from top to bottom, optionally in rules with conditions. |
| Check | Every product with its old and new prices, the change, the margin and notes. |
The footer has the buttons "Discard", "Schedule…" and "Apply N price changes".
The check is calculated on the server whenever the recipe or the products change (about a second after you stop typing). What you check is exactly what is applied. Large selections are calculated in the background; the check shows the progress. Under every step the panel shows what the step did to an example product of the check ("KW-10001: €192.99 → €201.67"), so you see the effect while you edit.
Products
| Source | What it selects |
|---|---|
| Filters | The sheet's filters (search, manufacturer, category, tag, sales channel, active, quality, translations), plus price filters: price from/up to (default currency, gross), list price set or not, purchase price set or not. No filter means all products. |
| From the sheet | Select products in the sheet and click "Change prices…" in the selection bar. "Select all matching" hands over the sheet's filters instead of a list. |
| Dynamic product group | All products of a dynamic product group. |
| Product numbers | Paste numbers (one per line, or separated by commas or semicolons) or read them from a file (first column of a CSV). Numbers without a product are listed after the check. |
"Include variants" adds the variants of the selected main products. A variant that takes its price from its main product is not a row of its own: it changes together with the main product (the row shows "+3 variants"). A variant with its own price is a row of its own.
Gross or net
"Gross prices" or "Net prices" chooses the side the recipe calculates with. The other side follows from the tax rate
of the product, like the administration does for linked prices. Margins are always calculated on net prices:
(net price − purchase price) / net price.
Steps
A step has a price (the target), an operation and the inputs the operation needs. Steps run from top to bottom; each one sees the result of the one before. Drag a step by its handle to move it, or focus the handle and press Alt with the arrow keys.
Prices (targets)
| Target | Notes |
|---|---|
| Price | Default currency. |
| List price | The strike-through price. |
| Purchase price | The cost price (purchasePrices). |
| Lowest price (30 days) | The regulation price for the EU price indication rules. Gross. |
| Price in currency / List price in currency | An explicit price in another currency, instead of the currency factor. Gross. |
| Advanced prices | Quantity tiers per rule (product_price). |
Operations
| Operation | Example | Notes |
|---|---|---|
| Change by % | price +4.5 % | Negative for a decrease. |
| Change by amount | price −2.00 | |
| Set to | price = 19.99 | |
| Calculate from | list price = price × 1; price = purchase price × 1.8 | Base: price, list price, purchase price, or a value from a file. |
| Target margin | price so that the margin is 35 % on the purchase price | Rows without a purchase price are "not possible". |
| Round | to .99, to a step of 0.05, or per price band | See Rounding. |
| Remove | list price empty | Not for the price itself. |
| Never below / never above | price ≥ purchase price + 15 %; price ≤ 99.00 | A limit: the purchase price plus a percentage and/or an amount, or an amount. A capped row gets the note "Capped by a limit". |
| Limit the change | at most ±20 % | Against the price before the recipe. |
| Lowest price of the last 30 days | lowest price := lowest of the history | From the price history. |
| Create quantity tiers | rule "Wholesale": from 1 −0 %, from 10 −5 % | Advanced prices from the price (or list price). The first tier starts at 1. |
| Remove tiers | all tiers of a rule | Optionally only one tier ("from quantity"). |
"Only when this price is empty" (on set, calculate from, target margin, lowest price) leaves products that already have a value alone, for example "list price := price, only when there is no list price yet".
A variant that inherits its price only gets its own price from a step that defines the whole value (set, calculate from, target margin); "+4.5 %" does not copy the main product's price into every variant. Currency prices that follow the currency factor stay that way unless a defining step sets them (note "Currency factor").
Rounding
| Mode | Example |
|---|---|
| To an ending | .99 → 12.34 becomes 12.99 (up), 11.99 (down or nearest); 9.00 → 131 becomes 129.00 |
| To a step | 0.05 → 12.31 becomes 12.35 (up) |
| Per price band | below 10 → .99, below 100 → .90, above → 9.00 |
Direction: nearest, up or down. A rounded price is never 0. The rounding editor shows a few example values. Set to, change by %/amount, calculate from, target margin and create tiers can round their result right away ("Round the result"); limits can round a capped price (up for a minimum, down for a maximum).
Rules (conditions)
With "Add rule with conditions" the recipe gets rules: "if these conditions, then these steps". A rule without conditions matches every product ("Otherwise").
| Condition | Compares |
|---|---|
| Category | is in / is not in (the category or one below it) |
| Manufacturer, Tag, Property | is / is not, has / does not have |
| Current price | is between (in the recipe's basis) |
| Current margin | is between (%) |
| Product type | main product or variant |
| Custom field | equals a value |
All conditions of a rule must match. The "Rules" setting decides how rules combine. "First matching rule" (default) prices a product with the first rule that matches; "All matching rules in order" runs every matching rule. A rule below a rule without conditions never runs with "first matching rule"; the panel says so. The check shows which rule priced each row and has a rule filter. Products no rule matched stay unchanged ("Unchanged, no rule").
Values from a file
"Values from a file" uploads a CSV with a product number (or EAN or manufacturer number) and a value, for example new purchase prices from a supplier. Choose the product column, what it contains, the value column, the decimal separator and whether the values are net or gross. Steps use the value with the base "Value from the file", for example "purchase price := value from the file" followed by "price: target margin 30 %". The check says how many rows of the file matched a product. A product without a value in the file keeps its value (the calculation shows "no base value").
Check
The summary above the list counts the prices that become higher, lower or stay unchanged, other changes (only the list price or the cost changed), rows that are not possible, conflicts and warnings, with the average and median change. Click a number to filter the list.
The filters below it are "All", every note that occurs, excluded rows, the rule and a product number search. The distribution below the list shows how many products change by how much; click a bar to filter by that range (the outer bars collect the outliers).
The list shows 100 rows per page. Each row has the product number, name and variant options, the old and new price, every other price the recipe changes (list price, purchase price, lowest price, currency prices, number of tiers), the change in % and as an amount, the margin before and after, the rule and the notes. Sort by product, change or rule.
| Key | Action |
|---|---|
| ↑ ↓ Home End | Move through the rows |
| Space | Include or exclude the row |
| Enter | Set the new price by hand |
| I | Show how the price was calculated (every step with its result) |
| Esc | Close the calculation or the input |
Warnings never block. The row stays included and you decide. "Exclude N items with warnings" excludes all of them at once.
| Warning | When |
|---|---|
| Large change | The price changes more than the limit (recipe setting, otherwise the configuration, default 50 %). |
| Price 0 | The new price is 0. |
| List price not above | The list price is not above the new price (the strike-through has no effect). The list price is not removed automatically. |
| Below purchase price | The new price is below the purchase price. |
| Low margin | The margin is below the limit (recipe setting or configuration). |
| Large rounding | A rounding step moved the price by more than 5 %. |
| Changed recently | Another price job changed the same price in the last N days (recipe setting, default 14). |
| Set manually last time | The last price job set this price by hand; the recipe would overwrite it. |
| Information | Meaning |
|---|---|
| Capped by a limit | A "never below/above" or "limit the change" step changed the result. |
| Variants follow | Variants inherit this price and change with it. |
| Currency factor | A currency price follows the factor and stays derived. |
| Set manually | The price was set by hand in this check. |
| No rule | No rule matched. |
A row is "not possible" (with a filter of its own) for a target margin without purchase price, a list price on a variant without its own price, or a negative result.
To set a price by hand, click the new price (or press Enter) and type another value. Every other changed price of the row (list, purchase, lowest 30 days, currency prices) can be clicked the same way. Values are entered in the recipe's basis; in a net recipe the lowest price and currency prices are stored gross with the product's tax rate. The server plans the row again with the same validation and notes and marks it "Set manually". A later price job on the same product warns "Set manually last time".
The check settings in the Price change panel set the limits of the warnings: the change in %, the margin in % and the number of days for "Changed recently". Empty fields use the configuration.
"Export check (CSV)" downloads the list as it is filtered, in your administration language, for sign-off: price, list price, purchase price and margin before and after, plus a pair of columns for every other price the recipe changes (lowest price of the last 30 days, prices and list prices per currency, number of advanced price tiers).
Apply, schedule, approval
"Apply" saves the prices. Up to 100 products are saved right away, larger jobs run on the message queue (see Jobs, limits and retention). Prices that changed after the check are reported as conflicts and not overwritten. The job appears in the history as "Supplier increase (1,189 products)" with the type "Prices". Open it there to see the same check, export it or revert it.
"Schedule…" applies the job at a date and time. For a timed sale, "Restore the previous prices automatically" brings
the previous prices back at an end time. The end is the revert of the job, planned when the start was applied and
applied at the end time. Prices that someone changed during the sale are not touched and are reported as conflicts.
"Now" applies at once and only schedules the end. The end needs the permission "Revert changes". Scheduled jobs run
with Shopware's scheduled tasks (lae_product_studio.pricing_schedule, every 5 minutes) and the message queue worker.
In the history, a scheduled job shows its date. "Unschedule" puts it back to review, "Discard" cancels it. An applied sale shows when it ends, with a link to the end job and "Do not restore". Once the end ran, it says that the previous prices are back, or how many products kept their sale price because their price was changed during the sale (open the end job to see them). In the history, the columns of an applied job read "Before" and "After".
When "Approval needed from this many price changes" or "Approval needed from an average change of (%)" is set in the configuration (card Pricing), applying or scheduling a larger job sends it for approval instead. The job waits in the history ("Waiting for approval", with who asked and why). A user with the permission "Approve price changes" opens it, sees the same check and approves or rejects it with an optional comment. Approving applies the job (or schedules it, when it was scheduled). Nobody approves their own job, except administrators. A rejected job changes nothing.
Recipes
A recipe is the price change (and optionally the product selection) saved under a name with "Save", "Save as…" and "Delete". "changed" next to the name means the recipe on the page differs from the saved one. Personal recipes are only visible to you; "Share with all users" makes a recipe visible to everyone with the Prices tab, and everyone with "Save and share price recipes" may change it. A recipe saved with a file keeps the file's column settings; upload the file again when it is gone.
Built-in examples (not stored, save a copy to keep changes):
| Example | Steps |
|---|---|
| Supplier increase | price +4.5 %, round up to .99, never below purchase price + 15 % |
| Start sale −20 % | list price := price (only when empty), lowest price of the last 30 days, price −20 %, round down to .99 |
| End sale | price := list price, remove list price and lowest price; use it from the history ("End sale…" on the start job) |
| Round all prices to .99 | round to the nearest .99 |
| Reprice to 35 % margin | target margin 35 % on the purchase price, round up to .99 |
"Plan again" in the history opens the job's recipe on the same products (for filter, product group and job selections). "End sale…" on an applied sale without a planned end opens "End sale" for that job's products.
Price history
Product Studio records every price change of every product (from any source: Product Studio, the product page, imports, the API), per currency, from the moment it is installed; activation stores the current prices once. History older than "Keep price history (days)" (default 400) is removed. It powers "Lowest price of the last 30 days" and the price history chart on the product page (Product Studio card): the gross price and list price in the default currency over the last 90 or 400 days, with the lowest price of the last 30 days. "Show as a table" lists the same data. A variant without its own price shows the history of its main product.
Permissions
Additional permissions, group "Product Studio":
| Permission | Allows |
|---|---|
| Change prices (Prices tab) | Open the Prices tab, plan, apply and schedule price jobs. Includes product write permissions (product:update, product_price:*). |
| Save and share price recipes | Save, share and delete recipes. |
| Approve price changes | Approve or reject price jobs that wait for an approval. |
Reverting a price job and the automatic end of a sale need "Revert changes".