AddThisFeature

SendGrid Transactional Email

Send account and product email through SendGrid and keep the delivery feedback.

moderate Sales & Marketing Tools

What it adds

A SendGrid delivery path for account email, with validated template data and recorded bounce and complaint outcomes.

What your agent is told to do

5
  1. 1

    Route transactional mail through the app's existing mail layer with SendGrid behind it as one adapter. The rest of the codebase must never construct provider-specific payloads directly, or swapping or adding a provider later means touching every send site.

  2. 2

    Enumerate the app's transactional messages — verification, password reset, receipts, alerts — and give each a template with a declared set of variables that is validated before the message is queued.

  3. 3

    Send from the app's background-job system with a stable per-message identifier, and store the provider's message identifier on the record as soon as it is returned so support can trace a specific email later.

  4. 4

    Consume delivery feedback on a verified endpoint and let bounces and complaints update a suppression list that every future send checks. Feedback that is received and then discarded is worse than not collecting it.

  5. 5

    Give non-production environments a mode that either suppresses delivery entirely or redirects every recipient to a fixed internal address, and make that the default outside production.

Edge cases it handles

8
  • Transactional mail and marketing consent are different things. A password reset must still go out to someone who unsubscribed from the newsletter, and a newsletter must never be sent under the transactional path to reach someone who opted out.
  • A template rendered with a missing or misnamed variable produces an email with a visible gap or a broken link. Validate the variable set against the template's declared shape before the message is queued, and fail the job rather than sending it.
  • Delivery, bounce, block, and complaint callbacks arrive on a public endpoint, can be replayed, and can arrive out of order. Verify their authenticity and process them idempotently so a redelivered event does not double-count or regress a record.
  • Provider credentials and full message bodies must be kept out of logs and error reports. A stack trace that includes a reset link or a one-time code is a live credential sitting in log storage.
  • A hard bounce or a spam complaint must suppress the address before the next send, not merely be recorded. Continuing to send to a bouncing address damages the sending reputation for every other message.
  • A background job retried after a timeout must not send the email twice. Key the send on a stable identifier and reconcile on retry.
  • The provider's rate limits and transient errors must be distinguished from permanent rejections. Back off and retry the former, stop immediately on the latter.
  • When the provider is unavailable, the user-facing action must still succeed and the app must say the email is on its way, with the job retried, rather than reporting a failure the user cannot act on.

Definition of done

9
  • All transactional email leaves through one mail layer with the provider behind an adapter.
  • Every message type has a template with declared variables that are validated before queueing.
  • Bounce, block, and complaint events are verified, processed idempotently, and update a suppression list checked on every send.
  • Suppressed addresses are never sent to again.
  • No log or error report contains provider credentials or full message bodies.
  • Non-production environments suppress or redirect delivery by default.
  • A retried job never sends the same email twice.
  • The feature matches the existing design system.
  • No existing functionality is broken.

Related features

How it works

  1. 1

    Copy the link

    Grab the Markdown instruction URL for this feature.

  2. 2

    Give it to your AI

    Paste it into Claude Code, Cursor, v0, Lovable — whatever you build with.

  3. 3

    It inspects, then implements

    Your agent reads your existing app first, then adds the feature to fit it.

Works with your stack

These instructions are written to adapt. They tell the agent to detect your framework, match your existing design system, and reuse what you already have — rather than assuming a particular stack.

Need it tighter than that? Customize the feature and tell it exactly what you're running.