A company sells wholesale in Poland and has recently started selling to retail customers in Germany. The same product should be visible in one channel but not yet in the other, because the German description is missing. Wholesale buyers need technical photos, while the retail shop needs lifestyle shots. Until now you had to work around this kind of thing. In version 0.109.0 you set it directly in the product editor.
Below I cover the most important changes. The full list, broken down by package, is on the 0.109.0 release page on GitHub.
A product per sales channel and language
This is the biggest change in the release. Most product data can now be set globally and then overridden for a sales channel or for a channel × language pair:
- Availability. You can switch a product on or off in one channel, or in just one of its languages. This also works in bulk: the “set status in one channel” action covers many products at once.
- Completeness check. When you switch a product on, the panel checks that it has all the required data in that channel and language. If something is missing, it tells you exactly what, e.g. “B2C shop · DE: name, attribute material”.
- URLs. A URL key can be set globally, per language and per channel × language pair. When an address changes, the old key redirects permanently to the new one, so you do not lose search rankings.
- Gallery, attachments and packaging. The gallery can differ between channels, and image alt texts are set per language. Attachments are set per channel and language, and packaging unit names per language.
- Minimum order quantity and returnability can differ between channels.
The editor shows all of these settings in one table, and a preview shows what a change to an attribute’s scope will affect. Search, the sitemap, product feeds, the basket, comparisons and quick order all respect these settings, and the product page in the shop refreshes as soon as availability changes.
Active, inactive or archived
A product now has two statuses: active and inactive. Archiving is a separate action. Archived products have their own tab on the list, can be restored from there, and cannot be added to a quote request or an order in the admin panel. The same status model, with archive and restore, now also covers other admin screens, e.g. blog posts. The AI assistant in the admin panel can archive and restore products too.
This is a breaking change: the old “draft” status is gone. Saved list views that used it open on the “All” tab and say so once.
New modules: Tasks and Projects
After CRM in earlier versions, two more modules for teamwork arrive in the admin panel. Both are in the free, open part of the platform, under the MIT licence. You will find them in the “Projects & tasks” section of the menu.
Tasks are for the people who work in the admin panel. A task has several assignees, a due date, a priority, tags, custom fields and attachments. It moves through statuses you define yourself and is shown as a list or a board. Tasks can be commented on, broken into sub-tasks and linked to sales opportunities, orders and quote requests. The module sends reminders and a daily digest. A task can also be a draft that only its author sees, or a private task.
Projects run work for one or more organisations, or an internal project. Each project has its own stages with a planned duration, members with roles (e.g. sales rep, project manager), a value and analytics. A project can be created from a template, and a stage can require its tasks to be finished before the project moves on. A project ends as completed or lost, with a reason, and you decide who can see it.
Notes, messages, document references, attachments and change history now work the same way in CRM, Tasks and Projects. Type @@ in the text to point to an order, a quote request or a task. The notification bell in the admin panel works for every administrator, whatever their role, so a sales rep will see the tasks assigned to them too.
The shop: language in the URL and a new navigation
- The language is part of the URL, e.g.
/pl/p/wiertarkaand/en/p/drill. Good news for the SEO of multilingual shops. - The megamenu is now the shop’s navigation bar.
- A CMS page can have its own name, URL and description in each language.
- New block layouts in the Page Builder: the hero, the feature list, stats, the CTA card and the media-and-text block.
- Products related to a blog post are shown as product cards with the price that applies to the viewer.
Prices and security
- “Prices after sign-in” now hides prices in the API too. Previously the shop hid them only in the interface while the server response still contained them, so they could be read in the browser’s developer tools. The sales channel’s old
isPublicflag has been replaced by the price display mode setting. - Two-step verification shows a QR code during setup, and each code can be used to sign in only once.
- A library file can only be attached by an administrator who has access to it. A folder with files still used by a product, page or post cannot be deleted.
- A shared comparison does not show products its reader cannot buy.
Orders and quote requests
- A quote’s validity date now applies until the order is placed, not just until the quote is moved to the basket. After that date, an order at the negotiated prices will not go through.
- An order placed for a customer in the admin panel, a one-click purchase and an order received from an external system no longer empty the customer’s active basket.
- An invoice accounts for every refund made before it was issued, including refunds settled via a credit limit.
A more convenient admin panel
- Pinned screens in the sidebar, and admin panel preferences stored on the server, so they work on every device.
- The ⌘K command palette covers every admin screen and matches a query word by word.
- Error messages are now proper sentences in Polish and in English. We replaced 137 placeholder texts in each language.
- The reporting time zone is set in the analytics settings.
What to watch out for when upgrading
The release contains seven breaking changes. Apart from the new product status model, they mainly affect integrations and extensions. For example, a quote request created through the admin API for an organisation outside the sales channel is now refused, and several API response schemas have gained new or nullable fields. If you have your own integrations or modules, review the breaking changes section on the release page.
You upgrade an instance with the Endora Commerce CLI’s upgrade command. The details are in the documentation on upgrading an instance. Every change, the comparison with version 0.108.0 and per-package notes are on the release page on GitHub.
Selling across several channels or languages and want to bring it all onto one platform? Get in touch and we will show you how it works in Endora Commerce.