Facebook Ads
Phần hướng dẫn tạo source data từ Facebook Ads này sẽ bao gồm hai phần:
- Hướng dẫn thiết lập Source từ Facebook Ads. Xem HDSD dưới dạng video tại đây
- 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
General ConfigvàSource Config). Xem HDSD dưới dạng video tại đây
Lưu ý: Trong trường hợp destination bạn chọn để tạo connection với source của bạn là Google BigQuery, bạn có thể truy cập vào đây để xem hướng dẫn và giải thích cho phần Configuration mode lúc tạo connection.
Phần 1: Hướng dẫn thiết lập Source từ Facebook Ads
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,disablehoặcre-authorizetrang 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
General info
1. Name: Tên của cài đặt connection bạn sắp tạo.
2. Description: Mô tả của cài đặt connection bạn sắp tạo
3. Sync Frequency: Chọn khoản thời gian định kỳ mà bạn muốn dữ liệu của connection sắp tạo được cập nhật. Ví dụ: Nếu bạn chọn option là Every 1 hour, thì cứ mỗi 1 tiếng hệ thống sẽ tự chạy và sync dữ liệu một lần.
Source config
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 an Ads account
- Tại đây hệ thống sẽ đề xuất các account Facebook Ads mà bạn đã traon quyền cho Elton thành công, bạn thao tác chọn account mà bạn mong muốn connect.
2. 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 accountshoặc loại bỏ từng account một bằng cách nhấn vào nútxtrên từng account.

-
Elton khuyến khích bạn nên bật
ignore invalid pagesnhằm mục đích tạo ra connection mượt mà hơn. -
Trường hợp bạn bật chế độ b
ignore 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).

3. Select 1 or many types of data
- Hệ thống sẽ đề xuất danh sách các bảng dữ liệu trong source facebook ads mà bạn trao quyền, bạn thao tác chọn các bảng dữ liệu mong muốn tạo connection.
Trong trường hợp hệ thống không tự đề xuất danh sách các dữ liệu 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.
4. 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.
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.
5. Custom attribution windows
-
Là khung thời gian facebook dùng để ghi nhận kết quả quảng cáo
-
Giá trị cài đặt mặc định của fb cho trường thông tin này là:
7d_clickvà1d_view, có nghĩa là nếu một User A xem ads vào ngày T nhưng tới ngày T+12 mới mua hàng (click), thì xem như chưa ghi nhận sales của campaign. Tương tự như vậy với trường hợp xem hàng (view). -
Bạn có thể chọn bật tính năng này và cài lại khoản thời gian này khi không muốn theo cài đặt mặc định của fb.
Nhưng em chọn 28 day window thì có
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)
-
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 scanLà số ngày tính từ ngày chạy mà hệ thống sẽ scan data trở về trước -
Ví dụ: User chọn option là
last 1 daythì hôm nay chạy sẽ tiến hành scan data kể từ ngày hôm trước. Nếu chọnlast 7 daysthì 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à:
-
x-data-platform -
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:
-
x-data-platform: tương ứng với tênproject_idcủa công ty bạn -
x_facebook_fanpage_dwh: tương ứng với têndatasetcủ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-platformvàx_facebook_fanpage_dwhlại thành tênproject_idvà têndatasetcủ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é!
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
Bạn truy cập vào đây để xem hướng dẫn tạo báo cáo từ mẫu có sẵn của Elton trên Looker Studio
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.