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.
| Cadence | Behaviour |
|---|---|
| Every new post | A campaign goes out as soon as you publish. |
| Weekly digest | One email a week collecting everything published since the last send. |
| Biweekly digest | Same, every two weeks. |
| Custom schedule | Your own day + hour, with a minimum gap of ~20 hours between sends. |
| Manual send only | Nothing 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:
| Cadence | Minimum 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
| Template | Looks like |
|---|---|
| Letterpress | The styled default — serif headline, ink-and-paper palette, hairline borders, accent button. |
| Plain | Minimal 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:
| Option | Effect |
|---|---|
siteName | Name shown in the header and the confirmation email subject |
accent | Accent colour for the button and rules (Letterpress only) |
logoUrl | Logo 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:
- The post is committed to your repo.
- A campaign is queued with the rendered HTML and text, then dispatched in the background — publishing doesn't block on sending.
- Recipients are resolved:
activesubscribers for that project only. Pending, unsubscribed, bounced, and complained addresses are excluded. - 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.