How to Migrate from Shopify to Medusa
How to Migrate from Shopify to Medusa
Shopify Basic costs $39/month + 2.9% transaction fees. At scale, costs climb to $399/month+ with apps. Medusa is the open source headless commerce platform — no transaction fees, full control, and a modern developer experience.
What Transfers
| Shopify Data | Medusa Status |
|---|---|
| ✅ Products | Export CSV → import |
| ✅ Variants | Mapped to Medusa variants |
| ✅ Categories/Collections | Recreate as collections |
| ✅ Customers | Export → import via API |
| ✅ Orders (history) | Export → import via API |
| ⚠️ Images | Download + re-upload |
| ❌ Theme/storefront | Rebuild (headless) |
| ❌ Apps/integrations | Rebuild or find alternatives |
| ❌ Shopify Payments | Use Stripe directly |
Step 1: Deploy Medusa
# Create new Medusa project
npx create-medusa-app@latest my-store
cd my-store
# Start the server
npx medusa develop
Admin dashboard at localhost:9000/app, API at localhost:9000.
Step 2: Export from Shopify
Products:
- Shopify Admin → Products → Export
- Choose CSV format, all products
Customers:
- Shopify Admin → Customers → Export
Orders:
- Shopify Admin → Orders → Export
Step 3: Import Products
// Script to import Shopify products into Medusa
const { Medusa } = require('@medusajs/js-sdk');
const csv = require('csv-parse/sync');
const fs = require('fs');
const medusa = new Medusa({ baseUrl: 'http://localhost:9000', apiKey: 'your-api-key' });
const products = csv.parse(fs.readFileSync('products.csv'), { columns: true });
for (const product of products) {
await medusa.admin.products.create({
title: product.Title,
description: product['Body (HTML)'],
handle: product.Handle,
variants: [{
title: product['Variant Title'] || 'Default',
prices: [{ amount: Math.round(parseFloat(product['Variant Price']) * 100), currency_code: 'usd' }],
sku: product['Variant SKU'],
inventory_quantity: parseInt(product['Variant Inventory Qty']) || 0,
}],
});
}
Step 4: Build Your Storefront
Medusa is headless — you need a frontend. Options:
Next.js Starter (recommended):
npx create-medusa-app@latest --with-nextjs-starter
Custom frontend: Use Medusa's JS SDK or REST API with any framework (Next.js, Nuxt, SvelteKit, Remix).
Step 5: Set Up Payments
# Install Stripe plugin
npm install medusa-payment-stripe
Configure in medusa-config.js:
module.exports = {
plugins: [{
resolve: 'medusa-payment-stripe',
options: {
api_key: process.env.STRIPE_API_KEY,
},
}],
};
No per-transaction fees from Medusa — only Stripe's standard 2.9% + $0.30.
Step 6: Set Up Shipping, Tax, Email
| Shopify Feature | Medusa Plugin/Module |
|---|---|
| Shipping rates | Fulfillment module |
| Tax calculation | Tax module (or TaxJar) |
| Order emails | Notification module (SendGrid, Resend) |
| Inventory | Inventory module |
| Gift cards | Gift card module |
| Discounts | Discount module |
Cost Comparison (Annual)
| Scenario | Shopify | Medusa Self-Hosted |
|---|---|---|
| Startup ($10K/month revenue) | $468/year + $3,480 fees | $240/year hosting |
| Growing ($50K/month) | $3,588/year + $17,400 fees | $600/year hosting |
| Scale ($200K/month) | $4,788/year + $69,600 fees | $1,200/year hosting |
Shopify fees = 2.9% + $0.30. Medusa uses Stripe directly (same rate but no Shopify markup).
Migration Timeline
| Week | Task |
|---|---|
| Week 1-2 | Deploy Medusa, import products, build storefront |
| Week 3 | Set up payments, shipping, tax |
| Week 4 | Import customers, test checkout flow |
| Month 2 | Soft launch, parallel run |
| Month 3 | Full cutover |
Compare e-commerce platforms on OSSAlt — features, pricing, and flexibility side by side.