<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Spryker Documentation</title>
        <description>Spryker documentation center.</description>
        <link>https://docs.spryker.com/</link>
        <atom:link href="https://docs.spryker.com/feed.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Fri, 14 Aug 2026 12:15:10 +0000</lastBuildDate>
        <generator>Jekyll v4.2.2</generator>
        
        
        <item>
            <title>Upgrade Workflow</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;spryker-upgrade&lt;/code&gt; skill is available from &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt; version 0.6.4, which ships version 0.4.0 of the &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin.&lt;/p&gt;
&lt;p&gt;To update the Claude Code plugin, run &lt;code&gt;/plugin&lt;/code&gt; in Claude Code and update &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; from the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace to version 0.4.0 or later. For installation instructions, see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-skill-does&quot;&gt;What the skill does&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/upgrade.png&quot; alt=&quot;upgrade&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;spryker-upgrade&lt;/code&gt; upgrades your project’s modules and features to a newer Spryker release. It is built for projects with heavy &lt;code&gt;src/Pyz&lt;/code&gt; customization, where the dangerous part of an upgrade is not the code that stops compiling but the code that keeps running while doing nothing.&lt;/p&gt;
&lt;p&gt;The skill combines an orchestrated workflow with a set of deterministic detector scripts. Each script is a standalone CLI that runs on host PHP using reflection or static parsing only, with no Spryker bootstrap — so they also work in CI.&lt;/p&gt;
&lt;p&gt;Invoke it with &lt;em&gt;“upgrade the project”&lt;/em&gt;, &lt;em&gt;“update to the latest release”&lt;/em&gt;, or any request to bump &lt;code&gt;spryker-feature/*&lt;/code&gt; or &lt;code&gt;spryker/*&lt;/code&gt; packages.&lt;/p&gt;
&lt;h2 id=&quot;why-silent-damage-is-the-real-problem&quot;&gt;Why silent damage is the real problem&lt;/h2&gt;
&lt;p&gt;Everything a Spryker project overrides fails quietly when core moves. A dead override still loads, a replaced plugin stack still boots, and a stale template still renders. Nothing errors — the customization simply stops taking effect.&lt;/p&gt;
&lt;p&gt;The workflow therefore starts with a different question than “which modules changed”. It asks which of your customizations would notice if they stopped working, and whether the upgrade can be verified at all.&lt;/p&gt;
&lt;h2 id=&quot;the-phases&quot;&gt;The phases&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Coverage check&lt;/strong&gt; — measures your override surface against the tests that cover it, and offers to write characterization tests for the gaps. These must be written before the upgrade; written afterwards they pin the upgraded behavior and can no longer detect that it changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preflight and baselines&lt;/strong&gt; — records snapshots of overrides and shadowed frontend files, checks for constraint styles that block resolution, and captures pre-existing damage so it is not misattributed to the upgrade.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constraint resolution&lt;/strong&gt; — relaxes patch-locked constraints, then resolves conflicts iteratively. Conflicts arrive in waves, each root bump revealing the next transitive layer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detection&lt;/strong&gt; — after Composer completes, runs the detectors that find the silent damage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolution&lt;/strong&gt; — merges shadowed files, rewires replaced plugin stacks, fixes broken configuration references, and requires a migration guide for every major module bump.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;what-the-detectors-find&quot;&gt;What the detectors find&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detector&lt;/th&gt;
&lt;th&gt;Damage it catches&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-test-coverage.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Customizations with no test over them, ranked by risk, with the test type that would catch each gap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-vendor-class-replacement.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project files that declare a vendor namespace and replace a core class outright, so the vendor implementation never loads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-constraint-style.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Patch-locked or exactly pinned constraints that make a feature bump unresolvable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-typed-members.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Untyped overrides of constants and properties that core has since typed — a fatal on class load that aborts the console itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-dead-overrides.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project methods overriding a vendor method that the new version deleted, so the project logic stops being called&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;twig-shadow-map.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shadowed Twig, SCSS, and TypeScript files whose vendor counterparts changed upstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;merge-shadowed-files.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs a three-way merge for every shadowed file and sorts the outcomes into clean, identical, conflicted, and removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-plugin-usage.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vendor plugins that are missing or deprecated after the upgrade, and project plugins implementing a removed interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-config-constants.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Configuration referencing a vendor constants interface or constant that no longer exists, which breaks bootstrap of every application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list-major-bumps.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every major module bump, with a documentation search URL, changelog URL, and compare URL per package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;resolve-constraints.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs Composer, parses root conflicts, raises the constraints the tree demands, and repeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unpin-feature-driven-modules.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Breaks a cohort deadlock, where a group of modules sharing a dependency must move together&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The detectors keep their snapshots and reports in &lt;code&gt;.spryker-upgrade/state/&lt;/code&gt; inside the project, created self-gitignoring on first use.&lt;/p&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Order matters&lt;/div&gt;
&lt;p&gt;The dependency between the detectors is real. The skill runs them in the correct order — coverage and replacement checks first, then baselines and constraint preflight, then resolution, then post-Composer detection. Running them out of order wastes time on phantom findings.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;run-the-detectors-in-ci&quot;&gt;Run the detectors in CI&lt;/h2&gt;
&lt;p&gt;Two detectors are cheap enough to gate every pull request, and both catch damage that is otherwise invisible until runtime:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;php &lt;span class=&quot;nv&quot;&gt;$UP&lt;/span&gt;/check-typed-members.php     &lt;span class=&quot;c&quot;&gt;# fatals on class load&lt;/span&gt;
php &lt;span class=&quot;nv&quot;&gt;$UP&lt;/span&gt;/check-plugin-usage.php      &lt;span class=&quot;c&quot;&gt;# missing plugins&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Neither needs a snapshot, a database, or a search backend — only an installed &lt;code&gt;vendor/&lt;/code&gt; directory. Failing the build on exit code 1 turns “the Back Office returns 500 after deploy” into a red pipeline.&lt;/p&gt;
&lt;p&gt;For dependency-bumping pull requests, also wrap the change in a snapshot and verify pair for &lt;code&gt;check-dead-overrides.php&lt;/code&gt; and &lt;code&gt;twig-shadow-map.php&lt;/code&gt;, because those compare against pre-upgrade state and cannot work from a single point in time.&lt;/p&gt;
&lt;p&gt;You can also gate &lt;code&gt;check-test-coverage.php&lt;/code&gt; in CI, but gate it on a ratchet rather than on zero: fail when a pull request increases the number of untested overrides. New customization then arrives with a test, instead of the project needing a coverage project before anyone can merge.&lt;/p&gt;
&lt;h2 id=&quot;known-limits&quot;&gt;Known limits&lt;/h2&gt;
&lt;p&gt;No detector covers Propel schema merges, glossary keys, ACL and navigation for new Back Office routes, or pure behavioral change. Those remain process gates and tests, and the skill marks them as such.&lt;/p&gt;
&lt;p&gt;Published migration guides are also sometimes stale or absent, so the skill treats the tag diff, not the guide, as the source of truth.&lt;/p&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A Spryker project with Composer installed, and host PHP available to run the detector scripts&lt;/li&gt;
&lt;li&gt;An AI tool with the SDK’s skills loaded — either through the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code plugin&lt;/a&gt; or via &lt;code&gt;ai-dev:setup&lt;/code&gt; for another supported tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/project-setup-wizard/plugins/spryker-ai-dev-sdk/skills/spryker-upgrade/README.md&quot;&gt;&lt;code&gt;spryker-upgrade&lt;/code&gt; README&lt;/a&gt; — the skill’s own reference in the plugin repository&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;Skills and Agents&lt;/a&gt; — the full reference of every skill and agent&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/upgrade-and-migrate/upgrade-and-migrate.html&quot;&gt;Upgrade and migrate&lt;/a&gt; — the manual upgrade and migration guides&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;Overview&lt;/a&gt; — module and &lt;code&gt;ai-dev:setup&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 07:23:47 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-upgrade-workflow.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-upgrade-workflow.html</guid>
            
            
        </item>
        
        <item>
            <title>Project Starter Wizard</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;project-starter-wizard&lt;/code&gt; skill and the nine setup skills it orchestrates are available from &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt; version 0.6.4, which ships version 0.4.0 of the &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin.&lt;/p&gt;
&lt;p&gt;To update the Claude Code plugin, run &lt;code&gt;/plugin&lt;/code&gt; in Claude Code and update &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; from the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace to version 0.4.0 or later. For installation instructions, see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-skill-does&quot;&gt;What the skill does&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/setup.png&quot; alt=&quot;starter&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;project-starter-wizard&lt;/code&gt; turns a fresh, un-booted clone of a Spryker B2B or B2B Marketplace demoshop into your customer project. It asks everything once in a developer interview, records your answers in a resumable state file, and then drives nine specialist skills in the one order that works.&lt;/p&gt;
&lt;p&gt;The wizard owns the conversation and the flow — it writes almost nothing itself. Each step delegates to a sibling skill that does the transformation work.&lt;/p&gt;
&lt;p&gt;Invoke it at the very start of a new project: &lt;em&gt;“turn this demoshop into our project”&lt;/em&gt;, &lt;em&gt;“start the project setup”&lt;/em&gt;. It is also the resume entry point — if a previous run left a state file, invoking the skill again skips the interview and continues from the first unfinished step.&lt;/p&gt;
&lt;h2 id=&quot;the-interview&quot;&gt;The interview&lt;/h2&gt;
&lt;p&gt;The interview collects nine sections up front so the run needs no further configuration decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project identity — project name, development domain, and Docker namespace&lt;/li&gt;
&lt;li&gt;Namespace — whether to keep &lt;code&gt;Pyz&lt;/code&gt; or register a custom namespace&lt;/li&gt;
&lt;li&gt;Services — database, search, broker, key-value store, and optional development services&lt;/li&gt;
&lt;li&gt;Stores and region&lt;/li&gt;
&lt;li&gt;Data mode — adapt, clean, generate, or leave the demo data&lt;/li&gt;
&lt;li&gt;Catalog scope&lt;/li&gt;
&lt;li&gt;Localization&lt;/li&gt;
&lt;li&gt;CI setup&lt;/li&gt;
&lt;li&gt;Run mode&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-nine-steps&quot;&gt;The nine steps&lt;/h2&gt;
&lt;p&gt;Steps 1 to 7 run before the first boot, because each one changes files the boot reads.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project-ci-generator&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rebuilds the inherited product CI into a single lean project pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;configure-codebase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registers the custom namespace and wires autoload, frontend build, and Codeception. Skipped when the project keeps &lt;code&gt;Pyz&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brand-project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Applies the project identity — name, domain, Docker namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;configure-services&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Writes the chosen engines, development services, and applications into &lt;code&gt;deploy.dev.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;define-stores&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates the region and store definitions. Skipped when the data mode is &lt;code&gt;leave&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project-data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adapts, cleans, generates, or leaves the import data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cypress-migration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replaces the demoshop test suites with a project-owned Cypress baseline. Last pre-boot step, because it reads the output of steps 1, 3, 4, 5, and 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boot-and-verify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;First boot and per-store verification, plus the theming half of step 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;translate-content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Translates storefront content. Runs only when you selected locales to localize&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;run-modes&quot;&gt;Run modes&lt;/h2&gt;
&lt;p&gt;You choose the run mode in the interview, and the wizard honors it again on resume:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autonomous&lt;/strong&gt; — steps 1 to 9 run as one continuous pass. At a reversible decision point the wizard picks the best option and records it in a decision log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supervised&lt;/strong&gt; — the wizard reports a one-line result and asks &lt;em&gt;“Continue to the next step?”&lt;/em&gt; at each step boundary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neither mode relaxes the hard stops. A required manual action, any deletion or data wipe, and any step failure all return control to you in both modes.&lt;/p&gt;
&lt;h2 id=&quot;run-artifacts&quot;&gt;Run artifacts&lt;/h2&gt;
&lt;p&gt;The run writes four files into the clone’s own tree under &lt;code&gt;.ai-dev/&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project-setup.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The state — interview answers and a step table with per-step status. Resume reads this file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The timeline — step boundaries, conditional skips with their reason, hard stops, and every resume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;decision-log.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The rationale — each autonomous decision with its evidence and how to reverse it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;what-you-get-at-the-end&quot;&gt;What you get at the end&lt;/h2&gt;
&lt;p&gt;A transformed clone with the project identity and branding, a registered namespace, the chosen services and stores, project-shaped import data, a lean CI pipeline, and a vendored Cypress suite — booted and verified per store by an independent verifier agent, with all changes staged but never committed.&lt;/p&gt;
&lt;p&gt;The closing summary flags what still needs a human before go-live, such as a git remote that still points at the demoshop upstream, a still-shipped Spryker logo, or translation debt from locales left as English copies.&lt;/p&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A fresh, un-booted clone of a Spryker B2B or B2B Marketplace demoshop&lt;/li&gt;
&lt;li&gt;An AI tool with the SDK’s skills loaded — either through the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code plugin&lt;/a&gt; or via &lt;code&gt;ai-dev:setup&lt;/code&gt; for another supported tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/project-setup-wizard/plugins/spryker-ai-dev-sdk/skills/project-starter-wizard/README.md&quot;&gt;&lt;code&gt;project-starter-wizard&lt;/code&gt; README&lt;/a&gt; — the skill’s own reference in the plugin repository&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;Skills and Agents&lt;/a&gt; — the full reference of every skill and agent this wizard composes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html&quot;&gt;Customization Workflow&lt;/a&gt; — build features on the project once it runs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;Overview&lt;/a&gt; — module and &lt;code&gt;ai-dev:setup&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 07:23:47 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-project-starter-wizard.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-project-starter-wizard.html</guid>
            
            
        </item>
        
        <item>
            <title>Profiler Workflow</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;spryker-profiler&lt;/code&gt; skill is available from &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt; version 0.6.4, which ships version 0.4.0 of the &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin.&lt;/p&gt;
&lt;p&gt;To update the Claude Code plugin, run &lt;code&gt;/plugin&lt;/code&gt; in Claude Code and update &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; from the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace to version 0.4.0 or later. For installation instructions, see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-skill-does&quot;&gt;What the skill does&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/profiler.png&quot; alt=&quot;profiler&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;spryker-profiler&lt;/code&gt; turns the Spryker and Symfony WebProfiler into performance numbers you can act on, and explains how to switch profiling on when there is nothing to read.&lt;/p&gt;
&lt;p&gt;Spryker records every web request automatically. That history is the cheapest source of truth for performance work: instead of guessing which code is slow, the skill reads what actually ran. It reduces a stored profile to the metrics that matter and prints JSON, so nobody has to scrape the profiler’s HTML or open a browser.&lt;/p&gt;
&lt;p&gt;Invoke it when you ask why a page, endpoint, or Back Office screen is slow, want the heaviest request, suspect an N+1 query, need before-and-after evidence that a performance fix worked, or want to know what a request logged, threw, or which controller handled it. It also covers profiler setup — a missing toolbar, a collector showing no data, or enabling profiling for a specific application.&lt;/p&gt;
&lt;h2 id=&quot;what-it-can-tell-you&quot;&gt;What it can tell you&lt;/h2&gt;
&lt;p&gt;The I/O counters say how much work a request did:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;queries&lt;/code&gt; / &lt;code&gt;unique&lt;/code&gt; / &lt;code&gt;duplicates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How many SQL statements a request ran, and how many were repeats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Key-value operations per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elasticsearch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search calls per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zed_requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yves-to-Zed calls — the architecture boundary check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;external_http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Third-party calls blocking the response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;duration_ms&lt;/code&gt; / &lt;code&gt;memory_mb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wall time and peak memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;segments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Queries attributed to a named code path you wrapped&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These say why, and whether the numbers are comparable between runs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Errors, warnings, and deprecations logged during the request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audit_log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Security and compliance events by channel — a separate stream from &lt;code&gt;logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exception&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What was thrown, with message and status code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;twig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Template count and render time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Listeners called synchronously, plus Spryker application events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which controller and route handled the request, and where a 3xx redirected to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;session&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Session payload size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;runtime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Debug mode and Xdebug flags — check these before comparing any timing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A Spryker request records 20 collectors. The skill reads every one that carries request data and maps it onto the fields above. The three it does not read hold no per-request measurements — they are toolbar plumbing and a dump of resolved configuration.&lt;/p&gt;
&lt;h2 id=&quot;one-user-action-is-many-profiles&quot;&gt;One user action is many profiles&lt;/h2&gt;
&lt;p&gt;The mistake that most often produces a wrong answer is treating a profile as a user action. A profile is one HTTP request. Clicking &lt;strong&gt;Login&lt;/strong&gt; on the storefront creates six profiles across two applications and two storage directories — and the storefront profile itself reports zero queries, because Yves has no SQL collector by design.&lt;/p&gt;
&lt;p&gt;The skill reconstructs the full tree instead. Yves-to-Zed links are exact, because the callee returns its own debug token, which the caller stores. Browser-issued AJAX and ESI sub-requests carry no such link, so those are grouped by time window and flagged as the heuristic they are.&lt;/p&gt;
&lt;h2 id=&quot;the-workflow&quot;&gt;The workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;If you do not know which page is slow, rank the recorded profiles by a metric to find the outlier.&lt;/li&gt;
&lt;li&gt;Reproduce the request, then read the profile and check that its age is seconds — profiles accumulate for days, and without checking you may analyze last week’s request.&lt;/li&gt;
&lt;li&gt;If a collector is absent or there are no profiles at all, the skill walks the setup layers that must be enabled.&lt;/li&gt;
&lt;li&gt;For a page or user action, read the full trace rather than the entry request alone.&lt;/li&gt;
&lt;li&gt;Read the counts, not the milliseconds. Local wall time swings widely for identical work, while I/O counts are stable and are what scales badly in production.&lt;/li&gt;
&lt;li&gt;If the counts are high, profile a small and a large entity to see whether the count scales with the data.&lt;/li&gt;
&lt;/ol&gt;
&lt;section class=&apos;info-block &apos;&gt;&lt;i class=&apos;info-block__icon icon-info&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;An absent collector is not zero&lt;/div&gt;
&lt;p&gt;&lt;code&gt;collector: &amp;quot;absent&amp;quot;&lt;/code&gt; means the metric was never measured for that application — Yves has no SQL collector, and the Back Office has no Redis collector. Reporting zero queries from an absent collector is a false conclusion. &lt;code&gt;collector: &amp;quot;incompatible&amp;quot;&lt;/code&gt; means the collector is recording but an upgrade renamed part of its API, so the data is still available in the browser panel.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;going-deeper-than-counts&quot;&gt;Going deeper than counts&lt;/h2&gt;
&lt;p&gt;Segmented SQL attributes queries to a named code path, turning “this page runs 261 queries” into “the calculator stack runs 180 of them”. Wrap the suspect code and the reader reports it under &lt;code&gt;database.segments&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Spryker\Shared\Propel\Logger\PropelInMemoryLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;PropelInMemoryLogger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;startSegment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;order-validation&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;validateOrder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$orderTransfer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;PropelInMemoryLogger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;endSegment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Always use &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;finally&lt;/code&gt;. The logger is static, so an unclosed segment swallows every later query in the request. Remove segments once you have the answer — they are debugging scaffolding.&lt;/p&gt;
&lt;p&gt;A stored profile holds far more than the reader prints, including full SQL text, headers, routing, events, and logger entries. When a question needs something the reader does not expose, the skill extends the script rather than stopping at the available options.&lt;/p&gt;
&lt;h2 id=&quot;things-that-will-confuse-you&quot;&gt;Things that will confuse you&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timings are only comparable at equal runtime.&lt;/strong&gt; Xdebug inflates wall time several-fold and debug mode disables caches, so a “regression” can be nothing more than a differently configured container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Each application writes to its own directory.&lt;/strong&gt; Yves and Glue write to one directory; Zed, the Back Office, the Backend Gateway, and the Merchant Portal write to another. The reader picks the most recently written one, which is often not the one you want.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The index outlives the data.&lt;/strong&gt; Stored profiles are deleted after two days, but the index is never trimmed, so it can list thousands of requests when only a few dozen files survive. The skill reports how many profiles a ranking actually covered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;external_http: 0&lt;/code&gt; may mean “not instrumented”.&lt;/strong&gt; External calls appear only if the calling code uses the external HTTP logger trait, so a zero is never proof that a request makes no outbound calls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Login walls profile the redirect.&lt;/strong&gt; An unauthenticated request to the Back Office or Merchant Portal records the redirect to the login form, which says nothing about the page you wanted. Reproduce with an authenticated session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Back Office tables are two requests.&lt;/strong&gt; The page renders an empty grid and loads its rows through a separate table route, which is usually where the real cost sits. Profile both.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Console commands, queue workers, and cron jobs are never profiled.&lt;/strong&gt; The WebProfiler is request-scoped. Use Xdebug profiling or explicit timing for those.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-there-is-no-data&quot;&gt;When there is no data&lt;/h2&gt;
&lt;p&gt;Three independent layers must all be in place, and the skill checks each one:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The web profiler is enabled in the project configuration.&lt;/li&gt;
&lt;li&gt;The web profiler application plugin is registered for the application you are profiling. Zed alone has four separate stacks — Zed, Back Office, Backend Gateway, and Backend API.&lt;/li&gt;
&lt;li&gt;A collector plugin for the metric you want is registered in that application’s &lt;code&gt;WebProfilerDependencyProvider&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After changing any of these, empty the cache and reproduce the request.&lt;/p&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A running Spryker project (Docker SDK up) with the web profiler enabled&lt;/li&gt;
&lt;li&gt;An AI tool with the SDK’s skills loaded — either through the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code plugin&lt;/a&gt; or via &lt;code&gt;ai-dev:setup&lt;/code&gt; for another supported tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/integrate-and-configure/integrate-development-tools/web-profiler.html&quot;&gt;WebProfiler&lt;/a&gt; — why the profiler matters and how to integrate it per application&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/project-setup-wizard/plugins/spryker-ai-dev-sdk/skills/spryker-profiler/README.md&quot;&gt;&lt;code&gt;spryker-profiler&lt;/code&gt; README&lt;/a&gt; — the skill’s own reference in the plugin repository&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;Skills and Agents&lt;/a&gt; — the full reference of every skill and agent&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;Overview&lt;/a&gt; — module and &lt;code&gt;ai-dev:setup&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 07:23:47 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-profiler-workflow.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-profiler-workflow.html</guid>
            
            
        </item>
        
        <item>
            <title>Customization Workflow</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;spryker-customization&lt;/code&gt; skill ships with the &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin. Version 0.6.4 of &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt;, which ships plugin version 0.4.0, adds the conditional Cypress end-to-end phase described on this page.&lt;/p&gt;
&lt;p&gt;To update the Claude Code plugin, run &lt;code&gt;/plugin&lt;/code&gt; in Claude Code and update &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; from the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace to version 0.4.0 or later. For installation instructions, see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-skill-does&quot;&gt;What the skill does&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;spryker-customization&lt;/code&gt; is the AI Dev SDK’s orchestrator skill. It takes a feature idea and walks it to a working, committed branch in your Spryker project by delegating focused work to the SDK’s other skills and agents.&lt;/p&gt;
&lt;p&gt;You describe what you want in one sentence. From there, &lt;code&gt;spryker-customization&lt;/code&gt; invokes the right specialist at each step — for example, &lt;code&gt;spryker-feature-expert&lt;/code&gt; to research which Spryker primitives apply, &lt;code&gt;product-requirement-document&lt;/code&gt; to write the spec, &lt;code&gt;spryker-refresher&lt;/code&gt; to run the post-change commands, &lt;code&gt;spryker-verifier&lt;/code&gt; to check the feature against the running app. It stops at a commit gate where you approve the diff before it is saved to git.&lt;/p&gt;
&lt;p&gt;You do not write code during the run. You make three decisions: what quality bar you want, whether the plan looks right, and whether the final diff goes in.&lt;/p&gt;
&lt;h2 id=&quot;workflow-at-a-glance&quot;&gt;Workflow at a glance&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/customization.png&quot; alt=&quot;AI Dev SDK customization workflow&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Each phase delegates to specific skills (pale yellow) and agents (deep amber) — for example, the &lt;code&gt;spryker-feature-expert&lt;/code&gt; agent researches the relevant Spryker domain during planning, and the &lt;code&gt;spryker-verifier&lt;/code&gt; agent drives the running storefront and back office to confirm the feature actually works.&lt;/p&gt;
&lt;h2 id=&quot;what-you-get-at-the-end&quot;&gt;What you get at the end&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A new branch (&lt;code&gt;ai-customize/&amp;lt;slug&amp;gt;&lt;/code&gt;) with the feature implemented&lt;/li&gt;
&lt;li&gt;Code in your project layer only — your vendor directory is never edited&lt;/li&gt;
&lt;li&gt;A clean refresh — caches, transfers, and frontend builds are all up to date&lt;/li&gt;
&lt;li&gt;Per-criterion verification results with real evidence from the running app — what passed, what did not, why&lt;/li&gt;
&lt;li&gt;A code-review report against the staged diff&lt;/li&gt;
&lt;li&gt;Tests (when you pick the MVP bar)&lt;/li&gt;
&lt;li&gt;Cypress end-to-end coverage for the feature (when you pick the MVP bar)&lt;/li&gt;
&lt;li&gt;The commit waits for your approval; nothing is pushed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you wanted a product requirement document too, the skill can produce one — by delegating to &lt;code&gt;product-requirement-document&lt;/code&gt; — as a reusable document under &lt;code&gt;resources/plan/PRD/&lt;/code&gt; before the build starts.&lt;/p&gt;
&lt;h2 id=&quot;choose-your-output-poc-or-production&quot;&gt;Choose your output: PoC or production&lt;/h2&gt;
&lt;p&gt;You pick one of two bars at the start. The skill asks once and shapes the rest of the run accordingly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PoC&lt;/strong&gt; — the fastest path to a feature that works. The orchestrator collapses the implementation into the minimum number of classes, lets values be hardcoded where convenient, sticks to a single locale, and skips test generation. Pick this for demos, sales conversations, and quick experiments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MVP&lt;/strong&gt; — production-grade output. The orchestrator uses Spryker’s canonical extension chain (plugin stacks, factory expanders, dependency injection, project-layer transfer and schema XML), covers every configured locale, adds ACL where the feature touches the back office, and writes tests for non-trivial logic. Pick this for code you intend to ship.&lt;/p&gt;
&lt;p&gt;Both bars produce a visually integrated feature — new UI elements reuse the project’s atomic design components, never raw HTML pasted onto a styled page.&lt;/p&gt;
&lt;h2 id=&quot;cypress-end-to-end-coverage&quot;&gt;Cypress end-to-end coverage&lt;/h2&gt;
&lt;p&gt;Once every acceptance criterion is verified green and any visual sign-offs are done, the workflow runs a Cypress phase. It delegates to the &lt;code&gt;cypress-tests&lt;/code&gt; skill, which decides what the feature needs against your project’s existing suite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; a spec the feature broke&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improve&lt;/strong&gt; assertions that would have missed the change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add&lt;/strong&gt; a new spec for the feature&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The phase then runs the affected specs and the project’s quality gate rather than the whole suite.&lt;/p&gt;
&lt;p&gt;The phase is on by default for the MVP bar and off for PoC, and you can switch it either way at the start. It runs only when the feature is visible on an end-to-end surface and your project has a Cypress suite. A skip is always reported with its reason, never silent.&lt;/p&gt;
&lt;p&gt;The phase deliberately runs last, after the self-correction loop has converged, so no spec is written against an implementation still in flux. If a spec goes red because the feature is wrong rather than the test, that is treated as a missed acceptance criterion and feeds back into the self-correction loop.&lt;/p&gt;
&lt;h2 id=&quot;where-you-decide&quot;&gt;Where you decide&lt;/h2&gt;
&lt;p&gt;The skill runs autonomously between three decision points where it pauses for you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Before planning&lt;/strong&gt; — you pick PoC or MVP, and which optional phases run (tests, demo screenshots, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before any code is written&lt;/strong&gt; — the orchestrator presents the acceptance criteria, the list of files it intends to edit, and one consolidated round of clarifying questions. Nothing touches the disk until you confirm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before the commit&lt;/strong&gt; — the final diff is staged for you to review. You approve, refuse, or adjust. Branches stay local; pushing is your call.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If verification fails on an acceptance criterion and the skill cannot fix it after a few tries, it surfaces what was attempted and asks you how to proceed rather than silently giving up.&lt;/p&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A running Spryker project (Docker SDK up) with the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;AI Dev SDK&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;An AI tool with the SDK’s skills loaded — either through the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code plugin&lt;/a&gt; or via &lt;code&gt;ai-dev:setup&lt;/code&gt; for another supported tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/project-setup-wizard/plugins/spryker-ai-dev-sdk/skills/spryker-customization/README.md&quot;&gt;&lt;code&gt;spryker-customization&lt;/code&gt; README&lt;/a&gt; — the skill’s own reference in the plugin repository&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;Skills and Agents&lt;/a&gt; — the full reference of every skill and agent this orchestrator composes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;Overview&lt;/a&gt; — module and &lt;code&gt;ai-dev:setup&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt; — how to install the SDK for Claude Code&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 07:23:47 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html</guid>
            
            
        </item>
        
        <item>
            <title>Bugfix Workflow</title>
            <description>&lt;section class=&apos;info-block info-block--warning&apos;&gt;&lt;i class=&apos;info-block__icon icon-warning&apos;&gt;&lt;/i&gt;&lt;div class=&apos;info-block__content&apos;&gt;&lt;div class=&quot;info-block__title&quot;&gt;Experimental module&lt;/div&gt;
&lt;p&gt;The AiDev module is experimental and not stable. There is no backward compatibility promise for this module. We welcome your feedback and contributions as we continue to develop and improve this module.&lt;/p&gt;
&lt;/div&gt;&lt;/section&gt;
&lt;h2 id=&quot;availability&quot;&gt;Availability&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;spryker-bugfix&lt;/code&gt; skill is available from &lt;code&gt;spryker-sdk/ai-dev&lt;/code&gt; version 0.6.4, which ships version 0.4.0 of the &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; Claude Code plugin. Version 0.6.4 also adds the conditional Cypress end-to-end phase described on this page.&lt;/p&gt;
&lt;p&gt;To update the Claude Code plugin, run &lt;code&gt;/plugin&lt;/code&gt; in Claude Code and update &lt;code&gt;spryker-ai-dev-sdk&lt;/code&gt; from the &lt;code&gt;spryker-plugins-official&lt;/code&gt; marketplace to version 0.4.0 or later. For installation instructions, see &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-the-skill-does&quot;&gt;What the skill does&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/bugfix.png&quot; alt=&quot;bugfix&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;spryker-bugfix&lt;/code&gt; takes a bug and drives it to a committed, validated, QA-accepted fix on a &lt;code&gt;bugfix/*&lt;/code&gt; branch. In Autonomous mode it goes all the way to a pushed draft pull request with a remote CI watch loop.&lt;/p&gt;
&lt;p&gt;The skill is an orchestrator. It runs a fixed sequence of stages and delegates the work of each stage to another SDK skill or agent — it writes no product code itself.&lt;/p&gt;
&lt;p&gt;Invoke it whenever you have a bug symptom and expect a delivered fix: &lt;em&gt;“fix this bug”&lt;/em&gt;, &lt;em&gt;“fix ticket XY-1122”&lt;/em&gt;, &lt;em&gt;“this is broken, reproduce and fix it”&lt;/em&gt;. It is not the right skill for a single isolated step, a new feature, a refactor without a symptom, or an investigation-only request.&lt;/p&gt;
&lt;h2 id=&quot;two-ways-in--the-ticket-is-optional&quot;&gt;Two ways in — the ticket is optional&lt;/h2&gt;
&lt;p&gt;Bug context can come from either or both of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A ticket from any tracker — a Jira key, a GitHub issue URL or number, or any other service&lt;/li&gt;
&lt;li&gt;A free-text description of the symptom with technical hints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A ticket is never required. When a ticket exists and its integration is reachable, the skill pulls it for extra context; otherwise it works entirely from your description, and the branch name, commit message, and pull request title fall back to &lt;code&gt;no-ticket&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-stages&quot;&gt;The stages&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Delegates to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Intake&lt;/td&gt;
&lt;td&gt;Mode, context, and pull request preference; sets up the run directory&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch&lt;/td&gt;
&lt;td&gt;Safety gate — refuses to continue on a dirty tree or a stale base&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproduce&lt;/td&gt;
&lt;td&gt;Confirms the symptom in the running application&lt;/td&gt;
&lt;td&gt;&lt;code&gt;spryker-runtime&lt;/code&gt;, &lt;code&gt;spryker-docs-research&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Root cause&lt;/td&gt;
&lt;td&gt;Finds why it happens. Loop re-entry point&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ai-runtime-debugging&lt;/code&gt;, &lt;code&gt;spryker-runtime&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix&lt;/td&gt;
&lt;td&gt;Applies the minimal fix and re-runs the reproduction&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional tests&lt;/td&gt;
&lt;td&gt;Adds or updates Codeception tests&lt;/td&gt;
&lt;td&gt;&lt;code&gt;codecept-functional&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Static validation&lt;/td&gt;
&lt;td&gt;Runs static analysis over the changed code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;static-validation&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review&lt;/td&gt;
&lt;td&gt;Gate — blocks on a blocker or major finding&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code-review&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA&lt;/td&gt;
&lt;td&gt;Gate — four-bucket coverage against the running application&lt;/td&gt;
&lt;td&gt;&lt;code&gt;spryker-qa-coverage&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cypress E2E&lt;/td&gt;
&lt;td&gt;Conditional — fixes, improves, or adds an end-to-end spec for the bug&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cypress-tests&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final verification&lt;/td&gt;
&lt;td&gt;Confirms the symptom is gone in the running application&lt;/td&gt;
&lt;td&gt;&lt;code&gt;spryker-verifier&lt;/code&gt;, &lt;code&gt;spryker-runtime&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit&lt;/td&gt;
&lt;td&gt;Always commits; push and pull request depend on your mode and channel&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report&lt;/td&gt;
&lt;td&gt;Outcome, root cause, decisions, gate results, and log paths&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;the-verification-loop&quot;&gt;The verification loop&lt;/h2&gt;
&lt;p&gt;Code review, QA, final verification, and remote CI are gates. A failure in any of them draws from one shared attempt counter and loops back to the root cause stage to re-investigate, then forward through the full chain again.&lt;/p&gt;
&lt;p&gt;The hard stop is three attempts. Beyond that the run stops and reports — nothing is pushed, and no pull request is marked ready with a known-broken state.&lt;/p&gt;
&lt;p&gt;A Cypress failure that indicts the fix rather than the test joins the same loop.&lt;/p&gt;
&lt;h2 id=&quot;modes&quot;&gt;Modes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Collaborative&lt;/strong&gt; — the skill stops at the important decision points and before any push, so you can review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autonomous&lt;/strong&gt; — after the single intake step the skill runs unattended to a pushed draft pull request. Every fork is a logged decision rather than a question. The only hard stops are a dirty or stale base branch and the attempt budget.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pull-request-delivery&quot;&gt;Pull request delivery&lt;/h2&gt;
&lt;p&gt;At intake the skill asks whether to open a pull request and through which channel, then probes what is actually available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gh&lt;/code&gt; — the GitHub CLI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcp&lt;/code&gt; — a connected forge MCP server for GitHub, GitLab, Bitbucket, or another host&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git-only&lt;/code&gt; — pushes a branch without opening a pull request&lt;/li&gt;
&lt;li&gt;&lt;code&gt;none&lt;/code&gt; — local only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The GitHub CLI is never assumed. If the chosen channel cannot open a pull request, the skill degrades to a clean terminal state — it commits, pushes where possible, and hands over the command to create the pull request yourself.&lt;/p&gt;
&lt;h2 id=&quot;run-artifacts&quot;&gt;Run artifacts&lt;/h2&gt;
&lt;p&gt;Every file the run produces lives in one folder per bug under &lt;code&gt;.ai-dev/spryker-bugfix/&amp;lt;bugfix-id&amp;gt;/&lt;/code&gt;, which survives loopbacks and scheduled wake-ups:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The timeline — one line per stage boundary, every loopback, and every gate verdict&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;decisions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The rationale — critical decisions, open questions, and risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;repro-notes.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The reproduction scenario in full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;stage&amp;gt;-attempt&amp;lt;N&amp;gt;.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bulk output per gate — tests, static analysis, review, verification, and CI logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;watch-state.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The handoff the remote CI watch loop re-reads on each wake-up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A running Spryker project (Docker SDK up) with the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;AI Dev SDK&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;An AI tool with the SDK’s skills loaded — either through the &lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html&quot;&gt;Claude Code plugin&lt;/a&gt; or via &lt;code&gt;ai-dev:setup&lt;/code&gt; for another supported tool&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;related&quot;&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/spryker-sdk/ai-dev/blob/project-setup-wizard/plugins/spryker-ai-dev-sdk/skills/spryker-bugfix/README.md&quot;&gt;&lt;code&gt;spryker-bugfix&lt;/code&gt; README&lt;/a&gt; — the skill’s own reference in the plugin repository&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html&quot;&gt;Skills and Agents&lt;/a&gt; — the full reference of every skill and agent this orchestrator composes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html&quot;&gt;Customization Workflow&lt;/a&gt; — the same orchestration shape for building new features&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;Overview&lt;/a&gt; — module and &lt;code&gt;ai-dev:setup&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 07:23:47 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-bugfix-workflow.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/ai/ai-dev/ai-dev-bugfix-workflow.html</guid>
            
            
        </item>
        
        <item>
            <title>Implement Publish and Synchronization</title>
            <description>Usually in order to publish some data to the frontend from your database, you need to create a module that will handle those actions. Usual recommendation is to create a module that will handle the *Publish* and *Synchronize* processes. The module will contain the code that will handle the events, prepare data, and synchronize it to the frontend.
All required steps are described in this article.

## 1. Create a base module

We recommend putting a `Publish &amp; Synchronization` related code in a separate module. A module usually represents one database or domain entity. For example `StoreStorage` module will populate storage with `Store` data and also with data from related tables like `StoreContext`.

You can create a module with a few options:
- Create a module manually. For details, see [Create a module](/docs/dg/dev/backend-development/extend-spryker/create-modules).
- Use Spryks for creating a module. For details, see [Spryks](/docs/dg/dev/sdks/sdk/spryks/spryks).
- Use an [AI coding assistant](/docs/dg/dev/ai/ai-dev/ai-dev-overview.html) to create a module. You can ask the AI agent to use this document as a reference.

{% info_block infoBox &quot;Naming convention&quot;%}

In the Spryker packages, you can find modules that sync data to the *Storage* or *Search* database. The module name is usually suffixed with `Storage` or `Search`. For example, `GlossaryStorage` or `CmsPageSearch`.
This is not a hard requirement, but we recommend following this convention to make it easier to understand the purpose of the module.

{% endinfo_block %}

At least a basic files structure of the module should be ready after this step.

## 2. Enable required behaviors

To automatically trigger events for the *Publish* and *Synchronize* processes, you need to enable the *Event* behavior in your Propel model. This behavior is used to trigger events when an entity is created, updated, or deleted.
Without this behavior, you will have to trigger events manually.

Let&apos;s say you want to have stores data available in Storage. You need to enable the *Event* behavior for `spy_store` table in your Propel model XML schema file.

```xml
&lt;table name=&quot;spy_store&quot;&gt;
    &lt;behavior name=&quot;event&quot;&gt;
        &lt;parameter name=&quot;spy_stores_all&quot; column=&quot;*&quot;/&gt;
    &lt;/behavior&gt;
&lt;/table&gt;
```

The `parameter` element specifies when events should be triggered. It has four attributes:

- `name`: the parameter name. It must be unique in your Propel model.
- `column`: the column that needs to be updated to trigger an event. To track all columns, use the *** (asterisk) symbol.
- `value`: a value to compare.
- `operator`: the comparison operator. You can use any PHP comparison operators (===, ==, !=, !==, &lt;, &gt;, &lt;=, &gt;=, &lt;&gt;) for this purpose.

The *value* and *operator* attributes are optional. You can use them to filter changes based on certain criteria. The following example triggers an event only if the value of the `quantity` column is `0`:

```xml
&lt;parameter name=&quot;spy_mymodule_quantity&quot; column=&quot;quantity&quot; value=&quot;0&quot; operator=&quot;===&quot;/&gt;
```

The following example triggers an event when the value of any column is less than or equals 10:

```php
&lt;parameter name=&quot;spy_mymodule_all&quot; column=&quot;*&quot; value=&quot;10&quot; operator=&quot;&lt;=&quot;/&gt;
```

Initializes the Propel ORM database layer:

```bash
console propel:install
```

Now `create`, `update` and `delete` events will be triggered automatically when you do those actions with Propel entities.

{% info_block infoBox &quot;Info&quot;%}

```php
$storeEntity = SpyStoreQuery::create()-&gt;findOne();
$storeEntity-&gt;setName(&apos;Silpo&apos;);
$storeEntity-&gt;save();
```

{% endinfo_block %}

This actions will trigger the `Entity.spy_store.update` event, which can be used to publish data.

`Entity.{table_name}.{action}` is a naming convention for the Publish events. The `{table_name}` part is the name of the Propel table that triggers the event, and `{action}` is one of the following actions: create, update, or delete.

In the Spryker packages you can find that such events are defined in the shared `Config` class of the module. For example, the `\Spryker\Shared\StoreStorage\StoreStorageConfig` class can be created to define the events for the `spy_store` table.

```php

    /**
     * Specification:
     * - Represents spy_store entity creation event.
     *
     * @api
     *
     * @var string
     */
    public const ENTITY_SPY_STORE_CREATE = &apos;Entity.spy_store.create&apos;;

    /**
     * Specification:
     * - Represents spy_store entity change event.
     *
     * @api
     *
     * @var string
     */
    public const ENTITY_SPY_STORE_UPDATE = &apos;Entity.spy_store.update&apos;;

    /**
     * Specification:
     * - Represents spy_store entity deletion event.
     *
     * @api
     *
     * @var string
     */
    public const ENTITY_SPY_STORE_DELETE = &apos;Entity.spy_store.delete&apos;;

```

This is not a mandatory step, but it is a good idea to define event names in the code once and use it later.

## 3. Create a new storage or search table

The next step is to create a database table, that is used as a mirror for the corresponding *Storage* or *Search* data.
This table is used to store records that will be later synced into Storage or Search database.

{% info_block infoBox &quot;Naming convention&quot;%}

As a naming convention, it&apos;s recommended to append `_storage` to the end of the table name if it&apos;s synchronized with storage database (for example Redis), and `_search` if it&apos;s synchronized with search database (for example Elasticsearch).

{% endinfo_block %}

All mirror tables must implement the *Synchronization* behavior, that is used to synchronize data to *Storage* or *Search*. Also, the table must populate foreign keys necessary to backtrack the Propel entities.

This is how a storage table for store entity can look. The *Synchronization* behavior will add a `data` and `key` columns automatically, so you don&apos;t need to define them in the table definition, but you still can do it if you want to specify the column type or other parameters. Also any fields that might be required for the synchronization process can be added to the table definition.

```xml

    &lt;table name=&quot;spy_store_storage&quot; identifierQuoting=&quot;true&quot;&gt;
         &lt;column name=&quot;id_spy_store_storage&quot; type=&quot;INTEGER&quot; autoIncrement=&quot;true&quot; primaryKey=&quot;true&quot;/&gt;
         &lt;column name=&quot;fk_store&quot; type=&quot;INTEGER&quot; required=&quot;true&quot;/&gt;
         &lt;column name=&quot;data&quot; type=&quot;CLOB&quot; required=&quot;false&quot;/&gt;
         &lt;column name=&quot;store_name&quot; type=&quot;VARCHAR&quot; size=&quot;255&quot; required=&quot;true&quot;/&gt;
         &lt;index name=&quot;spy_store_storage-fk_store&quot;&gt;
            &lt;index-column name=&quot;fk_store&quot;/&gt;
         &lt;/index&gt;
         &lt;id-method-parameter value=&quot;id_spy_store_storage_pk_seq&quot;/&gt;
         &lt;behavior name=&quot;synchronization&quot;&gt;
            &lt;parameter name=&quot;resource&quot; value=&quot;store&quot;/&gt;
            &lt;parameter name=&quot;key_suffix_column&quot; value=&quot;store_name&quot;/&gt;
            &lt;parameter name=&quot;queue_group&quot; value=&quot;sync.storage.store&quot;/&gt;
            &lt;parameter name=&quot;queue_pool&quot; value=&quot;synchronizationPool&quot;/&gt;
         &lt;/behavior&gt;
         &lt;behavior name=&quot;timestampable&quot;/&gt;
      &lt;/table&gt;

```

Let&apos;s also take a look at the example of a search table:

```xml

    &lt;table name=&quot;spy_cms_page_search&quot; identifierQuoting=&quot;true&quot;&gt;
        &lt;column name=&quot;id_cms_page_search&quot; type=&quot;INTEGER&quot; autoIncrement=&quot;true&quot; primaryKey=&quot;true&quot;/&gt;
        &lt;column name=&quot;fk_cms_page&quot; type=&quot;INTEGER&quot; required=&quot;true&quot;/&gt;
        &lt;!-- &quot;structured_data&quot; column contains the result from database query while &quot;data&quot; column contains mapped data for the search engine --&gt;
        &lt;column name=&quot;structured_data&quot; type=&quot;LONGVARCHAR&quot; required=&quot;true&quot;/&gt;
        &lt;id-method-parameter value=&quot;spy_cms_page_search_pk_seq&quot;/&gt;
        &lt;behavior name=&quot;synchronization&quot;&gt;
            &lt;parameter name=&quot;resource&quot; value=&quot;cms_page&quot;/&gt;
            &lt;parameter name=&quot;store&quot; required=&quot;true&quot;/&gt;
            &lt;parameter name=&quot;locale&quot; required=&quot;true&quot;/&gt;
            &lt;parameter name=&quot;key_suffix_column&quot; value=&quot;fk_cms_page&quot;/&gt;
            &lt;parameter name=&quot;queue_group&quot; value=&quot;sync.search.cms&quot;/&gt;
            &lt;parameter name=&quot;params&quot; value=&quot;{&quot;type&quot;:&quot;page&quot;}&quot;/&gt;
        &lt;/behavior&gt;
        &lt;behavior name=&quot;timestampable&quot;/&gt;
    &lt;/table&gt;

```

The *Synchronization* behavior added by the above schema files adds a column that stores the actual data to synchronize to Storage or Search (in JSON format). The column name is *data*.

Synchronization behavior parameters:
- `resource`— specifies the Storage or Search namespace to synchronize with.
- `store`— specifies whether it&apos;s necessary to specify a store for an entity.
- `locale`— specifies whether it&apos;s necessary to specify a locale for an entity.
- `key_suffix_column`— specifies the name of the column that will be appended to the Redis or Elasticsearch key to make the key unique. If this parameter is omitted, then all entities will be stored under the same key.
- `queue_group`— specifies the queue group for synchronization.
- `params`— specifies search parameters (Search only).
- `queue_pool`— specifies the queue pool name for synchronization. If store is not required for the entity, then this parameter must be set to a string with the pool name. If store is required, then this parameter must be omitted.

Make sure that after required tables are created, you run the `propel:install` command to create the tables in the database.

## 4. Create required plugins

After all required tables are in place, we need to add some code that will move data from the main table to the `_storage` or `_search` one. And the code that will send data from those table to actual Storage or Search databases.
To implement the *Publish* and *Synchronize* process, you need to create a few plugins. The plugins are used to handle events, prepare data, and synchronize it to the frontend.
You need at least two plugins: one for handling the *Publish* events and another one for synchronizing data to the frontend.

### 4.1 Create a Publisher plugin

A Publisher plugin is used to handle the *Publish* events. It is a plugin that implements the `Spryker\Zed\PublisherExtension\Dependency\Plugin\PublisherPluginInterface` interface and contains the `handleBulk` method. The method accepts an array of event transfers and an event name.
The `handleBulk` method is meant to be called in order to prepare the data for the storage or search tables and save it in the *Storage* or *Search* database tables.
The `getSubscribedEvents` defines the events that the plugin listens to.

```php

class StoreWritePublisherPlugin extends AbstractPlugin implements PublisherPluginInterface
{
    /**
     * {@inheritDoc}
     * - Gets Store ids from event transfers.
     * - Publishes store data to storage table.
     *
     * @api
     *
     * @param array&lt;\Generated\Shared\Transfer\EventEntityTransfer&gt; $transfers
     * @param string $eventName
     *
     * @return void
     */
    public function handleBulk(array $transfers, $eventName): void
    {
        $this-&gt;getFacade()-&gt;writeCollectionByStoreEvents($transfers);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     *
     * @return array&lt;string&gt;
     */
    public function getSubscribedEvents(): array
    {
        return [
            StoreStorageConfig::ENTITY_SPY_STORE_UPDATE,
            StoreStorageConfig::ENTITY_SPY_STORE_CREATE,
        ];
    }
}

```

This plugin must be registered in the `\Pyz\Zed\Publisher\PublisherDependencyProvider::getPublisherPlugins()` method. The plugins are listening to the default publish queue, which is defined in the `\Pyz\Zed\Publisher\PublisherConfig::getPublishQueueName()` method. Custom queue names can be set by providing a key as a queue name in the `\Pyz\Zed\Publisher\PublisherDependencyProvider::getPublisherPlugins()` method.

For example

```php

protected function getPublisherPlugins(): array
    {
        return [
            ...
            PublishAndSynchronizeHealthCheckConfig::PUBLISH_PUBLISH_AND_SYNCHRONIZE_HEALTH_CHECK =&gt; [
                new PublishAndSynchronizeHealthCheckStorageWritePublisherPlugin(),
                new PublishAndSynchronizeHealthCheckSearchWritePublisherPlugin(),
            ],
            ...
        ];
    }

```

In addition `\Spryker\Zed\PublisherExtension\Dependency\Plugin\PublisherTriggerPluginInterface` can be implemented. It will be used by `publish:trigger-events` command in order to go through all entities in entity table and trigger events for them. This is useful when you need to re-publish all data, for example, after changing the mapping or if some data was lost in the Storage or Search database.

```php

class StorePublisherTriggerPlugin extends AbstractPlugin implements PublisherTriggerPluginInterface
{
    /**
     * @uses \Orm\Zed\Store\Persistence\Map\SpyStoreTableMap::COL_ID_STORE
     *
     * @var string
     */
    protected const COL_ID_STORE = &apos;spy_store.id_store&apos;;

    /**
     * {@inheritDoc}
     *
     * @api
     *
     * @param int $offset
     * @param int $limit
     *
     * @return array&lt;\Spryker\Shared\Kernel\Transfer\AbstractTransfer&gt;
     */
    public function getData(int $offset, int $limit): array
    {
        $storeCriteriaTransfer = (new StoreCriteriaTransfer())
            -&gt;setPagination(
                (new PaginationTransfer())
                    -&gt;setLimit($limit)
                    -&gt;setOffset($offset),
            );

        return $this-&gt;getFactory()
            -&gt;getStoreFacade()
            -&gt;getStoreCollection($storeCriteriaTransfer)
            -&gt;getStores()
            -&gt;getArrayCopy();
    }

    /**
     * {@inheritDoc}
     *
     * @api
     *
     * @return string
     */
    public function getResourceName(): string
    {
        return StoreStorageConfig::STORE_RESOURCE_NAME;
    }

    /**
     * {@inheritDoc}
     *
     * @api
     *
     * @return string
     */
    public function getEventName(): string
    {
        return StoreStorageConfig::STORE_PUBLISH_WRITE;
    }

    /**
     * {@inheritDoc}
     *
     * @api
     *
     * @return string|null
     */
    public function getIdColumnName(): ?string
    {
        return static::COL_ID_STORE;
    }
}

```

### 4.2 Create a Synchronization plugin

A Synchronization plugin is used to synchronize data to the frontend. 
It is a plugin that implements the `\Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataBulkRepositoryPluginInterface` interface and contains the `getData` method. The method accepts an offset, limit, and an array of IDs and returns an array of `SynchronizationDataTransfer` objects. Those objects will be used to synchronize data to the frontend as they contain data from _storage or _search tables. 

```php

class StoreSynchronizationDataPlugin extends AbstractPlugin implements SynchronizationDataBulkRepositoryPluginInterface
{
    /**
     * Specification:
     *  - Returns the resource name of the storage or search module
     *
     * @api
     *
     * @return string
     */
    public function getResourceName(): string
    {
        return StoreStorageConfig::STORE_RESOURCE_NAME;
    }

    /**
     * Specification:
     *  - Returns true if this entity has multi-store concept
     *
     * @api
     *
     * @return bool
     */
    public function hasStore(): bool
    {
        return false;
    }

    /**
     * Specification:
     *  - Returns SynchronizationDataTransfer[] according to provided offset, limit and ids.
     *
     * @api
     *
     * @param int $offset
     * @param int $limit
     * @param array&lt;int&gt; $ids
     *
     * @return array&lt;\Generated\Shared\Transfer\SynchronizationDataTransfer&gt;
     */
    public function getData(int $offset, int $limit, array $ids = []): array
    {
        return $this-&gt;getFacade()-&gt;getStoreStorageSynchronizationDataTransfers(
            $this-&gt;createStoreStorageCriteriaTransfer($offset, $limit, $ids),
        );
    }

    /**
     * Specification:
     *  - Returns array of configuration parameter which needed for Redis or Elasticsearch
     *
     * @api
     *
     * @return array&lt;mixed&gt;
     */
    public function getParams(): array
    {
        return [];
    }

    /**
     * Specification:
     *  - Returns synchronization queue name
     *
     * @api
     *
     * @return string
     */
    public function getQueueName(): string
    {
        return StoreStorageConfig::STORE_SYNC_STORAGE_QUEUE;
    }

    /**
     * Specification:
     *  - Returns synchronization queue pool name for broadcasting messages
     *
     * @api
     *
     * @return string|null
     */
    public function getSynchronizationQueuePoolName(): ?string
    {
        return $this-&gt;getFactory()
            -&gt;getConfig()
            -&gt;getStoreSynchronizationPoolName();
    }
}

```

If the entity is store related - `hasStore()` method must return `true`, otherwise `getSynchronizationQueuePoolName()` need to return a string with the pool name. It should be the same as is provided in table definition [queue_pool](#create-a-new storage-or-search-table) of Synchronization behavior.

Below you can see an example of the code that provides data for the `getData()` method. Data taken from the Storage table and mapped to the `SynchronizationDataTransfer` object.:

```php

public function getStoreStorageSynchronizationDataTransfers(StoreStorageCriteriaTransfer $storeStorageCriteriaTransfer): array
    {
        $storeStorageQuery = $this-&gt;getFactory()-&gt;createStoreStorageQuery();

        $storeStorageConditionsTransfer = $storeStorageCriteriaTransfer-&gt;getStoreStorageConditions();
        if ($storeStorageConditionsTransfer &amp;&amp; $storeStorageConditionsTransfer-&gt;getStoreIds()) {
            $storeStorageQuery-&gt;filterByFkStore_In($storeStorageConditionsTransfer-&gt;getStoreIds());
        }

        $paginationTransfer = $storeStorageCriteriaTransfer-&gt;getPagination();
        if ($paginationTransfer) {
            $storeStorageQuery = $this-&gt;preparePagination($storeStorageQuery, $paginationTransfer);
        }

        $storeStorageEntities = $storeStorageQuery-&gt;find();

        $synchronizationDataTransfers = [];
        foreach ($storeStorageEntities as $storeStorageEntity) {
            /** @var string $data */
            $data = $storeStorageEntity-&gt;getData();

            $synchronizationDataTransfers[] = (new SynchronizationDataTransfer())
                -&gt;setData($data)
                -&gt;setKey($storeStorageEntity-&gt;getKey());
        }

        return $synchronizationDataTransfers;
    }

```

## 5. Configure Publish &amp; Synchronization queues

If you want to use separate queues for your entity you need to configure it by providing a key as a queue name in `Pyz\Zed\Publisher\PublisherDependencyProvider::getPublisherPlugins()` as mentioned before and also in the `Pyz\Zed\Queue\QueueDependencyProvider::getProcessorMessagePlugins()` by setting message and sync processors.

To deliver the prepared data to the frontend, you need to configure synchronization queues in order. This can be also done in `Pyz\Zed\Queue\QueueDependencyProvider::getProcessorMessagePlugins()`.
Spryker implemented two generic synchronization message processor plugins for synchronizing data to the frontend:

- `Spryker\Zed\Synchronization\Communication\Plugin\Queue\SynchronizationStorageQueueMessageProcessorPlugin` for synchronizing data to Redis, and
- `Spryker\Zed\Synchronization\Communication\Plugin\Queue\SynchronizationSearchQueueMessageProcessorPlugin` for synchronizing data to Elasticsearch.

{% info_block infoBox &quot;Naming convention&quot;%}

As a naming convention, names of queues that synchronize data to Redis start with *sync.storage.*, and names of queues that synchronize data to Elasticsearch start with *sync.search.*.

{% endinfo_block %}

Error queue is created automatically by adding error suffix to the queue name. For example, if the queue name is `sync.storage.product`, then the error queue name is `sync.storage.product.error`.

```php

class QueueDependencyProvider extends SprykerDependencyProvider
{
    /**
     * @param \Spryker\Zed\Kernel\Container $container
     *
     * @return array&lt;\Spryker\Zed\Queue\Dependency\Plugin\QueueMessageProcessorPluginInterface&gt;
     */
    protected function getProcessorMessagePlugins(Container $container): array // phpcs:ignore SlevomatCodingStandard.Functions.UnusedParameter
    {
        return [
            EventConstants::EVENT_QUEUE =&gt; new EventQueueMessageProcessorPlugin(),
            EventConstants::EVENT_QUEUE_RETRY =&gt; new EventRetryQueueMessageProcessorPlugin(),
            PublisherConfig::PUBLISH_QUEUE =&gt; new EventQueueMessageProcessorPlugin(),
            PublisherConfig::PUBLISH_RETRY_QUEUE =&gt; new EventRetryQueueMessageProcessorPlugin(),
            StoreStorageConfig::STORE_SYNC_STORAGE_QUEUE =&gt; new SynchronizationStorageQueueMessageProcessorPlugin(),
        ];
    }
}

```

As you can see, for the Store entity, the `Spryker\Shared\StoreStorage\StoreStorageConfig::STORE_SYNC_STORAGE_QUEUE` queue is used for synchronizing data to Redis. The queue name is defined in the `Spryker\Shared\StoreStorage\StoreStorageConfig` class.
For the publishing we are using the default publish queue, which is defined in the `Spryker\Shared\Publisher\PublisherConfig::PUBLISH_QUEUE` constant. But it also can use a separate queue for publishing data, if you provide a key as a queue name in the `Pyz\Zed\Publisher\PublisherDependencyProvider::getPublisherPlugins()` method.

## 6. Validate the implementation

To validate the implementation, you can update a Propel entity in the Back Office and check if the data is published to the *Storage* or *Search* databases. If any errors occur during the process, you can check the error queue in the RabbitMQ management UI. The error queue is created automatically by adding an `error` suffix to the queue name.

For the Search you can check this [document](/docs/pbc/all/search/latest/base-shop/tutorials-and-howtos/configure-a-search-query.html) to get more info how you can work with data that you just sync.
For the Storage on the other hand, you can check this [document](/docs/dg/dev/backend-development/client/use-and-configure-redis-as-a-key-value-storage) to learn more.</description>
            <pubDate>Fri, 14 Aug 2026 05:58:44 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/backend-development/data-manipulation/data-publishing/implement-publish-and-synchronization.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/backend-development/data-manipulation/data-publishing/implement-publish-and-synchronization.html</guid>
            
            
        </item>
        
        <item>
            <title>Release notes 202606.0</title>
            <description>Spryker Cloud Commerce OS is an end-to-end solution for digital commerce. This document contains a business-level description of new features and improvements.

For information about installing Spryker, see [Getting started guide](/docs/dg/dev/development-getting-started-guide).

## B2B Business-Ready Commerce Experiences

### Recurring Orders {% include badge.html type=&quot;early-access,feature&quot; %}

Recurring Orders let buyers create cadence-based repeat purchases during checkout and execute them automatically on a defined schedule. The feature includes controls for confirmations and approvals, as well as review and recovery flows for basket changes, price changes, or ERP-related issues.

**Key capabilities:**
- Create recurring order schedules such as weekly, bi-weekly, or monthly
- Support buyer-controlled confirmations, skips, modifications
- Detect basket drift, price drift, and ERP errors with clear recovery flows

**Business benefits:**
- Reduces manual effort for repeat procurement
- Helps prevent missed or delayed replenishment orders
- Increases trust through controlled automation, governance, and auditability

**Documentation:**
- [Recurring Orders Feature Overview](/docs/pbc/all/order-experience-management/latest/base-shop/feature-overviews/recurring-orders-feature-overview.html)
- [Install Recurring Orders](/docs/pbc/all/order-experience-management/latest/base-shop/install-and-upgrade/install-features/install-the-recurring-orders-feature)

### Budget &amp; Cost Centers {% include badge.html type=&quot;feature&quot; %}

Budget &amp; Cost Centers introduces native purchasing controls for departmental or project-based spending in B2B commerce. Companies can manage budgets and cost centers directly in Spryker to support compliant, auditable, and policy-driven purchasing workflows.

**Key capabilities:**
- Define and manage cost centers for purchasing activities
- Enforce budgets directly within procurement workflows
- Align spend controls with existing approval processes

**Business benefits:**
- Reduces overspending risk through built-in budget enforcement
- Improves financial transparency across teams and projects
- Streamlines procurement with consistent spend governance in one system

**Documentation:**
- [Purchasing Control Feature Overview](/docs/pbc/all/cart-and-checkout/latest/base-shop/feature-overviews/purchasing-control-feature-overview)
- [Install Purchasing Control](/docs/pbc/all/cart-and-checkout/latest/base-shop/install-and-upgrade/install-features/install-the-purchasing-control-feature)

### New Spryker Design System Storefront

We extended the Spryker design system across key storefront pages, including product listing, product detail, and cart pages. This creates a more consistent and modern buyer experience while giving teams reusable components for faster delivery.

**Key capabilities:**
- Design system applied across the product details page
- New reusable components such as cart entries, pagination, and quantity selectors
- Storybook documentation for reference and reuse

**Business benefits:**
- Improves buyer trust with a more polished storefront experience
- Reduces future implementation and QA effort through reusable patterns
- Strengthens Spryker&apos;s out-of-the-box storefront for demos and evaluations

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/spryker+b2b+design+system-no+voice.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;


### Search Statistics &amp; Google Analytics {% include badge.html type=&quot;feature&quot; %}

Search Statistics brings native search analytics to the Back Office for customers using ElasticSearch. Business users can review frequent searches and zero-result searches to better understand buyer behavior and optimize product discovery.

**Key capabilities:**
- View top frequent searches and top zero-result searches in the Back Office
- Filter analytics by time period and review detailed search data
- Export search statistics to Google Analytics for further analysis and sharing

**Business benefits:**
- Reduces the need for custom project-specific search analytics implementations
- Helps teams improve search relevance, synonyms, and catalog quality based on real data
- Identifies search gaps that can negatively affect discoverability and conversion

**Documentation:**
- [Search Statistics Feature Overview](/docs/pbc/all/miscellaneous/latest/third-party-integrations/marketing-and-conversion/analytics/google-analytics/search-statistics)
- [Install Search Statistics](/docs/pbc/all/miscellaneous/latest/third-party-integrations/marketing-and-conversion/analytics/google-analytics/install-search-statistics)

### Back Office usability improvements {% include badge.html type=&quot;improvement&quot; %}

We improved several Back Office interactions to make administration tasks clearer and less error-prone. This covers block and slot assignment validation.

**Key capabilities:**
- Restores validation feedback when saving block and slot assignments
- Fixes missing menu highlight on the View Merchant page in the Back Office

**Business benefits:**
- Improves clarity during Back Office administration
- Helps business users navigate merchant management more easily

**Releases:**
- [No validation errors when saving block + slot assignment](https://api.release.spryker.com/release-group/6509)


### PunchOut support in the Back Office {% include badge.html type=&quot;improvement&quot; %}

PunchOut support in the Back Office makes PunchOut integrations easier to configure and manage with a more low-code approach. Building on Spryker&apos;s native support for common PunchOut flows and cXML/OCI compatibility, this update adds a dedicated PunchOut section with relevant fields and configuration support. This helps solution teams deliver integrations with less custom development effort.

**Key capabilities:**
- Adds a dedicated PunchOut section in the Back Office
- Supports configuration of relevant PunchOut integration fields in a more low-code way
- Complements native cXML, OCI, and core PunchOut message handling capabilities

**Business benefits:**
- Reduces bespoke development effort for PunchOut integrations
- Makes implementations more repeatable and faster across projects
- Simplifies setup and maintenance for customers and implementation partners

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/Spryker+b2b+Punchout+Backoffice.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;

**Documentation:**
- [PunchOut Gateway](/docs/pbc/all/punchout-gateway/punchout-gateway.html)

### PunchCommerce Punchout Connector {% include badge.html type=&quot;feature&quot; %}

The PunchCommerce Punchout Connector extends Spryker&apos;s support for complex PunchOut scenarios through a partner integration. It is designed for use cases that require multiple eProcurement connectors and document handling beyond Spryker&apos;s native capabilities. This helps customers address more advanced procurement integration requirements.

**Key capabilities:**
- Connects Spryker with PunchCommerce for advanced PunchOut scenarios
- Supports use cases with multiple eProcurement connectors
- Adds support for document-handling requirements not covered by native capabilities

**Business benefits:**
- Broadens PunchOut coverage for more complex B2B procurement scenarios
- Reduces the need for bespoke implementations in advanced projects
- Expands ecosystem support through a specialized partner solution

**Documentation:**
- [https://gitlab.netzdirektion.de/packages/punchcommerce-spryker-module](https://gitlab.netzdirektion.de/packages/punchcommerce-spryker-module)

## Connected, and AI-Enabled Platform

### AI Dev SDK: AI-Assisted Customization for Spryker Projects {% include badge.html type=&quot;early-access&quot; %}

The AI Dev SDK helps teams customize Spryker projects faster and with less manual effort. It supports developers in generating quick proofs of concept and MVP customizations that follow Spryker&apos;s patterns and project conventions, with developers staying in control at each approval point. This helps teams validate ideas faster, keep customization quality more consistent, and lower the manual effort each one takes.

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
      &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/dg/dev/ai-dev/ai-dev-sdk-workflow.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;

**Key capabilities:**
- Orchestrates the full Spryker customization workflow, from research and planning through code generation, testing, and verification, with self-correction when issues are detected and developer approval at key checkpoints
- Automates the technical work needed after every code change, including database migrations, cache rebuilds, and frontend builds
- Offers two quality levels: quick PoC for validating ideas fast, and MVP for delivering code that follows Spryker&apos;s canonical patterns and project conventions

**Business benefits:**
- Speeds up delivery of Spryker customizations, whether a quick proof of concept or an MVP-grade build.
- Reduces development effort and catches issues against Spryker and project standards earlier.
- Lowers the cost of experimentation — quick PoCs make it cheap to validate an idea before investing in a full implementation.

**Documentation:**
- [AI Dev SDK Skills and Agents](/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html)
- [AI Dev SDK Customization Workflow](/docs/dg/dev/ai/ai-dev/ai-dev-customization-workflow.html)
- [Claude Code](/docs/dg/dev/ai/ai-dev/ai-dev-claude-code.html)

### AI Commerce: Smart CMS for AI-assisted content creation {% include badge.html type=&quot;early-access&quot; %}

Smart CMS brings AI assistance directly into the CMS page and block creation in the Back Office. Content editors and business users can generate structured text content in-flow instead of writing or copying content manually. This reduces the effort required to create and update commerce content experiences at scale.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_2.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_smart_cms_3.png||&quot;
%}

**Key capabilities:**
- Generates CMS page and block content directly in the Back Office authoring flow
- Accepts source attachments, such as documents with customer questions, to generate structured content like FAQ pages
- Understands Spryker-specific content items so generated content fits existing content structures

**Business benefits:**
- Reduces manual effort for routine content creation and updates
- Improves productivity for content editors and business admins
- Helps scale content operations more efficiently as content needs grow

**Documentation:**
- [Smart CMS Content Assistant](/docs/pbc/all/ai-commerce/latest/smart-cms-content-assistant)
- [Install Smart CMS Content Assistant](/docs/dg/dev/ai/ai-commerce/content-assistant/install-smart-cms-content-assistant#prerequisites)

### AI Foundation: Back Office AI Configuration {% include badge.html type=&quot;early-access&quot; %}

AI Foundation now includes a unified configuration experience in the Back Office for managing AI providers, models, prompts, and feature-specific behavior. This gives business and operational users a clearer, more consistent way to activate and control AI-powered capabilities, including switching AI vendors or models on the fly, without developer involvement or redeployment.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_configuration_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_configuration_2.png||&quot;
%}

**Key capabilities:**
- Centralizes AI provider and credential management in one configuration area
- Supports feature-level enablement and control of AI behavior, including AI vendor, model, and prompt configuration, with no code changes or deployments required
- Provides an extensible foundation designed to support additional AI-powered features over time

**Business benefits:**
- Simplifies setup and onboarding for AI-powered features
- Gives merchants more control over AI behavior, output quality, and governance
- Reduces configuration errors and repetitive administrative work

**Documentation:**
- [Configure multiple AI providers for AI Commerce](/docs/dg/dev/ai/ai-commerce/configure-multiple-ai-providers)

### AI Foundation: Back Office AI Cost Estimator {% include badge.html type=&quot;early-access&quot; %}

The AI Cost Estimator adds estimated AI cost visibility to the AI Audit Logs in the Back Office. Admins can configure model pricing once and then see estimated costs per interaction, total estimated spend, and breakdowns by provider and model. This makes it easier to understand the cost of individual AI-powered commerce features and make informed decisions about their value and continued use.

{% include carousel.html
images=&quot;
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_cost_estimator_1.png||::
https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202606/bo_ai_cost_estimator_2.png||&quot;
%}

**Key capabilities:**
- Shows estimated cost per AI interaction in the Audit Logs page
- Provides total estimated cost and provider and model-level cost breakdowns based on active filters
- Uses customer-configured provider and model prices, including support for multiple currencies

**Business benefits:**
- Improves visibility into AI operating costs across commerce features
- Supports better governance and value assessment of AI capabilities
- Reduces manual work previously needed to estimate AI spend from token usage

**Documentation:**
- [AI Audit Logs &amp; Cost Estimations](/docs/dg/dev/ai/ai-foundation/ai-foundation-audit-logs)

### GLUE REST API migration to API Platform {% include badge.html type=&quot;feature&quot; %}

Spryker has modernized its internal GLUE REST API infrastructure by migrating it to API Platform. This change is backward compatible for existing API clients, while making APIs easier to maintain, extend, and evolve internally. It also improves the foundation for delivering new endpoints and capabilities faster.

**Key capabilities:**
- Keeps existing external API contracts unchanged for current clients and consumers
- Replaces custom internal API infrastructure with API Platform
- Enables more standardized API generation, validation, and documentation

**Business benefits:**
- Accelerates API delivery and reduces development effort for new endpoints
- Improves maintainability and extensibility of the API layer
- Supports more consistent and predictable machine-to-machine integrations

**Documentation:**
- [API Strategy](/docs/integrations/spryker-api/getting-started-with-apis/api-strategy.html)
- [Spryker API roadmap and adoption](/docs/integrations/spryker-api/getting-started-with-apis/api-roadmap-and-adoption#whats-on-the-roadmap.html)
- [Storefront API B2B Demo Shop reference](/docs/integrations/spryker-api/storefront-api/api-references/storefront-api-b2b-demo-shop-reference.html)

### Backend API added to the Spryker API Strategy {% include badge.html type=&quot;feature&quot; %}

Spryker extended its API strategy to cover the Backend API, the application for administrative and system-to-system integrations. The strategy now documents the API types available under the Backend API—starting with the Back Office API you can build on today—and the types planned on the roadmap, all built on API Platform integration. As with the rest of the strategy, existing Glue Backend APIs remain fully supported with no End-of-Life and no forced migration.

**Key capabilities:**
- Documents the Backend API application and its API types, and clarifies that the Backend API application is distinct from the Back Office API type
- Back Office API is available today for administrator-level and trusted internal integrations
- Roadmap types documented for planning: Merchant API, Merchant Data Exchange API, Data Exchange API, and Async Event API
- Guidance for choosing a Backend API type by caller and data-flow shape—record-by-record, bulk, or event-driven

**Business benefits:**
- Gives a clear, forward-looking view of backend integration options across administration, merchant, data exchange, and events
- Protects existing Glue Backend API investments with a no-End-of-Life, no-forced-migration commitment
- Speeds up planning for ERP, PIM, OMS, and marketplace integrations with consistent guidance

**Documentation:**
- [Spryker API Strategy](/docs/integrations/spryker-api/getting-started-with-apis/api-strategy.html)
- [Spryker API roadmap and adoption](/docs/integrations/spryker-api/getting-started-with-apis/api-roadmap-and-adoption.html)

## Efficient and Flexible Cloud Foundation

### Propel 2.0 LTS  {% include badge.html type=&quot;improvement&quot; %}

This work includes advancing Propel toward a stable release and increasing active maintenance.

**Documentation:**
- [PropelORM](https://github.com/propelorm/Propel2/releases/tag/2.0.0)

### Maintenance and service updates {% include badge.html type=&quot;improvement&quot; %}

We rolled out regular maintenance and service updates across cloud components to keep environments secure, stable, and maintainable. This includes updates to core services and supporting infrastructure components. These changes help reduce operational risk and technical debt over time.

**Key capabilities:**
- Updates core services and infrastructure components such as Nginx 1.30, and Docker images
- Improves long-term maintainability of cloud services
- Updated multiple dependencies

**Business benefits:**
- Improves system reliability and operational resilience
- Updates `shell-quote` to a patched version addressing a critical shell injection vulnerability.
- Upgrades `symfony/runtime` to address unsafe request argument handling.
- Upgrades `symfony/monolog-bridge` to address unauthenticated log listener exposure.

**Documentation:**
- [Docker Images](/docs/about/all/releases/image-releases/spryker-php/release-notes-spryker-php-20260608.html)

### Key-Value Storage Optimization for Dynamic Store Mode {% include badge.html type=&quot;improvement&quot; %}

We optimized key-value storage usage for Dynamic Store Mode to reduce duplicated data across store and locale combinations. This improvement lowers Valkey/Redis memory consumption and key volume while keeping the solution backward compatible and opt-in. It is especially valuable for deployments with multiple stores and locales.

**Key capabilities:**
- Reduces duplicated product abstract and URL storage data in Dynamic Store Mode
- Keeps compatibility with existing storage formats and supports gradual adoption
- Provides an opt-in configuration and migration path for controlled rollout

**Business benefits:**
- Improves scalability for multi-store and multi-locale setups
- Helps delay or avoid costly cache instance size increases

**Documentation:**
- [KV Storage Deduplication](/docs/dg/dev/guidelines/performance-guidelines/kv-storage-deduplication.html)

### Queue processing resilience and worker behavior {% include badge.html type=&quot;improvement&quot; %}

We improved queue processing behavior to reduce the risk of blocked or stalled message handling. The update addresses long-running worker processes, retry queue handling, and premature worker exits while messages are still waiting.

**Key capabilities:**
- Improves handling of long-running or stuck queue worker child processes
- Prevents failed messages from being lost when no retry queue exists
- Ensures `queue:worker:start --stop-when-empty` behaves more reliably

**Business benefits:**
- Reduces the risk of blocked publish and processing pipelines
- Improves operational stability for queue-based workloads
- Helps teams recover from processing failures more predictably

**Documentation:**
- [Publish and synchronization (queue and event performance)](/docs/dg/dev/guidelines/performance-guidelines/keeping-dependencies-updated#publish-and-synchronization-queue-and-event-performance)
- [Enable queue worker wait limit](/docs/dg/dev/guidelines/performance-guidelines/general-performance-guidelines#enable-queue-worker-wait-limit)

### Cloud security improvements {% include badge.html type=&quot;improvement&quot; %}

We delivered a set of cloud security improvements to strengthen infrastructure protection and reduce unnecessary access paths. These updates address container-to-instance access risks, improve IAM controls, and support more secure cloud operations. They also include compatibility adjustments for newer managed service defaults.

**Key capabilities:**
- Tightens IAM policy controls to prevent overly broad administrative permissions in customer PaaS accounts
- Adds compatibility handling for MariaDB 11.8 secure transport defaults in infrastructure templates

**Business benefits:**
- Reduces the risk of unauthorized access to cloud resources and secrets
- Improves security posture across customer environments
- Helps maintain secure operations as infrastructure components evolve

### RDS Auditability Extensions {% include badge.html type=&quot;feature&quot; %}

We have introduced advanced activity tracking for database operations to enhance security governance and accountability across your environments. This update provides clear visibility into data modifications and structural changes within your live production systems.
**Key capabilities:**
- Monitors and records database operations performed in production environments
- Securely retains activity logs for a rolling two-year period to satisfy standard corporate compliance and security policies.

**Business benefits:**
- Provides complete transparency into exactly who executed which database operation, ensuring robust compliance and clear user accountability
- Enhances Security Auditing: Simplifies the detection of potential application exploits—such as SQL injections—by tracking critical service account behaviors

### Persistent Jenkins Configuration {% include badge.html type=&quot;improvement&quot; %}

We have updated our cloud automation storage model to significantly improve platform stability. This enhancement ensures that your custom adjustments are safely preserved during routine platform updates and security maintenance.
**Key capabilities:**
- Permanently safeguards all manually created configurations and fine-tunings across system upgrades and server restarts
- Unlocks continuous, automated operating system upgrades and critical infrastructure patching to keep your system completely protected

**Business benefits:**
- Eliminates the risk of losing bespoke operational settings, removing the need for costly and repetitive manual reconfiguration work
- Enhances your overall security posture by allowing the seamless deployment of critical patches without disrupting business continuity

### Customer authentication and session handling {% include badge.html type=&quot;improvement&quot; %}

We fixed issues affecting customer authentication and session behavior in edge cases. These changes improve reliability for API authentication and login flows.

**Key capabilities:**
- Prevents unintended API authentication behavior related to `spy_customer.registered = NULL`
- Improves error handling for invalid JWT tokens in warehouse token requests
- Avoids false-positive WAF blocking caused by specific patterns that are not malicious.

**Business benefits:**
- Improves trust in authentication flows
- Reduces login-related support cases
- Helps secure customer access scenarios more consistently

**Documentation:**
- [spy_customer.registered=NULL allows API auth](https://api.release.spryker.com/release-group/6618)
- [Adjusted Quote data and UI fixes](https://api.release.spryker.com/release-group/6621)
- [Added optional base64 encoding for gateway](https://api.release.spryker.com/release-group/6633)

### Voucher code tracking and order display accuracy in the Back Office {% include badge.html type=&quot;improvement&quot; %}

We fixed issues with orders that use multiple voucher-code discounts. The Back Office now shows the correct voucher code for each applied discount, and usage counters are updated correctly for all voucher codes used in an order.

**Key capabilities:**
- Displays the actual voucher code used for each discount in the Back Office order overview.
- Correctly increments usage counters for all voucher codes applied to an order.
- Supports orders with multiple non-exclusive voucher-based discounts more accurately.

**Business benefits:**
- Improves trust in discount reporting and order auditability.
- Reduces manual verification effort for merchandising and support teams.
- Ensures voucher campaign performance is tracked correctly.

**Release:**
- [Multiple voucher codes on order](https://api.release.spryker.com/release-group/6640)

### Product and catalog experience improvements {% include badge.html type=&quot;improvement&quot; %}

We improved several product-related experiences in the Back Office and storefront to make catalog management and shopping journeys more reliable. The update covers product images in Zed, product readiness visibility, replacement product rendering, and marketplace product offer handling in carts.

**Key capabilities:**
- Restores product concrete image visibility in the Back Office

**Business benefits:**
- Gives business users clearer product status information
- Reduces confusion during catalog maintenance in the Back Office
- Improves cart accuracy for marketplace shopping scenarios

**Documentation:**
- [Show Product Concrete images in Zed](https://api.release.spryker.com/release-group/6501)

### Storefront performance, search, and content management improvements {% include badge.html type=&quot;improvement&quot; %}

We improved storefront performance, search reliability, content management efficiency, and product data consistency to deliver faster customer experiences, more accurate search results, and better scalability across high-volume environments.

**Key capabilities:**
- Improves checkout and customer-facing page performance by reducing unnecessary backend requests and eliminating Redis bottlenecks for large datasets.
- Enhances product data publishing and search indexing to keep Storage and Search synchronized with catalog changes across multi-store and multi-locale environments.
- Generates search index mappings correctly for advanced analyzer and multi-field configurations.
- Optimizes CMS page version history loading for better Back Office performance when managing long-lived content.
- Preserves locale selection across storefront, configurator, agent emulation, and authentication flows for a more consistent user experience.

**Business benefits:**
- Delivers faster storefront and checkout experiences, even at scale.
- Improves search accuracy and product data consistency across channels.
- Enhances Back Office productivity for content managers.
- Reduces backend load and improves platform scalability.
- Provides a more consistent localized shopping experience for customers and support agents.

**Documentation and Releases:**
- [Cart page and checkout for large carts](/docs/dg/dev/guidelines/performance-guidelines/keeping-dependencies-updated#cart-page-and-checkout-for-large-carts-100-items)
- [Adjusted reading shipment type uuids on Checkout](https://api.release.spryker.com/release-group/5736)
- [Added child fields to index map](https://api.release.spryker.com/release-group/6616)
- [CMS page versions query for the form loads too much data](https://api.release.spryker.com/release-group/6630)
- [Remediate error in spryker/category &gt;= 5.23.0](https://api.release.spryker.com/release-group/6452)
- [Remove Concrete Product on deactivation](https://api.release.spryker.com/release-group/6500)
- [Remove product concrete from the search index](https://api.release.spryker.com/release-group/6574)
- [Locale selection preserved when navigating in the Storefront](https://api.release.spryker.com/release-group/6521)
- [Performance improvements to the checkout](https://api.release.spryker.com/release-group/6479)
</description>
            <pubDate>Fri, 14 Aug 2026 05:50:58 +0000</pubDate>
            <link>https://docs.spryker.com/docs/about/all/releases/release-notes-202606.0.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/about/all/releases/release-notes-202606.0.html</guid>
            
            
        </item>
        
        <item>
            <title>Release notes 202410.0</title>
            <description>Spryker Cloud Commerce OS is an end-to-end solution for digital commerce. This document contains a business-level description of new features and improvements.

For information about installing Spryker, see [Getting started guide](/docs/dg/dev/development-getting-started-guide.html).

## Marketplace Commissions {% include badge.html type=&quot;feature&quot; %}

Commissions are a key way for operators to monetize their marketplaces. Spryker Commission Engine makes defining, calculating, and managing commissions streamlined and transparent for operators and merchants. The engine integrates seamlessly with third-party ERP systems and payment service providers like Stripe.

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
    &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/marketplace-merchant-commission.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;



### Business benefits

- Streamline commission management through automated calculation and application, reducing manual effort and errors.
- Adapt commission structures to evolving business needs seamlessly, supporting marketplace growth and expansion.
- Connect with third-party systems to generate invoices and facilitate payouts, ensuring operational efficiency and financial accuracy.

### Documentation

[Marketplace Merchant Commission feature overview](/docs/pbc/all/merchant-management/latest/marketplace/marketplace-merchant-commission-feature-overview.html)


## Business intelligence powered by Amazon QuickSight {% include badge.html type=&quot;feature&quot; %}

Amazon QuickSight is a business analytics tool integrated directly into the Back Office. This feature enables users to visualize data, create customizable dashboards, and perform deep analytics on sales, product performance, customer behaviors, and marketplace KPIs. By leveraging analytics, you can unlock new monetization opportunities and make more informed business decisions.

![analytics-dashboard](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/analytics-dashboard.png)

### Business benefits

- Immediate access to data analytics with editing, sharing, and viewing tools integrated directly into the Back Office.
- With high customizability and numerous editing and sharing options, you can tailor your analyses to focus on the most important data.
- Support for multiple data sources lets you aggregate data analysis across various systems and use just one tool for all your BI needs.

![analytics-analysis](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/analytics-analysis.png)


### Documentation

[Amazon QuickSight](/docs/pbc/all/business-intelligence/latest/amazon-quicksight-third-party-integration/amazon-quicksight.html)



## Variants section in the Merchant Portal {% include badge.html type=&quot;feature&quot; %}

The new Variants section in Merchant Portal streamlines the management of concrete products. You can now view, sort, filter, and bulk-edit concrete products belonging to different abstract products.

![mp-variants](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/mp-variants.png)


### Business benefits

- Reduces the complexity of managing concrete products
- Improves operational efficiency


### Documentation

- [Edit marketplace concrete products](/docs/pbc/all/product-information-management/latest/marketplace/manage-in-the-merchant-portal/concrete-products/edit-marketplace-concrete-products.html)
- [Install the Merchant Portal - Marketplace Product feature](/docs/pbc/all/merchant-management/latest/marketplace/install-and-upgrade/install-features/install-the-merchant-portal-marketplace-product-feature.html)


## AI Features {% include badge.html type=&quot;early-access&quot; %} {% include badge.html type=&quot;feature&quot; %}

AI-powered features implemented by connecting to third-party APIs:

- Visual search: Enables users to search across the product catalog by uploading an image.
- Product category suggestions: Automates product categorization in the Back Office.
- Product translation: Automates the translation of product information in the Back Office.
- Generation of product image alt text: Generates alt text for product images in the Back Office to improve accessibility and SEO.

### Business benefits

- Offload routine tasks to AI.
- Speed up your workflows.

### AI prerequisites

The AI features leverage Open AI and are provided under the following conditions:

- ChatGPT Plus, Team, or Enterprise license from OpenAI is required.
- Provided as an Early Access release. Early Access releases are subject to specific legal terms. They&apos;re unsupported and don&apos;t provide production-ready SLAs. They can also be deprecated without a General Availability Release. Nevertheless, we welcome feedback from early adopters on these cutting-edge, exploratory features.
- Available as an opt-in and are not automatically integrated into the core product with this release.
- Projects take full responsibility for using AI.


### Documentation

- [Smart Product Management](/docs/pbc/all/product-information-management/latest/base-shop/third-party-integrations/smart-product-management/smart-product-management)
- [Visual Search powered by OpenAI](/docs/pbc/all/search/latest/base-shop/third-party-integrations/visual-search-powered-by-openai/install-visual-search-powered-by-openai)


## Payone ACP app update {% include badge.html type=&quot;feature&quot; %}

The Payone app now supports more payment methods. On top of credit card and Paypal, we have added the following payment methods:

- Prepayment: Order items are shipped after the customer provides a payment receipt.
- Klarna: As a leading global payments and shopping service, Krana supports direct payments, pay-after-delivery options, and installment plans. For customers, these options are a seamless one-click purchase experience that empowers them to pay when and how they choose.

### Business benefits

- Increases customer satisfaction by providing more payment methods and options.
- Configure your Order Management System to capture payments based on your specific business logic.
- Feel secure that the payments follow international standards through fraud prevention and integrated risk management.

### Documentation

[Payone ACP app](/docs/pbc/all/payment-service-provider/{{site.version}}/base-shop/third-party-integrations/payone/app-composition-platform-integration/payone-acp-app.html)

### Technical prerequisites

[Install prerequisites and enable ACP](/docs/dg/dev/acp/install-prerequisites-and-enable-acp.html)



## Stripe ACP app for Marketplace {% include badge.html type=&quot;feature&quot; %}

The Stripe ACP app now fully supports the marketplace business model with the following options:

- Marketplace or admin onboarding: Admin is onboarded and configures the Stripe ACP app.
- Merchant onboarding and KYC: Each merchant is onboarded into the Marketplace and submits a KYC with Stripe.
- Customer payment collection: Collects funds from customers through various payment methods, like credit cards, digital wallets, or bank transfers.
- Authorization and processing: Authorization from the customer&apos;s bank or payment provider ensures that the funds are available and the transaction is legitimate.
- Payment reconciliation: Confirmed payments and refunds are ingested through an API: payment and refund confirmations, pay-in reports, settlement funds. Funds are reconciled, including splits between 1P and 3P.
- Seamless merchant payout: When directed, funds are released to the merchant, leveraging the preconfigured billing cycle rules, order status, and commission rules. This is often in near real-time. The capability can also connect with the Spryker Commission Engine to apply commissions.
- Merchants withdraw funds: Merchants can transfer earnings into a local bank account in preferred currency.
- Optimized payment flow: Redirect customers to a Stripe Elements page or integrate and customize it accordingly through a headless solution.

### Business benefits

- Reach global markets: One payment provider covers 135 currencies, 45+ countries, 100+ payment methods accessible.
- Increase conversion: Accelerate checkout. Calculated 10.5% revenue uplift with the use of Stripe Elements.


### Documentation

[Stripe](/docs/pbc/all/payment-service-provider/latest/base-shop/third-party-integrations/stripe/stripe.html)

### Technical prerequisites

[Install prerequisites and enable ACP](/docs/dg/dev/acp/install-prerequisites-and-enable-acp.html)




## Spryker GPTs {% include badge.html type=&quot;early-access&quot; %} {% include badge.html type=&quot;feature&quot; %}

Spryker GPTs powered by OpenAI LLMs help developers automate crucial areas of software development: quality and performance. These GPTs increase developer efficiency without sacrificing high standards in QA and performance benchmarking:

- Spryker DevQA Assistant: Assists in DevQA tasks by providing comprehensive QA checklists and insights into feature and module mappings and dependencies.
- Spryker Cypress E2E Assistant: Assists with integration and use of the Cypress E2E testing framework; provides guidance, best practices, and real examples.
- Spryker K6 Performance Assistant: Assists with generating K6 performance test scripts from provided API endpoints.


### Business benefits

- Automate or accelerate repetitive tasks related to quality assurance and performance.
- Achieve high-quality results while freeing up developer resources to pursue higher-value tasks for your business.

### AI prerequisites

These GPTs leverage Open AI and are provided under the following conditions:

- ChatGPT Plus, Team, or Enterprise license from OpenAI is required.
- Provided as an Early Access release . Early Access releases are subject to specific legal terms. They&apos;re unsupported and don&apos;t provide production-ready SLAs. They can also be deprecated without a General Availability Release. Nevertheless, we welcome feedback from early adopters on these cutting-edge, exploratory features.
- Available as an opt-in and are not automatically integrated into the core product with this release.
- Projects take full responsibility for using AI.

### Documentation

These GPTs have since been retired. For current AI-assisted development tooling, see the [AI Dev SDK](/docs/dg/dev/ai/ai-dev/ai-dev-overview.html).

## Audit logs {% include badge.html type=&quot;feature&quot; %}

Audit logs improve security monitoring and transparency by letting you track all security actions performed by users in all applications: Storefront, Back Office, Merchant Portal, and Glue API. Audit logs cover login related activities, including agent assist impersonation sessions.

![audit-logs](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/audit-logs.png)

### Business benefits

- Enhanced security monitoring: Track and review key user actions, such as login and password changes, across all platform areas.
- Compliance support: Automatic deletion schedules let you comply with legal and data privacy standards.
- Customizable logging: Adjust logging preferences to focus on specific events or applications, ensuring relevant activities are tracked.
- Improved accountability: Tracking security-related user activities promotes accountability and transparency across the platform.


### Documentation

- [Audit logs](/docs/dg/dev/backend-development/audit-logs/audit-logs.html)
- [Working with logs](/docs/ca/dev/monitoring/working-with-logs.html)






## Dynamic Multistore {% include badge.html type=&quot;feature&quot; %}

Previously in early access, Dynamic Multistore is integrated into the core product in this release.

Dynamic Multistore is an enhanced version of the multi-store capability. This feature enables Back Office users to create new stores without engineering support or having to redeploy the application. With this feature, multiple stores can also operate under the same domain.

![dynamic-multistore](https://spryker.s3.eu-central-1.amazonaws.com/docs/pbc/all/dynamic-multistore/dynamic-multistore.md/managing-stores.png)

### Business benefits

- Empowers you to make changes faster.
- Provides flexibility in managing stores.
- Reduces complexity.


### Documentation

- [Dynamic Multistore feature overview](/docs/pbc/all/dynamic-multistore/latest/base-shop/dynamic-multistore-feature-overview.html)
- [Install Dynamic Multistore](/docs/pbc/all/dynamic-multistore/latest/base-shop/install-and-upgrade/install-features/install-dynamic-multistore.html)




## Product Comparison {% include badge.html type=&quot;feature&quot; %}

Product comparison enables customers to easily compare products on mobile and desktop devices. Customers can make more informed purchase decisions by viewing side-by-side comparisons of key product specifications and attributes.

![compare-products-page](https://spryker.s3.eu-central-1.amazonaws.com/docs/pbc/all/product-information-management/base-shop/feature-overviews/product-comparison-feature-overview.md/compare-products-page.png)

### Business benefits

- Increases conversion rates and customer satisfaction
- Reduces the likelihood of returns


### Documentation

- [Product Comparison feature overview](/docs/pbc/all/product-information-management/latest/base-shop/feature-overviews/product-comparison-feature-overview.html)
- [Install the Product Comparison feature](/docs/pbc/all/product-information-management/latest/base-shop/install-and-upgrade/install-features/install-the-product-comparison-feature.html)



## Dynamic Cart {% include badge.html type=&quot;feature&quot; %}

Dynamic cart improves user experience by providing instant, smooth, and uninterrupted feedback to cart changes. Based on AJAX, dynamic cart is updated without a reload for actions like adjusting item quantity, removing an item, or redeeming a discount code. Cart and shopping list widgets in the header also show changes without a page reload.

&lt;figure class=&quot;video_container&quot;&gt;
    &lt;video width=&quot;100%&quot; height=&quot;auto&quot; controls&gt;
    &lt;source src=&quot;https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/dynamic-cart-video.mp4&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
&lt;/figure&gt;

### Business benefits

- Enhanced user experience: Making changes in cart without reloading the page allows for an uninterrupted shopping experience. This leads to higher satisfaction and smoother interactions, especially on mobile devices.
- Increased cart conversion rates: Eliminating page reloads reduces friction in the shopping journey, resulting in higher conversion rates and ultimately driving revenue growth.

### Documentation

[Dynamic cart overview](/docs/pbc/all/cart-and-checkout/latest/base-shop/feature-overviews/cart-feature-overview/dynamic-cart-overview.html)




## Discount condition: number of orders {% include badge.html type=&quot;improvement&quot; %}

Discounts can now be applied based on the total number of order a customer placed. Using the `customer-order-count` discount condition, you can define how many orders a customer should have placed to qualify for the discount.


![discount-condition](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/discount-condition.png)

### Business benefits

- Personalized promotions: Enable tailored discounts based on customers&apos; order history, improving engagement with new and returning customers.
- Boost customer acquisition: Offer specific discounts to first-time buyers, encouraging new customer sign-ups and conversions.
- Strengthen customer retention: Reward repeat buyers with discounts, fostering loyalty and increasing the likelihood of future purchases.


### Documentation

[Decision rules: Attributes and operators](/docs/pbc/all/discount-management/latest/base-shop/manage-in-the-back-office/create-discounts.html#decision-rules-attributes-and-operators)
[Install the Promotions &amp; Discounts + Order Management feature](/docs/pbc/all/discount-management/latest/base-shop/install-and-upgrade/install-features/install-the-promotions-and-discounts-order-managemet-feature.html)



## Category tree improvements {% include badge.html type=&quot;improvement&quot; %}


This update introduces the following UX improvements to the Category Tree in the Storefront:

- Collapsible categories: Customers can now expand and collapse categories, making it easier to navigate product categories.
- Hidden empty categories: Categories with no available products are automatically hidden, providing a cleaner and more focused shopping experience.

![category-tree](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/category-tree.png)

### Business benefits

Customers make faster buying decisions based on better navigation and more focused content delivery.




## Multi-value product attributes {% include badge.html type=&quot;improvement&quot; %}


This feature enables product attributes to have multiple values. For example, a &quot;Charging&quot; attribute could have the following values:

- MagSafe
- Qi2
- Qi

![back-office-multi-value-attribute](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/back-office-multi-value-attribute.png)

Such attributes are displayed with all of their values across the platform, including search, filtering, and product details pages.

![storefront-multi-value-attribute](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/storefront-multi-value-product-attribute.png)

### Business benefits

- Customers get a complete picture of products by all values being presented per attribute.
- Enhanced product filtering: Customers can search and filter products based on multiple attribute values and combinations, enabling them to find products faster and with specific requirements.
- Efficient data management: Back Office users can organize complex products more efficiently.

## Documentation

[Create product attributes](/docs/pbc/all/product-information-management/latest/base-shop/manage-in-the-back-office/attributes/create-product-attributes.html)




## View Merchant page in the Back Office {% include badge.html type=&quot;improvement&quot; %}

Back Office users can now view all relevant merchant information at a glance without entering the edit mode. Merchant details are consolidated into one comprehensive page, streamlining the process of accessing and reviewing merchant data.

![view-merchant-page](https://spryker.s3.eu-central-1.amazonaws.com/docs/About/Releases/release-notes-202410.0.md/view-merchant-page.png)

### Business benefits

- Simplifies data review processes by consolidating key merchant information in a single, non-editable page.
- Eliminates accidental changes when viewing merchant information.


## Back Office accessibility improvements {% include badge.html type=&quot;improvement&quot; %}

Back Office is now more accessible to everyone, enabling all types of users to interact and navigate the system. We have implemented the following accessibility improvements:

- Navigation: Users can navigate drawer content and content behind drawers using the **Tab** key.
- Keyboard control: Users can interact with form elements and links using the keyboard.
- Colors and contrast: Improved color contrast and added text as an alternative source of information besides color.




## Improved management of user roles in the Back Office {% include badge.html type=&quot;improvement&quot; %}

Back Office areas and actions are now predefined. When managing access of user roles, you can select areas and actions instead of manually entering them.

### Business benefits

- Simplifies the management of user access.
- Reduces the risk of errors when providing and restricting access.



## Publish and Synchronize configuration and optimization {% include badge.html type=&quot;improvement&quot; %}

Publish and Sync (P\&amp;S) process has been improved as follows:

- Performance optimization through direct sync: Synchronization queues can be enabled and disabled on the project level. When disabled, synchronization proceeds directly to the synchronize step without intermediate queuing, resulting in faster and more streamlined system performance.
- Custom queue chunk size configuration: Developers can define custom message chunk sizes per queue. This allows for fine-tuned control over how many messages are processed per queue, like publishing, synchronization, or data import. The docs provide detailed guidance on when to increase or decrease chunk sizes for improved performance.
- Improved event logger behavior: The event logger now consumes less resources.
- System health check notifications for P\&amp;S limits: Provides developers with notifications when processed data is reaching system limits. Notifications are sent in the following cases:
  - A worker exceeds 75% of its available memory.
  - Event message size surpasses 256KB: this protects the message broker.
  - The size of a request during entity publishing exceeds 1MB: this ensures compatibility with persistence capabilities.

### Business benefits

- More fine-tuned control over the system.
- Optimized performance through flexibility.
- Processing time reduced.
- Get more actionable insights into system behavior.
- Prevent performance issues and system overload by proactively addressing potential bottlenecks.

### Documentation

- [Publish and Synchronization](/docs/dg/dev/backend-development/data-manipulation/data-publishing/publish-and-synchronization.html)
- [Queue](/docs/dg/dev/backend-development/data-manipulation/queue/queue.html)


## Tech update {% include badge.html type=&quot;improvement&quot; %}

The following components have been updated to ensure compatibility with the latest technologies and optimize performance:

- PHP 8.3 is now supported; support for PHP 8.1 is discontinued.
- Jenkins has been upgraded to the latest LTS version. All new cloud environments are now deployed with this version by default. For local development, the new version of Jenkins requires Docker SDK version 1.61.0 or higher.
- Improved Jenkins&apos; resource management by adding SWAP memory on the infrastructure level. This addresses memory-related issues causing job failures and instability.
- The Angular framework has been updated to version 17, providing faster performance and smaller asset sizes for the merchant portal.
- PHPStan has been upgraded to version 1.10, significantly improving code analysis speed.

### Business benefits

- Reduced security risks
- Reduced maintenance efforts
- Scaling and more reliable operation

### Documentation

- [Supported versions of PHP](/docs/dg/dev/supported-versions-of-php.html)
- [PHPStan](/docs/dg/dev/sdks/sdk/development-tools/phpstan.html)
- [Upgrade to Angular 17](/docs/dg/dev/upgrade-and-migrate/upgrade-to-angular-17.html)



## Stripe metadata {% include badge.html type=&quot;improvement&quot; %}

Spryker projects running the Stripe ACP app can now send custom metadata to Stripe.

### Documentation

[Sending additional data to Stripe](/docs/pbc/all/payment-service-provider/latest/base-shop/third-party-integrations/stripe/project-guidelines-for-stripe/sending-additional-data-to-stripe)




## Developer guides {% include badge.html type=&quot;improvement&quot; %}

The following updated and new developer guides have been released:

- Guides for [developing standalone modules](https://docs.spryker.com/docs/dg/dev/developing-standalone-modules/developing-standalone-modules.html) show how to create reusable packages and contribute to the community.
- A guide on [AI coding assistants](https://docs.spryker.com/docs/dg/dev/ai-coding-assistants.html) offers insights into how engineers can improve and optimize their workflows with AI.
- [Project development guidelines](https://docs.spryker.com/docs/dg/dev/guidelines/project-development-guidelines.html) have been refreshed, providing clarification on shortcuts and sharing tips and tricks for simplifying development processes.



## Community Contributions {% include badge.html type=&quot;improvement&quot; %}

This release introduces performance optimizations, bug fixes, and feature improvements contributed by the external community. These improvements address issues like memory consumption in product publishing, slow page searches, and various bug fixes.

- Performance improvements:
  - Static cache for concrete product images in P\&amp;S improves efficiency with multiple locales.
  - Reduced memory usage in abstract product publishing with many stores, locales, and concretes.
  - Removed redundant `getStoreAndLocaleKey` calls.
  - Less SQL queries are issued by preventing empty queries.
- General improvements:
  - Added a flag to cache the OMS definition.
  - Improved the sorting behavior in the Merchant Portal
- Bug fixes and other minor improvements

Big thanks for your valuable contributions!
</description>
            <pubDate>Fri, 14 Aug 2026 05:50:58 +0000</pubDate>
            <link>https://docs.spryker.com/docs/about/all/releases/release-notes-202410.0.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/about/all/releases/release-notes-202410.0.html</guid>
            
            
        </item>
        
        <item>
            <title>Post-Installation Configuration</title>
            <description>This document provides guidance on advanced configuration and customization of your Spryker project after completing the initial setup. These steps help you optimize and adapt the Demo Shop to your specific project needs.

## Automate this configuration with the AI Dev SDK

Most of the work on this page — services, stores, and import data — is covered by AI Dev SDK skills. Each skill reads what your project actually contains rather than applying a template, and reports what it plans to change before changing it.

| Skill | What it does | Reference |
|-------|--------------|-----------|
| `configure-services` | Changes what infrastructure the project runs on, or builds a new environment deploy file. Makes surgical edits to the keys it owns, leaving neighboring deploy file blocks untouched | [README](https://github.com/spryker-sdk/ai-dev/blob/master/plugins/spryker-ai-dev-sdk/skills/configure-services/README.md) |
| `define-stores` | Creates or redefines a project&apos;s stores and region. Clears the hardcoded store and locale literals that otherwise abort the boot | [README](https://github.com/spryker-sdk/ai-dev/blob/master/plugins/spryker-ai-dev-sdk/skills/define-stores/README.md) |
| `project-data` | Populates, reshapes, reduces, cleans up, or removes the project&apos;s import data — one skill for every `data/import` change | [README](https://github.com/spryker-sdk/ai-dev/blob/master/plugins/spryker-ai-dev-sdk/skills/project-data/README.md) |
| `spryker-import-tools` | Reads, filters, edits, and validates data import CSV files and manifests. Reliable where shell tools corrupt multi-line quoted fields, and catches boot-aborting data in seconds | [README](https://github.com/spryker-sdk/ai-dev/blob/master/plugins/spryker-ai-dev-sdk/skills/spryker-import-tools/README.md) |
| `curate-golive-data` | Makes the data the project keeps production-safe before go-live — placeholder tax rates, Spryker CDN imagery, and demo accounts | [README](https://github.com/spryker-sdk/ai-dev/blob/master/plugins/spryker-ai-dev-sdk/skills/curate-golive-data/README.md) |

If you are setting up a new project, the [Project Starter Wizard](/docs/dg/dev/ai/ai-dev/ai-dev-project-starter-wizard.html) runs these skills in order from a single interview. Run them individually when you are configuring a project that already exists.

For the full list of skills and agents, see [Skills and Agents](/docs/dg/dev/ai/ai-dev/ai-dev-skills-and-agents.html).

The rest of this document describes the same configuration manually.

## Manage modules

A Spryker module is a single-function unit that has well-defined dependencies and can be updated independently. [Composer](/docs/dg/dev/set-up-spryker-locally/manage-dependencies-with-composer.html) is used for installing and managing module dependencies.
To define your strategy when implementing updates, learn about our [module and feature release process](/docs/about/all/releases/product-and-code-releases.html).

To learn about the module versioning approach in Spryker, see [Semantic Versioning: Major vs. Minor vs. Patch Release](/docs/dg/dev/architecture/module-api/semantic-versioning-major-vs.-minor-vs.-patch-release.html).

## Clean up modules

1. Go through the modules that came with the Demo Shop you&apos;ve installed.
2. Come up with the list of modules you actually need.
3. Remove unnecessary modules by following module upgrade guides in a backwards fashion.

## Configure services

1. Define how to manage the settings in the configuration files with [Configuration management](/docs/dg/dev/backend-development/data-manipulation/configuration-management.html).
2. [Configure services](/docs/dg/dev/integrate-and-configure/configure-services.html).
3. [Configure Elasticsearch](/docs/pbc/all/search/{{site.version}}/base-shop/tutorials-and-howtos/configure-elasticsearch.html).
4. [Configure queue](/docs/dg/dev/backend-development/data-manipulation/queue/queue.html).
5. [Configure stores](/docs/dg/dev/internationalization-and-multi-store/set-up-multiple-stores.html#configure-stores).
6. [Set up cronjobs](/docs/dg/dev/backend-development/cronjobs/cronjobs.html).

The `configure-services` skill applies steps 2 to 4 to your deploy file.

## Clean up store configuration

The `define-stores` skill performs this cleanup, including the hardcoded store and locale literals that are easy to miss and that abort the boot when left behind.

If you chose to start with one store, clean up the configuration of the unneeded stores in the following files:
- `config/install/*`
- `data/import/*`
- `deploy.dev.yml`
- `config_default.php`
- `src/SprykerConfig/CodeBucketConfig.php`

## Clean up data import

The `project-data` skill performs this cleanup, and `spryker-import-tools` edits and validates the CSV files themselves.

- In `data/import`, remove the files of the unneeded stores.
- Change the default config in `DataImportConfig::getDefaultYamlConfigPath()`.
- Define the needed stores in `CodeBucketConfig::getCodeBuckets()`.

## Prepare for go-live

Before go-live, replace the demo values the Demo Shop ships with — placeholder tax rates, Spryker CDN imagery, and demo customer accounts. The `curate-golive-data` skill finds and resolves them.</description>
            <pubDate>Fri, 14 Aug 2026 05:50:58 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/post-installation-configuration.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/post-installation-configuration.html</guid>
            
            
        </item>
        
        <item>
            <title>Development tools</title>
            <description>&lt;p&gt;Spryker provides a comprehensive suite of development tools that cover every aspect of the development lifecycle—from debugging and performance profiling to code quality assurance and AI-assisted development. These integrated tools ensure developers have everything needed to build, maintain, and scale high-quality e-commerce applications efficiently.&lt;/p&gt;
&lt;h2 id=&quot;why-development-tools-are-essential&quot;&gt;Why development tools are essential&lt;/h2&gt;
&lt;p&gt;Modern e-commerce development demands robust tooling to manage complexity, ensure code quality, and maintain high performance. Quality development tools provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster debugging&lt;/strong&gt;: Identify and fix issues quickly with proper debugging and profiling tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code quality&lt;/strong&gt;: Maintain high standards through automated static analysis and architectural validation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance optimization&lt;/strong&gt;: Profile application performance and identify bottlenecks before they reach production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer productivity&lt;/strong&gt;: Accelerate development with AI-assisted coding and automated quality checks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upgradability&lt;/strong&gt;: Ensure your project follows best practices, making upgrades smoother and less risky&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team consistency&lt;/strong&gt;: Enforce coding standards and architectural patterns across the entire development team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without proper development tools, projects accumulate technical debt, suffer from performance issues, and become increasingly difficult to maintain and upgrade.&lt;/p&gt;
&lt;h2 id=&quot;sprykers-complete-development-toolkit&quot;&gt;Spryker’s complete development toolkit&lt;/h2&gt;
&lt;p&gt;Spryker provides an integrated ecosystem of development tools, eliminating the need to search for, evaluate, and configure third-party solutions. All tools are pre-configured to work seamlessly with Spryker’s architecture and development workflow.&lt;/p&gt;
&lt;h3 id=&quot;debugging-tools&quot;&gt;Debugging tools&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Xdebug integration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spryker includes Xdebug support for interactive debugging and profiling:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Step-through debugging&lt;/strong&gt;: Set breakpoints, inspect variables, and trace code execution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance profiling&lt;/strong&gt;: Identify slow functions and performance bottlenecks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/set-up-spryker-locally/configure-after-installing/configure-debugging/configure-debugging.html&quot;&gt;Configure Xdebug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/set-up-spryker-locally/configure-after-installing/configure-debugging/set-up-xdebug-profiling.html&quot;&gt;Set up XDebug profiling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;performance-profiling-tools&quot;&gt;Performance profiling tools&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;WebProfiler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WebProfiler is available for all Spryker application layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/integrate-and-configure/integrate-development-tools/integrate-web-profiler-widget-for-yves.html&quot;&gt;Web Profiler Widget for Yves&lt;/a&gt; - Storefront profiling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/integrate-and-configure/integrate-development-tools/integrate-web-profiler-for-backend-gateway.html&quot;&gt;Web Profiler for Backend Gateway&lt;/a&gt; - API Gateway profiling&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/docs/dg/dev/integrate-and-configure/integrate-development-tools/integrate-web-profiler-for-zed.html&quot;&gt;Web Profiler for Zed&lt;/a&gt; - Back Office profiling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;code-quality-tools&quot;&gt;Code quality tools&lt;/h3&gt;
&lt;p&gt;Spryker provides a complete suite of code quality tools tailored to e-commerce development and Spryker’s architecture:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHPStan - Static analysis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PHPStan performs type checking and code analysis to catch bugs before runtime:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type safety validation&lt;/li&gt;
&lt;li&gt;Dead code detection&lt;/li&gt;
&lt;li&gt;Incorrect method calls identification&lt;/li&gt;
&lt;li&gt;Configuration: Pre-configured for Spryker projects at level 6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/docs/dg/dev/sdks/sdk/development-tools/phpstan.html&quot;&gt;PHPStan documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code Sniffer - Code style enforcement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ensures consistent code formatting and adherence to coding standards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PSR-12 compliance&lt;/li&gt;
&lt;li&gt;Spryker-specific coding standards&lt;/li&gt;
&lt;li&gt;Automatic code style fixing capabilities&lt;/li&gt;
&lt;li&gt;IDE integration for real-time feedback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/docs/dg/dev/sdks/sdk/development-tools/code-sniffer.html&quot;&gt;Code Sniffer documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture Sniffer project ruleset - Project-specific validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Validates that the code follows Spryker’s project architectural patterns and conventions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer separation enforcement&lt;/li&gt;
&lt;li&gt;Project-specific architectural patterns&lt;/li&gt;
&lt;li&gt;Custom business logic validation&lt;/li&gt;
&lt;li&gt;Integration pattern compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/docs/dg/dev/sdks/sdk/development-tools/architecture-sniffer.html&quot;&gt;Architecture Sniffer documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evaluator - Upgradability and compatibility checks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Validates project compatibility with Spryker core and checks upgrade readiness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Core module compatibility validation&lt;/li&gt;
&lt;li&gt;Deprecated feature detection&lt;/li&gt;
&lt;li&gt;Breaking change identification&lt;/li&gt;
&lt;li&gt;Upgrade path recommendations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/docs/dg/dev/guidelines/keeping-a-project-upgradable/run-the-evaluator-tool.html&quot;&gt;Evaluator tool documentation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;ai-assisted-development-tools&quot;&gt;AI-assisted development tools&lt;/h3&gt;
&lt;p&gt;Spryker embraces AI technology to accelerate development and improve code quality:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI Dev Tool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Advanced AI development capabilities integrated into the development workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intelligent code suggestions&lt;/li&gt;
&lt;li&gt;Architectural pattern guidance&lt;/li&gt;
&lt;li&gt;Automated refactoring recommendations&lt;/li&gt;
&lt;li&gt;Context-aware documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/docs/dg/dev/ai/ai-dev/ai-dev-overview.html&quot;&gt;AI Dev Tool documentation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;integrated-development-workflow&quot;&gt;Integrated development workflow&lt;/h2&gt;
&lt;p&gt;All Spryker development tools work together seamlessly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Write code&lt;/strong&gt; with AI Assistant guidance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debug issues&lt;/strong&gt; using Xdebug integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile performance&lt;/strong&gt; with WebProfiler&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validate quality&lt;/strong&gt; with Code Sniffer, PHPStan, and Architecture Sniffers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check upgradability&lt;/strong&gt; with Evaluator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run in CI&lt;/strong&gt; with automated validation pipelines&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This integrated approach ensures consistent quality across the entire development process.&lt;/p&gt;
&lt;h2 id=&quot;best-practices&quot;&gt;Best practices&lt;/h2&gt;
&lt;p&gt;To maximize the value of development tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Run tools locally&lt;/strong&gt;: Catch issues before pushing to CI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure IDE integration&lt;/strong&gt;: Get real-time feedback while coding&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use WebProfiler proactively&lt;/strong&gt;: Profile performance during development, not just when issues arise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review Evaluator output regularly&lt;/strong&gt;: Stay informed about upgrade compatibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage AI tools&lt;/strong&gt;: Speed up development with AI-assisted code generation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce in CI&lt;/strong&gt;: Make quality checks mandatory in pull request pipelines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update regularly&lt;/strong&gt;: Keep development tools up-to-date to benefit from new features and improvements&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Spryker provides everything developers need to build, maintain, and scale world-class e-commerce applications—no additional tooling required.&lt;/p&gt;
</description>
            <pubDate>Fri, 14 Aug 2026 05:50:58 +0000</pubDate>
            <link>https://docs.spryker.com/docs/dg/dev/development-tools.html</link>
            <guid isPermaLink="true">https://docs.spryker.com/docs/dg/dev/development-tools.html</guid>
            
            
        </item>
        
    </channel>
</rss>
