This recipe produces a multi-channel marketing operations dashboard that aggregates spend, impressions, clicks, and conversions from all active ad platforms, overlays Google Analytics 4 session data, calculates channel-level ROAS and blended CAC, visualizes attribution across touchpoints, and tracks budget consumption vs plan. [src1]
Which path?
├── User is non-technical AND budget = free
│ └── PATH A: No-Code Free — Google Looker Studio + native connectors
├── User is non-technical AND budget > $0
│ └── PATH B: No-Code Paid — Looker Studio + Supermetrics ($39/mo)
├── User is semi-technical or developer AND budget = free
│ └── PATH C: Code + Free — Metabase + PostgreSQL + n8n
└── User is developer AND budget > $0
└── PATH D: Code + Paid — Retool + PostgreSQL + Airbyte + dbt
| Path | Tools | Cost | Speed | Output Quality |
|---|---|---|---|---|
| A: No-Code Free | Looker Studio + GA4/Ads connectors | $0 | 3-4 hours | Basic — Google channels only |
| B: No-Code Paid | Looker Studio + Supermetrics | $39/mo | 4-6 hours | Good — multi-channel, limited models |
| C: Code + Free | Metabase + PostgreSQL + n8n | $0 | 8-10 hours | Good — full SQL, custom attribution |
| D: Code + Paid | Retool + PostgreSQL + Airbyte + dbt | $50-100/mo | 6-8 hours | Excellent — automated transforms |
Duration: 45-90 minutes · Tool: SQL client
Create unified schema: channel_spend (normalized ad platform data), ga4_events (analytics), marketing_budget (plan), attribution_touches (multi-touch credit), content_performance (organic). [src1]
Verify: All 5 tables created. · If failed: Check PostgreSQL permissions.
Duration: 2-4 hours · Tool: n8n, Airbyte, or custom scripts
Rate limit: Google Ads = 15,000/day, Meta = 200/hour, GA4 = 10,000/day
Configure ETL pipelines for each ad platform: Google Ads (GAQL queries), Meta Marketing API (insights endpoint), GA4 Data API (runReport). Schedule daily sync at 6:00 AM. [src2]
Verify: channel_spend has data for each platform after first sync. · If failed: Check OAuth tokens and API endpoint versions.
Duration: 1-2 hours · Tool: SQL
Create five core queries: channel performance (ROAS, CPA, CTR), budget vs actual, daily spend trend with 7-day moving average, funnel conversion by source/medium, and content performance ranking. [src3]
Verify: Queries return data for each configured platform. · If failed: Check platform name consistency between tables.
Duration: 1-2 hours · Tool: Retool, Metabase, or Looker Studio
Layout: KPI row (total spend, blended ROAS, blended CAC, conversions, budget remaining), channel ROAS chart, budget vs actual chart, daily spend trend, funnel table, content performance table, campaign detail table with date range and platform filters. [src4]
Verify: All sections render. KPI values match platform totals within 5%. · If failed: Check query bindings.
Duration: 30-60 minutes · Tool: n8n + Slack/Email
Alert conditions: channel consumed >80% budget with >10 days remaining, ROAS below 1.0, daily spend >2x 7-day average.
Verify: Test alert fires with sample data. · If failed: Check Slack webhook or SMTP config.
Duration: 30 minutes · Tool: Dashboard platform settings
Share URL, set role-based permissions, configure weekly email subscription.
Verify: Non-admin marketing team member can view dashboard.
{
"output_type": "marketing_operations_dashboard",
"format": "deployed web application",
"components": [
{"name": "channel_performance", "type": "table", "description": "Platform-level spend, ROAS, CPA, CTR"},
{"name": "budget_tracker", "type": "chart", "description": "Budget vs actual spend by channel"},
{"name": "spend_trend", "type": "chart", "description": "Daily spend with 7-day moving average"},
{"name": "funnel_analysis", "type": "table", "description": "Source/medium funnel conversions"},
{"name": "content_ranking", "type": "table", "description": "Top content by conversion rate"},
{"name": "kpi_cards", "type": "metrics", "description": "Total spend, ROAS, CAC, conversions"}
],
"refresh_interval": "60 minutes",
"data_source": "PostgreSQL synced from ad platforms and GA4"
}
| Quality Metric | Minimum Acceptable | Good | Excellent |
|---|---|---|---|
| Data freshness | < 24 hour lag | < 6 hour lag | < 3 hour lag |
| Spend accuracy | Within 10% of platform totals | Within 5% | Within 1% |
| Channel coverage | Google Ads + 1 channel | All paid channels | + organic + referral |
| Attribution model | Last-click only | First + last touch | Multi-touch linear |
| Budget reconciliation | Weekly | Daily | Real-time sync |
If below minimum: Check ETL job logs. Spend discrepancies usually indicate timezone mismatches or currency conversion issues.
| Error | Likely Cause | Recovery Action |
|---|---|---|
| Google Ads API 403 | Developer token not approved | Apply for basic access at Google Ads API Center |
| Meta API 190 (token expired) | System user token expired (60-day) | Generate new long-lived token via Business Settings |
| GA4 API quota exceeded | Too many requests in 24-hour window | Reduce frequency, batch dimensions into fewer requests |
| Spend data missing for platform | ETL job failed or API changed | Check ETL execution logs, verify API versions |
| Attribution double-counting | Overlapping attribution windows | Deduplicate conversion_id in attribution table |
| Budget shows negative remaining | Month boundary date filter issue | Verify DATE_TRUNC alignment with billing cycle |
| Component | Free Tier | Paid Tier | At Scale ($50K+/mo) |
|---|---|---|---|
| Dashboard tool | $0 (Looker Studio / Retool free) | $10/user/mo | $100/mo |
| Database | $0 (Supabase) | $25/mo | $25/mo |
| ETL automation | $0 (n8n self-hosted) | $20/mo | $50/mo |
| Data connector (Supermetrics) | N/A | $39/mo | $99/mo |
| Total | $0 | $55-95/mo | $175-275/mo |
Google's 30-day click attribution and Meta's 7-day click / 1-day view attribution measure different things. Comparing raw ROAS leads to systematically underfunding the platform with the shorter window. [src3]
Set all platforms to the same window (e.g., 7-day click) for comparison, or use a separate multi-touch model that credits all touchpoints consistently.
Each platform claims credit for the same conversion. Summing Google + Meta conversions double-counts 20-40% of actual conversions. [src5]
Attribute conversions from one system (GA4 or your database), then map platform-reported metrics to that baseline.
Use when a startup is spending on two or more marketing channels and needs unified visibility into performance, attribution, and budget consumption. Requires at least one ad platform with active campaigns and GA4 collecting conversion events. This recipe builds the dashboard — for marketing strategy or channel selection, use a playbook card instead.