{"id":5866,"date":"2026-08-21T16:33:31","date_gmt":"2026-08-21T14:33:31","guid":{"rendered":"https:\/\/hgency.be\/?p=5866"},"modified":"2026-08-23T15:57:44","modified_gmt":"2026-08-23T13:57:44","slug":"multi-platform-ads-dashboard-guide","status":"publish","type":"post","link":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/","title":{"rendered":"Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)"},"content":{"rendered":"<h1>Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)<\/h1>\n<p><img decoding=\"async\" class=\"alignnone wp-image-5847 size-large\" src=\"http:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image-1024x536.png\" alt=\"mise en place d'un dashboard marketing\" width=\"1024\" height=\"536\" srcset=\"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image-1024x536.png 1024w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image-300x157.png 300w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#The_goal_a_centralized_dashboard_always_up_to_date_and_accessible_anywhere\" >The goal: a centralized dashboard, always up to date and accessible anywhere<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#Why_Windsorai_BigQuery_and_Looker_Studio\" >Why Windsor.ai, BigQuery, and Looker Studio<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#Etape_1_connecter_les_sources_avec_Windsorai\" >\u00c9tape 1 : connecter les sources avec Windsor.ai<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#Step_2_Structuring_the_data_in_BigQuery\" >Step 2: Structuring the data in BigQuery<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#Step_3_Creating_the_Looker_Studio_dashboard\" >Step 3: Creating the Looker Studio dashboard<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#Results_what_this_changes_day_to_day\" >Results: what this changes day to day<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#How_much_does_a_centralized_marketing_dashboard_cost\" >How much does a centralized marketing dashboard cost<\/a><\/li><\/ul><\/nav><\/div>\n\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"The_goal_a_centralized_dashboard_always_up_to_date_and_accessible_anywhere\"><\/span>The goal: a centralized dashboard, always up to date and accessible anywhere<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p dir=\"ltr\">Managing several clients across Google Ads, Meta, and Microsoft, I was spending a lot of time juggling between interfaces and compiling exports by hand. I needed a single place to bring together the results of all campaigns, across every channel.<\/p>\n<p dir=\"ltr\">The goal was twofold: save time on reporting and, more importantly, spot performance drops or spikes faster \u2014 rather than waiting for a monthly export to realize a campaign had fallen off.<\/p>\n<p dir=\"ltr\">So I decided to build a dashboard that updates automatically and stays accessible at all times, whether for a client check-in or day-to-day monitoring.<\/p>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"Why_Windsorai_BigQuery_and_Looker_Studio\"><\/span>Why Windsor.ai, BigQuery, and Looker Studio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p dir=\"ltr\">For this type of project, several approaches were possible, with three choices to make: how to import the data, where to store it, and which tool to display it with. I settled on Windsor.ai for the import, BigQuery for storage, and Looker Studio for the dashboard.<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/windsor.ai\/\"><strong>Windsor.ai as the connector<\/strong><\/a>: unlike Looker Studio&#8217;s native connectors, Windsor centralizes multiple platforms (in my case: Google Ads, Meta, Microsoft, GA4, LinkedIn) into a consistent format, without having to manage a separate integration for each source. That&#8217;s a significant time saver once you go beyond 2-3 platforms.<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/cloud.google.com\/\"><strong>BigQuery as the intermediate layer<\/strong><\/a>: connecting Windsor directly to Looker Studio is possible, but it severely limits what you can do with the data \u2014 no transformation, no proper historization, no business logic (segmentation, calculated KPIs). By routing through BigQuery, raw data is stored, transformed via SQL views, and the dashboard simply displays an already-clean result. It&#8217;s also what makes it possible to manage multiple clients with the same architecture, just by duplicating the views.<\/p>\n<p dir=\"ltr\"><a href=\"https:\/\/datastudio.google.com\/\"><strong>Looker Studio to display the data<\/strong><\/a>: free, native to the Google ecosystem, and sufficient for most client reporting needs \u2014 in my case, I don&#8217;t need a heavier BI tool like Power BI.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Etape_1_connecter_les_sources_avec_Windsorai\"><\/span>\u00c9tape 1 : connecter les sources avec Windsor.ai<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 dir=\"ltr\">Creating the dataset and tables in BigQuery<\/h3>\n<p dir=\"ltr\">Before importing data from Windsor, the destination needs to exist on the Google Cloud side. This involves three steps:<\/p>\n<ol dir=\"ltr\">\n<li><strong>Create a BigQuery project<\/strong> (or use an existing one) in the Google Cloud console, with the BigQuery API enabled.<\/li>\n<li><strong>Create a dedicated dataset<\/strong> \u2014 I named mine <code>ads_data<\/code> \u2014 to hold all the tables related to the Windsor import. If you manage several clients, I&#8217;d recommend creating one dataset per client to keep a clean structure.<\/li>\n<li><strong>Let Windsor create the tables automatically on the first import<\/strong>: once the dataset is set in Windsor&#8217;s configuration, the tool generates the raw table itself and populates it on every sync, with no need to define the schema manually.<\/li>\n<\/ol>\n<p><img decoding=\"async\" class=\"alignnone wp-image-5836 size-large\" src=\"http:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/creation-table-big-query-final-1024x493.jpg\" alt=\"Creation ensemble de donn\u00e9es Big Querry\" width=\"1024\" height=\"493\" srcset=\"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/creation-table-big-query-final-1024x493.jpg 1024w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/creation-table-big-query-final-300x144.jpg 300w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/creation-table-big-query-final.jpg 1357w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p dir=\"ltr\">This raw table, once populated, is what serves as the starting point for structuring the data into views (<code>ads_segmented<\/code>, <code>ads_kpis<\/code>&#8230;), covered in detail in the next step.<\/p>\n<h3 dir=\"ltr\">Setting up the Windsor connectors<\/h3>\n<p dir=\"ltr\">Once your Windsor.ai account is created, connecting the sources happens platform by platform: you authorize access to the various ad and analytics accounts through standard OAuth authentication. Windsor then lets you choose which fields to import (impressions, clicks, cost, conversions&#8230;) and how often to sync.<\/p>\n<p dir=\"ltr\">For my reports, I import by default: date, source, spend, impressions, clicks, conversions, campaign ID, and campaign labels. With these KPIs, I have what I need for weekly tracking. Calculated metrics (CPC, CPA, and conversion rate) are computed directly in Looker Studio.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5840 alignnone\" src=\"http:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/import-windsor-final.jpg\" alt=\"Cr\u00e9ation tache import Windsor.ai\" width=\"881\" height=\"887\" srcset=\"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/import-windsor-final.jpg 881w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/import-windsor-final-298x300.jpg 298w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/import-windsor-final-150x150.jpg 150w\" sizes=\"(max-width: 881px) 100vw, 881px\" \/><\/p>\n<p dir=\"ltr\">Once the connectors are configured, the data flows automatically into a single table, ready to be used in BigQuery.<\/p>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"Step_2_Structuring_the_data_in_BigQuery\"><\/span>Step 2: Structuring the data in BigQuery<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p dir=\"ltr\">Data imported from Windsor is first stored in ads_raw. I then pass it through three successive views to enrich the data:<\/p>\n<ul dir=\"ltr\">\n<li><strong>ads_segmented<\/strong> enriches each raw row with business segmentation \u2014 language, campaign type, site \u2014 extracted from campaign labels, without changing the level of detail.<\/li>\n<li><strong>ads_kpis<\/strong> aggregates this enriched data by day, source, and segment, moving from row-by-row detail to consolidated totals.<\/li>\n<li><strong>ads_suivi_unpivot<\/strong> recalculates the totals over rolling periods (7 days, 14 days, 28 days, last month, last 6 months \u2014 the reference periods for my reports) and restructures them into rows so Looker Studio can display them easily.<\/li>\n<\/ul>\n<p dir=\"ltr\">Each view builds on the previous one: the chain is linear, which makes it possible to debug it step by step rather than having to manage everything in a single, complex query.<\/p>\n<h3 dir=\"ltr\">The raw table (ads_raw)<\/h3>\n<p dir=\"ltr\">This is the table that Windsor populates automatically on every sync \u2014 one row per day, per campaign, per platform, with the raw fields defined in the connector&#8217;s configuration.<\/p>\n<h3 dir=\"ltr\">Segmentation by channel\/campaign (ads_segmented)<\/h3>\n<p dir=\"ltr\">In this view, I enrich each row with segmentation extracted from campaign labels. I use the labels to categorize my campaigns by language, campaign type, keywords, and so on.<\/p>\n<pre><code class=\"language-sql\">\r\nCREATE VIEW `mon_projet.mon_client.ads_segmented` AS\r\nSELECT\r\n  date,\r\n  source,\r\n  campaign_id,\r\n  campaign,\r\n  COALESCE(cost, CAST(spend AS FLOAT64)) AS cost,\r\n  CAST(impressions AS FLOAT64) AS impressions,\r\n  CAST(clicks AS FLOAT64) AS clicks,\r\n  CAST(conversions AS FLOAT64) AS conversions,\r\n  REGEXP_EXTRACT(campaign_labels, r'lang:([a-z]+)') AS langue,\r\n  REGEXP_EXTRACT(campaign_labels, r'type:([a-z]+)') AS type_campagne,\r\n  REGEXP_EXTRACT(campaign_labels, r'site:([a-z0-9]+)') AS site\r\nFROM `mon_projet.mon_client.ads_raw`\r\n<\/code><\/pre>\n<p dir=\"ltr\">Two points worth watching here, based on experience:<\/p>\n<ul dir=\"ltr\">\n<li><strong>Cost<\/strong>: depending on the platform, Windsor may route spend to spend rather than cost \u2014 COALESCE prevents data from being lost.<\/li>\n<li><strong>Typing<\/strong>: imported fields sometimes come through as BIGNUMERIC, a type Looker Studio doesn&#8217;t recognize as a metric. A CAST(&#8230; AS FLOAT64) at this stage fixes the problem for good.<\/li>\n<\/ul>\n<h3 dir=\"ltr\">Consolidated KPIs view (ads_kpis)<\/h3>\n<p dir=\"ltr\">This view aggregates ads_segmented by day, source, and segment:<\/p>\n<pre><code class=\"language-sql\">\r\nCREATE VIEW `mon_projet.mon_client.ads_kpis` AS\r\nSELECT\r\n  date,\r\n  source,\r\n  langue,\r\n  type_campagne,\r\n  site,\r\n  SUM(impressions) AS impressions,\r\n  SUM(clicks) AS clicks,\r\n  SUM(cost) AS cost,\r\n  SUM(conversions) AS conversions\r\nFROM `mon_projet.mon_client.ads_segmented`\r\nGROUP BY date, source, langue, type_campagne, site\r\n<\/code><\/pre>\n<p dir=\"ltr\">Metrics like CPC or CPA are deliberately not calculated here: computing them directly in Looker Studio (via SUM(cost)\/SUM(clicks)) prevents them from being skewed by aggregation \u2014 a ratio pre-calculated upstream ends up being summed rather than recalculated once it&#8217;s displayed across multiple rows.<\/p>\n<h3 dir=\"ltr\">Unpivoting for time-based reporting (ads_suivi_unpivot)<\/h3>\n<p dir=\"ltr\">Final step: recalculate the totals over rolling periods, then transform them from columns into rows so Looker Studio can work with them easily.<\/p>\n<pre><code class=\"language-sql\">\r\nCREATE VIEW `mon_projet.mon_client.ads_suivi_unpivot` AS\r\nWITH base AS (\r\n  SELECT\r\n    source, langue, type_campagne, site,\r\n    SUM(IF(date &gt;= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY), cost, 0)) AS cost_7d,\r\n    SUM(IF(date &gt;= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY), conversions, 0)) AS conversions_7d,\r\n    SUM(IF(date &gt;= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)\r\n           AND date &lt; DATE_TRUNC(CURRENT_DATE(), MONTH), cost, 0)) AS cost_m1, SUM(IF(date &gt;= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)\r\n           AND date &lt; DATE_TRUNC(CURRENT_DATE(), MONTH), conversions, 0)) AS conversions_m1\r\n    -- ... m\u00eame logique pour 14j, 28j, 6 mois\r\n  FROM `mon_projet.mon_client.ads_kpis`\r\n  GROUP BY source, langue, type_campagne, site\r\n)\r\nSELECT source, langue, type_campagne, site, periode, cost, conversions\r\nFROM base\r\nUNPIVOT (\r\n  (cost, conversions) FOR periode IN (\r\n    (cost_7d, conversions_7d) AS '7 derniers jours',\r\n    (cost_m1, conversions_m1) AS 'Mois dernier'\r\n    -- ... autres p\u00e9riodes\r\n  )\r\n)\r\n<\/code><\/pre>\n<p dir=\"ltr\">Important point: the &#8220;last month&#8221; period deliberately excludes the current month via DATE_TRUNC \u2014 otherwise, an incomplete month would skew the comparison with previous months.<\/p>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"Step_3_Creating_the_Looker_Studio_dashboard\"><\/span>Step 3: Creating the Looker Studio dashboard<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p dir=\"ltr\">To bring the data into Looker Studio, simply add a new data source via the native BigQuery connector, then select the project, dataset, and view to connect \u2014 typically ads_suivi_unpivot, which already contains the comparison periods ready to use.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5844 alignnone\" src=\"http:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/connecteur-donnees-BigQuery-final.jpg\" alt=\"Ajouter une nouvelle source de donn\u00e9es dans Big Query\" width=\"1122\" height=\"291\" srcset=\"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/connecteur-donnees-BigQuery-final.jpg 1122w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/connecteur-donnees-BigQuery-final-300x78.jpg 300w, https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/connecteur-donnees-BigQuery-final-1024x266.jpg 1024w\" sizes=\"(max-width: 1122px) 100vw, 1122px\" \/><\/p>\n<h3 dir=\"ltr\">Periods already prepared, thanks to ads_suivi_unpivot<\/h3>\n<p dir=\"ltr\">All the period calculation logic \u2014 last 7 days, last 14 days, last 28 days, last month, last 6 months \u2014 has already been prepared in step 2, in the ads_suivi_unpivot view. That means there&#8217;s nothing left to calculate on the Looker Studio side: you just need to filter or group by the periode field to display the desired comparison, without setting up a custom date range for every chart.<\/p>\n<p dir=\"ltr\">This is what makes it possible, for example, to build a table comparing the last 7 days to last month side by side, simply by selecting the two corresponding periode values \u2014 without writing any date logic in Looker Studio itself.<\/p>\n<h3 dir=\"ltr\">Calculating metrics with SUM() instead of pre-calculating them<\/h3>\n<p dir=\"ltr\">Metrics like CPC, CPA, or conversion rate are calculated directly in Looker Studio using calculated fields, for example:<\/p>\n<p style=\"padding-left: 40px;\"><em>CPC = SUM(cost) \/ SUM(clicks)<\/em><\/p>\n<p dir=\"ltr\">This choice isn&#8217;t trivial: a metric pre-calculated in BigQuery (like an already-divided CPA) ends up being summed rather than recalculated once it&#8217;s displayed across multiple aggregated rows \u2014 and the resulting total no longer makes sense. Using SUM() on the raw values (cost, clicks, conversions) inside the calculated field guarantees the ratio stays correct, no matter what level of aggregation is displayed.<\/p>\n<h3 dir=\"ltr\">Building tables and charts<\/h3>\n<p dir=\"ltr\">From here, you have everything you need to build your tracking tables and charts to check the performance of each campaign or campaign segment in real time. Here are a few examples of tables I check daily:<\/p>\n<ul dir=\"ltr\">\n<li><strong>CPA trend over time<\/strong> \u2014 a line chart across the different rolling periods (7d, 14d, 28d), to quickly spot a drift<\/li>\n<li><strong>Budget split by platform<\/strong> \u2014 a pie chart or stacked bar chart on source, to see at a glance where the spend is going<\/li>\n<li><strong>Cross-tab by segment<\/strong> \u2014 langue or type_campagne as the dimension, with CPC\/CPA\/conversion rate as calculated metrics, to compare segments against each other<\/li>\n<\/ul>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"Results_what_this_changes_day_to_day\"><\/span>Results: what this changes day to day<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3 dir=\"ltr\">Time saved on client reporting<\/h3>\n<p dir=\"ltr\">What used to require multiple manual exports per platform and per client now comes down to a dashboard that&#8217;s always up to date, with no manual work involved. The time freed up gets reinvested in analyzing campaigns rather than compiling them.<\/p>\n<h3 dir=\"ltr\">Faster detection of tracking anomalies<\/h3>\n<p dir=\"ltr\">With data centralized and compared across several rolling periods, an anomaly \u2014 a campaign that drops off, an unusual cost spike, a conversion that disappears \u2014 stands out at a glance, rather than being discovered in a monthly export.<\/p>\n<h3 dir=\"ltr\">A custom report, accessible directly by the client<\/h3>\n<p dir=\"ltr\">This architecture also makes it possible to build, from the same views, a dedicated Looker Studio report shared directly with the client \u2014 with their own filters, their own segments, without giving them access to the ad accounts or to BigQuery. The client keeps an autonomous, up-to-date view of their performance, without depending on a manually sent report.<\/p>\n<h2 dir=\"ltr\"><span class=\"ez-toc-section\" id=\"How_much_does_a_centralized_marketing_dashboard_cost\"><\/span>How much does a centralized marketing dashboard cost<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p dir=\"ltr\">On this stack, the only real cost is Windsor.ai \u2014 BigQuery and Looker Studio stay free given the data volumes involved here (a few million rows per month, well within BigQuery&#8217;s free quotas).<\/p>\n<p dir=\"ltr\">For Windsor, the price mainly depends on the number of ad accounts to connect. In my case, managing around fifteen clients with several accounts each, I&#8217;m on a higher-tier plan, billed annually. But for a single company centralizing its own campaigns (Google Ads, Meta, Microsoft&#8230;), the base plan at \u20ac25 is more than enough. It covers 75 accounts across 3 different sources, which leaves plenty of room even with several platforms and several accounts per platform.<\/p>\n<p dir=\"ltr\">That&#8217;s the full stack \u2014 adapt it to your own platforms and needs. Happy reporting!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide) The goal: a centralized dashboard, always up to date and accessible anywhere Managing several clients across Google Ads, Meta, and Microsoft, I was spending a lot of time juggling between interfaces and compiling exports by hand. I needed a single place to&#8230;<\/p>\n","protected":false},"author":1,"featured_media":5848,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[128],"tags":[],"class_list":["post-5866","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-analytics"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Centralized Ads Dashboard with Windsor.ai &amp; BigQuery<\/title>\n<meta name=\"description\" content=\"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Centralized Ads Dashboard with Windsor.ai &amp; BigQuery\" \/>\n<meta property=\"og:description\" content=\"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"HGENCY\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:33:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-23T13:57:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hugues Ligot\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hugues Ligot\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/\"},\"author\":{\"name\":\"Hugues Ligot\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#\\\/schema\\\/person\\\/c9517c58a1f9246892e389fd8d0abcb4\"},\"headline\":\"Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)\",\"datePublished\":\"2026-08-21T14:33:31+00:00\",\"dateModified\":\"2026-08-23T13:57:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/\"},\"wordCount\":1640,\"publisher\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/featured-image.png\",\"articleSection\":[\"Web Analytics\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/\",\"url\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/\",\"name\":\"Centralized Ads Dashboard with Windsor.ai & BigQuery\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/featured-image.png\",\"datePublished\":\"2026-08-21T14:33:31+00:00\",\"dateModified\":\"2026-08-23T13:57:44+00:00\",\"description\":\"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/featured-image.png\",\"contentUrl\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/featured-image.png\",\"width\":1200,\"height\":628,\"caption\":\"mise en place d'un dashboard marketing\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/web-analytics\\\/multi-platform-ads-dashboard-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/hgency.be\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/hgency.be\\\/en\\\/\",\"name\":\"Hgency\",\"description\":\"Performance based marketing\",\"publisher\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#organization\"},\"alternateName\":\"Hugues Ligot\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hgency.be\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#organization\",\"name\":\"Hgency\",\"alternateName\":\"Hugues Ligot\",\"url\":\"https:\\\/\\\/hgency.be\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/logo-carre-696.png\",\"contentUrl\":\"https:\\\/\\\/hgency.be\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/logo-carre-696.png\",\"width\":696,\"height\":696,\"caption\":\"Hgency\"},\"image\":{\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/110095585\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/hgency.be\\\/en\\\/#\\\/schema\\\/person\\\/c9517c58a1f9246892e389fd8d0abcb4\",\"name\":\"Hugues Ligot\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g\",\"caption\":\"Hugues Ligot\"},\"sameAs\":[\"http:\\\/\\\/hgency.be\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/hugueslgt\\\/\"],\"url\":\"https:\\\/\\\/hgency.be\\\/en\\\/blog\\\/author\\\/hugueslgt\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Centralized Ads Dashboard with Windsor.ai & BigQuery","description":"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/","og_locale":"en_US","og_type":"article","og_title":"Centralized Ads Dashboard with Windsor.ai & BigQuery","og_description":"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included","og_url":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/","og_site_name":"HGENCY","article_published_time":"2026-08-21T14:33:31+00:00","article_modified_time":"2026-08-23T13:57:44+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png","type":"image\/png"}],"author":"Hugues Ligot","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Hugues Ligot","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#article","isPartOf":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/"},"author":{"name":"Hugues Ligot","@id":"https:\/\/hgency.be\/en\/#\/schema\/person\/c9517c58a1f9246892e389fd8d0abcb4"},"headline":"Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)","datePublished":"2026-08-21T14:33:31+00:00","dateModified":"2026-08-23T13:57:44+00:00","mainEntityOfPage":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/"},"wordCount":1640,"publisher":{"@id":"https:\/\/hgency.be\/en\/#organization"},"image":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png","articleSection":["Web Analytics"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/","url":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/","name":"Centralized Ads Dashboard with Windsor.ai & BigQuery","isPartOf":{"@id":"https:\/\/hgency.be\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#primaryimage"},"image":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png","datePublished":"2026-08-21T14:33:31+00:00","dateModified":"2026-08-23T13:57:44+00:00","description":"How to centralize Google Ads, Meta, and Microsoft campaigns into one dashboard with Windsor.ai and BigQuery. Full guide with SQL queries included","breadcrumb":{"@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#primaryimage","url":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png","contentUrl":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/08\/featured-image.png","width":1200,"height":628,"caption":"mise en place d'un dashboard marketing"},{"@type":"BreadcrumbList","@id":"https:\/\/hgency.be\/en\/blog\/web-analytics\/multi-platform-ads-dashboard-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/hgency.be\/en\/"},{"@type":"ListItem","position":2,"name":"Centralize Your Google Ads, Meta, and Microsoft Campaigns in Looker Studio (Complete Guide)"}]},{"@type":"WebSite","@id":"https:\/\/hgency.be\/en\/#website","url":"https:\/\/hgency.be\/en\/","name":"Hgency","description":"Performance based marketing","publisher":{"@id":"https:\/\/hgency.be\/en\/#organization"},"alternateName":"Hugues Ligot","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hgency.be\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/hgency.be\/en\/#organization","name":"Hgency","alternateName":"Hugues Ligot","url":"https:\/\/hgency.be\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hgency.be\/en\/#\/schema\/logo\/image\/","url":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/07\/logo-carre-696.png","contentUrl":"https:\/\/hgency.be\/wp-content\/uploads\/2026\/07\/logo-carre-696.png","width":696,"height":696,"caption":"Hgency"},"image":{"@id":"https:\/\/hgency.be\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/110095585"]},{"@type":"Person","@id":"https:\/\/hgency.be\/en\/#\/schema\/person\/c9517c58a1f9246892e389fd8d0abcb4","name":"Hugues Ligot","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e0ac9d853e9b3b52810e8c101256d8278f0774a7730a2a4d75ac2feb47fe122f?s=96&d=mm&r=g","caption":"Hugues Ligot"},"sameAs":["http:\/\/hgency.be","https:\/\/www.linkedin.com\/in\/hugueslgt\/"],"url":"https:\/\/hgency.be\/en\/blog\/author\/hugueslgt\/"}]}},"_links":{"self":[{"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/posts\/5866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/comments?post=5866"}],"version-history":[{"count":4,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/posts\/5866\/revisions"}],"predecessor-version":[{"id":5871,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/posts\/5866\/revisions\/5871"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/media\/5848"}],"wp:attachment":[{"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/media?parent=5866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/categories?post=5866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hgency.be\/en\/wp-json\/wp\/v2\/tags?post=5866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}