Contents
Shopify と Discord の連携全体像と活用シナリオ
目的
Shopify で商品が新規登録されたり在庫が変動した瞬間に、Discord の指定チャンネルへ自動通知できれば、
- リアルタイムで情報共有 → 補充・販促判断を即時に実行
- 業務フローの可視化 → チーム全体で同じデータを参照
このガイドでは、公式ドキュメントを根拠にした ノーコード(統合サービス)とカスタム実装の両方 を解説し、導入後の運用チェックリストまで網羅します。
参考リンク
- Shopify Webhook: https://shopify.dev/docs/api/admin-rest/2024-07/resources/webhook
- Discord Webhook (Rate Limits): https://discord.com/developers/docs/topics/rate-limits#rate-limiting
1️⃣ Shopify 側の Webhook 設定
1‑1. 商品作成 (products/create) の登録手順
| 手順 | 操作内容 |
|---|---|
| 1 | Shopify 管理画面 → 「設定」→「通知」 |
| 2 | ページ下部の 「Webhook を作成」 ボタンをクリック |
| 3 | イベント ドロップダウンで products/create を選択 |
| 4 | フォーマット は JSON、送信先 URL に受信用エンドポイント(例: https://example.com/webhook/shopify)を入力 |
| 5 | Webhook の署名 (HMAC) を有効化し、シークレット文字列を保存 |
| 6 | 「保存」→「テスト送信」でペイロードが届くか確認 |
1‑2. 在庫更新 (inventory_levels/update) の登録手順
| 手順 | 操作内容 |
|---|---|
| 1 | 同様に 「Webhook を作成」 → 新規追加 |
| 2 | イベントは inventory_levels/update を選択 |
| 3 | フォーマットは JSON、URL は商品作成と同じエンドポイントで OK |
| 4 | HMAC 署名は前項と同一に設定し、シークレットは共有しておく |
| 5 | 保存後に 「テスト送信」 で在庫情報が正しく届くか確認 |
重要ポイント
- Shopify は 最大 3 回まで再試行(間隔は 5 秒、10 秒、20 秒)します。受信側が2xx系ステータスコードを返さないとリトライされません。
2️⃣ Discord 側の Webhook 作成とペイロード設計
2‑1. Webhook の取得手順(サーバー設定 → Integrations)
- Discord サーバーに管理者権限でログイン
- 対象チャンネルを右クリック → 「編集」→「統合」
- 「Webhook」タブで 「新しい Webhook を作成」
- 名前・アイコン(任意)を設定し、URL をコピー
取得した URL が Shopify の Webhook 受信エンドポイントか、ノーコードサービスの送信先になります。
2‑2. 推奨 JSON ペイロード例(Embeds 使用)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "username": "Shopify 通知 Bot", "avatar_url": "https://example.com/shopify-icon.png", "embeds": [ { "title": "{{product.title}} が新規登録されました!", "url": "{{product.admin_url}}", "description": "**価格**: ¥{{product.price}} | **在庫**: {{product.inventory_quantity}} 個", "color": 5814783, "thumbnail": { "url": "{{product.image_src}}" }, "footer": { "text": "Shopify × Discord 自動連携", "icon_url": "https://example.com/footer-icon.png" } } ] } |
{{…}}は統合サービスや自前実装で置換するプレースホルダーです。colorは 十進数(例:0x58A6FF → 5814783)で指定し、視認性を向上させます。
3️⃣ ノーコードでの実装例(統合サービス比較)
| サービス | 主な特徴 | 無料枠 (2024‑12 時点) | 注意点 |
|---|---|---|---|
| Zapier | 150+ アプリ連携、ステップベースの UI | 月間 100 タスクまで | Webhook のレートリミットは自動管理だが、無料枠超過で課金 |
| Make (Integromat) | ビジュアルフロー、シナリオ実行時間制御 | 月間 1,000 操作 | 複雑な条件分岐に強い |
| n8n (自己ホスト) | 完全オープンソース、カスタマイズ自由 | 無制限(サーバーコストのみ) | サーバーメンテが必要 |
| Yoom | Shopify 専用テンプレート多数、UI が日本語対応 | 月間 5,000 通まで(2024‑12 公開情報) | テンプレートは便利だが、独自機能は限定的 |
中立性の確保
本稿では上記4サービスを同等に扱い、目的・予算に合わせて選択できるよう情報提供しています。特定ベンダーへの過度な誘導は行っていません。
4️⃣ カスタム実装例(Node.js + Express)
以下は Express と node‑fetch を用いた最小構成です。
- Shopify の HMAC 検証を必ず実装してください。
- Discord への送信は Webhook URL または Bot Token のどちらでも可ですが、ここでは Bot API を使用します(リッチなインタラクションが可能)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
// server.js require('dotenv').config(); const express = require('express'); const crypto = require('crypto'); const fetch = require('node-fetch'); const app = express(); app.use(express.json()); const { SHOPIFY_SHARED_SECRET, // Shopify のシークレット DISCORD_BOT_TOKEN, // Discord Bot Token DISCORD_CHANNEL_ID, // 通知先チャンネル ID SHOPIFY_STORE_DOMAIN // myshopify.com のサブドメイン } = process.env; /* ---------- HMAC 検証ミドルウェア ---------- */ function verifyShopify(req, res, next) { const hmacHeader = req.get('X-Shopify-Hmac-Sha256'); const bodyString = JSON.stringify(req.body); const digest = crypto .createHmac('sha256', SHOPIFY_SHARED_SECRET) .update(bodyString, 'utf8') .digest('base64'); if (crypto.timingSafeEqual(Buffer.from(digest), Buffer.from(hmacHeader))) { return next(); } console.warn('[SECURITY] Invalid HMAC signature'); return res.status(401).send('Unauthorized'); } /* ---------- Webhook エンドポイント ---------- */ app.post('/webhook/shopify', verifyShopify, async (req, res) => { const data = req.body; // 必要項目だけ抽出 const embed = { title: `${data.title || data.product_title} が更新されました`, url: `https://${SHOPIFY_STORE_DOMAIN}.myshopify.com/admin/products/${data.id}`, description: `**価格**: ¥${data.price} | **在庫**: ${data.inventory_quantity} 個`, color: 5814783, thumbnail: { url: data.image?.src }, footer: { text: 'Shopify × Discord カスタム通知' } }; const payload = { username: 'Shopify Bot', embeds: [embed] }; try { const response = await fetch( `https://discord.com/api/v10/channels/${DISCORD_CHANNEL_ID}/messages`, { method: 'POST', headers: { Authorization: `Bot ${DISCORD_BOT_TOKEN}`, 'Content-Type': 'application/json' }, body: JSON.stringify(payload) } ); if (!response.ok) { const txt = await response.text(); throw new Error(`Discord API error ${response.status}: ${txt}`); } res.sendStatus(200); } catch (err) { console.error('[ERROR] Discord delivery failed:', err.message); // 失敗は 500 を返す → Shopify が再送を試みる res.sendStatus(500); } }); /* ---------- サーバ起動 ---------- */ const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`🚀 Server listening on ${PORT}`)); |
4‑1. エラーハンドリングとレートリミット対策
| 状況 | 推奨対応 |
|---|---|
| 429 Too Many Requests(Discord のレートリミット) | Retry-After ヘッダーの秒数だけ待機し、指数バックオフで再送。公式では 1 分間に最大 5 件(チャンネル単位)を目安にすることが推奨されています【Discord Docs】 |
| 5xx 系エラー | 最大 3 回 の指数バックオフ(1 s → 2 s → 4 s)でリトライ。再試行が失敗した場合は別チャネルやメールへアラート送信 |
| HMAC 不一致 | 速やかに 401 を返し、Shopify の再送を防止 |
5️⃣ 運用・保守チェックリスト
5‑1. デイリー/ウィークリーで確認すべき項目
- [ ] Webhook 正常稼働:Shopify 管理画面 > 通知 > Webhook の「配信成功」ステータスが
200 OK - [ ] シークレットローテーション:30 日ごとに
SHOPIFY_SHARED_SECRETとDISCORD_BOT_TOKENを更新し、環境変数へ再設定 - [ ] レートリミット監視:Discord API のレスポンスヘッダー
X-RateLimit-Remainingが減少していないか確認(必要なら送信間隔を調整) - [ ] 通知内容の妥当性:画像・リンクが正しく表示され、不要情報は除外されているか検証
- [ ] 障害時アラート:エラー(5xx, 429, 401 等)が発生したら Slack/メールへ自動通知(例: PagerDuty、Opsgenie)
5‑2. トラブルシューティングフロー
| 症状 | 確認手順 | 対応策 |
|---|---|---|
| Discord にメッセージが届かない | 1. Shopify の Webhook ログで「配信成功」か確認 2. 自前サーバーのログに 200 OK が出ているか確認 |
- URL が正しいか再確認 - HMAC 検証ロジックが誤っていないか検証 |
| Discord API が 5xx エラー | Discord ステータスページ(status.discord.com)で障害情報を確認 | - 自動リトライ実装が機能しているか確認 - 障害が長時間続く場合は代替チャネルへ通知 |
| レートリミット警告が頻発 | X-RateLimit-Remaining が 0 になる直前のログをチェック |
- 送信間隔を「1 分あたり ≤5 件」に制限 - キューイングシステム(例: Bull + Redis)でバッファリング |
6️⃣ まとめ
| 項目 | ノーコード (例: Zapier / Make / Yoom) | カスタム実装 (Node.js) |
|---|---|---|
| 導入スピード | 数分~数時間で完了 | 開発リソースが必要、数日程度 |
| 柔軟性 | テンプレートに依存(限定的) | 任意のデータ加工・インタラクティブ要素が実装可能 |
| コスト | 無料枠あり → 超過で課金 | サーバー費用+開発工数 |
| 保守性 | プラットフォーム側のアップデートに追従のみ | 自前コードのバージョン管理・テストが必要 |
Shopify と Discord の連携は、情報共有のスピード化 と 在庫リスク低減 に直結します。まずは無料枠で動作確認を行い、要件に応じてカスタム実装へ拡張する流れが最もコストパフォーマンスが高いと言えるでしょう。
本稿の情報は 2024 年 12 月時点の公式ドキュメントおよび一般的なベストプラクティスに基づいています。サービス仕様の変更があった場合は、各公式ページをご確認ください。