
Sitecore GeoIPを使用したパーソナライズ
1 はじめに
競争が激化する今日の市場において、Webサイトにて顧客とのエンゲージメントを促進し、関係を築くことが重要視されてきています。そのためWebサイトの機能において、顧客の行動履歴などからコンテンツを出し分けるようなエクスペリエンスを提供するパーソナライズの機能は、もはやアドオン機能ではなく、 「必須の機能」となってきています。
また、Webサイト閲覧者の大半(97~98%)はサイトにユーザー登録をした訪問者ではなく、匿名の訪問者と言われています。パーソナライズ機能を使用し、匿名の訪問データを利用することで、何千もの人口統計、心理、行動ベースのセグメントを利用して体験をカスタマイズすることができ、潜在的に逃した機会を利用することができます。
なお、Monetate.comによると、Webサイトにてパーソナライズした場合に売り上げが平均19%増加したといわれています。
Sitecoreではさまざまなパーソナライズの機能が存在しますが、本コラムではその中でもよくある要件の一つとして「サイト訪問者の所在地」に応じてコンテンツを出し分ける「GeoIP を使用したパーソナライズ」について紹介するとともに、実装上で課題となった点に対しての解決方法も紹介します。訪問者の所在地にあわせて表示するキャンペーンや通貨を変更するなどのケースに使用可能です。
(※執筆協力(敬称略):NTT Data Global Delivery Services Pvt. Ltd. (Pune) Arpit Katiyar)
2 GeoIPを使用したパーソナライズについて
GeoIPは、サイト訪問者の現在位置を取得し、それを使用して地域に関するさまざまなパーソナライズを設定し、コンテンツの出し分けをするインプットとなる情報を提供するサービスです。
GeoIPを使用して、次のことが実施可能となります。
- 位置情報を使用したパーソナライズコンテンツの出し分け
- Sitecoreアナリティクスで設定したゴールとページイベントの管理
- 取得した位置情報を元に顧客エンゲージメントで設定した条件に合致した人にメール送信
- メール送信対象のリストを地理的にフィルターすることが可能
- SitecoreMAの機能であるジオロケーションのレポートを確認することが可能
- SitecoreMAの機能であるエクスペリエンスプロファイルでユーザーの位置情報が確認可能
例えば、あなたのブランドがニューヨークにある実店舗でブーツの1日限定セールをしていると想像してみてください。現在ニューヨークにいる個人をターゲットとするセグメントを作成し、そのセグメントに含まれる顧客に、セール情報を強調し、店舗に立ち寄るよう促すプッシュ通知を送信する。などのことが実現できます。
3 実装上で発生した課題と対策
Sitecoreは、訪問者に関するIPアドレスと位置情報を取得するGeoIPを提供します。Sitecoreが提供するGeoIP情報には、訪問者に関する以下の情報が含まれています。
- 住所(国、地域、州、市区町村、郵便番号等)
- IPアドレス、DNSアドレス、ISP名
- タイムゾーン、経度、緯度
上記の情報を使用して、訪問者の場所に基づいてさまざまなコンテンツを表示する条件付きレンダリングを実施したパーソナライズが実現できます。しかし、SitecoreのGeoIPを使用して実装したところ、下記の課題が発生しました。
3.1 課題
- SitecoreIP位置情報サービスは非同期に実行されるため、位置情報が取得される前にページがロードされてしまうことがあった。この場合、位置情報のパーソライズ機能により表示されるコンテンツが合致しない。
- SitecoreIP位置情報サービスの結果を待ってページをロードする場合、表示されるコンテンツは位置情報のパーソナライズが効くが、ページロードまでに時間がかかってしまう。
3.2 解決策
上記の問題を解決するために、SitecoreとMaxmindを組み合わせて使用しました。 MaxMindは、マサチューセッツ州を拠点とするデジタルマッピング会社であり、IPアドレスの位置データを提供しています。 以下の手順に従って、このソリューションを実装しました。
- 最初のリクエストは、SitecoreのLookUpサービスとMaxmindサービスの両方に送信します。 これは、SitecoreがMaxmindほど高速にGeoIPデータを提供しないためです。 Maxmindは高速に位置情報を取得可能なため、位置情報を取得後にページをロードするという同期処理が可能です。そこで、最初のリクエストのためにMaxmindからGeoIPデータを取得し、他のマーケティング情報とともにxDBに保存します。 Maxmindから取得したGeoIP情報に基づいてパーソナライズされたコンテンツごとにユーザーに表示します。
- 2回目以降のリクエストでは、GeoIP情報をxDBから取得し、この情報に基づいてパーソナライズされたコンテンツごとにユーザーに表示します。
図1:SitecoreとMaxmindを組み合わせたソリューション
次に、この実装のプロセスについて説明します。
① Maxmindにアカウントを作成します。https://www.maxmind.com/en/geolite2/signup
② アカウントが起動したら、https://www.maxmind.com/en/accounts/362463/geoip/downloads にアクセスし、必要に応じてデータベースをダウンロードできます。
図2:Maxmindのダウンロード画面
③ ダウンロードが完了したら、ファイルを解凍し、「GeoLite 2-Country.mmdb」ファイルをプロジェクトにコピーします。
④ 以下は、訪問者のIPアドレスをもとにMaxmindデータベースから国を取得するコードサンプルです。
public class GetLocation { private ILog log = LogManager.GetLogger("Geo-IP"); private static GetLocation _user; public static System.Net.IPAddress ip; public static GetLocation User => _user ?? (_user = new GetLocation()); private static IPAddress GetIpAddressFromTracker() { //True-Client-IP -> if you have AKAMAI in-place. string remoteAddr = HttpContext.Current.Request.Headers["True-Client-IP"]; if (string.IsNullOrEmpty(remoteAddr)) { string forwardedFor = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (!string.IsNullOrEmpty(forwardedFor)) { remoteAddr = forwardedFor.Split(',').Select(s => s.Trim()).First(); } else { return new IPAddress(Tracker.Current.Interaction.Ip); } } try { IPAddress Address; if (!string.IsNullOrEmpty(remoteAddr) && IPAddress.TryParse(remoteAddr, out Address)) { return Address; } return null; } catch { return new IPAddress(Tracker.Current.Interaction.Ip); } } private static string GetCountryFromMaxMind(IPAddress ipAddress) { var db = new DatabaseReader(HttpContext.Current.Server.MapPath("/App_data/GeoLite2-Country.mmdb"), FileAccessMode.Memory); MaxMind.GeoIP2.Responses.CountryResponse response; return db.TryCountry(ipAddress, out response) ? response.Country.Name : string.Empty; } private static string GetCountryCode(string country) { var regions = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(x => new RegionInfo(x.LCID)); return (regions.FirstOrDefault(region => region.EnglishName.ToLower().Contains((country.ToLower())))).TwoLetterISORegionName; } public Ip GetIpSettings() { var ipsettings = new Ip(); IPAddress ipAddress; ipAddress = GetIpAddressFromTracker(); ipsettings.IpAddress = Lookup.Address.Tracker; if (ipAddress != null && string.IsNullOrEmpty(ipsettings.Country)) { ipsettings.LookupService = Lookup.Service.MaxMindGeoIp2; ipsettings.Country = GetCountryFromMaxMind(ipAddress); } if (ipAddress != null && !string.IsNullOrEmpty(ipsettings.Country)) { ipsettings.CountryCode = GetCountryCode(ipsettings.Country).ToUpper(); } return ipsettings; } } public class Ip { public string CountryCode { get; set; } public string Country { get; set; } public Lookup.Address IpAddress { get; set; } public Lookup.Service LookupService { get; set; } } public class Lookup { public enum Service { SitecoreGeoIp,MaxMindGeoIp2 } public enum Address { Tracker,QueryString,Empty } }
⑤ これが完了したら、上記の関数を使用して、必要に応じて国名または国コードを取得できます。例えば、下記のようになります。
var countryobj = GetLocation.User.GetIpSettings(); string country_code = countryobj.CountryCode;
実装方法の紹介は以上となります。是非これを参考にGeoIPを使用したパーソナライゼーションを実施いただけると幸いです。