{
  "info": {
    "name": "Commune: Get a pulse on your newsletter in plain words",
    "description": "Dashboards answer questions you did not ask and make you work out the ones you did. Ask how your newsletter is doing and get a few sentences back: how the list moved, where new readers came from, how the last issue landed and what the community did with it. Or have the same few sentences waiting in Slack every Monday.\n\nThe walkthrough: https://usecommune.dev/use-cases/newsletter-pulse\n\nSet the `apiKey` variable to a key from https://usecommune.com/settings/api-keys, then run the requests in order.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.usecommune.com"
    },
    {
      "key": "apiKey",
      "value": ""
    },
    {
      "key": "version",
      "value": "2026-08-26"
    },
    {
      "key": "newsletter",
      "value": "example-letter"
    },
    {
      "key": "article",
      "value": "4c9e2f81-0b7a-4d13-8e55-1a2b3c4d5e6f"
    }
  ],
  "item": [
    {
      "name": "1. Find your newsletter",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/newsletters",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "newsletters"
          ]
        },
        "description": "A key reaches one newsletter or several, whichever its owner ticked when creating it. List them and pick yours by `handle` (or `id`, either works in a path) for the requests that follow, its `name` for the message, and its `esp`: on a `commune` newsletter the subscriber counts are the real ones, while on one connected to another provider they are Commune's partial record."
      }
    },
    {
      "name": "2. Read last week's headline numbers",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/newsletters/{{newsletter}}/stats?since=2026-08-24&until=2026-08-31",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "newsletters",
            "{{newsletter}}",
            "stats"
          ],
          "query": [
            {
              "key": "since",
              "value": "2026-08-24"
            },
            {
              "key": "until",
              "value": "2026-08-31"
            }
          ]
        },
        "description": "`since` and `until` pin the window to last Monday through this Monday, so the digest describes a whole week and not the last seven days from whenever the job ran. The response echoes the window it resolved in `period_start` and `period_end`.\n\nFour groups come back. `audience` is how the list moved: `net_change` is gained minus lost inside the week, and `by_status` is how everyone on record splits at the end of it. `publishing` counts articles, never emails. `community` is what readers did on Commune. `delivery` has the open and click rates, and is `null` for a newsletter Commune does not send."
      }
    },
    {
      "name": "3. See where the new subscribers came from",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/newsletters/{{newsletter}}/growth?since=2026-08-24&until=2026-08-31",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "newsletters",
            "{{newsletter}}",
            "growth"
          ],
          "query": [
            {
              "key": "since",
              "value": "2026-08-24"
            },
            {
              "key": "until",
              "value": "2026-08-31"
            }
          ]
        },
        "description": "Same window, split by acquisition source, largest first. `source` names the import that brought people in: a provider's slug, or `csv` for a file. `null` is the ordinary value for someone who joined through Commune rather than an import, though it also covers older rows nobody could label, so call it \"not from an import\" rather than \"from Commune\".\n\nThese are arrivals, not an audience size. A source with no arrivals in the window is left out rather than returned as zero."
      }
    },
    {
      "name": "4. Get the trend behind the week",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/newsletters/{{newsletter}}/timeseries?metric=subscribers&interval=week&since=2026-07-06&until=2026-08-31",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "newsletters",
            "{{newsletter}}",
            "timeseries"
          ],
          "query": [
            {
              "key": "metric",
              "value": "subscribers"
            },
            {
              "key": "interval",
              "value": "week"
            },
            {
              "key": "since",
              "value": "2026-07-06"
            },
            {
              "key": "until",
              "value": "2026-08-31"
            }
          ]
        },
        "description": "One week on its own does not say whether 43 new subscribers is good. Ask for the same number bucketed by `week` over the eight weeks before this Monday. Weeks start on Monday in UTC, every bucket is present (an empty week is `0`), and each `value` counts only that week, so the last bucket is last week.\n\nCompare the last bucket with the average of the ones before it. That one comparison is most of what a chart would tell you."
      }
    },
    {
      "name": "5. Find the latest issue",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/newsletters/{{newsletter}}/articles?status=sent&limit=1",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "newsletters",
            "{{newsletter}}",
            "articles"
          ],
          "query": [
            {
              "key": "status",
              "value": "sent"
            },
            {
              "key": "limit",
              "value": "1"
            }
          ]
        },
        "description": "`status=sent` with `limit=1` is the newest article that actually went out. Keep its `id` for the next request and its `title` for the message. An empty `data` means nothing has been sent yet, and the digest simply leaves the section out."
      }
    },
    {
      "name": "6. See how it did",
      "request": {
        "method": "GET",
        "header": [
          {
            "key": "Commune-Version",
            "value": "{{version}}"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/articles/{{article}}/stats",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "articles",
            "{{article}}",
            "stats"
          ]
        },
        "description": "The article measured on both sides. `email` counts recipients, not events: `opened` is people who opened at least once, and the rates a provider quotes divide by `delivered`, not `recipients`. It is `null` for an article your provider sent, because the provider kept those numbers.\n\n`community` is what readers did on Commune, counted when you ask, so it keeps growing after the send. `participants` next to `thread_messages` tells you whether 27 replies were a conversation among 19 people or an argument between two."
      }
    }
  ]
}
