Zapierを使用してMarketoと500 を超えるアプリケーションをシームレスに連携
これはMarketo プリンシパルソリューションコンサルタント、Philippe Delle Case による投稿を元に作成しています。
目的
この記事ではZapierを使ってMarketoと500 以上のクラウドアプリケーションを連携する方法について詳しく説明します。
また、2 つの実用的な連携事例をご紹介します。
事例1:FullContact Card Reader から Marketo へ一方方向でリード情報を連携する
• FullContact Card Reader のモバイルアプリケーションで名刺をスキャンすると、Marketoにリードが自動的に作成されます。
事例 2:MarketoとGoogle スプレッドシートを双方向で連携する
• 既存リードを Marketoのスタティックリストに追加すると、Google スプレッドシートにもリードが自動的に追加されます。
• Google スプレッドシートで任意のリードを変更すると、その変更が Marketo にエコーバックされます。

準備
Zapierの無料アカウントにサインアップ
Zapierは、プログラマなどの ITリソースを必要とせずに、様々なオンラインアプリケーションを簡単に連携することができるサービスです。簡単な紹介はこちらでご覧になれます。現在 Zapier は、マーケティング、CRM、CMS、カスタマーサポート、フォームなど 500 以上のアプリケーションをサポートしています。
Zapierでは異なるアプリケーションを連携することをZapと呼んでいます。サポートされているWeb アプリケーションの一覧については、Zapierのzapbookをご確認ください。

無料のアカウント作成はこちらからサインアップしてください。無料アカウントは月に最大 100タスク、5 Zapまで利用可能です。Zapier の有料プラン (ベーシック、ビジネス、ビジネスプラスなど)に加入することで、より多くのアクセスが利用可能になります。
管理者アカウントもしくはAPI ユーザーアカウントでMarketoインスタンスへアクセス
Zapierコネクタは、Marketo REST API を使用してMarketoにデータをプッシュします。この API を使用するには、API User と Custom Service が必要になります。Marketo管理者である場合はこれらを作成し、そうでない場合は管理者にこれらを作成してもらう必要があります。
API User と Customer Service の作成方法についてはこちらをご覧ください。
作成が完了したら、Marketo REST API を起動させるための資格情報を用意する必要があります。
Client Id、Client Secret、Munchkin Account Id です。
• Munchkin Account Id
Munchkin Account Id は Munchkin または Web Services Admin 画面から取得できます。ID のパターンは 000-XXX-000 のようになります。

アクセストークンは1 時間で有効期限切れになるため取得する必要はありません。コネクタが自動的にトークンを生成します。後ほど詳しくご説明します。
Google の無料アカウントにサイン アップ
Googleドキュメント、スプレッドシート、スライドなど、さまざまな種類のオンラインドキュメントが作成でき、他のユーザーとリアルタイムで共同作業したり、Googleドライブに保存したりできるアプリです。今回の活用事例には Google スプレッドシートを使用します。
Googleドキュメントの様々な機能や Google のアカウント作成についての詳細はこちらをご覧ください。
FullContact の無料アカウントにサインアップ
FullContact はコンタクトに関するソーシャルプロファイル、写真、メール、署名、会社情報など、様々な情報を引き込み継続的に同期させることができます。FullContactは名刺をスキャンしてZapier を含む 250 以上のウェブアプリに取り込むことができるモバイルビジネスカードリーダーを提供しています。
無料アカウントはこちらからサインアップできます。より多くの機能と容量のあるプレミアム有料アカウントに登録することもできます。
モバイル アプリは、アップルの App Store、あるいは Google Play からダウンロード可能です。
FullContact Zap に関するドキュメントはこちらをご覧ください。
Zapier用Marketoコネクタの実装
Marketo アプリの作成
Zapierウェブインターフェイスから、Developersポータルに行きます。

[Add New App]をクリックして、「タイトル(Marketo など)」と「詳細(Description)」など最低限の情報を入力します。ロゴはオプションですがあった方が好ましいです。

認証
Marketo REST API 認証と認証に使用されるフィールドを表記します。
まず以下のフィールドを作成します:
| Label | Munchkin Account Id | Client Id | Client Secret |
| Key | munchkin_account_id | client_id | client_secret |
| Type | Unicode | Unicode | Unicode |
| Required | Checked | Checked | Checked |
以下の画面のように[Authentication Settings]を編集します。

- Auth Type: Session Auth
- Auth Mapping:
{
"access_token": "{{access_token}}"
}
- Access Token Placement: Token in Querystring
Marketoの Custome service を作成した後、client id と client secret が使用可能となります。client id と client secret を使用して REST API 認証エンドポイントを呼び出してアクセストークンを生成します。その後、このアクセストークンを使用してREST APIのリクエストを行います。トークンは1 時間後に有効期限切れとなり、REST API の呼び出しを実行するには、再度トークンを生成しなければなりません。
Auth Typeに「Session Auth」を選択したので、毎回セッショントークンが期限切れになっても、カスタムの認証スクリプトを実行できるようになります。このタイプの認証方法については、「Scripting API」セクションで見ていきます。
Triggers
Zapier トリガーの役割は、データをZapier に取り込むことです。今回の事例ではMarketo Webhookを利用しているためZapier トリガーは必要ありません。ただし、Marketoコネクタ用の必須テストとしてダミートリガーを書くことが必要です。Marketo REST API Get Daily Usage エンドポイントを呼び出して、「Test Trigger」を作成します。[Add New Trigger] をクリックしてウィザードを開始し、以下のようにフィールドを入力します(記載のないフィールドは空白のままにします)。
Name and Description
- Name: Test Trigger
- Key: test_trigger
- Description: The Test Trigger of the Marketo App
- Important: Not checked
- Hide: Checked
Trigger Fields
- None
Where Data Comes From
- Data Source: Polling
- Polling URL: https://{{munchkin_account_id}}.mktorest.com/rest/v1/stats/usage.json
Sample Result
- Leave blank
[ Manage Trigger Settings ]をクリックしてユーザーの資格情報を検証するために「Test Trigger」を設定します。
Actions
Zapier Action の役割は Zapier からのデータ送信です。Marketo REST API Create/Update Leads エンドポイントを呼び出して、「Create_Update Lead Action」を実行します。このアクションによってMarketo内の新規リード作成や既存リード更新ができようになります。
[Add New Trigger]をクリックしてウィザードを開始し、以下のフィールドを入力します(記載のないフィールドは空白のままにします)
Name and Description
- Name: Create_Update Lead
- Noun: Lead
- Key: create-update-lead
- Description: Create a new lead within Marketo, or if the lead already exists update it with the submitted values
- Important: Checked
- Hide: Not Checked
Action Fields
アクションフィールドは、ユーザーがデータをマップする先のフィールドです。アクションフィールドはMarketoで更新可能なすべてのデータを表すため、必要に応じて慎重に選択してください。Zapier には Marketoで使用可能なすべてのフィールドを提供するオプションがありますが、それは多くのコードと複雑さをもたらすこととなりますので、今回作成するサンプルのコネクタには必要ありません。
例として、以下のフィールドを選択しました。
| Label | Key | Type | Required? | Parent key | Send in POST by default? |
| Email Address | Unicode | Checked | input | ||
| Partition Name | partitionName | Unicode | Not Checked | Checked | |
| First Name | firstName | Unicode | Not Checked | input | |
| Last Name | lastName | Unicode | Not Checked | input | |
| Phone Number | phone | Unicode | Not Checked | input | |
| Notes | Lead_Notes__c | Textarea | Not Checked | input | |
| Called | called | Unicode | Not Checked | input |
今回のケースではMarketo インスタンスにリードパーティションがあるため、Partition Name は必須です。それ以外の場合では省略することもできます。エンドユーザーに同期するフィールドではないことを理解してもらうために、Partition Name を「input」グループから切り離しました。
「Notes」フィールドは、Marketo と Salesforce同期に由来するフィールドのため、Marketo のインスタンスにない場合には使用しないでください。
「Called」フィールドは、Marketo のインスタンスに作成されています。Marketo のインスタンスにない場合には使用しないでください。
当然、この例の目的は Marketo から必要とするフィールドをユーザーに選択してもらうことです。最低限のフィールドから始めて、余分なフィールドを後で追加することをお勧めします。
Where to Send Data
- Action Endpoint URL: https://{{munchkin_account_id}}.mktorest.com/rest/v1/leads.json
Sample Result
- Leave blank
Zapier スクリプト API
Zapier のスクリプト機能を使用すると、アプリケーションAPI と Zapier 間でやり取りされるリクエストとレスポンスを操作することが可能になります。カスタムの「Session Auth」認証を動作させるにはZapier のスクリプト機能が必要になります。詳細についてはこちらをご覧ください。
以下のコードをコピーしてください。後でいくつかの説明を確認していきます。
var Zap = {
get_session_info: function(bundle) {
console.log('Entering get_session_info method ...');
var access_token,
access_token_request_payload,
access_token_response;
// Assemble the meta data for our Access Token swap request
console.log('building Request with client_id=' + bundle.auth_fields.client_id + ', and client_secret=' + bundle.auth_fields.client_secret);
access_token_request_payload = {
method: 'POST',
url: 'https://' + bundle.auth_fields.munchkin_account_id + '.mktorest.com/identity/oauth/token',
params: {
'grant_type' : 'client_credentials',
'client_id' : bundle.auth_fields.client_id,
'client_secret' : bundle.auth_fields.client_secret
},
headers: {
'Content-Type': 'application/json', // Could be anything.
Accept: 'application/json'
}
};
// Fire off the Access Token request.
access_token_response = z.request(access_token_request_payload);
// Extract the Access Token from returned JSON.
access_token = JSON.parse(access_token_response.content).access_token;
console.log('New Access_Token=' + access_token);
// This will be mixed into bundle.auth_fields in future calls.
//bundle.auth_fields.access_token=access_token;
return {'access_token': access_token};
},
test_trigger_pre_poll: function(bundle) {
console.log('Entering test_trigger_pre_poll method ...');
bundle.request.params = {
'access_token':bundle.auth_fields.access_token
};
return bundle.request;
},
test_trigger_post_poll: function(bundle) {
console.log('Entering test_trigger_post_poll method ...');
var data = JSON.parse(bundle.response.content);
if ((!data.success)&&((data.errors[0].code=="601")||(data.errors[0].code=="600"))){
console.log('Access Token expired or invalid, requesting new one - data.success=' + data.success + ', data.errors[0].code=' + data.errors[0].code);
throw new InvalidSessionException(); // Calling get_session_info() to regenerate Access Token
}
return JSON.parse(bundle.response.content);
},
create_update_lead_pre_write: function(bundle) {
bundle.request.params = {'access_token':bundle.auth_fields.access_token};
return bundle.request;
},
create_update_lead_post_write: function(bundle) {
var data = JSON.parse(bundle.response.content);
if ((!data.success)&&((data.errors[0].code=="601")||(data.errors[0].code=="600"))){
console.log('Access Token expired or invalid, requesting new one - data.success=' + data.success + ', data.errors[0].code=' + data.errors[0].code);
throw new InvalidSessionException(); // Calling get_session_info() to regenerate Access Token
}
return JSON.parse(bundle.response.content);
}
};
Methods
get_session_info
- このメソッドは、Marketo REST API 認証エンドポイントを呼び出して、アクセストークンを生成または再生成する役割を担います。
- このメソッドは「post_poll」で「Access Token Expired(アクセストークンの期限切れ)」エラーが発生するたびに呼び出されます。アクセストークンは 1 時間ごとに期限が切れるようにスケジュールされているため、本メソッドが頻繁に呼び出されることが想定されます。
- Action Endpoint URL : https://{{munchkin_account_id}}.mktorest.com/identity/oauth/token
pre_poll, pre_write
- HTTP リクエストが送信される前にそれを変更するためには、すでに作成した Trigger に「pre-poll 」メソッドを作成する必要があります。メソッドの作成によってHTTP 要求のパラメーターに Marketo Access Token を追加できます。
- 同様の理由で、すでに作成した Action に「pre-write」メソッドを作成する必要があります。
post_poll, post_write
- Zapier が処理を実行する前にレスポンスを解析し、最終的に「Access Token Expired」エラーを止めるには、すでに作成した Trigger に「post-poll」メソッドを作成する必要があります。
- 同様の理由で、すでに作成した Action に「post-write」メソッドを作成する必要があります。
- エラーが発生した場合は、認証と get_session_info メソッドを再度実行するよう「InvalidSessionException」を投げます。
画面右上の「Quick links」メニューにある「Scripting API」から「Bundle logs」にアクセスできます。これはスクリプトをデバックするのにとても便利です。

事例 1:Marketo と FullContact Card Reader の統合
この統合では、FullContact を Marketo に連携するZap を作成します。
この Zap によって、FullContact Mobile Card Reader を用いて名刺をスキャンしたリード情報を Marketo に連携します。

Zap FullContact -> Marketo

Zapier Dashboard から「Make a new Zap」ボタンをクリックします。
Zapier Trigger
• FullContactのアプリを選択します。
• FullContact Trigger の「New Business Card」を選択します。
• FullContact アカウントに接続します。
• FullContact App をテストします。
Zapier Action
• 先ほど作成したApp Marketo を選びます(Betaとして表示されます。)
• Marketo Action の「Create_Update Lead」を選択します。
• Marketo アカウントに接続し、認証パラメーターに入力します(Munchkin Account Id、Client Id、Client Secret)。
• FullContact から Marketo にフィールドをマッピングします。

- 新規リードが配置される必要のある「Partition Name」 を最終的に入力します(パーティションが Marketo インスタンスに存在する場合のみ)。
- Marketo App をテストします。
- Zap を有効化します。
注意:必ずFullContact からビジネスカードリーダーをダウンロードして、ご使用のモバイルデバイスからZapier Integrationを有効化してください。
事例 2 : Marketo と Google スプレッドシートの統合
この統合では2 つの Zap を作成します。一つはMarketoをGoogleスプレッドシートに連携するZap、もう一方はGoogle スプレッドシートをMarketo に連携する Zapです。この Zap により、MarketoとGoogle スプレッドシート間でリードまたはコンタクトを同期できるようになります。

Zap Marketo Webhook -> Google Sheets

Zapier Dashboard から「Make a new Zap」ボタンをクリックします。
Zapier Trigger Part1
• 「Webhooks by Zapier」というTrigger アプリを選びます。
• Catch Hookにチェックを入れると、Zapier URL に対する POST または GET 処理機能が有効になります。
• 子キーを指定する必要はありません。
• Zapierがカスタムのwebhook URLが生成しますのでリクエストを送信して、クリップボードにコピーしてください。
Marketo の Webhook (管理者が実施)
• Admin から Webhooks に行きます。
• 「Push Lead to Zapier」という新規の Webhook を作成してください。

テンプレートのフィールドでは、Zapier に転送する必要のあるすべてのリードフィールドをトークンで定義します。
今回の事例では先にZapier コネクタで定義したものと同じフィールドを設定します。
{
"firstName":"{{lead.First Name}}",
"lastName":"{{lead.Last Name}}",
"email":"{{lead.Email Address}}",
"phone":"{{lead.Phone Number}}",
"leadOwner":"{{lead.Lead Owner First Name}} {{lead.Lead Owner Last Name}}",
"leadOwnerEmail":"{{lead.Lead Owner Email Address}}",
"leadNotes":"{{lead.Lead Notes:default=edit me}}",
"called":"{{lead.Called}}"
}
• 保存します。
• Response Mapping は不要です。
Marketoのテストキャンペーン
• マーケティング活動から、新規Smart Campaignを作成します。
テスト用にリードステータスが MQLに変更される毎にWebhookをトリガーするキャンペーンを作成します。

•スマートリストを編集します。

• フローでWebhook を呼び出します。

• スケジュールを設定します。

• 「Smart Campaign」を有効化します。
Zapier Trigger Part 2
• 「Webhooks by Zapier」Trigger App を完了するには、MarketoのSmartCampaign のトリガーを発火させ、ZapierのWebhookでキャッチする必要があります。
• テストの実施はリードデータベースでリードを開いてステータスを「MQL」に変更するだけです。
Google シートでのスプレッドシート作成
• 新規のスプレッドシートを作成します。
• ワークシートを作成、またはデフォルトのシートを使用します。
• Marketo から同期する必要のある各フィールドの列を追加します(Marketo の Webhook で設定したものと同じフィールドにしてください)

Zapier Action
• Google Sheetsアプリを選びます。
• 「Create Spreadsheet Row」のオプションにチェックを入れます。
• Google Sheetsのアカウントに接続します。
• Google Sheetsのスプレッドシートを選択します。
• Worksheet を選択します。
• 「Webhooks by Zapier」Trigger App と Google Sheets 間のすべてのフィールドをマッピングします。

• Google Sheets アプリをテストします。
• Zap を有効化します。
Zap Google Sheets -> Marketo

Zapier Dashboard から「Make a new Zap」ボタンをクリックします。
Zapier Trigger
• 「Webhooks by Zapier」Trigger アプリを選びます。
• 新規の行が追加された場合、またはスプレッドシートで修正された場合にトリガーする「Updated Spreadsheet Row」にチェックを入れます。
• Google アカウントに接続します。
• トリガー元となる必要のあるスプレッドシート(前回の Zap で使用したスプレッドシートと同一であるべき)とワークシートを選択します。
• 「Trigger Column」を「any_column」に設定します。
• Google Sheets アプリをテストします
Zapier Action
• 先ほど作成した App Marketo を選びます。(Beta で表示されます。)
• Marketo Action の「Create_Update Lead」を選択します。
• Marketo アカウントに接続し、認証パラメーターに入力します (Munchkin Account Id、Client Id、Client Secret)。
• 新規リードが配置される必要のある「Partition Name」 を最終的に入力します(パーティションが Marketo インスタンスに存在する場合のみ)。
• Marketo App をテストします。
• Zap を有効化します。
まとめ
以下が、Zapier 向け Marketoコネクタを改善するためのアイデアです。
• さまざまな Marketo オブジェクト(リスト、カスタム オブジェクトなど)に関連した他の Trigger または Action を追加する。
• Marketo からのフィールドをハードコードせずに、Marketo からのフィールドを動的に取得することが可能だが、それには Marketo とZapier 間の技術的な転換作業が必要となる 。
• コネクタを開発チームと共有して、最終的には一般的に利用可能にする。
活用事例の実施を極めて簡単にする、「Premium Marketo」アダプターを Zapier に搭載することが可能です。
いずれにせよ、本稿は Zapier のフリープランで Marketo を Zapier と統合することが可能であり、プレミアムアダプターがサポートしていないようなカスタムの活用事例を構築するためにも参考になると思います。
本稿をお楽しみいただけたら幸いです。Marketo と Zapierを利用してより一層の成功を収めるために、このブログが手助けになることを願っています。お読み下さいましてありがとうございました!