knowledgeS

Knowledge

知識

【Shopify メールマーケティング】有料アプリなし!Shopify Flow × Shopify Emailで実現する『初回購入者1万人限定のスペシャルクーポン付きオファーメール』を自動配信する方法!

【Shopify メールマーケティング】有料アプリなし!Shopify Flow × Shopify Emailで実現する『初回購入者1万人限定のスペシャルクーポン付きオファーメール』を自動配信する方法!

目次

  • はじめに
  • 利用するShopifyの標準機能
  • Step1:Shopify標準のディスカウント機能でスペシャルクーポンを設定
  • Step2:Shopify Emailでスペシャルクーポン付きオファーメールを作成
  • Step3:Shopify Flowのセット

    1.事前準備

    2.ワークフローのセット

  • おわりに
  • 本記事で用いたShopify GraphiQL AppやShopify FlowのRun codeアクションの詳細なコード

    ・Run codeアクション

    ・Run code用:GraphQL クエリ

    ・Run code用:SDL定義(スキーマ)

    ・Run code用:JavaScript コード(Run code内)

はじめに

本記事は、Shopifyを利用してオンラインショップを運営している方向けの内容です。メールマーケティング施策の一環として、「初回購入者1万名限定」で2回目の購入を促進するためのクーポン付きオファーメール(以下、『初回購入者限定クーポン』と記載)を自動で配信する方法をご紹介します。記事の最後には読者様にご利用いただきやすいように本記事で利用したプログラムコードを載せさせて頂いてます。

ShopifyではCRMやMA(マーケティングオートメーション)ツールとして、数多くの有料パブリックアプリが提供されています。そこで、本記事ではShopify FlowとShopify Emailを併用することで、有料パブリックアプリを利用せずに効果的なメールマーケティング施策を実現する方法にフォーカスしています。

また、Shopify Emailは月間10,000通まで無料で配信できるため、「無料枠内でキャンペーンを実施したい」「配信数の上限を設けて施策を行いたい」と考えている方にも、本記事の内容は大いに参考になるはずです。

利用するShopifyの標準機能

①:Shopify標準のディスカウント機能
②:Shopify Email
③:Shopify Flow

Step1:Shopify標準のディスカウント機能でスペシャルクーポンを設定

Shopify標準ディスカウント機能:本記事用の初回購入者限定クーポンの詳細↑

この記事でご紹介する方法は、Shopifyの標準機能を活用し「初回購入者1万人限定のクーポンをメールで自動配信できるようにする」流れを解説しています。今回ご案内するクーポンは、「お一人様1回限り」という設定になっています。クーポンコードは自動発番された『V8P4FC90WNGD』を利用します。

なお、1点ご注意ください。 記事執筆時点でのShopify標準のディスカウント機能の仕様上、お客様が一度「お一人様1回限りクーポン」を使って商品を注文し、その注文がキャンセルされた場合、同じメールアドレスや電話番号で再度同じクーポンを使うことはできません。本記事では、このようなシナリオについては考慮に入れずキャンセルされても初回購入者限定クーポンは利用済みになるという前提で解説を進めています。
話はそれますが、それでも注文をキャンセルしてもう一度クーポンを使わせたい場合には、ショップの運営方針により判断は分かれるので 推奨する方法ではありませんが、「別のメールアドレスや電話番号で新しくご登録いただき、もう一度クーポンを利用する方法」や「異なるクーポンコードで同じ内容の新しいディスカウントを発行しキャンセルしたユーザーに配布する方法」といったオペレーション対応で問題を解消することができます。この方法は、ショップとして正式にご案内する対応ではなく、あくまで個別対応や例外としてお取り扱いいただくのがよいと思います。

Step2:Shopify Emailでスペシャルクーポン付きオファーメールを作成

Shopify Email:配信メール設定↑

次にShopify Emailのアプリ設定画面よりスペシャルクーポン付きオファーメールを作成します。標準で備わっているテンプレートから選択したりデザインのカスタマイズを行うことも可能ですが、本記事では標準で備わっているテンプレートを利用します。
上図のようにディスカウントを選択する際にはStep1のクーポンコード(V8P4FC90WNGD)を選択してください。そうすることで、メール受信者がメールを開き「ディスカウントを適用」をクリックしショップにアクセスすると自動でディスカウントが注文に適用された状態になります。

● ShopifyEmailを利用する上での前提情報(配信数・料金のしくみ)

★ポイント:

  1. Shopify Emailは、月10,000通まで無料でメールを配信できます。
  2. 無料分を超えた分は、1,000通ごとに1ドルの追加料金(たくさん送ると割引があり、増える程に割引率が上がっていきます)。
  3. 追加料金がとても少ない場合は、0.005ドル(0.5セント)たまってから、まとめてから請求されます。
  4. キャンペーンごとに「人数や件数の上限」や「自動配信停止」の設定はできません。                            例:「このキャンペーンだけ先着○人」や「○件超えたら自動で停止」等
  5. 配信数について:メール数は「実際に届けた件数」でカウントされます。 例)800人に1通ずつ送信すると「800通」とカウントされます。

★Shopify Email詳細についてはこちら↓の内容を参照してください。
参照先:
https://help.shopify.com/ja/manual/promoting-marketing/create-marketing/shopify-email/shopify-email-cost

Shopifyヘルプセンター


Step3:Shopify Flowのセット

1. 事前準備

初回購入者限定クーポンの最新の利用状態(利用された回数)を管理するために、Shopifyのショップ情報のメタフィールドに『first_time_buyer_coupon_count』というメタフィールドを新しくセットします。「なぜ外部サーバーを使わず、Shopifyのメタフィールドでクーポンが利用された状態を管理するのか?」についてはStep3の最後に解説します。

通常、Shopifyの管理画面から新しくメタフィールドを追加する際は下図の通り「管理画面 > 設定 > カスタムデータ > メタフィールドの定義」から追加することができるのですが、 ショップ情報については一覧に表示されておらずGUI操作(画面操作)でメタフィールドを追加することができません。

カスタムデータの中に「ショップ」がない↑

そのため、ShopifyのAPIを直接叩く必要があります。ターミナルからコマンドを入力する方法など様々な方法がありますが、本記事ではShopifyに搭載されているShopify GraphiQL Appを用いてShopifyのショップ情報のメタフィールドに『first_time_buyer_coupon_count』というメタフィールドを新しくセットします。
Shopify GraphiQL Appについて詳しく知りたい方はこちらのShopify開発サイトの記事を参照してください。

Shopify GraphiQL App:ショップ情報にメタフィールドを新しく定義する処理↑

上図の通りにShopify GraphiQL Appより新しくショップ情報のメタフィールドを定義します。Shopify開発サイト上のこちらの説明資料のコードを活用して「first_time_buyer_coupon_count」というkey名でセットしてます。
実行すると、下図の通りにショップ情報に新しくメタフィールドが定義されていることが確認できます。

Shopify GraphiQL App:ショップ情報で定義されているメタフィールドを検索↑

2. ワークフローのセット

Shopify Flowのワークフローの全体構成↑

まず初めに、注文が作られる度に発火する「Order created」トリガーをセットします。
次に、今回10,000名に配布するクーポンコード(V8P4FC90WNGD)が注文情報に含まれているかを確認する条件をセットします。
含まれている場合にはRun codeアクションを用いて「①初回購入者かどうかを判定情報(isFirstPurchase)」と「②ショップ情報のメタフィールド内の今回の注文分含む初回購入者限定クーポンの利用回数(firstTimeBuyerCouponCount)」を取得します。

Shopify Flowの説明についてはこちらを、Run codeの説明についてこちらのShopifyヘルプセンターの記事を参考にしてください。
Shopify FlowのRun codeは、カスタムのJavaScriptコードを実行できる機能です。この機能を使用することで、Shopifyの標準的なワークフローにない処理を柔軟に組み込むことができます。Run codeでは、まずGraphQLを使ってShopifyから必要なデータを取得し、そのデータをJavaScriptで処理して最終的な結果を返すという流れになります。これにより、注文データや商品情報など、標準機能では得られないカスタマイズしたデータを取り扱い、ワークフロー内で活用できるようになります。本記事では詳細な説明については割愛します。

Run codeの中身:記述されているコードは本記事の最後に載せてます↑

そして、初回購入者(isFirstPurchaseが「true」)且つ、初回購入者限定クーポンの利用回数が10,000以下(firstTimeBuyerCouponCount <=10000)であるかどうかの条件をセットします。

Shopify Flow条件部分:isFirstPurchaseが「true」且つfirstTimeBuyerCouponCount <=10000↑

この条件が一致した場合に、限定クーポンが付加されたマーケティングメールを送信されるように「Send Email Marketing」のアクションをセットします。

Send Email Marketingアクション↑

最後に「Update Shop Metafield」アクションを用いてショップ情報のメタフィールド内の初回購入者限定クーポンの利用回数(key:first_time_buyer_coupon_count)を最新の状態に更新します。
これにより初回購入者限定クーポンの利用回数が10,000になるまで更新される状態になります。

UpdateShopMetafieldアクション↑

これでワークフローのセットは完了です。

最後に、本記事では「なぜ外部サーバーを使わず、Shopifyのメタフィールドでクーポンの利用状況を管理するのか」について解説します。

まず、Shopifyのデータベースには当然「クーポン利用回数」の情報が保持されています。しかし、この記事で紹介しているように Shopify Flowを利用する場合、たとえ「Run code」機能を使ったとしても、クーポンの利用回数を直接取得することはできないという制約があります。

本来、クーポンの利用状況を正確に管理したいのであれば、専用の外部サーバーやデータベースを構築し、そこで集計する方法が一般的です。しかし、その場合、サーバー代やシステムの保守・トラブル対応など、どうしても運用コストや手間がかかってしまいます。

そこで今回は、Shopify標準機能であるショップ情報の「メタフィールド」を活用し、クーポンの利用回数を直接記録する方法を採用しました。これにより、外部システムに依存せず、手軽にクーポン管理を実現しています。

ここでは、そのメリットとデメリットを簡潔にまとめます。

●メリット:
サーバー不要で手軽:外部サーバーを用意する必要がありません。Shopifyだけで完結するので、コストも手間もグッと抑えられます。
コスト節約:サーバー代やシステムの保守・運用費、開発費などが不要です。
管理がシンプル:Shopifyの管理画面で設定や確認が完了し、特別な専門知識がなくても対応しやすいです。
Shopify Flowなどと組み合わせやすい:クーポン利用時にメタフィールドの値を自動で増やすなど、ワークフロー自動化とも相性が良いです。

●デメリット:
同時アクセス時のリスク:クーポンを同時に大量の人が使ったとき、数字の更新タイミングによってカウントミス(ダブルカウントなど)が発生する可能性があります。
細かな分析や履歴保存には不向き:「誰がいつどのクーポンを使ったか」といった詳しい情報までは記録できません。メタフィールド上では単純なクーポンの利用数だけの管理になります。

おわりに

本記事では、有料のパブリックアプリを利用せずに、「初回購入者1万名限定」で2回目の購入を促進するクーポン付きオファーメールを自動配信する方法をご紹介しました。

CRMやMAツールを活用した本格的なマーケティング施策は、ショップ運営が軌道に乗ってから導入を検討したいと考えているオンラインショップ運営者様にとって、きっと役立つ内容になっているはずです。

本記事で用いたShopify GraphiQL AppやShopify FlowのRun codeアクションの詳細なコードはこちらです↓↓↓

※尚、本記事のコードやワークフロは必ず開発環境で検証を実施した上でご利用頂けるようご留意頂けますと幸いです。

本記事で用いたShopify GraphiQL AppやShopify FlowのRun codeアクションの詳細なコード


●Shopify GraphiQL App:Query:ショップ情報で定義されているメタフィールドを検索

{
shop {
    metafields(first: 100, namespace: "custom") {
      edges {
        node {
          id
          namespace
          key
          value
          type
          description
          createdAt
          updatedAt
        }
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}

●Shopify GraphiQL App:mutation・variables:ショップ情報にメタフィールドを新しく定義する処理

 

mutation

mutation metafieldsSet($metafields: [MetafieldsSetInput!]!) {
  metafieldsSet(metafields: $metafields) {
    metafields {
      id
      namespace
      key
      type
      value
    }
    userErrors {
      field
      message
    }
  }
}

●variables

{
  "metafields": [
    {
      "namespace": "custom",
      "key": "first_time_buyer_coupon_count",
      "type": "number_integer",
      "value": "0",
      "ownerId": "gid://shopify/Shop/72640954658"
    }
  ]
}

● Run codeアクション

● Run code用:GraphQL クエリ

query{
  order{
    customer{
      orders{
        id
      }
    }
    discountCodes
  }
  shop{
    metafields{
      namespace
      key
      value
    }
  }
}

● Run code用:SDL定義(スキーマ)

type Output {
  isFirstPurchase: Boolean!
  firstTimeBuyerCouponCount: Int!
}

● Run code用:JavaScript コード(Run code内)

export default function main(input) {
  // ①:初回購入者かどうかを判定
  const orderCustomerOrdersArray = input.order.customer.orders; // orderCustomerOrdersには、例えば [{id: "123"}, {id: "124"}] のような値が入っている前提
  const isFirstPurchase = Array.isArray(orderCustomerOrdersArray) && orderCustomerOrdersArray.length <= 1; // 0件または1件ならtrue、それ以外(2件以上やundefined/null/非配列)はfalse
  console.log(isFirstPurchase);  // フラグの値をログに出力し確認:trueなら初回購入者、falseならリピーター

  // ショップ情報のメタフィールドを取得
  const shopMetafields = input.shop.metafields;
  const metafieldNamespace = "custom";
  const metafieldKeys = {
      firstTimeBuyerCouponCount: "first_time_buyer_coupon_count"
  };
  
  // メタフィールドの取得とパース(型変換:文字列型を数値型に変換)
  const getCountMetafield = key => {
    const field = shopMetafields.find(
      metafield => metafield.namespace === metafieldNamespace && metafield.key === key
    );
    if (!field || field.value == null) return 0;
    const n = Number(field.value);
    if (isNaN(n)) {
      console.log(`Metafield(${key}) value is not a number:`, field.value);
      return 0;
    }
    return n;
  };
  // ②:ショップ情報のメタフィールド内の初回購入者限定クーポンの利用回数情報を取得し今回の注文分の「1」を加算
  let firstTimeBuyerCouponCount = getCountMetafield(metafieldKeys.firstTimeBuyerCouponCount);
  firstTimeBuyerCouponCount += 1;
  
  // ①と②の結果を返す
  return { isFirstPurchase: isFirstPurchase, firstTimeBuyerCouponCount: firstTimeBuyerCouponCount }
}