SendGrid
Best fit for transactional sends and marketing contacts where custom fields must be created on first use.
The unified API is honest about what each provider can represent without provider-specific surprises.
Best fit for transactional sends and marketing contacts where custom fields must be created on first use.
Best fit for audience-backed contact management and campaign analytics. Requires an audience/list id.
Best fit for profile properties, campaign reads, and Klaviyo-native lifecycle data. Transactional sends stay flow-bound.
| Tool | SendGrid | Mailchimp | Klaviyo |
|---|---|---|---|
upsert_contact | Yes | Yes | Yes |
get_contact | Yes | Yes | Yes |
get_connection_status | Yes | Yes | Yes |
send_transactional | Yes | No* | No** |
get_campaign_stats | Yes | Yes | Yes |
list_templates | Yes | Yes | Yes |
list_campaigns | Yes | Yes | Yes |
* Mailchimp transactional email is Mandrill, a separate product. Phase 2 returns TOOL_NOT_SUPPORTED per D34.
** Klaviyo transactional email is Flow-triggered and template-bound. Vorlek returns TOOL_NOT_SUPPORTED per D19 instead of pretending it is a synchronous send.
upsert_contact auto-creates missing custom fields when needed.data.contact_id is normalized to md5(lowercase(trim(email))) per D33.meta.provider_metadata.import_job_id, and accepted async imports surface meta.job.status: "pending".-us7.data.contact_id is the Mailchimp subscriber hash: md5(lowercase(trim(email))).send_transactional returns TOOL_NOT_SUPPORTED in Phase 2 because Mandrill is not shipped.pk_.2026-04-15.data.fields_auto_created is always [].data.contact_id is the Klaviyo profile id.