Shopware 6 does not use a separate installation per store. A single codebase serves multiple storefronts through Sales Channels, and each channel is bound to one or more domains. The hosting-side work is making every subdomain resolve to the same document root that already runs Shopware, then registering that exact URL inside the Sales Channel domain list.

Point subdomains at the Shopware document root

Every storefront domain must serve the same public/ directory. Do not create a fresh document root per subdomain — that produces a bare directory or the default panel page instead of Shopware.

In DirectAdmin, create the subdomain under Account Manager > Subdomain Management, then correct its document root under Domain Setup so it points at the primary domain's public folder:

/home/USER/domains/example.com/public_html/public

If Shopware lives in a subfolder, adjust the path accordingly. On cPanel, create the subdomain under Domains > Domains > Create A New Domain and set the same document root. Symlinking is cleaner than duplicating files:

ln -s /home/USER/domains/example.com/public_html/public \
      /home/USER/domains/store2.example.com/public_html

Confirm the symlink resolves and that Options +FollowSymLinks is not blocked by the vhost. On LiteSpeed, symlink following is enabled by default, but verify with a quick request to a static file under the new subdomain before continuing.

Register the domain in the Sales Channel

In the Administration, open the Sales Channel, go to the Domains section, and add the full URL exactly as visitors reach it, including scheme:

https://store2.example.com

Each domain entry pairs a URL with a language and currency. Shopware routes an incoming request by matching the host against these entries, so a trailing slash or an http vs https mismatch will send visitors to the wrong channel or trigger a redirect loop. The host in the browser must match one registered domain character for character.

After adding or changing a domain, clear the cache so the router picks up the new mapping:

cd /home/USER/domains/example.com/public_html
php bin/console cache:clear

Run this as the site user with the correct PHP binary. On CloudLinux with the PHP selector, call the version-matched binary, for example /opt/alt/php83/usr/bin/php, so the CLI uses the same PHP as the storefront.

Fix APP_URL and forced redirects

Shopware reads APP_URL from the .env.local file in the project root. That value is the canonical URL used for the Administration, asset generation, and internal links:

APP_URL=https://example.com

A single APP_URL serves all sales channels — the storefront routing is handled by the domain entries, not by this variable. If APP_URL uses http while your channel domains use https, mixed-content and redirect problems appear on the subdomain storefronts. Set it to the HTTPS admin URL and clear the cache.

If a subdomain immediately 301-redirects to the primary domain, the request host does not match any Sales Channel domain, so Shopware falls back to the default channel. Recheck the exact URL string in the Domains list against what the browser sends.

Issue TLS for every subdomain

Each storefront host needs a valid certificate or browsers will block it before Shopware runs. Issue certificates under SSL Manager in DirectAdmin or Security > SSL/TLS Status in cPanel, and include every subdomain. A wildcard covering *.example.com avoids reissuing per channel.

Because Shopware forces HTTPS when a channel domain is registered with the https scheme, a missing or self-signed certificate on the subdomain surfaces as connection errors rather than a Shopware page.

Separate storefronts with independent data

If the goal is genuinely isolated stores — separate products, orders, and customers, not just a second language domain — use multiple Sales Channels within one installation first. Each channel gets its own domain, theme assignment, category tree, and product visibility, which covers most multi-store requirements without a second database.

Only run a second full Shopware instance when stores must be fully independent, including separate admin logins and updates. That means a distinct document root, a distinct database, and its own .env.local with a unique APP_URL and DATABASE_URL:

DATABASE_URL=mysql://store2_user:PASSWORD@127.0.0.1:3306/store2_db
APP_URL=https://store2.example.com

Create the second database and its user in DirectAdmin's MySQL Management or cPanel's MySQL Databases, then run the Shopware installer or CLI setup against that root. Keep each instance's cron scheduler and message consumer separate so background tasks do not cross stores.

Rebuild themes and assets after channel changes

Assigning a different theme to a new channel requires a storefront build, otherwise the subdomain loads with unstyled or default assets:

./bin/build-storefront.sh
php bin/console theme:compile
php bin/console assets:install

Run these from the project root as the site user. If build-storefront.sh is unavailable in a production package, theme:compile followed by assets:install is sufficient to regenerate the per-channel theme output.

Verify the routing

Request each storefront host directly and confirm it returns that channel's homepage, not a redirect to the primary domain:

curl -I https://store2.example.com

A 200 with the expected content means the domain, document root, and Sales Channel mapping all line up. A 301 to the main domain points back to a host mismatch in the Domains list; a panel default page means the subdomain document root was never repointed to public/.