Shop hacked: secure first, do not clean up
When a Shopware shop has been hacked, securing it comes first, not cleaning it up: put the shop into maintenance mode or take it offline at the host, copy the files and the database, secure the server and access logs, lock the administrative accounts. Only then does the analysis begin. The obvious impulse — delete the suspicious files, change the admin password and carry on selling — destroys evidence and does not close the door. The back door is almost never where the first suspicious file is.
In a Shopware 6 shop we look where attackers settle in: additional users under Settings → System → Users, unknown integrations with Admin API access under Settings → System → Integrations, modified Twig templates and JavaScript files in the theme and in the extensions under custom/plugins and custom/apps, injected HTML in Shopping Experiences and snippets, unknown files under public/ and scheduled tasks on the server. We compare core and extensions with the original sources from Composer and the Store. That shows what was added or changed, and the access logs show when and by which route.
A skimmer in the checkout is the most serious case, because it harvests data while the shop goes on selling as normal. It usually sits as a script loaded from a template or an extension and reads what customers type into forms. If your checkout redirects to the payment provider, the risk to card data falls — the risk to addresses, customer accounts and orders does not. Inform your payment provider as soon as payment pages may have been tampered with. If personal data was accessible, Article 33 GDPR requires notification of the competent supervisory authority within 72 hours. We provide the technical facts for that; whether a notification is made is for you to decide with your data protection officer.
Restore cleanly and close the gap
The cleanest way back is a backup from before the break-in, brought up to date with every security update released since. Orders and customer accounts created after the backup are reconciled and carried over once checked. If there is no reliable backup, we rebuild Shopware and the extensions from the original sources and take over from the infected installation only what can be checked: database content, media and your own plugins after a code review.
After that every set of credentials is changed, without exception: administrators, integrations and API keys, database, SFTP and SSH, payment and shipping services, mail delivery. A key the attacker knows makes the best restoration worthless. Then the cause is closed — usually a Shopware version without security updates or an outdated extension — and the shop is hardened: a second factor in front of the administration, administration only from known networks and, if you wish, a firewall in front with Cloudflare whose rules do not lock out payment providers and the ERP.
Shopware publishes security advisories for its versions, and the patch against an exploited vulnerability is almost always available by the time the break-in happens. The uncomfortable lesson from such cases: security updates at fixed intervals would usually have prevented the incident, at a fraction of what analysis and rebuilding cost. We do not promise one hundred per cent security. What we establish is a state in which mass attacks come to nothing and an incident stays an incident.
Shop broken: 500 error, blank page, empty administration
A 500 error (HTTP 500, “Internal Server Error”) in the checkout of a Shopware 6 shop almost always has one of three causes: cache, indexing or a plugin. The order to work through yourself: 1. Read the log files under var/log/. 2. bin/console cache:clear, cache:clear:http and cache:warmup. 3. bin/console dal:refresh:index if new products do not appear. 4. bin/console plugin:deactivate, then cache:clear again. Messages such as “Unable to generate a URL for the named route” point to the cache or to routing. An error from the search index — Elasticsearch or OpenSearch — when a category is opened points to the index, and bin/console es:index is the answer. “Class not found” or a blank page points to a plugin. If you have been through all of that and are still in the dark, you need someone with shell access.
After an update, the most common defect is an extension that no longer fits the new version. Shopware 6.7 was an infrastructure release with hard breaking changes: the administration build system moved from Webpack to Vite, state management from Vuex to Pinia, the Cached*Route classes were dropped, and header and footer load via ESI. Extensions and custom templates built on any of that break silently — the administration stays blank, the checkout throws errors. We check the plugin and template state against the target version before an update goes into production, and we run updates from the command line rather than through the graphical updater.
When something breaks, we work backwards from the last state that worked: what was deployed last, which plugin was installed, what the Composer state looks like. We reproduce the fault on a staging system, not in the live shop. Nothing gets fixed until the cause has a name. A rollback is a decision, not a panic reaction. Anyone who runs updates only through the graphical interface and has no staging system also has no way back. That is the gap we close first, because it makes the next emergency cheaper than this one.
Problems in day-to-day operation: slow, wrong stock, Shopware 5
A slow Shopware shop usually has a chain of causes rather than a single culprit, and the chain can be worked through in a fixed order. First: is the instance still running in development mode? Then Shopware writes debug logs on every request and recompiles templates. Switching to production mode alone usually produces the single largest gain; how large, we say after the measurement, not before it. Second: is the HTTP cache actually switched on via SHOPWARE_HTTP_CACHE_ENABLED=1? Third: how many plugins sit in the request path, and what are they doing there? Only after that is it worth talking about Redis, Valkey or OpenSearch.
If the ERP reports different stock levels than the shop, Shopware itself is almost never the cause. Since Shopware 6.6 stock is a real-time value: product.stock is written forward by the order events, and the former “available stock” is now only a read-only mirror of the same field. Differences are therefore almost always a synchronisation or reservation problem: which system writes last, are reservations counted twice, does the import break off halfway? We resolve that at the interface, not in the index.
If the shop still runs on Shopware 5, that is not an acute defect, but it is an open risk: Shopware 5 has been out of the manufacturer's maintenance since the end of July 2024, and every new vulnerability stays open unless you buy patches through safefive — the paid third-party service that took the maintenance over. safefive postpones the migration date. It does not replace it. A migration to Shopware 6 is not an update but a rebuild with a data transfer. How we build shops is described on a page of its own.
Taking over other people's shops: review first, commit afterwards
We take over existing Shopware shops, but not blind. It starts with a review: Shopware version and patch level, the Composer and plugin list with the origin of each entry, the amount of custom code, the state of the hosting, the deployment routes that exist, the backups and whether they can actually be restored. Out of that comes a findings report with a risk list and an estimate — a self-contained first deliverable, not a sales conversation. Only then do we say what we can take on. A commitment made before looking at the code would be guesswork, and guessing about somebody else's code is not a method.
After the findings report there are two ways of working with us. Either you commission individual pieces of work — one fault, one update, one clean-up — and we bill by time and materials. Or we agree a maintenance contract with an SLA that sets out response times, availability and scope in writing. The difference from the manufacturer's support: Shopware supports its own product, not your third-party plugins and not your custom code. That is exactly where the faults and vulnerabilities that reach us most often sit. We have been developing in Oldenburg under the Sharpness name since 1999; the contracting party is Sharpness Solutions GmbH.