Import from Shopify

Bring a Shopify store into Modulify with its products, collections, pages, blog posts, customers, order history, images and files, and copies of its storefront pages.

On this page

Import from Shopify brings a Shopify store into Modulify. It reads the store's data and its live theme through a Shopify app you connect, copies the published storefront pages, and puts everything into a new site. The import runs in the background, and the site's chat shows its progress and warnings. The prompt field does not apply to a Shopify import.

This page covers the import dialog. For how the migration works, where each part of the store lands and what to do once it has finished, see Migrate from Shopify.

Start the import

Click + on the prompt on Home, then choose From Shopify under Import. The import dialog opens. Enter your store address in Store address, connect the store, then tick I own this site, or I have permission to rebuild it. and select Confirm. The store address can be your myshopify.com address or your own domain.

Once the store is connected, the dialog shows the store's name and how many products, collections, pages, customers and orders it has.

The prompt then shows the store as a card with a screenshot of its home page, what the import found and an Import site button. When the store is password protected, no screenshot of the password page is taken, and the card shows the store's social sharing image instead, or no picture when it has none. The dialog then warns The online store is password protected, so its pages cannot be copied. The store data still comes across, and the AI builds the pages from your theme when the app has read_themes. Use the pencil to change the store or the cross to remove it, and select Import site to create the site and start the import. Inside a project's chat, From Shopify is greyed out, because a Shopify import starts a new site.

Connect your store

The import dialog connects to Shopify in one of two ways. Choose the one you want in the dialog.

  • Connect a Shopify app uses an app that you create for your store in Shopify's Dev Dashboard. It is marked Recommended.
  • Use an access token uses the token of a custom app you created in your Shopify admin before January 1, 2026.

The dialog lists the scopes the app needs. A scope you leave out only affects the data that needs it, and the dialog names any scope the app is missing. Orders older than 60 days need read_all_orders as well as read_orders, translations need read_translations, and your theme needs read_themes.

Connect with a Shopify app

Open the Dev Dashboard

In your Shopify admin, go to Settings, then Apps, choose Develop apps, then Build apps in Dev Dashboard.

Create the app

Choose Create app, then Start from Dev Dashboard, give the app a name and choose Create.

Add the scopes and release

On the app's Versions page, add the scopes listed in the import dialog under Access. For App URL you can use https://shopify.dev/apps/default-app-home. Then choose Release.

Install the app on your store

Choose Install app, pick your store and choose Install.

Copy the credentials

Open App settings and copy the Client ID and Client secret from the Credentials card.

Connect in Modulify

Paste them into Client ID and Client secret in the import dialog, then select Connect. When Shopify accepts them, the dialog shows Shopify is connected with the number of scopes granted.

Shopify gives tokens only to an app created in the same organization as the store. If the dialog says so when you connect, create the app in the Dev Dashboard of the organization that owns the store.

The app connection expires after a short time. If it expires, the dialog shows Connection expired, and Start again lets you connect again. Keep the app installed until the import has finished. Modulify keeps the app's Client ID and Client secret with your site, so a long import can refresh the store's access token and the import can run again. Uninstalling the app stops both.

Connect with an access token

Open the custom app

In your Shopify admin, go to Settings, then Apps, choose Develop apps and open the custom app.

Check its scopes

Check that its Admin API scopes include the scopes listed in the import dialog.

Paste the token

Under API credentials, copy the Admin API access token and paste it into Admin API access token in the import dialog.

Shopify shows this token only once. If you no longer have it, connect a Shopify app instead.

Progress and warnings

The import shows in the site's chat as a normal message that reads Importing <site name> from Shopify. The AI takes over as soon as it finishes., with a row under it that shows the step it is on and a count such as 2/5. Select the row to open the activity panel with the steps in order: Reading the site, Copying images, Saving the data for the AI, Building pages and Saving pages. While a step reads pages, copies images and files, or saves records, its row also counts them, such as Copying images (340 of 2,100).

When the import finishes, the message reads Imported <site name> from Shopify., the row reads Did 5 actions, and the chat lists any warnings under Warnings from the import, such as data the app was not allowed to read.

If the import stops

If the import stops for a reason you do not have to fix, such as a restart on Modulify's side, it starts again on its own once, and the message adds The first try stopped, so the import started again on its own.

If it stops again, or stops with an error you have to fix first, the message reads The import of <site name> from Shopify stopped., and an alert under it shows the reason and Try again. Choose it and confirm. Modulify removes what the failed run created, its pages, code and the data it saved, and then imports again. Changes you made to those parts since the failed run are lost. Only people who can edit the site can use the button.

Modulify keeps the app's Client ID and Client secret with the site, so the import can get a new access token when the first one has expired. A store that was connected before this was added has to be connected again before its import can run again.

What comes across

Your store data is saved as it was in the hidden _import_rows table of the site database, one dataset for each kind of record below. As soon as the import finishes, the AI builds tables from them, which you can browse and edit in the CMS. It usually builds one table per dataset and picks their names itself.

  • Products, with their descriptions, prices, options, images and other media, SEO title and description, status and tags. Metafields that have a definition in Shopify come across as their own fields, and the rest are kept together in one field.
  • Product variants, with their SKU, barcode, price, compare at price, stock, weight, cost per item, country of origin and metafields, each linked to its product.
  • Collections, with their descriptions, images, sort order and the rules of smart collections, each linked to the products in it, in the order the store shows them.
  • Stock levels for each variant at each location.
  • Pages, Blogs, Blog posts and Blog comments. Blog posts are linked to their blog and comments to their blog post.
  • Policies, such as your refund and privacy policies.
  • Menus, with their links.
  • Redirects, which also become redirects on the site.
  • Files from your Shopify files.
  • One dataset for each type of custom content you defined in Shopify, with its fields.
  • Store details: the store's name, contact email, currency, address, time zone, languages and store metafields.
  • Customers, with their addresses, tags, notes and marketing consent.
  • Orders, with their totals, payment and fulfillment status, addresses, payments, fulfillments and refunds, each linked to its customer. Their items come across as Order items, linked to the order, the product and the variant.
  • Draft orders, Discounts with their codes and rules, and Gift cards. Shopify never shares a gift card's full code, so only its last characters come across.
  • Translations of products, collections, pages, blogs, blog posts, policies and custom content, kept with each record. The AI gives the tables a column per language for each translated field. See Multiple languages.

Images and files are copied to Modulify storage. Every size Shopify serves of an image points at the same copy.

Your storefront pages come across as editable pages at the same addresses, with your theme's look:

  • The home page, your published pages and your policies, the collections list and each collection, each blog and each published blog post, and the page of each product published to your online store. Custom content entries whose type has web pages in Shopify come across too, at their /pages/ address, except entries that are still drafts.
  • A page whose address has characters a file name cannot keep is served at a simpler address, and the import lists it as a warning.
  • The theme's stylesheets, scripts and fonts are copied into the site. The header and footer are shared by every page, so a change to them shows everywhere.
  • Contact and newsletter forms keep their fields. A submission is saved in the site's database before it is emailed to the site's address, which forwards it to you, so a submission is kept even when its email cannot be sent. After a submission, the form shows a thank-you message.
  • A sitemap at /sitemap.xml lists the copied pages. Pages hidden from search engines are left out.

Your live theme comes across as well, read from Shopify through the app, so it does not need the storefront to be open. Its Liquid templates, sections, snippets, settings and text are saved in the site at .modulify/import/theme, and its stylesheets, scripts, fonts and images are copied to public/shopify/theme/assets. When the storefront pages cannot be copied, such as on a store that is password protected, the AI builds the pages from this theme, exactly as the theme has them.

What is not imported yet

  • Cart, checkout, search and customer account pages, because they run on Shopify. The buy buttons on product pages do not take payments.
  • Shopify apps on your storefront, because they run on Shopify.
  • Copied pages, menus and product options in your other languages. They come across in your primary language.
  • Collection and blog pages after the first page.
  • The published pages of a store that is password protected. The AI builds them from your theme instead, which needs read_themes. To have the published pages copied as they are, remove the password in Shopify and import the store again. The store data comes across either way.
  • Very large stores come across in part, and the import lists what was left out.

Customers, orders, draft orders, blog comments and gift cards contain personal data. They are stored in your site's database, and the AI builds their tables from the list of their fields without reading them. On some Shopify plans, Shopify hides customer names, emails, phone numbers and addresses from apps, and the import says when they were hidden.

Fonts from the Shopify font library are licensed for Shopify stores. Check their license before you publish the site.

After the import

When the import finishes, the AI takes over on its own. It reads what the import saved, builds the tables the store needs from the store data, connects the pages that show that data to those tables while keeping them looking the same, and checks the pages. When no storefront pages could be copied, it builds them from your theme instead, exactly as the theme has them. It never applies a design of its own to the store. Then it answers with what came across, including the tables it built with their row counts, and what still needs work. The automatic message that starts it is not shown, so the import flows straight into its answer. If you were already chatting when the import finished, the chat gets the same details with your next message instead.

The import saves a guide called SHOPIFY.md at the root of the site, listing the datasets with their row counts, how they link, where the theme is and what did not come across. Notes for the chat are saved next to it at .modulify/import/README.md, with the pages, the datasets and the warnings, and the guide file CLAUDE.md points the chat at them. The chat reads SHOPIFY.md before building on the store, and it builds on the imported store instead of starting it over. When it needs more, it reads your storefront directly: products, collections, pages, blog articles, the navigation and any page as the store publishes it. While the import is still running, the chat tells you so and waits for it before changing files.