Skip to main content

Facebook Ads

info

Phần hướng dẫn tạo source data từ Facebook Ads này sẽ bao gồm hai phần:

  1. Hướng dẫn thiết lập Source từ Facebook Ads
  2. Hướng dẫn điền các trường thông tin khi setup Connection với Source là từ Facebook Ads

Phần 1: Hướng dẫn thiết lập Source từ Facebook Ads

note

Sau khi đã thao tác các bước nền là chọn source và vào được trang setup source chi tiết, bạn tiến hành thao tác điền các trường thông tin cần thiết như hướng dẫn dưới đây. Hướng dẫn các bước nền để tạo source trên Elton bạn có thể xem ở phần Getting Started - Mục Thiết lập Source.

Bước 1: Điền các trường thông tin cần thiết

(1) Tại giao diện setup data source của Facebook Ads, bạn thao tác điền các thông tin định danh cho source chuẩn bị tạo:

  • Display name: Tên hiển thị của source. Elton khuyến khích bạn đặt tên có mối liên hệ với source FB Ads mà bạn sắp sửa tạo (Ví dụ: FB Ads Duy Luan de thuong).
  • Description: Mô tả của source nếu có

(2) Mục Connection: Phần ghi chú của source với nội dung cho biết rằng sau khi nhấn Save thì bạn sẽ còn cần một bước nữa là phân quyền (authorize) cho Elton truy cập vào source data đích của bạn. Chi tiết cách phân quyền sẽ được mô tả ở Bước 2.

(3) Sau khi hoàn tất điền các thông tin của source ở (1), bạn nhấn lưu => hệ thống sẽ đưa về trang thông tin chi tiết của source bạn vừa tạo.

Bước 2: Trao quyền từ source đã thiết lập

  • Tại trang thông tin chi tiết của source bạn vừa tạo => Nhấn chọn nút "Authorize" để tiền hành trao quyền cho phép Elton truy cập vào dữ liệu của source.

  • Đối với trường hợp Source là Facebook Ads thì hệ thống sẽ tự động đưa bạn qua trang đăng nhập của Facebook

  • Bạn tiến hành đăng nhập với account Facebook Ads của mình

  • Tiếp theo, Facebook sẽ yêu cầu bạn thao tác chọn các dữ liệu cụ thể của account để tiến hành trao quyền cho Elton.

  • Sau khi thực hiện trao quyền xong, hệ thống sẽ đưa bạn về tab "Data Sources", bạn sẽ thấy source mới tạo nằm ở trên đầu danh sách các source đã có, bạn thao tác nhấn chọn source và có thể xem được thông tin chi tiết của source đó.

  • Tại chi tiết của source, bạn có thể tao tác edit, delete, disable hoặc re-authorize trang Facebook Ads như hình.

  • Danh của các account Facebook Ads đã được trao quyền và sẵn sàng để sử dụng cũng sẽ được thông báo tới bạn ở màn hình này.

Phần 2: Hướng dẫn điền các trường thông tin khi setup Connection với Source là từ Facebook Ads

Tại mục "Source Config" của màn hình setup chi tiết connection có source là Facebook Ads, các trường thông tin bạn cần điền sẽ có ý nghĩa như sau:

1. Select a Facebook Source

  • Tại đây hệ thống sẽ đề xuất các source Facebook Ads mà bạn đã tạo, bạn thao tác chọn source mà bạn mong muốn connect.

2. Select 1 or many Ad Accounts

  • Hệ thống sẽ đề xuất danh sách các account trong source facebook ads mà bạn trao quyền, bạn thao tác chọn các account mong muốn tạo connection.
note

Trong trường hợp hệ thống không tự đề xuất danh sách các account trong source, lý do có thể xuất phát từ việc bạn chưa trao quyền (authorize) source Facebook Ads thành công. Truy cập và phần data source => chọn source facebook ads đích để tiến hành trao quyền lại.

3. ignore invalid accounts

  • Trong quá trình tạo data source liên quan đến Facebook Ads của bạn, có khả năng một vài account đã được phân quyền trong source sẽ không đủ điều kiện (invalid) để hình thành connection. Lý do có thể tới từ việc những account đó được trao quyền không thành công hoặc account đã bị khoá trong lúc tạo connection.

  • Khi bạn chọn bật ignore invalid accounts, thời điểm tạo connection thì hệ thống sẽ tự động loại bỏ các account không đủ đều kiện, và tiếp tục với các account đủ điều kiện.

  • Trường hợp bạn không bật ignore invalid accounts, thời điểm bạn save connection, hệ thống sẽ tự động check và cảnh báo, cũng như yêu cầu bạn loại bỏ bằng tay những account không hợp lệ để tiếp tục tạo connection như trog hình.

  • Bạn có thể thao tác click vào nút Remove invalid accounts hoặc loại bỏ từng account một bằng cách nhấn vào nút x trên từng account.

tip
  • Elton khuyến khích bạn nên bật ignore invalid pages nhằm mục đích tạo ra connection mượt mà hơn.

  • Trường hợp bạn bật chế độ bignore invalid accounts, Elton vẫn có cơ chế thông báo cho bạn biết những account nào đang không hợp lệ và sẽ được bỏ qua khi tạo connection (xem hình bên dưới).

4. Select 1 or many type of data

  • Sau khi bạn trao quyền datasource của Facebook Ads thành công, hệ thống sẽ nhận diện được các bảng dữ liệu mà các acount của bạn đang sở hữu để đề xuất trong trường thông tin này.

  • Bạn chọn các bảng dữ liệu liên quan để thực hiện tạo kết nối và tải lên.

5. Insights Level

  • Tại field này, bạn có thể tao tác chọn mức độ chi tiết của dữ liệu được truyền từ account Facebook Ads của bạn về destination đích khi tạo connection.

  • Lựa chọn mặc định mà Elton chọn cho bạn là ad - cũng là mức độ thấp nhất, đồng nghĩa với việc dữ liệu lấy về sẽ chi tiết nhất.

  • Tương tự với các lựa chọn khác độ chi tiết của dữ liệu sẽ giảm dần.

note

Lựa chọn này áp dụng cho Insights report, mỗi connection chỉ chọn được 1 level, nếu muốn lấy level khác thì bạn cần phải tạo connection mới.

6. Insight Breakdowns

  • Tại đây bạn có thể chọn phân rã dữ liệu của mình theo nhiều cách khác nhau, từ việc theo thiết bị (device) hay theo khu vực (region)
tip
  • Lựa chọn này áp dụng cho Insights report, Mỗi connection chỉ chọn được 1 breakdowns, nếu muốn chọn thêm breakdowns khác thì bạn cần phải tạo connection mới.

  • Trong một vài trường hợp, chọn nhiều hơn một breakdown trong cùng 1 connection được cho phép. Điều này được gọi là Combination. Tuy nhiên để thực hiện thành công thao tác này, bạn cần thực hiện chính xác theo luật mà Facebook đã đề ra. Xem thêm luật ở đây

  • Số lượng breakdowns sẽ tỉ lệ thuận với data size (có nghĩa là càng nhiều breakdowns sẽ phát sinh nhiều dòng dữ liệu (records) hơn dẫn đến size dữ liệu của bạn sẽ lớn hơn).

7. First load - Load data since

  • Thể hiện mốc thời gian mà bạn mong muốn dữ liệu của bạn sẽ được tải lên từ lúc đó trở đi.

  • Ví dụ: Bạn chọn ngày load data là 15/10/2023 => Hệ thống sẽ sync toàn bộ dữ liệu của source FB Ads của bạn kể từ ngày 15/10/2023 đến hiện tại.

8. Incremental load - Date range to scan

  • Cách quét dữ liệu định kỳ của Elton đi theo hướng tịnh tiến (incremental) - có nghĩa là định kì hệ thống sẽ thực hiện quét dữ liệu cũ theo hướng tịnh tiến, theo một khoản thời gian được cài đặt trước, chứ không phải mỗi lần quét lại là sẽ quét lại toàn bộ dữ liệu phát sinh từ ngày đầu tiên.

  • Vì vậy, Incremental load - Date range to scan Là số ngày tính từ ngày chạy mà hệ thống sẽ scan trở về trước

  • Ví dụ: User chọn option là last 1 day thì hôm nay chạy sẽ tiến hành scan data kể từ ngày hôm qua. Nếu chọn last 7 days thì hôm nay sẽ dữ liêu của 7 ngày trước đó.

Phụ lục 1: Hướng dẫn thực hành trích xuất (query) dữ liệu từ các bảng dữ liệu đã được truyền từ source Facebook Ads trên Google BigQuery

  • Sau khi đã thiết lập thành công connection có source đến từ Facebook Ads và destination là Google BigQuery, bạn có thể tiến hành query dữ liệu của account Facebook Ads của bạn trên Google BigQuery.

  • Thông thường các metrics và schema của các bảng dữ liệu đến từ source Facebook Ads khá tương đồng với nhau và được hệ thống tiêu chuẩn. Vì vậy, Elton cung cấp cho bạn một cậu lệnh Query mẫu đễ thực hiện trích xuất dữ liệu của connection bạn mới tạo trên Google BigQuery như sau:

WITH flatten_data AS (
SELECT
account_id,
ad_id,
date_start,

-- outbound_clicks
MAX(CASE WHEN JSON_VALUE(oc, '$.action_type') = 'outbound_click' THEN CAST(JSON_VALUE(oc, '$.value') AS FLOAT64) ELSE 0 END) AS outbound_clicks,

-- actions
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'link_click' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS link_clicks,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'post_engagement' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS post_engagements,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'page_engagament' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS page_engagaments,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'post_reaction' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS post_reactions,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'comment' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS post_comments,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'landing_page_view' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS landing_page_views,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'photo_view' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS photo_views,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS video_views,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'view_content' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS view_contents,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'conversions' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS conversions,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_add_to_cart,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS add_to_cart_action_count,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_onsite_web_add_to_cart,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_purchase,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_offsite_conversion_fb_pixel_purchase,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_onsite_web_purchase,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_app_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS action_onsite_web_app_purchase,

-- message
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_conversion.messaging_order_created_v2' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_conversion_messaging_order_created_v2,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_coversion.messaging_first_reply' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS messaging_first_reply,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_coversion.total_messaging_connection' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS total_messaging_connection,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_coversion.messaging_user_conversation_depth_2_message_send' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS messaging_user_conversation_depth_2_message_send,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_conversion.messaging_conversation_started_7d' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_conversion_messaging_conversation_started_7d,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_conversion.messaging_conversation_replied_7d' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_conversion_messaging_conversation_replied_7d,
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_conversion.other' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_conversion_other,

-- action_values
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(action_values, '$.value') AS INT64) ELSE 0 END) AS add_to_cart_action_value,

-- converted_product_quantity
MAX(CASE WHEN JSON_VALUE(cpq, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(cpq, '$.value') AS INT64) ELSE 0 END) AS converted_add_to_cart_quantity,
MAX(CASE WHEN JSON_VALUE(cpq, '$.action_type') = 'omni_view_content' THEN CAST(JSON_VALUE(cpq, '$.value') AS INT64) ELSE 0 END) AS converted_content_views,
MAX(CASE WHEN JSON_VALUE(cpq, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(cpq, '$.value') AS INT64) ELSE 0 END) AS converted_purchase_quantity,
MAX(CASE WHEN JSON_VALUE(cpq, '$.action_type') = 'converted_product_value' THEN CAST(JSON_VALUE(cpq, '$.value') AS INT64) ELSE 0 END) AS converted_product_value,
MAX(CASE WHEN JSON_VALUE(cpq, '$.action_type') = 'conversion_values' THEN CAST(JSON_VALUE(cpq, '$.value') AS INT64) ELSE 0 END) AS converted_conversion_values,

-- converted_product_value
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(cpv, '$.value') AS INT64) ELSE 0 END) AS converted_add_to_cart_value,
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(cpv, '$.value') AS INT64) ELSE 0 END) AS converted_purchase_value,
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'app_custom_event.fb_mobile_add_to_cart' THEN CAST(JSON_VALUE(cpv, '$.value') AS INT64) ELSE 0 END) AS converted_mobile_add_to_cart,
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'app_custom_event.fb_mobile_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS converted_mobile_purchase,
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'offsite_conversion.fb_pixel_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS converted_offsite_conversion_fb_pixel_add_to_cart,
MAX(CASE WHEN JSON_VALUE(cpv, '$.action_type') = 'offsite_conversion.fb_pixel_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS converted_offsite_conversion_fb_pixel_purchase,

-- website CTR
MAX(CASE WHEN JSON_VALUE(website_ctr, '$.action_type') = 'link_click' THEN CAST(JSON_VALUE(website_ctr, '$.value') AS FLOAT64) ELSE 0 END) AS website_ctr_link_click,

-- Video views
MAX(CASE WHEN JSON_VALUE(video_30_sec_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_30_sec_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_30_sec_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_p100_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_p100_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_p100_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_p25_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_p25_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_p25_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_p50_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_p50_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_p50_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_p75_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_p75_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_p75_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_p95_watched_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_p95_watched_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_p95_watched_actions,
MAX(CASE WHEN JSON_VALUE(video_play_actions, '$.action_type') = 'video_view' THEN CAST(JSON_VALUE(video_play_actions, '$.value') AS FLOAT64) ELSE 0 END) AS video_play_actions,

-- Conversion value count and value money
MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'omni_initiated_checkout' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS omni_initiated_checkout,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'omni_initiated_checkout' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS omni_initiated_checkout_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_app_view_content' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_web_app_view_content,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_app_view_content' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_app_view_content_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_app_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_web_app_add_to_cart,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_app_add_to_cart' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_app_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_app_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_app_purchase,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_app_purchase' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_app_purchase_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_purchase,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_purchase' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_purchase_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_web_add_to_cart,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_add_to_cart' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'onsite_web_view_content' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS onsite_web_view_content,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'onsite_web_view_content' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS onsite_web_view_content_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'add_payment_info' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS add_payment_info,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'add_payment_info' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS add_payment_info_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_search' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_search,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_search' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_search_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_view_content' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_view_content,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_view_content' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_view_content_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_add_payment_info' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_add_payment_info,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_add_payment_info' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_add_payment_info_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_add_to_cart' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_add_to_cart,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_add_to_cart' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_initiate_checkout' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_initiate_checkout,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_initiate_checkout' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_initiate_checkout_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'offsite_conversion.fb_pixel_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS offsite_conversion_fb_pixel_purchase,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'offsite_conversion.fb_pixel_purchase' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS offsite_conversion_fb_pixel_purchase_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'initiate_checkout' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS initiate_checkout,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'initiate_checkout' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS initiate_checkout_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'omni_search' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS omni_search,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'omni_search' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS omni_search_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS purchase,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'purchase' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS purchase_value,

MAX(CASE WHEN JSON_VALUE(action, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(action, '$.value') AS INT64) ELSE 0 END) AS omni_purchase,
MAX(CASE WHEN JSON_VALUE(action_values, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(action_values, '$.value') AS FLOAT64) ELSE 0 END) AS omni_purchase_value,

-- Some special campaigns
MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_add_to_cart,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'app_custom_event.fb_mobile_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_app_custom_event_fb_mobile_add_to_cart,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'app_custom_event.fb_mobile_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_app_custom_event_fb_mobile_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'app_custom_event.fb_mobile_content_view' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_app_custom_event_fb_mobile_content_view,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'app_custom_event.fb_mobile_content_view' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_app_custom_event_fb_mobile_content_view_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'offsite_conversion.fb_pixel_view_content' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_offsite_conversion_fb_pixel_view_content,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'offsite_conversion.fb_pixel_view_content' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_offsite_conversion_fb_pixel_view_content_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_add_to_cart,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'omni_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_add_to_cart_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_purchase,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'omni_purchase' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_purchase_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'omni_view_content' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_view_content,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'omni_view_content' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_omni_view_content_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'offsite_conversion' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_offsite_conversion,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'offsite_conversion' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_offsite_conversion_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'onsite_web_app_view_content' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_app_view_content,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'onsite_web_app_view_content' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_app_view_content_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'onsite_web_view_content' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_view_content,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'onsite_web_view_content' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_view_content_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'onsite_app_view_content' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_app_view_content,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'onsite_app_view_content' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_app_view_content_value,

MAX(CASE WHEN JSON_VALUE(catalog_segment_actions, '$.action_type') = 'onsite_web_app_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_actions, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_app_add_to_cart,
MAX(CASE WHEN JSON_VALUE(catalog_segment_value, '$.action_type') = 'onsite_web_app_add_to_cart' THEN CAST(JSON_VALUE(catalog_segment_value, '$.value') AS FLOAT64) ELSE 0 END) AS catalog_segment_actions_onsite_web_app_add_to_cart_value,

FROM `x-data-platform.x_facebookads_dwh.facebook_ads_ads_insights`
LEFT JOIN UNNEST(outbound_clicks) AS oc
LEFT JOIN UNNEST(actions) AS action
LEFT JOIN UNNEST(action_values) AS action_values
LEFT JOIN UNNEST(converted_product_quantity) AS cpq
LEFT JOIN UNNEST(converted_product_value) AS cpv
LEFT JOIN UNNEST(website_ctr) AS website_ctr
LEFT JOIN UNNEST(video_30_sec_watched_actions) AS video_30_sec_watched_actions
LEFT JOIN UNNEST(video_p100_watched_actions) AS video_p100_watched_actions
LEFT JOIN UNNEST(video_p25_watched_actions) AS video_p25_watched_actions
LEFT JOIN UNNEST(video_p50_watched_actions) AS video_p50_watched_actions
LEFT JOIN UNNEST(video_p75_watched_actions) AS video_p75_watched_actions
LEFT JOIN UNNEST(video_p95_watched_actions) AS video_p95_watched_actions
LEFT JOIN UNNEST(video_play_actions) AS video_play_actions

LEFT JOIN UNNEST(catalog_segment_actions) AS catalog_segment_actions
LEFT JOIN UNNEST(catalog_segment_value) AS catalog_segment_value

GROUP BY 1, 2, 3
)

SELECT

CAST(ai.date_start AS DATE) AS date_start,
CAST(ai.date_stop AS DATE) AS date_stop,
ai.account_id,
ai.account_name,
ai.campaign_id,
ai.campaign_name,
campaign.objective AS campaign_objective,
campaign.configured_status AS campaign_configured_status,
campaign.effective_status AS campaign_effective_status,
ai.adset_id,
ai.adset_name,
ad_set.configured_status AS adset_configured_status,
ad_set.effective_status AS adset_effective_status,
ai.ad_id,
ai.ad_name,
ad.configured_status AS ad_configured_status,
ad.effective_status AS ad_effective_status,
clicks,
impressions,
reach,
spend,
social_spend,
flatten_data.* EXCEPT (account_id, ad_id, date_start)

FROM `x-data-platform.x_facebookads_dwh.facebook_ads_ads_insights` AS ai
LEFT JOIN `x-data-platform.x_facebookads_dwh.facebook_ads_ads` AS ad ON ai.ad_id = ad.id
LEFT JOIN `x-data-platform.x_facebookads_dwh.facebook_ads_ad_sets` AS ad_set ON ai.adset_id = ad_set.id
LEFT JOIN `x-data-platform.x_facebookads_dwh.facebook_ads_campaigns` AS campaign ON ai.campaign_id = campaign.id
LEFT JOIN flatten_data ON ai.account_id = flatten_data.account_id AND ai.ad_id = flatten_data.ad_id AND ai.date_start = flatten_data.date_start
  • Trong đó, các có 2 trường thông tin trong câu query là:
  1. x-data-platform

  2. x_facebookads_dwh.

  • Đây là hai yếu tố trong bảng dữ liệu của bạn mà bạn cần tuỳ chỉnh cho phù hợp với cấu trúc đặt tên của connection của công ty bạn:
  1. x-data-platform: tương ứng với tên project_id của công ty bạn

  2. x_facebook_fanpage_dwh: tương ứng với tên dataset của công ty bạn lúc bạn tạo destination tới Google BigQuery

  • Bạn thao tác copy câu query ở trên và điều chỉnh x-data-platformx_facebook_fanpage_dwh lại thành tên project_id và tên dataset của mình như hướng dẫn ở trên rồi tiến hành chạy thử trên Google BigQuery và xem dữ liệu nhé!
tip

Với hướng dẫn điền các bảng ở trên, dữ liệu sẽ được phân rã (breakdown) theo ad, nếu bạn có nhu cầu phân rã dữ liệu theo cách khác, bạn có thể chỉnh tên bảng dữ liệu tương ứng theo mong muốn cá nhân.

Phụ lục 2: Template mẫu cho việc visualize data lên một dashboard nhất định

  • Elton cung cấp cho bạn template tạo dashboard mẫu giúp tận dụng các dữ liệu đã được tải về từ source đích để visualize data và get insights.

  • Template mẫu được cung cấp được thực hiện trên Looker Studio của Google. Vì vậy, để sử dụng template này bạn cần đảm bảo rằng connection bạn tạo có Destination là Google BigQuery.

warning
  • Ở mỗi template mẫu bên dưới, Elton có hướng dẫn chi tiết cách tạo report từ template mẫu, bạn tham khảo để biết thêm chi tiết.

  • Lưu ý: Đối với trường hợp source là Facebook Ads, để visualize được trên dashboard sử dụng Looker Studio, bạn cần thao tác thêm một bước đó là đưa data của source đích đã được tải lên Google BigQuery lên Looker Studio bằng cách tạo một bảng dữ liệu có tên là facebook_ads_insights_flatten. Cách làm sẽ được hướng dẫn ở Phụ Lục 3 bên dưới.

Template dashboard mẫu 1:

https://lookerstudio.google.com/u/0/reporting/39f6a0aa-868b-4e32-855a-03e41be8d15a/page/6pspD

info

Hướng dẫn cách tạo report FB Ads từ template của Elton:

  • Như đã đề cập ở trên, để có thể có dữ liệu cho việc xây dashboard bằng Looker studio từ source là Facebook ad, bạn cần trước tiên setup như hướng dẫn ở Phụ lục 3 bên dưới.

  • Khi mọi thứ đã sẵn sàng, bạn sử dụng đường link này: https://lookerstudio.google.com/u/0/reporting/create?c.reportId=39f6a0aa-868b-4e32-855a-03e41be8d15a&r.reportName=FacebookAds&ds.refreshFields=false&ds.billingProjectId=x-data-platform&ds.sqlReplace=elton-data-public,x-data-platform,samples,x_facebook_fanpage_dwh,facebook_ads_insights_flatten,facebook_ads_insights_flatten&ds.datasourceName=facebook_ads_dashboard

  • Bạn thao tác thay thế một vài các component trong link để tạo template. Cụ thể:

  1. Bạn thay x-data-platform tương ứng với tên project_id của công ty bạn

  2. x_facebook_fanpage_dwh Tương ứng với tên dataset của công ty bạn lúc bạn tạo destination tới Google BigQuery

  • Sau khi thay thế các component ở trên, bạn thao tác copy link và thử mở trên browser của mình để xem kết quả nhé.

Template dashboard mẫu 2 (Dữ liệu từ source Google Ads và Facebook Ads hiển thị trong cùng 1 dashboard):

https://lookerstudio.google.com/u/0/reporting/6b9974a2-6042-41a8-a972-19cbc2c9574a/page/VgD

Phụ lục 3: Hướng dẫn cách đưa data vào Looker Studio (dành cho FB Ads)

Bước 1:

  • Vào Elton -> tab Connection -> Chọn connection có source là Facebook Ads mà bạn muốn thực hiện đưa dữ liệu lên Data Looker -> Chọn edit -> Scroll đến mục Source Config -> field Insights Level bạn điền giá trị Ads

  • Field Select 1 or many type of data cũng cần đủ các bảng như trong hình

Bước 2: Sau khi connection chạy thành công (Có Status = Success ), trong BigQuery sẽ có 1 dataset mới, chứa các bảng liên quan:

Bước 3: Tạo bảng facebook_ads_insights_flatten:

  • facebook_ads_insights_flatten: Đây là bảng masters chứa các metrics quan trọng, thuận tiện cho người dùng kéo thả vào report. Để tạo bảng này, trước tiên bạn cần hoàn thành một câu query sử dụng template câu query mẫu mà Elton cung cấp ở Phụ Lục 1 ở trên.

  • Bạn theo hướng dẫn của Phụ lục 1 và thực hiện tạo câu query dành riêng cho doanh nghiệp của mình.

  • Test câu query: Sau khi hoàn thành câu query, bạn vào BigQuery, chọn Create SQL query, copy đoạn code SQL vào và chạy thử. Nếu ra được Query results mà không báo lỗi gì là thành công.

Bước 4: Tạo transformation trên Elton

  • Bạn truy cập lại vào trang web của Elton -> vào tab Transformations -> chọn Create Transformation.

  • Tại chi tiết setup transformation, bạn thao tác điền các thông tin cần thiết sau đó Copy paste toàn bộ đoạn code ở Bước 3 vào phần Query và save.

Lưu ý: Để giảm thiểu phí bị charge bởi Google BigQuery, Elton khuyến khích bạn nên bật chức năng Is partition table. Sử dụng chức năng này, hệ thống sẽ tự động phân nhỏ bảng dữ liệu của bạn ra thành nhiều phần nhỏ nhằm tối ưu hiệu xuất.

Đối với bảng transformation được tạo trong phần này, mục Partitioning Field sẽ mặc định là date_start. Partitioning Field Type thể hiện khoản thời gian bạn muốn chia nhỏ dữ liệu của mình. Ví dụ: Khi chọn option là DAY, hệ thống sẽ tự động chia nhỏ data trên đơn vị là ngày.

  • Tiến hành chạy Transformation và chờ báo Success
info
  • Hướng dẫn điền các trường thông tin khi tạo một Transformation trên Elton bạn có thể tham khảo thêm ở đây (sẽ được cập nhật sớm)

Bước 5: Kiểm tra bảng dữ liệu mới tạo trên Google Big Query

  • Trong BigQuery, bạn sẽ thấy bảng facebook_ads_insights_flatten ở dataset đã chọn ở Bước 4

Bước 6: Tạo report

Khi đã có bảng facebook_ads_insights_flatten trong BigQuery, có 2 cách để tạo report:

  • Cách 1: Tạo report từ đầu bằng cách chọn Explore with Looker Studio như hình trên Google Bigquery

  • Cách 2: Dùng template của Elton Data theo hướng dẫn ở phụ lục 2

Add-on: Cách tính Billable Pipeline cho source

  • Khi sử dụng Elton, bạn sẽ được thông báo về cách mà hệ thống sẽ tính phí sử dụng dịch vụ. Cách tính hiện tại chủ yếu dựa trên số pipeline bạn tạo.

  • Tuỳ từng loại source mà cách tính số lượng pipeline giới hạn sẽ khác nhau. Để biết thêm chi tiết, bạn vui lòng tham khảo cách tính ở link ở đây.