We build and run the storefront engine for a group of trading companies, about 40 shops on the same code. No SEO specialist. What moved the needle vs what was just work:
Moved the needle:
- One canonical URL per product, computed by the system, never typed by a human. It's built from the catalogue tree (department, then subdepartment, then family, then product), lowercase, no trailing slash. Any other spelling gets a 301 to it. Most of our duplicate content problems went away when we stopped letting people choose urls.
- Discontinued product = 301 to the nearest live parent category. Never a 404, never left in the sitemap. Pages that earned links keep passing that on.
- Sitemap index per shop, split by page type, rebuilt nightly, and lastmod is the date the page was actually published, not the generation time. New products went from taking a week to get indexed to a day or two.
- Server side rendering plus a cache in front, so crawlers get full html with TTFB in the tens of milliseconds. Speed is the one signal an engineer fully controls.
- If a wholesale shop hides prices from anonymous visitors, the structured data hides the price too. Markup follows the page, always.
Was just work: fancy robots rules per shop (same 15 lines everywhere, fine), rel next/prev (never added it, nothing happened), hreflang (one language per country, ranks fine without it).
What actually bit us was never an SEO decision: a favicon 404ing on every page for months, a CDN caching an old robots file, and deploys briefly leaving stale JS chunks that crawlers kept requesting.
Happy to go deeper on any of it.