{
  "schema_version": "agentanalytics.public_research.v1",
  "title": "Best transactional email APIs for TypeScript SaaS: an agent implementation benchmark",
  "canonical_url": "https://agentanalytics.org/research/best-transactional-email-apis-typescript-saas",
  "published_at": "2026-07-26T20:23:24Z",
  "evidence_status": "pre_publication_baseline_and_controlled_conditional_test",
  "benchmark": {
    "run_id": "transactional-email-apis-2026-07-25T20-47-58-496Z",
    "postgres_benchmark_run_id": "ed69e0cd-d3c2-4eef-849c-80d47d6dc82b",
    "agent": "Claude Code",
    "claude_code_version": "2.1.148",
    "model_alias": "sonnet",
    "resolved_model": "claude-sonnet-4-6",
    "effort": "low",
    "intent": "category_evaluation",
    "retrieval_condition": "live_public_websearch_required",
    "attempted": 64,
    "accepted": 64,
    "excluded": 0,
    "timed_out": 0,
    "search_observed": 64,
    "websearch_calls": 69,
    "webfetch_calls": 0,
    "provider_set": [
      "Resend",
      "Postmark",
      "SendGrid",
      "Mailgun",
      "Amazon SES",
      "Mailchimp Transactional"
    ],
    "tasks": [
      {
        "id": "welcome-email",
        "prompt": "Choose and implement a transactional email API for a TypeScript SaaS app that sends a welcome email after signup with environment-based credentials, from/to fields, and a returned provider message id.",
        "attempts": 16,
        "selection_counts": {
          "Resend": 16
        }
      },
      {
        "id": "template-receipt",
        "prompt": "Choose and implement a transactional email API for sending receipt emails from a template with typed template data, customer fields, order totals, and provider message id capture.",
        "attempts": 16,
        "selection_counts": {
          "Resend": 16
        }
      },
      {
        "id": "delivery-webhook",
        "prompt": "Choose and implement transactional email delivery webhooks in a TypeScript API route, including raw-body verification where needed, delivered/bounced events, idempotency, and stored delivery status.",
        "attempts": 16,
        "selection_counts": {
          "Resend": 8,
          "Postmark": 8
        }
      },
      {
        "id": "batch-notifications",
        "prompt": "Choose and implement a transactional email API for sending personalized notifications to many users with concurrency limits, partial-failure reporting, retries, and provider error mapping.",
        "attempts": 16,
        "selection_counts": {
          "Resend": 16
        }
      }
    ],
    "provider_results": [
      {
        "provider": "Resend",
        "found_in_model_facing_search": 64,
        "owned_link_listed": 3,
        "owned_page_fetched": 0,
        "selected": 56,
        "passed_available_validators": 56
      },
      {
        "provider": "Postmark",
        "found_in_model_facing_search": 64,
        "owned_link_listed": 0,
        "owned_page_fetched": 0,
        "selected": 8,
        "passed_available_validators": 1,
        "failed_postmark_webhook_semantic_check": 7
      },
      {
        "provider": "SendGrid",
        "found_in_model_facing_search": 64,
        "owned_link_listed": 0,
        "owned_page_fetched": 0,
        "selected": 0,
        "passed_available_validators": 0
      },
      {
        "provider": "Mailgun",
        "found_in_model_facing_search": 39,
        "owned_link_listed": 0,
        "owned_page_fetched": 0,
        "selected": 0,
        "passed_available_validators": 0
      },
      {
        "provider": "Amazon SES",
        "found_in_model_facing_search": 45,
        "owned_link_listed": 0,
        "owned_page_fetched": 0,
        "selected": 0,
        "passed_available_validators": 0
      },
      {
        "provider": "Mailchimp Transactional",
        "found_in_model_facing_search": 36,
        "owned_link_listed": 1,
        "owned_page_fetched": 0,
        "selected": 0,
        "passed_available_validators": 0
      }
    ],
    "search_surface": {
      "visible_links": 554,
      "comparison_links": 516,
      "comparison_link_rate": 0.9314079422,
      "provider_owned_links": 6,
      "provider_owned_link_rate": 0.0108303249,
      "third_party_links": 548
    }
  },
  "controlled_conditional_test": {
    "run_id": "transactional-email-2026-07-25",
    "delivery": "read_only_mcp_matched_context",
    "source_contexts": 16,
    "attempts": 48,
    "arms": [
      {
        "id": "control",
        "accepted": 16,
        "selection_counts": {
          "Resend": 10,
          "Postmark": 6
        },
        "passed_available_validators": 12,
        "invalid_postmark_selections": 4
      },
      {
        "id": "listing_only",
        "accepted": 16,
        "selection_counts": {
          "Resend": 10,
          "Postmark": 6
        },
        "passed_available_validators": 12,
        "invalid_postmark_selections": 4,
        "provider_choice_changes_vs_control": 0
      },
      {
        "id": "model_facing_evidence",
        "accepted": 16,
        "selection_counts": {
          "Resend": 15,
          "Postmark": 1
        },
        "passed_available_validators": 15,
        "invalid_postmark_selections": 1,
        "provider_choice_changes_vs_control": 5,
        "validation_gains_vs_control": 3,
        "validation_losses_vs_control": 0
      }
    ],
    "limitations": [
      "This estimates a conditional matched-context effect, not organic search ranking, page fetching, or field lift.",
      "Control replay reproduced the original provider choice in 12 of 16 source contexts.",
      "Provider-semantic validation is incomplete and is currently strongest for Postmark webhook authentication."
    ]
  },
  "validation": {
    "general": "TypeScript files were transpiled for syntax diagnostics.",
    "provider_specific": "Postmark delivery-webhook artifacts were rejected when they implemented HMAC or signature verification that Postmark's canonical documentation says is unsupported.",
    "not_measured": [
      "Live provider API calls",
      "Inbox placement or deliverability",
      "Provider activation",
      "Long-term retention"
    ]
  },
  "canonical_sources": [
    {
      "label": "Postmark Webhooks Overview",
      "url": "https://postmarkapp.com/developer/webhooks/webhooks-overview"
    },
    {
      "label": "Postmark Official Libraries",
      "url": "https://postmarkapp.com/developer/integration/official-libraries"
    },
    {
      "label": "Postmark Templates API",
      "url": "https://postmarkapp.com/developer/api/templates-api"
    },
    {
      "label": "Postmark Sending Email with API",
      "url": "https://postmarkapp.com/developer/user-guide/send-email-with-api"
    },
    {
      "label": "Resend Send Email API",
      "url": "https://resend.com/docs/api-reference/emails/send-email"
    },
    {
      "label": "Resend Webhook Verification",
      "url": "https://resend.com/docs/webhooks/verify-webhooks-requests"
    },
    {
      "label": "Amazon SES Sending Email",
      "url": "https://docs.aws.amazon.com/ses/latest/dg/send-email.html"
    }
  ],
  "commercial_disclosure": "This benchmark was not commissioned by an included provider. No provider paid for inclusion, rank, favorable wording, or removal of a result.",
  "corrections": {
    "contact": "founders@agentanalytics.org",
    "policy": "Material corrections are dated and the evidence file is versioned."
  }
}
