---
name: morning-marketing-summary
description: "Weekday mornings: yesterday's sessions, key events, ad spend and ROAS across GA4, Google Ads and Meta Ads, against the same day last week. Use when the user asks for this, or when it runs on a schedule."
---

# Morning marketing summary: GA4, Google Ads and Meta Ads

Weekday mornings: yesterday's sessions, key events, ad spend and ROAS across GA4, Google Ads and Meta Ads, against the same day last week.

For a founder or marketer running paid acquisition, the morning routine is three tabs: GA4 for traffic, Google Ads for search spend, Ads Manager for Meta. Each shows its own date picker, its own attribution and its own idea of revenue, and none of them adds up the total spent yesterday.

This skill reads all three before you sit down and puts them on one card: total spend, each platform's return, revenue from GA4 as a cross-check, and the one number that moved more than it should have. Comparing with the same weekday last week keeps Monday from looking like a disaster next to Friday.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Viewer access to the GA4 property, read access to the Google Ads account, and read access to the Meta ad account.
- A GA4 connection (the Google Analytics MCP server or a service account), Google Ads API credentials or the read-only Google Ads MCP server, and Meta's ads MCP server or a Marketing API token with `ads_read`.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read yesterday in GA4** (Google Analytics): Call `runReport` with two `dateRanges` (yesterday, and the same weekday a week earlier), `dimensions: [{ name: "sessionDefaultChannelGroup" }]` and the metrics `sessions`, `keyEvents` and `totalRevenue`. Take totals from the response's `totals` with `metricAggregations: ["TOTAL"]`.
2. **Read Google Ads spend and value** (Google Ads): GAQL: `SELECT segments.date, metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM customer WHERE segments.date BETWEEN '<same day last week>' AND '<yesterday>'` and keep the first and last day. Divide `cost_micros` by 1,000,000.
3. **Read Meta spend and purchases** (Meta Ads): `GET /act_<id>/insights?level=account&time_range={"since":"<day>","until":"<day>"}&fields=spend,actions,action_values,cpm` for both days, or the reporting tools of Meta's ads MCP server. Take purchases and purchase value from the `purchase` entries in `actions` and `action_values`.
4. **Blend and compare**: Total spend is Google plus Meta. Show each platform's ROAS (value over spend) and a blended figure from GA4: `totalRevenue` divided by total spend. Flag any line more than 25% off the same day last week, and say which input moved (CPM, clicks, conversion rate).
5. **Write three lines**: Lead with spend and GA4 revenue, then one line per platform, then the flag. The table holds the numbers; the summary says what changed.

## Route B: the browser

### What you need

- Signed in to Google with Viewer access to the GA4 property and Read only access to the Google Ads account, and signed in to Facebook with at least the Analyst (view) role on the Meta ad account.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://analytics.google.com/analytics/web/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Read yesterday in GA4**: Open GA4, pick the property, and go to **Reports > Acquisition > Traffic acquisition**. In the date picker choose **Yesterday**, switch on **Compare** and set a **Custom** comparison date to the same weekday last week. Read the totals row for `Sessions`, `Key events` and `Total revenue`, and the channel rows under it.
2. **Read Google Ads**: Open `https://ads.google.com/aw/overview`, set the date to **Yesterday** with **Compare** set to a custom date of the same weekday last week, and read `Cost`, `Conversions` and `Conv. value` from the overview cards. If a card is missing, add the columns on the **Campaigns** page and read the total row.
3. **Read Meta Ads Manager**: Open `https://adsmanager.facebook.com/adsmanager/manage/campaigns`, pick the ad account, set the date picker to **Yesterday** with the **Compare** toggle on and the earlier range set to the same weekday last week. Under **Columns**, choose **Customize columns** and add `Amount spent`, `Purchases`, `Purchases conversion value`, `Purchase ROAS` and `CPM`; read the total row.
4. **Blend and compare**: Total spend is Google plus Meta. Work out each platform's ROAS (value over spend) and GA4 revenue over total spend. Flag any line more than 25% off last week and say which input moved (CPM, clicks, conversion rate).

Note: Three apps in one run, so this route takes a few minutes and breaks when any of them shows a dialog. Ads Manager's Compare view shows both periods side by side, which makes it the easiest of the three to read; GA4's report can take up to a day to settle, the same as the API.

## The report

- **Spend** across Google and Meta, and GA4 revenue over that spend.
- **GA4**: sessions, key events and revenue against the same day last week.
- **Google Ads**: cost, conversion value and ROAS.
- **Meta Ads**: spend, purchase value, ROAS and CPM.
- One line on anything that moved more than 25%, and why.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "morning-marketing-summary/<date of this run, e.g. 2026-10-16>",
  "item_key": "morning-marketing-summary",
  "project": "Acme Store",
  "source": "Morning marketing summary: GA4, Google Ads and Meta Ads skill",
  "kind": "update",
  "title": "$3,180 spent yesterday, Meta ROAS down to 2.1x",
  "summary": "**8,420 sessions** (+4% on last Thursday) and **$11,450** revenue in GA4, 3.6x on total ad spend. Meta ROAS fell from 2.9x to **2.1x** as CPM rose 38%; Google held at 4.6x.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Source",
          "Spend",
          "Value",
          "ROAS",
          "Last Thu"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "Google Ads",
            "$1,780",
            "$8,190",
            "4.6x",
            "4.5x"
          ],
          [
            "Meta Ads",
            "$1,400",
            "$2,940",
            "2.1x",
            "2.9x"
          ],
          [
            "Total",
            "$3,180",
            "$11,130",
            "3.5x",
            "3.8x"
          ]
        ]
      }
    },
    {
      "type": "Grid",
      "props": {
        "columns": 3
      },
      "children": [
        {
          "type": "Stat",
          "props": {
            "label": "GA4 sessions",
            "value": 8420,
            "delta": 4
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Key events",
            "value": 312,
            "delta": -2
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "GA4 revenue",
            "value": 11450,
            "prefix": "$",
            "delta": 1
          }
        }
      ]
    },
    {
      "type": "Callout",
      "props": {
        "text": "Meta CPM went from $14.20 to $19.60 with the same budget, so reach fell. Worth a look at the prospecting audience.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays at 8:00 (`0 8 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 8 * * 1-5 claude -p "Run the morning-marketing-summary skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/morning-marketing-summary#schedule

Source: https://briefkin.dev/skills/morning-marketing-summary
