📺

AppLovinとKARTEを用いた ナーチャリング動画配信システムの実装について

2024/09/18に公開

こんにちは!こんばんは!
dely株式会社にてクラシルリワードアプリの開発を行っている、iOSエンジニアのtakkyです!

この記事では、『After iOSDC LT Night 〜CA.Swift#21』にて登壇した際にお話しした「AppLovinとKARTEを用いた ナーチャリング動画配信システムの実装」についての記事です!

概要

クラシルリワードではアプリ内で動画広告を視聴する機能を提供しています。
再生される動画広告は、AdNetworkから取得しており、表示される動画広告は基本的にランダムなコンテンツが再生されます。
今回は、ユーザに応じて配信する動画広告を分けることで、「弊社の売上の観点で効果がより良く出るのでは?」という仮説のもと今回説明する実装を行うことになりました。
その施作を行うに至った背景や実装の流れについて解説していきます!

(一応)自己紹介

画像

私は、2021年に新卒で信託銀行に入社し営業マンとして働いていて、2024年の4月に入社したdelyはエンジニアとしては2社目になります!
今回説明する機能等についても全くドメイン知識が無い状態から、機能開発したので私自身のバックグラウンドも少しだけみていただければ嬉しいです!🙌🙌

基本情報と施策の背景

上記でも触れたように、クラシルリワードでは動画広告を視聴できる機能を提供しています。
以下のような機能です。

画像1

チームで目指すこと

私が所属するアフィリエイトスクラムチームでは、さまざまなアフィリエイト案件を扱っており、アフィリエイト案件をユーザーに実施していただくための機能実装を行うことが多いです。
そんなチームにて、以下のような3つの観点がありました。

  • 金融アフィリエイト案件を当社で実施することのメリットをユーザーに訴求したい
  • 動画広告の方がWebページや文字・画像よりも訴求力が強いはずなので、案件を動画で宣伝できるようにもしたい
  • 弊社で指定した特定のセグメントに属するユーザーに対してピンポイントに動画広告を出しわけしたい

この3つの「自社広告(自社で出稿する広告)を特定のユーザーに配信する仕組みが欲しい」という考えに至り実装することとなりました。

画像2

個人的な状況

自身はこちらの実装を行うつい1ヶ月前に入社したばかりかつ、広告周りの実装も行ったことがないので、ドメイン知識が全くないような状況で、以下のような不安がありました。

画像3
そのため、SDK周りをどのように組み合わせるかも考えながら実装する必要がありました。

技術的アプローチ

今回実装を実現するための機能としては 「ユーザーに応じて動画配信を出しわけするためのシステム」「セグメントの情報を動的に変更するためのシステム」 の2つが必要になります。
前者に関しては、AppLovinという「広告のマネタイズとユーザー獲得を支援するプラットフォーム」がすでにアプリ内で利用されているため、こちらを使用することとしました。

後者に関してはFirebaseのRemote ConfigとKARTEというアプリのリリースを行うことなく動的に配信値を管理画面で変更して、アプリ内で表示するコンテンツを変更できる機能を提供しているサービスが考えられ、すでにクラシルリワードアプリで両方とも利用しています。
Remote ConfigとKARTEのどちらを利用するかを比較する際には、「セグメントに応じて配信値を出し分ける機能として優れている方はどちらか」 という観点でKarteを使用することとしました。

Remote Configでも一定のセグメントを分けて値を配信することもできますが、KARTEでは弊社のDBにあるユーザーの情報を参照してより細かいセグメントを設定して、配信が可能であることが魅力的で設定方法についてもかなり分かりやすい仕様です。(もちろんRemote Configも十分使い勝手いいです!!)
また、機能実装後に運用してくれるマーケティングチームがKARTEを使い慣れているということも魅力的でした!

画像4

結論として今回は、「ユーザーに応じて動画配信を出しわけするためのシステム」を実現するサービスにはAppLovinを利用し、「セグメントの情報を動的に変更するためのシステム」を実現するサービスにはKARTEを利用することとなりました!

アプリ内の流れ

利用するサービスは決まったので、クラシルリワードアプリを含めてどのようなフローで動画広告を出しわけするかをポイントを抑えつつ確認してみましょう!
ポイントとしては以下の3つです。

  • クラシルリワードアプリの起動時にKARTEの管理画面で設定した配信値を取得する
  • KARTEから取得した配信値をAppLovinの広告SDK初期化時にkeywordとしてアタッチする
  • (特定のセグメントに割り振られたユーザーの場合、)動画広告視聴時にこちらが指定した自社広告を再生するためのレスポンスを取得する

画像5

アプリ内では、上記のような流れでデータを扱いセグメントに応じて動画広告を出し分けます。

実装着手

ではここからは実際に手を動かしながら、どのように繋ぎ込んで、実装するかを確認してみます。

KARTE

管理画面

まず管理画面で、アプリで特定の文言を取得できるような実装を行なっておきます。
管理画面の接客サービスという機能から、新たな配信値を作成して、JSONとこの新たな配信値を取得するためのKEYを設定してあげます。

画像6

上記のように設定して、公開をすれば全てのユーザーがこちらの値を取得できるようになります。
追加で、セグメントの設定をしてあげます。

画像7

配信を絞るためのセグメントを作成してあげて、上記のように配信値をセグメントに該当するユーザーにしか配信しないように設定します。
(※セグメントを設定するための紐付けテーブルの設定等の説明は割愛します。詳しくはこちらから)

この一連の操作でKARTEの管理画面側で行うべきことは全て終了しました!

実装側

アプリ内では、AppLovinのSDK初期化時にアタッチするために、Karteで配信している値をJSONで取得する処理を実装します。

AppLovin

実装側

まず、AppLovinの広告SDKの初期化を行う際に、先ほど取得した文字列を初期化時に利用します。

画像9

例の処理ですが、上記のようにSDK初期化時に必要になる、ALSdkInitializationConfigurationのクロージャ引数であるALSdkInitializationConfigurationBuilderALTargetingDatakeywordsというパラメータがあるので、こちらに値を代入してあげます。
上記の画像の引数にある targetingAdsIdに値が存在する時=アプリ起動したユーザーが特定のセグメントに該当した時keywordsに値が代入されるように実装します。
アプリ上では、セグメント配信周りの実装はこちらで完了です!
(※動画広告の取得と再生周りの実装に関しては、割愛させていただきます🙏)

管理画面

最後にAppLovin側の管理画面で、動画広告をセグメントに応じて配信できる仕組みを作成します。
管理画面を開いて、Direct Soldという箇所を選択し、『+Create Campaign』という文言の背景が緑色のボタンをタップし以下のようにキャンペーン設定します。

画像10

キャンペーン設定後『Targeting』という次の画面に進み、最下部にあるKeyword TargetingというセクションをEnableに変更し、以下の添付のようなフォーマットで文字列を設定します。

画像11

targeting_idは辞書型のKeyの部分に該当し、ca_swift_targeting_campaignは辞書型のValueに該当するように設定をします。

targetingDataBuilder.keywords = ["targeting_id:\(targetingAdsId)"]

実装確認

これで実装自体は完了で、動画広告をユーザーに応じて出し分けできるようになりました!
以下のようにアプリでユーザーに応じて動画広告を出し分けできているかを確認して無事に動くことも確認できました!👏👏

画像12

無事機能もリリースすることができ、安定的に運用することもできたので、めでたしめでたし!!

しかし....

2024年7~8月ごろに出た情報から、keywordによるセグメント配信は非推奨になり、新たな仕様が追加されこちらに移行しなければならないことが判明しました...💦

画像13

画像14

今後はこちらの運用方法で運用できるように実装しなればならないようになりました。😢

導入後の結果とまとめ

今回説明した機能の導入後の振り返りについて、チームと個人の観点から解説します!

チームとしての総括

ひとまず当初の目標通り、必要とされる機能自体はリリースできました!
実装後に安定運用ができてきたので、PMにこの施作の結果と目標達成について確認してみました!

  • 狙い通り、これまで取り込めていなかったセグメントに属するユーザーに対してリーチできるようになり、案件の獲得にもつながっている
  • 動画広告を視聴してその場で画面タップして移動する「直接的な効果」だけでなく、一度動画を視聴してその後に別経路から案件を獲得できる 「間接的な効果」 も期待できてきた
  • 当初は金融案件のような大型の獲得が難しめの案件のみでこの機能を利用する予定であったが、ライトな案件での運用でも拡張してできている
  • ユーザーにまだ浸透し切っていないアプリ内の機能の紹介についても動画で訴求することで、利用率が動画配信後から向上した

などなどいろんなポジティブな影響が見て取れました!

個人的な振り返り

個人的な課題としてあった、ドメイン知識が浅い状態での実装に不安がありましたが、この機能を実装する際に理解の浅い箇所については丁寧にコードやドキュメントを確認したり、チームメンバーに確認することで、乗り越えることができました。
その後も知識の浅い部分の実装に関しては、この機能実装を行った際の動きにそうような形で再現性のある実装の流れを掴めました!

もう少しで入社半年になるので、振り返りの意味でもドメイン知識が無い状態での実装について振り返りの記事についても書いてみたいと考えています!

かなり長い記事になりましたが、読んでいただきありがとうございます!!
言語化や登壇で発表するとさらに理解度が上がる気がしたので、今回の登壇とブログ投稿とてもいい経験いなりました!

参考資料

https://karte.io/

https://support.karte.io/post/4V76PyeflvwR4fCQPhjFqa

https://www.applovin.com/ja/max/

https://firebase.google.com/docs/remote-config?hl=ja

https://developers.applovin.com/en/max/reporting-apis/direct-sold-api

https://developers.applovin.com/en/max/advanced-features/direct-sold

https://developers.applovin.com/en/max/ios/overview/new-sdk-initialization-api

https://cyberagent.connpass.com/event/327146/

dely Tech Blog

Discussion