---
title: "Recipe: Campaign performance report"
description: "TL;DR: On a schedule, this playbook pulls metrics from your ad or analytics platform, computes marketing KPIs and period-over-period deltas (spend, ROAS, CAC, CTR, MQL→SQL), and delivers a readout to Slack or email. Trigger is a schedule; output is a marketing performance summary with the numbers that moved. Unlike a generic scheduled report, this one is framed around marketing KPIs."
canonical_url: "https://docs.ballet.dev/articles/recipe-campaign-performance-report-G5cihP4jhy"
md_url: "https://docs.ballet.dev/articles/recipe-campaign-performance-report-G5cihP4jhy.md"
---
# Recipe: Campaign performance report

**TL;DR:** On a schedule, this playbook pulls metrics from your ad or analytics platform, computes marketing KPIs and period-over-period deltas (spend, ROAS, CAC, CTR, MQL→SQL), and delivers a readout to Slack or email. Trigger is a schedule; output is a marketing performance summary with the numbers that moved. Unlike a generic scheduled report, this one is framed around marketing KPIs.

## Who this is for

Marketing and growth teams who assemble channel performance updates by hand each week.

## What you'll need

* **Connectors:** An ad/analytics platform (Google Ads, Meta Ads, or GA4) via HTTP or MCP; Slack (or email for delivery).
* **Secrets:** Platform API key/OAuth token, Slack token (stored in Secrets — never hardcoded).
* **Trigger:** Schedule — for example, weekday mornings or Monday weekly.

## How to build it with Ask Ballet

1. Open the Console on Home.
2. Paste the prompt below; set your platform, metrics, and delivery channel.
3. Review the proposed plan, confirm, and let Ballet build it.
4. Connect your ad/analytics platform and Slack when prompted.

```text
Build a playbook that runs every Monday at 9am. Pull last week's campaign metrics
from Google Ads (spend, impressions, clicks, conversions, conversion value) and
compare them to the prior week. Compute CTR, CAC, ROAS, and the week-over-week change
for each. Write a short readout that calls out the top movers and any campaigns that
spiked or dropped, and post it to #marketing-metrics in Slack and email it to the
marketing lead.
```

## What the playbook does

1. **Schedule trigger** — fires on the cadence you set.
2. **HTTP step (fetch metrics)** — pulls the reporting window from the ad/analytics API.
3. **Code step (compute KPIs)** — derives CTR, CAC, ROAS, and period-over-period deltas.
4. **Code/HTTP step (deliver)** — posts the readout to Slack and/or emails it.

## Variations and tips

* Combine multiple channels (paid search, paid social) by adding a fetch step per platform and merging in the compute step.
* For raw warehouse loads or non-marketing reports, see Data Ops [Scheduled reports and readouts](/articles/recipe-scheduled-reports-and-readouts-rqFtYUEyJN) instead.
* Add a chart link by rendering the series in a Code step if your platform supports image export.
* Store all platform and Slack tokens in Secrets.

## Related articles

* [Scheduled reports and readouts](/articles/recipe-scheduled-reports-and-readouts-rqFtYUEyJN)
* [Competitor monitoring digest](/articles/recipe-competitor-monitoring-digest-ZQv9Oa3xEf)
* [What triggers can start a playbook?](/articles/what-triggers-can-start-a-playbook-manual-schedule-webhook-P4mdwPZDGg)
* [How do I build a playbook with the Console?](/articles/how-do-i-build-a-playbook-with-the-console-ask-ballet-oHptRP9mI4)
