Skip to content

Shopware Community Edition

v6.7.12.0 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 20d API Development
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

api-first-cms apifirst digital-commerce ecommerce ecommerce-platform experience-commerce
+13 more
experience-manager headless-cms magento online-shop online-store php prestashop shop shopping-cart shopware storefront symfony vuejs

Summary

AI summary

Broad release touches Critical Fixes, fix, Administration, and Core.

Full changelog

Do not install

This release cannot be installed or updated to because it contains a breaking issue discovered shortly after release. Please use v6.7.12.1 instead.

We kept the regular release cycle to avoid disrupting continuous integration and versioning for our community. The changes from this version are still listed below, but they are only available by installing v6.7.12.1, which includes a fix for the issue.

System requirements

  • tested on PHP 8.2, 8.4 and 8.5
  • tested on MySQL 8 and MariaDB 11

Features

Agentic files for sales channels

Sales channels can now publish opt-in agentic files such as /llms.txt and /agents.md.
Merchants can manage these files in the sales channel details, enable them per sales channel, preview the generated content, and add custom notes without replacing the default content provided by Shopware or extensions.

Core ships the initial agentic file family.
The files are rendered from Twig templates, so Shopware, plugins, apps, and themes can contribute or extend content through normal Shopware Twig inheritance.
Extensions can add additional templates under Resources/views/files/agentic/**.twig, including nested paths such as .well-known/*.

The Admin API exposes documented action routes for listing, reading details, and previewing sales-channel files under /api/_action/sales-channel-file/{fileFamily}/{salesChannelId}.

Storefront

Storefront cache hash no longer varies by language

The HTTP cache hash no longer includes the language id for storefront requests, because the storefront language is derived from the resolved domain URL.
Store API requests still include the language id in the cache hash, as the same Store API URL can return different languages via the sw-language-id header.

Central extension point for content before/after list prices

A new template @Storefront/storefront/component/product/list-price-affix.html.twig is rendered inside every list price display (product box, product detail buy widget, advanced pricing table). It replaces the deprecated listing.beforeListPrice / listing.afterListPrice snippets as the single place to inject content around list prices.

Content can be provided in two ways:

  • Without code: create a translation snippet with a custom key and enter that key in the new sales-channel-aware system config settings core.listing.beforeListPriceSnippetKey / core.listing.afterListPriceSnippetKey. The snippet content is rendered sanitized, wrapped in a list-price-affix list-price-affix-{before|after} span.
  • In a theme or plugin: override the block component_list_price_affix_content once; the position variable (before / after) allows position-specific output.

Thumbnail sizes attribute now emits a value for the XXL breakpoint

The auto-generated sizes attribute produced by thumbnail.html.twig now includes a value for the XXL breakpoint. The xxl key is the open-ended top (container / columns), and xl is a closed range bounded by breakpoint.xxl - 1, matching the pattern used by smaller breakpoints. Templates that pass a manual sizes map to sw_thumbnails should add an xxl entry to keep parity.

Use Bootstrap variable for headings spacing

The hard-coded CSS margin-bottom was removed from HTML headlines H1-H6. The bootstrap variable $headings-margin-bottom can now be used to set the bottom spacing of headlines.

Storefront XHR login failures now keep HTTP 403

Storefront requests that require a logged-in customer no longer redirect to the login page for XMLHttpRequests when the customer session is no longer valid.
The original 403 Forbidden response is preserved.
Regular page requests still redirect to the login page.
This prevents expired sessions from creating redirect chains from XHR endpoints to page controllers and fixes the follow-up failure where the redirected XHR request reaches the login page, which does not allow XHR access.
JavaScript clients can now handle the failed unauthenticated XHR response explicitly.

Mail templates can access storefront theme configuration

Mail templates rendered for a sales channel now receive a temporary salesChannelContext and the assigned themeId.
This allows Twig helpers such as theme_config() to resolve storefront theme configuration in mails without replacing the existing core context variable.
The shared MailTemplateRenderContextEvent is dispatched for both sent mails and preview/simulation rendering so extensions can enrich mail template data through one hook.

Google Ads Enhanced Conversions

A new Enhanced Conversions option was added to the Google Analytics integration. When enabled in the sales channel analytics settings, the checkout finish page sends the SHA256-hashed customer email address via gtag('set', 'user_data', ...) to support Google Ads Enhanced Conversions. Email addresses are normalized according to Google's requirements before hashing.

A new enhanced_conversions boolean field was added to SalesChannelAnalyticsDefinition and SalesChannelAnalyticsEntity.

New extensible Twig block page_checkout_finish_enhanced_conversions has been added to finish-details.html.twig.

Country state field visibility in address forms

Storefront address forms now respect the country displayStateInRegistration setting.
When disabled, the country state field is hidden unless forceStateInRegistration is enabled, in which case the required state field is still shown.
During the update, displayStateInRegistration is activated for every country that has at least one configured state/region.
This keeps existing storefront address forms showing their state selector until the setting is disabled explicitly.

Checkout gateway blocked method fallback

Storefront checkout cart and confirm page loading now resolves payment and shipping methods blocked by the checkout gateway before rendering the page.
The fallback method is selected from the checkout gateway response, preferring the sales-channel default method when available and otherwise using the first available method declared by the gateway.

Customer address fields are trimmed on new writes

Customer address fields submitted through storefront registration and address updates are now trimmed before they are written.
This prevents leading or trailing whitespace from being stored in standard address fields such as first name, last name, street, city, and zipcode.

Existing customer address records are not changed.

New contentSelector option for the AlertAriaPlugin

The AlertAriaPlugin now supports a contentSelector option to define the content element inside the aria-live region that is toggled to trigger the screenreader.
It defaults to .alert-content-container. Override it when applying the plugin to custom markup that is not based on the alert template:

<div class="cart-live-update visually-hidden"
     role="status"
     aria-live="polite"
     data-alert-aria="true"
     data-alert-aria-options='{{ { contentSelector: ".cart-live-update-content" }|json_encode }}'>
    <div class="cart-live-update-content">
        {# ... content that should be announced ... #}
    </div>
</div>

API

Plain JSON API includes preserve extension wrappers

The Admin API plain JSON encoder now keeps extension association fields inside the extensions object when they are selected through includes.
For example, including an extension association such as toOne on an entity returns extensions.toOne instead of promoting toOne to the top-level response.
Nested extension entities also respect their own include definitions, so API clients can filter extension payload fields consistently.

Customer email uniqueness is enforced on writes

Admin API and Sync API customer writes now enforce the same non-guest customer email uniqueness rules as the Administration customer form and Store API registration flows.
When core.systemWideLoginRegistration.isCustomerBoundToSalesChannel is disabled, a non-guest customer email must be unique globally.
When the setting is enabled, duplicate non-guest emails are only accepted for customers bound to different sales channels.
Extensions can use Shopware\Core\Checkout\Customer\Validation\CustomerEmailUniqueChecker with CustomerEmailUniqueCheck to apply the same configuration-aware uniqueness rules.

Number range previews can target a concrete number range

The Admin API now supports previewing a persisted number range by id via /api/_action/number-range/{numberRangeId}/preview-pattern.
Use this route when editing an existing number range, because it reads the state for the concrete number_range.id.

The previous type-based preview route /api/_action/number-range/preview-pattern/{type} remains available in 6.7 for backwards compatibility, but is deprecated and will be removed in 6.8.
It can only resolve global number ranges and therefore does not support non-global number range state.
The allocation route /api/_action/number-range/reserve/{type} is unchanged.

Empty sw-* id headers are treated as unset

Admin API and Store API requests now treat empty ID headers such as sw-language-id, sw-currency-id, sw-app-integration-id, and sw-app-user-id the same as missing headers.
Empty values fall back to the default request context instead of being forwarded as invalid UUIDs.
Whitespace-only values are still rejected as malformed IDs.

For cache efficiency, clients should consistently either omit sw-language-id and sw-currency-id or send them empty when they intentionally want default context resolution, because these headers can participate in reverse-proxy cache keys.

Administration users receive default runtime privileges

Authenticated Administration users now receive the default privileges required by global Admin helpers: language:read, locale:read, message_queue_stats:read, log_entry:create, currency:read, and country:read.
The Administration role editor also adds these privileges to newly generated role permission sets.

Core

Rule Builder: new "Quantity per item" condition

A new line item rule condition LineItemPerItemQuantityRule (cartLineItemPerItemQuantity) was added. It matches the cart against the quantity of each individual line item, without selecting a specific product.

Storefront snippets of self-managed apps are loaded

Storefront snippet files (Resources/snippet/*.json) shipped by self-managed apps (services) are now loaded.
Previously, the snippet loader resolved app snippets only from the local app directory, which self-managed apps do not have, so their storefront snippets were silently ignored.
The snippet files are now resolved through the app source system, the same way assets, scripts, and admin snippets of self-managed apps already are.
Service developers no longer need to work around missing storefront translations; the same app zip now behaves identically whether installed as a regular app or as a service.

Deprecation of shopware.cache.cache_compression and shopware.cache.cache_compression_method config options

The shopware.cache.cache_compression and shopware.cache.cache_compression_method configuration options are deprecated and will be removed in v6.8.0.0. Please use the new shopware.cache.compress and shopware.cache.compression_method options instead.

Before

shopware:
    cache:
        cache_compression: true
        cache_compression_method: 'gzip'

After

shopware:
    cache:
        compress: true
        compression_method: 'gzip'

Stored mail template type data deprecated

The persisted mail_template_type.template_data column is deprecated and will be removed in Shopware 6.8.
It was only used as stored preview data and is no longer needed after the mail template preview refactoring.

Use explicit templateData in the mail preview and send APIs, or generated data from the simulate endpoint, instead.
The mail API request payloads templateData and mailTemplateData remain supported and are not part of this deprecation.

Pluggable thumbnail image processor

The thumbnail generation pipeline now uses a ThumbnailProcessorInterface instead of a hardwired GD implementation.
Two processors ship out of the box:

  • GdImageThumbnailProcessor — uses the PHP GD extension and is the default.
  • ImagickThumbnailProcessor — uses the PHP Imagick extension, if installed.

Switch between them in config/packages/shopware.yaml:

shopware:
  media:
    thumbnail_processor: imagick   # or "gd" (default)

Both processors work with the new ThumbnailImage DTO (Shopware\Core\Content\Media\Thumbnail\DTO\ThumbnailImage), which is a thin wrapper carrying the underlying image resource.
ThumbnailService only ever deals with ThumbnailImage objects and is fully agnostic of the concrete library.

Core Twig config() helper

The Twig config() helper is now provided by the core Twig environment so non-storefront templates can read sales-channel-aware system configuration.
Twig templates can continue using config('my.config.key') unchanged.

The PHP methods Shopware\Storefront\Framework\Twig\Extension\ConfigExtension::config() and Shopware\Storefront\Framework\Twig\TemplateConfigAccessor::config() are deprecated.
PHP code should use SystemConfigService directly instead.

Number range value generator interface deprecated

NumberRangeValueGeneratorInterface is deprecated in favor of AbstractNumberRangeValueGenerator.
Custom number range value generator implementations and decorators should extend the abstract class instead.
Implement previewPatternByNumberRangeId() for persisted number-range previews and continue using getValue() for actual number allocation.

The type-based previewPattern() method remains available for backwards compatibility in 6.7, but is deprecated and will be removed in 6.8.
Use previewPatternByNumberRangeId() when previewing or editing an existing number range.

Orders no longer break on missing rule conditions in price definitions

If an order's AbsolutePriceDefinition, CurrencyPriceDefinition, or PercentagePriceDefinition references a rule condition that is no longer registered (e.g. a plugin contributing it has been uninstalled), PriceDefinitionFieldSerializer no longer throws ConditionTypeNotFound/InvalidConditionException. Such conditions are substituted with a new internal UnknownConditionRule whose match() always returns false.

The original rule payload is preserved verbatim on reads, order versioning and normal saves, so the order stays fully accessible and editable in the Administration and is restored automatically once the contributing plugin is reinstalled. Recalculation also succeeds, but because it recomputes the cart, a discount whose missing condition no longer matches any line item is removed (fail-closed) rather than preserved — so an order that is recalculated and saved may lose that discount line. When that happens, the recalculation result now contains a promotion-discount-unknown-condition warning (PromotionDiscountUnknownConditionError, shown as a notification in the Administration order detail page), so the discount is not removed silently.

Note that match() returning false only yields a fail-closed result for a standalone condition or inside an AndRule. Inside an OrRule/XorRule the surrounding container can still match through its other branches, and inside a NotRule the result is inverted to always-match.

Note for API consumers: writes to price-definition fields that reference an unregistered rule condition are now accepted instead of rejected, so order versioning and saves keep working. A mistyped condition name in an Admin API write is therefore no longer reported as a validation error — the condition is stored as-is and will simply never match.

Elasticsearch: Dedicated completion field for admin-search autocomplete

Admin-search autocomplete now flows through a new completion field (ngram-indexed, populated with name-shaped values per entity). The ngram subfield has been dropped from text/textBoosted so identifiers (EAN, productNumber, orderNumber, etc.) no longer feed ngram scoring — fixing a regression where a full GTIN search could be outranked by unrelated products with overlapping digit substrings.

Run bin/console es:admin:index after deploying. Identifier search works immediately on the old index; substring autocomplete is degraded to prefix-only until the reindex completes.

Type-safe subscription helpers on Extension

Shopware\Core\Framework\Extensions\Extension now exposes three static helpers — onPre(), onPost(), and onError() — that return the dispatched event name for the corresponding phase. Extensions need ::NAME constant for the methods to work.

Use them in getSubscribedEvents() instead of string concatenation or ExtensionDispatcher::pre/post/error():

public static function getSubscribedEvents(): array
{
    return [
        ResolveListingExtension::onPre()  => 'method1',
        ResolveListingExtension::onPost() => 'method2',
        ResolveListingExtension::onError() => 'method3',
    ];
}

Dispatchers and subscribers no longer have to concatenate event-name strings - it gives type safety, IDE autocomplete, and rename-refactor support. Also subscribers don't have to depend on ExtensionDispatcher.

The previous styles — MyExtension::NAME . '.post' and ExtensionDispatcher::post(MyExtension::NAME) — continue to work and are not deprecated. No migration is required.

Telemetry metrics evolution

The telemetry metrics abstraction behind the TELEMETRY_METRICS feature flag received several improvements ahead of stabilization in 6.8.
See ADR 2026-04-23 for the full reasoning.

  • Breaking: MetricTransportInterface now requires a flush() method. Implement it as a no-op if the transport does not need lifecycle management. A new TelemetryFlushListener calls flush() on kernel.terminate, console.terminate, and (throttled) on WorkerRunningEvent so emissions from long-running workers reach the backend.
  • Global kill-switch shopware.telemetry.metrics.enabled disables emission and removes services tagged shopware.telemetry.subscriber / shopware.telemetry.periodic_metric_collector via a compiler pass — zero overhead when off.
  • Per-label validation policies: each label in a metric definition must declare either allowed_values or policy: open. Unknown values are handled per policy (replace / discard / open), with type-aware defaults (additive types replace, gauges discard). Unknown label names throw in dev/test and log at error level in production; replacements log at notice level in dev/test so typos like GETT vs GET surface during development.
  • PeriodicMetricCollectorInterface: tag a service with shopware.telemetry.periodic_metric_collector to have its metrics collected by the telemetry.collect_periodic_metrics scheduled task (default 5 minutes, tunable via the standard scheduled-task administration). Useful for expensive aggregations and info metrics.
  • New Telemetry facade: inject Telemetry to call emit(ConfiguredMetric) and instrument(callback, DurationMetric?, Span?) for combined duration metrics and profiler spans through a single entry point.
  • Config cleanup: allow_unknown_labels, allow_unknown_label_values, and enable_internal_metrics are deprecated (superseded by per-label policies and per-metric enabled).

Auto-resend double opt-in confirmation email on failed login

When a customer with an unconfirmed double opt-in account tries to log in, Shopware now automatically resends the confirmation email if the original was sent more than a configurable interval ago.

The interval is controlled by the new system config setting core.loginRegistration.doubleOptInResendInterval (default: 24 hours). Setting it to 0 disables the auto-resend entirely.

Successful password recovery now also confirms an unconfirmed double opt-in customer account, because completing the recovery flow proves access to the account email address.

Standardized CLI JSON output flag

CLI commands now consistently use --format json to request JSON output. The previously used --json and --output json options are deprecated and will be removed in Shopware 6.8.0.0.

Affected commands:

  • bin/console user:list --jsonbin/console user:list --format json
  • bin/console app:list --jsonbin/console app:list --format json
  • bin/console plugin:list --jsonbin/console plugin:list --format json
  • bin/console dal:validate --jsonbin/console dal:validate --format json
  • bin/console sales-channel:list --output jsonbin/console sales-channel:list --format json

cache:watch:delayed shuts down gracefully

The cache:watch:delayed command now stops cleanly on SIGINT/SIGTERM instead of being killed mid-loop, and exposes a configurable --interval option (microseconds) for the poll frequency.

New sha256 Twig filter

A new sha256 Twig filter is available alongside the existing md5 filter. Both accept strings and arrays (arrays are JSON-encoded before hashing) and return the hex-encoded hash.

Variants can now be searched by parent product name

The new parent.name search field allows variants to be found through their parent product name and ranked independently from the variant's own name.

The field is disabled by default. Enable parent.name in the product search configuration to make this behavior active and adjust its ranking there.

Reduced product data in listings via description teaser

Product listings can now load a shortened, HTML-free excerpt of the product description instead of the full text, which significantly reduces database load, transfer size and memory usage for catalogs with large descriptions. Previously the complete description was loaded for every product box even though the storefront only displays a few clamped lines.

This reduced loading is enabled for fresh installations and disabled for existing shops, which keep the full listing loading on update and can opt in per sales channel via the new core.listing.partialDataLoading setting (Settings > Products). When enabled, the product listing route loads a curated, reduced field set covering the default product boxes; listing products are then partial entities. Only enable it if your theme and extensions work with the reduced product data in listings.

A new read-only, translatable descriptionTeaser field is available on product (and product_translation). It is derived from the description on write (HTML stripped, truncated to 512 characters) and exposed via the Store and Admin API. The stripping is configurable through the html_sanitizer field set product_translation.descriptionTeaser. Existing products are backfilled asynchronously: the migration schedules the product.description_teaser.indexer, which runs over the message queue after the update (or manually via bin/console dal:refresh:index).

Agentic Commerce product export and tracking classes deprecated

The following classes related to Agentic Commerce product exports, providers, and sales channel tracking are deprecated and will be removed in Shopware 6.8.0:

  • Shopware\Core\Content\ProductExport\Provider\AbstractAgenticCommerceProductExportProvider
  • Shopware\Core\Content\ProductExport\Provider\AgenticCommerceProductExportProviderRegistry
  • Shopware\Core\Content\ProductExport\Provider\GoogleProductExportProvider
  • Shopware\Core\Content\ProductExport\Provider\OpenAiProductExportProvider
  • Shopware\Core\Content\ProductExport\Validator\JsonlRowParser
  • Shopware\Core\Content\ProductExport\Validator\OpenAiProductExportValidator
  • Shopware\Core\Content\ProductExport\Validator\GoogleProductExportValidator

This functionality will be available in the Agentic Commerce extension (SwagAgenticCommerce) instead.

Administration

sw-select-field forwards aria-label to the native select

The deprecated sw-select-field now passes through aria-label and aria-labelledby attributes to the underlying native <select> element. Previously these attributes were applied to the wrapping field component but never reached the form control, leaving selects without an accessible name (e.g. the range picker of sw-chart-card). Plugins that render a sw-select-field without a visible <label> can now give it an accessible name by passing aria-label / aria-labelledby.

Cache-relevant extension configuration fields

As a follow-up to Reduced HTTP cache invalidation on system config changes, plugin and app Resources/config/config.xml files can now mark fields that affect cached storefront output with the cache-relevant="true" attribute on <input-field> or <component>.

When a marked field is changed in the Administration system config renderer, the save request explicitly sends silent=false, so HTTP cache entries tagged with system.config-{salesChannelId} are invalidated. Unmarked fields keep the default system config write behavior.

Storefront icon cache and speculation rules can be configured per sales channel

The Storefront settings Administration page now allows the icon cache and speculation rules settings (core.storefrontSettings.iconCache and core.storefrontSettings.speculationRules) to be configured per sales channel.
core.storefrontSettings.asyncThemeCompilation remains a global setting and was moved into a separate Theme configuration card.

The storefront runtime now resolves the icon cache setting with the active sales channel id, matching the sales-channel-aware speculation rules lookup.
The old sw_settings_storefront_smtp_settings block is deprecated and will be removed in v6.8.0.

Analytics settings split into Configuration and Tracking cards

The analytics settings view in sw-sales-channel-detail-analytics was split into two cards: Configuration (general settings like tracking ID, active state, anonymize IP) and Tracking (order tracking, offcanvas cart tracking, enhanced conversions).

New extensible Twig blocks sw_sales_channel_detail_analytics_configuration, sw_sales_channel_detail_analytics_tracking, sw_sales_channel_detail_analytics_tracking_description, and sw_sales_channel_detail_analytics_fields_enhanced_conversions have been added.

Rule Builder cart total condition labels adjusted

Rule Builder cart total condition labels now describe more clearly which cart value they evaluate. The internal condition names remain unchanged for backwards compatibility.

| Internal name | EN old -> new | DE old -> new | What it checks |
| --- | --- | --- | --- |
| cartCartAmount | Grand total -> Cart total (incl. shipping) | Gesamtsumme -> Warenkorb-Gesamtsumme (inkl. Versand) | cart.price.totalPrice - final cart price incl. shipping/tax/discounts |
| cartPositionPrice | Total -> Cart sum of items (excl. shipping) | Summe -> Summe der Positionen (ohne Versand) | cart.price.positionPrice - sum of all items, no shipping |
| cartGoodsPrice | Subtotal of all items -> Subtotal of goods (excl. discounts/fees) | Zwischensumme aller Positionen -> Zwischensumme der Warenpositionen (ohne Rabatte/Zuschläge) | Sum of goods item prices, excl. shipping/promotions |
| cartTotalPurchasePrice | Total of all purchase prices -> Sum of purchase prices | Summe aller Einkaufspreise -> Summe der Einkaufspreise | Sum of purchase/cost prices across all items |
| cartLineItemTotalPrice | Item subtotal -> Item total (qty × price) | Positionszwischensumme -> Positionssumme (Menge × Preis) | One item's total, quantity multiplied by unit price |
| cartLineItemGoodsTotal | Total quantity of all products -> Total product quantity (units) | Gesamtanzahl aller Produkte -> Gesamtmenge der Produkte (Stück) | Total unit count of goods in the cart |
| cartGoodsCount | Total quantity of distinct products -> Number of distinct products | Gesamtanzahl unterschiedlicher Produkte -> Anzahl unterschiedlicher Produkte | Number of distinct products in the cart |

Rule Builder quantity condition labels disambiguated

| Internal name | EN old -> new | DE old -> new | What it checks |
| --- | --- | --- | --- |
| cartLineItemWithQuantity | Item quantity -> Item with quantity | Positionsanzahl -> Position mit Menge | A specific selected product's quantity |
| cartLineItemsInCartCount | Quantity of distinct items -> Number of distinct items | Anzahl unterschiedlicher Positionen (unchanged) | Number of distinct line items (all types) |
| promotionsInCartCount | Quantity of discounts -> Number of discounts | Anzahl der Rabatte (unchanged) | Number of discount line items |

sw-data-grid column labels fall back to the default locale

Column headers and the column visibility settings in sw-data-grid now resolve their labels against the configured i18n fallback locale when the snippet is missing in the current locale, instead of rendering the raw snippet key. This matches the behavior users expect when a translation is only available in English.

Rule builder shows per-field errors on conditions

Invalid condition inputs are now highlighted individually with a list of the affected fields below the row. All reversed date ranges are reported in one save instead of one at a time.

Reworked timeframe options in sw-date-filter

The order date filter dropdown now offers a 15-entry list, in display order:

  1. Today
  2. Yesterday
  3. Current week
  4. Last 7 days
  5. Previous week
  6. Current month
  7. Last 30 days
  8. Previous month
  9. Current quarter
  10. Previous quarter
  11. Last 3 months
  12. Last 6 months
  13. Last 12 months
  14. Current year
  15. Previous year

"Current ..." entries span the start of the period through today (e.g., current quarter = first day of the quarter through today). "Previous ..." entries cover the full prior period (e.g., previous quarter = the three months before this one). "Last N days/months" remain rolling windows ending today, with calendar-month math (and last-day-of-month clamping) for the months variants so May 31 - 3 months lands on Feb 29 (leap) or Feb 28 (non-leap) rather than rolling forward to March 3.

The previous rolling lastDay (-1) and lastYear (-365) entries are no longer in the dropdown, but saved filter states keep working: the component now aliases -1 to yesterday and -365 to last12Months on both hydration and programmatic selection. The persisted from/to are preserved so existing filters continue to resolve the same data, while the dropdown label catches up to the new vocabulary. All boundaries continue to be normalized to the user's timezone.

Support test file splitting

Administration Jest tests can now be split into multiple files using *.spec/ directories.
ESLint now warns for Administration test files with 500 lines or more and errors for test files with 1000 lines or more.

App action button icons are aligned in Administration context menus

App action buttons that use an app manifest icon now render the icon at the normal context-menu size and align it on the same row as the action label.
Previously, the app logo could render oversized or stacked above the action text in Administration action menus, for example on order detail pages.

Product variants are easier to distinguish in sw-entity-multi-id-select

sw-entity-multi-id-select now displays product variant option details for product repositories in the selected labels and dropdown results.
This helps extensions and plugin configuration UIs that let merchants select multiple products, because variants with inherited product names no longer appear as identical entries.

Outside clicks in dropdowns are identified correctly

Administration dropdowns now identify outside clicks correctly when the browser reports a click target outside the dropdown even though the pointer is still over the dropdown.

Resolving download errors by renaming media

When merchants rename a media file, its URL automatically updates so they can download it without issues.

Agentic Commerce Administration components deprecated

The following Administration component, methods, and computed properties are deprecated and will be removed in Shopware 6.8:

sw-agentic-commerce-tracking-config — entire component deprecated.

sw-sales-channel-modal-grid:

  • computed salesChannelRepository
  • method isAgenticCommerceSalesChannelType()
  • method showAgenticCommerceType()

sw-sales-channel-detail:

  • provide swSalesChannelDetailGetAgenticCommerceExportConfig
  • data agenticCommerceExportConfig
  • computed isAgenticCommerce
  • computed defaultAgenticCommerceExportConfig
  • method validateAgenticCommerceExportConfig()
  • method loadAgenticCommerceExportConfig()
  • method saveAgenticCommerceExportConfig()

sw-sales-channel-create-base:

  • method prefillAgenticCommerceDefaults()

sw-sales-channel-detail-base:

  • inject swSalesChannelDetailGetAgenticCommerceExportConfig
  • computed isAgenticCommerce
  • computed resolvedAgenticCommerceExportConfig
  • method getAgenticCommerceExportElementBind()
  • method getAgenticCommerceExportCardTitle()
  • method getAgenticCommerceExportCardPositionIdentifier()
  • method onAgenticCommerceExportFieldUpdate()

sw-sales-channel-detail-product-comparison:

  • computed isAgenticCommerce

This functionality will be available in the Agentic Commerce extension (SwagAgenticCommerce) instead.

App System

[Opt-in] Webhook delivery rework

Webhook delivery moves to a new dedicated webhook Messenger transport, rolled out behind the WEBHOOKS_REWORK feature flag.
When the flag is disabled (which is the default), the webhook transport forwards to async and Messenger owns retries.
When the flag is enabled, every webhook is persisted to a database-backed outbox before the first HTTP attempt, and Shopware controls when and how often each delivery is retried.

With the flag enabled:

  • Failed deliveries are retried for up to four hours. Failures back off on a fixed 5s → 30s → 5min → 30min → 4h schedule, so a brief DNS outage or upstream restart does not exhaust retries before the endpoint recovers.
  • Synchronous deliveries are audited. Deliveries that bypass the queue — those triggered by the admin worker or by forced-sync app lifecycle calls — produce the same audit row as async deliveries, so failures on those paths are inspectable in the database and via the Admin API.
  • In-flight deliveries survive worker crashes. If a worker dies while sending a webhook, the next worker picks up the in-flight delivery and retries it.
  • Identity headers on every HTTP POST. Every request carries X-Shopware-Event-Id, X-Shopware-Sequence, and X-Shopware-Attempt headers plus a source.sequence field in the body. Consumers can use them to deduplicate retries and reorder events independent of HTTP arrival order. The same headers ship for every webhook, regardless of how it is delivered.

Enabling the flag requires configuration changes — the worker consume command must list the new webhook transport, and shopware.admin_worker.transports may need updating if it was overridden. Rolling the flag back off also has its own steps. See UPGRADE-6.7.md for the full procedure.

Tracked in shopware/shopware#16560.

Tax provider priority is preserved across app updates

An app tax provider's priority is now only seeded from the manifest when the provider is first installed. App updates no longer touch the priority, so the merchant's manual ordering is retained.

Hosting & Configuration

Google Storage supports application default credentials

Google Storage filesystem configurations can now omit keyFile and keyFilePath.
When neither option is configured, Shopware lets the Google Cloud PHP SDK resolve credentials through Application Default Credentials, such as GOOGLE_APPLICATION_CREDENTIALS, local ADC files, or attached service accounts in Google Cloud environments.
See Google's PHP client authentication guide for the PHP library lookup behavior.

Critical Fixes

Admin worker no longer blocks same-session API requests on PHP session locks

Fixed a session-locking issue that could slow down concurrent Administration requests when the browser-based admin worker is used together with native PHP file session storage.
In that setup, an admin queue worker request could initialize the current PHP session while consuming messages and keep the session file locked until the long-poll request returned.
Concurrent Admin API requests from the same browser session, for example sync or save requests, no longer wait for that admin worker session lock.

What's Changed

  • fix: validate product comparison sales channel language by @LukasVoeller in https://github.com/shopware/shopware/pull/16871
  • fix: keep 403 for unauthenticated storefront XHR by @keulinho in https://github.com/shopware/shopware/pull/16663
  • fix: preview number ranges by id by @keulinho in https://github.com/shopware/shopware/pull/16800
  • fix: correct sales channel product collection phpdoc by @keulinho in https://github.com/shopware/shopware/pull/16893
  • fix: business event payload encoding by @jozsefdamokos in https://github.com/shopware/shopware/pull/16887
  • fix: Make classes final instead of internal by @mitelg in https://github.com/shopware/shopware/pull/16914
  • fix: Always treat changed cookies when accepting all cookies through the cookie bar by @aragon999 in https://github.com/shopware/shopware/pull/16553
  • fix: Also enable google analytics integration when only the Google Ads cookie has been accepted by @aragon999 in https://github.com/shopware/shopware/pull/16554
  • feat: rework webhooks to support FIFO consumer and application level outbox by @Gaitholabi in https://github.com/shopware/shopware/pull/16692
  • fix: add dedicated category-name CMS element (#14871) by @MartinKrzykawski in https://github.com/shopware/shopware/pull/16772
  • fix: prevent missing notification titles from crashing growl banners by @keulinho in https://github.com/shopware/shopware/pull/16863
  • fix: use sku as ga item id by @dneustadt in https://github.com/shopware/shopware/pull/16906
  • fix: catch transport exceptions in ElasticsearchHelper::allowIndexing by @vienthuong in https://github.com/shopware/shopware/pull/16898
  • fix: audit #16883 by @patzick in https://github.com/shopware/shopware/pull/16930
  • fix: allow Google Storage default credentials by @keulinho in https://github.com/shopware/shopware/pull/16894
  • fix: restore nullable inherited filesystem config by @keulinho in https://github.com/shopware/shopware/pull/16947
  • fix(storefront): emit XXL breakpoint value in thumbnail sizes attribute by @ShopGandalf in https://github.com/shopware/shopware/pull/16825
  • feat: add enhanced conversions support by @BrocksiNet in https://github.com/shopware/shopware/pull/15233
  • feat: inject sw-language-id header into Store API operations by @BrocksiNet in https://github.com/shopware/shopware/pull/15616
  • fix: enforce overwrite for ListField in VersionManager by @nfortier-shopware in https://github.com/shopware/shopware/pull/14291
  • refactor: use app lifecycle persister for MCP by @AydinHassan in https://github.com/shopware/shopware/pull/16966
  • fix: dynamic product groups not updating in storefront by @nguyenytran in https://github.com/shopware/shopware/pull/15955
  • fix(storefront): strip front-controller script name from virtual-path SEO URLs by @nguyenytran in https://github.com/shopware/shopware/pull/16758
  • fix: show maintenance mode error in admin orders by @untilu29 in https://github.com/shopware/shopware/pull/16828
  • fix: superseded ADR link by @bojanrajh in https://github.com/shopware/shopware/pull/16935
  • feat: add Google feed_label field for product comparison by @MartinKrzykawski in https://github.com/shopware/shopware/pull/16880
  • fix: Typo by @marcelbrode in https://github.com/shopware/shopware/pull/16973
  • feat(sso): always use system sender mail address by @fschmtt in https://github.com/shopware/shopware/pull/16680
  • fix: pos column width and tighter row spacing on documents by @larskemper in https://github.com/shopware/shopware/pull/16857
  • fix(elasticsearch): isolate admin search autocomplete on a completion field by @vienthuong in https://github.com/shopware/shopware/pull/16334
  • fix(storefornt-js): event listener removal by @tobiasberge in https://github.com/shopware/shopware/pull/16934
  • refactor: replace native time usage with psr clock in after-sales by @umutdogan4291 in https://github.com/shopware/shopware/pull/16916
  • fix: integration admin save by @Bird87ZA in https://github.com/shopware/shopware/pull/16978
  • fix: Only use MySQL constant if supported by @mitelg in https://github.com/shopware/shopware/pull/17031
  • fix: provide storefront context for mail templates by @keulinho in https://github.com/shopware/shopware/pull/16861
  • fix: Checking for unregistered feature flag in Twig by @Phil23 in https://github.com/shopware/shopware/pull/17000
  • fix: Silence breadcrumb deprecation message by @Phil23 in https://github.com/shopware/shopware/pull/17025
  • fix(cms): Downscale embedded images in rich text editor by @marcelbrode in https://github.com/shopware/shopware/pull/17023
  • refactor: replace native time usage with psr clock in inventory by @umutdogan4291 in https://github.com/shopware/shopware/pull/16942
  • refactor: introduce app manager by @AydinHassan in https://github.com/shopware/shopware/pull/16983
  • fix(admin): prevent media replace failure when used in product slot config by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17006
  • fix: webhook transport DI resolution endless loop by @Gaitholabi in https://github.com/shopware/shopware/pull/17021
  • fix: Fix issue reordered terms can return fewer obvious matches by @tamvt in https://github.com/shopware/shopware/pull/16519
  • fix: remove faker dependency from mail simulation by @jozsefdamokos in https://github.com/shopware/shopware/pull/16908
  • refactor: replace native time usage with psr clock in checkout by @umutdogan4291 in https://github.com/shopware/shopware/pull/16909
  • fix: move the revocation button out of the collapsible section by @DennisGarding in https://github.com/shopware/shopware/pull/17015
  • fix: empty since version in Feature deprecation notices by @nfortier-shopware in https://github.com/shopware/shopware/pull/17009
  • fix(categories): Remove sub-category limit by @marcelbrode in https://github.com/shopware/shopware/pull/17029
  • fix(administration): rename UI text behind buttons in sw-confirm-field by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17030
  • fix: reuse existing media when importing app payment method icons by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17059
  • fix: constraint app action button size to 16x16 by @gweiermann in https://github.com/shopware/shopware/pull/17047
  • fix: rule multi selection by @jozsefdamokos in https://github.com/shopware/shopware/pull/17050
  • feat: add tie_breaker for dis_max queries by @vienthuong in https://github.com/shopware/shopware/pull/16169
  • fix: avoid busy polling admin worker queue by @keulinho in https://github.com/shopware/shopware/pull/17046
  • fix: respect to-many association limits by @keulinho in https://github.com/shopware/shopware/pull/17019
  • fix(media): declare ext-xmlreader composer requirement by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17020
  • fix: prevent shortcut tooltip from overlapping save button by @DennisGarding in https://github.com/shopware/shopware/pull/17045
  • fix(storefront): offcanvas back-link returns to main entry from footer subtree by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17008
  • fix: Storefront JS crash on failed plugin load by @Phil23 in https://github.com/shopware/shopware/pull/16999
  • fix: stop user save loading on duplicate email by @keulinho in https://github.com/shopware/shopware/pull/17062
  • fix(administration): fall back to default locale for sw-data-grid column labels by @shyim in https://github.com/shopware/shopware/pull/16824
  • fix: prevent 0 byte media uploads by @dneustadt in https://github.com/shopware/shopware/pull/17061
  • fix: incorrect guest customer wording in order-related mail templates by @DennisGarding in https://github.com/shopware/shopware/pull/17027
  • feat: introduce thumbnail processors by @dneustadt in https://github.com/shopware/shopware/pull/16976
  • fix: incomplete product export with variants excluded by @dneustadt in https://github.com/shopware/shopware/pull/17083
  • fix: search bar sales channel shortcut pluralization by @dneustadt in https://github.com/shopware/shopware/pull/17089
  • fix: adjust rule naming to be less confusing by @MalteJanz in https://github.com/shopware/shopware/pull/17044
  • fix: trim storefront request data bag values by @DennisGarding in https://github.com/shopware/shopware/pull/17052
  • fix(cms-slider): Item count on minimal adjusted by @marcelbrode in https://github.com/shopware/shopware/pull/17054
  • fix(snippets): Cast non-string snippets to string by @marcelbrode in https://github.com/shopware/shopware/pull/17071
  • fix(ci): missing git files in artifact by @fruppel in https://github.com/shopware/shopware/pull/16886
  • feat: configure elasticsearch similiarity by @vienthuong in https://github.com/shopware/shopware/pull/16188
  • fix: avoid redundant order create context updates by @jozsefdamokos in https://github.com/shopware/shopware/pull/17104
  • feat: add exact match subfield by @vienthuong in https://github.com/shopware/shopware/pull/16495
  • fix: allow storefront settings per sales channel by @keulinho in https://github.com/shopware/shopware/pull/16963
  • feat: improved telemetry abstraction by @h1k3r in https://github.com/shopware/shopware/pull/16624
  • fix: announce active category to screen readers via aria-current by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17105
  • revert: fix: trim storefront request data bag values by @mstegmeyer in https://github.com/shopware/shopware/pull/17129
  • feat: Add google feed support for agentic commerce by @alexdumea in https://github.com/shopware/shopware/pull/16945
  • fix: Properly reset search term in admin lists by @Phil23 in https://github.com/shopware/shopware/pull/17084
  • fix: refresh order tag list after state change by @vintagesucks in https://github.com/shopware/shopware/pull/17107
  • fix(storefront): prevent double request on top-level category click without sub-categories by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17099
  • fix(core): treat empty sw-* id headers as unset by @ShopGandalf in https://github.com/shopware/shopware/pull/16839
  • fix: allow clearing inherited config fields by @umutdogan4291 in https://github.com/shopware/shopware/pull/17051
  • fix: cleanup mailer settings appearance by @larskemper in https://github.com/shopware/shopware/pull/17136
  • fix: storefront method switchers in combination with CheckoutGateway by @mstegmeyer in https://github.com/shopware/shopware/pull/16780
  • fix: prevent stale cart quantity on browser back by @vintagesucks in https://github.com/shopware/shopware/pull/17137
  • fix: Improve order address details in admin by @Phil23 in https://github.com/shopware/shopware/pull/17093
  • feat: Resend double optin mail when the customer account has not been activated by @aragon999 in https://github.com/shopware/shopware/pull/16081
  • fix: add array return type to getSubscribedEvents in three subscribers by @umutdogan4291 in https://github.com/shopware/shopware/pull/17004
  • feat: Allow merge into non live version by @thuylt in https://github.com/shopware/shopware/pull/16733
  • fix: Special characters break technical terms by @tamvt in https://github.com/shopware/shopware/pull/16010
  • fix(admin): allow empty address IDs on anonymous context switch by @daniel3010 in https://github.com/shopware/shopware/pull/16922
  • feat: add between operator for date rule conditions by @larskemper in https://github.com/shopware/shopware/pull/16907
  • fix: add support for radio groups in formValidation by @tobiasberge in https://github.com/shopware/shopware/pull/13408
  • fix(mailer): Snippet split in mailer by @marcelbrode in https://github.com/shopware/shopware/pull/17160
  • fix: vulnerabilities audit by @patzick in https://github.com/shopware/shopware/pull/17156
  • fix: PHPBench execution by @mitelg in https://github.com/shopware/shopware/pull/17168
  • fix: Use non-deprecated newsletter subscribe/unsubscribe methods by @aragon999 in https://github.com/shopware/shopware/pull/17038
  • refactor: replace native time usage with psr clock in data-services by @umutdogan4291 in https://github.com/shopware/shopware/pull/16943
  • feat: allow thumbnail url length to be 2048 chars for external thumbnail usage by @benni-richter in https://github.com/shopware/shopware/pull/17036
  • fix: Add release information for versions 6.7.12.0 and 6.7.13.0 by @flegarjur in https://github.com/shopware/shopware/pull/16775
  • fix: migrate language settings to meteor tokens by @larskemper in https://github.com/shopware/shopware/pull/17139
  • fix: preserve extension includes in JSON encoder by @keulinho in https://github.com/shopware/shopware/pull/17140
  • feat: extended event system extension helper methods by @h1k3r in https://github.com/shopware/shopware/pull/17115
  • feat: add support for splitting up test files in admin by @gweiermann in https://github.com/shopware/shopware/pull/16660
  • feat(admin): add explicit calendar-based timeframe options to sw-date-filter by @zaifastafa in https://github.com/shopware/shopware/pull/16873
  • fix: admin login default language by @jozsefdamokos in https://github.com/shopware/shopware/pull/17076
  • feat(elasticsearch): enhance word_delimiter_graph filter by @vienthuong in https://github.com/shopware/shopware/pull/16496
  • feat: Search result should include products when parent product name matches by @tamvt in https://github.com/shopware/shopware/pull/15945
  • fix(administration): raise sales channel limit in number-range detail by @shyim in https://github.com/shopware/shopware/pull/17081
  • feat: migrate users & permissions to meteor tokens by @larskemper in https://github.com/shopware/shopware/pull/17189
  • feat(elasticsearch): apply length normalization to customSearchKeywords by @vienthuong in https://github.com/shopware/shopware/pull/16497
  • fix: mcp server code quality improvements by @BrocksiNet in https://github.com/shopware/shopware/pull/17016
  • fix: replace twig escaper by @jozsefdamokos in https://github.com/shopware/shopware/pull/17133
  • fix: mapping definitions break mail simulation by @jozsefdamokos in https://github.com/shopware/shopware/pull/17192
  • fix: trim customer address input on write by @DennisGarding in https://github.com/shopware/shopware/pull/17188
  • refactor: replace native time usage with psr clock in framework by @umutdogan4291 in https://github.com/shopware/shopware/pull/16891
  • fix: Add revocation button to minimal footer by @DennisGarding in https://github.com/shopware/shopware/pull/17186
  • feat(elasticsearch): tighten fuzziness policy for precision by @vienthuong in https://github.com/shopware/shopware/pull/16498
  • feat: display database name in system:setup:staging command confirmation by @lacknere in https://github.com/shopware/shopware/pull/17195
  • fix(api): declare _criteria query parameter for GET /store-api/product-listing by @mkucmus in https://github.com/shopware/shopware/pull/17204
  • fix(admin): correctly identify outside click in sw-select-base by @gweiermann in https://github.com/shopware/shopware/pull/17103
  • fix: respect release dates in delivery availability by @tamvt in https://github.com/shopware/shopware/pull/16643
  • feat(elasticsearch): add configurable minScore via system_config by @vienthuong in https://github.com/shopware/shopware/pull/16499
  • fix: hide agentic commerce sales channel type conditionally by @dneustadt in https://github.com/shopware/shopware/pull/17218
  • fix(media): apply search term on route query change by @rittou in https://github.com/shopware/shopware/pull/17185
  • feat: display variants in sw-entity-multi-id-select by @davidtraum in https://github.com/shopware/shopware/pull/16965
  • refactor(elasticsearch): tokenize search term inline at call sites by @vienthuong in https://github.com/shopware/shopware/pull/16500
  • fix: category seo url index on active state change by @dneustadt in https://github.com/shopware/shopware/pull/17230
  • fix: cookie consent buttons on zoom by @jozsefdamokos in https://github.com/shopware/shopware/pull/17254
  • fix: set correct position when adding media via bulk edit by @nguyenytran in https://github.com/shopware/shopware/pull/16210
  • fix: Revert "replace twig escaper" by @mitelg in https://github.com/shopware/shopware/pull/17282
  • fix: file name conflicts on replacing media by @dneustadt in https://github.com/shopware/shopware/pull/17249
  • feat: standardize CLI output format options across commands by @shyim in https://github.com/shopware/shopware/pull/16721
  • feat: migration cache settings to meteor by @larskemper in https://github.com/shopware/shopware/pull/17267
  • fix: card border cutoff by @larskemper in https://github.com/shopware/shopware/pull/17262
  • fix: language switch in cms detail by @dneustadt in https://github.com/shopware/shopware/pull/17258
  • refactor(elasticsearch): rename word_delimiter analyzers to technical_term by @vienthuong in https://github.com/shopware/shopware/pull/17279
  • fix: prevent sw-modal from closing on ESC by @sydinh in https://github.com/shopware/shopware/pull/17238
  • fix: hide inactive webhook admin worker transport by @keulinho in https://github.com/shopware/shopware/pull/17312
  • fix: footer columns accessibility by @jozsefdamokos in https://github.com/shopware/shopware/pull/17276
  • fix: media item name overflow by @ricoround in https://github.com/shopware/shopware/pull/17281
  • refactor: move admin asset enrichment out of Core InfoController by @nfortier-shopware in https://github.com/shopware/shopware/pull/17114
  • feat: add codemod for transforming vue components to sfc by @jleifeld in https://github.com/shopware/shopware/pull/15673
  • feat(admin): payments main entry point by @mstegmeyer in https://github.com/shopware/shopware/pull/17321
  • fix: prevent negative checkedElementsCount in category tree by @zukucker in https://github.com/shopware/shopware/pull/17322
  • refactor: move StorefrontRenderEvent subscription out of Core by @nfortier-shopware in https://github.com/shopware/shopware/pull/17094
  • feat: add Twig compile-time feature optimization by @shyim in https://github.com/shopware/shopware/pull/16597
  • refactor: decouple Storefront from UninstallAppCommand by @nfortier-shopware in https://github.com/shopware/shopware/pull/17117
  • refactor: move ThemeCompiler asset wiring out of Core compiler pass by @nfortier-shopware in https://github.com/shopware/shopware/pull/17122
  • refactor: improve speed of remote thumbnail generation by @M-arcus in https://github.com/shopware/shopware/pull/17280
  • fix: make svg violation exceptions more verbose by @dneustadt in https://github.com/shopware/shopware/pull/17194
  • fix: restore third level admin menu flyout by @vintagesucks in https://github.com/shopware/shopware/pull/17268
  • fix: migrate mcp settings to meteor tokens by @larskemper in https://github.com/shopware/shopware/pull/17196
  • feat: add generic deprecated & flow-only warnings in rule builder by @larskemper in https://github.com/shopware/shopware/pull/17291
  • fix: rule builder field alignment by @larskemper in https://github.com/shopware/shopware/pull/17275
  • feat(cms): Implement product name & manufacturer logo as standalone elements by @marcelbrode in https://github.com/shopware/shopware/pull/17233
  • fix: match constant-form ACL keys in route attribute PHPStan rule + apply correct name on new findings by @nfortier-shopware in https://github.com/shopware/shopware/pull/17327
  • fix(list-price): Remove unused before/after list pridce snippet by @marcelbrode in https://github.com/shopware/shopware/pull/17333
  • fix: avoid lazy session in sales channel tracking by @keulinho in https://github.com/shopware/shopware/pull/17332
  • feat(product-listing): Implement product descriptionTeaser by @marcelbrode in https://github.com/shopware/shopware/pull/17259
  • fix: Fix category tree reopening collapsed root categories by @DennisGarding in https://github.com/shopware/shopware/pull/17349
  • fix(price-display): Implement snippet addition solution for list prices by @marcelbrode in https://github.com/shopware/shopware/pull/17353
  • fix(administration): no 400 on custom-fields request when none exist by @BrocksiNet in https://github.com/shopware/shopware/pull/17032
  • fix: service can uninstall itself without permissions, and only itself by @AydinHassan in https://github.com/shopware/shopware/pull/17375
  • fix: handle missing rule conditions in price definitions by @daniel3010 in https://github.com/shopware/shopware/pull/16969
  • refactor(product-listing): remove admin description teaser preview + enable opt-out on install by @marcelbrode in https://github.com/shopware/shopware/pull/17361
  • fix(a11y): labels in offcanvas cart by @tobiasberge in https://github.com/shopware/shopware/pull/17405
  • fix(a11y): announce offcanvas cart alers in screenreader by @tobiasberge in https://github.com/shopware/shopware/pull/17341
  • refactor: improve and rename app persisters by @AydinHassan in https://github.com/shopware/shopware/pull/17344
  • refactor: handle theme app lifecycle via lifecycle handler hooks by @AydinHassan in https://github.com/shopware/shopware/pull/17387
  • fix: add missing administration read privileges by @keulinho in https://github.com/shopware/shopware/pull/16981
  • fix: add default admin user privileges by @keulinho in https://github.com/shopware/shopware/pull/17048
  • fix: load admin search length from info config by @keulinho in https://github.com/shopware/shopware/pull/17049
  • fix: register services in owning bundles by @keulinho in https://github.com/shopware/shopware/pull/17299
  • fix(administration): avoid empty highlight regex for ES search by @nguyenquocdaile in https://github.com/shopware/shopware/pull/17386
  • fix: Disable storefront cache for affiliate tracking URLs by @DennisGarding in https://github.com/shopware/shopware/pull/17388
  • fix: select result list border by @larskemper in https://github.com/shopware/shopware/pull/17403
  • fix: add error handling to admin bulk order document generation by @ennasus4sun in https://github.com/shopware/shopware/pull/15932
  • fix: exclude export sales channels from sales channel rule condition by @dneustadt in https://github.com/shopware/shopware/pull/17410
  • fix: set cms_page_version_id when backfilling default category cms page by @rittou in https://github.com/shopware/shopware/pull/17245
  • perf: reduce storefront cache hash language permutations by @keulinho in https://github.com/shopware/shopware/pull/17420
  • fix(checkout): restore customer context on login after token revoke by @taltholtmann in https://github.com/shopware/shopware/pull/17422
  • fix: respect cache-relevant system config fields by @keulinho in https://github.com/shopware/shopware/pull/17413
  • fix: make media delete restricted exception more verbose by @dneustadt in https://github.com/shopware/shopware/pull/17329
  • fix: pass customer from aware triggers to rules by @dneustadt in https://github.com/shopware/shopware/pull/17378
  • perf: prune node_modules from PHPStan's directory walk via computed paths by @AydinHassan in https://github.com/shopware/shopware/pull/17421
  • feat: Add retry middleware for StoreClient by @bneumann97 in https://github.com/shopware/shopware/pull/17235
  • perf: read method bodies lazily in DeprecatedMethodsThrowDeprecationRule by @AydinHassan in https://github.com/shopware/shopware/pull/17407
  • fix: keep product slider configured ids order by @dneustadt in https://github.com/shopware/shopware/pull/17424
  • fix: Improve import map generation by @Phil23 in https://github.com/shopware/shopware/pull/17460
  • fix: flaky controller rate limiter test clock mock by @dneustadt in https://github.com/shopware/shopware/pull/17467
  • fix: respect country state display setting by @keulinho in https://github.com/shopware/shopware/pull/17161
  • refactor: replace native time usage with psr clock in discovery by @umutdogan4291 in https://github.com/shopware/shopware/pull/16932
  • fix: speed up media library sorting by @keulinho in https://github.com/shopware/shopware/pull/17175
  • fix: polish service banner by @larskemper in https://github.com/shopware/shopware/pull/17409
  • fix: correct order billing address detail route by @mstegmeyer in https://github.com/shopware/shopware/pull/17480
  • fix: unify compress and compression_method config options by @lacknere in https://github.com/shopware/shopware/pull/17369
  • fix: promotion tag field tooltip by @lernhart in https://github.com/shopware/shopware/pull/17412
  • fix: promotion calculator with non stackable line items by @lernhart in https://github.com/shopware/shopware/pull/17468
  • fix: remove hasOwnProperty by @FlorianKe in https://github.com/shopware/shopware/pull/17414
  • fix: open configurable extensions from extension card by @DennisGarding in https://github.com/shopware/shopware/pull/17497
  • fix: remove fixed item price option for shipping cost discounts by @jozsefdamokos in https://github.com/shopware/shopware/pull/17469
  • fix: Write state machine history and state atomically by @dereuromark in https://github.com/shopware/shopware/pull/17334
  • fix: confirm double opt-in customer after password reset by @mstegmeyer in https://github.com/shopware/shopware/pull/17153
  • fix: load storefront snippets for self-managed apps by @mstegmeyer in https://github.com/shopware/shopware/pull/17350
  • fix: wishlist local storage race condition by @dneustadt in https://github.com/shopware/shopware/pull/17443
  • feat: add per-item quantity rule condition by @larskemper in https://github.com/shopware/shopware/pull/17440
  • fix: Sort sales channel detail selections alphabetically by @DennisGarding in https://github.com/shopware/shopware/pull/17437
  • fix: Adjust privacy notice handling in revocation request form by @DennisGarding in https://github.com/shopware/shopware/pull/17463
  • fix: add XXL thumbnail sizes to product boxes by @DennisGarding in https://github.com/shopware/shopware/pull/17478
  • fix: sw-date-filter browser timezone influence by @gweiermann in https://github.com/shopware/shopware/pull/16927
  • fix: align simple search field focus radius with pill shape in administration by @ricoround in https://github.com/shopware/shopware/pull/17287
  • fix: depend on ClientRepositoryInterface in McpAuthenticationListener by @shyim in https://github.com/shopware/shopware/pull/17506
  • fix: apply new variant exclusions during regeneration by @nguyenquocdaile in https://github.com/shopware/shopware/pull/17346
  • fix: escape restrict-delete meta field alias for MariaDB by @nfortier-shopware in https://github.com/shopware/shopware/pull/17530
  • fix: remove duplicate fast-uri override by @sydinh in https://github.com/shopware/shopware/pull/17347
  • fix: media field popover clipped in modal by @dneustadt in https://github.com/shopware/shopware/pull/17491
  • fix: adjust created by admin label positioning on customer detail by @jozsefdamokos in https://github.com/shopware/shopware/pull/17528
  • feat: improve rule builder condition value error by @larskemper in https://github.com/shopware/shopware/pull/17306
  • fix: respect explicit product selections from dynamic product group in grouped product listings by @rittou in https://github.com/shopware/shopware/pull/15865
  • fix(acceptance): flaky cover-image assertion on product listing by @ngocblue in https://github.com/shopware/shopware/pull/17479
  • fix: emit mapping after inline order address creation by @Aliaaaam in https://github.com/shopware/shopware/pull/17543
  • fix: align product detail card headlines by @DennisGarding in https://github.com/shopware/shopware/pull/17518
  • fix(administration): do not link to removed products from order page by @patzick in https://github.com/shopware/shopware/pull/17034
  • fix(admin): improve sw-data-grid maximum selection display by @rittou in https://github.com/shopware/shopware/pull/17217
  • feat: add sales channel files by @keulinho in https://github.com/shopware/shopware/pull/17143
  • fix: rule builder create acceptance test by @larskemper in https://github.com/shopware/shopware/pull/17464
  • fix: enforce customer email uniqueness on writes by @keulinho in https://github.com/shopware/shopware/pull/17170
  • fix: Set childList to trigger recalculateSlider by @alexdumea in https://github.com/shopware/shopware/pull/17560
  • fix: consider footer navigation tree children as page urls by @lacknere in https://github.com/shopware/shopware/pull/17554
  • fix: unify extension store date formatting by @DennisGarding in https://github.com/shopware/shopware/pull/17568
  • feat(mcp): add Store API MCP server endpoint by @BrocksiNet in https://github.com/shopware/shopware/pull/17228
  • fix: stabilize bulk-edit grid value read-back timing race by @ngocblue in https://github.com/shopware/shopware/pull/17558
  • fix: Align status indicator landing page by @alexdumea in https://github.com/shopware/shopware/pull/17544
  • fix(a11y): bootstrap focus-trap for ajaxModals and OffCanvas by @tobiasberge in https://github.com/shopware/shopware/pull/17501
  • feat: Show admin warning for existing Agentic Product Feed Channels by @dgrothaus-sw in https://github.com/shopware/shopware/pull/17548
  • fix: Restrict links to dropdown nav only by @alexdumea in https://github.com/shopware/shopware/pull/17570
  • fix(docs): agent skills by @bojanrajh in https://github.com/shopware/shopware/pull/17533
  • fix: strip disabled flag from custom field config in rule builder renderer by @leitge in https://github.com/shopware/shopware/pull/17416
  • fix(administration): deleted customer handling in order details by @patzick in https://github.com/shopware/shopware/pull/16998
  • fix: elasticsearch bulk refresh test flakiness by @dneustadt in https://github.com/shopware/shopware/pull/17481
  • fix: make Migration1773329152AddAgenticAiSalesChannelType idempotent by @dgrothaus-sw in https://github.com/shopware/shopware/pull/17593
  • fix(bootstrap): remove hard-coded headline margin by @tobiasberge in https://github.com/shopware/shopware/pull/17581
  • refactor: cache watch signalable by @nfortier-shopware in https://github.com/shopware/shopware/pull/17609
  • fix: treat unitless CMS image min-height as pixels by @MartinKrzykawski in https://github.com/shopware/shopware/pull/17590
  • feat: triage automation hardening by @umutdogan4291 in https://github.com/shopware/shopware/pull/17584
  • fix(admin): forward aria-label to native select in sw-select-field by @shyim in https://github.com/shopware/shopware/pull/17614
  • fix: remove label command on triage automation by @umutdogan4291 in https://github.com/shopware/shopware/pull/17639
  • fix(snippets): Fix localization issues by @marcelbrode in https://github.com/shopware/shopware/pull/17633
  • fix: migrations using the CreateMailTemplateTrait on Systems with foreign default language (backport: 6.7.12.x) by @shopware-octo-sts-app[bot] in https://github.com/shopware/shopware/pull/17700
  • fix: Revert "fix: respect explicit product selections from dynamic product group in grouped product listings (#15865)" (backport: 6.7.12.x) by @shopware-octo-sts-app[bot] in https://github.com/shopware/shopware/pull/17696
  • fix: repair revocation request setup for regional languages (backport: 6.7.12.x) by @shopware-octo-sts-app-2[bot] in https://github.com/shopware/shopware/pull/17712
  • feat: Add agentic sales channel files (backport: 6.7.12.x) by @shopware-octo-sts-app-2[bot] in https://github.com/shopware/shopware/pull/17759
  • fix: inherit storefront sales channel toggle values (backport: 6.7.12.x) by @shopware-octo-sts-app[bot] in https://github.com/shopware/shopware/pull/17914
  • fix: prevent review listing filter crash (backport: 6.7.12.x) by @shopware-octo-sts-app[bot] in https://github.com/shopware/shopware/pull/17922
  • fix: mcp tool discovery vendor install (backport: 6.7.12.x) by @shopware-octo-sts-app-2[bot] in https://github.com/shopware/shopware/pull/17935
  • fix: add conflict repo (backport: 6.7.12.x) by @shopware-octo-sts-app[bot] in https://github.com/shopware/shopware/pull/18034

New Contributors

  • @grooverdan made their first contribution in https://github.com/shopware/shopware/pull/3454
  • @benni-richter made their first contribution in https://github.com/shopware/shopware/pull/17036
  • @ricoround made their first contribution in https://github.com/shopware/shopware/pull/17281
  • @bneumann97 made their first contribution in https://github.com/shopware/shopware/pull/17235
  • @ngocblue made their first contribution in https://github.com/shopware/shopware/pull/17479
  • @leitge made their first contribution in https://github.com/shopware/shopware/pull/17416

Full Changelog: https://github.com/shopware/shopware/compare/v6.7.11.1...v6.7.12.0

Get in touch

Discuss about decisions, bugs you might stumble upon, etc in our community discord. See you there ;)

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Shopware Community Edition

Get notified when new releases ship.

Sign up free

About Shopware Community Edition

PHP based open source e-commerce software made in Germany.

All releases →

Beta — feedback welcome: [email protected]