dely Tech Blog

クラシル・TRILLを運営するdely株式会社の開発ブログです

カスタムネイティブフォーマットを使って広告接触ユーザーを特定する

こんにちは。Kurashiru Androidエンジニアのもとはしです。

最近は暖かくなってきましたね。なんなら暑い。そろそろ半袖を着始めてもいいかもしれません。

さて、今回はタイトル通りGoogle Ad Managerより提供されているカスタムネイティブフォーマットを使って、広告接触ユーザーを特定する方法をご紹介しようと思います。

背景

Kurashiruでは食品メーカーを中心とするクライアントさんを多数抱えており、アプリ内に純広告としてクライアントさんの広告を配信することがあります。

リターゲティングや広告効果計測を行うため、それらの純広告への接触ユーザーを特定する仕組みを社内で用意していましたが、今回ビジネスサイドよりもっと正確に接触ユーザーを特定したいとの要望がありました。

そこで、何か使えそうな機能がないか調査してみたところカスタムネイティブフォーマットを使えば実現できそうだということが分かったのです。

実際にやってみる

下準備

カスタムネイティブフォーマットは、主に純広告を配信する際に通常のネイティブ広告に含まれる情報(headline / body / クリエイティブ情報など)とは別に表示情報を付加したい場合に有用となります。

主な用途は表示情報のカスタムになるわけですが、表示に関係ない情報を含めることも可能です。

例として、キャンペーン名を設定できるようにしてみます。

フォーマット作成後、IDが振られます。これは後ほどアプリ内の実装にて使用します。

そしてこのフォーマットを使い申込情報を作成します。

カスタムフォーマットを使用すると、クリエイティブ作成時にユーザー定義の変数という項目が表示されます。 フォーマット作成時に設定したcampaign_nameが表示されているので、そこに適当な値を設定します。

アプリの実装

ネイティブ広告のロード時はforNativeAdを使用しますが、カスタムネイティブフォーマットの場合はforCustomFormatAdを使います。

AdLoader.Builder(context, adUnitId)
    .forNativeAd { ad ->
        ~~~~
    }
    .forCustomFormatAd(
        customFormatId,
        { customFormatAd ->
            ~~~~              
        },
        null
    ).build()

このメソッドの第一引数に先ほどのフォーマットIDを指定することでカスタムネイティブ広告を取得できるようになります。

取得できた広告に対して、getString("campaign_name")とすると申込情報作成時に指定したキャンペーン名が取得できます。

customFormatAd.getString("campaign_name") // テストキャンペーン

あとはview imp / clickに応じて接触ユーザーのIDと一緒に、キャンペーン名をパラメータに入れてFirebase Analyticsなどのアナリティクスツールにイベントを飛ばしてあげるだけです。

adView.setOnImpressionListener {
    sendAdImpEvent(userId, campaignName)
}
adView.setOnClickListener {
    sendAdClickEvent(userId, campaignName)
}

アナリティクスツールに送るの?と思った方もいるかもしれません。

本来は管理画面上でデータを確認したいところですが、我々は現時点でその方法は見つけられていません…。もし他の方法をご存知の方いましたらぜひコメント等で教えてくださると助かります🙏

カスタムネイティブフォーマットの実装時の注意点

さて、ここからは実装時の注意点をいくつか残しておこうと思います。詳細についてはドキュメントが詳しいのでこちらをご参照ください。

headline / body等の表示について

headlineやbodyといった通常のネイティブ広告で返ってくる値もフォーマット上で指定しない限り、アプリ側で受け取ることができません。

先ほどは例示用としてキャンペーン名のみフォーマット上で指定しましたが、本来はheadlineやbodyも指定して受け取れるようにする必要があります。

customFormatAd.getText("headline")
customFormatAd.getText("body")

クリエイティブの表示について

クリエイティブの表示方法も通常のネイティブ広告と差異があります。

まず、広告クリエイティブが動画なのか以下のように判定する必要があります。

if (mediaContent != null && mediaContent.hasVideoContent())

動画の場合は通常のネイティブ広告と同様にMediaView.mediaContentにmediaContentを紐づけるだけですが、静止画の場合は静止画表示用のImageViewを置いてsetImageDrawableを呼び出します。

if (mediaContent != null && mediaContent.hasVideoContent()) {
    layout.media.mediaContent = customFormatAd.mediaContent
} else {
    layout.image.setImageDrawable(customFormatAd.getImage("creative")?.drawable)
}

imp / clickの集計について

カスタムネイティブの場合imp / clickは自動で集計されないため、自分でimp / click処理を呼び出さないといけません。

impにはrecordImpression / clickにはperformClickが使用できます。

// imp
customFormatAd.recordImpression()
// click
customFormatAd.performClick("view_name")

performClickにはどのview経由で広告がクリックされたかを含めることができます。

自前でclickイベントを送ってはいるので、あくまで管理画面でも数値を確認できるようにするためという意味合いが強いです。不要であれば実装は省いてもよさそうではありますね。

終わりに

カスタムネイティブフォーマットを使って広告接触ユーザーを特定する方法をご紹介しました。

広告接触ユーザーの特定には色々な方法があるかと思いますが、Google Ad Managerを使用した事例はなかったので参考になると幸いです。

https://careers.dely.jp/careers.dely.jp