Docs
Guides

Send newsletters

Send a newsletter to subscribers from your own sending domain, with consent, pacing and unsubscribe handled.

A newsletter in OXYGEN is a Sequence with one email step, sent to a subscription list from a sending domain you own rather than from a personal inbox. It goes out through OXYGEN's sending infrastructure. Newsletters need a paid plan; on Free, adding a sending domain or switching a Sequence to one is refused with upgrade_required.

1. Add a sending domain

A sending domain is the domain your newsletter's From address uses, such as news.acme.com. It must be a domain in Sequencer → Domains, or a subdomain of one. One workspace owns each sending domain: a domain another workspace already uses, or a parent or subdomain of one, is refused (sending_domain_owned_elsewhere), and OXYGEN's own domains are refused (sending_domain_reserved).

In the app: Sequencer → Accounts → Newsletter → Add sending domain. From the CLI:

oxygen domains sending add news.acme.com --json
oxygen domains dns plan acme.com --sending-domain news.acme.com --json
oxygen domains dns apply acme.com --sending-domain news.acme.com --json
oxygen domains sending verify news.acme.com --json

add returns the DNS records the domain needs. dns plan shows the DKIM, MAIL FROM and SPF changes and dns apply writes them on a Cloudflare-connected domain; elsewhere, publish the returned records at your DNS host. verify checks them; the domain becomes active once DKIM and MAIL FROM pass. MCP: oxygen_domains_sending and oxygen_domains_dns_plan.

2. Build a subscription list

A newsletter sends only to addresses subscribed on its list, and never to anyone on your do-not-contact list. Every subscribe records where consent came from.

oxygen subscriptions lists create newsletter --name "Newsletter" --kind marketing --json
oxygen subscriptions import --list newsletter --file ./subscribers.csv \
  --source webinar_2026_10 --basis "Webinar signup form, Oct 2026" --json

An import takes up to 5,000 addresses (CSV with an email column, or JSON) under one consent record. Addresses removed by a complaint or hard bounce stay off. subscriptions set changes one address and subscriptions get shows its status on every list. The lists also appear under Sequencer → Accounts → Newsletter. MCP: oxygen_subscriptions.

Topics

A topic is a narrower subject inside a list, such as product news or event invites inside your newsletter list. A newsletter sent to a topic reaches only the topic's subscribers; a newsletter sent to the list reaches everyone on the list.

oxygen subscriptions lists create product-news --name "Product news" --kind topic \
  --parent newsletter --default opt_out --json
oxygen subscriptions lists update product-news --visibility private --json
  • --default opt_out: everyone subscribed to the list is on the topic too, including people who join the list later. Each one carries the consent record of their list subscribe, with source topic_default. Someone who left the topic stays off.
  • --default opt_in (the default): nobody is on the topic until they choose it on their preference page, or you add them.
  • --visibility: public lists and topics appear on every recipient's preference page. private ones appear only to people already subscribed to them.

Leaving a list leaves its topics too. In the app, use Add list or topic under Subscriptions, and the pen on a row to change it. MCP: oxygen_subscriptions with action: "create_list" or "update_list".

The preference page

Every newsletter links a hosted preference page. Recipients can switch each public list and topic on or off there, or unsubscribe from everything. The page uses your brand kit: logo, colours, font, company name and postal address. Its heading and intro come from the preference page title and description (oxygen sequences brand-kit set).

  • Place the link yourself with {{preferences_url}}, and the unsubscribe link with {{unsubscribe_url}}. If you place neither, the footer adds both.
  • Each change is recorded as a consent event with source preference_center, with a hash of the recipient's IP address and their browser's user agent. Unsubscribe from all also adds the address to do-not-contact.
  • The unsubscribe link opens the same branded page and asks the person to confirm. The one-click unsubscribe button in mail apps still works without opening a page.
  • A preference link stops working one year after the email that carried it. Links in a test send change nothing.

3. Create the newsletter Sequence

Create a Sequence with one Send email step that has its own subject. On Sending settings, under Delivery, set Send email through to the sending domain, then choose the From address and Subscription list. From the CLI:

oxygen sequences update <sequence> --delivery sending-domain --sending-domain news.acme.com \
  --from-address [email protected] --from-name "Acme" --subscription-list newsletter --json
oxygen sequences enroll <sequence> --from-list newsletter --json

enroll --from-list adds up to 500 subscribers per run; re-run with --from-list-after <from_list.next_after> while from_list.has_more. A newsletter never enrolls table rows automatically. The unsubscribe link and one-click unsubscribe headers are always on.

4. Preview and send

oxygen sequences start <sequence> --json previews without sending: subscribed, unsubscribed and suppressed counts, the credits it will cost, and any blocker. --approved sends.

  • Price: 0.05 credits per email ($0.50 per 1,000), charged as each email is sent. A short balance pauses the Sequence with insufficient_credits.
  • First send: the first live start sends 5% of the list (at least 50) and waits 3 hours. The rest goes only if hard bounces stay at or under 2% and complaints at or under 0.08%; otherwise the Sequence pauses for review.
  • Pacing: a new workspace sends up to 200 emails at once. After that, the limit grows from your largest clean send of the last 60 days: twice it at first, rising to five times it after 30 days. A bigger send is spread out, over 4 hours plus 4 more each time it doubles past the limit, at most 72 hours; the first emails go at once. Your plan also sets a daily maximum.

Bounces, complaints and unsubscribes

Across your workspace's newsletters over 7 days, 2% hard bounces (at least 5) or 0.08% spam complaints (at least 2) pause sending, and 5% bounces (at least 10) or 0.3% complaints (at least 3) block it. Paused sends wait instead of failing (bulk_email_workspace_paused); contact OXYGEN support to resume or unblock. A hard bounce or complaint removes that address from every list. An unsubscribe link removes the person from that list and its topics; unsubscribing from all lists also adds them to do-not-contact. Another workspace's results never pause yours.

On this page