Generated banner for Email Best Practices
Generated logo for Email Best Practices

Email Best Practices

ResendOfficialCreated by Resend

  • Skill
  • Guidelines
  • Business and productivity
  • MIT
  • No issues found

From the author

Use when building email features, emails going to spam, high bounce rates, setting up SPF/DKIM/DMARC authentication, implementing email capture, ensuring compliance (CAN-SPAM, GDPR, CASL), handling webhooks, retry logic, making emails accessible (alt text, headings, contrast, screen readers), or deciding transactional vs marketing.
— the description by Resend

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured framework for managing the entire lifecycle of email communications. It covers technical infrastructure like SPF/DKIM/DMARC authentication, legal compliance across major jurisdictions (GDPR, CAN-SPAM, CASL), and accessibility standards for screen readers and diverse email clients. It also offers guidance on transactional versus marketing email strategies, list management, and building reliable delivery pipelines with retry logic and webhooks.

What it does

  • Provides technical guidance for email authentication (SPF, DKIM, DMARC) to improve deliverability.
  • Outlines legal requirements for global email compliance including GDPR, CAN-SPAM, and CASL.
  • Defines accessibility standards for email content, including screen reader support and contrast.
  • Offers architectural patterns for transactional and marketing email workflows.
  • Details best practices for list management, bounce handling, and suppression lists.
  • Explains how to implement reliable sending with idempotency, retries, and webhook event tracking.

When to use it

  • When setting up a new email infrastructure for an application.
  • When troubleshooting high bounce rates or emails landing in spam folders.
  • When designing transactional email templates like password resets or order confirmations.
  • When implementing email capture forms that require legal consent tracking.
  • When auditing existing email templates for accessibility and compliance.

Advantages

  • Reduces the risk of legal penalties by providing clear compliance guidelines.
  • Improves email deliverability by standardizing authentication and list hygiene.
  • Ensures emails are accessible to all users, including those using assistive technology.
  • Provides a clear architectural path for building production-ready email systems.
  • Helps distinguish between transactional and marketing email strategies to optimize engagement.

Usage examples

“What are the legal requirements for sending marketing emails to users in the EU versus the US?”
The agent provides a comparison of GDPR and CAN-SPAM, highlighting the need for explicit opt-in consent for GDPR and the requirement for physical addresses and opt-out mechanisms for CAN-SPAM.
“How do I make my transactional email templates accessible for screen readers?”
The agent outlines specific HTML requirements, such as setting lang/dir attributes, using role='presentation' for layout tables, and ensuring proper heading hierarchy.
“My emails are going to spam. What should I check first?”
The agent directs the user to the deliverability reference to verify DNS authentication (SPF, DKIM, DMARC) and check for common configuration issues.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/resend/email-best-practices/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip email-best-practices.zip -d .agents/skills

Documentation by Resend

Email Best Practices

Guidance for building deliverable, compliant, user-friendly emails.

Architecture Overview

[User] → [Email Form] → [Validation] → [Double Opt-In]
                                              ↓
                                    [Consent Recorded]
                                              ↓
[Suppression Check] ←──────────────[Ready to Send]
        ↓
[Idempotent Send + Retry] ──────→ [Email API]
                                       ↓
                              [Webhook Events]
                                       ↓
              ┌────────┬────────┬─────────────┐
              ↓        ↓        ↓             ↓
         Delivered  Bounced  Complained  Opened/Clicked
                       ↓        ↓
              [Suppression List Updated]
                       ↓
              [List Hygiene Jobs]

Quick Reference

Need to...See
Set up SPF/DKIM/DMARC, fix spam issuesDeliverability
Build password reset, OTP, confirmationsTransactional Emails
Plan which emails your app needsTransactional Email Catalog
Build newsletter signup, validate emailsEmail Capture
Send newsletters, promotionsMarketing Emails
Ensure CAN-SPAM/GDPR/CASL complianceCompliance
Decide transactional vs marketingEmail Types
Handle retries, idempotency, errorsSending Reliability
Process delivery events, set up webhooksWebhooks & Events
Manage bounces, complaints, suppressionList Management
Make emails accessible (screen readers, alt text, contrast)Accessibility

Start Here

New app? Start with the Catalog to plan which emails your app needs (password reset, verification, etc.), then set up Deliverability (DNS authentication) before sending your first email.

Spam issues? Check Deliverability first—authentication problems are the most common cause. Gmail/Yahoo reject unauthenticated emails.

Marketing emails? Follow this path: Email Capture (collect consent) → Compliance (legal requirements) → Marketing Emails (best practices).

Production-ready sending? Add reliability: Sending Reliability (retry + idempotency) → Webhooks & Events (track delivery) → List Management (handle bounces).

Accessibility? Most emails fail basic accessibility checks. See Accessibility for lang/dir, presentational tables, headings, alt text, <title>, and contrast.

Files

references/list-management.md

List Management

Maintaining clean email lists through suppression, hygiene, and data retention.

Suppression Lists

A suppression list prevents sending to addresses that should never receive email.

What to Suppress
ReasonActionCan Unsuppress?
Hard bounceAdd immediatelyNo (address invalid)
Complaint (spam)Add immediatelyNo (legal requirement)
Soft bounce (3x)Add after thresholdYes, after 30-90 days
Manual removalAdd on requestOnly if user requests
Implementation
// Suppression list schema
interface SuppressionEntry {
  email: string;
  reason: 'hard_bounce' | 'complaint' | 'unsubscribe' | 'soft_bounce' | 'manual';
  created_at: Date;
  source_email_id?: string; // Which email triggered this
}

// Check before every send
async function canSendTo(email: string): Promise<boolean> {
  const suppressed = await db.suppressions.findOne({ email });
  return !suppressed;
}

// Add to suppression list
async function suppressEmail(email: string, reason: string, sourceId?: string) {
  await db.suppressions.upsert({
    email: email.toLowerCase(),
    reason,
    created_at: new Date(),
    source_email_id: sourceId,
  });
}
Pre-Send Check

Always check suppression before sending:

async function sendEmail(to: string, emailData: EmailData) {
  if (!await canSendTo(to)) {
    console.log(`Skipping suppressed email: ${to}`);
    return { skipped: true, reason: 'suppressed' };
  }

  return await resend.emails.send({ to, ...emailData });
}

List Hygiene

Regular maintenance to keep lists healthy.

Automated Cleanup
TaskFrequencyAction
Remove hard bouncesReal-time (via webhook)Immediate suppression
Remove complaintsReal-time (via webhook)Immediate suppression
Process unsubscribesReal-timeRemove from marketing lists
Review soft bouncesDailySuppress after 3 failures
Remove inactiveMonthlyRe-engagement → remove

Learn more: https://resend.com/docs/knowledge-base/audience-hygiene

Re-engagement Campaigns

Before removing inactive subscribers:

  1. Identify inactive: No opens/clicks in 45-90 days

  2. Send re-engagement: "We miss you" or "Still interested?"

  3. Wait 14-30 days for response

  4. Remove non-responders from active lists

async function runReengagement() {
  const inactive = await getInactiveSubscribers(90); // 90 days

  for (const subscriber of inactive) {
    if (!subscriber.reengagement_sent) {
      await sendReengagementEmail(subscriber);
      await markReengagementSent(subscriber.email);
    } else if (daysSince(subscriber.reengagement_sent) > 30) {
      await removeFromMarketingLists(subscriber.email);
    }
  }
}

Data Retention

Email Logs
Data TypeRecommended RetentionNotes
Send attempts90 daysDebugging, analytics
Delivery status90 daysCompliance, reporting
Bounce/complaint events3 yearsRequired for CASL
Suppression listIndefiniteNever delete
Email content30 daysStorage costs
Consent records3 years after expiryLegal requirement
Retention Policy Implementation
// Daily cleanup job
async function cleanupOldData() {
  const now = new Date();

  // Delete old email logs (keep 90 days)
  await db.emailLogs.deleteMany({
    created_at: { $lt: subDays(now, 90) }
  });

  // Delete old email content (keep 30 days)
  await db.emailContent.deleteMany({
    created_at: { $lt: subDays(now, 30) }
  });

  // Never delete: suppressions, consent records
}

Metrics to Monitor

MetricTargetAlert Threshold
Bounce rate<2%>2%
Complaint rate<0.05%>0.05%
Suppression list growthStableSudden spike

Transactional vs Marketing Lists

Keep separate:

  • Transactional: Can send to anyone with account relationship

  • Marketing: Only opted-in subscribers

Suppression applies to both: Hard bounces and complaints suppress across all email types.

Unsubscribe is marketing-only: User unsubscribing from marketing can still receive transactional emails (password resets, order confirmations).

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Resend
Publisher
Resend (Official)
Source
resend/resend-skills · skills/email-best-practices · commit 389de56
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Resend or Resend.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download email-best-practices.zip