OSS ECサイト比較:Medusa vs WooCommerce vs Saleor でECサイトをセルフホスト
オープンソースラボ編集部 ・ 2026年6月14日
OSSECサイト比較:Medusa vs WooCommerce vs Saleor でECサイトをセルフホスト
ShopifyはBASICプランで月$39(年払い$29)・Plusプランで月$2,300〜と、成長するにつれてコストが増大します。Medusa(Node.js製モダンECバックエンド)・WooCommerce(WordPress統合・世界シェアNo.1 OSS EC)・Saleor(GraphQL APIファーストのEC基盤)はShopify代替として注目されるOSSのECプラットフォームです。
OSSでECサイトを構築する理由
- コスト: Shopify PLUSの月$2,300が毎月のサーバー代数千円に
- 手数料ゼロ: Shopifyは決済ごとに0.5〜2.0%の取引手数料(外部決済の場合)
- 完全なカスタマイズ: テーマ・チェックアウト・バックオフィス全てを自由に改修
- データ所有権: 顧客データ・注文データが自社サーバーに
- API統合: 独自のERP・在庫管理・CRMシステムとの直接連携
主要ツールの概要
Medusa
2021年にデンマークで創業したMedusa, Inc.が開発するオープンソースのECバックエンドです。GitHubスター27k+。Node.js(TypeScript)製でヘッドレスECアーキテクチャを採用し、フロントエンドはNext.jsやRemixで自由に構築できます。商品管理・在庫・注文・支払い(Stripe・PayPal等)・配送・返品・プロモーションコードをAPIで提供します。Medusa v2(2024年)からモジュール型アーキテクチャになり拡張性が大幅向上しました。
# Medusaプロジェクトの作成
npx create-medusa-app@latest my-store
# PostgreSQL + Stripeが必要(セットアップウィザードが案内)
cd my-store
# 管理画面バックエンドを起動
npx medusa develop
# 別ターミナルで管理UIを起動(Next.js)
cd admin
npm run dev
# 管理画面: http://localhost:7001
# バックエンドAPI: http://localhost:9000
// カスタム商品エンドポイントの追加(src/api/store/custom-products/route.ts)
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework";
export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
// Medusaのサービスコンテナからクエリサービスを取得
const query = req.scope.resolve("query");
// 商品一覧をカテゴリー別に取得
const { data: products } = await query.graph({
entity: "product",
fields: ["id", "title", "description", "thumbnail", "variants.*", "categories.*"],
filters: {
status: "published",
categories: { handle: req.query.category as string || "all" },
},
});
return res.json({ products, count: products.length });
};
// Stripe決済の統合(src/modules/payment/stripe.ts)
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: "2024-12-18.acacia",
});
// 支払いインテント作成
export async function createPaymentIntent(amount: number, currency: string) {
const paymentIntent = await stripe.paymentIntents.create({
amount: amount * 100, // Stripeはセント単位
currency,
automatic_payment_methods: { enabled: true },
});
return paymentIntent;
}
// Webhookでの支払い確認
export async function handleStripeWebhook(rawBody: Buffer, signature: string) {
const event = stripe.webhooks.constructEvent(
rawBody,
signature,
process.env.STRIPE_WEBHOOK_SECRET!
);
if (event.type === "payment_intent.succeeded") {
const paymentIntent = event.data.object;
console.log(`Payment succeeded: ${paymentIntent.id}`);
// Medusaの注文を確定する処理
}
}
WooCommerce
2011年にWooThemesが開発し、現在はAutomatticが管理するWordPress用ECプラグインです。世界のEC市場シェア39%(2024年)を誇る最大のOSS ECプラットフォームです。WordPress管理画面からGUIで商品管理・在庫・注文・顧客を管理できます。拡張プラグインが数千種類あり、追加機能の導入が容易です。WordPressのエコシステム(テーマ・SEOプラグイン等)をそのまま活用できます。
# WordPress + WooCommerceをDockerで起動
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
wordpress:
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: woouser
WORDPRESS_DB_PASSWORD: woopassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: woouser
MYSQL_PASSWORD: woopassword
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
volumes:
wp_data:
db_data:
EOF
docker compose up -d
# WordPress初期設定: http://localhost:8080
# その後プラグイン > WooCommerceをインストール・有効化
// WooCommerce REST APIで商品を追加(PHP/Guzzle)
require_once 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->post('https://yoursite.com/wp-json/wc/v3/products', [
'auth' => ['consumer_key', 'consumer_secret'],
'json' => [
'name' => 'Organic Cotton T-Shirt',
'type' => 'variable',
'status' => 'publish',
'description' => '100% organic cotton, sustainable production',
'regular_price' => '3500',
'stock_quantity' => 100,
'manage_stock' => true,
'categories' => [['id' => 9]],
'attributes' => [
['name' => 'Size', 'options' => ['S', 'M', 'L', 'XL'], 'variation' => true],
['name' => 'Color', 'options' => ['White', 'Black', 'Navy'], 'variation' => true],
],
]
]);
$product = json_decode($response->getBody(), true);
echo "Product ID: " . $product['id'];
Saleor
2017年にMirumee Softwareが開発を開始したGraphQL APIファーストのECプラットフォームです。GitHubスター21k+。Django(Python)製のバックエンドとNext.js製のフロントエンドで構成されるヘッドレスECです。GraphQL APIを通じて全機能にアクセスでき、商品カタログ・在庫・注文・支払い・配送・税金計算・マルチチャンネル(実店舗・オンライン・マーケットプレイス統合)に対応します。
# Saleorをローカルで起動(Docker Compose)
git clone https://github.com/saleor/saleor-platform.git
cd saleor-platform
# 設定ファイルをコピー
cp .env.example .env
# 起動(初回は数分かかる)
docker compose up -d
# スーパーユーザーを作成
docker compose exec api python manage.py createsuperuser
# Saleor API: http://localhost:8000/graphql/
# Saleor Dashboard: http://localhost:9000
# Saleor GraphQL APIで商品一覧を取得
query GetProducts($first: Int!, $channel: String!) {
products(first: $first, channel: $channel) {
edges {
node {
id
name
description
thumbnail {
url
alt
}
pricing {
priceRange {
start {
gross {
amount
currency
}
}
}
}
variants {
id
name
sku
quantityAvailable
pricing {
price {
gross {
amount
currency
}
}
}
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
機能比較表
| 比較項目 | Medusa | WooCommerce | Saleor |
|---|---|---|---|
| 技術スタック | Node.js/TypeScript | PHP/WordPress | Python/Django |
| API形式 | REST | REST | GraphQL |
| ヘッドレス | ✅ | 部分的 | ✅ |
| 管理UI | ✅(React) | ✅(WordPress) | ✅(React) |
| マルチチャンネル | ✅ | 拡張必要 | ✅ |
| B2B対応 | ✅ | プラグイン | ✅ |
| GitHub Stars | 27k+ | N/A(WordPress plugin) | 21k+ |
ECサイトのマーケティング自動化にはMarketingカテゴリ/categories/marketingのツールも参照してください。ECサイトのセキュリティ対策はSecurityカテゴリ/categories/securityのパスワード管理・VPN設定を参考にしてください。
FAQ
Q. Shopifyからのデータ移行(商品・顧客・注文履歴)はどうやりますか?
A. Shopifyはデータのエクスポートをサポートしています。移行手順:
# 1. ShopifyからCSVエクスポート
# Admin > Products > Export (CSV)
# Admin > Customers > Export (CSV)
# Admin > Orders > Export (CSV)
# 2. MedusaへのCSVインポート(Medusa v2)
# Admin UIから Products > Import でCSVをアップロード
# またはMedusa REST APIで一括インポート
# WooCommerceへのShopify移行(WP All Importプラグイン)
# 1. WooCommerceサイトにWP All Importをインストール
# 2. ShopifyのCSVをインポートしてフィールドマッピング
# Saleorへのデータ移行(Pythonスクリプト)
import requests
import csv
SALEOR_URL = "http://localhost:8000/graphql/"
AUTH_TOKEN = "your-auth-token"
def import_products_from_shopify_csv(csv_path):
with open(csv_path, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
# GraphQL mutationで商品を作成
mutation = '''
mutation CreateProduct($input: ProductCreateInput!) {
productCreate(input: $input) {
product { id name }
errors { field message }
}
}
'''
variables = {
"input": {
"name": row["Title"],
"productType": "default-type-id",
"description": {"blocks": [{"type": "paragraph", "data": {"text": row["Body (HTML)"]}}]},
}
}
resp = requests.post(
SALEOR_URL,
json={"query": mutation, "variables": variables},
headers={"Authorization": f"Bearer {AUTH_TOKEN}"}
)
print(resp.json())
Q. WooCommerceとMedusaではどちらがSEOに強いですか?
A. WooCommerce + WordPressのSEOが圧倒的に優位です。理由: ①Yoast SEO・RankMathなど高機能SEOプラグインが使える②WordPressのコンテンツ管理機能でブログ記事・LP・商品説明を充実させやすい③長年のSSR実績でGoogleクローラーへの対応が成熟している。MedusaやSaleor(ヘッドレス)のSEO対策: Next.jsフロントエンドのSSR/SSGを適切に設定すれば高いSEOスコアを実現できます。generateMetadataでタイトル・説明・OGタグを商品ページごとに最適化し、構造化データ(Product schema)を実装することが必要です。小規模サイトはWooCommerce・大規模カタログや高速化を重視する場合はMedusa/Saleorが適しています。
Q. ECサイトのPCI DSS(クレジットカード情報の安全基準)への対応は必要ですか?
A. カード情報を**自社サーバーに保存しなければPCI DSS SA Q(最も簡易な版)**の対応で済みます。実務上は以下の構成で対応します: Stripe Elements / PayPal / Square: カード情報はStripe等の決済プロバイダーのサーバーにのみ保存されます。自社サーバーには決済トークン(カード情報ではない)のみ保存。この構成を採用すればPCI DSS SAQ A相当となり、自社での厳格なPCI DSS準拠作業は不要になります。Medusa・WooCommerce・SaleorいずれもStripeやPayPalの統合がサポートされているため、カード情報を自社で扱わない構成が標準です。
Q. Medusaのマルチベンダーマーケットプレイスはどのように構築しますか?
A. Medusa v2はマルチリージョン・マルチチャンネルをネイティブサポートし、マーケットプレイスの基盤に使えます。
// 出品者ごとの商品管理(カスタムモジュール)
// src/modules/vendor/service.ts
import { MedusaService } from "@medusajs/framework/utils";
class VendorModuleService extends MedusaService({
Vendor: {},
}) {
async listVendorProducts(vendorId: string) {
const productService = this.container_.resolve("productModuleService");
return productService.listProducts({
metadata: { vendor_id: vendorId }
});
}
async createVendorProduct(vendorId: string, productData: any) {
const productService = this.container_.resolve("productModuleService");
return productService.createProducts({
...productData,
metadata: { vendor_id: vendorId }
});
}
}
export default VendorModuleService;
まとめ
| ユースケース | 推奨ツール |
|---|---|
| WordPress統合・SEO重視 | WooCommerce |
| ヘッドレス・TypeScript開発 | Medusa |
| GraphQL・マルチチャンネル | Saleor |