Documentation

Newsletter

Draft issues from your own content, grow a double opt-in list, and send from your own verified domain with delivery, open, and click tracking.

Your newsletter is the one distribution channel you own outright — no algorithm between you and the reader. BlackOps treats it that way: issues are drafted from your own content, subscribers are double-opt-in, and every send goes out from your domain with your sending reputation, not a shared platform address.

Drafting works straight away. Sends and signups unlock once your sending domain is verified.

Before your first send

Three one-time steps, in order:

  1. Verify a sending domain — Settings → Email Sending Domain. Add a dedicated subdomain (like news.yourdomain.com), create the SPF/DKIM records it shows you, click Verify. See Custom Email Sending Domain.
  2. Set your From Email — Newsletters → Settings. It must be an address on the verified domain (e.g. you@news.yourdomain.com). Set your From Name and optional Reply-To while you're there.
  3. Turn on signups — nothing to click: the subscribe form on your site starts accepting readers automatically once steps 1–2 are done.

Until these are complete, sends and test sends return a message explaining exactly what's missing, and the signup endpoint politely declines — no subscriber ever gets stuck waiting on a verification email that can't be sent.

Drafting an issue

Create a newsletter from the Newsletters tab under Promote. Pick the content sources you want to draw from — recent posts, saved content, notes — and the AI reshapes them into a draft in your brand voice. Everything is editable before anything sends; the AI is a first-drafter, not the author of record.

Your configured header, footer, sign-off, signature, and P.S. from Newsletter Settings wrap every issue, so each send looks consistent without per-issue formatting work.

Subscribers

  • Double opt-in: new signups get a verification email and only join the list after confirming — the list stays clean and consentful.
  • Migration: import an existing list via CSV; imported readers get a re-opt-in confirmation rather than being silently added.
  • Unsubscribe: every issue carries working unsubscribe links plus the one-click List-Unsubscribe header mail clients surface.

Sending

  • Test send — every draft has a send-test that delivers a [TEST]-prefixed copy to your admin email so you can check rendering and the from line before going out.
  • Send to all — sends in rate-limited batches with real-time progress, duplicate prevention (a subscriber is never sent the same issue twice), and automatic resume if a send is interrupted partway.

Autopilot: BlackOps sends it when you forget

Life gets busy and the newsletter slips. Turn on Newsletter Autopilot (Newsletters → Settings) and BlackOps covers for you, openly.

  • Set a schedule: how often (every week, every 2 weeks, every month), which weekday, what hour, and your timezone. The schedule rolls from your last send: with "every 2 weeks on Friday at 10am", BlackOps only steps in on the first Friday at least two weeks after your most recent issue.
  • You get a heads-up: 24 hours before the deadline, BlackOps emails you that nothing has gone out and that it will send one unless you do. It never sends without a heads-up first: if you turn autopilot on less than a day before the next slot, the heads-up goes out right away and the issue follows at the deadline.
  • Turning it on starts the clock: the first deadline is the first scheduled slot after you switch it on, never one that already passed. Turn it on Sunday at 9pm with "Sunday at 10pm" and the first issue goes out that night.
  • Your send always wins: send your own issue any time before the deadline and autopilot stands down. The deadline moves out from your send.
  • It always says why it's BlackOps: every issue is written in BlackOps' own voice and says in its first two sentences that BlackOps is sending it because you could not get to it this time, for one reason or another. It only names a specific reason (shipping a lot, traveling) when your published posts or posts on X show it. Then it walks readers through every post published since your last issue (with a short explanation and a link for each) and, if you leave it on, your 5 most engaged original posts on X from the same window, dated by when you actually posted them.
  • Nothing private, ever: the writer only sees your published posts, your posts on X, and your past issues. It never mentions your notes, drafts, calendar, location, clients, or anything else you have not published.
  • It reads your past issues: the last 5 issues are context for tone and structure, and anything a past issue already covered is never repeated.
  • No empty issues: if nothing is new, nothing is sent and you get an email saying so. Each autopilot issue uses the same credits as a manually generated one; if the account is at its monthly limit, it skips and tells you.
  • You get a copy: every autopilot send emails you what went out, and it appears in your newsletter history marked Sent by BlackOps.

Autopilot sends through the same pipeline as a manual send, so it needs your sending domain verified. If it isn't, autopilot emails you the reason instead of writing an issue.

Growing the list from outside BlackOps

Your list doesn't have to grow only through the form on your hosted site.

A form on any other site — the subscribe endpoint accepts cross-origin requests, so a plain fetch form on your app, landing page, or anywhere else works directly. Point it at your BlackOps site's domain:

<form onsubmit="event.preventDefault();
  fetch('https://blog.yourdomain.com/api/newsletter/subscribe', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ email: this.email.value })
  }).then(r => r.json()).then(d => this.outerHTML = '<p>' + (d.message || d.error) + '</p>')">
  <input type="email" name="email" placeholder="you@example.com" required />
  <button type="submit">Subscribe</button>
</form>

Programmatically from your app — add subscribers server-to-server with your API key, for example when a user signs up for your product:

await fetch('https://blackopscenter.com/api/v2/subscribers', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ domain: 'blog.yourdomain.com', email: user.email, name: user.name })
})

Both paths run the same double opt-in: the reader gets a confirmation email and only joins the list after clicking it. Signing up for your app isn't consenting to your newsletter — the confirmation step is what keeps the list clean and compliant, so there's intentionally no way to skip it.

Tracking

Delivery events feed back automatically: each issue in the list shows its open rate and click rate, and per-subscriber delivery status (delivered, bounced, complained) is recorded via webhooks. Use it to learn which subjects and topics actually land.

Related

Want this page as machine-readable markdown? GET /docs/features/newsletter.md