はじめに

  • Shopifyへの移行を考えているが、商品データの移行が面倒で踏み切れない
  • ShopifyAIスキルが本当に商品移行をやってくれるのか知りたい
  • 有料の移行サービス(Cart2CartLitExtensionなど)を使うべきか判断したい

このような方のための記事です。

Shopify AI Toolkitに3スキル追加 ― shopify-onboarding-merchantが示すShopifyAI戦略で、新しく追加されたshopify-onboarding-merchantスキルがWooCommerce含む10プラットフォームからの商品移行を全自動化する設計を解説しました。

「設計はわかった。でも本当に動くのか?」を確かめるため、実際にWooCommerce公式のサンプルCSVClaude Codeに渡して、Shopify開発ストアへの移行をやらせてみました。

結果として14商品 / 19バリアント / 19画像が全てDraftで作成成功しました。

この記事は、その検証プロセス・躓きポイント・残作業まで含めた実録です。


検証の準備

使った材料

  • Claude CodeShopify AI Toolkitプラグイン導入済み)
  • Shopify CLI
  • 新規Shopify開発ストア(空の状態)
  • WooCommerce公式サンプルCSVwoocommerce/sample-data/sample_products.csv

サンプルCSVWooCommerce公式GitHubリポジトリに同梱されているもので、25行のデータが含まれています。simple商品・variable商品(バリアント親)・variation(バリアント子)・groupedexternalvirtualと、WooCommerceの全商品タイプが網羅されているため、スキルの判定ロジックを総合的にテストできます。

外部記事woocommerce/plugins/woocommerce/sample-data/sample_products.csv at trunk · woocommerce/woo...woocommerce/plugins/woocommerce/sample-data/sample_products.csv at trunk · woocommerce/woo...

実行プロンプト

Claude Codeに渡したプロンプトは2行です。

WooCommerceからShopifyに商品を移行したいです。
shopify-onboarding-merchant スキルを使ってください。

これだけで、AIhttps://www.shopify.com/SKILL.mdをフェッチし、移行フローを開始しました。


CSV解析とインポートプレビュー

CSVを渡すと、AIは自分でファイルを読み込み、以下のプレビューを返してきました。

インポートプレビュー
インポートプレビュー

投入対象:商品14件 / バリアント19件

Simple商品(12件)はそのままインポート対象。Variable商品2件はバリアントを子から再構成して7件に展開。スキップは4件。

スキップ判定の精度

スキップされた4件の判定が興味深いポイントでした。

SKU

元のType

スキップ理由

woo-album

downloadable+virtual

Shopify Digital Downloadsアプリが必要

woo-single

downloadable+virtual

同上

logo-collection

grouped

Shopifyに対応概念なし

wp-pennant

external

アフィリエイト商品はShopifyにマッピング不可

shopify-onboarding-merchantSKILL.mdには「External/affiliate products skipped」とWooCommerce向けのスキップ規則が明記されています。

AIはこれを参照しつつ、digital/virtualgroupedも自分で判断してスキップしました。

CSV内部の不整合まで検出した

特に良かったのが、CSVのデータ自体に存在する矛盾をAIが警告として出してきた点です。

V-Neck T-Shirtは親行で「Color × Size」の2オプションを宣言していますが、子バリアント行にSize値が入っていませんでした。

Hoodieは「Color (3) × Logo (2) = 6通り」を宣言しているのに、子バリアントは4件しかありませんでした。

これらは単なるカラム検証では検出できない、CSVの宣言と実体のズレです。

AIは親と子の整合性を読み取って「Sizeは無視してColorのみで作る」「既存4バリアントだけ作る」という現実的な判断を提示してきました。

マッピング決定事項

AIが提示した変換ルール:

WooCommerce

Shopify

Sale price + Regular price

price = Sale, compareAtPrice = Regular

Weight (lbs)

weightPOUNDS単位で保持)

Length / Width / Height

無視(Shopifyにネイティブな商品寸法フィールドなし)

CategoriesClothing > Tshirts等)

Tagとして保存

Description

descriptionHtmlに保存

StockCSV上は全て空欄)

在庫0でDraft作成

Status

全商品Draft(公開は手動確認後)


ストア接続:認証は本当にCLIだけで完結する

OK、進めて」と返したあと、AIshopify store authコマンドを実行しました。

shopify store auth --store q1juss-cq.myshopify.com --scopes write_products,write_inventory,read_locations

ブラウザが自動で開き、shopify-cli-connector-appという公式アプリのインストール画面が表示されます。

公式アプリのインストール画面
公式アプリのインストール画面

権限要求は「スタッフと協力者のデータの閲覧(ストアオーナー)」と「ストアデータを表示および編集(商品)」の2つだけ。

インストールボタンを押すと「Authentication succeeded」のページが出て、ターミナルにLogged in. Authenticated as ... against q1juss-cq.myshopify.comと表示されました。

Authentication succeeded
Authentication succeeded

ここまでブラウザで「インストール」を1回押しただけで、CLIに認証情報が保存されてその後のGraphQL操作が全て可能になります。

マーチャントから見れば、技術的な操作は実質ゼロです。

なお、SKILL.md記載のデフォルトスコープ(productsinventorylocationsfilesorderscustomersdiscountsthemescontentreportsのフルセット)に対して、Claude Code今回の作業に必要な3スコープだけに絞って認証してきました。

これはAI側の判断で、必要最小限の権限で動作する適切な設計に見えます。

ロケーション情報の自動取得

認証直後、AIは検証クエリでストア情報を取得しました。

query {
  shop { name id currencyCode primaryDomain { url } }
  locations(first: 10) { edges { node { id name isActive fulfillsOnlineOrders } } }
}

結果、ストア通貨がUSDCSVの価格と一致)、ロケーションが「Shop location」と「My Custom Location」の2つあることを確認。AIは「Shop location」を在庫の配置先として選びました。


1件目で躓いた:optionValues required エラー

最初のテストとしてwoo-tshirtT-Shirt、$18、Color: Gray)の1件だけでproductSetミューテーションを投げました。結果は失敗。

"message": "Variable $input of type ProductSetInput! was provided invalid value 
for variants.0.optionValues (Expected value to not be null)"

AIが最初に組んだペイロードにはoptionValuesが含まれていませんでした。productSetミューテーションでは、単一バリアントでも明示的なオプション指定が必須という仕様です。

ここがこの検証で一番面白かったポイントです。SKILL.mdには明確に書かれています。

Single-variant products must include an explicit Default Title option

つまりスキルの指示書には正しい書き方が明記されているのに、AIが初回ペイロードでそれを守らなかったということです。

完全な自動化には、スキルの指示書を渡すだけでは足りない領域があります。

ただ、AIの自己修正は良かったです。

エラーメッセージを読んで、すぐに修正版を投げ直しました。

修正方針も適切で、Title: Default Titleのフォールバックではなく、WooCommerceColor属性をShopifyColorオプションに昇格させてきました。

"productOptions": [
  { "name": "Color", "values": [{ "name": "Gray" }] }
],
"variants": [
  {
    "sku": "woo-tshirt",
    "price": "18.00",
    "optionValues": [{ "optionName": "Color", "name": "Gray" }],
    ...
  }
]

これは「カラーバリエーションがGray1色」という商品としてShopifyの管理画面で正しく扱える形になります。リトライ後、無事に商品が作成されました。


残り13件の一括投入

T-Shirtで成功パターンが確定したあと、AINode.jsスクリプトを書いて13件を順次処理しました。

const products = [
  ["02-hoodie-with-logo", simple({...})],
  ["03-beanie", simple({...})],
  // ...
  ["13-vneck-tee", { /* 3バリアント */ }],
  ["14-hoodie", { /* 4バリアント */ }],
];

for (const [name, vars] of products) {
  const out = execFileSync("shopify", ["store", "execute", ...]);
  // 結果を集計
}

スクリプトはSKILL.md記載の指示通り、変数JSONを一時ファイルに書き出してから--variable-fileで読み込む方式を採用しました。商品データには'"が含まれることがあるため、シェル経由のインライン渡しは事故の元になるという配慮です。

実行結果は全件成功。

→ 02-hoodie-with-logo (Hoodie with Logo) ... OK [variants=1, media=1]
→ 03-beanie (Beanie) ... OK [variants=1, media=1]
→ 04-belt (Belt) ... OK [variants=1, media=1]
(中略)
→ 13-vneck-tee (V-Neck T-Shirt) ... OK [variants=3, media=3]
→ 14-hoodie (Hoodie) ... OK [variants=4, media=4]

13件のSimple商品 + 2件のVariable商品(合計バリアント7件)すべてがエラーなく作成されました。


検証クエリで結果確認

最後にAIは検証クエリを投げて、作成された商品が想定通りの形になっているか確認しました。

完了レポート
完了レポート

確認できたこと:

  • 14商品すべてがstatus: DRAFTで作成されている
  • 全19バリアントに正しいSKU・価格・Weight (POUNDS)が設定されている
  • セール価格がcompareAtPriceに正しくマッピングされている(BeanieBeltCapHoodie with PocketBeanie with LogoHoodie Red/No
  • 19枚すべての商品画像がShopify CDNに取り込まれ、status: READYになっている
  • WooCommerceのカテゴリがTagに変換されている(Clothing / Tshirts / Hoodies / Accessories
  • Variable商品のオプション構造が正しく組まれている(V-Neckは「Color」1軸、Hoodieは「Color × Logo」2軸)

Shopify管理画面でも全14商品が「下書き」状態で並んでいることを確認しました。バリアント数も検証クエリと完全一致(Hoodieが4点のバリエーション、V-Neck T-Shirtが3点のバリエーション、その他が1点)。

Shopify管理画面
Shopify管理画面

動かなかったこと・残作業

完全自動とまではいきませんでした。残作業はAIが最後に「Before going live, you'll want to」のチェックリストとして提示してきました。

在庫数の手動入力

WooCommerce公式サンプルCSVには在庫数のカラムが空欄でした。

そのためAIは全商品を在庫0で作成し、inventorySetOnHandQuantitiesの実行はスキップしました。

SKILL.md記載の@idempotentディレクティブの動作確認はできず。

実運用では在庫データを含むCSVを使うことになるので、ここは大きな問題ではありません。

むしろ「データがない場合は無理にゼロ埋めしない」という判断は正しいです。

Categoriesは手動でCollection

WooCommerceCategories列はTagとして保存されました。Shopifyの本来のカテゴリ機能であるCollectionには変換されません。

これはSKILL.mdの仕様で、Smart Collectionを作るかManual Collectionに振り分けるかの判断はマーチャント側の業務知識が必要なため、自動化していないものと思われます。

スキップ4件は別途対応が必要

元の商品

推奨される対応

AlbumsSinglesDigital

Shopify Digital Downloadsアプリ(無料)

Logo Collectiongrouped

Manual Collectionで個別商品を束ねる

WordPress Pennantexternal

Shopifyの「Buy Button」または通常商品+外部リンク


業者依頼・Cart2Cartとの比較

実際に動かしてみた感触をベースに、既存の選択肢と比較します。

方法

コスト

所要時間

精度

手動でCSV書き換え

工数のみ

商品数次第(数時間〜数日)

人為ミスが入りやすい

Shopify Store Importer(既存無料アプリ)

無料

30分〜数時間

バリアント解釈が弱い

Cart2Cart / LitExtension

数十〜数十万円

数時間〜半日

中〜高

shopify-onboarding-merchant(今回)

無料

30分(25商品)

中〜高(バリアント親子の解釈は良好)

業者依頼

数十万〜百万円

1〜2週間

高(要件定義込みの場合)

注目すべきはバリアント親子の自動解釈です。Shopify Store Importerでは崩れがちな部分が、shopify-onboarding-merchantでは正しく組まれていました。WooCommercevariable+variationという独特な親子構造を、Shopifyの「1商品・複数バリアント」モデルに変換するロジックが正確に動いています。

ただし「無料」と言い切るには注意が必要です。途中でAIが躓いてリトライした場面があったように、完全自動ではなくAIエージェントの監督下での移行であるという点は押さえておくべきです。Cart2Cartのような専用サービスは「ボタンを押して放置」できますが、こちらは「Claude Codeで対話しながら進める」スタイルです。


このスキルが向いている人・向いていない人

向いている

  • 商品数が数百件以下の小〜中規模ストア
  • 元のCSV構造が標準的(カスタムフィールドが少ない)
  • Claude CodeまたはCursorを既に使っている開発者・テック寄りのマーチャント
  • 移行業務の予算を極力ゼロにしたい個人事業主・スタートアップ
  • 移行後にDraftで一度確認してから公開する運用ができる

向いていない

  • 数千〜数万件の大規模カタログ(SKILL.md記載の上限は約50商品/バッチで現実的限界はもっと広いが、エンタープライズ規模は厳しい)
  • 顧客データ・注文履歴・ブログ記事まで全て移行したいケース(このスキルは商品カタログのみ対応)
  • カスタムメタフィールドや拡張属性を多用している店舗
  • Claude Code等のAIエージェント環境を導入する余裕がないマーチャント

さいごに

shopify-onboarding-merchantスキルは、設計通りに動作することが確認できました。WooCommerce公式サンプルCSVの全商品タイプ(simplevariablevariationgroupedexternalvirtual)を投入し、適切な判定・スキップ・親子グルーピング・画像取り込みまで、ほぼ手放しで完了しました。

特に印象的だったのは以下の3点です。

ひとつめはCSV内部の不整合をAIが自分で発見して警告したことV-Neck T-ShirtSize欠落、HoodieColor×Logo組み合わせギャップを、親子行を読み比べて検出しました。これはルールベースのバリデーターでは難しい挙動です。

ふたつめは1度目のproductSet失敗からの自己修正SKILL.md記載のルールを完全には守れなかったものの、エラーメッセージを読んでWooCommerceColor属性をShopifyColorオプションに昇格させるという、形式的にも意味的にも適切な解を出してきました。

みっつめはスコープを必要最小限に絞った認証SKILL.md推奨の10種類以上のフルスコープではなく、write_productswrite_inventoryread_locationsの3つに絞って認証しました。これは設計書を絶対視せず、コンテキストに応じて判断する姿勢です。

完全自動化された移行ツールとしてはまだ発展途上ですが、Cart2Cart等の有料サービスや手動CSV書き換えに代わる新しい選択肢として、特に小〜中規模ストアには十分実用的でした。Shopifyへの移行を検討している方は、本格的な業者依頼の前に一度試してみる価値があります。

ご希望に合わせたWooCommerceからShopifyへの移行・カスタムアプリ開発については、お問い合わせからお気軽にご相談ください。