Emergency: the shop is down or the checkout breaks off
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.
The manufacturer does not run a support hotline for technical faults. The telephone number on shopware.com leads to sales and general enquiries; technical support requires a paid plan and runs through account.shopware.com, and operators of the Community Edition are explicitly referred to the community forum. So anyone looking for somewhere to report a fault is looking for something that does not exist at the manufacturer in that form. Here, somebody picks up the phone, Monday to Friday, 9:00 to 16:00 CET. We do not promise response times in hours across the board. Either they are in a service level agreement or they are nowhere. Outside Monday to Friday, 9:00 to 16:00 CET, nobody here answers the phone. If you need someone on a Saturday evening, you need an on-call arrangement. That exists only with an SLA, and it costs money in the months when nothing happens as well.
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.
Shopware 5 to 6: a rebuild with the data carried over
Migrating from Shopware 5 to Shopware 6 is not an update. It is a rebuild with the data carried over. The Shopware Migration Assistant is free in the Shopware Store and currently compatible with 6.6.0.0 to 6.7.13.0; the Migration Connector plugin is installed in the source shop as well. It carries over products, variants, manufacturers, categories, customers, orders including order documents, media, shipping methods, cross-selling, custom fields, SEO URLs and product reviews, among other things. Before the run starts there is a data check that asks for mappings — assignments for everything that cannot be resolved automatically.
The Shopware Migration Assistant migrates data and nothing else. It does not migrate your appearance, your functions or your interfaces. The theme and the extensions are built again, and the ERP, PIM and CRM connections are wired up again. That is where the cost sits, not in the data transfer, and it is the part operators are regularly surprised by. One more trap: leave the sales channels created during the first run in place. If customers are attached to them, the database refuses to delete them anyway with a foreign key violation, and removing the channel by some other route risks incomplete subsequent runs. After every run, compare the number of customers and orders carried over against the old shop. Customers and orders do simply go missing.
In the end, a migration succeeds or fails on the redirects. The SEO URLs from Shopware 5 can be carried over, but Shopware 6 uses a different URL structure; without a complete redirect plan you lose rankings built up over years on the day you switch, and you lose them for good. We generate the plan from the old data, not from assumptions, and check it before the cutover. If you have no time for that right now, safefive patches for Shopware 5 buy you some air. That is an extension of the deadline, not a solution. Nobody guarantees position 1 along the way, and neither do we.
Interfaces: Admin API, Store API, Sync API
Shopware 6 has two APIs plus a special route for bulk data that is regularly mistaken for a third. The Admin API is the administrative interface: authentication over OAuth 2.0 in the client credentials flow, the integration is created under Settings → System → Integrations, the Access Key ID is the client_id and the Secret Access Key is the client_secret. The token is requested by POST to /api/oauth/token, is valid for 600 seconds by default and is then sent along as a bearer header; when it expires, you request a new one. The Store API is the customer-facing interface for product search, cart and checkout. It authenticates through the sales channel's sw-access-key header, not through OAuth.
For bulk data there is the Sync API: not a separate access route, but an endpoint of the Admin API at /api/_action/sync, using the same token. It knows only two operations, upsert and delete, so it does not distinguish between creating and changing. What decides the runtime is the indexing-behavior header: without it, indexing happens immediately inside the request; with use-queue-indexing the message queue takes over; with disable-indexing it is skipped entirely. Run a full import without that header and you will wait orders of magnitude longer. For B2B procurement there are OCI and cXML punch-out catalogues on top. That is neither a core feature nor a module of the B2B Components — it comes from a third-party extension or is built in-house on the Store API. The buyer starts in the procurement system, fills the cart in the shop and hands it back.
The hard questions in an ERP connection are not technical but operational: who owns which field — price, stock, description? What happens when the import breaks off halfway through? May the same record be written twice without doing damage? And who reads the error log? Shopware 6 handles static tiered and customer group prices through the Rule Builder. For customer-specific prices out of the ERP there are two routes: the Customer Specific Pricing API in the Shopware Commercial extension and, in the B2B Components, the Individual Pricing module. Anyone who avoids both and turns every customer into their own customer group drives the product_price table into absurdity. The row count then grows with every customer times every article, and the lookup against that table becomes the bottleneck in the checkout.
Performance: the cause first, Redis afterwards
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 infrastructure.
Valkey, Redis and OpenSearch do not repair a bad query. A search index does not speed it up, it only moves it, and a silent fallback to the MySQL search hides the problem until the catalogue grows. Set SHOPWARE_ES_THROW_EXCEPTION=1 so that fallback becomes visible. On the database side, two values belong in the configuration: group_concat_max_len from 320000 upwards and a sql_mode without ONLY_FULL_GROUP_BY. On the PHP side there are four: opcache.validate_timestamps=0, opcache.interned_strings_buffer=20, zend.assertions=-1 and realpath_cache_ttl=3600. These are operating parameters, not insider tips. They are missing surprisingly often all the same.
The operating stack recommended in the Shopware documentation can be held against your hosting line by line: PHP 8.4 recommended and 8.2 as the minimum, memory_limit from 512M; MariaDB 11.4 or MySQL 8.4; Node.js 24 with npm 10 for the administration build; Valkey 8.0 or alternatively Redis 7+; OpenSearch 2.17.1; Caddy as the recommended web server, with Nginx and Apache also supported. Anything below that is not a performance problem, it is a hosting problem. We run Shopware instances on our own servers in Germany, on Proxmox PVE clusters, with PHP 8.4, Valkey and OpenSearch.
Taking over someone else's shop: look 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.
For the handover we need access, and the list is always the same: hosting or server, database, Git repository, Shopware account, API keys and integrations, plus the configuration of Redis or Valkey and of any Varnish in front. You do not have to change your hosting for this. We work on what is there; moving to our servers is a separate decision with a separate quote. Missing documentation is not a reason to decline. Undocumented code is the normal case, not the exception. The real risk in changing agency is rarely the change itself, it is the unknown state of the old system. How long a change takes is decided by exactly that state: with complete access and an existing Git repository we are typically looking at a few weeks. The number you can rely on is in the findings report, not before it.
After the findings report there are two ways of working with us. Either you commission individual pieces of work — one fault, one update, one interface — 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 errors that reach us most often sit. You cannot support code you do not know. That is why we take on no support without a review first. We have been developing in Oldenburg under the Sharpness name since 1999; the contracting party is Sharpness Solutions GmbH.