見出し画像

セグメントメールの効率化


今回はメールマーケティングの手法であるセグメントメールを、メール配信システムのブラストメールを使ってセグメントメールを活用して効率的に行います。

今回やりたいこと

・スプレッドシートのリードリストにメールを送りたい

・興味がある商品(5種類)毎にメールの題材を変えたい

・尚且つ状態(認知だけ or 比較検討中)によっても内容を変えたい

これを実現する機能がブラストメールに備わっています。

ブラストメール

ブラストメールはメール配信システムですがAPIを公開しており、プログラムから一部機能を利用できます。
企業も複数利用されているので参考にしてみてください。

今回使うブラストメールの機能

○ユーザー情報の登録
名前やメールアドレスに限らず、あらゆるレコードを保存できます。(年齢や性別など)自由にフィールドをカスタマイズできる柔軟性があります。

○登録ユーザーのグルーピング
↑で登録されているユーザーをグルーピングできます。(男性のみ、あるいは○○に興味がある人など)
このグループ単位でメールを送ることができます。これが今回のメイン機能です

○予約配信
時間を指定して配信することが可能です。

今回は5つの商品があり、それらに対してHPから資料請求がなされ、誰がどの商品に興味があるのか判明しているという前提で行います。
興味がある商品によってメーリングリストを作成し、ユーザーの趣向に沿うメールを配信します。

システムの構成

まずはメールを送る相手の情報が必要になりますので、それらをスプレッドシートで保持しているとします。

その中からGASを使って時間をトリガーに毎週○曜日の○時に自動的にメールを配信していきます。

スプレッドシートの準備

メーリングリストを作成する前に、まずはスプレッドシートを作成します。任意のスプレッドシートに「リスト」という名称でシートを作成します。項目は以下です。

A:会社名
B:氏名
C:メールアドレス
D:興味がある商品
E:フェーズ
F:アクション

Dの興味がある商品は複数ある場合はカンマで区切って追加します。
Fのアクションはなんらかの理由でメールの受信を拒否されている場合にのみ「拒否」と入り、それ以外は空白です。

配信先単位の情報整理

今回はブラストメールで作成したグループ単位でメールを配信するのでその情報をスプレッドシート側でも保持しておきます。

ブラストメール側の設定

HOME > グループ設定 > フィルタ配信 > 新規登録の手順でグループを作成します。
そこで計10個グループを作成します。
(商品1〜5が興味あり)×(フェーズが認知 or 検討)
ある商品に対して、認知されただけの段階(特に細かい指定もなく資料請求だけされたとか)あるいは、検討がある程度進んでいるのかというざっくり二つに分けてそれぞれに合う情報を提供していきます。

スプレッドシート側の設定

ブラストメールという名前のシートを追加します。項目は以下です。

A列:商品
B列:フェーズ
C列:グループID
D列:送信元ID

Aには先ほど作ったグループのうち商品名が、Bには認知か検討のどちらかが入ります。
CにそのグループのIDを格納します。これはGASで取得して入れます。Dは送り先のアドレスですが今回は全て同じアドレスから送ります。(これを変えることで送信元アドレスもグループによって変えられます)

GASでグループIDを取得

今回フェッチするベースはこちらです。
"https://api.bme.jp/rest/1.0"

これにグループID取得のエンドポイントを付け足します。
"/group/list/search"

このときにアクセストークンが必要になるのでまずはそれを取得します。

  // ブラストメールにログインしてアクセストークンを取得する

  function getToken(url,userName,pw,key){
    const payload = {
      format:"json",
      username:userName,
      password:pw,
      api_key:key
    }
    const option = {
      method:"POST",
      payload:payload
    }
    const res = UrlFetchApp.fetch(url,option)
    return JSON.parse(res).accessToken
  }

これでアクセストークンを取得します。

ユーザー名とパスワードはブラウザでログイン時に入力するものそのままで大丈夫です。
API keyはブラストメール画面右上の契約者情報 > アカウント情報から確認できます。

これを使ってグループIDと送信元IDを取得します。

 //グループIDと送信元アドレスIDを取得する

 const groupIdURL = `${baseURL}/group/list/search`
 const senderIdURL = `${baseURL}/sender/list/search`

 function getId(url){
    const param = `?access_token=${token}&f=json`
    const fetch = url+params
    const gropuid = UrlFetchApp.fetch(fetch)
    return gropuid.getContentText()
  }
 const groupId = getId(groupIdURL)
 const senderId = getId(senderIdURL)


これでグループIDと送信元IDが一覧で返されるのでその中から必要なものをピックして、「ブラストメール」シートの3〜4列目に格納しておきます。

メールテンプレート作成

メールテンプレートシートを作成します。
項目は以下です。
A:表示名
B:件名
C:本文

メーリングリスト作成

これである程度準備が整いましたので、本題に入っていきます。
まずはメーリングリストの元になるリードリストを作成します。

function makelist() {
  // スプレッドシート(DB)のデータを読み込んでリストを作成する
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const listSh = ss.getSheetByName("リスト")
  const lastRow = listSh.getLastRow()
  const allData=listSh.getRange(2,1,lastRow-1,6).getValues()
  const product1 = "product1";
  const product2 = "product2";
  const product3 = "product3";
  const product4 = "product4";
  const product5 = "product5";

  const list = [["エラーカウント数","状態","氏名","会社名","E-Mail","ステータス","フェーズ",product1,product2,product3,product4,product5]]
  allData.forEach( (row) => {
    const action=row[5]
    if(action == ""){
      const company = row[0]
      const name = row[1]
      const toAdress = row[2]
      const product = row[3]
      const fase = row[4]
      const inchecker = (text) => {
        if(product.includes(text)){
          const base = "興味あり"
          return base
        }
      }
      const pro1 = inchecker(product1)
      const pro2 = inchecker(product2)
      const pro3 = inchecker(product3)
      const pro4 = inchecker(product4)
      const pro5 = inchecker(product5)
      list.push(["","",name,company,toAdress,"顕在",fase,pro1,pro2,pro3,pro4,pro5])
    }
  })  
  const remakeList = list.join("\r\n")
  return remakeList
}

自動配信

自動配信は4つのステップです。

  1. アクセストークンを獲得

  2. メーリングリストを更新及び登録

  3. 予約配信

  4. ログアウト

 function automail() {

  // ①ブラストメールにログインしてアクセストークンを取得する
  const baseURL = "https://api.bme.jp/rest/1.0/"
  const loginURL = `${baseURL}/authenticate/login`
  const userName = "ユーザー名"
  const pw = "パスワード"
  const key = "アクセスキー"
  const token = login(loginURL,userName,pw,key)  
  
  //リストの作成→更新および登録
  const list = makeList()
  const registerList = (url) => {
    const today = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd")
    const blob = Utilities.newBlob(list,"text/csv",`メーリングリスト${today}`)
    const payload = {
      access_token:token,
      file:blob,
      format:"json"
    }
    const option = {
      method:"POST",
      payload:payload,
      muteHttpExceptions:false
    }
    UrlFetchApp.fetch(url,option)
  }

  const registURL = `${baseURL}/contact/import/all`
  try{
    registerList(registURL)
  }catch(e){
    console.log(e)
  }

 
  // 予約配信関数
  const reservMail = (url,senderID,groupID,subject,text,scheduleDate) => {
    const payload = {
      access_token:token,
      senderID:senderID,
      groupID:groupID,
      subject:subject,
      textPart:text,
      scheduleDate:scheduleDate,
      format:"json",
      public:"true"
    }
    const option = {
      method:"POST",
      payload:payload
    }
    UrlFetchApp.fetch(url,option)
  }

  const reservURL = `${baseURL}/message/schedule/create`
  const bmSh = ss.getSheetByName("ブラストメール")
  const groupList = bmSh.getRange(2,1,11,4).getValues()
  const mailTextSh = ss.getSheetByName("メールテンプレート")
  const textShLastRow = mailTextSh.getLastRow()
  const textList = mailTextSh.getRange(2,1,textShLastRow-1,3).getValues()

  // テンプレートリストからランダムで流す件名と本文を抽出して予約配信を設定
  groupList.forEach( (value,index) => {
    const groupName = value[0] + value[1]
    const groupID = value[2]
    const senderID = value[3]
    const textSets = []
    textList.forEach(row => {
      if(groupName == row[0]){
        let subject = row[1]
        let text = row[2]
        textSets.push([subject,text])
      }
    })
    const setLength = textSets.length
    if (setLength > 0){
      const random = Math.floor(Math.random()*setLength)
      const subject = textSets[random][0]
      const text = textSets[random][1]
      const now = new Date()
      const minutes = now.getMinutes()
      now.setMinutes(minutes+index+1)
      const scheduleDate=Utilities.formatDate(now,"JST","yyyy-MM-dd'T'HH:mm:ss'+09:00'")
      reservMail(reservURL,senderID,groupID,subject,text,scheduleDate)
    }
  })

  // ログアウトする
  const logOut = (url) => {
    const param =`?access_token=${token}&f=json`
    const fetchUrl = url+param
    const option = {
      muteHttpExceptions:false
    }
    const res = UrlFetchApp.fetch(fetchUrl,option)
    return res
  }
  const logOutURL = `${baseURL}/authenticate/logout`
  logOut(logOutURL)
}

これで自動でメールが配信されるようになりました。最後にこの関数をスケジュールタイマーで自動で実行できるようにします。

トリガーの設定

左なしのタブからトリガーを選択して、時間ベース>週単位にして毎週月曜日の9:00にでも設定してもらえればあとは自動で流せます。

MAツールを使えば早い話ですがなかなかそうもいかないという方は是非お試しください。
筆者はエンジニアでもなんでもありませんので、不備があればコメントなどでご指摘いただければと思います。

この記事が気に入ったらサポートをしてみませんか?