Looker × SendGrid で複数の宛先へメール送信を実装する方法と、活用方法

2025年1月30日掲載

【Looker x GenAI】Looker と生成 AI で実現するパーソナライズドマーケティング:カスタム Action で顧客体験を向上

Google Cloud のデータプラットフォーム「Looker」のカスタム Action を活用することで、データ分析結果を基にした自動化されたアクションが可能になります。

本記事では、Looker のカスタム Action と メール配信プラットフォーム「SendGrid」を組み合わせ、簡易的なマーケティングオートメーション(MA)ツールとして活用する方法を紹介します。これにより、顧客へのプロモーションメール配信を効率化することができます。

通常の Looker Action では単一のメールアドレスにしか送信できません。そこで、本記事ではリスト形式での一括送信(Bulk 配信)を実現する方法について詳しく解説します。この機能は、マーケティング部門やデータ分析を利用して顧客アプローチを行う方々にとって高いニーズを持っています。

マーケティング部門やデータ分析を活用した顧客アプローチに関心がある方は、ぜひ読んでみてください。

目次

Looker とは

Looker は、Google Cloud が提供する「データプラットフォーム」です。

データの集計可視化はもちろん、データの事前定義や外部ツールとの連携により、分析結果に基づく具体的なアクションまでを一貫して実行できます。データの民主化を促進し、迅速かつ正確な意思決定を支援するツールです。

詳細については、データプラットフォーム「Looker」 の機能紹介記事をご参照ください。

Looker のアクション機能:分析から行動へ

Looker のアクション機能は、Explore で分析した結果を基に、外部システムへのデータ送信や特定の処理実行を自動化する仕組みです。従来のCSV出力・加工といった煩雑なプロセスを省き、大幅な時間と労力の削減を実現します。

メール配信リストの自動生成、CRM へのデータ送信など、さまざまなアクションを Looker 上で直接実行できます。これにより、データ分析から一歩進んだ「データ駆動型アクション」が可能になります。

本記事では、Looker のアクション機能の中でも特に利用頻度が高い「メール配信」の実装例を紹介します。

Lookerをマーケティングに活用した事例としては、【Looker x GenAI】Looker と生成 AI で実現するパーソナライズドマーケティング なども参照してください。

システム構成

今回は、BigQuery の一般公開データセットである  e コマースデータセット(thelook_ecommerce)を用いて、ターゲット顧客にプロモーションメールを送信するアクション機能を実装しました。

このシステムでは、Looker のカスタム Action を利用して、e コマースデータセットからターゲット顧客のリストを抽出し、SendGrid を介してプロモーションメールを一括送信します。

SendGrid は、メール配信プラットフォームで、Google Cloud Marketplace で提供されているものを利用します。2025年1月29日現在、無料プランでは月あたり12,000件のメールが送信可能ですので、PoCや簡単なアプリケーションでは十分かと思います。本記事では SendGrid 自体の設定は省略しますので、公式のガイドなどを参照してください。

サーバー側では、Looker Action API を使用してカスタム Action を作成します。Action API は、Looker からのアクションを受け入れる Incoming Webhook のような API です。Looker Action API の詳細は公式ドキュメント「アクション ハブを介したデータ共有」を参照してください。本カスタム Action は、以下の3つのエンドポイントで構成されます。

  • list エンドポイント: アクションのメタデータを定義します。アクションの名称やロゴ、実行ユーザーからどの属性(ユーザー名やメールアドレスなど)を取得するかを指定します。
  • form エンドポイント: アクションの実行に必要なパラメータを定義します。アクション実行画面で表示されるフォームの内容を指定しています。
  • execute エンドポイント: アクションを実行します。今回は、SendGrid API を実行してメールを一括送信します。
Looker カスタム Action「メール配信」の構成図

Looker カスタム Action の作成

3つのエンドポイントについて順に説明していきます。

1.list エンドポイント

このエンドポイントでは、アクション定義をレスポンスに返す必要があります。
form / execute エンドポイント先もここで定義します。
 

def action_list(request):
  """Return action hub list endpoint data for action"""
  auth = authenticate(request)
  if auth.status_code != 200:
    return auth

  response = {
    'label': 'SendGrid email promo',
    'integrations': [{
      'name': 'メール配信',
      'label': 'メール配信',
      'supported_action_types': ['query'],
      "icon_data_uri": icon_data_uri,
      'form_url': BASE_DOMAIN + 'form',
      'url': BASE_DOMAIN + 'execute',
      'supported_formats': ['json'],
      'supported_formattings': ['formatted'],
      'supported_visualization_formattings': ['noapply'],
      'params': [
        {'name': 'email', 'label': 'Email',
          'user_attribute_name': 'email', 'required': True},
        {'name': 'user_id', 'label': 'User ID',
          'user_attribute_name': 'id', 'required': True}
      ]
    }]
  }

  return Response(json.dumps(response), status=200, mimetype='application/json')

'label' でアクションの表示名を、'icon_data_uri' でロゴを定義しています。

'supported_action_types' に 'query' を指定しているため、このアクションは Explore から実行できます。dashboard を指定すると、ダッシュボードからアクションを実行できるようになります。

'params' では、アクションを有効化する際に取得されるユーザー属性を指定しています。
本機能では、実際には利用していませんが、ユーザーの 'Email' と 'User ID' を取得しています。

Looker カスタム Action「メール配信」の有効化画面

2.form エンドポイント

アクション実行画面でユーザーが入力するフォームを定義します。

def action_form(request):
    """Return form endpoint data for action"""
    auth = authenticate(request)
    if auth.status_code != 200:
        return auth
    
    # Define the form fields with drop-down options
    response = [{
        'name': 'promotion',
        'label': 'プロモーションタイプ',
        'description': 'プロモーションタイプを選択してください',
        'type': 'select',
        'required': True,
        "default":  default_type,
        'options': [{'name': '期間限定クーポン', 'label': '期間限定クーポンの配布用'},
                    {'name': 'カート放棄', 'label': 'カート放棄顧客へのアプローチ'}],
        'interactive': True  # dynamic field for model specific options
    }]

本機能では、選択されたプロモーションテンプレートによって、メール件名や本文のフォームが表示されるようにするため、'interactive' パラメータを True にしています。

次のコードで、選択されたプロモーションテンプレートに対応したフォームを出力する処理をしています。

if ('promotion' in form_params):
    if (form_params['promotion'] == '期間限定クーポン'):
        response.extend([{
                'name': 'title',
                'label': '期間限定クーポンの配布用:タイトル',
                'description': '顧客向け案内メールのタイトル',
                'type': 'textarea',
                'required': True,
                'default': limited_time_tilte,
            },
            {
                'name': 'body',
                'label': '期間限定クーポンの配布用:本文',
                'description': '顧客向け案内メールの本文',
                'type': 'textarea',
                'required': True,
                'default': limited_time_body,
            }])
    elif (form_params['promotion'] == '期間限定クーポン'):
        response.extend([{
                'name': 'title',
                'label': 'カート放棄:タイトル',
                'description': '顧客向け案内メールのタイトル',
                'type': 'textarea',
                'required': True,
                'default': cart_abandonment_title,
            },
            {
                'name': 'body',
                'label': 'カート放棄:本文',
                'description': '顧客向け案内メールの本文',
                'type': 'textarea',
                'required': True,
                'default': cart_abandonment_body,
            }])

これにより、プルダウンで「期間限定クーポン」を選択すると、フォームが更新され事前設定されたメール件名と本文が表示されるようになります。

3.execute エンドポイント

このエンドポイントには、アクション実行時に選択された分析結果が送信されます。これらのデータを基に、メール配信アクションを実行します。

まず、受け取ったデータ(JSON形式)から、メールアドレスと氏名を取得します。

def action_execute(request):
    """Generate a response from Generative AI Studio from a Looker action"""
    request_json = request.get_json()
    attachment = request_json['attachment']
    # Load data from attachment
    all_data = sanitize_and_load_json_str(attachment['data'])

    # アドレス・氏名を取得する
    emails_with_names = {}
    for item in all_data:
        email = item["users.email"]
        first_name = item.get("users.first_name", "お客")  # デフォルト値を設定
        last_name = item.get("users.last_name", "")  # デフォルト値を設定
        if email not in emails_with_names:
            emails_with_names[email] = {"first_name": first_name, "last_name": last_name}

次に、フォームからメールの件名と本文を取得します。

    form_params = request_json['form_params']
    # Extract necessary parameters from form
    title = form_params.get('title', "")
    body = form_params.get('body', "")

最後に、SendGrid API を利用してメールを配信します。

    # for 文でメール送信する    
    for email, name_data in emails_with_names.items():
        html_content = f"{name_data['first_name']} {name_data['last_name']} 様 \\n" + body
        client = sendgrid.SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
        message = sendgrid.Mail(
            from_email=os.environ.get('EMAIL_SENDER'),
            to_emails=[email],
            subject=title,
            html_content=html_content
        )
        client.send(message)

これらのエンドポイントを Cloud Run 上にデプロイし、Looker と連携しています。

今回は SendGrid によるメール配信を行っていますが、Webhook や API が公開されていれば、社内システムとの連携も可能です。

メール配信アクションを使ってみる

1.Explore でターゲット顧客を絞り込み

まず、Explore でターゲット顧客を絞り込みます。
今回は、 20代、日本在住、直近3か月以内の購買といった条件でターゲット顧客を抽出しました。

2.アクション機能の選択

次に、設定 > 送信 を選択してアクション機能の選択画面を開きます。

Explore の「メール配信」アクション画面で件名や本文を編集

3.メール配信アクションの選択

list エンドポイントで指定した「メール配信」アクションが表示されているので、選択します。

4.プロモーションテンプレートの選択 

form エンドポイントで定義済みのフォームが表示されました。今回は、「期間限定クーポンの配布用」を選択します。

 

5.メール内容の編集

テンプレートを選択すると、メール件名・本文の入力フォームが表示されます。
form エンドポイントで設定済みのサンプル文章が表示されるため、必要に応じて編集し、送信ボタンをクリックします。

Explore アクションメニュー「メール配信」の件名や本文編集画面

6.メール送信完了

execute エンドポイントで SendGrid によるメール配信処理が実行されます。

メールが送信されました!

Explore の「メール配信」アクションから送信されたメール文面

今回は検証のため、宛先に自分のアドレスを含めてメールを受信できるように設定しています。このように、Looker 上から条件に合致した顧客全員への一斉送信を簡単に行えます。

まとめ

本記事では、Looker のカスタム Action 機能を活用し、データ分析結果を基にしたメール配信アクションの実装方法について解説しました。

Looker のアクション機能を利用することで、データ分析から外部システムとの連携や自動化されたアクション実行をスムーズに行えます。これにより、従来の手動作業を大幅に効率化できます。

また、Looker のカスタム Action は外部 API や社内システムとの連携が可能であり、多様なユースケースに対応できます。例えば、マーケティング施策、営業支援、通知システムとの統合など、さまざまな用途で利用できます。

Looker のカスタム Action 機能は、ビジネスニーズに応じて柔軟にカスタマイズできる強力なツールです。本記事で紹介した事例はその一例ですが、この仕組みを導入することで、より効率的かつ効果的なマーケティング施策や業務プロセスの最適化が実現できます。

ぜひ Looker とそのアクション機能を活用し、自社独自の施策を試してみてください!

 

さらに、Looker では生成 AI を活用した他の拡張機能もご利用いただけます。前回の記事もぜひご一読ください。

【Looker x 生成AI】Query Insights によるデータ解釈の効率化

Vertex AI DIYプランについて

Vertex AI Search を使って社内文書を検索する生成 AI を構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。

Vertex AI DIY プランでは、以下の3つのことを体験できます。
詳細は、関連サービスにある「Vertex AI DIYプラン」をご確認ください。

SoftBank Vertex AI Search DIYプランのご紹介

関連サービス

Vertex AI Search を使って社内文書を検索する生成AIを構築してみませんか?
ソフトバンクのエンジニアが構築をサポートします。
Google の生成AIの導入を考えている方はもちろん、どのようなものか確認したいという方でもご活用いただけます。

Looker は定義から集計、可視化の一連のデータ分析プロセスをカバーする BI ツールを超えるデータプラットフォームです。ソフトバンクは、顧客のニーズに合わせて柔軟なサポートを提供し、Looker を活用したデータドリブンな企業変革を支援しています。

Google サービスを支える、信頼性に富んだクラウドサービスです。お客さまのニーズにあわせて利用可能なコンピューティングサービスに始まり、データから価値を導き出す情報分析や、最先端の機械学習技術が搭載されています。

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

これらのエンドポイントを Cloud Run 上にデプロイし、Looker と連携しています。

今回は SendGrid によるメール配信を行っていますが、Webhook や API が公開されていれば、社内システムとの連携も可能です。

おすすめの記事

条件に該当するページがございません