An application event does not automatically deserve an email. A notification needs a recipient who can use it, a reason to interrupt that person now, and a suppression rule for every reason the message should not be sent.

Start with an event-to-recipient policy

Write the policy before the template. The same event may matter to an account owner, an assignee, or nobody. “Import completed” can stay in the activity log when the user is already on the result screen. “Import blocked after the user left” may justify an email to the person who can correct the file.

EventRecipientUrgencyDelivery rulePrimary action
Import rejected before any writePerson who started the importPromptSend after the in-app result is no longer active; suppress after successful retryReview rejected rows
Document approaching its configured dateAssigned ownerDepends on the customer ruleSend at the chosen lead time; stop after completion or reassignmentReview the document
Routine status changesWorkspace members who opted into the digestLowBatch by workspace and periodOpen the summary
Background job still failing after retriesWorkspace owner or named operatorPromptOne open incident message; update rather than repeatInspect or contact support
Job completed while user is on the result screenNo emailNoneRecord in-app onlyNone

“Prompt” is not a universal number of minutes. It means the delay could affect the user’s next decision. Define the actual timing from the product workflow, then test it with the people who own that workflow.

Separate urgency from importance

A monthly report can be important without being urgent. A failed import may be urgent during setup but irrelevant after a successful retry. Use four questions:

  • Can the recipient act on this event?
  • Does waiting change the consequence?
  • Is the recipient likely to see the event inside the product first?
  • Can several events become one useful summary?

If the recipient cannot act and delay has no consequence, keep the event in an activity log. If several low-urgency changes lead to one review decision, batch them. A digest should summarise a decision, not reproduce the database changelog.

Suppression is part of the feature

Every notification type needs a suppression key and an expiry condition. Before send time, check the current state again. Queued email based on stale state is a common source of “please fix this” messages arriving after the user already fixed it.

Suppression conditionExpected behavior
The event was resolvedCancel the pending message.
The recipient lost access or ownershipDo not reveal workspace information; recalculate the eligible recipient.
An equivalent message is already openUpdate the incident record or batch the event instead of sending a duplicate.
The user disabled that optional notificationRespect the saved preference across email and digest jobs.
The address bounced or complainedSuppress further non-essential sends and expose the delivery problem inside the account.
The workspace is paused or deletedCancel queued product updates unless a verified account obligation requires a separate message.

Give users controls they can predict

A single “email notifications” switch is too blunt when the product sends both action-required messages and optional summaries. Group preferences by job: assigned work, failures, reminders, and digests. Show who receives each category and whether the choice is personal or workspace-wide.

When a user opts out, confirm what changed without making a broader promise than the product can enforce. Store the preference with a timestamp and policy version so support can answer why a later message was or was not sent.

Three exact example emails

Illustrative fictional emails, not customer messages. The names, files, references, dates, and counts below exist only to make the policy inspectable. They are not evidence of delivery performance or legal compliance.

1. Failed import: action required

Subject: Review the two rows we could not import

Hi Maya,

We did not add any records from “invoices-august.csv” because two rows are missing a due date.

Workspace: North Street Ops
Import reference: IMP-2048

Open the import preview to correct those rows or download the error file. Your original upload is still available in the workspace, and no records from this import have been added.

Review the import

If you did not start this import, use the support link inside your account and include IMP-2048.

2. Batched digest: review, do not react

Subject: North Street Ops review for 11–17 August

Hi Maya,

Here is the activity waiting for your review:

• 4 items need a decision
• 9 items were completed
• 2 items are blocked

This summary was generated at 09:00 UTC on 18 August. Open it to see the current status before taking action.

Open the review

You are receiving this email because the weekly operations digest is enabled for your account. You can change digest settings from the Notifications page.

3. Reminder that cancels when the state changes

Subject: Fire safety certificate needs review by 28 August

Hi Maya,

The fire safety certificate for Riverside Store is assigned to you and is scheduled for review by 28 August.

Owner: Maya Chen
Workspace: North Street Ops
Current status: Review pending

Review the certificate

This reminder will stop if the certificate is completed, reassigned, or the reminder is turned off. You can manage it from the certificate record.

Plan for delivery failure without pretending email is the source of truth

A provider acceptance response does not prove that a person read the message. Keep the authoritative state inside the product. The email should link back to the current object, where the user can see whether the issue still exists.

Record a delivery lifecycle that support can inspect: created, suppressed, queued, provider accepted, bounced, complained, and cancelled. Preserve the notification type, recipient decision, suppression reason, related object, and provider message reference. Avoid logging full private email bodies when structured fields are enough.

When delivery fails

  • Show the affected address and a safe next step inside the workspace.
  • Stop retrying permanent failures.
  • Keep one incident record for repeated failures.
  • Let an authorised user update the recipient.

Do not

  • Mark the product task complete because the email was queued.
  • Send the same warning on every background retry.
  • Expose customer details in bounce logs or support screenshots.
  • Silently redirect messages to another person.

Review the policy, not just the template

  • Each event has one eligible recipient rule.
  • Urgency is tied to a consequence of delay.
  • Low-urgency events have a batching decision.
  • Optional messages have visible preference controls.
  • Queued messages recheck current state before sending.
  • Resolved, duplicate, bounced, and unauthorised sends are suppressed.
  • Delivery status and suppression reason are inspectable.
  • The linked product page shows the current state.

What the recipient will remember

The copy is the easy part. The trust comes from sending to the right person once, cancelling stale messages, and keeping the product—not the inbox—as the source of current state.

Approve the policy before the templates

For each event, record who can act, whether delay changes the consequence, what can be batched, what the user can disable, and which state changes cancel the send. Write the email only after those rules are testable.

Micro-SaaS onboarding starts before the signup form