# Shopify Import Integration V2

Shopify Import Connector V2は、ShopifyのGraphQL Admin APIで動作するように特別に設計されたShopifyコネクタの新しいバージョンです。このバージョンは、Shopifyが複数のREST APIエンドポイント（`/products`と`/variants`を含む）を廃止し、GraphQLの対応するエンドポイントに置き換えることに対応して開発されました。その結果、継続的な機能性と将来の互換性を確保するために、API廃止の影響を受けるリソースのデータインポートを処理するこのV2コネクタを開発しました。

V2コネクタは、以前はREST APIで管理されていた次のインポート操作を特別に処理します:

- 製品データインポート
  - 基本的な製品情報
  - 製品バリアント
  - 製品ステータスと可視性設定
  - 製品オプションとバリアント設定
- 製品バリアントデータインポート
  - バリアント固有の属性
  - SKU情報
  - 価格詳細
  - 在庫追跡情報
- メタフィールドインポート
  - 製品メタフィールド
  - 製品バリアントメタフィールド


次の場合はV1バージョンのコネクタを引き続き使用してください:

- 在庫レベルインポート
- 在庫アイテムインポート
- ロケーションデータインポート
- コレクションメタフィールドインポート
- 製品画像メタフィールドインポート
- V2の範囲にリストされていない他のリソースタイプ


ただし、次の場合はV2コネクタを使用してください:

- 製品データのインポート
- 製品バリアントデータのインポート
- 製品メタフィールドのインポート
- 製品バリアントメタフィールドのインポート


## 前提条件

- Treasure Dataの基本知識
- Shopifyの基本知識


## 必要なAPIスコープ

Shopifyアプリを設定する際は、インポートするターゲットに応じて以下のAPIスコープが付与されていることを確認してください。

| Target | 必要なスコープ |
|  --- | --- |
| `products` | `read_products` |
| `product_variants` | `read_products`、`read_inventory`、`read_translations` |
| `meta_fields` | `read_products` |
| `custom_query` | クエリで参照されているすべてのShopify Admin APIリソースに対応する`read_*`スコープが必要です。たとえば、製品と在庫レベルを読み取るクエリには、`read_products`と`read_inventory`の両方が必要です。[Shopify APIアクセススコープ](https://shopify.dev/docs/api/usage/access-scopes)を参照してください。 |


## 要件と制限事項

- メタフィールドインポートの制限
  - 製品ごとに最大250個のメタフィールド
  - 製品バリアントごとに最大250個のメタフィールド
- 製品バリアントインポートは、created_atタイムスタンプによる増分読み込みをサポートしなくなりました。updated_atタイムスタンプによる読み込みのみをサポートします。


## Treasure Data Integration の静的 IP アドレス

セキュリティポリシーで IP ホワイトリストが必要な場合は、接続を成功させるために Treasure Data の IP アドレスを許可リストに追加する必要があります。

リージョンごとに整理された静的 IP アドレスの完全なリストは、次のリンクにあります:
[IP Addresses for Integrations](/apis/endpoints/ip-addresses-integrations-result-workers)

## Treasure コンソール経由でShopifyレポートをインポート

### 認証の作成

最初のステップは、資格情報のセットで新しい認証を作成することです。

1. **Integrations Hub**を選択します。
2. **Catalog**を選択します。


![](/assets/integrationshub-catalog2.e33c0a4c7d81c40cc83dd056c2143b97b1406220e213cab14ef349d69412ffef.eedebb45.png)

1. CatalogでShopifyを検索し、アイコンの上にマウスを置いて**Create Authentication**を選択します。


![](/assets/shopifyi1.4f504665b75eb5d2d1b5f353f6a747aa3f7c1b5d2e55c08b2da6278ecd120a7b.fdf07543.png)
![](/assets/shopifyi2.63ac6cca8a3716b1317b6e19b72e58c952551c47e5b05c6eac4063d4d346b6a2.fdf07543.png)

1. **Credentials**タブが選択されていることを確認してから、統合の資格情報を入力します。


![](/assets/image-20260318-191500.a79b3b0325aad6fd06372f8d3cf2b4d0cfbab8161891cb02456e16925d0784c3.fdf07543.png)
![](/assets/image-20260318-191519.0555658164ec12cf7d03b38e544c9d47949037c8af58bdfa4d26b54e1d38d2e4.fdf07543.png)

**新しい認証フィールド**

| Parameter | Description |
|  --- | --- |
| Store name
 | Shopifyストアのストア識別子。これは2つの形式で入力できます:
- 完全なストアURL: 例 `https://mountbaker.myshopify.com`
- ストア名のみ: 例: `mountbaker`

ストア名のみを使用している場合は、`.myshopify.com`ドメインなしのストアの一意の識別子である必要があります。
 |
| Auth method | 使用する認証方法を選択します:- **Static Token** — 2026年1月1日以前に作成されたレガシーアプリの永続的なAdmin APIアクセストークンを使用します。
- **Client Credentials** — Shopify Dev DashboardによってサポートされるClient IDとClient Secretを使用します（2026年1月1日以降に作成された新しいアプリに必要）。

 |
| Admin API access token | *（Auth methodがStatic Tokenの場合に必須）* ShopifyのAdmin APIで認証するために使用される永続的なアクセストークン。このトークンは、Shopify管理パネルの**Apps > Develop apps > Create an app > Configure Admin API scopes**から生成できます。 |
| Client ID | *（Auth methodがClient Credentialsの場合に必須）* アプリのShopify Dev DashboardによってサポートされるClient ID。 |
| Client Secret | *（Auth methodがClient Credentialsの場合に必須）* アプリのShopify Dev DashboardによってサポートされるClient Secret。 |


1. **Continue**を選択します。
2. 認証の名前を入力し、**Done**を選択します。


### ソースの作成

認証がコンソールで利用可能になった後、インポートジョブを設定します。

1. Treasure コンソールを開きます。
2. **Integrations** **Hub > Authentications**に移動します。
3. Shopify認証を見つけて**New Source**を選択します。


### 接続の作成

1. Data Transfer Nameフィールドにソース名を入力します。
2. **Next**を選択します。


| Parameter | Description |
|  --- | --- |
| Data Transfer Name | 転送の名前を入力します。 |
| Authentication | このフィールドには、Shopifyとの接続に使用される認証の名前が含まれます。 |


### ソーステーブルの識別

1. ソーステーブルのフィールドを設定します。


![](/assets/shopify1.00e4b17b4ab59809b279b9ef36404abe622b914f74831fa36e488eea8c7459cb.fdf07543.png)

| Field | Description |
|  --- | --- |
| Source
 | 次のShopifyオブジェクトを含むドロップダウンメニュー:
- products
- product_variants
- meta_fields

Shopifyストアからインポートしたいデータを含むShopifyオブジェクトを選択します。
 |
| Incremental? | 有効にすると、コネクタは最後のインポート実行以降の新しいまたは更新されたデータのみをインポートし、後続のインポートをより効率的にします。 |
| Incremental field | 増分読み込みに使用するタイムスタンプを選択します:- created_at — 作成日で製品をフィルタリングします。
- updated_at — 最終変更日で製品をフィルタリングします。

 |
| Start date | データをエクスポートする開始タイムスタンプ（形式: dd/mm/yyyy, hh:mm） |
| End date | データのエクスポートを終了する終了タイムスタンプ（形式: dd/mm/yyyy, hh:mm）。空のままにすると、終了日は現在時刻になります。 |
| Include image? | 有効にすると、製品画像データがレスポンスに含まれます。これによりクエリコストが増加することに注意してください。 |
| Resource | メタフィールドのリソースタイプを指定するには**product**を選択します。 |
| Objects | メタフィールドのオブジェクトタイプを選択します:- product : 製品に関連付けられたメタフィールドを取得します。
- product variant : 製品バリアントに関連付けられたメタフィールドを取得します。

 |
| Product ID
 | このフィールドは必須です。メタフィールドを取得したい製品IDのカンマ区切りリストを入力します。
product variantが選択されている場合、フィールド名はVariant IDに変わります。
 |


1. **Next**を選択します。


### データ設定の定義

1. データ設定を設定します。


| Parameter | Description |
|  --- | --- |
| Retry Limit | インポートが失敗するまでの再試行回数。 |
| Initial retry time wait in millis | 再試行前に待機する初期時間（ミリ秒）。 |
| Max retry wait in millis | 再試行前に待機する最大時間（ミリ秒）。 |


1. **Next**を選択します。


### Data Preview

インポートを実行する前に、Generate Preview を選択してデータの[プレビュー](/products/customer-data-platform/integration-hub/batch/import/previewing-your-source-data)を表示できます。Data preview はオプションであり、選択した場合はダイアログの次のページに安全にスキップできます。

1. **Next** を選択します。Data Preview ページが開きます。
2. データをプレビューする場合は、**Generate Preview** を選択します。
3. データを確認します。


### Data Placement

データの配置について、データを配置したいターゲット database と table を選択し、インポートを実行する頻度を指定します。

1. **Next** を選択します。Storage の下で、インポートされたデータを配置する新しい database を作成するか、既存の database を選択し、新しい table を作成するか、既存の table を選択します。
2. **Database** を選択 > **Select an existing** または **Create New Database** を選択します。
3. オプションで、database 名を入力します。
4. **Table** を選択 > **Select an existing** または **Create New Table** を選択します。
5. オプションで、table 名を入力します。
6. データをインポートする方法を選択します。
  - **Append** (デフォルト) - データインポートの結果は table に追加されます。
table が存在しない場合は作成されます。
  - **Always Replace** - 既存の table の全体の内容をクエリの結果出力で置き換えます。table が存在しない場合は、新しい table が作成されます。
  - **Replace on New Data** - 新しいデータがある場合のみ、既存の table の全体の内容をクエリの結果出力で置き換えます。
7. **Timestamp-based Partition Key** 列を選択します。
デフォルトキーとは異なるパーティションキーシードを設定したい場合は、long または timestamp 列をパーティショニング時刻として指定できます。デフォルトの時刻列として、add_time フィルターで upload_time を使用します。
8. データストレージの **Timezone** を選択します。
9. **Schedule** の下で、このクエリを実行するタイミングと頻度を選択できます。


#### 一度だけ実行

1. **Off** を選択します。
2. **Scheduling Timezone** を選択します。
3. **Create & Run Now** を選択します。


#### 定期的に繰り返す

1. **On** を選択します。
2. **Schedule** を選択します。UI では、*@hourly*、*@daily*、*@monthly*、またはカスタム *cron* の 4 つのオプションが提供されます。
3. **Delay Transfer** を選択して、実行時間の遅延を追加することもできます。
4. **Scheduling Timezone** を選択します。
5. **Create & Run Now** を選択します。


転送が実行された後、**Data Workbench** > **Databases** で転送の結果を確認できます。

## Workflow経由でShopifyレポートからインポート

td_load>: src_idを使用してワークフロー経由でShopifyレポートからデータをインポートできます。すでにソースを作成している場合は実行できます。ソースを作成したくない場合は、.ymlファイルを使用してインポートできます。

### ソースを使用

1. **Integrations Hub > Sources**を選択します。
2. 画面の右端にあるFiltersペインで、Integration Typeドロップダウンメニューを使用して**Shopify V2**を選択します。
3. Sourcesペインで、使用したいソースを含む行を特定し、その行のmoreドロップダウンメニュー（•••アイコン）を使用して**Copy Unique ID**を選択します。


![](/assets/26617502.09d9b84b0f1f752c7c95b0bc1c2d8e8b7302e5b91c6a3cb5f01309dadf53a604.25ec5a77.png)

1. ワークフロータスクを定義し、td_load>:にステップ3でコピーしたIDを使用します。



```yaml
+load:
   td_load>: unique_id_of_your_source
   database: ${td.dest_db}
   table: ${td.dest_table}
```

1. ワークフローを実行します。


### .ymlファイルを使用

1. .ymlファイルを特定します。


.ymlファイルを作成する必要がある場合は、[Create Seed Config File (seed.yml)](/ja/int/amazon-s3-import-integration-v2#AmazonS3ImportIntegrationv2-CreateSeedConfigFile(seed.yml))にある手順を参照してください。
2. ワークフロータスクを定義し、td_load>:に.ymlファイルを指定します。


```yaml
+load:
   td_load>: config/daily_load.yml
   database: ${td.dest_db}
   table: ${td.dest_table}
```

1. ワークフローを実行します。


#### サンプルワークフローコード

サンプルワークフローコードについては、[Treasure Boxes](https://github.com/treasure-data/treasure-boxes/tree/master/td_load/s3)をご覧ください。

## CLI（Toolbelt）経由でShopifyからインポート

統合を設定する前に、最新バージョンの[TD Toolbelt](https://toolbelt.treasuredata.com/)をインストールしてください。

### ロードファイルの準備

Static Token (Legacy)

```yaml
in:
   type: shopify_v2
   admin_api_access_token: xxxxxxxx
   target: products
   store_name: xxxxxxx
   from_date: '2024-12-31T17:00:00.000Z'
   incremental_field: created_at
out:
   mode: replace
```

Client Credentials (OAuth)

```yaml
in:
   type: shopify_v2
   auth_method: CLIENT_CREDENTIALS
   client_id: xxxxxxxx
   client_secret: xxxxxxxx
   target: products
   store_name: xxxxxxx
   from_date: '2024-12-31T17:00:00.000Z'
   incremental_field: created_at
out:
   mode: replace
```

この例では、Shopify Productオブジェクトのリストを取得します。from_dateは、データの取得を開始する日付を指定します。この場合、インポートは2024年12月31日17:00からデータのプルを開始します。

認証方法
- **Static Token**: 2026年1月1日以前に作成されたレガシーカスタムアプリには`admin_api_access_token`を使用します。これがデフォルトです（`auth_method`のデフォルトは`STATIC_TOKEN`）。
- **Client Credentials**: 2026年1月1日以降、Shopifyはレガシーカスタムアプリによる永続的なトークンの作成を許可しなくなりました。新しいアプリは、Shopify Dev DashboardからのClient IDとClient Secretと共に`auth_method: CLIENT_CREDENTIALS`を使用する必要があります。トークンはコネクタによって自動的に更新されます。


**パラメータリファレンス**

| Name | Description | Value | Default Value | Required |
|  --- | --- | --- | --- | --- |
| type | インポートのソース。 | `"shopify_v2"` |  | Yes |
| auth_method | 使用する認証方法。 | String。次のいずれか:- `"STATIC_TOKEN"` — 永続的なAdmin APIアクセストークンを使用します。
- `"CLIENT_CREDENTIALS"` — Client IDとClient Secretを使用します（OAuth 2.0 Client Credentials Grant）。

 | `"STATIC_TOKEN"` | No |
| admin_api_access_token | ShopifyのAdmin APIで認証するために使用される永続的なアクセストークン。`auth_method`が`STATIC_TOKEN`の場合に必須。このトークンは、Shopify管理パネルの**Apps > Develop apps > Create an app > Configure Admin API scopes**から生成できます。 | String |  | Yes（`auth_method`が`STATIC_TOKEN`の場合） |
| client_id | Shopify Dev DashboardによってサポートされるClient ID。`auth_method`が`CLIENT_CREDENTIALS`の場合に必須。 | String |  | Yes（`auth_method`が`CLIENT_CREDENTIALS`の場合） |
| client_secret | Shopify Dev DashboardによってサポートされるClient Secret。`auth_method`が`CLIENT_CREDENTIALS`の場合に必須。 | String |  | Yes（`auth_method`が`CLIENT_CREDENTIALS`の場合） |
| target | データを収集するソース | String。有効なターゲット:- `products`
- `product_variants`
- `meta_fields`

 |  | Yes |
| store_name
 | Shopifyストアのストア識別子。これは2つの形式で入力できます:
- 完全なストアURL: 例 `https://mountbaker.myshopify.com`
- ストア名のみ: 例: `mountbaker`

ストア名のみを使用している場合は、`.myshopify.com`ドメインなしのストアの一意の識別子である必要があります。
 | String
 |  | Yes
 |
| incremental | レポートをグループ化するメトリクスのリスト。許可される値はレポートタイプによって異なります。 | Boolean | `false` | No |
| incremental_field | 増分読み込みに使用するタイムスタンプ。 | String | `created_at` | No |
| start_date | データをエクスポートする開始タイムスタンプ | String。形式: `yyyy-MM-dd'T'HH:mm:ss.SS'Z'` |  | No |
| end_date | データのエクスポートを終了する終了タイムスタンプ | String。形式: `yyyy-MM-dd'T'HH:mm:ss.SS'Z'` |  | No |
| metafield_resource | メタフィールドのターゲット | String。値は `"product"` になります。 |  | Yes（ターゲットが `meta_fields` の場合） |
| metafield_object | メタフィールドオブジェクト | String。値は次のいずれかです:- `product`
- `product_variant`

 |  | Yes（ターゲットが `meta_fields` の場合） |
| product_ids | メタフィールドを取得したい製品IDのカンマ区切りリスト | String。例: `"gid://shopify/Product/8472042950, gid://shopify/Product/8472044230"` |  | Yes（metafield_objectが `product` の場合） |
| product_variant_ids | メタフィールドを取得したい製品バリアントIDのカンマ区切りリスト | String。例: `"gid://shopify/ProductVariant/28753686918, gid://shopify/ProductVariant/28753705670"` |  | Yes（metafield_objectが `product_variant` の場合） |


データをプレビューするには、`td connector:preview`コマンドを使用します。


```
td connector:preview load.yml
```

### ロードジョブの実行

データのサイズによっては数時間かかる場合があります。データを保存するTreasure Dataデータベースとテーブルを必ず指定してください。
Treasure Dataのストレージは時間でパーティション化されているため、Treasure Dataでは--time-columnオプションを指定することも推奨しています（[data partitioning](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照）。このオプションが提供されていない場合、データコネクタは最初のlongまたはtimestamp列をパーティション化時間として選択します。--time-columnで指定する列のタイプは、longおよびtimestampタイプのいずれかである必要があります。

データに時間列がない場合は、*add_time*フィルターオプションを使用して時間列を追加できます。詳細については、[add_time Filter Function](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)のドキュメントを参照してください。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at
```

connector:issueコマンドは、すでにdatabase(td_sample_db)とtable(td_sample_table)を作成していることを前提としています。データベースまたはテーブルがTDに存在しない場合、このコマンドは失敗します。データベースとテーブルを手動で作成するか、td connector:issueコマンドで--auto-create-tableオプションを使用してデータベースとテーブルを自動作成してください。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table--time-column created_at --auto-create-table
```

データコネクタはサーバー側でレコードをソートしません。時間ベースのパーティション化を効果的に使用するには、事前にファイル内のレコードをソートしてください。

timeというフィールドがある場合は、--time-columnオプションを指定する必要はありません。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table
```

### インポートモード

load.ymlファイルのout:セクションでファイルインポートモードを指定します。out:セクションは、Treasure Dataテーブルへのデータのインポート方法を制御します。たとえば、データを追加するか、既存のテーブルのデータを置き換えるかを選択できます。

| **Mode** | **Description** | **Examples** |
|  --- | --- | --- |
| Append | レコードはターゲットテーブルに追加されます。 | 
```yaml
in:
  ...
out:
  mode: append
```
 |
| Always Replace | ターゲットテーブルのデータを置き換えます。ターゲットテーブルに加えられた手動スキーマ変更はそのまま残ります。 | 
```yaml
in:
  ...
out:
  mode: replace
```
 |
| Replace on new data | インポートする新しいデータがある場合にのみ、ターゲットテーブルのデータを置き換えます。 | 
```yaml
in:
  ...
out:
  mode: replace_on_new_data
```
 |


### 実行のスケジューリング

増分ファイルインポートのために定期的なデータコネクタの実行をスケジュールできます。Treasure Dataスケジューラーは、高可用性を確保するために最適化されています。

スケジュールされたインポートの場合、指定されたプレフィックスと次の条件のいずれかに一致するすべてのファイルをインポートできます:

- use_modified_timeが無効になっている場合、次の実行のために最後のパスが保存されます。2回目以降の実行では、統合はアルファベット順で最後のパスの後に来るファイルのみをインポートします。
- それ以外の場合、ジョブが実行された時刻が次の実行のために保存されます。2回目以降の実行では、コネクタはその実行時刻以降にアルファベット順で変更されたファイルのみをインポートします。


### TD Toolbeltを使用してスケジュールを作成

td connector:createコマンドを使用して新しいスケジュールを作成できます。


```
$ td connector:create daily_import "10 0 * * *" td_sample_db td_sample_table load.yml
```

Treasure Dataのストレージは時間でパーティション化されているため、Treasure Dataでは--time-columnオプションを指定することも推奨しています（[data partitioning](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照）。


```
$ td connector:create daily_import "10 0 * * *" td_sample_db td_sample_table load.yml --time-column created_at
```

cronパラメータは、3つの特別なオプション: @hourly、@daily、および@monthlyも受け入れます。

デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。--timezoneオプションは、Asia/Tokyo、America/Los_Angelesなどの拡張タイムゾーン形式のみをサポートします。PST、CSTなどのタイムゾーンの略語はサポートされておらず、予期しないスケジュールになる可能性があります。