Two powerful tools, together

Integrate Facebook Ads and Google Sheets to turn your data into actionable insights.

Facebook Ads is one of the most efficient ways to advertise online.

Stitch offers detailed documentation on how to sync your Facebook Ads data.

Stitch Facebook Ads Documentation

Google Sheets is a spreadsheet program included as part of a free, web-based software office suite offered by Google within its Google Drive service.

Stitch offers detailed documentation on how to sync your Google Sheets data.

Stitch Google Sheets Documentation

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 →
                        
                          {% 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.

Here’s a look at one of the LookML files for 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 →
                  
                    - 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
                  
                

Facebook Ads and Google Sheets to your data warehouse in minutes

Stitch delivers all your data to the leading data lakes, warehouses, and storage platforms.

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

Asset analysis tools
The best part? Zero engineering or ongoing maintenance. It's a no-brainer for Stitch to handle our data pipelines while our teams stay focused on our core business and growth.

Dave Riggs

Director of Acquisition Marketing, Laurel & Worf

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
Simple setup
Start replicating data in minutes, and never worry about ETL maintenance.
Own your own data infrastructure
Stitch replicates to your warehouse, meaning you’re always in control.
Mature 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.