Configuration reference
All settings are on the standard extension configuration page: Extensions > My extensions, then Configure on Order Editing — Self-Service for Customers. Every setting can be set for all sales channels or for a single sales channel, using the sales channel selector at the top of the page. There is no separate settings module.
The tables below are generated from the plugin's config.xml, the same file the configuration page is built from. The descriptions are the help texts shown next to each setting.
Settings
Edit window
| Setting | Type | Default | Description |
|---|---|---|---|
holdOrder — Let customers edit their orders | bool | true | The main switch. While it is on, a new order waits instead of going straight to fulfilment. Turn it off and every order still waiting is released. |
windowMinutes — Window length (minutes) | int | 30 | How long customers can edit after they order — most shops use 30 to 120 minutes. Shortening it ends windows that are already past the new length. |
closeOnStateChange — End the window when the order status changes | bool | true | Editing stops the moment anyone moves the order forward, even if there is time left. |
eligibilityRuleIds — Only orders matching these rules can be changed | multi-select (rule) | — | Leave empty for every order. Otherwise an order must match all chosen rules when it is placed. |
Safety rules
| Setting | Type | Default | Description |
|---|---|---|---|
lockAfterInvoice — Stop editing once an invoice exists | bool | true | An issued invoice has to keep matching what you sold; a later change would mean a cancellation invoice and a new one. Leave this on unless you handle that yourself. |
enforceStock — Check stock on every change | bool | true | For products marked “Clearance sale”, a customer cannot raise a quantity past your stock. Other products follow the same limits as your checkout. |
lockPersonalisedItems — Lock personalised items | bool | true | Items with an engraving, an uploaded file or free text cannot be changed. |
allowTotalReduction — Allow changes that lower the total | bool | false | Only matters once an order is paid: you would owe the difference back and refund it yourself. Unpaid orders are never affected. |
taxBasisChange — When a new address changes the tax | single-select | block | Some addresses fall under a different tax rate. Blocking keeps the order exactly as it was sold; recalculating prices it for the new address and changes what you are owed. Options: block (Don't allow the change), reprice (Recalculate for the new address). |
shippingChange — When a change affects the shipping costs | single-select | keep | Keep: shipping stays as sold, like in your admin. Recalculate: priced for the changed order like your checkout. Options: keep (Keep the shipping the order was sold with), requote (Recalculate the way checkout does). |
Allowed changes
| Setting | Type | Default | Description |
|---|---|---|---|
allowAddress — Delivery and billing address | bool | true | Only the signed-in customer who placed the order can change an address. |
allowVariantSwap — Switch to another variant | bool | true | Lets a customer move a line to another variant of the same product, such as another size, capacity or flavour, at that variant's price. They cannot choose a different product. Personalised items stay locked. |
allowQuantityChange — Quantity | bool | true | Raising a quantity is always allowed. Lowering one follows your setting for changes that lower the total. |
allowLineRemoval — Remove an item | bool | false | Lets a customer remove one item instead of cancelling the whole order. |
allowShippingMethodChange — Change the shipping method | bool | false | Customers choose from the shipping methods your checkout offers, at checkout prices. |
Two settings are fixed for an order when its window opens: When a new address changes the tax and When a change affects the shipping costs. Changing them affects windows that open afterwards.
Window length (minutes): lengthening it does not extend windows that are already open. To give one order more time, use Extend window on the order (see Give a customer more time). A value of 0 or less opens no windows at all.
Status card
At the top of the Edit window card, the configuration page checks your shop and shows a warning only when something needs attention:
| Warning | Meaning | What to do |
|---|---|---|
| "An invoice is issued as soon as an order is placed, …" | An active Flow on Checkout / Order / Placed (checkout.order.placed) creates an invoice, cancellation invoice or credit note. Every window closes as soon as it opens. The Flows are named. | Fix a Flow that closes every window |
| "With editing on, every order now enters or leaves Open, …" | An active Flow starts when an order enters or leaves Open. With the hold, that happens for every order. The Flows are named. | Connect your ERP and the "On hold" status |
| "These rules can no longer be checked, …" | A rule chosen in Only orders matching these rules can be changed is invalid and matches no order. The rules are named. | Offer editing only for some orders |
Order status
| Status | Technical name | German |
|---|---|---|
| On hold | ssd_held | Zurückgehalten |
Transitions:
| Action | From | To | Used by |
|---|---|---|---|
ssd_hold | Open | On hold | The plugin, when a window opens |
reopen | On hold | Open | The release: background task, Release now, or by hand |
process | On hold | In progress | By hand, a Flow or an ERP. Ends the window if End the window when the order status changes is on. |
cancel | On hold | Cancelled | By hand, a Flow or the customer's own cancellation. Always ends the window. |
On a shop that lets customers cancel orders themselves, a held order can still be cancelled from the customer's order list.
Background task
| Scheduled task | Interval | What it does |
|---|---|---|
ssd_order_editing.release_held_orders | 300 seconds | Closes every window whose deadline has passed or that the current settings no longer allow, and releases the order. Also releases any order that is on hold without an open window. |
Deactivating the plugin closes all open windows and releases all held orders at once.
Flow Builder triggers
| Trigger | Shown in the Flow list as | Variables | Installed Flow and recipient |
|---|---|---|---|
ssd_order_editing.window.opened | Order Editing: Edit window opened | order, closesAt, windowMinutes, guestOrder | Edit window opened, to the customer |
ssd_order_editing.change.committed | Order Editing: Order change committed | order, changes, amountDelta, guestOrder | Order change committed, to the customer |
ssd_order_editing.refund.due | Order Editing: Refund due after a change | order, refundAmount | Refund due after order change, to the shop's administrator users |
Each installed Flow sends the mail template of the same name, available in English and German. A Flow is only installed if no Flow for that trigger exists yet. A Flow written by an installation has to be indexed once before Shopware runs it; see Adjust the mails for the ways to do that.
The plugin also adds the status On hold to the order status triggers, so Flows can react when an order enters or leaves it.
Permissions
| Permission | Where | Grants |
|---|---|---|
| Order editing, View | Settings > Users & permissions > Roles, section Orders | ssd_order_edit_log:read, ssd_order_edit_session:read, order:read |
| Orders, View | Settings > Users & permissions > Roles, section Orders | Also gets ssd_order_edit_log:read and ssd_order_edit_session:read. Roles saved before installation must be saved once more. |
| Orders, Edit | Settings > Users & permissions > Roles, section Orders | Needed for Extend window (order:update) and Release now |
See Give staff access to the Changes tab.
Change log entries
Each entry on the Changes tab is stored in ssd_order_edit_log.
| Stored action | Shown as |
|---|---|
window_open | Window opened (Open → On hold) |
window_close | Window closed, with the reason |
window_extended | Window extended, with the old and new closing time |
committed | One row per confirmed change: Variant, Quantity, Item removed, Address, Shipping method, Additional information, plus rows for Discount, Credit, Shipping, VAT, Tax and Rounding that followed |
refused | Refused, with the reason |
refund_due | Refund due, with the amount |
payment_moved | Payment changed |
| Source | Shown as |
|---|---|
shopper | Shopper |
admin | Merchant |
system | System |
Rows for amounts that moved as a consequence of a change show Automatic as the source.
Data
| Entity | Purpose |
|---|---|
ssd_order_edit_session | One row per edit window: order, state (open, expired, discarded), closing time, extension, the customer's staged changes, and the tax and shipping settings in force for this window |
ssd_order_edit_log | The change log: action, before and after values, amount, order total, source and refusal reason |
Uninstalling without keeping data deletes both tables. Uninstalling always puts orders still on hold back to Open. Mail templates, Flows and the On hold status stay.
Storefront pages
| Path | Page |
|---|---|
/account/order/{orderId}/edit | Change your order |
/account/order/{orderId}/edit/review | What changes (review and confirm) |
/account/order/{orderId}/edit/line/{lineItemId}/variant | Change options (opens as a dialog from the overview) |
/account/order/{orderId}/edit/address/{target} | Change the delivery address / Change the billing address (opens as a dialog from the overview) |
The entry points are the order confirmation page, the order list in the customer account (a banner and a Change order entry in the order's menu), your shop's guest order page, and the link in the window mail.
Store API
For headless storefronts, the same actions are available through the Store API:
| Path | Purpose |
|---|---|
/store-api/order-editing/session | Load the current changes |
/store-api/order-editing/session/open | Open the customer's changes for an order |
/store-api/order-editing/session/commit | Confirm the changes |
/store-api/order-editing/session/discard | Discard the changes |
/store-api/order-editing/line/variant | Load the variant options of a line |
/store-api/order-editing/line/variant/stage | Stage a variant change |
/store-api/order-editing/line/quantity/stage | Stage a quantity change |
/store-api/order-editing/line/remove/stage | Stage the removal of a line |
/store-api/order-editing/address/stage | Stage an address change (only the customer who owns the order; a guest counts once they have confirmed their details on the guest order page) |
/store-api/order-editing/shipping-method | Load the shipping methods on offer |
/store-api/order-editing/shipping-method/stage | Stage a shipping method change |
/store-api/order-editing/customer-comment/stage | Stage an order comment change |
Every route checks that the order belongs to the logged-in customer, or that a guest presents the order's deep link code together with the mail address and postcode.
Administration API
| Path | Purpose | Permission |
|---|---|---|
POST /api/_action/ssd-order-editing/order/{orderId}/window/extend | Extends an open window by the window length | order:update |
Shops with several web servers
Changes to one order are serialised with a lock. The lock uses your shop's lock store (LOCK_DSN). By default that store is local to each server. If your shop runs on more than one web server, point LOCK_DSN to a shared store, such as Redis or the database, so that all servers use the same lock.
