Newsletter

Full email newsletter infrastructure built into the editor. Write in the newsletter compose view, send to your subscribers.

Sending

  • SendGrid backend (fetch-based, no SDK)
  • Batched sending: 1,000 recipients per API call
  • Auto image extraction: local images → base64 → R2 upload → email embed
  • Tiptap → Markdown → HTML + plaintext conversion
  • Juice CSS inlining for email client compatibility
  • Table-based layout for Outlook support
  • Send as HTML or plaintext
  • Resend an issue to subscribers who didn’t open it, with a new subject line (resend_to_unopened, once per issue)

Email template

Every issue uses one email template. It switches to dark mode automatically in email clients that support it.

Custom domains

Send from your own domain (e.g., updates@yourbrand.com):

  1. Add your domain in the newsletter settings, or with setup_custom_domain
  2. Auto-DNS setup for Cloudflare-managed domains
  3. SendGrid Domain Authentication (CNAME, SPF, DKIM)
  4. Check verification with check_domain_status, and send it again with resend_domain_verification

Subscriber management

  • Add and list subscribers with pagination
  • Import subscribers from a CSV file with import_subscribers, including exports from Substack, Beehiiv, Mailchimp, and ConvertKit. Unsubscribed rows are skipped
  • Get a signup form for your site with get_subscribe_embed
  • Per-recipient HMAC-signed unsubscribe URLs
  • Test email support before sending

Analytics

Via SendGrid Event Webhook:

  • Delivered count, open rate, click rate
  • Bounce tracking (hard + soft)
  • Unsubscribe tracking
  • Per-issue aggregation