GA4もSnowflakeで分析する時代がついに来たぞ!

前田 健太郎

前田 健太郎

#Snowflake

2024年1月29日、GA4とSnowflakeの公式コネクタがリリース(プレビュー)されました。
ついに、GA4もSnowflakeで分析する時代がやってきました。
GA4×Snowflakeの組み合わせがやっとプロダクション運用可能なレベルに到達したのです。

これは今回のコネクタリリースでGA4のプロパティ取り込みパイプラインの運用コストが圧倒的に下がったことに起因します。
公式コネクタのリリース以前からGA4をSnowflakeに取り込むことは可能でしたが、その運用を継続することは様々な観点から困難でした

この記事では、従来の取り込みソリューションと、最新の公式コネクタを比較して4つの観点から素晴らしい部分を解説します。

  1. GA4のデータの取り込みが容易になった
  2. 取り込み後のデータの冗長な変換が不要になった
  3. 取り込みの金銭的コストが圧倒的に低くなった
  4. GA4のデータ取り込みに公式サポートがつくようになった

また、プレビュー時点でのコネクタの仕様と、見落としやすい制限に関しても記載しました。

1.データの取り込みが容易に

GA4の情報をSnowflakeに保存するまでの手順が簡単になりました。
Snowflake内部でGUIのウィザードに沿って情報を入力するだけで連携が完了します。

これまで

Pythonなどで取り込みスクリプトを書くか、FiveTranやAirbyteなどのSaasを使う必要がありました。前者はインフラストラクチャや失敗の管理が面倒で、後者も認証情報の管理が難しく、支払先も複数になるなどのデメリットがありました。

これから

GA4コネクタによって、ユーザーは取り込みスクリプトとそのインフラストラクチャを管理する必要はなくなりました。認証はSnowflake内部で完結し、外部Saasに料金を支払う必要もなくなりました。GA4コネクタはSnowflake内部で動き、取り込みの際に使用した仮想ウェアハウスの分だけ料金が発生します。金額については後述します。

2.冗長な変換が不要に

GA4の情報をSnowflakeで分析可能な状態にすることが簡単になりました。
手動での半構造化データのパースが不要に。

これまで

取り込んだ巨大な半構造化データを手動でパースする必要がありました。dbtなどを使っても、このパースは非常に面倒な作業でした。

これから

最初からパース済みの表データを取得できます。GA4コネクタが作成するView定義内でパースが行われています。もちろんVARIANTをパースしていないRAWデータもテーブルとして入手可能です。


↑コネクタでフルマネージドに取り込んだRAWデータテーブル

↑コネクタによって作成されたViewでパースされたRAWデータ

Viewのカラム定義を見ると、イベント名、デバイス名、ユーザープロパティ、市区町村レベルの位置情報など必要な情報が全て抽出されています。

文末に、このビューの全てのカラム名を添付しました。どの程度プロパティが網羅されているかを確認してみてください。十分に分析に必要なカラムが網羅されていることがわかるはずです。

今後このビューなどを詳しく掘り下げた記事も出す予定なので、良ければXのフォローもお願いします😊
https://twitter.com/rakudeji

3.金銭的コストが圧倒的に低くなった

GA4の情報をSnowflakeで非常に安く取り込めるようになりました。
比較したFivetranがちょっとお高いのかもしれないですが…最大99.94%オフになります。

これまで

外部Saasを用いてデータを取り込むと高額な料金が発生していました。
例えば、Fivetranで月間約2300万行を取り込むと4157ドルかかるとのこと。初回同期(initial sync)は無料ですが、サービスを運用していくならばいつかはお金を支払うことになるでしょう。


※まだFivetranをちゃんと使ったことがないので、もしPricingの見方が間違いでしたらご指摘ください🙇‍♂

これから

GA4コネクタの自体の使用料金は無料で、支払いはSnowflakeタスクのコンピューティングコストだけです
GA4コネクタはユーザー定義の仮想ウェアハウスを使って、定期的に同期を行います。
あくまで目安ですが、XSサイズのウェアハウスが60分ごとに約2400万イベントのデータが取り込めました。
つまり、約2400万イベントごとに2.75ドルぐらいです。安すぎないか。

4.公式サポートという安心感

第三者を挟まないため、パイプライン維持コストと依存のリスクが下がりました。

これまで

GA4,ETL Saas、Snowflake、3社の仕様変更にユーザーが対応しなければなりませんでした。
例えば最近では、AirbyteがNormalizationをしない方針になったりしていました。(ETLではなく、ELT前提の方針になりました。)

これから

SnowflakeがGA4をサポートしたことで、仕様変更の要因が2社になりました。
今後Snowflake自体の仕様変更は自動的に対応され、GA4の仕様変更も多くはSnowflakeが吸収すると思われます。これによって、パイプライン維持コストも大幅に削減されます。

GA4コネクタの仕様の要点

初めてSnowflakeを触る場合はGA4コネクタが

  • トライアルアカウントではサポートされない、つまり新規作成後30日以内のアカウントでは試せないこと
  • GCPのリージョンでSnowflakeアカウントを作成すると試せないこと
    に特に注意してください。

現在GA4コネクタで取り込み可能なデータは以下の2種類です。

  • 全イベントの生データ
  • イベント集計後のレポートデータ

プレビュー中の仕様

  • 生データの取り込みはAWSのアカウントで利用可能
  • レポートデータの取り込みはAWS,Azureで利用可能
  • GCPのサービスアカウント作成が必要
  • 生データはBigQueryを介して取り込まれる
  • BigQueryのデータが存在するリージョンによっては転送料金がかかります
  • 標準では8時間に一回同期が行われます。最小で15分まで間隔を縮めることができます。

注意

  • Snowflakeアカウントごとにコネクタのインスタンスを1つだけインストールできます。
  • 現状は1つのコネクタごとに1つのサービスアカウントが紐付可能です。
  • 複数のWEBサイト(GA4プロパティ)のデータを取り込むことは可能です。
  • ユニバーサル アナリティクスはサポートされていません
  • BigQueryにGA4のデータが同期されるまでに24時間近くかかるので焦らないことが大事です。BigQueryに載った後は、15分~8時間間隔で同期を行う事ができます。

GA4コネクタの動作を理解するには、Snowflake Native Apps Frameworkを知ると早いです。
ちょうど1/30にSnowflake Native Apps FrameworkがGAしたので、技術的興味がある方に向けてSnowflake Native Apps Frameworkの解説記事も書く予定です。

まとめ

GA4との連携がBigQueryを使っている理由ということはよくあります。
これからAWSやAzureとより深く連携できる、Snowflakeへの移行が進むかもしれませんね。
2024年はSnowflakeの年になるかもしれません❄️

今回の記事は公式ドキュメントをもとにまとめました。

PR

RAKUDEJI株式会社では、データ基盤構築支援のお仕事を受付中です!

  • SnowflakeでのGA4分析のPoC支援(前述のトライアルアカウントの問題を回避します)
  • GA4やFacebook,Google広告データの取り込み
  • その他、AWSやAzureと連携した各種データエンジニアリング

を幅広く承っております。 ぜひX(Twitter)のDMか、フォーム からご相談ください。サービス内容などはLinkedInに記載しております!
https://www.linkedin.com/feed/update/urn:li:activity:7158291653470916608/

参考資料

GA4コネクタのViewのカラム全定義

nametype
EVENT_DATEDATE
EVENT_TIMESTAMPTIMESTAMP_NTZ(6)
EVENT_NAMEVARCHAR(16777216)
EVENT_PARAMSVARIANT
EVENT_PREVIOUS_TIMESTAMPTIMESTAMP_NTZ(6)
EVENT_VALUE_IN_USDFLOAT
EVENT_BUNDLE_SEQUENCE_IDNUMBER(38,0)
EVENT_SERVER_TIMESTAMP_OFFSETNUMBER(38,0)
USER_IDVARCHAR(16777216)
USER_PSEUDO_IDVARCHAR(16777216)
PRIVACY_INFO_ANALYTICS_STORAGEVARCHAR(16777216)
PRIVACY_INFO_ADS_STORAGEVARCHAR(16777216)
PRIVACY_INFO_USES_TRANSIENT_TOKENVARCHAR(16777216)
USER_PROPERTIESVARIANT
USER_FIRST_TOUCH_TIMESTAMPTIMESTAMP_NTZ(6)
USER_LTV_REVENUEFLOAT
USER_LTV_CURRENCYVARCHAR(16777216)
DEVICE_CATEGORYVARCHAR(16777216)
DEVICE_MOBILE_BRAND_NAMEVARCHAR(16777216)
DEVICE_MOBILE_MODEL_NAMEVARCHAR(16777216)
DEVICE_MOBILE_MARKETING_NAMEVARCHAR(16777216)
DEVICE_MOBILE_OS_HARDWARE_MODELVARCHAR(16777216)
DEVICE_OPERATING_SYSTEMVARCHAR(16777216)
DEVICE_OPERATING_SYSTEM_VERSIONVARCHAR(16777216)
DEVICE_VENDOR_IDVARCHAR(16777216)
DEVICE_ADVERTISING_IDVARCHAR(16777216)
DEVICE_LANGUAGEVARCHAR(16777216)
DEVICE_IS_LIMITED_AD_TRACKINGBOOLEAN
DEVICE_TIME_ZONE_OFFSET_SECONDSNUMBER(38,0)
DEVICE_BROWSERVARCHAR(16777216)
DEVICE_BROWSER_VERSIONVARCHAR(16777216)
DEVICE_WEB_INFO_BROWSERVARCHAR(16777216)
DEVICE_WEB_INFO_BROWSER_VERSIONVARCHAR(16777216)
DEVICE_WEB_INFO_HOSTNAMEVARCHAR(16777216)
GEO_CONTINENTVARCHAR(16777216)
GEO_COUNTRYVARCHAR(16777216)
GEO_REGIONVARCHAR(16777216)
GEO_CITYVARCHAR(16777216)
GEO_SUB_CONTINENTVARCHAR(16777216)
GEO_METROVARCHAR(16777216)
APP_INFO_IDVARCHAR(16777216)
APP_INFO_VERSIONVARCHAR(16777216)
APP_INFO_INSTALL_STOREVARCHAR(16777216)
APP_INFO_FIREBASE_APP_IDVARCHAR(16777216)
APP_INFO_INSTALL_SOURCEVARCHAR(16777216)
TRAFFIC_SOURCE_NAMEVARCHAR(16777216)
TRAFFIC_SOURCE_MEDIUMVARCHAR(16777216)
TRAFFIC_SOURCE_SOURCEVARCHAR(16777216)
STREAM_IDVARCHAR(16777216)
PLATFORMVARCHAR(16777216)
EVENT_DIMENSIONS_HOSTNAMEVARCHAR(16777216)
ECOMMERCE_TOTAL_ITEM_QUANTITYNUMBER(38,0)
ECOMMERCE_PURCHASE_REVENUE_IN_USDFLOAT
ECOMMERCE_PURCHASE_REVENUEFLOAT
ECOMMERCE_REFUND_VALUE_IN_USDFLOAT
ECOMMERCE_REFUND_VALUEFLOAT
ECOMMERCE_SHIPPING_VALUE_IN_USDFLOAT
ECOMMERCE_SHIPPING_VALUEFLOAT
ECOMMERCE_TAX_VALUE_IN_USDFLOAT
ECOMMERCE_TAX_VALUEFLOAT
ECOMMERCE_UNIQUE_ITEMSNUMBER(38,0)
ECOMMERCE_TRANSACTION_IDVARCHAR(16777216)
ITEMSVARIANT
COLLECTED_TRAFIC_SOURCE_MANUAL_CAMPAIGN_IDVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_MANUAL_CAMPAIGN_NAMEVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_MANUAL_SOURCEVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_MANUAL_MEDIUMVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_MANUAL_TERMVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_MANUAL_CONTENTVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_GCLIDVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_DCLIDVARCHAR(16777216)
COLLECTED_TRAFIC_SOURCE_SRSLTIDVARCHAR(16777216)

おすすめの記事