Running a real online store is very different from installing a clean copy of an e-commerce platform and testing a few extensions.
Over time, a webshop accumulates custom modifications, old URLs, category structures, redirects, product options, tracking scripts, image systems, language files and features that were never designed to work together. What appears to be a simple SEO problem can therefore be connected to several different parts of the platform.
I have experienced this first-hand while developing and maintaining Strygestof.dk, a Danish craft store specializing in heat transfer vinyl, iron-on patches, adhesive vinyl and creative cutting projects.
The store is based on a heavily modified OpenCart installation. It has gradually developed from a relatively traditional Danish webshop into a multilingual platform with an English version, separate language URLs, technical SEO controls, automated audits and several AI-assisted workflows.
This article is not a description of one perfect extension or a single quick fix. It is a summary of the areas that turned out to matter most when improving a real OpenCart store without rebuilding everything from scratch.
A Real Store Produces More URLs Than Expected
One of the first major challenges was URL consistency.
An OpenCart product can often be reached through several routes:
- A short product URL.
- A URL containing the complete category path.
- Search and tag URLs.
- Manufacturer or campaign URLs.
- Old URLs left behind after categories or products are renamed.
- URLs containing tracking or sorting parameters.
These addresses may show the same product, but search engines still have to determine which URL represents the primary version.
Google describes canonicalization as the process of selecting one representative URL from a group of identical or very similar pages. Redirects, canonical annotations and sitemap inclusion can all contribute signals, although they do not have equal strength.
For the store, this meant that choosing a preferred URL structure was only the first step. The same decision had to be reflected consistently across:
- Canonical tags.
- XML sitemaps.
- Internal links.
- Breadcrumbs.
- Language links.
- Redirects from former URLs.
- Links generated by custom modules.
A canonical tag is useful, but it should not be used as an excuse to keep linking internally to unwanted URL versions. If the sitemap says one thing, the canonical tag says another and the menu produces a third URL, the store is sending conflicting signals.
The practical objective became simple:
Every important page should have one preferred URL, and the rest of the platform should consistently support that choice.
Redirects Should Lead to the Closest Relevant Page
Old addresses are unavoidable on a shop that has existed for several years.
Products are renamed. Categories are reorganized. Short URLs are replaced with more descriptive ones. Blog posts move into new topic structures. Some products disappear entirely.
The easy solution is to redirect every obsolete address to the front page. It is also usually a poor experience for visitors. Someone following an old link to a specific iron-on product is not necessarily helped by landing on a generic homepage.
Instead, old URLs should normally be redirected to the closest useful replacement:
- An old product URL to the current product.
- A discontinued product to a closely matching alternative or category.
- An old article URL to the updated article.
- An obsolete category to its replacement category.
Permanent redirects tell both visitors and search engines that the content has moved. Google treats permanent redirects as a signal that the destination should become canonical.
This also made a broken-link manager valuable. Redirects could be registered centrally rather than scattered across configuration files, extension code and server rules.
However, redirects should not become permanent clutter. Internal links should still be updated to point directly to the final destination. A redirect is useful for old external links and bookmarks, but the webshop itself should not deliberately send every visitor through an unnecessary extra request.
Multilingual OpenCart SEO Is More Than Translating Text
The next major development was the English version of the shop, now available through Strygestof.dk in English.
Adding a language selector is relatively straightforward. Building a multilingual store that search engines can understand is considerably more involved.
Each translated page needs its own stable URL. Google recommends using separate URLs for separate language versions rather than changing the language only through cookies, browser preferences or dynamic content replacement.
For this project, the English version uses an /en URL structure. That makes the language visible and gives every translated product, category, information page and article a distinct address.
The important technical relationships are then:
- The Danish page should have a Danish self-referencing canonical.
- The English page should have an English self-referencing canonical.
- Each version should identify the other through appropriate language annotations.
- Language references should be reciprocal.
- Internal navigation should keep visitors inside their chosen language where possible.
- Sitemaps should contain the correct canonical URLs for each language.
A translated page should generally not canonicalize back to the Danish version merely because the Danish page was published first. When the main content is genuinely translated, the pages serve different language audiences.
The visible content must also be properly translated. Google determines the language from the visible page content rather than relying solely on the HTML language attribute or hreflang.
This became especially important in OpenCart because text can come from many places:
- Product and category descriptions.
- Theme language files.
- Extension language files.
- Option names and option values.
- Checkout messages.
- Buttons and stock messages.
- Blog extensions.
- Custom modules.
- Banners and images containing text.
Translating only products and categories can therefore leave a page with a mixture of English and Danish interface elements.
Sitemaps Should Reflect the Store You Want Indexed
A sitemap is not a complete SEO solution, but it is a useful declaration of which URLs the store considers important.
Google explains that a sitemap can help search engines discover and crawl pages more efficiently, but inclusion does not guarantee crawling or indexing. Proper internal linking remains important.
The most useful rule for this project was:
Only include URLs that should genuinely appear in search results.
That normally excludes:
- Redirecting URLs.
- Pages marked
noindex. - Duplicate parameter URLs.
- Search result pages.
- Obsolete language routes.
- Non-canonical versions of products and articles.
- Pages returning errors.
OpenCart stores often generate large numbers of functional URLs. Not every URL that works for a visitor belongs in a sitemap.
A sitemap index also makes it possible to separate products, categories, articles and languages. This is helpful when troubleshooting because each sitemap can be checked independently in Search Console.
The sitemap should support the chosen canonical structure rather than fight against it. Google considers sitemap inclusion a weaker canonical signal than a redirect or canonical annotation, but consistent signals can reinforce one another.
Performance Still Matters on a Feature-Rich Store
Mortal.dk originally contained several articles about improving OpenCart performance through caching, optimized images, fewer requests and CDN delivery. Those principles remain relevant, although the tools have evolved.
A modern webshop can become heavy surprisingly quickly:
- Large product images.
- JavaScript from themes and extensions.
- Tracking and analytics scripts.
- Search and recommendation features.
- Fonts and icons.
- Multiple language and currency components.
- Dynamic product options.
- Third-party chat or support tools.
Strygestof.dk uses Cloudflare as part of the infrastructure. Cloudflare can cache static resources such as images, CSS and JavaScript at distributed data centers, reducing repeated load on the origin server. Dynamic HTML requires more careful rules because account, basket and checkout pages must not be cached like ordinary public content.
Image optimization is particularly valuable for a craft store. Customers need detailed and accurate product images, but unnecessarily large source files should not be sent directly to every device.
The challenge is therefore not simply to compress every image as much as possible. It is to deliver an appropriate format and size while preserving the details that help customers distinguish colors, textures and finishes.
Performance optimization also needs to be tested on real store functions. A change that improves a synthetic score but breaks product options, tracking, login sessions or the basket is not an improvement.
AI Is Useful, but It Needs Controls
AI has become useful for several parts of the workflow:
- Translating product and category information.
- Suggesting meta titles and descriptions.
- Drafting ALT text.
- Categorizing content.
- Finding missing translations.
- Generating synonyms for search.
- Identifying possible technical SEO problems.
The largest benefit is not allowing AI to publish everything automatically. The benefit comes from using it to process repetitive work while retaining rules, logs and human review.
This is especially important for a specialized store. Terms such as heat transfer vinyl, iron-on fabric, adhesive vinyl, transfer tape and iron-on patches can overlap, but they are not interchangeable in every context.
A technically correct translation can still be commercially confusing. A generic image description can be accurate but useless as ALT text. A generated meta title can be grammatically correct while targeting the wrong search intent.
For that reason, the AI workflows need controls such as:
- Selecting which provider or model is used.
- Previewing suggestions before publication.
- Limiting maximum lengths.
- Preserving product names and technical terms.
- Recording what was changed.
- Allowing manual overrides.
- Identifying missing content without inventing information.
AI should support the store’s data and editorial decisions, not become the source of truth.
Search Should Be Treated as a Product Feature
Search is another area where a standard OpenCart function can become insufficient.
Customers do not always use the same words as the shop owner. A customer may search for “iron-on,” “HTV,” “heat transfer,” “transfer vinyl,” “name labels” or a misspelled variation of a product name.
A useful search system therefore needs more than exact keyword matching. It can combine:
- Traditional keyword results.
- Synonyms and spelling corrections.
- Product attributes and categories.
- Semantic search.
- Search logs showing queries with poor results.
- AI assistance when ordinary search is insufficient.
The important part is to keep the experience responsive. AI should not delay every search or replace reliable conventional results when a normal product match already exists.
The administration side also needs control over whether AI appears first, runs as a fallback or is offered through a separate button. Customers should be shown when additional processing is taking place rather than being left with an apparently frozen interface.
Search logs can then become a practical source of business information. A failed search may reveal:
- A missing synonym.
- An unclear product title.
- A product customers expect but the shop does not carry.
- A spelling variation.
- A category that is difficult to navigate.
- Missing translated terminology.
Technical SEO Is Mostly About Consistency
The most important lesson from the project is that technical SEO is rarely one isolated setting.
A store may have a correct canonical tag but still link internally to the wrong URL. It may have translated products but leave the checkout and option values in Danish. It may have an XML sitemap containing URLs that redirect. It may use a CDN but still send oversized images or load unnecessary scripts.
The individual components must agree:
- URLs.
- Canonicals.
- Redirects.
- Sitemaps.
- Language annotations.
- Internal links.
- Page content.
- Status codes.
- Performance rules.
A heavily modified OpenCart store will never behave exactly like a clean demonstration installation. Every extension, custom route and historical decision adds another variable.
That is also what makes a live store such as Strygestof.dk a useful technical case. The work is not performed in an empty test environment. Changes must coexist with customers, products, orders, old links and features that already have a purpose.
The goal is not to reach a theoretical state where no warning ever appears in a webmaster tool. The goal is to create a consistent system in which users and search engines are guided toward the correct, useful and current version of every page.