Welcome to the October 2026 Core Monthly. With PrestaShop 9.2 out of the door, October was a month of consolidation: the Admin API took a big step towards maturity, the performance work picked up speed, and the 9.2.x branch collected a solid batch of fixes.

Core Monthly banner

Dear community,

After a month as intense as September, you might expect things to slow down a little. They did not, they just changed direction. Instead of shipping a big release, October was about listening to the first feedback on 9.2, hardening what we just published, and preparing the ground for what comes next on develop. In total, 170 pull requests were merged by 31 contributors, and a good share of them came from the community. Here is what stood out.

The Admin API is growing up

The Admin API was one of the busiest areas of the month, and most of that work was about turning a promising feature into a contract that module developers and integrators can rely on. @jolelievre updated ADR 0023 to write down the rules the API now follows: resources live in the ps_apiresources module, lists share the same paginated format, and bulk operations and status codes behave consistently everywhere. Writing these decisions down matters, because it is what lets several people add endpoints in parallel without each of them reinventing the conventions.

Concretely, every endpoint now requires a scope, which closes the door to resources accidentally exposed without permission checks. The missing Product endpoints were added, the experimental multistore support got its own documentation section, and a scheduled workflow now keeps the API tracking issue up to date every day, so anyone can see at a glance what is covered and what is still missing. On the community side, @PrestaEdit consolidated the Country, Customer and ImageType endpoints into single domain pull requests, which makes them much easier to review and merge.

You will also notice a few PRs tagged “AI context” in the list below. The core and ps_apiresources repositories now ship context files, review checklists and conventions extracted from past reviews, so that AI assistants (and humans!) contributing to the codebase start from the same rules the maintainers apply. It is a natural follow-up to the work we described in Teaching AI to speak PrestaShop.

Performance, one query at a time

Benjamin Bendaoui (@LameuleFR) had a very productive month hunting down unnecessary work, and it did not go unnoticed: he also joined the list of project committers in October, which means he can now review and merge contributions too. Welcome aboard, Benjamin! On develop, the translator now only warms up the catalogues of installed languages, shop translations are saved with one query per language instead of one per string, upgrading a single module no longer loads every module present on disk, and the front office skips the cart quantity query when the cart has not even been saved yet. On the 9.2.x side, the out-of-stock label now reuses the quantities that are already computed, and in the Faceted search module uncached category pages run fewer and lighter SQL queries.

None of these changes is spectacular on its own, and that is precisely the point: performance on a real shop is rarely about one big fix, it is about removing dozens of small costs that add up on every page view. If you have spotted a slow area in your own shop, this is a great example of how to contribute a targeted, easy-to-review improvement.

New features on the develop branch

While 9.2.x received fixes, develop kept moving towards the next version, and the B2B initiative took another step forward. Business entities are the companies behind B2B customers, stored in their own data model so that existing B2C shops are not affected. After the creation form earlier this year, @soledis-contributeur added the edit and deletion pages in the back office, so merchants can now manage business entities from start to finish.

Carrier tracking URLs can now use order and delivery address placeholders, which is handy for carriers that need more than a tracking number to show the parcel status. @Codencode added automatic cleanup of outdated sessions, so the sessions table no longer grows forever, and the Docker Compose setup now accepts environment variables, making it possible to run several PrestaShop instances side by side when you develop or test.

Modules, themes and tooling

The ps_onepagecheckout module keeps getting polished after its debut in 9.2: the payment section and the footer are now aligned with the checkout form on desktop, and the configuration page warns merchants when guest checkout is disabled. The Product Comments module 9.0.1 and the Email subscription module 3.0.1 were released, the latter with missing database indexes contributed by @Prestaplugins. @kpodemski replaced the old webpack, Babel and node-sass toolchain of the faceted search with esbuild and Dart Sass, a welcome modernization for anyone building the module’s assets.

PrestaShop Flashlight also had a busy month, with @Alexandre-Lematre fixing builds for older PrestaShop versions, the Alpine Apache images and the nginx routing of language-prefixed URLs.

See you in Lyon

PS Summit 2026

PS Summit 2026 kicks off this week: the workshop and hackathon day on November 4th brings PrestaShop and Sylius developers together, and the conference opens on November 5th at the Palais des Congrès in Lyon. If you are attending, come and say hello to the team. We will share a recap of the event in the coming weeks.

Most active contributors

  1. @Codencode (17 PRs) topped the list with a long series of fixes: multistore product deletion, module uninstall consistency, carrier price ranges showing the wrong currency, PHP 8.5 deprecations, the customization weight counted twice in orders, plus the automatic session cleanup on develop.
  2. @jolelievre (15 PRs) drove the Admin API work across the core, ps_apiresources and the ADR repository, set up the AI context files, and maintained the Docker images.
  3. @Quetzacoalt91 (14 PRs) kept the Update Assistant in sync with 9.2.0, released productcomments 9.0.1, and took care of Docker and CI updates.
  4. @boo-code (10 PRs) fixed the session handler lifetime, logo attachments in emails, a reserved stock underflow, TinyMCE sizing in hidden tabs and full name filtering in grids.
  5. @Alexandre-Lematre (10 PRs) worked almost entirely on PrestaShop Flashlight, making its images more reliable across PHP and PrestaShop versions.

Spotlight on community contributors

Every month we highlight a few contributors from outside the core team whose work made a difference. Here are five of them for October.

  • @Codencode was the most active contributor of the month, fixing multistore, module and carrier issues in the back office and order weight calculations in the front office, and clarifying the MaterialChoiceTableType documentation.
  • @boo-code once again touched every corner of the codebase, from sessions and emails to stock, webservice invoice numbers and the PrestaShop UI Kit icon font.
  • @LameuleFR delivered a series of performance improvements in the core and the faceted search, added address placeholders to carrier tracking URLs, and became a project committer.
  • @Hlavtox fixed UTF-8 feature values in structured data, zero as a valid multilingual value, the context country for automatic cart rules, and the new 9.2 product conditions in the faceted search.
  • @soledis-contributeur pushed the B2B initiative forward with the business entity edit and deletion pages in the back office.

There is more in the list below than we could fit here: @ShaiMagal fixed a product page crash when the brand no longer exists, @lucasell95 fixed the customer groups cache, and @rootvector2 made the webservice date range filter include its boundaries. Take a scroll, there is something for everyone.

Project releases

A quick update about PrestaShop’s GitHub issues and pull requests:

Code changes in the ‘9.2.x’ branch

Back office

  • #43311: Fix: [Multistore] Deleting a product from the edit page removes it from all shops regardless of the selected shop context. Thank you, @Codencode
  • #43292: Allow profile names up to 128 characters. Thank you, @Nexory
  • #43264: Country: refuse deleting the default country, check the zone exists, reset the bulk handler exceptions. Thank you, @jolelievre
  • #43215: Fix improper route loader used in module tab registration. Thank you, @gross-nvs
  • #43204: Fix: A module whose uninstall() returns false stays installed, but its admin tabs (and with “delete files” its folder) are removed anyway. Thank you, @Codencode
  • #43171: Keep the creation order of order messages created in the same second. Thank you, @mattgoud
  • #43159: Only open the row link when the press started on a clickable cell. Thank you, @mattgoud
  • #43152: Fix undefined submit_form_ajax on legacy cart rule pages. Thank you, @Hlavtox
  • #43150: Clean product_carrier table when carrier is deleted. Thank you, @aomaxime
  • #43143: Add width on menu icons to keep better display will loading font. Thank you, @tblivet
  • #43142: Fix: strncmp(): Passing null to parameter #1 ($string1) of type string is deprecated. Thank you, @Codencode
  • #43062: Always return an array from Filters::getFilters(). Thank you, @lucasell95
  • #43013: Fix: SHOP-scoped Extra Property toggle updates shops where the entity is not associated. Thank you, @Codencode
  • #42938: Match the full name when filtering grids by customer or employee. Thank you, @boo-code
  • #42572: Allow zero as a valid multilingual value. Thank you, @Hlavtox
  • #42533: Size TinyMCE editors again when their tab becomes visible. Thank you, @boo-code
  • #42406: Fix: Carrier price ranges always display EUR symbol regardless of shop’s default currency. Thank you, @Codencode
  • #42140: Prevent disabling multiple selection in MaterialChoiceTableType. Thank you, @Codencode
  • #42085: Use PDF template object returned by hook. Thank you, @Codencode
  • #40893: Fix: Custom delivery time gets deleted when switching to default. Thank you, @Codencode

Core

  • #43367: Update Symfony components after 6.4.49 release. Thank you, @nicosomb
  • #43343: Update phpoffice/phpspreadsheet to 1.30.7. Thank you, @nicosomb
  • #43303: Fix: Clear customer address caches in Customer::resetAddressCache. Thank you, @LameuleFR
  • #43276: Employee: handle a missing context employee, edit only the fields set on the command. Thank you, @nicosomb
  • #43270: OrderReturn: refuse deleting an unknown line, collect the failures of the bulk deletes. Thank you, @nicosomb
  • #43269: CMS: read the root category, refuse an unknown parent category. Thank you, @nicosomb
  • #43268: OrderState: keep the unremovable states on bulk delete, merge the localized values on edit. Thank you, @nicosomb
  • #43252: AI context: Admin API routing table, component context, path-scoped rule and endpoint index [OS-51]. Thank you, @jolelievre
  • #43241: Update Symfony components after 6.4.48 release. Thank you, @nicosomb
  • #43237: Admin API: boolean cast of the query results, paginated list envelope, OpenAPI cleanup, customer group reduction check. Thank you, @jolelievre
  • #43166: Use an anonymous employee in CLI commands instead of employee 42. Thank you, @Jeremie-Kiwik
  • #43145: Bump version to 9.2.1. Thank you, @mattgoud
  • #43116: Admin API: customer fixes, API test environment and OpenAPI documentation improvements. Thank you, @mattgoud
  • #43066: Fix: Skip vendor and non-source folders when registering module controllers. Thank you, @LameuleFR
  • #43063: Invalidate Customer groups cache in cleanGroups() and addGroups(). Thank you, @lucasell95
  • #42771: Attach the shop logo only to emails that show it. Thank you, @boo-code
  • #42716: Give the session handler a lifetime, not an expiry date. Thank you, @boo-code
  • #42539: Fix shipment entity. Thank you, @Quetzacoalt91
  • #42021: Use CSPRNG for password reset token generation. Thank you, @nabhan06
  • #41869: Fix BIGINT UNSIGNED underflow when recomputing reserved stock quantity. Thank you, @boo-code

Front office

  • #43387: Fix: Customization weight impact counted twice in order_detail.product_weight (and order weight) since 9.0.0. Thank you, @Codencode
  • #43348: Fix: CategoryController::getCategoryToRedirectTo(): int returns null in multistore → fatal TypeError (HTTP 500) instead of 404/redirect. Thank you, @Codencode
  • #43162: Fix: CartController ajax refresh logs “No template found for checkout/_partials/cart-summary-items-subtotal” with Hummingbird theme. Thank you, @Codencode
  • #43100: Fix: PHP 8.5 deprecation: null array offset in classes/Cart.php lines 1387, 1391, 1397. Thank you, @Codencode
  • #43079: Initialize context country before automatic cart rules. Thank you, @Hlavtox
  • #43047: Fix UTF-8 feature values in product structured data. Thank you, @Hlavtox
  • #43042: Fix product page crash when its brand no longer exists. Thank you, @ShaiMagal
  • #43037: Perf: Use the presented quantities for the out-of-stock label. Thank you, @LameuleFR
  • #42979: Fix: Missing input validation in AuthController. Thank you, @Codencode

Tests

  • #43368: Update tests UI dependencies. Thank you, @Quetzacoalt91
  • #43295: Wait for the email to be listed by maildev in the password reset Behat step [OS-132]. Thank you, @mattgoud

Web services

  • #43147: Describe the experimental multistore support in the Admin API doc. Thank you, @jolelievre
  • #42336: Keep the invoice number when the webservice changes an order status. Thank you, @boo-code

Code changes in the ‘develop’ branch

Back office

  • #43164: Add the business entity deletion in the Back Office. Thank you, @soledis-contributeur
  • #43126: Feat: Add order and delivery address placeholders to carrier tracking URLs. Thank you, @LameuleFR
  • #42505: Add the business entity edit page in the Back Office. Thank you, @soledis-contributeur
  • #42487: Check if theme is not parent with its child currently used while trying to delete. Thank you, @aomaxime
  • #41851: Refresh the theme config cache when re-importing an upgraded theme. Thank you, @boo-code

Core

  • #43160: Perf: Warm up the translator catalogues of installed languages only. Thank you, @LameuleFR
  • #43146: Perf: Save shop translations with one query per language. Thank you, @LameuleFR
  • #43068: Perf: Do not load every module on disk to upgrade a single module. Thank you, @LameuleFR
  • #42875: Add automatic cleanup for outdated sessions. Thank you, @Codencode
  • #41854: Generate links with the target shop’s category link_rewrite on multishop. Thank you, @boo-code

Front office

  • #43027: Perf: Skip the cart quantity query when the cart is not saved yet. Thank you, @LameuleFR

Installer

  • #42861: Allow env vars in variables of Docker compose file to make parallel instances of PrestaShop possible. Thank you, @Quetzacoalt91

Web services

  • #40976: Fix webservice date range filter excluding boundary dates (#10822). Thank you, @rootvector2

Code changes in the ‘8.2.x’ branch

Tests

  • #43153: Use archive.debian.org for every end-of-life Debian base image in the dev Dockerfile. Thank you, @mattgoud

Code changes in modules, themes and tools

API Resources

  • #446: AI context: .ai folder, review checklist, conventions from the review history, CodeRabbit configuration [OS-51]. Thank you, @jolelievre
  • #445: Require a scope on every API endpoint. Thank you, @jolelievre
  • #444: Update the API tracking issue daily from a scheduled workflow. Thank you, @jolelievre
  • #443: Admin API follow-ups: customer groups, customer details order rows, OrderReturn 404, documentation fixes. Thank you, @jolelievre
  • #442: Track the listing grids in the API tracking table. Thank you, @jolelievre
  • #429: Merge the Country endpoints into one domain PR. Thank you, @PrestaEdit
  • #428: Merge the Customer endpoints into one domain PR [OS-21]. Thank you, @PrestaEdit
  • #421: Merge the ImageType endpoints into one domain PR. Thank you, @PrestaEdit
  • #410: Add the missing Product domain endpoints. Thank you, @jolelievre

Architecture Decision Records repository

  • #45: Update ADR 0023: Admin API resources in the module, paginated contract, bulk rules, status codes [OS-51]. Thank you, @jolelievre

Auto Upgrade module

Automated tests on Pull Requests

Changes in developer documentation sources

Classic theme

  • #240: Fix recursive back parameter in customer sign-in URL. Thank you, @Codencode

Distribution API

Docker images

Email subscription module

Faceted search module

  • #1365: Fix missing PrestaShop 9.2 product conditions. Thank you, @Hlavtox
  • #1346: Perf: Fewer and lighter SQL queries for uncached category pages. Thank you, @LameuleFR
  • #1306: Replace webpack/Babel/node-sass with esbuild + Dart Sass, migrate to ESLint 10. Thank you, @kpodemski

Google Analytics module

  • #181: Prevent fatal error when product template variable is a Product object. Thank you, @boo-code

Hummingbird theme

  • #1122: Fix add empty deprecated cart-summary-items-subtotal partial. Thank you, @tblivet
  • #1120: Render order messages as plain text on order detail. Thank you, @tblivet
  • #1119: Fix optional label capitalization in contact form. Thank you, @Codencode
  • #1114: Merge 2.x into develop. Thank you, @tblivet

Kanbanbot

PrestaShop Flashlight

Prestashop UI Kit

  • #252: Use font-display: block for the Material Symbols icon font. Thank you, @boo-code

Product Comments module

Ps_onepagecheckout

  • #190: Show a notice on the configuration page when guest checkout is disabled. Thank you, @nicohery
  • #186: Fix php stan. Thank you, @Touxten
  • #185: Align the payment section and footer with the checkout form on desktop. Thank you, @nicohery

The PrestaShop open source project

  • #319: Add Benjamin Bendaoui to committers. Thank you, @Touxten

Traces

  • #259: Fix the sponsor companies reported as not found by topcompanies. Thank you, @nicosomb

UI Testing Library

  • #1141: Wait for the stock list and the bulk update request in the stock bulk edit [OS-146]. Thank you, @mattgoud

Acknowledgments

Thank you to all contributors this month! And a big thank you to everyone who contributes with issues, reviews, and comments on GitHub, including those whose pull requests have not been merged yet.

Coding is only just one of the ways you can contribute. Here are some ideas on how you can get involved in the project.

If you need help with contributing or have questions about it, feel free to contact me, @marsaldev, on the project’s Slack.

Happy contributin’ everyone!