A background job fails, queues an email and succeeds on retry. The user receives “action required” after the result is already available. The template was accurate when it entered the queue. The notification policy was wrong.

Event does not equal email

For each event, write five fields before copy: eligible recipient, consequence of delay, channel, suppression rule and action. “Prompt” has no universal number of minutes; it means waiting could change the person’s next decision. Derive timing from the workflow.

Illustrative eventEligible recipientPolicy choiceAction
Import rejected before any writePerson who started it and still has accessEmail only if the in-app result is no longer active; suppress after a successful retryReview rejected rows
Configured review date approachingCurrent assigneeSend at the workspace’s chosen lead time; cancel on completion or reassignmentReview the item
Routine status changesMembers who chose the relevant summaryBatch by workspace and periodOpen one review
Job completes while the actor is viewing the resultNo email recipientRecord in the product onlyNone

These rows are editorial scenarios, not PBT behaviour or a universal notification standard. Test them against your product’s actual roles, state and obligations.

Urgency is about consequence, not importance

  • Can this recipient act?
  • Will waiting change the outcome or risk?
  • Is the current state already visible where the person is working?
  • Can several events become one decision-ready summary?

An important monthly review can wait for a digest. A failed import may deserve interruption during setup and no message after recovery. If nobody can act, keep the event in an activity log.

Make suppression a state machine

Recheck authoritative product state at send time. Cancel, redirect or batch only through explicit rules:

State before sendPolicy response
Resolved or staleCancel the queued message
Recipient lost access or ownershipDo not reveal workspace data; recalculate eligibility
Equivalent incident already openUpdate the incident record instead of repeating the warning
Optional category disabledRespect the stored preference for that category
Address bounced or complainedApply the provider and application suppression rules; expose a safe in-product recovery path
Workspace deleted or pausedCancel product updates unless a separately verified obligation applies

Four fictional cases run through a teaching program; zero emails sent. The program processed these histories in sequence, without a real queue, provider or database. It did not test PBT or Resend.

In each history, the event was queued at 2026-09-14T09:00:00Z and state was rechecked at 2026-09-14T09:02:00Z. At 2026-09-14T09:01:00Z, TASK-01 was resolved and TASK-02 was reassigned from MEMBER-A to MEMBER-B. Each task started open. Versions below show state_version → observed_state_version; authorisation is for the original recipient at recheck.

Event / taskOriginal recipientVersionsRechecked state / recipient_authorizedDecision / reason
N-01 / TASK-01MEMBER-A3 → 4resolved / truecancel — resolved
N-02 / TASK-02MEMBER-A7 → 8open / falsecancel — recipient_not_current_assignee
N-03 / TASK-03MEMBER-C1 → 1open / truesend — open_and_authorized
N-04 / TASK-04MEMBER-D2 → nullunavailable / nullhold — state_unavailable

Here send is only a policy verdict. For N-04, null means unknown: neither the current version nor recipient authorisation could be established, so the verdict stays hold. N-02 cancels the old recipient’s message; it does not automatically send to MEMBER-B.

The recheck and send are not one atomic transaction. State can still change between them; the demonstration leaves that race unresolved. A real product must handle it.

Strictly transactional, optional product summary and marketing messages may have different requirements. In the United States, the FTC’s CAN-SPAM guide identifies the message’s primary purpose as the basis for classification. That US framing is not a worldwide classification. Get jurisdiction-specific review for your markets and message types.

Three fictional specimens, attached to policy rows

Illustrative only — no real recipient, customer, delivery result or compliance claim.

Failed import

Subject: Review the rows that were not imported

We stopped before adding records because required fields were missing.

Import reference: EXAMPLE-2048
Current state: No records added

Review the import

Open the product to see the current status. This message is no longer actionable after a successful retry.

Decision digest

Subject: Your workspace review is ready

The current review contains items that need a decision, completed items and blocked items.

Open the current review

This optional summary follows your saved digest preference. The product shows the latest state.

Assigned reminder

Subject: An assigned record is approaching its review date

You are the current assignee for this record.

Review the record

The reminder stops after completion, reassignment or a preference change, subject to the applicable policy for this message.

Transport evidence is not task evidence

In Resend’s event documentation, delivered means the recipient’s mail server accepted the message. It does not prove inbox placement or human reading. Other providers may use different semantics. Keep the current task state in the product and link the email back to it.

Maintain only the structured lifecycle needed to operate the feature: notification type, recipient decision, related object, suppression reason, provider reference and states such as created, suppressed, queued, provider accepted, bounced, complained or cancelled. Do not store full message bodies or unnecessary personal data “just in case.” Define purpose, access and retention; legal duties depend on context and jurisdiction.

Authentication, without a deliverability promise

SPF authorises sending hosts; DKIM signs messages; DMARC checks alignment with the author domain; the domain owner publishes the DMARC policy. None guarantees inbox placement, message safety or reading. The protocol references below cover authentication, reporting and one-click unsubscribe; consult the Gmail sender guidelines for your sending profile.

Skip a large template library, universal retry count and engagement dashboard. First prove one event-to-recipient row, its stale-state check and its failure path. Opens and clicks do not establish that the customer’s job completed. Email authentication does not establish deliverability performance.

Approve one policy row

RecordDecision
Event, eligible recipient and consequence of delayInterrupt, batch or keep in product
Suppression states and in-product actionCancel, redirect or preserve the current task
Failure ownerWho handles bounce, complaint or transport ambiguity?

Do not write the next template until one real event has a recipient rule and a tested cancellation condition. If a support contact exposed the missing state, return to the ticket evidence register.

Email rules are jurisdictional and mutable