---
name: youtube-posts-that-paid
description: "Every Monday: each video and post whose 10 days are up, its views, and the newsletter subscribers and sales that came from its link in those 10 days. Use when the user asks for this, or when it runs on a schedule."
---

# Posts that paid: YouTube and Instagram to subscribers and sales

Every Monday: each video and post whose 10 days are up, its views, and the newsletter subscribers and sales that came from its link in those 10 days.

For creators, views are the number every platform shows first and the one that pays least. The video that brings 200 newsletter subscribers and a handful of template sales often looks average on the views chart, and the viral reel can bring nothing at all.

Every Monday the agent takes each post whose 10 days are over, follows its link (a UTM per post in the YouTube description or the link-in-bio entry) into beehiiv or Mailchimp subscribers and Gumroad or Stripe sales, and puts the views next to it. The card says which post paid and how many posts brought nothing.

## 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

- A link with its own UTM on every post: in the YouTube description, and on the link-in-bio page or story link sticker for Instagram, since captions are not clickable. The newsletter signup must keep the UTM (beehiiv does; Mailchimp needs a hidden merge field).
- YouTube OAuth with `yt-analytics.readonly` and `youtube.readonly`, an Instagram token with insights permission, and read access to beehiiv or Mailchimp and to Gumroad (`view_sales`) or Stripe.

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

### Steps

1. **List posts whose 10 days just ended** (YouTube): YouTube: `playlistItems.list` on the uploads playlist for videos with `contentDetails.videoPublishedAt` 10 to 17 days ago, then Analytics `reports.query` with `ids=channel==MINE`, `dimensions=video`, `metrics=views,subscribersGained` and `filters=video==<ids>`. Instagram: `GET /{ig-user-id}/media?fields=id,caption,media_product_type,permalink,timestamp`, then `GET /{media-id}/insights?metric=views,reach,saved,shares` for each.
2. **Collect subscribers with their source** (beehiiv): beehiiv: `GET /publications/{publicationId}/subscriptions` with `order_by=created`, `direction=desc`, reading `created`, `utm_source`, `utm_campaign` and `referring_site`. Mailchimp (whichever you use): `GET /lists/{list_id}/members?since_timestamp_opt=...` with the merge field your form fills with the campaign value.
3. **Collect sales with their source** (Gumroad): Gumroad: `GET /v2/sales` with `after`, keeping price, buyer email and `referrer`. Stripe: Checkout Sessions with `status=complete` and `metadata.utm_campaign`. Also match buyer emails (lowercased) to the subscriber list, so a sale from someone who joined through a post counts for that post.
4. **Join on the post's campaign, inside its 10 days**: Each post has its own `utm_campaign` (for example `yt-2026-10-14`, `ig-2026-10-12`). Match subscribers and sales whose normalized value (lowercase, trimmed) equals it and whose time falls between the publish time and 10 days after. Records with only a referrer (`youtube.com`, `instagram.com`) go to that platform's unattributed row rather than to the nearest post; a post with no link of its own is marked "no link".
5. **Rank and post**: Rank posts by revenue, then subscribers, with views beside them and subscribers per 1,000 views. Count the posts that brought nothing and say which of them had no link, since those could not show anything.

## Route B: the browser

### What you need

- Signed in to YouTube Studio as the channel owner or a manager, to Meta Business Suite with access to the Instagram account, to beehiiv or Mailchimp, and to Gumroad or Stripe.

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

### Steps

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

1. **Read views per post**: In YouTube Studio open **Analytics > Content**, set the dates to cover the last few weeks, and note views for videos published 10 to 17 days ago. For Instagram, open `https://business.facebook.com/latest/insights/` (or the professional dashboard in the app) and read views for each post in the same dates.
2. **Read new subscribers by campaign**: In beehiiv open **Audience > Subscribers**, filter by date added, and export the list so the UTM campaign and source columns come with it. In Mailchimp, export the audience with the merge field that holds the campaign value.
3. **Read sales**: On Gumroad open **Sales** and export the CSV for the period, which includes buyer email and referrer. In Stripe open **Payments**, filter by date and read the `utm_campaign` metadata your checkout sets on each payment.
4. **Join and rank**: For each post, count subscribers and sales whose campaign value is the post's own, in the 10 days after it went out, and buyers whose email joined through it. Put youtube.com or instagram.com referrers with no campaign in an unattributed row. Rank posts by sales, then subscribers.

Note: Exports are the honest way here: the subscriber and sales tables in the UI show a page at a time. YouTube Studio numbers settle a day or two after the fact. Meta Business Suite and the Instagram app can show slightly different view counts for the same post.

## The report

- **Post that paid best**: subscribers and sales in its 10 days.
- **Every post**: views, subscribers, sales, subscribers per 1,000 views.
- **Brought nothing**: how many posts, and which had no link.
- **Unattributed**: subscribers and sales from each platform that no post can claim.
- One thing to repeat, for example "The 14 Oct video pinned the template link first; do that on every video".

## 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": "youtube-posts-that-paid/<date of this run, e.g. 2026-10-16>",
  "item_key": "youtube-posts-that-paid",
  "project": "Acme",
  "source": "Posts that paid: YouTube and Instagram to subscribers and sales skill",
  "kind": "update",
  "title": "The 14 Oct video paid: 212 subscribers, $380",
  "summary": "The 14 October video brought **212 newsletter subscribers** and **$380** of Gumroad sales over 10 days. **3 of 5 posts brought nothing**, including the reel with the second-most views.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Post",
          "Views",
          "Subscribers",
          "Sales",
          "Per 1k views"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "YouTube, 14 Oct: Pricing my first template",
            18400,
            212,
            "$380",
            11.5
          ],
          [
            "Instagram reel, 12 Oct",
            9800,
            31,
            "$40",
            3.2
          ],
          [
            "Instagram reel, 15 Oct (no link)",
            12100,
            0,
            "$0",
            0
          ],
          [
            "YouTube, 10 Oct: Notion setup tour",
            6200,
            0,
            "$0",
            0
          ],
          [
            "Instagram carousel, 16 Oct",
            3400,
            0,
            "$0",
            0
          ],
          [
            "All five",
            49900,
            243,
            "$420",
            4.9
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "The 15 Oct reel had no link of its own. 46 subscribers came from instagram.com with no campaign in its 10 days, so some of them are probably its.",
        "tone": "info"
      }
    }
  ]
}
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: Mondays at 10:00 (`0 10 * * 1`). From cron, with the agent signed in on that machine:

```bash
0 10 * * 1 claude -p "Run the youtube-posts-that-paid 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/youtube-posts-that-paid#schedule

Source: https://briefkin.dev/skills/youtube-posts-that-paid
