トラッキングページヘのアクセスごとに履歴を作成するには?
Synergy!LEAD ではトラッキングコードを貼り付けたページヘのアクセスは、リード/取引先責任者ごとに1つのキャンペーンメンバーとして登録されるため、複数回のアクセスがあった場合は最新のアクセス日のみが「発生日」として記録されます。
アクセスした回数はキャンペーンメンバーの「アクション数」で確認することができますが、たとえば先週と今週でどの時間にアクセスがあったかはわかりません。
今回は、ページアクセスごとにレコードを作成するApexトリガを用意して、キャンペーンメンバーとは別にアクセスごとにページアクセス履歴のレコードを登録する方法を説明します。
通常1レコード2KBの容量となります。したがって月間のべアクセス数が10,000の場合はそれだけで20Mバイトのストレージを消費することになります。
トラッキングページへのアクセスごとに履歴コードを作成するためには次の追加パッケージをログインしている組織にインストールします。
Synergy!LEAD ページアクセス パッケージ
https://login.salesforce.com/packaging/installPackage.apexp?p0=04t10000000Ikkl&newui=1
※ Salesforceにログイン後、以下のページにアクセスするとインストール開始画面が表示されます。
画面の指示に沿ってすすみインストールを完了します。
パッケージをインストールせず手動で トリガを作成する場合はこのあとに説明するカスタムオブジェクトとトリガを作成します。
パッケージをインストールすると、カスタムオブジェクト「ページアクセス」と トリガが作成されます。
以降はそれぞれ作成されるオブジェクトとトリガについて説明します。
カスタムオブジェクト「ページアクセス」
ページアクセスごとに作成するカスタムオブジェクトです。
標準項目の「名前(Name)」およびカスタム項目は以下なります。
| 項目の表示ラベル | 項目名 | データ型 | 説目 |
|---|---|---|---|
| no | Name | 自動採番({000000000}) | レコードの名前項目 |
| URL | URL | URL | アクセスされたURLアドレス |
| アクセス日 | date | 日付/時間 | アクセスされた日時 |
| リード | lead | 参照関係(リード) | アクセスのあったリード |
| 取引先責任者 | contatc | 参照関係(取引先責任者) | アクセスのあった取引先責任者 |
| キャンペーン | campaign | 参照関係(キャンペーン) | ページアクセスのキャンペーン |
※ 項目名、データ型以外は任意に指定・変更しても問題ありません。
パッケージをインストールすると自動的にこのカスタムオブジェクトが追加されます。
パッケージをインストールせず手動でトリガを作成する場合は上記の項目一覧を参考にしてカスタムオブジェクトを作成します。

トリガ
パッケージをインストールせず、手動でトリガを作成する場合は以下のコードをコピーして、キャンペーンメンバ オブジェクトのトリガを作成します。
パッケージをインストールする場合は自動的にトリガが追加されます。
trigger CampaignMemberUpdateCreatePageAccess on CampaignMember (after insert, after update) {
Set<Id> idlist = new Set<Id>();
for (CampaignMember c: Trigger.new) {idList.add(c.campaignid);}
List<Campaign> campaigns = [select id, type, name, SynergyLead__SourceUrl__c from campaign where id in :idlist];
Map<Id, Campaign> campainMap = new Map<Id, Campaign>(campaigns);
List<PageAccess__c> plist = new List<PageAccess__c>();
for(CampaignMember o : Trigger.new) {
if (trigger.isUpdate && trigger.oldMap.get(o.id).SynergyLead__BehaviorDateTime__c ==
trigger.newMap.get(o.id).SynergyLead__BehaviorDateTime__c
) {continue;}
Campaign c = campainMap.get(o.CampaignId);
if (c == null) {continue; }
if(c.type == 'ページアクセス') {
PageAccess__c p = new PageAccess__c();
p.url__c = c.SynergyLead__SourceUrl__c;
p.date__c = o.SynergyLead__BehaviorDateTime__c ;
if (o.leadid != null) {
p.lead__c = Id.valueOf(o.leadid);
}
if (o.contactid!= null) {
p.contact__c = Id.valueOf(o.contactid);
}
p.campaign__c = c.id;
plist.add(p);
}
}
insert plist;
}
次のコードはトリガのテストクラスです。
@IsTest
public with sharing class CampaignMemberUpdateCreatePageAccessTest {
static Campaign getTestCampaign(URL url) {
Campaign c = new Campaign( Name = 'Test Campaign', type= 'ページアクセス', SynergyLead__SourceUrl__c =url.toExternalForm());
return c;
}
static URL getTestUrl() {
URL url = new URL('http://dummy.dummy.dymmy?dumuuy=dummy&dummy2=dummy2#dummy');
return url;
}
static Account getTestAccount() {
Account a = new Account( name = 'Test Account');
return a;
}
static Contact getTestContact(Account a) {
Contact ct = new Contact( accountid = a.id, lastname = 'Test Contact');
return ct;
}
static Lead getTestLead() {
Lead l = new Lead( lastname = 'Test Lead', Company = 'Test Company');
return l;
}
static testmethod void testCampaignMemberTriggerCreatePageAccessViaDML()
{
Url url = getTestUrl();
Campaign c = getTestCampaign(url);
insert c;
Lead l = getTestLead();
insert l;
System.assertNotEquals(l.id, null);
DateTime bevaviorDate = DateTime.now();
CampaignMember testCampaignMember = new CampaignMember( CampaignId =
c.id, leadid = l.id, SynergyLead__BehaviorDateTime__c=bevaviorDate);
test.startTest();
insert testCampaignMember;
test.stopTest();
testCampaignMember = [select Id from CampaignMember where Id = :testCampaignMember.Id];
System.assertEquals(testCampaignMember.Id, testCampaignMember.Id);
PageAccess__c pa = [select id,url__c,date__c,campaign__c,lead__c from PageAccess__c];
System.assertEquals(pa.campaign__c, c.id);
System.assertEquals(pa.lead__c, l.id);
System.assertEquals(pa.date__c, bevaviorDate);
System.assertEquals(pa.url__c, getTestUrl().toExternalForm());
}
static testmethod void testCampaignMemberTriggerCreatePageAccessViaDML2()
{
Url url = getTestUrl();
Campaign c = getTestCampaign(url);
insert c;
Account a = getTestAccount();
insert a;
Contact ct = getTestContact(a);
insert ct;
System.assertNotEquals(c.id, null);
DateTime bevaviorDate = DateTime.now();
CampaignMember testCampaignMember = new CampaignMember( CampaignId =
c.id, contactid= ct.id, SynergyLead__BehaviorDateTime__c=bevaviorDate);
test.startTest();
insert testCampaignMember;
test.stopTest();
testCampaignMember = [select Id from CampaignMember where Id = :testCampaignMember.Id];
System.assertEquals(testCampaignMember.Id, testCampaignMember.Id);
PageAccess__c pa = [select id,url__c,date__c,campaign__c,contact__c from PageAccess__c];
System.assertEquals(pa.campaign__c, c.id);
System.assertEquals(pa.contact__c, ct.id);
System.assertEquals(pa.date__c, bevaviorDate);
System.assertEquals(pa.url__c, url.toExternalForm());
}
static testmethod void testCampaignMemberTriggerCreatePageAccessViaDML3()
{
Url url = getTestUrl();
Campaign c = getTestCampaign(url);
c.type = 'フォーム登録';
insert c;
Account a = getTestAccount();
insert a;
Contact ct = getTestContact(a);
insert ct;
System.assertNotEquals(c.id, null);
DateTime bevaviorDate = DateTime.now();
CampaignMember testCampaignMember = new CampaignMember( CampaignId =
c.id, contactid= ct.id, SynergyLead__BehaviorDateTime__c=bevaviorDate);
test.startTest();
insert testCampaignMember;
test.stopTest();
testCampaignMember = [select Id from CampaignMember where Id = :testCampaignMember.Id];
System.assertEquals(testCampaignMember.Id, testCampaignMember.Id);
Integer cnt = [select count() from PageAccess__c];
System.assertEquals(0, cnt);
}
static testmethod void testCampaignMemberTriggerUpdatePageAccessViaDML()
{
Url url = getTestUrl();
Campaign c = getTestCampaign(url);
insert c;
Lead l = getTestLead();
insert l;
System.assertNotEquals(l.id, null);
DateTime bevaviorDate = DateTime.now().addDays(-1);
CampaignMember testCampaignMember = new CampaignMember( CampaignId =
c.id, leadid = l.id, SynergyLead__BehaviorDateTime__c=bevaviorDate);
insert testCampaignMember;
DateTime bevaviorDateUpdate = bevaviorDate.addDays(1);
testCampaignMember.SynergyLead__BehaviorDateTime__c=bevaviorDateUpdate;
test.startTest();
update testCampaignMember;
test.stopTest();
testCampaignMember = [select Id from CampaignMember where Id = :testCampaignMember.Id];
System.assertEquals(testCampaignMember.Id, testCampaignMember.Id);
Integer cnt = [select count() from PageAccess__c];
System.assertEquals(2, cnt);
List <PageAccess__c> palist = [select id,url__c,date__c,campaign__c,lead__c from PageAccess__c order by date__c];
System.assertEquals(palist.get(0).campaign__c, c.id);
System.assertEquals(palist.get(0).lead__c, l.id);
System.assertEquals(palist.get(0).date__c, bevaviorDate);
System.assertEquals(palist.get(0).url__c, getTestUrl().toExternalForm());
System.assertEquals(palist.get(1).campaign__c, c.id);
System.assertEquals(palist.get(1).lead__c, l.id);
System.assertEquals(palist.get(1).date__c, bevaviorDateUpdate);
System.assertEquals(palist.get(1).url__c, getTestUrl().toExternalForm());
}
}
ページアクセスのレポート
パッケージをインストールするか手動でカスタムオブジェクト・トリガを作成すると、Synergy!LEADのトラッキングコード貼り付け先ページにアクセスがあるたびにページアクセスのレコードが作成されます。
これは既存のキャンペーンメンバー(ページアクセス)とは別に作成されます。
作成されたレコードを対象にレポートを作成(レポートタイプ:ページアクセス)することでリード/取引先責任者のURLアクセスが時系列で確認することができます。

これは、同期処理によってのみキャンペーンメンバが作成・更新され、そのタイミングでトリガによりページアクセスレコードも作成されるためです。
