Advertising categoryCertified by Stitch

Expected Facebook Ads data

Here’s a sample of the raw Facebook Ads data that Stitch will replicate to your analytics warehouse:

Campaigns

This table is the core table of campaigns in a Facebook Ads account. Columns include campaign id, name, status (active/paused), objective.

Table name:campaigns

Ads

This table records all of the ads in a Facebook Ads account. Columns include the ad information including the Ad Set and Ad Campaign it belongs to, the ad bidding, ad targeting and reference to specific creative (image/text) that the ad uses.

Table name:ads

Ads Insights

This table records all of the creatives that are used in Ads. These includes creative name, description and relevant image urls where appropriate.

Table name:ads_insights

Ad Sets

This table records is the core table of Ad Sets in a Facebook Ads account. Columns include the Ad Campaign id/name the Ad Set belongs to, the budgeting, bid type, scheduling and audience targeting information.

Table name:facebook_adsets

View all tables

Learn more about syncing Facebook Ads data

Documentation

Detailed documentation on how to start syncing Facebook Ads data.

Facebook Ads Documentation

Manual Instructions

How to extract data from Facebook Ads and load it to Google BigQuery manually.

Facebook Ads and load it to Google BigQuery manually.

Divider

Jumpstart your Facebook Ads analytics with reusable blocks

dbt packages can speed up your work

Once you replicate your Facebook Ads data with Stitch, you can use it in many ways. For example, you can use the data modeling and transformation tool dbt to prepare data for reporting, analytics, or machine learning applications.

Dbt has prebuilt packages for many Stitch data sources, including Facebook Ads. Here’s a look at code for modeling Facebook Ads data. This particular block of code prepares your Facebook Ads order data for analysis.

View the source on GitHub →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 {% macro stitch_fb_ad_creatives() %} {{ adapter_macro('facebook_ads.stitch_fb_ad_creatives') }} {% endmacro %} {% macro default__stitch_fb_ad_creatives() %} with base as ( select * from {{ var('ad_creatives_table') }} ), child_links as ( select * from {{ ref('fb_ad_creatives__child_links') }} ), links_joined as ( select id as creative_id, lower(coalesce( nullif(child_link, ''), nullif({{ facebook_ads.nested_field('base.object_story_spec', ['link_data', 'call_to_action', 'value', 'link']) }}, ''), nullif({{ facebook_ads.nested_field('base.object_story_spec', ['video_data', 'call_to_action', 'value', 'link']) }}, ''), nullif({{ facebook_ads.nested_field('base.object_story_spec', ['link_data', 'link']) }}, '') )) as url, lower(coalesce( nullif(url_tags, {{ dbt_utils.split_part('url', "'?'", 2) }}), '') ) as url_tags from base left join child_links on base.id = child_links.creative_id ), parsed as ( select links_joined.*, {{ dbt_utils.split_part('url', "'?'", 1) }} as base_url, {{ dbt_utils.get_url_host('url') }} as url_host, {{ dbt_utils.concat(["'/'", dbt_utils.get_url_path('url')]) }} as url_path, {{ facebook_ads.get_url_parameter() }} from links_joined ) select * from parsed {% endmacro %}

... or use Looker blocks with your Facebook Ads data

We've developed a Looker Block for Facebook Ads data provisioned by Stitch. This block includes prebuilt code to create dashboards and models that can help uncover insights from your Facebook Ads data.

This Looker Block includes three dashboards that provide granular analysis on ad performance metrics. This LookML file produces an overview dashboard and highlights marketing performance metrics such as ad spend, clicks, and impressions over time.

View the source on GitHub →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 - dashboard: overview title: Overview layout: grid rows: - elements: [total_impressions, total_actions, total_spend] height: 150 - elements: [spend_actions_impressions] height: 400 - elements: [campaign_performance] height: 400 - elements: [campaign_value] height: 400 - elements: [campaign_delivery] height: 400 - elements: [actions_by_country] height: 400 - elements: [campaign_performance_and_clicks] height: 400 - elements: [actions_by_type, avg_frequency_by_objective] height: 400 - elements: [campaign_engagement] height: 400 filters: - name: campaign_name type: string_filter - name: date_start type: date_filter elements: - name: total_impressions title: Total impressions type: single_value model: facebook explore: ad_insights measures: [ad_insights.total_impressions] sorts: [ad_insights.total_impressions desc] limit: 5000 show_single_value_title: true show_comparison: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: total_actions title: Total actions type: single_value model: facebook explore: ad_insights measures: [ad_insights.total_actions] sorts: [ad_insights.total_actions desc] limit: 5000 show_single_value_title: true show_comparison: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: total_spend title: Total spend type: single_value model: facebook explore: ad_insights measures: [ad_insights.total_spend] sorts: [ad_insights.total_spend desc] limit: 5000 show_single_value_title: true show_comparison: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: spend_actions_impressions title: Spend, actions, and impressions over time type: looker_line model: facebook explore: ad_insights dimensions: [ad_insights.date_start_month] measures: [ad_insights.total_spend, ad_insights.total_actions, ad_insights.total_impressions] sorts: [ad_insights.date_start_month desc] limit: 5000 stacking: '' colors: ['#FFCC00', '#1E2023', '#3399CC', '#CC3399', '#66CC66', '#999999', '#FF4E00', '#A2ECBA', '#9932CC', '#0000CD'] show_value_labels: false label_density: 25 legend_position: center x_axis_gridlines: false show_view_names: true limit_displayed_rows: false y_axis_combined: false show_y_axis_labels: true show_y_axis_ticks: false y_axis_tick_density: default show_x_axis_label: true show_x_axis_ticks: true x_axis_scale: auto y_axis_scale_mode: linear show_null_points: true point_style: none interpolation: linear listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: campaign_performance title: Campaign performance type: table model: facebook explore: ad_insights dimensions: [campaigns.name, adsets.end_date, adsets.effective_status, campaigns.objective] measures: [ad_insights.total_actions, ad_insights.total_clicks, ad_insights.total_reach, ad_insights.total_spend] dynamic_fields: - table_calculation: cost_per_action label: cost_per_action expression: ${ad_insights.total_spend} / ${ad_insights.total_actions} sorts: [campaigns.name] limit: 5000 show_view_names: false show_row_numbers: true truncate_column_names: false table_theme: editable limit_displayed_rows: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: campaign_value title: Cost per action v. total actions by campaign type: looker_scatter model: facebook explore: ad_insights dimensions: [campaigns.name] measures: [ad_insights.total_actions, ad_insights.total_spend] dynamic_fields: - table_calculation: cost_per_action label: Cost per action expression: ${ad_insights.total_spend} / ${ad_insights.total_actions} hidden_fields: [ad_insights.total_spend, campaigns.name] sorts: [cost_per_action desc] description: 'Evaluate campaign performance by comparing the actions generated to the total spent on the campaign.' limit: 5000 column_limit: 50 stacking: '' colors: ['#FFCC00', '#1E2023', '#3399CC', '#CC3399', '#66CC66', '#999999', '#FF4E00', '#A2ECBA', '#9932CC', '#0000CD'] show_value_labels: false label_density: 25 legend_position: center x_axis_gridlines: false y_axis_gridlines: true show_view_names: false limit_displayed_rows: false y_axis_combined: true show_y_axis_labels: true show_y_axis_ticks: true y_axis_tick_density: default show_x_axis_label: true show_x_axis_ticks: true x_axis_scale: auto y_axis_scale_mode: linear show_null_points: true point_style: circle listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: campaign_delivery title: Campaign delivery type: table model: facebook explore: ad_insights dimensions: [campaigns.name, adsets.end_date, adsets.effective_status, campaigns.objective] measures: [ad_insights.total_reach, ad_insights.avg_frequency, ad_insights.avg_cpp, ad_insights.avg_cpm, ad_insights.total_impressions] sorts: [campaigns.name] limit: 5000 show_view_names: false show_row_numbers: true truncate_column_names: false table_theme: editable limit_displayed_rows: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: actions_by_country title: Actions by country type: looker_geo_choropleth model: facebook explore: ad_insights_by_country dimensions: [ad_insights_by_country.country_iso] measures: [ad_insights_by_country.total_actions] sorts: [ad_insights_by_country.total_actions desc] limit: 5000 map: auto colors: ['#FFCC00'] show_view_names: true quantize_colors: false listen: campaign_name: ad_insights_by_country.campaign_name date_start: ad_insights_by_country.date_start_date - name: campaign_performance_and_clicks title: Campaign performance and clicks type: table model: facebook explore: ad_insights dimensions: [campaigns.name, adsets.effective_status, adsets.end_date, campaigns.objective] measures: [ad_insights.total_actions, ad_insights.total_reach, ad_insights.avg_frequency, ad_insights.total_clicks, ad_insights.avg_ctr, ad_insights.avg_cpc, ad_insights.total_impressions, ad_insights.avg_cpm, ad_insights.total_inline_link_clicks, ad_insights.avg_inline_link_click_ctr, ad_insights.avg_cost_per_inline_link_click, ad_insights.total_spend] sorts: [ad_insights.total_actions desc] limit: 5000 show_view_names: false show_row_numbers: true truncate_column_names: false table_theme: editable limit_displayed_rows: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: actions_by_type title: Actions by type type: looker_pie model: facebook explore: ad_action_insights dimensions: [ad_action_insights.action_type] measures: [ad_action_insights.total_actions] sorts: [ad_action_insights.total_actions desc] limit: 5000 colors: ['#FFCC00', '#1E2023', '#3399CC', '#CC3399', '#66CC66', '#999999', '#FF4E00', '#A2ECBA', '#9932CC', '#0000CD'] value_labels: legend show_view_names: true listen: campaign_name: ad_action_insights.campaign_name date_start: ad_action_insights.date_start_date - name: avg_frequency_by_objective title: Average frequency by objective type: looker_column model: facebook explore: ad_insights dimensions: [campaigns.objective] measures: [ad_insights.avg_frequency] sorts: [ad_insights.avg_frequency desc] limit: 5000 stacking: '' colors: ['#FFCC00', '#1E2023', '#3399CC', '#CC3399', '#66CC66', '#999999', '#FF4E00', '#A2ECBA', '#9932CC', '#0000CD'] show_value_labels: false label_density: 25 legend_position: center x_axis_gridlines: false y_axis_gridlines: true show_view_names: true limit_displayed_rows: false y_axis_combined: true show_y_axis_labels: true show_y_axis_ticks: true y_axis_tick_density: default show_x_axis_label: true show_x_axis_ticks: true x_axis_scale: auto y_axis_scale_mode: linear show_null_labels: false listen: campaign_name: ad_insights.campaign_name date_start: ad_insights.date_start_date - name: campaign_engagement title: Campaign engagement type: table model: facebook explore: ad_action_insights dimensions: [campaigns.name, adsets.effective_status, adsets.end_date, campaigns.objective] measures: [ad_action_insights.post_likes, ad_action_insights.post_comments, ad_action_insights.link_clicks, ad_action_insights.page_likes, ad_action_insights.post_shares] sorts: [campaigns.name] limit: 5000 show_view_names: false show_row_numbers: true truncate_column_names: false table_theme: editable limit_displayed_rows: false listen: campaign_name: ad_action_insights.campaign_name date_start: ad_action_insights.date_start_date

Start replicating your Facebook Ads data

Select your integrations, choose your warehouse, and enjoy Stitch free for 14 days.

Set up in minutesUnlimited data volume during trial

Simplify your Google BigQuery migration

When it comes to replicating your data to Google BigQuery, conventional ETL is no longer the only game in town.

Writing ETL code requires big investments of time, money, and expertise that might otherwise be used for innovation. Most importantly, newer approaches to data ingestion deliver faster implementation than traditional ETL, so you can produce data analytics and business intelligence more quickly.

This is where Stitch can help.

Divider

All your data, where you need it

Give your analysts, data scientists, and other team members the freedom to use the analytics tools of their choice.

See all analysis tools

Analysis Tools Asset
Stitch's interface is sleek and efficient. We only know it's running when it sends us alerts; otherwise, it does its job without bother.

Amaury Dumoulin

Data Lead, Qonto

Divider

Why our customers choose Stitch

Stitch is a simple, powerful ETL service built for developers. Stitch connects to your first-party data sources – from databases like MongoDB and MySQL, to SaaS tools like Salesforce and Zendesk – and replicates that data to your warehouse. With Stitch, developers can provision data for their internal users in minutes, not weeks.

Explore all of Stitch's features
IconSimple setup
Start replicating data in minutes, and never worry about ETL maintenance.
IconOwn your own data infrastructure
Stitch replicates to your warehouse, meaning you’re always in control.
IconMature replication engine
Accurate data from any structure, all the time.
Explore all of Stitch's features

Connect to your ecosystem of data sources

Stitch integrates with leading databases and SaaS products. No API maintenance, ever, while you maintain full control over replication behavior.