← Library

Nuvemshop to Shopify: how to migrate without losing SEO

How to migrate Nuvemshop to Shopify without losing SEO: collect the old URLs, map every path, bulk-upload 301s via CSV and fix your Google Merchant feed.

E-commerce and ShopifySeptember 18, 202611 min read

The short answer

Migrating from Nuvemshop to Shopify is a change of URL map, and that is where SEO either walks away or stays standing: this applies to stores that live on organic search and have already chosen their destination. Authority does not live in the platform, it lives in the indexed addresses and in the links pointing to them. Shopify serves products at /products/{handle}, collections at /collections/{handle} and articles at /blogs/{blog}/{article} (article object), a pattern it does not let you rewrite. So the math is simple: every URL that brings clicks today needs a 301 pointing to its new equivalent, and Google treats a 301 as permanent and starts showing the destination (Google Search Central). What nobody maps is the rest: nested categories, tags, blog, images and the Merchant Center feed. If the platform decision is not closed yet, the live articles are Tray vs Shopify and WooCommerce and risk.

1. SEO is not in the platform, it is in the URL map

When the domain stays the same and only the path changes, Google does not need to relearn the whole site. It needs to find, at each old address, a 301 to the new address. Without that, the old URL returns a 404 (Shopify serves the 404 template for invalid paths, according to the template architecture) and the signal accumulated at that address stops flowing.

The difference between the two platforms is structural, not cosmetic. On Nuvemshop, products and categories carry a handle generated from the name, per language, and categories have a real hierarchy: there is a parent field and a subcategories list (Product, Category). On Shopify, collections are flat. The Liquid collection object exposes handle, title, products and tags, and exposes neither a parent collection nor subcollections (collection object).

In plain terms: a category tree with two or three levels becomes a set of collections on the same level. That is a mapping decision, not a theme detail. Whoever does not decide it upfront finds out later, with a string of 404s on subcategory URLs, which tend to be exactly the long-tail pages that convert.

2. Collect the real list of URLs before touching anything

The temptation is to export the catalog and think you are done. The catalog is the inventory; what Google indexed is another list, and it includes pages you forgot existed. Three sources add up, in this order:

The current store's sitemap gives you what the platform publishes today. Search Console gives you what actually receives clicks and impressions (Performance report, export by page, longest period available in the report). The server or provider log gives you what is still being crawled, including old URLs that are no longer in the sitemap and are still being visited.

The third item is what separates a migration that was done from a migration that was hoped for. Google recommends looking at recently visited URLs when building the inventory for a site move (How to move a site). A discontinued category page, a retired product with backlinks, an old blog post: all of that goes into the spreadsheet even if it no longer exists in the catalog.

A check that costs little: download the sitemap and count the URLs by path type.

curl -s https://sualoja.com.br/sitemap.xml \
  | grep -o '<loc>[^<]*</loc>' | wc -l

3. The mapping spreadsheet, column by column

The map is a spreadsheet with source and destination, and nothing else. Shopify calls those two fields path and target in the UrlRedirect object (Admin GraphQL): path is the old path, target is where the person goes. It is worth keeping three extra working columns: type (product, category, blog, page, tag), click volume in the exported period, and review status.

Sort by clicks, not alphabetically. The rule that saves time: products and categories with traffic get a destination checked one by one; the rest goes in by rule and is reviewed by sampling. The same handle on both sides does not mean the same URL, because the prefix changes. A different handle (an accent stripped a different way, a product name edited during import) means a broken 301 even with the right product imported.

Two mistakes always show up. The first is the chain: the old URL points to an intermediate one that points to the final one. Google asks you to avoid redirect chains in a site move. The second is the lazy shortcut: sending everything without a destination to the home page. Mass-redirecting to the home page hands the visitor a page that does not answer the search intent; a discontinued product is better pointed to the equivalent collection, and only what has no equivalent at all becomes an honest 404.

4. Path mapping, type by type

Shopify's route patterns are documented in the Liquid routes object: /collections, /collections/all, /search, /cart (routes). The table below is what remains after crossing that with the structure Nuvemshop exposes in its API. Lookups made on 2026-09-18.

Page type Nuvemshop Shopify 301 caveat
Product path with the product handle, one per language (Product) /products/{handle} A handle rewritten during import breaks the map even with the right product
Category handle per language, with parent and subcategories (Category) /collections/{handle}, no hierarchy (collection) A subcategory becomes a flat collection: decide the destination first
Category list tree of up to 1,000 categories (Category) /collections and /collections/all (routes) Do not send a specific category to /collections/all
Blog its own article path /blogs/{blog}/{article} (article) The blog name goes into the path and is often forgotten
Search its own path /search (routes) An indexed search page is a candidate for noindex, not for a 301
Platform domain original_domain on nuvemshop.com.br (Store) *.myshopify.com If the platform domain was indexed, that is a different migration

The catalog limit matters for large stores: the Nuvemshop API responds with a 422 and "Store has reached maximum limit of 100000 allowed products" and "Store has reached maximum limit of 1000 allowed categories" (Product, Category). These are platform ceilings, not migration ceilings, but they give you the order of magnitude of the spreadsheet.

A sample check, before and after the cutover, saves you from discovering problems through Search Console weeks later.

curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' \
  https://sualoja.com.br/produto-antigo

5. Upload the 301s in bulk, without typing them one by one

A store with hundreds of URLs cannot handle manual entry. Shopify imports redirects in bulk via CSV, and the documented route is the urlRedirectImportCreate mutation, which takes "The staged upload URL of the CSV file" and requires the write_online_store_navigation scope; after it, submission is done with urlRedirectImportSubmit (Admin GraphQL). The same page offers a sample CSV so you can check the format before generating yours.

The CSV is the spreadsheet from section 3 reduced to two columns: old path and destination. Without the API, the same file goes up through the redirect import in the admin. What matters is the content, not the entry point.

What to check before importing

Relative paths, consistent from start to finish, without mixing absolute URLs and paths. No row pointing to another row in the same file, which is the chain Google asks you to avoid. A destination that actually exists in the new store, verified by HTTP response and not by looking at the spreadsheet. Accents and capitalization handled the same way across the whole list, because the Nuvemshop handle already comes normalized and your spreadsheet may not.

After the import, reading the existing redirects uses the urlRedirects query, with the read_online_store_navigation scope (UrlRedirect). It is useful for auditing what went up, comparing it with the source spreadsheet.

6. What breaks beyond products: collections, tags, blog and images

Products are the easy part, because they have a SKU and a name to anchor the check. What knocks down traffic is everything else.

Nested collections. The Nuvemshop hierarchy has no counterpart in Shopify. A subcategory with its own traffic has to become its own collection, with its own handle and its own 301. Pushing them all into the parent category turns several distinct search intents into a single page.

Tags. Shopify uses tags for filters and for collection automation. The collection object returns at most 1,000 tags in all_tags, and storefront filters are empty on collections with more than 5,000 products (collection). If the old strategy relied on indexed tag pages, they need an explicit destination in the map, not an improvisation in the theme.

Blog. This is where most old links get lost, because the Shopify URL carries the blog name in the middle of the path (article). Migrating the posts without mapping the old paths throws away content that already ranked and took time to produce.

Images. Images are now served by Shopify's CDN, at a different address. What was indexed in Google Images will reindex on its own; the real problem is old content pointing to the previous host. It is worth reviewing robots.txt, which on Shopify is the robots.txt.liquid template and must be Liquid (Templates).

Internal links. After the cutover, every link inside the site should point to the new URL, without going through a 301. Redirects are for external links and for Google's index, not for saving theme work.

7. Merchant Center, ads and the feed that stops matching

Merchant Center does not see the store admin, it sees the URL. When the path changes, the landing link of every item changes. Google's specification treats conflicting data between the feed and the site as a common cause of disapproval and lists its own landing page requirements (Product data specification).

The sensitive point is the id attribute, which the same specification defines as the product's unique identifier. Changing the id of every item at once is resetting that item's history. Keeping the id stable and letting the link and availability change is the least turbulent path.

The same applies to paid ads with a fixed final URL and to links on social media, email and marketplaces. The 301 covers whoever arrives via the old path, but an active campaign link is better fixed at the source. The obvious check, done before the cutover: run the list of destinations and confirm a 200 response on all of them.

8. After the cutover: what to measure and how long to keep it

A redirect is not a one-day task, it is infrastructure that stays. Google is explicit: keep redirects for as long as possible, "generally at least 1 year" (How to move a site). Deleting the list after two months because "it is over" is throwing the work away.

In the first weeks, three dashboards tell you almost everything. The Search Console Coverage and Pages report shows 404s appearing in volume, which is the symptom of URLs missing from the map. The Performance report, compared by page, shows which path lost clicks and lets you find the missing 301. Merchant Center shows disapprovals by landing page, which is usually the first to scream.

About the Search Console Change of Address tool: it exists for domain changes, not path changes. The help page itself says not to use it when you are only moving some pages from one location to another within the site, in which case adding redirects and updating the sitemaps is enough. It requires a domain-level property, requires you to own both source and destination, and forwards signals for 180 days (Search Console Help). If the domain is the same on both sides, the 301 map does the job on its own.

Reindexing does not happen on cutover day: Google crawls at its own pace and the old list leaves the index gradually, as each URL is revisited. Fluctuation in the first weeks is normal; a 404 on a page with clicks is not. For the operational sequence of catalog, cutover and DNS, the sibling article is the migration checklist without going dark.

Frequently asked questions

Will I lose Google rankings when migrating from Nuvemshop to Shopify?

There is no guarantee or honest numerical forecast here, and anyone offering a percentage is making it up. What you can control is the most common cause of a drop: old URLs without a 301. A complete map, with no chains and with equivalent destinations, is what Google asks for in its site move documentation. What you do not map becomes a 404, and a 404 on a page with clicks is a certain loss.

Can I keep the old URLs identical on Shopify?

Not the prefixes. Products live under /products/, collections under /collections/ and articles under /blogs/{blog}/, according to Shopify's own theme and Liquid documentation. You control the handle; you do not control the prefix. That is why the migration is always a path change and always requires 301s, even when keeping the same domain.

How long do I need to keep the redirects active?

At least one year, which is Google's recommendation for a site move with URL changes. In practice, a URL redirect on Shopify costs no maintenance and no noticeable performance, so there is no reason to delete it. Old backlinks keep arriving long after the first year.

What if I want to use the migration to reorganize the categories?

Technically you can; in the same switch, it is stacking risk. Google warns that combining a site move with a content and URL structure overhaul will likely cause traffic loss, because the pages need to be discovered and evaluated again. Migrate with the closest possible structure, stabilize, reorganize later. The forced exception is the category hierarchy, which Shopify does not reproduce.

Do I need to rebuild the Merchant Center feed from scratch?

The feed now comes from Shopify, so the source changes. What is not advisable is changing the id attribute of every item without need, since it is the product's unique identifier in Google's specification. Keep id stable where you can and treat link and availability as the fields that actually changed.

Conclusion

A Nuvemshop to Shopify migration is decided in the URL spreadsheet, not in the choice of theme. Build the real inventory from the three sources, map each path type, upload the 301s via CSV and only then look at what is left: nested collections, tags, blog, images and feed. After the cutover, the job is monitoring 404s and keeping the redirects live for at least a year. If you want to know whether your store fits this plan, send your current platform, plan and URL to oailton.dev/en/contato. If you have not created your Shopify store yet, talk to me before you do: the store is born as a development store, built ready and transferred to your name.

Sources

  1. 01A Nuvemshop product has a handle (URL-friendly string) per language, plus seo_title of up to 70 characters and seo_description of up to 320; a store accepts at most 100,000 products, 1,000 variants and 250 images per product (read on 2026-09-18) Nuvemshop API Documentation (Product)
  2. 02A Nuvemshop category has a handle per language, a parent field and subcategories, and a store accepts at most 1,000 categories (read on 2026-09-18) Nuvemshop API Documentation (Category)
  3. 03A Nuvemshop store has domains and an original_domain in the nuvemshop.com.br pattern (read on 2026-09-18) Nuvemshop API Documentation (Store)
  4. 04Default Shopify storefront routes: /collections, /collections/all, /search, /cart, /search/suggest (read on 2026-09-18) Shopify.dev (Liquid routes object)
  5. 05The Liquid collection object exposes handle, tags and all_tags with at most 1,000 tags returned, and filters are empty on collections with more than 5,000 products; there is no parent category field Shopify.dev (Liquid collection object)
  6. 06A Shopify article handle includes the blog, in the blog/article format, which produces the URL /blogs/{blog}/{article} Shopify.dev (Liquid article object)
  7. 07A Shopify theme has a 404 template for invalid URLs and a robots.txt.liquid template, which must be Liquid; the limit is 1,000 JSON templates per theme Shopify.dev (Templates)
  8. 08The UrlRedirect object has the fields path (old path) and target (destination) and requires the read_online_store_navigation scope for reading Shopify.dev (Admin GraphQL, UrlRedirect object)
  9. 09Bulk redirect import uses urlRedirectImportCreate with the URL of a CSV, requires the write_online_store_navigation scope, and Shopify provides a sample CSV; submission is done with urlRedirectImportSubmit Shopify.dev (Admin GraphQL, urlRedirectImportCreate)
  10. 10HTTP 301 and 308 are permanent redirects and Google recommends server-side permanent redirects whenever possible; the permanent target is shown in search results Google Search Central (Redirects and Google Search)
  11. 11For a site move with URL changes, Google recommends keeping redirects for as long as possible, generally at least 1 year, and avoiding redirect chains (read on 2026-09-18) Google Search Central (How to move a site)
  12. 12The Change of Address tool only works for domain-level properties, requires ownership of both source and destination, forwards signals for 180 days and should not be used when only paths change within the same site Search Console Help (Change of Address tool)
  13. 13In Merchant Center, the id attribute is the product's unique identifier and conflicting data between the feed and the site is among the common issues that cause disapproval; there are specific landing page requirements Google Merchant Center Help (Product data specification)

Ailton Carvalho

I build custom web systems, internal tools, integrations and stores that sell on mobile. You get working code and someone accountable after launch.

Talk on WhatsApp

Related