Analistable

How to build a cross-channel marketing report from CSV exports

By the Analistable team · Updated · 5 min read

Export each channel at the same grain (one row per day per campaign), rename columns to a shared schema — date, channel, campaign, spend, clicks, conversions — convert dates and currencies, then stack the files into one table with a channel column. Every chart and total in the report comes from that one table, so channels are always measured the same way.

Part of our guide: How to answer questions across multiple spreadsheets

Start with the grain, not the dashboard

A cross-channel report fails when one export is daily, another weekly and a third is a single total for the month. Before downloading anything, choose the grain every channel can supply. For most teams that is one row per day per campaign. You can always roll days up into weeks or months later; you can't split a monthly total back into days.

Set the same date range in every platform and, where the option exists, the same time zone. Ad platforms report in the account's time zone, so a UK account and a US account will disagree about which day a late-evening click belongs to.

Map each export to one schema

Column names vary by platform and change over time, so treat the names below as typical rather than guaranteed and check your own headers:

Typical export headers mapped to the shared schema
Shared columnGoogle AdsMeta AdsEmail (ESP)
dateDayReporting startsSend date
campaignCampaignCampaign nameCampaign / subject
spendCostAmount spent (GBP)— (fixed cost, add manually)
clicksClicksLink clicksUnique clicks
conversionsConversionsResults— (from analytics)

Keep a small mapping table like this in the workbook itself. When a platform renames a column, you update the mapping, not every formula. Platform-specific details for paid social and search are covered in combining Meta, TikTok and Google Ads spend.

Clean the columns that always cause trouble

  • Dates: some exports write 10/09/2026, others 2026-10-09 or “Oct 9, 2026”. Convert all of them to real dates. In Excel, check a few with =ISNUMBER(A2); text dates return FALSE.
  • Currency symbols and thousands separators: “£1,204.50” is text until you strip the symbol and comma.
  • Totals rows: many exports add a “Total” line at the bottom. Delete it, or it will double every sum.
  • Empty conversions: a dash or blank should become 0 only if the platform tracked conversions for that campaign; otherwise leave it blank so averages aren't dragged down.
  • Campaign names: trim spaces and keep a consistent case so “Brand_UK” and “brand_uk ” match.

Stack the channels

Once every file has the same columns in the same order, add a channel column and stack them. In Power Query, use Append Queries (see Power Query append). In SQL, it's a UNION ALL:

SELECT 'Google Ads' AS channel, "Day" AS date, "Campaign" AS campaign,
       "Cost" AS spend, "Clicks" AS clicks, "Conversions" AS conversions
FROM google_ads
UNION ALL
SELECT 'Meta', "Reporting starts", "Campaign name",
       "Amount spent (GBP)", "Link clicks", "Results"
FROM meta_ads
UNION ALL
SELECT 'Email', "Send date", "Campaign", 0, "Unique clicks", NULL
FROM email;

Worked example: one week, three channels

Stacked rows rolled up by channel, 29 Sep – 5 Oct 2026
channelspendclicksconversionscost per conversion
Google Ads2450310098£25.00
Meta1820455052£35.00
Email0124031—
Total42708890181£23.59

Google Ads: £2,450 / 98 = £25.00. Meta: £1,820 / 52 = £35.00. The blended figure (£4,270 / 181 = £23.59) looks better than either paid channel because email conversions carry no media cost. Show blended and paid-only figures side by side so nobody reads the blend as a paid-media result.

Platform conversions are each platform's own claim, using its own attribution window. Adding them up usually over-counts, because one customer can be claimed by two platforms. For a de-duplicated view, use conversions from your analytics or CRM — see merging GA4 data with ad cost data.

Make it repeatable

  1. Save each week's exports into one folder per channel with the date in the file name.
  2. Point Power Query (or a script) at those folders so new files are picked up on refresh.
  3. Keep the mapping and clean-up steps in the query, not in manual edits.
  4. Build the report from the stacked table only.

Analistable can take the same CSV exports, read them into an in-browser database, and answer questions such as “cost per conversion by channel by week” or “which campaigns spent money with zero conversions” without you writing the UNION. It doesn't change your files; it reads them. The cross-spreadsheet questions guide has more examples, and combining data from multiple sources covers the general method.

Decide what the report must answer

A cross-channel report is easier to build and to read when it answers a short, fixed list of questions. Agree those first with whoever reads it, because each question implies a column you need in every export:

Questions and the columns they need
QuestionNeeds
How much did each channel spend this week?date, channel, spend
Which campaigns spent with no conversions?campaign, spend, conversions
Is cost per conversion rising?date, spend, conversions over several weeks
Which channel drives the most site sessions?sessions from analytics, keyed on campaign

If a question needs a column one platform can't supply, note it on the report rather than filling it with an estimate. A blank cell with a footnote is more honest than a number nobody can trace.

Frequently asked questions

How many weeks of data should the report hold?
Keep at least 13 weeks so you can compare with the same period last quarter, and archive the stacked table monthly so a platform changing its export format doesn't break your history.
Why don't my channel totals match the platform dashboards?
Usually a date or time-zone mismatch, a totals row left in the export, or a filter applied in the platform UI (such as active campaigns only). Re-export with the same date range and no filters and compare again.
Should I use platform conversions or analytics conversions?
Use platform conversions to compare campaigns within one platform, and analytics or CRM conversions to compare channels against each other, because those are counted once per customer.
Can I include organic channels?
Yes. Add rows for organic search or email with zero spend. Keep them out of cost-per-conversion averages so they don't flatter paid performance.

Related guides