Set up your newsletter

Everything here lives in your blog project's Newsletter tab in the dashboard.

1. Turn it on

The toggle at the top of the Newsletter tab. While it's off, signups are still accepted and stored — nothing is lost — but no campaigns go out.

2. Choose a cadence

Cadence decides when subscribers hear from you.

CadenceBehaviour
Every new postA campaign goes out as soon as you publish.
Weekly digestOne email a week collecting everything published since the last send.
Biweekly digestSame, every two weeks.
Custom scheduleYour own day + hour, with a minimum gap of ~20 hours between sends.
Manual send onlyNothing is sent automatically; you trigger sends yourself.

Digest and custom cadences also take a day of week and an hour (UTC). The hour is UTC, not your local time — pick with your audience's timezone in mind.

Scheduled sends are driven by a database-level scheduler that finds due blogs and enqueues the job; the send itself runs in the background. A digest with nothing new to report doesn't send an empty email.

How scheduled sends actually fire

A scheduler wakes up once an hour and sends to every blog whose configured hour matches the current UTC hour (and whose configured day matches, if one is set).

On top of that, a minimum gap since the last send prevents doubles:

CadenceMinimum gap
Weekly~6.5 days
Biweekly~13.5 days
Custom~20 hours

Two consequences worth knowing:

  • Resolution is hourly, not minute-level. A send configured for 13:00 UTC goes out during the 13:00 hour, not at exactly 13:00:00.
  • Custom is not a cron expression. It's the same day + hour matching as the digest cadences, with a shorter minimum gap — enough for schedules like "every weekday at 09:00 UTC", not for arbitrary cron.

3. Pick a template

TemplateLooks like
LetterpressThe styled default — serif headline, ink-and-paper palette, hairline borders, accent button.
PlainMinimal black-on-white, no accent colour or logo. Best for text-heavy or accessibility-first blogs.

Both render table-based HTML with inline CSS and ship a plaintext alternative, which is what mail clients with images or CSS disabled fall back to.

Templates accept a small amount of theming:

OptionEffect
siteNameName shown in the header and the confirmation email subject
accentAccent colour for the button and rules (Letterpress only)
logoUrlLogo shown in the header

4. Verify your sending domain

Before real sends, verify the domain you send from. This is what keeps your mail out of spam folders — see Sending domain & deliverability.

5. Add a signup form to your site

This is the one piece the dashboard can't do for you: the form lives on your site. Follow Add newsletter signup to a site — it's a few lines, and works with or without @inkform/framework.

Without a form somewhere, you'll have zero subscribers and every send will be a no-op.

What happens on publish

With Every new post, publishing runs this sequence:

  1. The post is committed to your repo.
  2. A campaign is queued with the rendered HTML and text, then dispatched in the background — publishing doesn't block on sending.
  3. Recipients are resolved: active subscribers for that project only. Pending, unsubscribed, bounced, and complained addresses are excluded.
  4. Sends are paced to stay within your provider's rate limit, and each is recorded so delivery events can be matched back later.

If you publish a post you didn't mean to announce, switch to Manual send only first. There is no unsend.