Divider

Two powerful tools, together

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

  • Facebook Ads

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

  • SendGrid

SendGrid is a platform for delivering transactional and marketing emails

Stitch offers detailed documentation on how to sync your SendGrid data.

Stitch SendGrid Documentation

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

Facebook Ads and SendGrid 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

Analysis Tools Asset
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

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

Integrate your Facebook Ads and SendGrid data today

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

Set up in minutesUnlimited data volume during trial

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.