At a glance
- Level
- Beginner
- Time
- 20 min
Prerequisites
- Read access to your ad accounts, social accounts, GA4 and Search Console
- Read access to your revenue system of record (CRM, shop or billing)
- A Kimo workspace with the Marketing product enabled
- An agreed reporting time zone and currency
You will end up with
One overview page that shows every channel against revenue, spend, MER and CAC, with drill-downs for social, search and paid, and alerts on pacing and tracking gaps.
What does a unified marketing dashboard include?
A unified marketing dashboard is one overview page that shows every channel your team runs (organic social, search, paid media, email and earned media) against the same business outcomes, with a drill-down page per channel. By the end of the day you will have:
- All marketing sources connected and syncing on a schedule.
- A channel mapping table that assigns every campaign to one of about ten channels.
- Three normalized models:
marketing_spend_daily,social_content_dailyandweb_outcomes_daily. - Shared measures for spend, sessions, key events, revenue, MER, CAC and engagement rate.
- An overview page with six blocks and drill-downs for social, search and paid.
- Alerts on spend pacing, tracking gaps and unmapped campaigns.
If you want the reasoning behind each design choice, read the whitepaper One View of Marketing. This guide is the hands-on companion. You can also start from the Marketing command center template, which ships the models and layout described here, and adapt it as you go.
Before you start: access and decisions
Most delays on setup day come from missing permissions, not technical problems. Collect access the day before, and make three decisions in writing so you do not relitigate them mid-build.
Access checklist
- Admin or analyst access to each social account: Instagram professional account, Facebook Page, LinkedIn Page (admin role), X, YouTube channel, Pinterest business account, Threads.
- Read access to ad accounts: Google Ads, Meta Ads, LinkedIn Campaign Manager, TikTok Ads.
- Owner or full user on the Search Console property, and Viewer or higher on the GA4 property.
- API key or OAuth access for your email platform (Mailchimp or Brevo).
- Export or API access to your media monitoring tool.
- Read access to the revenue system of record: CRM (for example HubSpot) or shop backend (for example Shopify), or a read-only database user.
| Decision | Options | Our default |
|---|---|---|
| Reporting time zone and week start | Company HQ time; UTC | HQ time zone, weeks start Monday |
| Revenue system of record | Billing, CRM closed-won, shop orders | Whichever finance reconciles to each month |
| Reporting currency | Single currency; per-market | One currency, converted daily with a dated rate table |
Hour 1: Connect every source
Connect sources in order of business impact: revenue first, then paid media, then analytics and search, then social, email and earned media. Revenue comes first because every other number is eventually checked against it.
- Step 1:
Connect the revenue source
In Connectors, add your CRM or shop. If revenue lives in your own Postgres or MySQL database and should not leave your network, connect it through Kimo Bridge so queries run in place.
- Step 2:
Connect ad platforms with 25 months of history
Add Google Ads, Meta Ads, LinkedIn Ads and TikTok Ads. Request at least 25 months so you can compare year over year and, later, fit a media mix model.
- Step 3:
Connect GA4 and Search Console
Add GA4 and Search Console. The Search Console setup doc explains property types. Search Console retains 16 months of data4Source 4 · Google Analytics HelpConnect Search Console to Google Analyticssupport.google.com, so backfill as soon as possible and keep the history in Kimo from then on.
- Step 4:
Connect social, email and earned media
Add each organic social account, your email platform and your media monitoring export. These sources rarely carry revenue, but they explain changes in branded search and direct traffic.
- Step 5:
Set sync schedules
Daily syncs are enough for most marketing data; ad spend can sync hourly if you pace budgets intraday. See sync schedules for options.
Hour 2: Map every campaign to one channel list
Spend lives in ad platforms, sessions in analytics and revenue in your CRM. The only bridge between them is campaign naming, usually the utm_source, utm_medium and utm_campaign values on your links. Start by agreeing on a short channel list, then write rules that assign every source and medium pair to exactly one channel.
Align your rules with GA4’s default channel groups wherever possible, so your dashboard and GA4 tell the same story. For example, GA4 classifies traffic as Paid Social when the source matches a known social site and the medium matches the regular expression ^(.*cp.*|ppc|retargeting|paid.*)$, and as Email when the source or medium is email, e-mail, e_mail or e mail1Source 1 · Google Analytics Help[GA4] Default channel groupsupport.google.com. Keep your extensions (for example, separating partner newsletters from owned email) explicit.
select
lower(trim(source)) as source,
lower(trim(medium)) as medium,
case
when lower(medium) in ('email', 'e-mail', 'e_mail', 'e mail')
or lower(source) in ('email', 'e-mail', 'e_mail', 'e mail')
then 'Email'
when lower(source) in ('google', 'bing')
and regexp_like(lower(medium), '^(.*cp.*|ppc|retargeting|paid.*)$')
then 'Paid search'
when lower(source) in ('facebook', 'instagram', 'linkedin', 'tiktok', 'x', 'pinterest', 'youtube')
and regexp_like(lower(medium), '^(.*cp.*|ppc|retargeting|paid.*)$')
then 'Paid social'
when lower(medium) = 'organic' then 'Organic search'
when lower(medium) in ('social', 'social-network', 'social-media', 'sm')
or lower(source) in ('facebook', 'instagram', 'linkedin', 'x', 't.co', 'pinterest', 'youtube', 'threads')
then 'Organic social'
when lower(medium) in ('display', 'banner', 'cpm') then 'Display'
when lower(medium) in ('pr', 'press', 'earned') then 'Earned media'
when lower(medium) = 'referral' then 'Referral'
when source = '(direct)' then 'Direct'
else 'Unmapped'
end as channel
from web_sessions_raw
group by 1, 2Note that the rule order matters: the email rule runs first so a newsletter sent from a social scheduling tool is not misclassified, and paid rules run before organic rules so facebook / cpc lands in Paid social. Test the mapping by listing the twenty largest source and medium pairs and checking each one by eye.
Hour 3: Normalize platform metrics
Each platform exports different field names and defines engagement differently. LinkedIn’s organization statistics compute engagement as clicks, likes, comments and shares over impressions2Source 2 · Microsoft Learn (LinkedIn Marketing API)Organization Share Statisticslearn.microsoft.com. Instagram’s media insights count total interactions as likes, saves, comments and shares, and mark impressions as deprecated for media created after July 2, 2024 in favor of views3Source 3 · Meta for DevelopersInstagram Media Insights (API reference)developers.facebook.com. The fix is to import components, rename them to canonical columns and recompute every ratio yourself.
-- Canonical columns: views (delivery), reach, engagements (no clicks), link_clicks
select date, 'instagram' as platform, account_id,
views,
reach,
likes + comments + shares + saves as engagements,
coalesce(link_clicks, 0) as link_clicks
from instagram_media_daily
union all
select date, 'linkedin-pages', organization_id,
impression_count as views,
unique_impressions_count as reach,
like_count + comment_count + share_count as engagements,
click_count as link_clicks
from linkedin_share_stats_daily
union all
select date, 'facebook', page_id,
views, reach,
reactions + comments + shares as engagements,
link_clicks
from facebook_page_posts_daily
union all
select date, 'x', account_id,
impressions, null as reach,
likes + replies + reposts + bookmarks as engagements,
url_clicks
from x_posts_daily
union all
select date, 'youtube', channel_id,
views, null,
likes + comments + shares as engagements,
0
from youtube_channel_dailyTwo details are easy to miss. First, reach is set to null where a platform does not report distinct accounts at the grain you need; a null is honest, a zero is wrong. Second, reach is never summed across platforms in later steps, because each platform de-duplicates only its own audience.
select s.date,
s.platform,
s.campaign_name,
m.channel,
s.spend * fx.rate as spend,
s.impressions,
s.clicks
from (
select date, 'google-ads' as platform, campaign_name, currency, cost as spend, impressions, clicks from google_ads_campaign_daily
union all
select date, 'meta-ads', campaign_name, currency, spend, impressions, clicks from meta_ads_campaign_daily
union all
select date, 'linkedin-ads', campaign_name, currency, cost_in_local_currency, impressions, clicks from linkedin_ads_campaign_daily
union all
select date, 'tiktok-ads', campaign_name, currency, spend, impressions, clicks from tiktok_ads_campaign_daily
) s
left join fx_rates_daily fx
on fx.date = s.date and fx.from_currency = s.currency and fx.to_currency = 'USD'
left join campaign_channel_map m
on m.campaign_name = lower(s.campaign_name)The third model, web_outcomes_daily, joins GA4 sessions and key events by date, source and medium to the channel map, and adds orders or pipeline from the revenue system by the same keys. If you export GA4 to BigQuery, use the daily tables rather than the intraday streaming tables for attribution fields; Google notes that streaming export omits user-attribution fields (campaign, source, medium) for new users, and that user-attribution data for existing users needs about 24 hours to fully process5Source 5 · Google Analytics Help[GA4] BigQuery Exportsupport.google.com.
Hour 4: Define measures once
Measures are the numbers people will quote. Define each once, with a description and an owner, so the overview, the drill-downs and every Ask Kimo answer use the same formula. Eight measures cover most needs.
model: marketing_overview
owner: marketing-ops
grain: date, channel
measures:
spend:
type: sum
sql: spend
format: currency
description: Media spend in USD, all paid platforms
sessions:
type: sum
sql: sessions
key_events:
type: sum
sql: key_events
description: Sign-ups and demo requests (GA4 key events)
revenue:
type: sum
sql: revenue
format: currency
description: Net revenue from the system of record, refunds removed
new_customers:
type: count_distinct
sql: customer_id
filters: [is_first_order = true]
mer:
type: ratio
numerator: revenue
denominator: spend
format: multiplier
description: Total revenue / total marketing spend, all channels
cac:
type: ratio
numerator: spend
denominator: new_customers
format: currency
engagement_rate:
type: ratio
numerator: engagements
denominator: views
format: percent
description: Reactions, comments, shares, saves over views. Clicks excludedRead the glossary entries for MER, CAC and engagement rate if your team uses different variants. The important part is not which variant you choose but that you choose one and write it into the measure description. If paid CAC and blended CAC both matter, define both with distinct names.
Hour 5: Build the overview and drill-downs
Build one overview page that answers "what did marketing produce this week, and at what cost?" in under a minute, then one drill-down per channel family for depth. Use the same date filter and comparison period on every page.
| Block | Tiles | Question it answers |
|---|---|---|
| Outcome strip | Revenue, new customers, spend, MER, CAC (vs prior period and target) | Are we on track? |
| Channel table | Spend, sessions, key events, revenue by channel, plus Unmapped | Where did results come from? |
| Paid efficiency | Spend and CPA by platform; pacing vs budget | Is paid spend working and on pace? |
| Organic social | Views, reach and engagement rate per network | Is content resonating? |
| Search | Search Console clicks and impressions; GA4 organic sessions | Is search demand growing? |
| Earned and email | Mentions, share of voice, email clicks | Are we being talked about and read? |
- Organic search
- Paid
- Organic social
For drill-downs, the social media overview and SEO funnel templates are ready-made. The paid drill-down needs only a campaign table with spend, clicks, key events and CPA, sortable by spend. You can see the finished result on simulated data in the command center.
Hour 6: Add alerts and share
Alerts turn the dashboard from something people check into something that tells them when to look. Start with four, each routed to the person who can act.
| Alert | Condition | Owner |
|---|---|---|
| Spend pacing | Month-to-date spend > 110% of the pro-rated budget | Paid lead |
| Tracking gap | Sessions from any channel drop > 40% day over day | Marketing ops |
| Unmapped traffic | Unmapped sessions > 5% of total for the week | Marketing ops |
| Sync freshness | Any source older than 36 hours | Dashboard owner |
Configure them in Alerts (see the alerts docs), then share the overview with a scheduled weekly snapshot to the team channel. Pin the definitions page so newcomers can see how each number is built.
How do you check the numbers before sharing?
Reconcile three totals before anyone outside the build team sees the dashboard. Small gaps are expected; large ones point to a mapping or currency bug.
| Check | Compare against | Acceptable gap | Common cause of larger gaps |
|---|---|---|---|
| Total spend | Platform invoices for last full month | Under 2% | Currency conversion; missing ad account |
| Sessions | GA4 Traffic acquisition report, same dates | Under 1% | Time zone mismatch; filters in GA4 views |
| Revenue | Finance month-end figure | Under 1% | Refunds, taxes or test orders included |
| Search clicks vs organic sessions | Trend only | Lines move together | Consent, bot filtering, other search engines in GA4 |
Search Console clicks and GA4 organic sessions will never match exactly: Search Console counts clicks on Google, while GA4 counts sessions only when the tag fires and includes other search engines in Organic Search. Our guide to SEO reporting with Search Console and GA4 covers the join in detail.
Troubleshooting
Paid social shows up as organic social
Your ad links are missing a paid medium, or the medium value does not match the paid pattern. Check the Meta and LinkedIn URL parameters fields, and make sure the medium is something like paid_social or cpc, not social.
Google Ads traffic appears as (not set)
Check that auto-tagging is enabled and that the Google Ads account is linked to the GA4 property. When both auto-tagging and manual UTM tags are present, GA4 prioritizes auto-tagging7Source 7 · Google Ads HelpAbout auto-taggingsupport.google.com, so manual tags on Google Ads links are optional.
The sum of channel revenue is larger than total revenue
You are summing platform-attributed revenue. On the overview, channel revenue must come from one attribution rule applied to orders in your system of record. Keep platform-reported conversions on the paid drill-down only.
Engagement rate jumped overnight for one network
Check for a platform definition change, such as a metric being renamed or deprecated. Add an annotation with the effective date, and if possible keep both the old and new series for a few weeks.
Sources
7 references- [GA4] Default channel group (opens in a new tab)Google Analytics Helpsupport.google.com
Rules for Paid Social, Organic Social, Email and other default channels.
- Organization Share Statistics (opens in a new tab)Microsoft Learn (LinkedIn Marketing API)learn.microsoft.com
Engagement = organic clicks, likes, comments and shares over impressions; unique impressions field.
- Instagram Media Insights (API reference) (opens in a new tab)Meta for Developersdevelopers.facebook.com
Views, reach and total_interactions; impressions deprecated for media created after July 2, 2024.
- Connect Search Console to Google Analytics (opens in a new tab)Google Analytics Helpsupport.google.com
Search Console keeps 16 months of data; data appears 48 hours after collection.
- [GA4] BigQuery Export (opens in a new tab)Google Analytics Helpsupport.google.com
Daily vs streaming export; streaming omits user-attribution fields for new users; ~24 hours to process attribution data.
- Mail Privacy Protection & Privacy (opens in a new tab)Appleapple.com
Remote content downloaded in the background by default.
- About auto-tagging (opens in a new tab)Google Ads Helpsupport.google.com
GCLID auto-tagging; prioritized over manual tagging in GA4.
External sources were accessed at the time of writing. Kimo product details, customers and figures in examples are illustrative unless a source is cited.
Mark as done
0 of 10 sections done
Frequently asked questions
Can I really build a unified marketing dashboard in one day?
Yes, if access is collected beforehand and you start from a template. The day covers connection, mapping, normalization, measures, the overview and alerts. Expect a second, shorter session the following week to fix mapping gaps the first real data reveals.
Which metrics belong on the overview page?
Revenue or pipeline, new customers, spend, MER and CAC at the top; then spend, sessions, key events and revenue by channel. Platform-specific metrics such as reach and engagement rate belong in channel blocks, not in cross-channel totals.
Should I use GA4 channel groups or my own?
Start from GA4’s default channel group rules so your numbers agree with GA4, then add explicit extensions such as Earned media or Partner newsletters. Document every rule you add.
How do I handle multiple currencies?
Convert at transaction or daily level using a dated exchange-rate table, in the model rather than in charts. Keep the original currency column so finance can audit the conversion.
Do I need a data warehouse first?
No. Kimo syncs sources into its managed cloud by default, and Kimo Bridge can query databases that must stay on your own servers. If you already have a warehouse such as BigQuery, you can connect it and model on top of it.
Skip the setup — start from a working version.
Marketing command center: Every channel on one screen: social, SEO, paid, email and media.


