By Theo Brandt ยท Updated

Transactional vs Marketing Email for SaaS: Where the Line Is

A password reset and a product announcement can leave the same server, yet they follow different rules and deserve different infrastructure choices.

Transactional email is a message the recipient's own action or account state requires: a reset link, a receipt, a security alert. Marketing email exists to promote, educate or retain, and it needs an unsubscribe path whatever its trigger. Lifecycle email, such as onboarding tips and trial nudges, is triggered like the first and legally behaves like the second. For most SaaS teams under a few hundred thousand sends a month, one platform can run all three if the sending streams and the content stay separate. Past that point the cost and reputation arguments for splitting get real.

Prices checked 7 October 2026; each price links to the vendor page it came from. This is editorial guidance from reading vendor and regulator pages, not legal advice.

The three kinds of email at a glance

Type What starts it Unsubscribe link Where it usually lives
Transactional One person's action or account state: reset, receipt, invite, alert Not required for the narrow categories the FTC lists A sending API such as Postmark, Resend, Mailgun or SES, or your lifecycle tool's transactional feature
Lifecycle Product or billing events: signup, stalled setup, trial ending Yes, because the purpose is commercial Loops, Customer.io, Userlist and similar event-driven tools
Marketing broadcast A person on your team picks an audience and a send date Yes The same lifecycle tool, or a newsletter-style platform

What the law actually draws a line around

In the United States the reference text is the FTC's CAN-SPAM compliance guide for business. It defines a transactional or relationship message as one whose primary purpose is to facilitate or confirm a transaction the recipient already agreed to, give warranty, recall, safety or security information about something they bought, notify them of a change in their standing or terms, give information about an employment relationship, or deliver goods or services they already agreed to. Those messages are exempt from most of the Act, but they may not contain false or misleading routing information. The guide reads the categories narrowly.

Three practical consequences follow. First, anything outside those categories is commercial and needs the opt-out mechanism, which the guide says you must honor within 10 business days. Second, a message that mixes both kinds is judged by its primary purpose: the guide treats a message as commercial if a reasonable reader of the subject line would think it advertises something, or if the transactional content does not come first. Third, the penalty is applied per email: the guide lists up to $53,088 for each separate violating message, which is the number to keep in mind when someone proposes squeezing an upsell into the receipt.

Outside the US the line sits elsewhere. EU and UK rules lean on consent for marketing and on contractual necessity for service messages, and several other countries add their own wording. If you sell internationally, ask counsel to classify your twelve or so recurring emails once, then record the answer next to each template.

Twelve SaaS emails, sorted

Founders rarely argue about password resets. The arguments are about the in-between messages, so here is a working classification under the FTC's narrow reading. Treat the middle column as a starting position for your own review rather than a ruling.

Email Treat as Why, and what to watch
Password reset, magic link, 2FA codeTransactionalRequested by the recipient. Plain text and one link keep it that way.
Receipt, invoice paidTransactionalConfirms a transaction. Do not add a cross-sell block.
Upcoming invoice noticeTransactionalAccount standing. State the date and amount, nothing else.
Failed payment noticeTransactionalChange in standing. Keep it to the card-update link; save the persuasive follow-ups for a lifecycle sequence.
Security alert (new login, key created)TransactionalSecurity information about the account.
Usage limit warningTransactional, if factualIt becomes marketing when the second paragraph is an upgrade pitch.
Trial ends in 3 daysGray areaA bare notice is account information. Feature highlights and discounts make it commercial.
Price or terms change noticeLikely transactionalFalls near the "change in terms" category; have counsel confirm the wording.
Cancellation confirmationTransactionalConfirms what the customer just did. A win-back offer belongs in a later, separate email.
Onboarding tips seriesMarketingPromotes use of the product. Include unsubscribe and honor it.
Feature announcementMarketingAdvertises something. Segment it and cap the frequency.
NPS or feedback surveyTreat as marketingNot on the FTC list. A suppression list that excludes it avoids an argument later.

Why separate streams matter more than separate vendors

The real operational risk is reputation, not paperwork. A newsletter that draws spam complaints can slow or divert a password reset sent from the same domain and IP pool, and the user who cannot log in files a support ticket, not a complaint. Postmark builds the separation into the product: on its message streams page each stream is typed Transactional or Broadcast, the two do not mix, including IP ranges, and its how-to article says to send through a non-default stream by naming it at send time. It also requires a visible unsubscribe link on broadcast streams and adds one if you leave it out.

Resend takes the same split in its pricing: the pricing page has a Transactional tab (emails per month) and a Marketing tab (contacts, with broadcasts and automations). Loops and Customer.io run both kinds of sending inside one account, so the separation there is your discipline: different sending subdomains, a separate template folder, and a rule that transactional templates carry no promotional blocks.

What the split costs at 50,000 transactional sends and 10,000 contacts

Take a product that sends 50,000 transactional emails a month and runs lifecycle and campaign mail to 10,000 contacts. The figures below come from each vendor's pricing page on 7 October 2026 and use only the stops those pages show.

Setup Monthly cost Arithmetic and source
Resend for both $100 Transactional Pro $20 at 50,000 emails plus Marketing Pro $80 at 10,000 contacts, as two line items on Resend's pricing page
Loops alone $99 The $99 stop at about 10,000 contacts on Loops' pricing page, which lists transactional sends on paid plans; confirm your 50,000 sends fit the plan before relying on it
Customer.io alone $145 Essentials slider readout at 10,000 profiles on Customer.io's pricing page
Postmark plus Loops $154 Postmark Basic $55 at 50,000 emails (Postmark pricing) plus Loops $99
Amazon SES plus Loops $107 50 x $0.16 per 1,000 = $8.00 on the SES pricing page, plus Loops $99; SES leaves templates, bounce handling and suppression to you

The spread is smaller than the debate suggests. A separate transactional vendor costs between $8 and $55 on this workload, which is cheap insurance if one person on your team owns deliverability. It stops being cheap when it adds a second set of templates, a second unsubscribe list and a second dashboard for the same people to monitor. Mailgun's pricing page lists Foundation at $35 for 50,000 emails, which sits in the same range if you prefer it to Postmark.

Which setup to pick

One platform, two subdomains is the best default for a team of fewer than ten people with a marketer or founder writing the emails. Loops fits when the lifecycle sequences are the main job, and Customer.io fits when you need branching on product events and expect to grow into it; the Customer.io vs Loops comparison covers that choice. A sending API plus a lifecycle tool fits teams where engineers own reset and receipt mail in code: Postmark for streams and delivery focus, Resend if you also want its marketing tab, SES if volume is high and you will build the plumbing. The head-to-head pages on Postmark vs SendGrid and Loops vs Resend go deeper on the vendors, and the transactional email category lists the rest.

Whatever you choose, apply three rules: transactional templates carry no promotion; marketing and lifecycle sends check a suppression list before every send; and the sending subdomains differ. Deliverability basics for both streams are in the SaaS deliverability guide.

Frequently asked questions

Can I add a promotion to a receipt or password reset?

Keep it out. The FTC's CAN-SPAM guide says that when a message mixes commercial and transactional content, the primary purpose decides, and a message reads as commercial if the transactional material does not come first. Promotional lines in a reset or receipt also pull a stream that should stay clean toward marketing-grade complaint rates. Postmark and Resend both let you send the two kinds of mail separately for that reason.

Is a trial-ending or failed-payment email transactional?

Usually yes when it only states the date, the amount and a link to fix the card, because that is a change in the customer's account standing. It turns into a marketing message the moment it also pitches features or an upgrade discount. Send the bare notice from your transactional path and put persuasion in a separate lifecycle sequence in Loops or Customer.io.

Do I need two vendors for transactional and marketing email?

Not at small volume. Loops lists transactional sends on its paid plans, and Customer.io and Resend each sell both kinds of sending. Splitting starts to pay when engineers want a sending API with its own reputation, as with Postmark's separate transactional and broadcast streams, or when transactional volume dwarfs your contact count and per-email pricing such as Amazon SES is cheaper than a contact-based plan.

Should marketing and transactional mail use different sending domains?

Different subdomains are the safer default. Postmark's guidance is to keep Transactional and Broadcast streams on separate subdomains with their own DKIM and Return-Path, so a spam-complaint spike from a newsletter cannot drag down password resets.